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
 | 
			
		||||
// 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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
	"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.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
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue