[#3132] added common cron expression macros
This commit is contained in:
parent
734f35c504
commit
5f21c4119f
16
CHANGELOG.md
16
CHANGELOG.md
|
@ -1,3 +1,19 @@
|
||||||
|
## v0.18.0 - WIP
|
||||||
|
|
||||||
|
- Reflected the latest JS SDK changes in the Admin UI.
|
||||||
|
|
||||||
|
- Added cron expression macros ([#3132](https://github.com/pocketbase/pocketbase/issues/3132)):
|
||||||
|
```
|
||||||
|
"@yearly": "0 0 1 1 *"
|
||||||
|
"@annually": "0 0 1 1 *"
|
||||||
|
"@monthly": "0 0 1 * *"
|
||||||
|
"@weekly": "0 0 * * 0"
|
||||||
|
"@daily": "0 0 * * *"
|
||||||
|
"@midnight": "0 0 * * *"
|
||||||
|
"@hourly": "0 * * * *"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## v0.17.5
|
## v0.17.5
|
||||||
|
|
||||||
- Added quotes around the wrapped view query columns introduced with v0.17.4.
|
- Added quotes around the wrapped view query columns introduced with v0.17.4.
|
||||||
|
|
|
@ -62,6 +62,16 @@ func (s *Schedule) IsDue(m *Moment) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var macros = map[string]string{
|
||||||
|
"@yearly": "0 0 1 1 *",
|
||||||
|
"@annually": "0 0 1 1 *",
|
||||||
|
"@monthly": "0 0 1 * *",
|
||||||
|
"@weekly": "0 0 * * 0",
|
||||||
|
"@daily": "0 0 * * *",
|
||||||
|
"@midnight": "0 0 * * *",
|
||||||
|
"@hourly": "0 * * * *",
|
||||||
|
}
|
||||||
|
|
||||||
// NewSchedule creates a new Schedule from a cron expression.
|
// NewSchedule creates a new Schedule from a cron expression.
|
||||||
//
|
//
|
||||||
// A cron expression is consisted of 5 segments separated by space,
|
// A cron expression is consisted of 5 segments separated by space,
|
||||||
|
@ -72,10 +82,15 @@ func (s *Schedule) IsDue(m *Moment) bool {
|
||||||
// - range: 1-30
|
// - range: 1-30
|
||||||
// - step: */n or 1-30/n
|
// - step: */n or 1-30/n
|
||||||
// - list: 1,2,3,10-20/n
|
// - list: 1,2,3,10-20/n
|
||||||
|
// - macros: @yearly (or @annually), @monthly, @weekly, @daily (or @midnight), @hourly
|
||||||
func NewSchedule(cronExpr string) (*Schedule, error) {
|
func NewSchedule(cronExpr string) (*Schedule, error) {
|
||||||
|
if v, ok := macros[cronExpr]; ok {
|
||||||
|
cronExpr = v
|
||||||
|
}
|
||||||
|
|
||||||
segments := strings.Split(cronExpr, " ")
|
segments := strings.Split(cronExpr, " ")
|
||||||
if len(segments) != 5 {
|
if len(segments) != 5 {
|
||||||
return nil, errors.New("invalid cron expression - must have exactly 5 space separated segments")
|
return nil, errors.New("invalid cron expression - must be a valid macro or to have exactly 5 space separated segments")
|
||||||
}
|
}
|
||||||
|
|
||||||
minutes, err := parseCronSegment(segments[0], 0, 59)
|
minutes, err := parseCronSegment(segments[0], 0, 59)
|
||||||
|
|
|
@ -208,6 +208,43 @@ func TestNewSchedule(t *testing.T) {
|
||||||
false,
|
false,
|
||||||
`{"minutes":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{},"38":{},"39":{},"4":{},"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{},"47":{},"48":{},"49":{},"5":{},"50":{},"51":{},"52":{},"53":{},"54":{},"55":{},"56":{},"57":{},"58":{},"59":{},"6":{},"7":{},"8":{},"9":{}},"hours":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"1":{},"2":{},"4":{}}}`,
|
`{"minutes":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{},"38":{},"39":{},"4":{},"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{},"47":{},"48":{},"49":{},"5":{},"50":{},"51":{},"52":{},"53":{},"54":{},"55":{},"56":{},"57":{},"58":{},"59":{},"6":{},"7":{},"8":{},"9":{}},"hours":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"1":{},"2":{},"4":{}}}`,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// macros
|
||||||
|
{
|
||||||
|
"@yearly",
|
||||||
|
false,
|
||||||
|
`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{}},"months":{"1":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@annually",
|
||||||
|
false,
|
||||||
|
`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{}},"months":{"1":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@monthly",
|
||||||
|
false,
|
||||||
|
`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@weekly",
|
||||||
|
false,
|
||||||
|
`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@daily",
|
||||||
|
false,
|
||||||
|
`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@midnight",
|
||||||
|
false,
|
||||||
|
`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@hourly",
|
||||||
|
false,
|
||||||
|
`{"minutes":{"0":{}},"hours":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, s := range scenarios {
|
for _, s := range scenarios {
|
||||||
|
|
Loading…
Reference in New Issue