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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1ab473d3578046b33ddd723eaca36609b34118dd
4
- data.tar.gz: 7246cc710d1ca21a5204bb5011531f56a88b1599
2
+ SHA256:
3
+ metadata.gz: ba036396e2d9547853a5b7ea2fd71e951a7553c4939771493b5fe66b14f6850d
4
+ data.tar.gz: 0106175d262f6897fc826fd4b4a9b67126ae854e31417d8071ab06b412bb92bf
5
5
  SHA512:
6
- metadata.gz: 6f2f55fec081a1eb1631e597c0156a7f703e56834bf83c1e82b4ada16b2def0b90117f27824066efb4e49e1a98b2a7a423fd3cf9214a47281238df1c2ab0ade8
7
- data.tar.gz: 9c0bcdf5a8814ffc8ad7d81d3cb3e939fe2bb94e63f4f7a0284a08a6ef6791f5378a0a2c8e566cefa9d220505985d1433b16dd4852a07b595c3177664771bb00
6
+ metadata.gz: 53f41387e3df259309bf46ab5fccbb7e12484007cd95692545e2c725f9081d404699284e7691184a32674fcb7474ca8b0362bbebea8f8cfd7332cc60863e1c0a
7
+ data.tar.gz: 7f97a2b9c76f68538e72681165c958788ccb3f70b938b7eea06c0a58181301a88205d3092ec20ff78b481f4c10b84722724bbc4b5bf8dc1e294466d4bf2bf9f4
@@ -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
- EmptyLinesAroundBody:
21
+ Layout/EmptyLinesAroundBlockBody:
22
22
  Enabled: false
23
23
 
24
- ClassLength:
24
+ Layout/EmptyLinesAroundClassBody:
25
25
  Enabled: false
26
26
 
27
- LineLength:
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
@@ -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', {}, 'fr').description
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 * * *', {}, 'en', 'America/Los_Angeles').description
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
 
@@ -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', '~> 1.2.5'
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', '~> 10.1'
26
+ spec.add_development_dependency 'rake', '>= 12.3.3'
27
27
  spec.add_development_dependency 'rspec', '~> 3.1'
28
28
  end
@@ -1,7 +1,7 @@
1
1
  module Cronex
2
2
  class DayOfMonthDescription < Description
3
3
  def single_item_description(expression)
4
- expression
4
+ expression == 'L' ? resources.get('last_day') : expression
5
5
  end
6
6
 
7
7
  def interval_description_format(expression)
@@ -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 = {}, locale = nil, timezone = 'UTC')
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
@@ -1,3 +1,3 @@
1
1
  module Cronex
2
- VERSION = '0.8.0'
2
+ VERSION = '0.11.0'
3
3
  end
@@ -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
@@ -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'
@@ -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'
@@ -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 a %s-a și a %s-a zi a lunii'
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
@@ -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: 'с %s по %s число месяца'
12
+ between_days_of_the_month: 'между %s днем и %s днем месяца'
13
13
  seconds_through_past_the_minute: 'секунды с %s по %s'
14
- between_x_and_y: 'с %s по %s'
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