cronex 0.9.0 → 0.11.1
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 -3
- data/cronex.gemspec +2 -2
- data/lib/cronex/description/base.rb +5 -3
- 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 +1 -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 +15 -4
- data/spec/exp_descriptor_en_spec.rb +18 -7
- data/spec/exp_descriptor_fr_spec.rb +15 -4
- data/spec/exp_descriptor_it_spec.rb +393 -0
- data/spec/exp_descriptor_pt_BR_spec.rb +14 -3
- data/spec/exp_descriptor_ro_spec.rb +15 -4
- data/spec/exp_descriptor_ru_spec.rb +24 -13
- metadata +17 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5326f654a688b504da9a79818cc3ae5c9e5b36797246ef53d8311946543c5432
|
4
|
+
data.tar.gz: 5609b37b9e49f3a850937df6c912236e737def16c397a556fa549e173867aab3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2a0b1c000223a3c63c6b74c3f479a6be6e21534db10c7abaac4c329d11b5c06d425173c82f527ffef0f333e1a632974bceaf520f5fbe21f82c63a490a46c3cd
|
7
|
+
data.tar.gz: d80c695bbac875c1fc77ab5681e56261aa5161327baa6c45110b050156448f8a8bf7fa89762a59fec7809b2ef113483137629cddedf88b979105d239c26dd420
|
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.1] - 2020-10-21
|
2
|
+
* Fix two consecutive commas in interval expressions
|
3
|
+
|
4
|
+
### [0.11.0] - 2020-10-05
|
5
|
+
* Fix handling L in day of month expressions
|
6
|
+
|
7
|
+
### [0.10.0] - 2020-05-26
|
8
|
+
* Move locale and timezone arguments to options
|
9
|
+
|
10
|
+
### [0.9.2] - 2020-04-24
|
11
|
+
* Add italian locale
|
12
|
+
|
13
|
+
### [0.9.1] - 2019-11-26
|
14
|
+
* Update tzinfo dependency
|
15
|
+
|
1
16
|
### [0.9.0] - 2019-04-21
|
2
17
|
* Add german locale
|
3
18
|
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ Original Author & Credit: Brady Holt (http://www.geekytidbits.com).
|
|
18
18
|
* Supports printing to locale specific human readable format
|
19
19
|
* Supports displaying times in specific timezones
|
20
20
|
|
21
|
-
For a quick intro to cron see Quartz [Cron Tutorial](http://www.quartz-scheduler.org/documentation/quartz-
|
21
|
+
For a quick intro to cron see Quartz [Cron Tutorial](http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html).
|
22
22
|
|
23
23
|
## Available Locales
|
24
24
|
|
@@ -26,6 +26,7 @@ For a quick intro to cron see Quartz [Cron Tutorial](http://www.quartz-scheduler
|
|
26
26
|
* Brazilian
|
27
27
|
* French
|
28
28
|
* German
|
29
|
+
* Italian
|
29
30
|
* Romanian
|
30
31
|
* Russian
|
31
32
|
|
@@ -60,12 +61,12 @@ Or install it yourself as:
|
|
60
61
|
|
61
62
|
#### Localization
|
62
63
|
|
63
|
-
Cronex::ExpressionDescriptor.new('30 2 * 2 1-5',
|
64
|
+
Cronex::ExpressionDescriptor.new('30 2 * 2 1-5', locale: 'fr').description
|
64
65
|
=> À 2:30 AM, lundi à vendredi, seulement en février
|
65
66
|
|
66
67
|
#### Timezones
|
67
68
|
|
68
|
-
Cronex::ExpressionDescriptor.new('0-10 11 * * *',
|
69
|
+
Cronex::ExpressionDescriptor.new('0-10 11 * * *', timezone: 'America/Los_Angeles').description
|
69
70
|
=> Every minute between 4:00 AM and 4:10 AM # PDT or
|
70
71
|
=> Every minute between 3:00 AM and 3:10 AM # PST
|
71
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,11 +12,11 @@ module Cronex
|
|
12
12
|
['/', '-', ',']
|
13
13
|
end
|
14
14
|
|
15
|
-
def segment_description(expression,
|
15
|
+
def segment_description(expression, all_values_description)
|
16
16
|
if expression.empty? || expression == '0'
|
17
17
|
desc = ''
|
18
18
|
elsif expression == '*'
|
19
|
-
desc =
|
19
|
+
desc = all_values_description
|
20
20
|
elsif !Cronex::Utils.include_any?(expression, special_chars)
|
21
21
|
desc = format(description_format(expression), single_item_description(expression))
|
22
22
|
elsif expression.include?('/')
|
@@ -26,10 +26,12 @@ module Cronex
|
|
26
26
|
if segments[0].include?('-')
|
27
27
|
between_segment_of_interval = segments[0]
|
28
28
|
between_segments = between_segment_of_interval.split('-')
|
29
|
-
|
29
|
+
between = format(
|
30
30
|
between_description_format(between_segment_of_interval),
|
31
31
|
single_item_description(between_segments[0]),
|
32
32
|
single_item_description(between_segments[1]).gsub(':00', ':59'))
|
33
|
+
desc += ', ' if !between.start_with?(', ')
|
34
|
+
desc += between
|
33
35
|
elsif !Cronex::Utils.include_any?(segments[0], special_chars + ['*'])
|
34
36
|
desc += ', ' + format(starting_description_format(segments[0]), single_item_description(segments[0]))
|
35
37
|
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
data/resources/resources_de.yml
CHANGED
@@ -16,6 +16,7 @@ past_the_hour: 'vergangene Stunde'
|
|
16
16
|
at_x_seconds_past_the_minute: 'am %s Sekunden nach der vergangenen Minute'
|
17
17
|
minutes_through_past_the_hour: 'Minuten %s bis %s nach der vergangenen Stunde'
|
18
18
|
on_day_of_the_month: 'am %s Tag des Monats'
|
19
|
+
last_day: 'der letzte Tag'
|
19
20
|
first_weekday: 'Erster Wochentag'
|
20
21
|
weekday_nearest_day: 'Wochentag zum nächsten Tag %s'
|
21
22
|
starting: 'beginnend'
|
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: начало
|
@@ -4,8 +4,9 @@ require 'cronex'
|
|
4
4
|
module Cronex
|
5
5
|
describe ExpressionDescriptor do
|
6
6
|
|
7
|
-
def desc(expression, opts = {}
|
8
|
-
|
7
|
+
def desc(expression, opts = {})
|
8
|
+
opts[:locale] = 'de'
|
9
|
+
Cronex::ExpressionDescriptor.new(expression, opts).description
|
9
10
|
end
|
10
11
|
|
11
12
|
let(:opts) { { zero_based_dow: false } }
|
@@ -238,8 +239,14 @@ module Cronex
|
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
241
|
-
|
242
|
-
|
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
|
243
250
|
end
|
244
251
|
|
245
252
|
it 'time of day with seconds' do
|
@@ -291,6 +298,10 @@ module Cronex
|
|
291
298
|
'Alle 2 Minuten, Minuten 00 bis 30 nach der vergangenen Stunde, um 5:00 PM, Montag bis Freitag')
|
292
299
|
end
|
293
300
|
|
301
|
+
it 'every x days with interval' do
|
302
|
+
expect(desc('30 7 1-L/2 * *')).to eq('Um 7:30 AM, Alle 2 Tagen, zwischen Tag 1 und der letzte Tag des Monats')
|
303
|
+
end
|
304
|
+
|
294
305
|
it 'one year only with seconds' do
|
295
306
|
expect(desc('* * * * * * 2013')).to eq('Jede Sekunde, nur in 2013')
|
296
307
|
end
|
@@ -4,8 +4,9 @@ require 'cronex'
|
|
4
4
|
module Cronex
|
5
5
|
describe ExpressionDescriptor do
|
6
6
|
|
7
|
-
def desc(expression, opts = {}
|
8
|
-
|
7
|
+
def desc(expression, opts = {})
|
8
|
+
opts[:locale] = 'en'
|
9
|
+
Cronex::ExpressionDescriptor.new(expression, opts).description
|
9
10
|
end
|
10
11
|
|
11
12
|
let(:opts) { { zero_based_dow: false } }
|
@@ -238,8 +239,14 @@ module Cronex
|
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
241
|
-
|
242
|
-
|
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('Every 5 minutes, on the last day of the month, only in January')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'between a day and last day of the month' do
|
248
|
+
expect(desc('*/5 * 23-L JAN *')).to eq('Every 5 minutes, between day 23 and the last day of the month, only in January')
|
249
|
+
end
|
243
250
|
end
|
244
251
|
|
245
252
|
it 'time of day with seconds' do
|
@@ -291,6 +298,10 @@ module Cronex
|
|
291
298
|
'Every 2 minutes, minutes 00 through 30 past the hour, at 5:00 PM, Monday through Friday')
|
292
299
|
end
|
293
300
|
|
301
|
+
it 'every x days with interval' do
|
302
|
+
expect(desc('30 7 1-L/2 * *')).to eq('At 7:30 AM, every 2 days, between day 1 and the last day of the month')
|
303
|
+
end
|
304
|
+
|
294
305
|
it 'one year only with seconds' do
|
295
306
|
expect(desc('* * * * * * 2013')).to eq('Every second, only in 2013')
|
296
307
|
end
|
@@ -383,19 +394,19 @@ module Cronex
|
|
383
394
|
it 'minute span' do
|
384
395
|
tz = TZInfo::Timezone.get('America/Los_Angeles')
|
385
396
|
hour = tz.period_for_local(Time.now).zone_identifier.to_s == 'PDT' ? 4 : 3
|
386
|
-
expect(desc('0-10 11 * * *',
|
397
|
+
expect(desc('0-10 11 * * *', timezone: 'America/Los_Angeles')).to eq("Every minute between #{hour}:00 AM and #{hour}:10 AM")
|
387
398
|
end
|
388
399
|
|
389
400
|
it 'twice a day' do
|
390
401
|
tz = TZInfo::Timezone.get('America/Los_Angeles')
|
391
402
|
hour = tz.period_for_local(Time.now).zone_identifier.to_s == 'PDT' ? 5 : 4
|
392
|
-
expect(desc('0 0,12 * * *',
|
403
|
+
expect(desc('0 0,12 * * *', timezone: 'America/Los_Angeles')).to eq("At #{hour}:00 PM and #{hour}:00 AM")
|
393
404
|
end
|
394
405
|
|
395
406
|
it 'ahead of GMT' do
|
396
407
|
tz = TZInfo::Timezone.get('Europe/Vienna')
|
397
408
|
hour = tz.period_for_local(Time.now).zone_identifier.to_s == 'CEST' ? 1 : 12
|
398
|
-
expect(desc('0-10 11 * * *',
|
409
|
+
expect(desc('0-10 11 * * *', timezone: 'Europe/Vienna')).to eq("Every minute between #{hour}:00 PM and #{hour}:10 PM")
|
399
410
|
end
|
400
411
|
end
|
401
412
|
end
|
@@ -5,7 +5,8 @@ module Cronex
|
|
5
5
|
describe ExpressionDescriptor do
|
6
6
|
|
7
7
|
def desc(expression, opts = {})
|
8
|
-
|
8
|
+
opts[:locale] = 'fr'
|
9
|
+
Cronex::ExpressionDescriptor.new(expression, opts).description
|
9
10
|
end
|
10
11
|
|
11
12
|
let(:opts) { { zero_based_dow: false } }
|
@@ -238,8 +239,14 @@ module Cronex
|
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
241
|
-
|
242
|
-
|
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('Tous les 5 minutes, le dernier jour du mois, seulement en janvier')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'between a day and last day of the month' do
|
248
|
+
expect(desc('*/5 * 23-L JAN *')).to eq('Tous les 5 minutes, entre le jour 23 et le dernier jour du mois, seulement en janvier')
|
249
|
+
end
|
243
250
|
end
|
244
251
|
|
245
252
|
it 'time of day with seconds' do
|
@@ -270,7 +277,7 @@ module Cronex
|
|
270
277
|
|
271
278
|
it 'between with interval' do
|
272
279
|
expect(desc('2-59/3 1,9,22 11-26 1-6 ?')).to eq(
|
273
|
-
"Tous les 3 minutes, minutes 02 à 59 après l'heure, à 1:00 AM, 9:00 AM et 10:00 PM, entre le 11 et le 26 du mois, janvier à juin")
|
280
|
+
"Tous les 3 minutes, minutes 02 à 59 après l'heure, à 1:00 AM, 9:00 AM et 10:00 PM, entre le jour 11 et le 26 du mois, janvier à juin")
|
274
281
|
end
|
275
282
|
|
276
283
|
it 'recurring first of month' do
|
@@ -291,6 +298,10 @@ module Cronex
|
|
291
298
|
"Tous les 2 minutes, minutes 00 à 30 après l'heure, à 5:00 PM, lundi à vendredi")
|
292
299
|
end
|
293
300
|
|
301
|
+
it 'every x days with interval' do
|
302
|
+
expect(desc('30 7 1-L/2 * *')).to eq('À 7:30 AM, tous les 2 jours, entre le jour 1 et le dernier jour du mois')
|
303
|
+
end
|
304
|
+
|
294
305
|
it 'one year only with seconds' do
|
295
306
|
expect(desc('* * * * * * 2013')).to eq('Chaque seconde, seulement en 2013')
|
296
307
|
end
|
@@ -0,0 +1,393 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'cronex'
|
3
|
+
|
4
|
+
module Cronex
|
5
|
+
describe ExpressionDescriptor do
|
6
|
+
|
7
|
+
def desc(expression, opts = {})
|
8
|
+
opts[:locale] = 'it'
|
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('Ogni secondo')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'every 45 seconds' do
|
19
|
+
expect(desc('*/45 * * * * *')).to eq('Ogni 45 secondi')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'minute span' do
|
23
|
+
expect(desc('0-10 11 * * *')).to eq('Ogni minuto tra le 11:00 AM e le 11:10 AM')
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'every minute' do
|
27
|
+
it 'every minute' do
|
28
|
+
expect(desc('* * * * *')).to eq('Ogni minuto')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'every minute */1' do
|
32
|
+
expect(desc('*/1 * * * *')).to eq('Ogni minuto')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'every minute 0 0/1' do
|
36
|
+
expect(desc('0 0/1 * * * ?')).to eq('Ogni minuto')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'every X minutes:' do
|
41
|
+
it 'every 5 minuti' do
|
42
|
+
expect(desc('*/5 * * * *')).to eq('Ogni 5 minuti')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'every 5 minute 0 */5' do
|
46
|
+
expect(desc('0 */5 * * * *')).to eq('Ogni 5 minuti')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'every 10 minutes 0 0/10' do
|
50
|
+
expect(desc('0 0/10 * * * ?')).to eq('Ogni 10 minuti')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'every hour:' do
|
55
|
+
it 'every hour 0 0' do
|
56
|
+
expect(desc('0 0 * * * ?')).to eq('Ogni ora')
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'every hour 0 0 0/1' do
|
60
|
+
expect(desc('0 0 0/1 * * ?')).to eq('Ogni ora')
|
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('Alle(ai) 11:30 AM')
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'daily at /\d/:/\d/' do
|
70
|
+
expect(desc('9 8 * * *')).to eq('Alle(ai) 8:09 AM')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'daily at /0[89]/:/0[89]/' do
|
74
|
+
expect(desc('09 08 * * *')).to eq('Alle(ai) 8:09 AM')
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'daily at /0[1-7]/ /0[1-7/' do
|
78
|
+
expect(desc('02 01 * * *')).to eq('Alle(ai) 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('Alle(ai) 11:00 PM, da lunedì a venerdì')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'time of day on 1-5' do
|
88
|
+
expect(desc('30 11 * * 1-5')).to eq('Alle(ai) 11:30 AM, da lunedì a venerdì')
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'one month only' do
|
93
|
+
expect(desc('* * * 3 *')).to eq('Ogni minuto, solo a(nel) marzo')
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'two months only' do
|
97
|
+
expect(desc('* * * 3,6 *')).to eq('Ogni minuto, solo a(nel) marzo e giugno')
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'two times each afternoon' do
|
101
|
+
expect(desc('30 14,16 * * *')).to eq('Alle(ai) 2:30 PM e 4:30 PM')
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'three times daily' do
|
105
|
+
expect(desc('30 6,14,16 * * *')).to eq('Alle(ai) 6:30 AM, 2:30 PM e 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('Alle(ai) 9:46 AM, solo di domenica')
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'once a week SUN' do
|
114
|
+
expect(desc('46 9 * * SUN')).to eq('Alle(ai) 9:46 AM, solo di domenica')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'once a week 7' do
|
118
|
+
expect(desc('46 9 * * 7')).to eq('Alle(ai) 9:46 AM, solo di domenica')
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'once a week 1' do
|
122
|
+
expect(desc('46 9 * * 1')).to eq('Alle(ai) 9:46 AM, solo di lunedì')
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'once a week 6' do
|
126
|
+
expect(desc('46 9 * * 6')).to eq('Alle(ai) 9:46 AM, solo di sabato')
|
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('Alle(ai) 9:46 AM, solo di domenica')
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'once a week SUN' do
|
136
|
+
expect(desc('46 9 * * SUN', opts)).to eq('Alle(ai) 9:46 AM, solo di domenica')
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'once a week 2' do
|
140
|
+
expect(desc('46 9 * * 2', opts)).to eq('Alle(ai) 9:46 AM, solo di lunedì')
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'once a week 7' do
|
144
|
+
expect(desc('46 9 * * 7', opts)).to eq('Alle(ai) 9:46 AM, solo di sabato')
|
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('Alle(ai) 9:46 AM, solo di lunedì e martedì')
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'twice a week MON,TUE' do
|
154
|
+
expect(desc('46 9 * * MON,TUE')).to eq('Alle(ai) 9:46 AM, solo di lunedì e martedì')
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'twice a week 0,6' do
|
158
|
+
expect(desc('46 9 * * 0,6')).to eq('Alle(ai) 9:46 AM, solo di domenica e sabato')
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'twice a week 6,7' do
|
162
|
+
expect(desc('46 9 * * 6,7')).to eq('Alle(ai) 9:46 AM, solo di sabato e domenica')
|
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('Alle(ai) 9:46 AM, solo di domenica e lunedì')
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'twice a week SUN,MON' do
|
172
|
+
expect(desc('46 9 * * SUN,MON', opts)).to eq('Alle(ai) 9:46 AM, solo di domenica e lunedì')
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'twice a week 6,7' do
|
176
|
+
expect(desc('46 9 * * 6,7', opts)).to eq('Alle(ai) 9:46 AM, solo di venerdì e sabato')
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'day of month' do
|
181
|
+
expect(desc('23 12 15 * *')).to eq('Alle(ai) 12:23 PM, il giorno 15 del mese')
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'day of month with day of week' do
|
185
|
+
expect(desc('23 12 15 * SUN')).to eq('Alle(ai) 12:23 PM, il giorno 15 del mese, solo di domenica')
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'month name' do
|
189
|
+
expect(desc('23 12 * JAN *')).to eq('Alle(ai) 12:23 PM, solo a(nel) gennaio')
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'day of month with question mark' do
|
193
|
+
expect(desc('23 12 ? JAN *')).to eq('Alle(ai) 12:23 PM, solo a(nel) gennaio')
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'month name range 2' do
|
197
|
+
expect(desc('23 12 * JAN-FEB *')).to eq('Alle(ai) 12:23 PM, da gennaio a febbraio')
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'month name range 3' do
|
201
|
+
expect(desc('23 12 * JAN-MAR *')).to eq('Alle(ai) 12:23 PM, da gennaio a marzo')
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'day of week name' do
|
205
|
+
expect(desc('23 12 * * SUN')).to eq('Alle(ai) 12:23 PM, solo di domenica')
|
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('Ogni 5 minuti, alle(ai) 3:00 PM, da lunedì a venerdì')
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'day of week range 0-6' do
|
214
|
+
expect(desc('*/5 15 * * 0-6')).to eq('Ogni 5 minuti, alle(ai) 3:00 PM, da domenica a sabato')
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'day of week range 6-7' do
|
218
|
+
expect(desc('*/5 15 * * 6-7')).to eq('Ogni 5 minuti, alle(ai) 3:00 PM, da sabato a domenica')
|
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('Ogni minuto, il(la) terzo(a) lunedì del mese')
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'day of week once 0#3' do
|
228
|
+
expect(desc('* * * * 0#3')).to eq('Ogni minuto, il(la) terzo(a) domenica del mese')
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
context 'last day of week del mese:' do
|
233
|
+
it 'last day of week 4L' do
|
234
|
+
expect(desc('* * * * 4L')).to eq('Ogni minuto, l\'ultimo(a) giovedì del mese')
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'last day of week 0L' do
|
238
|
+
expect(desc('* * * * 0L')).to eq('Ogni minuto, l\'ultimo(a) domenica del mese')
|
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('Ogni 5 minuti, l\'ultimo giorno del mese, solo a(nel) gennaio')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'between a day and last day of the month' do
|
248
|
+
expect(desc('*/5 * 23-L JAN *')).to eq('Ogni 5 minuti, tra il giorno 23 e il ultimo giorno del mese, solo a(nel) gennaio')
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'time of day with seconds' do
|
253
|
+
expect(desc('30 02 14 * * *')).to eq('Alle(ai) 2:02:30 PM')
|
254
|
+
end
|
255
|
+
|
256
|
+
it 'second intervals' do
|
257
|
+
expect(desc('5-10 * * * * *')).to eq('Dal secondo 5 al 10 dopo il minuto')
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'second minutes hours intervals' do
|
261
|
+
expect(desc('5-10 30-35 10-12 * * *')).to eq(
|
262
|
+
'Dal secondo 5 al 10 dopo il minuto, dal minuto 30 al 35 dopo l\'ora, tra le 10:00 AM e le 12:59 PM')
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'every 5 minutes at 30 seconds' do
|
266
|
+
expect(desc('30 */5 * * * *')).to eq('A 30 secondi dopo il minuto, ogni 5 minuti')
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'minutes past the hour range' do
|
270
|
+
expect(desc('0 30 10-13 ? * WED,FRI')).to eq(
|
271
|
+
'Alle(ai) 30 minuti dopo l\'ora, tra le 10:00 AM e le 1:59 PM, solo di mercoledì e venerdì')
|
272
|
+
end
|
273
|
+
|
274
|
+
it 'seconds past the minute interval' do
|
275
|
+
expect(desc('10 0/5 * * * ?')).to eq('A 10 secondi dopo il minuto, ogni 5 minuti')
|
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
|
+
'Ogni 3 minuti, dal minuto 02 al 59 dopo l\'ora, alle(ai) 1:00 AM, 9:00 AM e 10:00 PM, tra il giorno 11 e il 26 del mese, da gennaio a giugno')
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'recurring first of month' do
|
284
|
+
expect(desc('0 0 6 1/1 * ?')).to eq('Alle(ai) 6:00 AM')
|
285
|
+
end
|
286
|
+
|
287
|
+
it 'minutes past the hour' do
|
288
|
+
expect(desc('0 5 0/1 * * ?')).to eq('Alle(ai) 05 minuti dopo l\'ora')
|
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
|
+
'Alle(ai) 00, 05, 10, 15, 20, 25, 30, 35, 40, 45, 50 e 55 minuti dopo l\'ora')
|
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
|
+
'Ogni 2 minuti, dal minuto 00 al 30 dopo l\'ora, alle(ai) 5:00 PM, da lunedì a venerdì')
|
299
|
+
end
|
300
|
+
|
301
|
+
it 'every x days with interval' do
|
302
|
+
expect(desc('30 7 1-L/2 * *')).to eq('Alle(ai) 7:30 AM, ogni 2 giorni, tra il giorno 1 e il ultimo giorno del mese')
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'one year only with seconds' do
|
306
|
+
expect(desc('* * * * * * 2013')).to eq('Ogni secondo, solo a(nel) 2013')
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'one year only without seconds' do
|
310
|
+
expect(desc('* * * * * 2013')).to eq('Ogni minuto, solo a(nel) 2013')
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'two years only' do
|
314
|
+
expect(desc('* * * * * 2013,2014')).to eq('Ogni minuto, solo a(nel) 2013 e 2014')
|
315
|
+
end
|
316
|
+
|
317
|
+
it 'year range 2' do
|
318
|
+
expect(desc('23 12 * JAN-FEB * 2013-2014')).to eq('Alle(ai) 12:23 PM, da gennaio a febbraio, da 2013 a 2014')
|
319
|
+
end
|
320
|
+
|
321
|
+
it 'year range 3' do
|
322
|
+
expect(desc('23 12 * JAN-MAR * 2013-2015')).to eq('Alle(ai) 12:23 PM, da gennaio a marzo, da 2013 a 2015')
|
323
|
+
end
|
324
|
+
|
325
|
+
context 'multi part range seconds:' do
|
326
|
+
it 'multi part range seconds 2,4-5' do
|
327
|
+
expect(desc('2,4-5 1 * * *')).to eq('Dal minuto 02,04 al 05 dopo l\'ora, alle(ai) 1:00 AM')
|
328
|
+
end
|
329
|
+
|
330
|
+
it 'multi part range seconds 2,26-28' do
|
331
|
+
expect(desc('2,26-28 18 * * *')).to eq('Dal minuto 02,26 al 28 dopo l\'ora, alle(ai) 6:00 PM')
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
context 'minutes past the hour:' do
|
336
|
+
it 'minutes past the hour 5,10' do
|
337
|
+
expect(desc('5,10 0 * * *')).to eq('Alle(ai) 05 e 10 minuti dopo l\'ora')
|
338
|
+
end
|
339
|
+
|
340
|
+
it 'minutes past the hour 5,10 day 2' do
|
341
|
+
expect(desc('5,10 0 2 * *')).to eq('Alle(ai) 05 e 10 minuti dopo l\'ora, il giorno 2 del mese')
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'minutes past the hour 5/10 day 2' do
|
345
|
+
expect(desc('5/10 0 2 * *')).to eq('Ogni 10 minuti, a partire da alle(ai) 05 minuti dopo l\'ora, il giorno 2 del mese')
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
context 'seconds past the minute:' do
|
350
|
+
it 'seconds past the minute 5,6' do
|
351
|
+
expect(desc('5,6 0 0 * * *')).to eq('A 5 e 6 secondi dopo il minuto')
|
352
|
+
end
|
353
|
+
|
354
|
+
it 'seconds past the minute 5,6 at 1' do
|
355
|
+
expect(desc('5,6 0 1 * * *')).to eq('A 5 e 6 secondi dopo il minuto, alle(ai) 1:00 AM')
|
356
|
+
end
|
357
|
+
|
358
|
+
it 'seconds past the minute 5,6 day 2' do
|
359
|
+
expect(desc('5,6 0 0 2 * *')).to eq('A 5 e 6 secondi dopo il minuto, il giorno 2 del mese')
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
context 'increments starting at X > 1:' do
|
364
|
+
it 'second increments' do
|
365
|
+
expect(desc('5/15 0 * * * *')).to eq('Ogni 15 secondi, a partire da a 5 secondi dopo il minuto')
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'minute increments' do
|
369
|
+
expect(desc('30/10 * * * *')).to eq('Ogni 10 minuti, a partire da alle(ai) 30 minuti dopo l\'ora')
|
370
|
+
end
|
371
|
+
|
372
|
+
it 'hour increments' do
|
373
|
+
expect(desc('0 30 2/6 * * ?')).to eq('Alle(ai) 30 minuti dopo l\'ora, ogni 6 ore, a partire da alle(ai) 2:00 AM')
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'day of month increments' do
|
377
|
+
expect(desc('0 30 8 2/7 * *')).to eq('Alle(ai) 8:30 AM, ogni 7 giorni, a partire da il giorno 2 del mese')
|
378
|
+
end
|
379
|
+
|
380
|
+
it 'day of week increments' do
|
381
|
+
expect(desc('0 30 11 * * 2/2')).to eq('Alle(ai) 11:30 AM, 2 giorni alla settimana, a partire da il martedì')
|
382
|
+
end
|
383
|
+
|
384
|
+
it 'month increments' do
|
385
|
+
expect(desc('0 20 10 * 2/3 THU')).to eq('Alle(ai) 10:20 AM, solo di giovedì, ogni 3 mesi, a partire da febbraio')
|
386
|
+
end
|
387
|
+
|
388
|
+
it 'year increments' do
|
389
|
+
expect(desc('0 0 0 1 MAR * 2010/5')).to eq('Alle(ai) 12:00 AM, il giorno 1 del mese, solo a(nel) marzo, ogni 5 anni, a partire da 2010')
|
390
|
+
end
|
391
|
+
end
|
392
|
+
end
|
393
|
+
end
|
@@ -5,7 +5,8 @@ module Cronex
|
|
5
5
|
describe ExpressionDescriptor do
|
6
6
|
|
7
7
|
def desc(expression, opts = {})
|
8
|
-
|
8
|
+
opts[:locale] = 'pt_BR'
|
9
|
+
Cronex::ExpressionDescriptor.new(expression, opts).description
|
9
10
|
end
|
10
11
|
|
11
12
|
let(:opts) { { zero_based_dow: false } }
|
@@ -238,8 +239,14 @@ module Cronex
|
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
241
|
-
|
242
|
-
|
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('A cada 5 minutos, no último dia do mês, em janeiro')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'between a day and last day of the month' do
|
248
|
+
expect(desc('*/5 * 23-L JAN *')).to eq('A cada 5 minutos, entre os dias 23 e último dia do mês, em janeiro')
|
249
|
+
end
|
243
250
|
end
|
244
251
|
|
245
252
|
it 'time of day with seconds' do
|
@@ -291,6 +298,10 @@ module Cronex
|
|
291
298
|
'A cada 2 minutos, entre 00 e 30 minutos após a hora, 5:00 PM, de segunda-feira a sexta-feira')
|
292
299
|
end
|
293
300
|
|
301
|
+
it 'every x days with interval' do
|
302
|
+
expect(desc('30 7 1-L/2 * *')).to eq('Às 7:30 AM, a cada 2 dias, entre os dias 1 e último dia do mês')
|
303
|
+
end
|
304
|
+
|
294
305
|
it 'one year only with seconds' do
|
295
306
|
expect(desc('* * * * * * 2013')).to eq('A cada segundo, em 2013')
|
296
307
|
end
|
@@ -5,7 +5,8 @@ module Cronex
|
|
5
5
|
describe ExpressionDescriptor do
|
6
6
|
|
7
7
|
def desc(expression, opts = {})
|
8
|
-
|
8
|
+
opts[:locale] = 'ro'
|
9
|
+
Cronex::ExpressionDescriptor.new(expression, opts).description
|
9
10
|
end
|
10
11
|
|
11
12
|
let(:opts) { { zero_based_dow: false } }
|
@@ -238,8 +239,14 @@ module Cronex
|
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
241
|
-
|
242
|
-
|
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('La fiecare 5 minute, în ultima zi a lunii, numai în ianuarie')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'between a day and last day of the month' do
|
248
|
+
expect(desc('*/5 * 23-L JAN *')).to eq('La fiecare 5 minute, între zilele 23 și ultima zi a lunii, numai în ianuarie')
|
249
|
+
end
|
243
250
|
end
|
244
251
|
|
245
252
|
it 'time of day with seconds' do
|
@@ -270,7 +277,7 @@ module Cronex
|
|
270
277
|
|
271
278
|
it 'between with interval' do
|
272
279
|
expect(desc('2-59/3 1,9,22 11-26 1-6 ?')).to eq(
|
273
|
-
'La fiecare 3 minute, între minutele 02 și 59, la 1:00 AM, 9:00 AM și 10:00 PM, între
|
280
|
+
'La fiecare 3 minute, între minutele 02 și 59, la 1:00 AM, 9:00 AM și 10:00 PM, între zilele 11 și 26 a lunii, din ianuarie până în iunie')
|
274
281
|
end
|
275
282
|
|
276
283
|
it 'recurring first of month' do
|
@@ -291,6 +298,10 @@ module Cronex
|
|
291
298
|
'La fiecare 2 minute, între minutele 00 și 30, la 5:00 PM, de luni până vineri')
|
292
299
|
end
|
293
300
|
|
301
|
+
it 'every x days with interval' do
|
302
|
+
expect(desc('30 7 1-L/2 * *')).to eq('La 7:30 AM, la fiecare 2 zile, între zilele 1 și ultima zi a lunii')
|
303
|
+
end
|
304
|
+
|
294
305
|
it 'one year only with seconds' do
|
295
306
|
expect(desc('* * * * * * 2013')).to eq('În fiecare secundă, numai în 2013')
|
296
307
|
end
|
@@ -5,7 +5,8 @@ module Cronex
|
|
5
5
|
describe ExpressionDescriptor do
|
6
6
|
|
7
7
|
def desc(expression, opts = {})
|
8
|
-
|
8
|
+
opts[:locale] = 'ru'
|
9
|
+
Cronex::ExpressionDescriptor.new(expression, opts).description
|
9
10
|
end
|
10
11
|
|
11
12
|
let(:opts) { { zero_based_dow: false } }
|
@@ -177,11 +178,11 @@ module Cronex
|
|
177
178
|
end
|
178
179
|
|
179
180
|
it 'day of month' do
|
180
|
-
expect(desc('23 12 15 * *')).to eq('В 12:23 PM, 15
|
181
|
+
expect(desc('23 12 15 * *')).to eq('В 12:23 PM, 15 день месяца')
|
181
182
|
end
|
182
183
|
|
183
184
|
it 'day of month with day of week' do
|
184
|
-
expect(desc('23 12 15 * SUN')).to eq('В 12:23 PM, 15
|
185
|
+
expect(desc('23 12 15 * SUN')).to eq('В 12:23 PM, 15 день месяца, только воскресенье')
|
185
186
|
end
|
186
187
|
|
187
188
|
it 'month name' do
|
@@ -238,8 +239,14 @@ module Cronex
|
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
241
|
-
|
242
|
-
|
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('Каждые 5 минут, в последний день месяца, только январь')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'between a day and last day of the month' do
|
248
|
+
expect(desc('*/5 * 23-L JAN *')).to eq('Каждые 5 минут, между 23 днем и последним днем месяца, только январь')
|
249
|
+
end
|
243
250
|
end
|
244
251
|
|
245
252
|
it 'time of day with seconds' do
|
@@ -252,7 +259,7 @@ module Cronex
|
|
252
259
|
|
253
260
|
it 'second minutes hours intervals' do
|
254
261
|
expect(desc('5-10 30-35 10-12 * * *')).to eq(
|
255
|
-
'Секунды с 5 по 10, минуты с 30 по 35,
|
262
|
+
'Секунды с 5 по 10, минуты с 30 по 35, между 10:00 AM и 12:59 PM')
|
256
263
|
end
|
257
264
|
|
258
265
|
it 'every 5 minutes at 30 seconds' do
|
@@ -261,7 +268,7 @@ module Cronex
|
|
261
268
|
|
262
269
|
it 'minutes past the hour range' do
|
263
270
|
expect(desc('0 30 10-13 ? * WED,FRI')).to eq(
|
264
|
-
'В 30 минут часа,
|
271
|
+
'В 30 минут часа, между 10:00 AM и 1:59 PM, только среда и пятница')
|
265
272
|
end
|
266
273
|
|
267
274
|
it 'seconds past the minute interval' do
|
@@ -270,7 +277,7 @@ module Cronex
|
|
270
277
|
|
271
278
|
it 'between with interval' do
|
272
279
|
expect(desc('2-59/3 1,9,22 11-26 1-6 ?')).to eq(
|
273
|
-
'Каждые 3 минут, минуты с 02 по 59, в 1:00 AM, 9:00 AM и 10:00 PM,
|
280
|
+
'Каждые 3 минут, минуты с 02 по 59, в 1:00 AM, 9:00 AM и 10:00 PM, между 11 днем и 26 днем месяца, январь - июнь')
|
274
281
|
end
|
275
282
|
|
276
283
|
it 'recurring first of month' do
|
@@ -291,6 +298,10 @@ module Cronex
|
|
291
298
|
'Каждые 2 минут, минуты с 00 по 30, в 5:00 PM, понедельник - пятница')
|
292
299
|
end
|
293
300
|
|
301
|
+
it 'every x days with interval' do
|
302
|
+
expect(desc('30 7 1-L/2 * *')).to eq('В 7:30 AM, каждые 2 дня(ей), между 1 днем и последним днем месяца')
|
303
|
+
end
|
304
|
+
|
294
305
|
it 'one year only with seconds' do
|
295
306
|
expect(desc('* * * * * * 2013')).to eq('Каждую секунду, только 2013')
|
296
307
|
end
|
@@ -327,11 +338,11 @@ module Cronex
|
|
327
338
|
end
|
328
339
|
|
329
340
|
it 'minutes past the hour 5,10 day 2' do
|
330
|
-
expect(desc('5,10 0 2 * *')).to eq('В 05 и 10 минут часа, 2
|
341
|
+
expect(desc('5,10 0 2 * *')).to eq('В 05 и 10 минут часа, 2 день месяца')
|
331
342
|
end
|
332
343
|
|
333
344
|
it 'minutes past the hour 5/10 day 2' do
|
334
|
-
expect(desc('5/10 0 2 * *')).to eq('Каждые 10 минут, начало в 05 минут часа, 2
|
345
|
+
expect(desc('5/10 0 2 * *')).to eq('Каждые 10 минут, начало в 05 минут часа, 2 день месяца')
|
335
346
|
end
|
336
347
|
end
|
337
348
|
|
@@ -345,7 +356,7 @@ module Cronex
|
|
345
356
|
end
|
346
357
|
|
347
358
|
it 'seconds past the minute 5,6 day 2' do
|
348
|
-
expect(desc('5,6 0 0 2 * *')).to eq('В 5 и 6 секунд, 2
|
359
|
+
expect(desc('5,6 0 0 2 * *')).to eq('В 5 и 6 секунд, 2 день месяца')
|
349
360
|
end
|
350
361
|
end
|
351
362
|
|
@@ -363,7 +374,7 @@ module Cronex
|
|
363
374
|
end
|
364
375
|
|
365
376
|
it 'day of month increments' do
|
366
|
-
expect(desc('0 30 8 2/7 * *')).to eq('В 8:30 AM, каждые 7 дня(ей), начало 2
|
377
|
+
expect(desc('0 30 8 2/7 * *')).to eq('В 8:30 AM, каждые 7 дня(ей), начало 2 день месяца')
|
367
378
|
end
|
368
379
|
|
369
380
|
it 'day of week increments' do
|
@@ -375,7 +386,7 @@ module Cronex
|
|
375
386
|
end
|
376
387
|
|
377
388
|
it 'year increments' do
|
378
|
-
expect(desc('0 0 0 1 MAR * 2010/5')).to eq('В 12:00 AM, 1
|
389
|
+
expect(desc('0 0 0 1 MAR * 2010/5')).to eq('В 12:00 AM, 1 день месяца, только март, каждые 5 лет, начало в 2010')
|
379
390
|
end
|
380
391
|
end
|
381
392
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cronex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Kazaku
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tzinfo
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: unicode
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 12.3.3
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 12.3.3
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- resources/resources_de.yml
|
117
117
|
- resources/resources_en.yml
|
118
118
|
- resources/resources_fr.yml
|
119
|
+
- resources/resources_it.yml
|
119
120
|
- resources/resources_pt_BR.yml
|
120
121
|
- resources/resources_ro.yml
|
121
122
|
- resources/resources_ru.yml
|
@@ -123,6 +124,7 @@ files:
|
|
123
124
|
- spec/exp_descriptor_de_spec.rb
|
124
125
|
- spec/exp_descriptor_en_spec.rb
|
125
126
|
- spec/exp_descriptor_fr_spec.rb
|
127
|
+
- spec/exp_descriptor_it_spec.rb
|
126
128
|
- spec/exp_descriptor_pt_BR_spec.rb
|
127
129
|
- spec/exp_descriptor_ro_spec.rb
|
128
130
|
- spec/exp_descriptor_ru_spec.rb
|
@@ -131,7 +133,7 @@ homepage: https://github.com/alpinweis/cronex
|
|
131
133
|
licenses:
|
132
134
|
- Apache-2.0
|
133
135
|
metadata: {}
|
134
|
-
post_install_message:
|
136
|
+
post_install_message:
|
135
137
|
rdoc_options: []
|
136
138
|
require_paths:
|
137
139
|
- lib
|
@@ -146,9 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
148
|
- !ruby/object:Gem::Version
|
147
149
|
version: '0'
|
148
150
|
requirements: []
|
149
|
-
|
150
|
-
|
151
|
-
signing_key:
|
151
|
+
rubygems_version: 3.0.8
|
152
|
+
signing_key:
|
152
153
|
specification_version: 4
|
153
154
|
summary: Ruby library that converts cron expressions into human readable strings
|
154
155
|
test_files:
|
@@ -156,6 +157,7 @@ test_files:
|
|
156
157
|
- spec/exp_descriptor_de_spec.rb
|
157
158
|
- spec/exp_descriptor_en_spec.rb
|
158
159
|
- spec/exp_descriptor_fr_spec.rb
|
160
|
+
- spec/exp_descriptor_it_spec.rb
|
159
161
|
- spec/exp_descriptor_pt_BR_spec.rb
|
160
162
|
- spec/exp_descriptor_ro_spec.rb
|
161
163
|
- spec/exp_descriptor_ru_spec.rb
|