cron_config_parser 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +15 -7
- data/lib/cron_config_parser/version.rb +1 -1
- data/lib/cron_config_parser.rb +57 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dbc1edeff71f699025ba9d6821319ccf0fb7070b6162d08359f6f80996672dca
|
4
|
+
data.tar.gz: 86ddd6f709afa0a42a935ad1ac2fe7aa46643ee75b0c47adb1fe3b7f394d73e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c047af12dbc736dec3ea0df5df321da98eef3d3ce77c48072a779193fa6354c61abd47b04580417773ae2a892ed46893d0b2d120224674af606cc7acc3ae02c1
|
7
|
+
data.tar.gz: fa4b863a04e751653d8237e407d789645203ca441219baf32632d64b416936db3e5beadb5075c2a6ab09fda296af8b9d6564bc421f7a8526960c07a350984330
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -19,10 +19,10 @@ Or install it yourself as:
|
|
19
19
|
|
20
20
|
## Usage
|
21
21
|
|
22
|
-
You can parse the cron configuration for readability with `CronConfigParser
|
22
|
+
You can parse the cron configuration for readability with `CronConfigParser.call`.
|
23
23
|
|
24
24
|
``` ruby
|
25
|
-
CronConfigParser
|
25
|
+
CronConfigParser.call('00 5 * * * Asia/Tokyo')
|
26
26
|
=> #<CronConfigParser::CronConfig:0x00007fa4f492e820
|
27
27
|
@days=["*"],
|
28
28
|
@hours=["5"],
|
@@ -36,7 +36,7 @@ enable check configured properties.
|
|
36
36
|
|
37
37
|
``` ruby
|
38
38
|
# return false if configured nil or '*'
|
39
|
-
config = CronConfigParser
|
39
|
+
config = CronConfigParser.call('00 5 * * * Asia/Tokyo')
|
40
40
|
config.minutes_configured?
|
41
41
|
=> true
|
42
42
|
config.days_configured?
|
@@ -46,9 +46,17 @@ config.days_configured?
|
|
46
46
|
enable check next execute time.
|
47
47
|
|
48
48
|
``` ruby
|
49
|
-
config = CronConfigParser
|
49
|
+
config = CronConfigParser.call('00 5 * * * Asia/Tokyo')
|
50
50
|
config.next_execute_at
|
51
51
|
=> 2019-05-23 05:00:00 +0900
|
52
|
+
config.execute_schedule(execute_conut: 5, annotation: 'DailyJob')
|
53
|
+
=>
|
54
|
+
[{:annotation=>"DailyJob", :execute_at=>2019-05-23 05:00:00 +0900},
|
55
|
+
{:annotation=>"DailyJob", :execute_at=>2019-05-24 05:00:00 +0900},
|
56
|
+
{:annotation=>"DailyJob", :execute_at=>2019-05-25 05:00:00 +0900},
|
57
|
+
{:annotation=>"DailyJob", :execute_at=>2019-05-26 05:00:00 +0900},
|
58
|
+
{:annotation=>"DailyJob", :execute_at=>2019-05-27 05:00:00 +0900}]
|
59
|
+
=>
|
52
60
|
```
|
53
61
|
|
54
62
|
This gem check simple validation when CronConfigParser::CronConfig object initialize.
|
@@ -56,15 +64,15 @@ If the config is invalid, Config::SyntaxError or Config::RequiredError is raised
|
|
56
64
|
|
57
65
|
``` ruby
|
58
66
|
# not configured require property.
|
59
|
-
CronConfigParser
|
67
|
+
CronConfigParser.call('00 5,13 * * ')
|
60
68
|
=> CronConfigParser::ConfigRequiredError
|
61
69
|
|
62
70
|
# configured invalid property.
|
63
|
-
CronConfigParser
|
71
|
+
CronConfigParser.call('00 5,a * * * Asia/Tokyo')
|
64
72
|
=> CronConfigParser::ConfigSyntaxError
|
65
73
|
|
66
74
|
# this check is Invalidationable.
|
67
|
-
CronConfigParser
|
75
|
+
CronConfigParser.call('00 5,a * * * Asia/Tokyo', validation: false)
|
68
76
|
=> #<CronConfigParser::CronConfig:0x00007fcedf09cdf0
|
69
77
|
@days=["*"],
|
70
78
|
@hours=["5", "a"],
|
data/lib/cron_config_parser.rb
CHANGED
@@ -2,6 +2,12 @@ require "cron_config_parser/version"
|
|
2
2
|
require 'active_support/all'
|
3
3
|
|
4
4
|
module CronConfigParser
|
5
|
+
def self.call(cron_config, validation: true)
|
6
|
+
Parser.call(cron_config, validation: true)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
5
11
|
class Parser
|
6
12
|
def self.call(cron_config, validation: true)
|
7
13
|
new(cron_config, validation: validation).call
|
@@ -33,6 +39,17 @@ module CronConfigParser
|
|
33
39
|
attr_accessor :minutes, :hours, :days, :months, :wdays, :timezone
|
34
40
|
|
35
41
|
def next_execute_at(basis_datetime: Time.current)
|
42
|
+
calc_next_execute_at(basis_datetime)
|
43
|
+
end
|
44
|
+
|
45
|
+
def execute_schedule(basis_datetime: Time.current, execute_count: 1, annotation: '')
|
46
|
+
(1..execute_count).map do
|
47
|
+
basis_datetime = calc_next_execute_at(basis_datetime)
|
48
|
+
{ annotation: annotation, execute_at: basis_datetime }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def calc_next_execute_at(basis_datetime)
|
36
53
|
ExecuteAtCalculator.new(cron_config: self, basis_datetime: basis_datetime).call
|
37
54
|
end
|
38
55
|
|
@@ -107,7 +124,7 @@ module CronConfigParser
|
|
107
124
|
WDAYS = %i[sunday monday tuesday wednesday thursday friday saturday].freeze
|
108
125
|
|
109
126
|
def initialize(cron_config:, basis_datetime:)
|
110
|
-
@cron_config = cron_config
|
127
|
+
@cron_config = cron_config.dup
|
111
128
|
@basis_datetime = basis_datetime
|
112
129
|
@execute_at = basis_datetime
|
113
130
|
prepare_cron_config
|
@@ -164,35 +181,62 @@ module CronConfigParser
|
|
164
181
|
|
165
182
|
def next_hour
|
166
183
|
return unless cron_config.hours_configured?
|
184
|
+
# reset hour if configured cron hour
|
185
|
+
@execute_at = @execute_at.change(hour: basis_datetime.hour) if @execute_at.hour >= basis_datetime.hour
|
167
186
|
next_hour = cron_config.hours.select { |config_hour| config_hour > execute_at.hour }.first
|
168
|
-
|
169
|
-
#
|
170
|
-
|
187
|
+
check_hash = { hour: next_hour.presence || cron_config.hours[0], min: execute_at.min }
|
188
|
+
# Do not change the time if it is a future time or other than the specified value
|
189
|
+
if cron_config.hours.exclude?(execute_at.hour) || changed_basis_datetime_future?(check_hash)
|
190
|
+
@execute_at = change_to_property_and_move_up(property: next_hour, property_sym: :hours)
|
191
|
+
# reset minute when execute in freture and not configured minute
|
192
|
+
@execute_at = @execute_at.change(min: 0) unless cron_config.minutes_configured?
|
193
|
+
end
|
171
194
|
end
|
172
195
|
|
173
196
|
def next_day
|
174
197
|
return unless cron_config.days_configured?
|
175
|
-
|
176
|
-
@execute_at =
|
177
|
-
|
178
|
-
|
198
|
+
# reset hour if configured cron hour
|
199
|
+
@execute_at = @execute_at.change(hour: basis_datetime.hour) if @execute_at.hour >= basis_datetime.hour
|
200
|
+
next_day = cron_config.days.select { |config_day| config_day >= execute_at.day }.first
|
201
|
+
check_hash = { day: next_day.presence || cron_config.days[0], hour: execute_at.hour, min: execute_at.min }
|
202
|
+
# Do not change the time if it is a future time or other than the specified value
|
203
|
+
if cron_config.days.exclude?(execute_at.day) || changed_basis_datetime_future?(check_hash)
|
204
|
+
@execute_at = change_to_property_and_move_up(property: next_day, property_sym: :days)
|
205
|
+
# reset minute when execute in freture and not configured minute, hour
|
206
|
+
@execute_at = @execute_at.change(min: 0) unless cron_config.minutes_configured?
|
207
|
+
@execute_at = @execute_at.change(hour: 0) unless cron_config.minutes_configured?
|
208
|
+
end
|
179
209
|
end
|
180
210
|
|
181
211
|
def next_wday
|
182
212
|
return unless cron_config.wdays_configured?
|
213
|
+
@execute_at = @execute_at.change(hour: basis_datetime.hour) if @execute_at.hour >= basis_datetime.hour
|
183
214
|
next_wday = cron_config.wdays.select { |config_wday| config_wday > execute_at.wday }.first
|
184
215
|
next_wday_sym = next_wday ? WDAYS[next_wday] : WDAYS[cron_config.wdays.first]
|
185
216
|
@execute_at = execute_at.next_occurring(next_wday_sym)
|
186
|
-
# reset minute when execute in freture and not configured minute
|
217
|
+
# reset minute when execute in freture and not configured minute, hour
|
187
218
|
@execute_at = @execute_at.change(min: 0) unless cron_config.minutes_configured?
|
219
|
+
@execute_at = @execute_at.change(hour: 0) unless cron_config.minutes_configured?
|
188
220
|
end
|
189
221
|
|
190
222
|
def next_month
|
191
223
|
return unless cron_config.months_configured?
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
224
|
+
@execute_at = @execute_at.change(hour: basis_datetime.hour) if @execute_at.hour >= basis_datetime.hour
|
225
|
+
next_month = cron_config.months.select { |config_month| config_month >= execute_at.month }.first
|
226
|
+
check_next_month = next_month.presence || cron_config.months[0]
|
227
|
+
check_hash = { month: check_next_month, day: execute_at.day, hour: execute_at.hour, min: execute_at.min }
|
228
|
+
# Do not change the time if it is a future time or other than the specified value
|
229
|
+
if cron_config.months.exclude?(execute_at.month) || changed_basis_datetime_future?(check_hash)
|
230
|
+
@execute_at = change_to_property_and_move_up(property: next_month, property_sym: :months)
|
231
|
+
# reset minute when execute in freture and not configured minute, hour, day
|
232
|
+
@execute_at = @execute_at.change(min: 0) unless cron_config.minutes_configured?
|
233
|
+
@execute_at = @execute_at.change(hour: 0) unless cron_config.hours_configured?
|
234
|
+
@execute_at = @execute_at.change(day: 1) unless cron_config.days_configured?
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
def changed_basis_datetime_future?(check_hash)
|
239
|
+
execute_at <= basis_datetime.change(check_hash)
|
196
240
|
end
|
197
241
|
|
198
242
|
def change_to_property_and_move_up(property:, property_sym:)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cron_config_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Madogiwa
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|