ice_cube 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
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