-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add matcher interface #19
Conversation
Would appreciate this change as well |
Thanks for the PR! The regex used in this library matches the one used by GitHub, so while it's not ideal, I think I'd rather keep the default aligned with the validation GitHub uses. If we can make the parsing configurable, I would be open to making this available as an option (either a flag for the more permissive regex, or the ability to provide a custom email regex). The same applies to supporting GitLab syntax (#13) — while I think the default should align to GitHub's implementation as it's the most widespread, I'd be up for supporting more variants. |
Hey, I added a Matcher interface to make the parsing extendable. There are no breaking changes to the API and the Matchers are totally optional. The extended API would look something like this: var lessRestrictiveEmailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
func MatchLessRestrictiveEmail(s string) (codeowners.Owner, error) {
match := lessRestrictiveEmailRegexp.FindStringSubmatch(s)
if match == nil {
return codeowners.Owner{}, codeowners.ErrNoMatch
}
return codeowners.Owner{
Value: match[0],
Type: codeowners.EmailOwner,
}, nil
}
var lessRestrictiveEmailMatcher = codeowners.MatcherFunc(MatchLessRestrictiveEmail)
func main() {
f, err := os.Open("CODEOWNERS")
if err != nil {
log.Fatal(err)
}
_, err = codeowners.ParseFile(f, lessRestrictiveEmailMatcher)
if err != nil {
log.Fatal(err)
}
} You could also just extend the default matcher: func main() {
f, err := os.Open("CODEOWNERS")
if err != nil {
log.Fatal(err)
}
_, err = codeowners.ParseFile(f, append(codeowners.DefaultMatchers, lessRestrictiveEmailMatcher)...)
if err != nil {
log.Fatal(err)
}
} |
Hey, could this please get another round of review. I'm looking forward to it being merged. If something doesn't meet project standards, just let me know. |
@hmarr I would highly appreciate it if you could take a look at this PR |
Hey @haveachin, sorry for taking so long to look at this. Thanks for the work on this—overall it looks great! I pushed a follow-up commit in #23 — have a quick look at let me know what you think. |
@haveachin my latest commit is included in this PR now—would you mind having a look and checking it meets your needs before I merge? |
LGTM |
Would be great if this could be merged 😄 Thanks to everyone involved for their work 😄 |
Sorry for taking so long to merge this, thanks for the contribution @haveachin! |
Hey,
I was playing around with this library when I noticed that the regexp for emails was very restrictive. My setup looks something like this:
CODEOWNERS
main.go
I was getting this error:
Here is a playground link if you want to try it yourself: https://play.golang.com/p/rxZi4JJA9JT
I swapped the current email regexp with a less restrictive one. This is the same regexp that is implemented in the HTML validation of an email input field: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address