ice_cube 0.11.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.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ice_cube.rb +0 -11
  3. data/lib/ice_cube/builders/string_builder.rb +15 -23
  4. data/lib/ice_cube/deprecated.rb +26 -24
  5. data/lib/ice_cube/enumerator.rb +1 -3
  6. data/lib/ice_cube/hash_input.rb +71 -0
  7. data/lib/ice_cube/rule.rb +4 -6
  8. data/lib/ice_cube/rules/daily_rule.rb +1 -1
  9. data/lib/ice_cube/rules/hourly_rule.rb +1 -1
  10. data/lib/ice_cube/rules/minutely_rule.rb +1 -1
  11. data/lib/ice_cube/rules/monthly_rule.rb +1 -1
  12. data/lib/ice_cube/rules/secondly_rule.rb +1 -1
  13. data/lib/ice_cube/rules/yearly_rule.rb +1 -1
  14. data/lib/ice_cube/schedule.rb +4 -4
  15. data/lib/ice_cube/string_helpers.rb +10 -0
  16. data/lib/ice_cube/time_util.rb +14 -5
  17. data/lib/ice_cube/validations/count.rb +4 -6
  18. data/lib/ice_cube/validations/daily_interval.rb +13 -18
  19. data/lib/ice_cube/validations/day.rb +4 -4
  20. data/lib/ice_cube/validations/day_of_month.rb +8 -10
  21. data/lib/ice_cube/validations/day_of_week.rb +24 -26
  22. data/lib/ice_cube/validations/day_of_year.rb +11 -12
  23. data/lib/ice_cube/validations/hour_of_day.rb +9 -11
  24. data/lib/ice_cube/validations/hourly_interval.rb +18 -21
  25. data/lib/ice_cube/validations/lock.rb +35 -14
  26. data/lib/ice_cube/validations/minute_of_hour.rb +9 -11
  27. data/lib/ice_cube/validations/minutely_interval.rb +16 -19
  28. data/lib/ice_cube/validations/month_of_year.rb +4 -4
  29. data/lib/ice_cube/validations/monthly_interval.rb +15 -17
  30. data/lib/ice_cube/validations/schedule_lock.rb +12 -11
  31. data/lib/ice_cube/validations/second_of_minute.rb +5 -5
  32. data/lib/ice_cube/validations/secondly_interval.rb +13 -16
  33. data/lib/ice_cube/validations/until.rb +12 -12
  34. data/lib/ice_cube/validations/weekly_interval.rb +20 -23
  35. data/lib/ice_cube/validations/yearly_interval.rb +10 -11
  36. data/lib/ice_cube/version.rb +1 -1
  37. metadata +20 -33
@@ -13,6 +13,10 @@ module IceCube
13
13
 
14
14
  attr_reader :interval
15
15
 
16
+ def initialize(interval)
17
+ @interval = interval
18
+ end
19
+
16
20
  def type
17
21
  :min
18
22
  end
@@ -21,33 +25,26 @@ module IceCube
21
25
  false
22
26
  end
23
27
 
24
- def build_s(builder)
25
- builder.base = interval == 1 ? 'Minutely' : "Every #{interval} minutes"
28
+ def validate(step_time, schedule)
29
+ t0, t1 = schedule.start_time.to_i, step_time.to_i
30
+ sec = (t1 - t1 % ONE_MINUTE) -
31
+ (t0 - t0 % ONE_MINUTE)
32
+ minutes = sec / ONE_MINUTE
33
+ offset = (minutes % interval).nonzero?
34
+ interval - offset if offset
26
35
  end
27
36
 
28
- def build_ical(builder)
29
- builder['FREQ'] << 'MINUTELY'
30
- unless interval == 1
31
- builder['INTERVAL'] << interval
32
- end
37
+ def build_s(builder)
38
+ builder.base = interval == 1 ? 'Minutely' : "Every #{interval} minutes"
33
39
  end
