cron-spec 0.1.0 → 0.1.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.
@@ -35,6 +35,11 @@
35
35
  <orderEntry type="library" scope="PROVIDED" name="[gem] rcov (v0.9.8, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rcov-0.9.8)" level="application" />
36
36
  <orderEntry type="library" scope="PROVIDED" name="[gem] git (v1.2.5, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/git-1.2.5)" level="application" />
37
37
  <orderEntry type="library" scope="PROVIDED" name="[gem] rake (v0.8.7, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rake-0.8.7)" level="application" />
38
+ <orderEntry type="library" scope="PROVIDED" name="[gem] rspec (v2.1.0, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rspec-2.1.0)" level="application" />
39
+ <orderEntry type="library" scope="PROVIDED" name="[gem] rspec-core (v2.1.0, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rspec-core-2.1.0)" level="application" />
40
+ <orderEntry type="library" scope="PROVIDED" name="[gem] diff-lcs (v1.1.2, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/diff-lcs-1.1.2)" level="application" />
41
+ <orderEntry type="library" scope="PROVIDED" name="[gem] rspec-mocks (v2.1.0, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rspec-mocks-2.1.0)" level="application" />
42
+ <orderEntry type="library" scope="PROVIDED" name="[gem] rspec-expectations (v2.1.0, /Users/dave/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rspec-expectations-2.1.0)" level="application" />
38
43
  </component>
39
44
  </module>
40
45
 
@@ -1,7 +1,9 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <project version="4">
3
3
  <component name="ChangeListManager">
4
- <list default="true" id="5a15dc32-6ade-4091-9f48-a1ce07241214" name="Default" comment="" />
4
+ <list default="true" id="5a15dc32-6ade-4091-9f48-a1ce07241214" name="Default" comment="">
5
+ <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
6
+ </list>
5
7
  <ignored path="cron-spec.iws" />
6
8
  <ignored path=".idea/workspace.xml" />
7
9
  <option name="TRACKING_ENABLED" value="true" />
@@ -27,7 +29,7 @@
27
29
  <file leaf-file-name="Rakefile" pinned="false" current="false" current-in-tab="false">
28
30
  <entry file="file://$PROJECT_DIR$/Rakefile">
29
31
  <provider selected="true" editor-type-id="text-editor">
30
- <state line="26" column="55" selection-start="1012" selection-end="1012" vertical-scroll-proportion="-14.444445">
32
+ <state line="26" column="55" selection-start="1012" selection-end="1012" vertical-scroll-proportion="0.0">
31
33
  <folding />
32
34
  </state>
33
35
  </provider>
@@ -36,7 +38,7 @@
36
38
  <file leaf-file-name="single_value_cron_value_spec.rb" pinned="false" current="false" current-in-tab="false">
37
39
  <entry file="file://$PROJECT_DIR$/spec/single_value_cron_value_spec.rb">
38
40
  <provider selected="true" editor-type-id="text-editor">
39
- <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="-0.5555556">
41
+ <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.0">
40
42
  <folding />
41
43
  </state>
42
44
  </provider>
@@ -45,7 +47,7 @@
45
47
  <file leaf-file-name="cron_specification_spec.rb" pinned="false" current="true" current-in-tab="true">
46
48
  <entry file="file://$PROJECT_DIR$/spec/cron_specification_spec.rb">
47
49
  <provider selected="true" editor-type-id="text-editor">
48
- <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.028571429">
50
+ <state line="10" column="12" selection-start="336" selection-end="336" vertical-scroll-proportion="0.27173913">
49
51
  <folding />
50
52
  </state>
51
53
  </provider>
@@ -169,6 +171,7 @@
169
171
  </component>
170
172
  <component name="TaskManager">
171
173
  <task active="true" id="Default" summary="Default task">
174
+ <changelist id="5a15dc32-6ade-4091-9f48-a1ce07241214" name="Default" comment="" />
172
175
  <created>1298829562652</created>
173
176
  <updated>1298829562652</updated>
174
177
  </task>
@@ -178,22 +181,22 @@
178
181
  <frame x="142" y="22" width="1538" height="959" extended-state="0" />
179
182
  <editor active="false" />
180
183
  <layout>
