Merge 0373391ef0
into 88b0669f7d
This commit is contained in:
commit
abcf6909dd
21
cronexpr.go
21
cronexpr.go
|
@ -62,11 +62,22 @@ func MustParse(cronLine string) *Expression {
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
// Parse returns a new Expression pointer. An error is returned if a malformed
|
// 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
|
// See <https://github.com/gorhill/cronexpr#implementation> for documentation
|
||||||
// about what is a well-formed cron expression from this library's point of
|
// about what is a well-formed cron expression from this library's point of
|
||||||
// view.
|
// view.
|
||||||
|
|
||||||
func Parse(cronLine string) (*Expression, error) {
|
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
|
// Maybe one of the built-in aliases is being used
|
||||||
cron := cronNormalizer.Replace(cronLine)
|
cron := cronNormalizer.Replace(cronLine)
|
||||||
|
@ -76,8 +87,14 @@ func Parse(cronLine string) (*Expression, error) {
|
||||||
if fieldCount < 5 {
|
if fieldCount < 5 {
|
||||||
return nil, fmt.Errorf("missing field(s)")
|
return nil, fmt.Errorf("missing field(s)")
|
||||||
}
|
}
|
||||||
// ignore fields beyond 7th
|
|
||||||
if fieldCount > 7 {
|
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
|
fieldCount = 7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -18,7 +18,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorhill/cronexpr"
|
"github.com/krallin/cronexpr"
|
||||||
)
|
)
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
|
@ -438,6 +438,9 @@ func genericFieldParse(s string, desc fieldDescriptor) ([]*cronDirective, error)
|
||||||
directive.first = desc.atoi(snormal[pairs[2]:pairs[3]])
|
directive.first = desc.atoi(snormal[pairs[2]:pairs[3]])
|
||||||
directive.last = desc.atoi(snormal[pairs[4]:pairs[5]])
|
directive.last = desc.atoi(snormal[pairs[4]:pairs[5]])
|
||||||
directive.step = 1
|
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)
|
directives = append(directives, &directive)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -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{
|
var benchmarkExpressions = []string{
|
||||||
|
|
Loading…
Reference in New Issue