34
40
 
35
41
  def build_hash(builder)
36
42
  builder[:interval] = interval
37
43
  end
38
44
 
39
- def initialize(interval)
40
- @interval = interval
41
- end
42
-
43
- def validate(time, schedule)
44
- start_time = schedule.start_time
45
- sec = (time.to_i - time.to_i % ONE_MINUTE) -
46
- (start_time.to_i - start_time.to_i % ONE_MINUTE)
47
- minutes = sec / ONE_MINUTE
48
- unless minutes % interval == 0
49
- interval - (minutes % interval)
50
- end
45
+ def build_ical(builder)
46
+ builder['FREQ'] << 'MINUTELY'
47
+ builder['INTERVAL'] << interval unless interval == 1
51
48
  end
52
49
 
53
50
  end
@@ -25,6 +25,10 @@ module IceCube
25
25
  @month = month
26
26
  end
27
27
 
28
+ def type
29
+ :month
30
+ end
31
+
28
32
  def build_s(builder)
29
33
  builder.piece(:month_of_year) << Date::MONTHNAMES[month]
30
34
  end
@@ -37,10 +41,6 @@ module IceCube
37
41
  builder['BYMONTH'] << month
38
42
  end
39
43
 
40
- def type
41
- :month
42
- end
43
-
44
44
  StringBuilder.register_formatter(:month_of_year) do |segments|
45
45
  "in #{StringBuilder.sentence(segments)}"
46
46
  end
@@ -13,35 +13,33 @@ module IceCube
13
13
 
14
14
  attr_reader :interval
15
15
 
16
+ def initialize(interval)
17
+ @interval = interval
18
+ end
19
+
16
20
  def type
17
21
  :month
18
22
  end
19
23
 
20
- def build_s(builder)
21
- builder.base = interval == 1 ? 'Monthly' : "Every #{interval} months"
24
+ def validate(step_time, schedule)
25
+ t0, t1 = schedule.start_time, step_time
26
+ months = (t1.month - t0.month) +
27
+ (t1.year - t0.year) * 12
28
+ offset = (months % interval).nonzero?
29
+ interval - offset if offset
22
30
  end
23
31
 
24
- def build_ical(builder)
25
- builder['FREQ'] << 'MONTHLY'
26
- unless interval == 1
27
- builder['INTERVAL'] << interval
28
- end
32
+ def build_s(builder)
33
+ builder.base = interval == 1 ? 'Monthly' : "Every #{interval} months"
29
34
  end
30
35
 
31
36
  def build_hash(builder)
32
37
  builder[:interval] = interval
33
38
  end
34
39
 
35
- def initialize(interval)
36
- @interval = interval
37
- end
38
-
39
- def validate(time, schedule)
40
- start_time = schedule.start_time
41
- months_to_start = (time.month - start_time.month) + (time.year - start_time.year) * 12
42
- unless months_to_start % interval == 0
43
- interval - (months_to_start % interval)
44
- end
40
+ def build_ical(builder)
41
+ builder['FREQ'] << 'MONTHLY'
42
+ builder['INTERVAL'] << interval unless interval == 1
45
43
  end
46
44
 
47
45
  end
@@ -2,16 +2,16 @@ module IceCube
2
2
 
3
3
  module Validations::ScheduleLock
4
4
 
5
- # Lock the given times down the schedule's start_time for that position
5
+ # Lock the given time units to the units from schedule's +start_time+
6
6
  # These locks are all clobberable by other rules of the same #type
7
- # using clobber_base_validation
7
+ # using +clobber_base_validation+
8
+ #
8
9
  def schedule_lock(*types)
9
10
  types.each do |type|
10
11
  validations_for(:"base_#{type}") << Validation.new(type)
11
12
  end
12
13
  end
13
14
 
14
- # A validation used for locking time into a certain value
15
15
  class Validation
16
16
 
