This commit is contained in:
Thomas Orozco 2020-11-14 09:57:17 -05:00 committed by GitHub
commit abcf6909dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 62 additions and 3 deletions

View File

@ -62,11 +62,22 @@ func MustParse(cronLine string) *Expression {
/******************************************************************************/
// Parse returns a new Expression pointer. An error is returned if a malformed
// cron expression is supplied.
// cron expression is supplied. ParseStrict does the same thing, but unlike
// Parse, it will return an error if the provided cron line has too many
// tokens.
// See <https://github.com/gorhill/cronexpr#implementation> for documentation
// about what is a well-formed cron expression from this library's point of
// view.
func Parse(cronLine string) (*Expression, error) {
return parse(cronLine, false)
}
func ParseStrict(cronLine string) (*Expression, error) {
return parse(cronLine, true)
}
func parse(cronLine string, strict bool) (*Expression, error) {
// Maybe one of the built-in aliases is being used
cron := cronNormalizer.Replace(cronLine)
@ -76,8 +87,14 @@ func Parse(cronLine string) (*Expression, error) {
if fieldCount < 5 {
return nil, fmt.Errorf("missing field(s)")
}
// ignore fields beyond 7th
if fieldCount > 7 {
// In strict mode, error out
if strict {
return nil, fmt.Errorf("too many fields")
}
// In non-strict mode, ignore fields beyond 7th
fieldCount = 7
}

7
cronexpr/go.mod Normal file
View File

@ -0,0 +1,7 @@
module github.com/krallin/cronexpr/cronexpr
go 1.14
replace github.com/krallin/cronexpr => ../
require github.com/krallin/cronexpr v0.0.0-00010101000000-000000000000

0
cronexpr/go.sum Normal file
View File

View File

@ -18,7 +18,7 @@ import (
"os"
"time"
"github.com/gorhill/cronexpr"
"github.com/krallin/cronexpr"
)
/******************************************************************************/

View File

@ -438,6 +438,9 @@ func genericFieldParse(s string, desc fieldDescriptor) ([]*cronDirective, error)
directive.first = desc.atoi(snormal[pairs[2]:pairs[3]])
directive.last = desc.atoi(snormal[pairs[4]:pairs[5]])
directive.step = 1
if directive.last < directive.first {
return nil, fmt.Errorf("invalid interval %s (normalized to %d-%d)", snormal, directive.first, directive.last)
}
directives = append(directives, &directive)
continue
}

View File

@ -305,6 +305,35 @@ func TestInterval_Interval60Issue(t *testing.T) {
}
}
// Issue: https://github.com/aptible/supercronic/issues/63
func TestRange_OutOfOrder(t *testing.T) {
_, err := Parse("45 4 * * 6-7")
if err == nil {
t.Errorf("parsing with range 6-7 should return err")
}
_, err = Parse("45 4 * * 6-5")
if err == nil {
t.Errorf("parsing with range 6-5 should return err")
}
}
/******************************************************************************/
func TestTooManyFields(t *testing.T) {
cronLine := "* * * * * * * foobar"
_, err := ParseStrict(cronLine)
if err == nil {
t.Errorf("ParseStrict with too many fields should return err ")
}
_, err = Parse(cronLine)
if err != nil {
t.Errorf("Parse with too many fields should not return err ")
}
}
/******************************************************************************/
var benchmarkExpressions = []string{

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module github.com/krallin/cronexpr
go 1.14