181
- <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
182
- <window_info id="Changes" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3298731" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
184
+ <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3298731" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
183
185
  <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
184
186
  <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
185
- <window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
186
- <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24966975" sideWeight="0.67012686" order="0" side_tool="false" content_ui="tabs" />
187
+ <window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
188
+ <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24966975" sideWeight="0.67012686" order="0" side_tool="false" content_ui="tabs" />
187
189
  <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
188
190
  <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
189
- <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
191
+ <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
190
192
  <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
191
193
  <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
192
- <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
193
194
  <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
195
+ <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
196
+ <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
194
197
  <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
195
- <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
196
198
  <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
199
+ <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
197
200
  </layout>
198
201
  </component>
199
202
  <component name="VcsManagerConfiguration">
@@ -232,112 +235,86 @@
232
235
  <component name="editorHistoryManager">
233
236
  <entry file="file://$PROJECT_DIR$/lib/cron-spec/minute_factory.rb">
234
237
  <provider selected="true" editor-type-id="text-editor">
235
- <state line="2" column="28" selection-start="45" selection-end="45" vertical-scroll-proportion="0.037926674">
236
- <folding />
237
- </state>
238
+ <state line="2" column="28" selection-start="45" selection-end="45" vertical-scroll-proportion="0.037926674" />
238
239
  </provider>
239
240
  </entry>
240
241
  <entry file="file://$PROJECT_DIR$/lib/cron-spec/hour_factory.rb">
241
242
  <provider selected="true" editor-type-id="text-editor">
242
- <state line="2" column="26" selection-start="43" selection-end="43" vertical-scroll-proportion="0.037926674">
243
- <folding />
244
- </state>
243
+ <state line="2" column="26" selection-start="43" selection-end="43" vertical-scroll-proportion="0.037926674" />
245
244
  </provider>
246
245
  </entry>
247
246
  <entry file="file://$PROJECT_DIR$/lib/cron-spec/dow_factory.rb">
248
247
  <provider selected="true" editor-type-id="text-editor">
249
- <state line="1" column="25" selection-start="41" selection-end="41" vertical-scroll-proportion="0.018963337">
250
- <folding />
251
- </state>
248
+ <state line="1" column="25" selection-start="41" selection-end="41" vertical-scroll-proportion="0.018963337" />
252
249
  </provider>
253
250
  </entry>
254
251
  <entry file="file://$PROJECT_DIR$/lib/cron-spec/day_factory.rb">
255
252
  <provider selected="true" editor-type-id="text-editor">
256
- <state line="1" column="25" selection-start="41" selection-end="41" vertical-scroll-proportion="0.018963337">
257
- <folding />
258
- </state>
253
+ <state line="1" column="25" selection-start="41" selection-end="41" vertical-scroll-proportion="0.018963337" />
259
254
  </provider>
260
255
  </entry>
261
256
  <entry file="file://$PROJECT_DIR$/spec/wildcard_cron_value_spec.rb">
262
257
  <provider selected="true" editor-type-id="text-editor">
263
- <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.018495684">
264
- <folding />
265
- </state>
258
+ <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.018495684" />
266
259
  </provider>
267
260
  </entry>
268
261
  <entry file="file://$PROJECT_DIR$/spec/step_cron_value_spec.rb">
269
262
  <provider selected="true" editor-type-id="text-editor">
270
- <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.018495684">
271
- <folding />
272
- </state>
263
+ <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.018495684" />
273
264
  </provider>
274
265
  </entry>
275
266
  <entry file="file://$PROJECT_DIR$/spec/range_cron_value_spec.rb">
276
267
  <provider selected="true" editor-type-id="text-editor">
277
- <state line="0" column="6" selection-start="6" selection-end="6" vertical-scroll-proportion="-0.0">
278
- <folding />
279
- </state>
268
+ <state line="0" column="6" selection-start="6" selection-end="6" vertical-scroll-proportion="-0.0" />
280
269
  </provider>
281
270
  </entry>
282
271
  <entry file="file://$PROJECT_DIR$/VERSION">
283
272
  <provider selected="true" editor-type-id="text-editor">