17
17
  include Validations::Lock
@@ -22,24 +22,25 @@ module IceCube
22
22
  @type = type
23
23
  end
24
24
 
25
- # no -op
26
- def build_s(builder)
25
+ def dst_adjust?
26
+ case @type
27
+ when :sec, :min then false
28
+ else true
29
+ end
27
30
  end
28
31
 
29
32
  # no -op
30
- def build_ical(builder)
33
+ def build_s(builder)
31
34
  end
32
35
 
33
36
  # no -op
34
37
  def build_hash(builder)
35
38
  end
36
39
 
37
- def dst_adjust?
38
- case @type
39
- when :sec, :min then false
40
- else true
41
- end
40
+ # no -op
41
+ def build_ical(builder)
42
42
  end
43
+
43
44
  end
44
45
 
45
46
  end
@@ -17,11 +17,6 @@ module IceCube
17
17
 
18
18
  include Validations::Lock
19
19
 
20
- StringBuilder.register_formatter(:second_of_minute) do |segments|
21
- str = "on the #{StringBuilder.sentence(segments)} "
22
- str << (segments.size == 1 ? 'second of the minute' : 'seconds of the minute')
23
- end
24
-
25
20
  attr_reader :second
26
21
  alias :value :second
27
22
 
@@ -45,6 +40,11 @@ module IceCube
45
40
  builder['BYSECOND'] << second
46
41
  end
47
42
 
43
+ StringBuilder.register_formatter(:second_of_minute) do |segments|
44
+ str = "on the #{StringBuilder.sentence(segments)} "
45
+ str << (segments.size == 1 ? 'second of the minute' : 'seconds of the minute')
46
+ end
47
+
48
48
  end
49
49
 
50
50
  end
@@ -13,6 +13,10 @@ module IceCube
13
13
 
14
14
  attr_reader :interval
15
15
 
16
+ def initialize(interval)
17
+ @interval = interval
18
+ end
19
+
16
20
  def type
17
21
  :sec
18
22
  end
@@ -21,30 +25,23 @@ module IceCube
21
25
  false
22
26
  end
23
27
 
24
- def build_s(builder)
25
- builder.base = interval == 1 ? 'Secondly' : "Every #{interval} seconds"
28
+ def validate(step_time, schedule)
29
+ seconds = step_time.to_i - schedule.start_time.to_i
30
+ offset = (seconds % interval).nonzero?
31
+ interval - offset if offset
26
32
  end
27
33
 
28
- def build_ical(builder)
29
- builder['FREQ'] << 'SECONDLY'
30
- unless interval == 1
31
- builder['INTERVAL'] << interval
32
- end
34
+ def build_s(builder)
35
+ builder.base = interval == 1 ? 'Secondly' : "Every #{interval} seconds"
33
36
  end
34
37
 
35
38
  def build_hash(builder)
36
39
  builder[:interval] = interval
37
40
  end
38
41
 
39
- def initialize(interval)
40
- @interval = interval
41
- end
42
-
43
- def validate(time, schedule)
44
- seconds = time.to_i - schedule.start_time.to_i
45
- unless seconds % interval == 0
46
- interval - (seconds % interval)
47
- end
42
+ def build_ical(builder)
43
+ builder['FREQ'] << 'SECONDLY'
44
+ builder['INTERVAL'] << interval unless interval == 1
48
45
  end
49
46
 
50
47
  end
@@ -2,9 +2,9 @@ module IceCube
2
2
 
3
3
  module Validations::Until
4
4
 
5
- extend ::Deprecated
5
+ extend Deprecated
6
6
 
7
- # accessor
7
+ # Value reader for limit
8
8
  def until_time
9
9
  @until
10
10
  end
@@ -21,28 +21,28 @@ module IceCube
21
21
 
22
22
  attr_reader :time
23
23
 
24
- def type
25
- :dealbreaker
26
- end
27
-
28
24
  def initialize(time)
