cronex 0.8.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.rubocop.yml +24 -15
- data/CHANGELOG.md +15 -0
- data/README.md +4 -2
- data/cronex.gemspec +2 -2
- data/lib/cronex/description/day_of_month.rb +1 -1
- data/lib/cronex/exp_descriptor.rb +6 -4
- data/lib/cronex/version.rb +1 -1
- data/resources/resources_de.yml +76 -0
- data/resources/resources_en.yml +1 -0
- data/resources/resources_fr.yml +2 -1
- data/resources/resources_it.yml +76 -0
- data/resources/resources_pt_BR.yml +1 -0
- data/resources/resources_ro.yml +2 -1
- data/resources/resources_ru.yml +4 -3
- data/spec/exp_descriptor_de_spec.rb +389 -0
- data/spec/exp_descriptor_en_spec.rb +14 -7
- data/spec/exp_descriptor_fr_spec.rb +11 -4
- data/spec/exp_descriptor_it_spec.rb +389 -0
- data/spec/exp_descriptor_pt_BR_spec.rb +10 -3
- data/spec/exp_descriptor_ro_spec.rb +11 -4
- data/spec/exp_descriptor_ru_spec.rb +20 -13
- metadata +20 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ba036396e2d9547853a5b7ea2fd71e951a7553c4939771493b5fe66b14f6850d
|
4
|
+
data.tar.gz: 0106175d262f6897fc826fd4b4a9b67126ae854e31417d8071ab06b412bb92bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53f41387e3df259309bf46ab5fccbb7e12484007cd95692545e2c725f9081d404699284e7691184a32674fcb7474ca8b0362bbebea8f8cfd7332cc60863e1c0a
|
7
|
+
data.tar.gz: 7f97a2b9c76f68538e72681165c958788ccb3f70b938b7eea06c0a58181301a88205d3092ec20ff78b481f4c10b84722724bbc4b5bf8dc1e294466d4bf2bf9f4
|
data/.rubocop.yml
CHANGED
@@ -1,47 +1,56 @@
|
|
1
|
-
Encoding:
|
1
|
+
Style/Encoding:
|
2
2
|
Enabled: false
|
3
3
|
|
4
|
-
AmbiguousOperator:
|
4
|
+
Lint/AmbiguousOperator:
|
5
5
|
Enabled: false
|
6
6
|
|
7
|
-
CaseIndentation:
|
7
|
+
Layout/CaseIndentation:
|
8
8
|
Enabled: false
|
9
9
|
|
10
|
-
CyclomaticComplexity:
|
10
|
+
Metrics/CyclomaticComplexity:
|
11
11
|
Enabled: false
|
12
12
|
Max: 10
|
13
13
|
|
14
|
-
PerceivedComplexity:
|
14
|
+
Metrics/PerceivedComplexity:
|
15
15
|
Enabled: false
|
16
16
|
Max: 10
|
17
17
|
|
18
|
-
Documentation:
|
18
|
+
Style/Documentation:
|
19
19
|
Enabled: false
|
20
20
|
|
21
|
-
|
21
|
+
Layout/EmptyLinesAroundBlockBody:
|
22
22
|
Enabled: false
|
23
23
|
|
24
|
-
|
24
|
+
Layout/EmptyLinesAroundClassBody:
|
25
25
|
Enabled: false
|
26
26
|
|
27
|
-
|
27
|
+
Layout/EmptyLinesAroundModuleBody:
|
28
|
+
Enabled: false
|
29
|
+
|
30
|
+
Metrics/ClassLength:
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
Style/FrozenStringLiteralComment:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
Layout/LineLength:
|
28
37
|
Enabled: true
|
29
38
|
Max: 160
|
30
39
|
|
31
|
-
MethodLength:
|
40
|
+
Metrics/MethodLength:
|
32
41
|
Enabled: false
|
33
42
|
|
34
|
-
ModuleFunction:
|
43
|
+
Style/ModuleFunction:
|
35
44
|
Enabled: false
|
36
45
|
|
37
|
-
NestedTernaryOperator:
|
46
|
+
Style/NestedTernaryOperator:
|
38
47
|
Enabled: false
|
39
48
|
|
40
|
-
RaiseArgs:
|
49
|
+
Style/RaiseArgs:
|
41
50
|
Enabled: false
|
42
51
|
|
43
|
-
RescueModifier:
|
52
|
+
Style/RescueModifier:
|
44
53
|
Enabled: false
|
45
54
|
|
46
|
-
UnusedMethodArgument:
|
55
|
+
Lint/UnusedMethodArgument:
|
47
56
|
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
### [0.11.0] - 2020-10-05
|
2
|
+
* Fix handling L in day of month expressions
|
3
|
+
|
4
|
+
### [0.10.0] - 2020-05-26
|
5
|
+
* Move locale and timezone arguments to options
|
6
|
+
|
7
|
+
### [0.9.2] - 2020-04-24
|
8
|
+
* Add italian locale
|
9
|
+
|
10
|
+
### [0.9.1] - 2019-11-26
|
11
|
+
* Update tzinfo dependency
|
12
|
+
|
13
|
+
### [0.9.0] - 2019-04-21
|
14
|
+
* Add german locale
|
15
|
+
|
1
16
|
### [0.8.0] - 2019-04-18
|
2
17
|
* Add support for timezones
|
3
18
|
|
data/README.md
CHANGED
@@ -25,6 +25,8 @@ For a quick intro to cron see Quartz [Cron Tutorial](http://www.quartz-scheduler
|
|
25
25
|
* English
|
26
26
|
* Brazilian
|
27
27
|
* French
|
28
|
+
* German
|
29
|
+
* Italian
|
28
30
|
* Romanian
|
29
31
|
* Russian
|
30
32
|
|
@@ -59,12 +61,12 @@ Or install it yourself as:
|
|
59
61
|
|
60
62
|
#### Localization
|
61
63
|
|
62
|
-
Cronex::ExpressionDescriptor.new('30 2 * 2 1-5',
|
64
|
+
Cronex::ExpressionDescriptor.new('30 2 * 2 1-5', locale: 'fr').description
|
63
65
|
=> À 2:30 AM, lundi à vendredi, seulement en février
|
64
66
|
|
65
67
|
#### Timezones
|
66
68
|
|
67
|
-
Cronex::ExpressionDescriptor.new('0-10 11 * * *',
|
69
|
+
Cronex::ExpressionDescriptor.new('0-10 11 * * *', timezone: 'America/Los_Angeles').description
|
68
70
|
=> Every minute between 4:00 AM and 4:10 AM # PDT or
|
69
71
|
=> Every minute between 3:00 AM and 3:10 AM # PST
|
70
72
|
|
data/cronex.gemspec
CHANGED
@@ -20,9 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
-
spec.add_runtime_dependency 'tzinfo'
|
23
|
+
spec.add_runtime_dependency 'tzinfo'
|
24
24
|
spec.add_runtime_dependency 'unicode'
|
25
25
|
spec.add_development_dependency 'pry', '~> 0.10'
|
26
|
-
spec.add_development_dependency 'rake', '
|
26
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
28
28
|
end
|
@@ -12,19 +12,21 @@ module Cronex
|
|
12
12
|
verbose: false,
|
13
13
|
zero_based_dow: true,
|
14
14
|
use_24_hour_time_format: false,
|
15
|
-
throw_exception_on_parse_error: true
|
15
|
+
throw_exception_on_parse_error: true,
|
16
|
+
locale: nil,
|
17
|
+
timezone: nil
|
16
18
|
}
|
17
19
|
|
18
20
|
class ExpressionDescriptor
|
19
21
|
attr_accessor :expression, :expression_parts, :options, :parsed, :resources, :timezone
|
20
22
|
|
21
|
-
def initialize(expression, options = {}
|
23
|
+
def initialize(expression, options = {})
|
22
24
|
@expression = expression
|
23
25
|
@options = CRONEX_OPTS.merge(options)
|
24
26
|
@expression_parts = []
|
25
27
|
@parsed = false
|
26
|
-
@resources = Cronex::Resource.new(locale)
|
27
|
-
@timezone = timezone
|
28
|
+
@resources = Cronex::Resource.new(@options[:locale])
|
29
|
+
@timezone = @options[:timezone] || 'UTC'
|
28
30
|
end
|
29
31
|
|
30
32
|
def to_hash
|
data/lib/cronex/version.rb
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
# resources_de.yml
|
2
|
+
---
|
3
|
+
expression_empty_exception: 'Ausdruck darf nicht null oder leer sein'
|
4
|
+
interval_description_format: 'jeden %s Tag der Woche'
|
5
|
+
between_description_format: '%s bis %s'
|
6
|
+
between_weekday_description_format: '%s bis %s'
|
7
|
+
on_the_day_of_the_month: 'am {{nth}} %s des Monats'
|
8
|
+
on_the_of_the_month: 'am %s des Monats'
|
9
|
+
on_the_last_of_the_month: 'am letzten %s des Monats'
|
10
|
+
on_the_last_day_of_the_month: 'am letzten Tag des Monats'
|
11
|
+
on_the_last_weekday_of_the_month: 'am letzen Werktag des Monats'
|
12
|
+
between_days_of_the_month: 'zwischen Tag %s und %s des Monats'
|
13
|
+
seconds_through_past_the_minute: 'Sekunden %s bis %s vergangene Minute'
|
14
|
+
between_x_and_y: 'zwischen %s und %s'
|
15
|
+
past_the_hour: 'vergangene Stunde'
|
16
|
+
at_x_seconds_past_the_minute: 'am %s Sekunden nach der vergangenen Minute'
|
17
|
+
minutes_through_past_the_hour: 'Minuten %s bis %s nach der vergangenen Stunde'
|
18
|
+
on_day_of_the_month: 'am %s Tag des Monats'
|
19
|
+
last_day: 'der letzte Tag'
|
20
|
+
first_weekday: 'Erster Wochentag'
|
21
|
+
weekday_nearest_day: 'Wochentag zum nächsten Tag %s'
|
22
|
+
starting: 'beginnend'
|
23
|
+
only_on: 'nur an %s'
|
24
|
+
only_in: 'nur in %s'
|
25
|
+
every_x_seconds: 'Alle %s Sekunden'
|
26
|
+
every_minute_between: 'Jede Minute zwischen %s und %s'
|
27
|
+
every_second: 'Jede Sekunde'
|
28
|
+
every_minute: 'Jede Minute'
|
29
|
+
every_1_minute: 'Jede 1. Minute'
|
30
|
+
every_hour: 'Jede Stunde'
|
31
|
+
every_1_hour: 'Jede 1. Stunde'
|
32
|
+
every_day: 'Jeden Tag'
|
33
|
+
every_1_day: 'Jeden 1. Tag'
|
34
|
+
every_year: 'Jedes Jahr'
|
35
|
+
every_x: 'Alle %s'
|
36
|
+
at_x: 'um %s'
|
37
|
+
on_x: 'an %s'
|
38
|
+
in_x: 'in %s'
|
39
|
+
first: ersten
|
40
|
+
second: zweiten
|
41
|
+
third: dritten
|
42
|
+
fourth: vierten
|
43
|
+
fifth: fünften
|
44
|
+
time_pm: PM
|
45
|
+
time_am: AM
|
46
|
+
and: und
|
47
|
+
at: Um
|
48
|
+
day: Tag
|
49
|
+
days: Tagen
|
50
|
+
hour: Stunde
|
51
|
+
hours: Stunden
|
52
|
+
minute: Minute
|
53
|
+
minutes: Minuten
|
54
|
+
month: Monat
|
55
|
+
months: Monaten
|
56
|
+
year: Jahr
|
57
|
+
years: Jahren
|
58
|
+
monday: Montag
|
59
|
+
tuesday: Dienstag
|
60
|
+
wednesday: Mittwoch
|
61
|
+
thursday: Donnerstag
|
62
|
+
friday: Freitag
|
63
|
+
saturday: Samstag
|
64
|
+
sunday: Sonntag
|
65
|
+
january: Januar
|
66
|
+
february: Februar
|
67
|
+
march: März
|
68
|
+
april: April
|
69
|
+
may: Mai
|
70
|
+
june: Juni
|
71
|
+
july: Juli
|
72
|
+
august: August
|
73
|
+
september: September
|
74
|
+
october: Oktober
|
75
|
+
november: November
|
76
|
+
december: Dezember
|
data/resources/resources_en.yml
CHANGED
@@ -16,6 +16,7 @@ past_the_hour: 'past the hour'
|
|
16
16
|
at_x_seconds_past_the_minute: 'at %s seconds past the minute'
|
17
17
|
minutes_through_past_the_hour: 'minutes %s through %s past the hour'
|
18
18
|
on_day_of_the_month: 'on day %s of the month'
|
19
|
+
last_day: 'the last day'
|
19
20
|
first_weekday: 'first weekday'
|
20
21
|
weekday_nearest_day: 'weekday nearest day %s'
|
21
22
|
starting: 'starting'
|
data/resources/resources_fr.yml
CHANGED
@@ -9,13 +9,14 @@ on_the_of_the_month: 'le %s du mois'
|
|
9
9
|
on_the_last_of_the_month: 'le dernier %s du mois'
|
10
10
|
on_the_last_day_of_the_month: 'le dernier jour du mois'
|
11
11
|
on_the_last_weekday_of_the_month: 'le dernier jour en semaine du mois'
|
12
|
-
between_days_of_the_month: 'entre le %s et le %s du mois'
|
12
|
+
between_days_of_the_month: 'entre le jour %s et le %s du mois'
|
13
13
|
seconds_through_past_the_minute: 'secondes %s à %s après la minute'
|
14
14
|
between_x_and_y: 'entre %s et %s'
|
15
15
|
past_the_hour: "après l'heure"
|
16
16
|
at_x_seconds_past_the_minute: 'à %s secondes après la minute'
|
17
17
|
minutes_through_past_the_hour: "minutes %s à %s après l'heure"
|
18
18
|
on_day_of_the_month: 'le %s de chaque mois'
|
19
|
+
last_day: 'dernier jour'
|
19
20
|
first_weekday: 'premier jour de la semaine'
|
20
21
|
weekday_nearest_day: 'jour de semaine le plus proche du %s'
|
21
22
|
starting: 'commence' # départ
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# resources_it.yml
|
2
|
+
---
|
3
|
+
expression_empty_exception: "L'espressione non puó essere null o vuota"
|
4
|
+
interval_description_format: '%s giorni alla settimana'
|
5
|
+
between_description_format: 'da %s a %s'
|
6
|
+
between_weekday_description_format: 'da %s a %s'
|
7
|
+
on_the_day_of_the_month: 'il(la) {{nth}}(a) %s del mese'
|
8
|
+
on_the_of_the_month: 'il %s del mese'
|
9
|
+
on_the_last_of_the_month: "l'ultimo(a) %s del mese"
|
10
|
+
on_the_last_day_of_the_month: "l'ultimo giorno del mese"
|
11
|
+
on_the_last_weekday_of_the_month: "l'ultimo giorno lavorativo del mese"
|
12
|
+
between_days_of_the_month: 'tra il giorno %s e il %s del mese'
|
13
|
+
seconds_through_past_the_minute: 'dal secondo %s al %s dopo il minuto'
|
14
|
+
between_x_and_y: 'tra le %s e le %s'
|
15
|
+
past_the_hour: "dopo l'ora"
|
16
|
+
at_x_seconds_past_the_minute: 'a %s secondi dopo il minuto'
|
17
|
+
minutes_through_past_the_hour: "dal minuto %s al %s dopo l'ora"
|
18
|
+
on_day_of_the_month: 'il giorno %s del mese'
|
19
|
+
last_day: 'ultimo giorno'
|
20
|
+
first_weekday: 'il primo giorno della settimana lavorativa'
|
21
|
+
weekday_nearest_day: 'il prossimo giorno %s della settimana lavorativa'
|
22
|
+
starting: 'a partire da'
|
23
|
+
only_on: 'solo di %s'
|
24
|
+
only_in: 'solo a(nel) %s'
|
25
|
+
every_x_seconds: 'ogni %s secondi'
|
26
|
+
every_minute_between: 'ogni minuto tra le %s e le %s'
|
27
|
+
every_second: 'ogni secondo'
|
28
|
+
every_minute: 'ogni minuto'
|
29
|
+
every_1_minute: 'ogni minuto'
|
30
|
+
every_hour: 'ogni ora'
|
31
|
+
every_1_hour: 'ogni ora'
|
32
|
+
every_day: 'ogni giorno'
|
33
|
+
every_1_day: 'ogni giorno'
|
34
|
+
every_year: 'ogni anno'
|
35
|
+
every_x: 'ogni %s'
|
36
|
+
at_x: 'alle(ai) %s'
|
37
|
+
on_x: 'il %s'
|
38
|
+
in_x: '%s'
|
39
|
+
first: primo
|
40
|
+
second: secondo
|
41
|
+
third: terzo
|
42
|
+
fourth: quarto
|
43
|
+
fifth: quinto
|
44
|
+
time_pm: pomeriggio
|
45
|
+
time_am: mattino
|
46
|
+
and: e
|
47
|
+
at: alle(ai)
|
48
|
+
day: giorno
|
49
|
+
days: giorni
|
50
|
+
hour: ora
|
51
|
+
hours: ore
|
52
|
+
minute: minuto
|
53
|
+
minutes: minuti
|
54
|
+
month: mese
|
55
|
+
months: mesi
|
56
|
+
year: anno
|
57
|
+
years: anni
|
58
|
+
monday: lunedì
|
59
|
+
tuesday: martedì
|
60
|
+
wednesday: mercoledì
|
61
|
+
thursday: giovedì
|
62
|
+
friday: venerdì
|
63
|
+
saturday: sabato
|
64
|
+
sunday: domenica
|
65
|
+
january: gennaio
|
66
|
+
february: febbraio
|
67
|
+
march: marzo
|
68
|
+
april: aprile
|
69
|
+
may: maggio
|
70
|
+
june: giugno
|
71
|
+
july: luglio
|
72
|
+
august: agosto
|
73
|
+
september: settembre
|
74
|
+
october: ottobre
|
75
|
+
november: novembre
|
76
|
+
december: dicembre
|
@@ -16,6 +16,7 @@ past_the_hour: 'após a hora'
|
|
16
16
|
at_x_seconds_past_the_minute: '%s segundos após o minuto'
|
17
17
|
minutes_through_past_the_hour: 'entre %s e %s minutos após a hora'
|
18
18
|
on_day_of_the_month: 'no dia %s do mês'
|
19
|
+
last_day: 'último dia'
|
19
20
|
first_weekday: 'primeiro dia útil'
|
20
21
|
weekday_nearest_day: 'dia útil mais próximo a %s'
|
21
22
|
starting: 'iniciando'
|
data/resources/resources_ro.yml
CHANGED
@@ -9,13 +9,14 @@ on_the_of_the_month: 'în %s ale lunii'
|
|
9
9
|
on_the_last_of_the_month: 'în ultima %s din lună'
|
10
10
|
on_the_last_day_of_the_month: 'în ultima zi a lunii'
|
11
11
|
on_the_last_weekday_of_the_month: 'în ultima zi din săptămână a lunii'
|
12
|
-
between_days_of_the_month: 'între
|
12
|
+
between_days_of_the_month: 'între zilele %s și %s a lunii'
|
13
13
|
seconds_through_past_the_minute: 'între secundele %s și %s'
|
14
14
|
between_x_and_y: 'între %s și %s'
|
15
15
|
past_the_hour: 'în fiecare oră'
|
16
16
|
at_x_seconds_past_the_minute: 'la secunda %s'
|
17
17
|
minutes_through_past_the_hour: 'între minutele %s și %s'
|
18
18
|
on_day_of_the_month: 'în a %s-a zi a lunii'
|
19
|
+
last_day: 'ultima zi'
|
19
20
|
first_weekday: 'prima zi din săptămână'
|
20
21
|
weekday_nearest_day: 'cea mai apropiată %s din săptămână'
|
21
22
|
starting: pornire
|
data/resources/resources_ru.yml
CHANGED
@@ -9,13 +9,14 @@ on_the_of_the_month: 'в %s месяца'
|
|
9
9
|
on_the_last_of_the_month: 'в последний %s месяца'
|
10
10
|
on_the_last_day_of_the_month: 'в последний день месяца'
|
11
11
|
on_the_last_weekday_of_the_month: 'в последний будний день месяца'
|
12
|
-
between_days_of_the_month: '
|
12
|
+
between_days_of_the_month: 'между %s днем и %s днем месяца'
|
13
13
|
seconds_through_past_the_minute: 'секунды с %s по %s'
|
14
|
-
between_x_and_y: '
|
14
|
+
between_x_and_y: 'между %s и %s'
|
15
15
|
past_the_hour: 'часа'
|
16
16
|
at_x_seconds_past_the_minute: 'в %s секунд'
|
17
17
|
minutes_through_past_the_hour: 'минуты с %s по %s'
|
18
|
-
on_day_of_the_month: '%s
|
18
|
+
on_day_of_the_month: '%s день месяца'
|
19
|
+
last_day: 'последним'
|
19
20
|
first_weekday: 'первый будний день'
|
20
21
|
weekday_nearest_day: 'ближайший будний день к %s'
|
21
22
|
starting: начало
|
@@ -0,0 +1,389 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'cronex'
|
3
|
+
|
4
|
+
module Cronex
|
5
|
+
describe ExpressionDescriptor do
|
6
|
+
|
7
|
+
def desc(expression, opts = {})
|
8
|
+
opts[:locale] = 'de'
|
9
|
+
Cronex::ExpressionDescriptor.new(expression, opts).description
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:opts) { { zero_based_dow: false } }
|
13
|
+
|
14
|
+
it 'every second' do
|
15
|
+
expect(desc('* * * * * *')).to eq('Jede Sekunde')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'every 45 seconds' do
|
19
|
+
expect(desc('*/45 * * * * *')).to eq('Alle 45 Sekunden')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'minute span' do
|
23
|
+
expect(desc('0-10 11 * * *')).to eq('Jede Minute zwischen 11:00 AM und 11:10 AM')
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'every minute' do
|
27
|
+
it 'every minute' do
|
28
|
+
expect(desc('* * * * *')).to eq('Jede Minute')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'every minute */1' do
|
32
|
+
expect(desc('*/1 * * * *')).to eq('Jede Minute')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'every minute 0 0/1' do
|
36
|
+
expect(desc('0 0/1 * * * ?')).to eq('Jede Minute')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'every X minutes:' do
|
41
|
+
it 'every 5 minutes' do
|
42
|
+
expect(desc('*/5 * * * *')).to eq('Alle 5 Minuten')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'every 5 minute 0 */5' do
|
46
|
+
expect(desc('0 */5 * * * *')).to eq('Alle 5 Minuten')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'every 10 minutes 0 0/10' do
|
50
|
+
expect(desc('0 0/10 * * * ?')).to eq('Alle 10 Minuten')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'every hour:' do
|
55
|
+
it 'every hour 0 0' do
|
56
|
+
expect(desc('0 0 * * * ?')).to eq('Jede Stunde')
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'every hour 0 0 0/1' do
|
60
|
+
expect(desc('0 0 0/1 * * ?')).to eq('Jede Stunde')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'daily:' do
|
65
|
+
it 'daily at /\d\d/:/\d\d/' do
|
66
|
+
expect(desc('30 11 * * *')).to eq('Um 11:30 AM')
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'daily at /\d/:/\d/' do
|
70
|
+
expect(desc('9 8 * * *')).to eq('Um 8:09 AM')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'daily at /0[89]/:/0[89]/' do
|
74
|
+
expect(desc('09 08 * * *')).to eq('Um 8:09 AM')
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'daily at /0[1-7]/ /0[1-7/' do
|
78
|
+
expect(desc('02 01 * * *')).to eq('Um 1:02 AM')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'time of day certain days of week:' do
|
83
|
+
it 'time of day on MON-FRI' do
|
84
|
+
expect(desc('0 23 ? * MON-FRI')).to eq('Um 11:00 PM, Montag bis Freitag')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'time of day on 1-5' do
|
88
|
+
expect(desc('30 11 * * 1-5')).to eq('Um 11:30 AM, Montag bis Freitag')
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'one month only' do
|
93
|
+
expect(desc('* * * 3 *')).to eq('Jede Minute, nur in März')
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'two months only' do
|
97
|
+
expect(desc('* * * 3,6 *')).to eq('Jede Minute, nur in März und Juni')
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'two times each afternoon' do
|
101
|
+
expect(desc('30 14,16 * * *')).to eq('Um 2:30 PM und 4:30 PM')
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'three times daily' do
|
105
|
+
expect(desc('30 6,14,16 * * *')).to eq('Um 6:30 AM, 2:30 PM und 4:30 PM')
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'once a week:' do
|
109
|
+
it 'once a week 0' do
|
110
|
+
expect(desc('46 9 * * 0')).to eq('Um 9:46 AM, nur an Sonntag')
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'once a week SUN' do
|
114
|
+
expect(desc('46 9 * * SUN')).to eq('Um 9:46 AM, nur an Sonntag')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'once a week 7' do
|
118
|
+
expect(desc('46 9 * * 7')).to eq('Um 9:46 AM, nur an Sonntag')
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'once a week 1' do
|
122
|
+
expect(desc('46 9 * * 1')).to eq('Um 9:46 AM, nur an Montag')
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'once a week 6' do
|
126
|
+
expect(desc('46 9 * * 6')).to eq('Um 9:46 AM, nur an Samstag')
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context 'once a week non zero based:' do
|
131
|
+
it 'once a week 1' do
|
132
|
+
expect(desc('46 9 * * 1', opts)).to eq('Um 9:46 AM, nur an Sonntag')
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'once a week SUN' do
|
136
|
+
expect(desc('46 9 * * SUN', opts)).to eq('Um 9:46 AM, nur an Sonntag')
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'once a week 2' do
|
140
|
+
expect(desc('46 9 * * 2', opts)).to eq('Um 9:46 AM, nur an Montag')
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'once a week 7' do
|
144
|
+
expect(desc('46 9 * * 7', opts)).to eq('Um 9:46 AM, nur an Samstag')
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'twice a week:' do
|
149
|
+
it 'twice a week 1,2' do
|
150
|
+
expect(desc('46 9 * * 1,2')).to eq('Um 9:46 AM, nur an Montag und Dienstag')
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'twice a week MON,TUE' do
|
154
|
+
expect(desc('46 9 * * MON,TUE')).to eq('Um 9:46 AM, nur an Montag und Dienstag')
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'twice a week 0,6' do
|
158
|
+
expect(desc('46 9 * * 0,6')).to eq('Um 9:46 AM, nur an Sonntag und Samstag')
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'twice a week 6,7' do
|
162
|
+
expect(desc('46 9 * * 6,7')).to eq('Um 9:46 AM, nur an Samstag und Sonntag')
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'twice a week non zero based:' do
|
167
|
+
it 'twice a week 1,2' do
|
168
|
+
expect(desc('46 9 * * 1,2', opts)).to eq('Um 9:46 AM, nur an Sonntag und Montag')
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'twice a week SUN,MON' do
|
172
|
+
expect(desc('46 9 * * SUN,MON', opts)).to eq('Um 9:46 AM, nur an Sonntag und Montag')
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'twice a week 6,7' do
|
176
|
+
expect(desc('46 9 * * 6,7', opts)).to eq('Um 9:46 AM, nur an Freitag und Samstag')
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'day of month' do
|
181
|
+
expect(desc('23 12 15 * *')).to eq('Um 12:23 PM, am 15 Tag des Monats')
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'day of month with day of week' do
|
185
|
+
expect(desc('23 12 15 * SUN')).to eq('Um 12:23 PM, am 15 Tag des Monats, nur an Sonntag')
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'month name' do
|
189
|
+
expect(desc('23 12 * JAN *')).to eq('Um 12:23 PM, nur in Januar')
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'day of month with question mark' do
|
193
|
+
expect(desc('23 12 ? JAN *')).to eq('Um 12:23 PM, nur in Januar')
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'month name range 2' do
|
197
|
+
expect(desc('23 12 * JAN-FEB *')).to eq('Um 12:23 PM, Januar bis Februar')
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'month name range 3' do
|
201
|
+
expect(desc('23 12 * JAN-MAR *')).to eq('Um 12:23 PM, Januar bis März')
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'day of week name' do
|
205
|
+
expect(desc('23 12 * * SUN')).to eq('Um 12:23 PM, nur an Sonntag')
|
206
|
+
end
|
207
|
+
|
208
|
+
context 'day of week range:' do
|
209
|
+
it 'day of week range MON-FRI' do
|
210
|
+
expect(desc('*/5 15 * * MON-FRI')).to eq('Alle 5 Minuten, um 3:00 PM, Montag bis Freitag')
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'day of week range 0-6' do
|
214
|
+
expect(desc('*/5 15 * * 0-6')).to eq('Alle 5 Minuten, um 3:00 PM, Sonntag bis Samstag')
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'day of week range 6-7' do
|
218
|
+
expect(desc('*/5 15 * * 6-7')).to eq('Alle 5 Minuten, um 3:00 PM, Samstag bis Sonntag')
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'day of week once in month:' do
|
223
|
+
it 'day of week once MON#3' do
|
224
|
+
expect(desc('* * * * MON#3')).to eq('Jede Minute, am dritten Montag des Monats')
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'day of week once 0#3' do
|
228
|
+
expect(desc('* * * * 0#3')).to eq('Jede Minute, am dritten Sonntag des Monats')
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
context 'last day of week of the month:' do
|
233
|
+
it 'last day of week 4L' do
|
234
|
+
expect(desc('* * * * 4L')).to eq('Jede Minute, am letzten Donnerstag des Monats')
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'last day of week 0L' do
|
238
|
+
expect(desc('* * * * 0L')).to eq('Jede Minute, am letzten Sonntag des Monats')
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
context 'last day of the month:' do
|
243
|
+
it 'on the last day of the month' do
|
244
|
+
expect(desc('*/5 * L JAN *')).to eq('Alle 5 Minuten, am letzten Tag des Monats, nur in Januar')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'between a day and last day of the month' do
|
248
|
+
expect(desc('*/5 * 23-L JAN *')).to eq('Alle 5 Minuten, zwischen Tag 23 und der letzte Tag des Monats, nur in Januar')
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'time of day with seconds' do
|
253
|
+
expect(desc('30 02 14 * * *')).to eq('Um 2:02:30 PM')
|
254
|
+
end
|
255
|
+
|
256
|
+
it 'second intervals' do
|
257
|
+
expect(desc('5-10 * * * * *')).to eq('Sekunden 5 bis 10 vergangene Minute')
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'second minutes hours intervals' do
|
261
|
+
expect(desc('5-10 30-35 10-12 * * *')).to eq(
|
262
|
+
'Sekunden 5 bis 10 vergangene Minute, Minuten 30 bis 35 nach der vergangenen Stunde, zwischen 10:00 AM und 12:59 PM')
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'every 5 minutes at 30 seconds' do
|
266
|
+
expect(desc('30 */5 * * * *')).to eq('Am 30 Sekunden nach der vergangenen Minute, Alle 5 Minuten')
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'minutes past the hour range' do
|
270
|
+
expect(desc('0 30 10-13 ? * WED,FRI')).to eq(
|
271
|
+
'Um 30 Minuten vergangene Stunde, zwischen 10:00 AM und 1:59 PM, nur an Mittwoch und Freitag')
|
272
|
+
end
|
273
|
+
|
274
|
+
it 'seconds past the minute interval' do
|
275
|
+
expect(desc('10 0/5 * * * ?')).to eq('Am 10 Sekunden nach der vergangenen Minute, Alle 5 Minuten')
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'between with interval' do
|
279
|
+
expect(desc('2-59/3 1,9,22 11-26 1-6 ?')).to eq(
|
280
|
+
'Alle 3 Minuten, Minuten 02 bis 59 nach der vergangenen Stunde, um 1:00 AM, 9:00 AM und 10:00 PM, zwischen Tag 11 und 26 des Monats, Januar bis Juni')
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'recurring first of month' do
|
284
|
+
expect(desc('0 0 6 1/1 * ?')).to eq('Um 6:00 AM')
|
285
|
+
end
|
286
|
+
|
287
|
+
it 'minutes past the hour' do
|
288
|
+
expect(desc('0 5 0/1 * * ?')).to eq('Um 05 Minuten vergangene Stunde')
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'every past the hour' do
|
292
|
+
expect(desc('0 0,5,10,15,20,25,30,35,40,45,50,55 * ? * *')).to eq(
|
293
|
+
'Um 00, 05, 10, 15, 20, 25, 30, 35, 40, 45, 50 und 55 Minuten vergangene Stunde')
|
294
|
+
end
|
295
|
+
|
296
|
+
it 'every x minute past the hour with interval' do
|
297
|
+
expect(desc('0 0-30/2 17 ? * MON-FRI')).to eq(
|
298
|
+
'Alle 2 Minuten, Minuten 00 bis 30 nach der vergangenen Stunde, um 5:00 PM, Montag bis Freitag')
|
299
|
+
end
|
300
|
+
|
301
|
+
it 'one year only with seconds' do
|
302
|
+
expect(desc('* * * * * * 2013')).to eq('Jede Sekunde, nur in 2013')
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'one year only without seconds' do
|
306
|
+
expect(desc('* * * * * 2013')).to eq('Jede Minute, nur in 2013')
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'two years only' do
|
310
|
+
expect(desc('* * * * * 2013,2014')).to eq('Jede Minute, nur in 2013 und 2014')
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'year range 2' do
|
314
|
+
expect(desc('23 12 * JAN-FEB * 2013-2014')).to eq('Um 12:23 PM, Januar bis Februar, 2013 bis 2014')
|
315
|
+
end
|
316
|
+
|
317
|
+
it 'year range 3' do
|
318
|
+
expect(desc('23 12 * JAN-MAR * 2013-2015')).to eq('Um 12:23 PM, Januar bis März, 2013 bis 2015')
|
319
|
+
end
|
320
|
+
|
321
|
+
context 'multi part range seconds:' do
|
322
|
+
it 'multi part range seconds 2,4-5' do
|
323
|
+
expect(desc('2,4-5 1 * * *')).to eq('Minuten 02,04 bis 05 nach der vergangenen Stunde, um 1:00 AM')
|
324
|
+
end
|
325
|
+
|
326
|
+
it 'multi part range seconds 2,26-28' do
|
327
|
+
expect(desc('2,26-28 18 * * *')).to eq('Minuten 02,26 bis 28 nach der vergangenen Stunde, um 6:00 PM')
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
context 'minutes past the hour:' do
|
332
|
+
it 'minutes past the hour 5,10' do
|
333
|
+
expect(desc('5,10 0 * * *')).to eq('Um 05 und 10 Minuten vergangene Stunde')
|
334
|
+
end
|
335
|
+
|
336
|
+
it 'minutes past the hour 5,10 day 2' do
|
337
|
+
expect(desc('5,10 0 2 * *')).to eq('Um 05 und 10 Minuten vergangene Stunde, am 2 Tag des Monats')
|
338
|
+
end
|
339
|
+
|
340
|
+
it 'minutes past the hour 5/10 day 2' do
|
341
|
+
expect(desc('5/10 0 2 * *')).to eq('Alle 10 Minuten, beginnend um 05 Minuten vergangene Stunde, am 2 Tag des Monats')
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
context 'seconds past the minute:' do
|
346
|
+
it 'seconds past the minute 5,6' do
|
347
|
+
expect(desc('5,6 0 0 * * *')).to eq('Am 5 und 6 Sekunden nach der vergangenen Minute')
|
348
|
+
end
|
349
|
+
|
350
|
+
it 'seconds past the minute 5,6 at 1' do
|
351
|
+
expect(desc('5,6 0 1 * * *')).to eq('Am 5 und 6 Sekunden nach der vergangenen Minute, um 1:00 AM')
|
352
|
+
end
|
353
|
+
|
354
|
+
it 'seconds past the minute 5,6 day 2' do
|
355
|
+
expect(desc('5,6 0 0 2 * *')).to eq('Am 5 und 6 Sekunden nach der vergangenen Minute, am 2 Tag des Monats')
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
context 'increments starting at X > 1:' do
|
360
|
+
it 'second increments' do
|
361
|
+
expect(desc('5/15 0 * * * *')).to eq('Alle 15 Sekunden, beginnend am 5 Sekunden nach der vergangenen Minute')
|
362
|
+
end
|
363
|
+
|
364
|
+
it 'minute increments' do
|
365
|
+
expect(desc('30/10 * * * *')).to eq('Alle 10 Minuten, beginnend um 30 Minuten vergangene Stunde')
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'hour increments' do
|
369
|
+
expect(desc('0 30 2/6 * * ?')).to eq('Um 30 Minuten vergangene Stunde, Alle 6 Stunden, beginnend um 2:00 AM')
|
370
|
+
end
|
371
|
+
|
372
|
+
it 'day of month increments' do
|
373
|
+
expect(desc('0 30 8 2/7 * *')).to eq('Um 8:30 AM, Alle 7 Tagen, beginnend am 2 Tag des Monats')
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'day of week increments' do
|
377
|
+
expect(desc('0 30 11 * * 2/2')).to eq('Um 11:30 AM, jeden 2 Tag der Woche, beginnend an Dienstag')
|
378
|
+
end
|
379
|
+
|
380
|
+
it 'month increments' do
|
381
|
+
expect(desc('0 20 10 * 2/3 THU')).to eq('Um 10:20 AM, nur an Donnerstag, Alle 3 Monaten, beginnend in Februar')
|
382
|
+
end
|
383
|
+
|
384
|
+
it 'year increments' do
|
385
|
+
expect(desc('0 0 0 1 MAR * 2010/5')).to eq('Um 12:00 AM, am 1 Tag des Monats, nur in März, Alle 5 Jahren, beginnend in 2010')
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
389
|
+
end
|