284
- <state line="0" column="19" selection-start="5" selection-end="5" vertical-scroll-proportion="0.0">
285
- <folding />
286
- </state>
273
+ <state line="0" column="19" selection-start="5" selection-end="5" vertical-scroll-proportion="0.0" />
287
274
  </provider>
288
275
  </entry>
289
276
  <entry file="file://$PROJECT_DIR$/.document">
290
277
  <provider selected="true" editor-type-id="text-editor">
291
- <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
292
- <folding />
293
- </state>
278
+ <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
294
279
  </provider>
295
280
  </entry>
296
281
  <entry file="file://$PROJECT_DIR$/README.rdoc">
297
282
  <provider selected="true" editor-type-id="text-editor">
298
- <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
299
- <folding />
300
- </state>
283
+ <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
301
284
  </provider>
302
285
  </entry>
303
286
  <entry file="file://$PROJECT_DIR$/.rspec">
304
287
  <provider selected="true" editor-type-id="text-editor">
305
- <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
306
- <folding />
307
- </state>
288
+ <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
308
289
  </provider>
309
290
  </entry>
310
291
  <entry file="file://$PROJECT_DIR$/Gemfile">
311
292
  <provider selected="true" editor-type-id="text-editor">
312
- <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
313
- <folding />
314
- </state>
293
+ <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
315
294
  </provider>
316
295
  </entry>
317
296
  <entry file="file://$PROJECT_DIR$/LICENSE.txt">
318
297
  <provider selected="true" editor-type-id="text-editor">
319
- <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
320
- <folding />
321
- </state>
298
+ <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
322
299
  </provider>
323
300
  </entry>
324
301
  <entry file="file://$PROJECT_DIR$/Rakefile">
325
302
  <provider selected="true" editor-type-id="text-editor">
326
- <state line="26" column="55" selection-start="1012" selection-end="1012" vertical-scroll-proportion="-14.444445">
303
+ <state line="26" column="55" selection-start="1012" selection-end="1012" vertical-scroll-proportion="0.0">
327
304
  <folding />
328
305
  </state>
329
306
  </provider>
330
307
  </entry>
331
308
  <entry file="file://$PROJECT_DIR$/spec/single_value_cron_value_spec.rb">
332
309
  <provider selected="true" editor-type-id="text-editor">
333
- <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="-0.5555556">
310
+ <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.0">
334
311
  <folding />
335
312
  </state>
336
313
  </provider>
337
314
  </entry>
338
315
  <entry file="file://$PROJECT_DIR$/spec/cron_specification_spec.rb">
339
316
  <provider selected="true" editor-type-id="text-editor">
340
- <state line="1" column="0" selection-start="22" selection-end="22" vertical-scroll-proportion="0.028571429">
317
+ <state line="10" column="12" selection-start="336" selection-end="336" vertical-scroll-proportion="0.27173913">
341
318
  <folding />
342
319
  </state>
343
320
  </provider>
@@ -1,6 +1,59 @@
1
- = cron-spec
1
+ = cron-spec - Exposing the cron syntax as a time filter
2
2
 
3
- Description goes here.
3
+ cron-spec provides the Ruby developer with a way to leverage the cron
4
+ syntax to add flexible time filtering for his/her code.
5
+
6
+ Most cron-aware people see the cron syntax as a way to fire off an activity
7
+ at a specific time/day/month, etc. There are a variety of tools out there
8
+ that handle this sort of activity. cron-spec tries to address a different
9
+ subset of problems. In particular, cron-spec allows the developer to ask if
10
+ a particular date/time is effective with respect to a cron specification.
11
+
12
+ For example, a web application might want to display a message to the end-user
13
+ each Friday between the hours of 8AM and 5PM indicating that there will be
14
+ a maintenance that night. The developer could simply define a cron
15
+ specification like '* 8-17 * * fri', then for each end-user request, check
16
+ the current time against this specification to determine whether or not
17
+ to display the message. This specification is much more succinct than other - more explicit - types of filter specifications.
18
+
19
+ == Installing
20
+
21
+ Since cron-spec is a gem, installing is relatively straightforward:
22
+
23
+ gem install cron-spec
24
+
25
+ == Usage
26
+
27
+ To use a cron specification as a time filter simply construct a new
28
+ specification, then ask if it is in effect.
29
+
30
+ cs = CronSpec::CronSpecification.new("* 8-17 * * fri")
31
+ cs.is_specification_in_effect?(Time.now) # => true/false
32
+
33
+ cron-spec handles most - if not all - the standard cron syntax illustrated
34
+ below:
35
+
36
+ There are several special predefined values which can be used to substitute the CRON expression.
37
+ Entry Description Equivalent To
38
+ @yearly (or @annually) Run once a year 0 0 1 1 *
39
+ @monthly Run once a month 0 0 1 * *
40
+ @weekly Run once a week 0 0 * * 0
41
+ @daily (or @midnight) Run once a day 0 0 * * *
42
+ @hourly Run once an hour 0 * * * *
43
+
44
+ * * * * *
45
+ - - - - -
46
+ | | | | |
47
+ | | | | +----- day of week (0 - 6) (Sunday=0)
48
+ | | | +---------- month (1 - 12)
49
+ | | +--------------- day of month (1 - 31)
50
+ | +-------------------- hour (0 - 23)
51
+ +------------------------- min (0 - 59)
52
+
53
+ The following named entries can be used:
54
+
55
+ * Day of week - sun, mon, tue, wed, thu, fri, sat
56
+ * Month - jan feb mar apr may jun jul aug sep oct nov dec
4
57
 
5
58
  == Contributing to cron-spec
6
59
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cron-spec}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Dave Sieh"]
12
- s.date = %q{2011-02-27}
12
+ s.date = %q{2011-02-28}
13
13
  s.description = %q{Cron specification implementation}
14
14
  s.email = %q{dave.sieh@nursinghomequality.com}