29
25
  @time = time
30
26
  end
31
27
 
32
- def build_ical(builder)
33
- builder['UNTIL'] << IcalBuilder.ical_utc_format(time)
28
+ def type
29
+ :limit
34
30
  end
35
31
 
36
- def build_hash(builder)
37
- builder[:until] = TimeUtil.serialize_time(time)
32
+ def validate(step_time, schedule)
33
+ raise UntilExceeded if step_time > time
38
34
  end
39
35
 
40
36
  def build_s(builder)
41
37
  builder.piece(:until) << "until #{time.strftime(IceCube.to_s_time_format)}"
42
38
  end
43
39
 
44
- def validate(t, schedule)
45
- raise UntilExceeded if t > time
40
+ def build_hash(builder)
41
+ builder[:until] = TimeUtil.serialize_time(time)
42
+ end
43
+
44
+ def build_ical(builder)
45
+ builder['UNTIL'] << IcalBuilder.ical_utc_format(time)
46
46
  end
47
47
 
48
48
  end
@@ -20,20 +20,27 @@ module IceCube
20
20
 
21
21
  attr_reader :interval, :week_start
22
22
 
23
+ def initialize(interval, week_start)
24
+ @interval = interval
25
+ @week_start = week_start
26
+ end
27
+
23
28
  def type
24
29
  :day
25
30
  end
26
31
 
27
- def build_s(builder)
28
- builder.base = interval == 1 ? 'Weekly' : "Every #{interval} weeks"
32
+ def validate(step_time, schedule)
33
+ t0, t1 = schedule.start_time, step_time
34
+ d0 = Date.new(t0.year, t0.month, t0.day)
35
+ d1 = Date.new(t1.year, t1.month, t1.day)
36
+ days = (d1 - TimeUtil.normalize_wday(d1.wday, week_start)) -
37
+ (d0 - TimeUtil.normalize_wday(d0.wday, week_start))
38
+ offset = ((days / 7) % interval).nonzero?
39
+ (interval - offset) * 7 if offset
29
40
  end
30
41
 
31
- def build_ical(builder)
32
- builder['FREQ'] << 'WEEKLY'
33
- unless interval == 1
34
- builder['INTERVAL'] << interval
35
- builder['WKST'] << week_start.to_s.upcase[0..1]
36
- end
42
+ def build_s(builder)
43
+ builder.base = interval == 1 ? 'Weekly' : "Every #{interval} weeks"
37
44
  end
38
45
 
39
46
  def build_hash(builder)
@@ -41,21 +48,11 @@ module IceCube
41
48
  builder[:week_start] = TimeUtil.sym_to_wday(week_start)
42
49
  end
43
50
 
44
- def initialize(interval, week_start)
45
- @interval = interval
46
- @week_start = week_start
47
- end
48
-
49
- def validate(time, schedule)
50
- date = Date.new(time.year, time.month, time.day)
51
- st = schedule.start_time
52
- start_date = Date.new(st.year, st.month, st.day)
53
- weeks = (
54
- (date - TimeUtil.normalize_wday(date.wday, week_start)) -
55
- (start_date - TimeUtil.normalize_wday(start_date.wday, week_start))
56
- ) / 7
57
- unless weeks % interval == 0
58
- (interval - (weeks % interval)) * 7
51
+ def build_ical(builder)
52
+ builder['FREQ'] << 'WEEKLY'
53
+ unless interval == 1
54
+ builder['INTERVAL'] << interval
55
+ builder['WKST'] << week_start.to_s.upcase[0..1]
59
56
  end
60
57
  end
61
58
 
@@ -12,10 +12,20 @@ module IceCube
12
12
 
13
13
  attr_reader :interval
14
14
 
15
+ def initialize(interval)
16
+ @interval = interval
17
+ end
18
+
15
19
  def type
16
20
  :year
17
21
  end
18
22
 
23
+ def validate(step_time, schedule)
24
+ years = step_time.year - schedule.start_time.year
25
+ offset = (years % interval).nonzero?
26
+ interval - offset if offset
27
+ end
28
+
19
29
  def build_s(builder)
20
30
  builder.base = interval == 1 ? 'Yearly' : "Every #{interval} years"
21
31
  end
@@ -31,17 +41,6 @@ module IceCube
31
41
  end
32
42
  end
33
43
 
34
- def initialize(interval)
35
- @interval = interval
36
- end
37
-
38
- def validate(time, schedule)
39
- years_to_start = time.year - schedule.start_time.year
40
- unless years_to_start % interval == 0
41
- interval - (years_to_start % interval)
42
- end
43
- end
44
-
45
44
  end
46
45
 
47
46
  end
@@ -1,5 +1,5 @@
1
1
  module IceCube
2
2
 
3
- VERSION = '0.11.0'
3
+ VERSION = '0.11.1'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,78 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ice_cube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
5
- prerelease:
4
+ version: 0.11.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - John Crepezzi
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-13 00:00:00.000000000 Z
11
+ date: 2013-10-28 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ~>
36
32
  - !ruby/object:Gem::Version
37
- version: '0'
33
+ version: 2.12.0
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ~>
44
39
  - !ruby/object:Gem::Version
45
- version: '0'
40
+ version: 2.12.0
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: active_support
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: 3.0.0
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: 3.0.0
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: tzinfo
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  description: ice_cube is a recurring date library for Ruby. It allows for quick,
@@ -90,6 +81,7 @@ files:
90
81
  - lib/ice_cube/errors/count_exceeded.rb
91
82
  - lib/ice_cube/errors/until_exceeded.rb
92
83
  - lib/ice_cube/flexible_hash.rb
84
+ - lib/ice_cube/hash_input.rb
93
85
  - lib/ice_cube/occurrence.rb
94
86
  - lib/ice_cube/rule.rb
95
87
  - lib/ice_cube/rules/daily_rule.rb
@@ -101,6 +93,7 @@ files:
101
93
  - lib/ice_cube/rules/yearly_rule.rb
102
94
  - lib/ice_cube/schedule.rb
103
95
  - lib/ice_cube/single_occurrence_rule.rb
96
+ - lib/ice_cube/string_helpers.rb
104
97
  - lib/ice_cube/time_step.rb
105
98
  - lib/ice_cube/time_util.rb
106
99
  - lib/ice_cube/validated_rule.rb
@@ -129,33 +122,27 @@ files:
129
122
  homepage: http://seejohnrun.github.com/ice_cube/
130
123
  licenses:
131
124
  - MIT
125
+ metadata: {}
132
126
  post_install_message:
133
127
  rdoc_options: []
134
128
  require_paths:
135
129
  - lib
136
130
  required_ruby_version: !ruby/object:Gem::Requirement
137
- none: false
138
131
  requirements:
139
- - - ! '>='
132
+ - - '>='
140
133
  - !ruby/object:Gem::Version
141
134
  version: '0'
142
- segments:
143
- - 0
144
- hash: 3343770401458335569
145
135
  required_rubygems_version: !ruby/object:Gem::Requirement
146
- none: false
147
136
  requirements:
148
- - - ! '>='
137
+ - - '>='
149
138
  - !ruby/object:Gem::Version
150
139
  version: '0'
151
- segments:
152
- - 0
153
- hash: 3343770401458335569
154
140
  requirements: []
155
141
  rubyforge_project: ice-cube
156
- rubygems_version: 1.8.25
142
+ rubygems_version: 2.0.6
157
143
  signing_key:
158
- specification_version: 3
144
+ specification_version: 4
159
145
  summary: Ruby Date Recurrence Library
160
146
  test_files:
161
147
  - spec/spec_helper.rb
148
+ has_rdoc: true