15
15
  s.extra_rdoc_files = [
@@ -1,4 +1,10 @@
1
1
  module CronSpec
2
+
3
+ ##
4
+ # Encapsulates the interpretation of a cron specification and
5
+ # provides a method which determines if the specified time is effective
6
+ # with respect to the specification.
7
+ #
2
8
  class CronSpecification
3
9
 
4
10
  TimeMethods = [ :min, :hour, :day, :month, :wday ]
@@ -31,6 +37,35 @@ module CronSpec
31
37
 
32
38
  attr_reader :raw_specification
33
39
 
40
+ ##
41
+ # Constructs a new CronSpecification with a textual cron specificiation.
42
+ #
43
+ # A broad cron syntax is supported:
44
+ #
45
+ # * * * * *
46
+ # - - - - -
47
+ # | | | | |
48
+ # | | | | +----- day of week (0 - 6) (Sunday=0)
49
+ # | | | +---------- month (1 - 12)
50
+ # | | +--------------- day of month (1 - 31)
51
+ # | +-------------------- hour (0 - 23)
52
+ # +------------------------- min (0 - 59)
53
+ #
54
+ # The following named entries can be used:
55
+ #
56
+ # * Day of week - sun, mon, tue, wed, thu, fri, sat
57
+ # * Month - jan feb mar apr may jun jul aug sep oct nov dec
58
+ #
59
+ # The following constructs are supported:
60
+ #
61
+ # * Ranges are supported (e.g. 2-10 or mon-fri)
62
+ # * Multiple values are supported (e.g. 2,3,8 or mon,wed,fri)
63
+ # * Wildcards are supported (e.g. *)
64
+ # * Step values are supported (e.g. */4)
65
+ # * Combinations of all but wildcard are supported (e.g. 2,*/3,8-10)
66
+ #
67
+ # A single space is required between each group.
68
+ #
34
69
  def initialize(raw_specification)
35
70
  raise "Must specify a cron specification" if raw_specification.nil?
36
71
 
@@ -47,7 +82,11 @@ module CronSpec
47
82
  @cron_values << parse_specification(specification[DOW], DowFactory.new)
48
83
  end
49
84
 
50
- def is_specification_in_effect?(time=Time.now.in_time_zone(DISPLAY_TIME_ZONE))
85
+ ##
86
+ # Return true if the specified time falls within the definition of the
87
+ # CronSpecification. The parameter defaults to the current time.
88
+ #
89
+ def is_specification_in_effect?(time=Time.now)
51
90
  idx = 0
52
91
  test_results = @cron_values.collect do | cvalues |
53
92
  time_value = time.send(TimeMethods[idx])
@@ -1,5 +1,8 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # Base class for the definition of CronSpecificationFactory classes.
5
+ #
3
6
  class CronSpecificationFactory
4
7
 
5
8
  WildcardPattern = /\A\*\z/
@@ -7,12 +10,24 @@ module CronSpec
7
10
  RangePattern = /\A(\d+)-(\d+)\z/
8
11
  StepPattern = /\A\*\/(\d+)\z/
9
12
 
13
+ ##
14
+ # Constructs a new CronSpecificationFactory
15
+ #
10
16
  def initialize
11
17
  @single_value_pattern = SingleValuePattern
12
18
  @range_pattern = RangePattern
13
19
  @step_pattern = StepPattern
14
20
  end
15
21
 
22
+ ##
23
+ # Parses a unit of a cron specification.
24
+ # The supported patterns for parsing are one of:
25
+ #
26
+ # * Wildcard '*'
27
+ # * Single Scalar Value [0-9]+|(sun|mon|tue|wed|thu|fri|sat)|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)
28
+ # * Range value (0-9, mon-fri, etc.)
29
+ # * Step value (*/[0-9]+)
30
+ #
16
31
  def parse(value_spec)
17
32
  case value_spec
18
33
  when WildcardPattern
@@ -36,4 +51,4 @@ module CronSpec
36
51
 
37
52
  end
38
53
 
39
- end
54
+ end
@@ -1,9 +1,18 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # Base class for parsed cron values.
5
+ #
3
6
  class CronValueBase
4
7
 
5
8
  attr_reader :lower_limit, :upper_limit
6
9
 
10
+ ##
11
+ # Constructs a new CronValueBase with the upper and lower limits of
12
+ # values allowed for this CronValue. For example, when definiting a
13
+ # CronValue for a 'minute', the lower limit would be 0 and the upper
14
+ # limit would be 59.
15
+ #
7
16
  def initialize(lower_limit, upper_limit)
8
17
  @lower_limit = lower_limit
9
18
  @upper_limit = upper_limit
@@ -11,9 +20,13 @@ module CronSpec
11
20
  raise "Lower limit must be less than or equal to upper limit" if @lower_limit > @upper_limit
12
21
  end
13
22
 
23
+ ##
24
+ # Returns true if the specified value is with the upper and lower
25
+ # limits defined for this CronValue.
26
+ #
14
27
  def is_value_within_limits?(value)
15
28
  value >= @lower_limit && value <= upper_limit
16
29
  end
17
30
  end
18
31
 
19
- end
32
+ end
@@ -1,12 +1,20 @@
1
1
  module CronSpec
2
+ ##
3
+ # Factory for constructing Day CronValues from a cron specification.
4
+ #
2
5
  class DayFactory < CronSpecificationFactory
6
+
7
+ # The lower limit for a value representing a day of the month
3
8
  DayLowerLimit = 1
9
+ # The upper limit for a value representing a day of the month
4
10
  DayUpperLimit = 31
5
11
 
12
+ ##
13
+ # Constructs a new DayFactory object.
6
14
  def initialize
7
15
  super
8
16
  @lower_limit = DayLowerLimit
9
17
  @upper_limit = DayUpperLimit
10
18
  end
11
19
  end
12
- end
20
+ end
@@ -1,19 +1,33 @@
1
1
  module CronSpec
2
+
3
+ ##
4
+ # Factory for constructing Day of week values from a cron specification.
5
+ #
2
6
  class DowFactory < CronSpecificationFactory
3
7
 
8
+ # The lower limit for the value of a day of the week (0-Sunday)
4
9
  DayOfWeekLowerLimit = 0
10
+ # The upper limit for the value of a day of the week (6-Saturday)
5
11
  DayOfWeekUpperLimit = 6
6
12
 
13
+ # The supported names for the days of the week
7
14
  DaysOfWeek = %w{ sun mon tue wed thu fri sat }
8
15
 
16
+ # A pipe-delimited expression for the days of the week
9
17
  DayOfWeekExpression = DaysOfWeek.join('|')
10
18
 
19
+ # A regular expression that matches a single day of the week.
11
20
  DayOfWeekSingleValuePattern = /\A(#{DayOfWeekExpression}|\d)\z/
12
21
 
22
+ # Regular expression that matches a range of days of the week
13
23
  DayOfWeekRangePattern = /\A(#{DayOfWeekExpression}|\d)-(#{DayOfWeekExpression}|\d)\z/
14
24
 
25
+ # Regular expression that matches only a named day of the week.
15
26
  NamedDayOfWeekPattern = /\A(#{DayOfWeekExpression})\z/
16
27
 
28
+ ##
29
+ # Constructs a new DowFactory object.
30
+ #
17
31
  def initialize
18
32
  super
19
33
  @lower_limit = DayOfWeekLowerLimit
@@ -29,5 +43,6 @@ module CronSpec
29
43
  # Sunday can be specified as index 7
30
44
  (dow == 7) ? 0 : dow
31
45
  end
46
+
32
47
  end
33
- end
48
+ end
@@ -1,10 +1,18 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # Factory for constructing hour cron values from a cron specification.
5
+ #
3
6
  class HourFactory < CronSpecificationFactory
4
7
 
8
+ # The lower limit of a value representing an hour of the day.
5
9
  HourLowerLimit = 0
10
+ # The upper limit of a value representing an hour of the day.
6
11
  HourUpperLimit = 23
7
12
 
13
+ ##
14
+ # Constructs a new HourFactory object.
15
+ #
8
16
  def initialize
9
17
  super
10
18
  @lower_limit = HourLowerLimit
@@ -13,4 +21,4 @@ module CronSpec
13
21
 
14
22
  end
15
23
 
16
- end
24
+ end
@@ -1,10 +1,17 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # Factory for constructing minute cron values from a cron specification.
5
+ #
3
6
  class MinuteFactory < CronSpecificationFactory
4
7
 
8
+ # The lower limit of a value representing a minute of an hour
5
9
  MinuteLowerLimit = 0
10
+ # The upper limit of a value representing a minute of an hour
6
11
  MinuteUpperLimit = 59
7
12
 
13
+ ##
14
+ # Constructs a new MinuteFactory object.
8
15
  def initialize
9
16
  super
10
17
  @lower_limit = MinuteLowerLimit
@@ -13,4 +20,4 @@ module CronSpec
13
20
 
14
21
  end
15
22
 
16
- end
23
+ end
@@ -1,19 +1,33 @@
1
1
  module CronSpec
2
+
3
+ ##
4
+ # Factory for constructing month cron values from a cron specification.
5
+ #
2
6
  class MonthFactory < CronSpecificationFactory
3
7
 
8
+ # The lower limit for a value representing a month of a year
4
9
  MonthLowerLimit = 1
10
+ # The upper limit for a value representing a month of a year
5
11
  MonthUpperLimit = 12
6
12
 
13
+ # The supported names of the months
7
14
  Months = %w{ jan feb mar apr may jun jul aug sep oct nov dec }
8
15
 
16
+ # A pipe-delimited list of the months of the year
9
17
  MonthExpression = Months.join('|')
10
18
 
19
+ # A regular expression to match a single value month expression
11
20
  MonthSingleValuePattern = /\A(#{MonthExpression}|\d+)\z/
12
21
 
22
+ # A regular expression to match a range month expression
13
23
  MonthRangePattern = /\A(#{MonthExpression}|\d+)-(#{MonthExpression}|\d+)\z/
14
24
 
25
+ # A regular expression to match a named month
15
26
  NamedMonthPattern = /\A(#{MonthExpression})\z/
16
27
 
28
+ ##
29
+ # Constructs a new MonthFactory object.
30
+ #
17
31
  def initialize
18
32
  super
19
33
  @lower_limit = MonthLowerLimit
@@ -29,4 +43,4 @@ module CronSpec
29
43
  end
30
44
 
31
45
  end
32
- end
46
+ end
@@ -1,9 +1,21 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # A cron value representing a range of values
5
+ #
3
6
  class RangeCronValue < CronValueBase
4
7
 
5
8
  attr_reader :range_lower, :range_upper
6
9
 
10
+ ##
11
+ # Constructs a new RangeCronValue object. The object is initialized
12
+ # with the value limits (lower_limit and upper_limit) and the
13
+ # defined sub-range of the lower/upper limits.
14
+ #
15
+ # The range_lower and range_upper values are checked to determine if
16
+ # they are within the value limits and are not reversed. If they are not
17
+ # within limits or reversed an exception is raised.
18
+ #
7
19
  def initialize(lower_limit, upper_limit, range_lower, range_upper)
8
20
  super(lower_limit, upper_limit)
9
21
  @range_lower = range_lower
@@ -14,10 +26,14 @@ module CronSpec
14
26
  raise "Lower limit must be less than or equal to the upper limit" if @range_lower > @range_upper
15
27
  end
16
28
 
29
+ ##
30
+ # Returns true if the specified value is with the range_upper/range_lower
31
+ # value range, inclusive.
32
+ #
17
33
  def is_effective?(value)
18
34
  @range_lower <= value && value <= @range_upper
19
35
  end
20
36
 
21
37
  end
22
38
 
23
- end
39
+ end
@@ -1,9 +1,17 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # A single cron value
5
+ #
3
6
  class SingleValueCronValue < CronValueBase
4
7
 
5
8
  attr_reader :single_value
6
9
 
10
+ ##
11
+ # Constructs a new SingleValueCronValue having the specified limits
12
+ # and value. The value is checked to determine if it fits within the
13
+ # specified limits; if it doesn't, an exception is raised.
14
+ #
7
15
  def initialize(lower_limit, upper_limit, single_value)
8
16
  super(lower_limit, upper_limit)
9
17
 
@@ -12,10 +20,14 @@ module CronSpec
12
20
  raise "Value is out of range: #{@single_value}" unless is_value_within_limits?(@single_value)
13
21
  end
14
22
 
23
+ ##
24
+ # Returns true if the specified value is equal to the value encapsulated
25
+ # by the SingleValueCronValue.
26
+ #
15
27
  def is_effective?(value)
16
28
  @single_value == value
17
29
  end
18
30
 
19
31
  end
20
32
 
21
- end
33
+ end
@@ -1,9 +1,17 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # Defines an instance of a step value within a cron specification.
5
+ #
3
6
  class StepCronValue < CronValueBase
4
7
 
5
8
  attr_reader :step_value
6
9
 
10
+ ##
11
+ # Constructs a new StepCronValue with the specified lower and upper limits
12
+ # and step value. If the step value is 0 or is not less than or equal to
13
+ # the upper limit, an exception is raised.
14
+ #
7
15
  def initialize(lower_limit, upper_limit, step_value)
8
16
  super(lower_limit, upper_limit)
9
17
 
@@ -12,10 +20,14 @@ module CronSpec
12
20
  raise "Invalid step value: #{@step_value}" if step_value == 0 || step_value > upper_limit
13
21
  end
14
22
 
23
+ ##
24
+ # Returns true if the specified value represents a value step value within
25
+ # the step specification. Verifies that value % step_value == 0
26
+ #
15
27
  def is_effective?(value)
16
28
  value % @step_value == 0
17
29
  end
18
30
 
19
31
  end
20
32
 
21
- end
33
+ end
@@ -1,15 +1,24 @@
1
1
  module CronSpec
2
2
 
3
+ ##
4
+ # Represents a wildcard value
5
+ #
3
6
  class WildcardCronValue < CronValueBase
4
7
 
8
+ ##
9
+ # Constructs a new WildcardCronValue with the specified limits.
10
+ #
5
11
  def initialize(lower_limit, upper_limit)
6
12
  super(lower_limit, upper_limit)
7
13
  end
8
14
 
15
+ ##
16
+ # Returns true if the specified value is any value whatsoever.
17
+ #
9
18
  def is_effective?(value)
10
19
  true
11
20
  end
12
21
 
13
22
  end
14
23
 
15
- end
24
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 0
9
- version: 0.1.0
8
+ - 1
9
+ version: 0.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Dave Sieh
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-27 00:00:00 -07:00
17
+ date: 2011-02-28 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -136,7 +136,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
- hash: 3189745320292493514
139
+ hash: -3901467252571771135
140
140
  segments:
141
141
  - 0
142
142
  version: "0"