ice_cube 0.16.4 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/config/locales/id.yml +134 -0
  3. data/lib/ice_cube/builders/hash_builder.rb +1 -5
  4. data/lib/ice_cube/builders/ical_builder.rb +13 -15
  5. data/lib/ice_cube/builders/string_builder.rb +10 -16
  6. data/lib/ice_cube/deprecated.rb +3 -4
  7. data/lib/ice_cube/errors/count_exceeded.rb +0 -2
  8. data/lib/ice_cube/errors/until_exceeded.rb +0 -2
  9. data/lib/ice_cube/flexible_hash.rb +3 -7
  10. data/lib/ice_cube/i18n.rb +11 -19
  11. data/lib/ice_cube/input_alignment.rb +9 -11
  12. data/lib/ice_cube/null_i18n.rb +6 -6
  13. data/lib/ice_cube/occurrence.rb +10 -11
  14. data/lib/ice_cube/parsers/hash_parser.rb +3 -6
  15. data/lib/ice_cube/parsers/ical_parser.rb +39 -38
  16. data/lib/ice_cube/parsers/yaml_parser.rb +2 -4
  17. data/lib/ice_cube/rule.rb +7 -18
  18. data/lib/ice_cube/rules/daily_rule.rb +0 -4
  19. data/lib/ice_cube/rules/hourly_rule.rb +0 -4
  20. data/lib/ice_cube/rules/minutely_rule.rb +0 -4
  21. data/lib/ice_cube/rules/monthly_rule.rb +0 -4
  22. data/lib/ice_cube/rules/secondly_rule.rb +0 -4
  23. data/lib/ice_cube/rules/weekly_rule.rb +1 -5
  24. data/lib/ice_cube/rules/yearly_rule.rb +0 -4
  25. data/lib/ice_cube/schedule.rb +32 -40
  26. data/lib/ice_cube/single_occurrence_rule.rb +1 -5
  27. data/lib/ice_cube/time_util.rb +49 -57
  28. data/lib/ice_cube/validated_rule.rb +4 -10
  29. data/lib/ice_cube/validations/count.rb +2 -8
  30. data/lib/ice_cube/validations/daily_interval.rb +5 -11
  31. data/lib/ice_cube/validations/day.rb +7 -13
  32. data/lib/ice_cube/validations/day_of_month.rb +4 -10
  33. data/lib/ice_cube/validations/day_of_week.rb +10 -13
  34. data/lib/ice_cube/validations/day_of_year.rb +6 -12
  35. data/lib/ice_cube/validations/fixed_value.rb +9 -15
  36. data/lib/ice_cube/validations/hour_of_day.rb +5 -11
  37. data/lib/ice_cube/validations/hourly_interval.rb +3 -9
  38. data/lib/ice_cube/validations/lock.rb +8 -14
  39. data/lib/ice_cube/validations/minute_of_hour.rb +4 -10
  40. data/lib/ice_cube/validations/minutely_interval.rb +4 -10
  41. data/lib/ice_cube/validations/month_of_year.rb +2 -8
  42. data/lib/ice_cube/validations/monthly_interval.rb +4 -10
  43. data/lib/ice_cube/validations/schedule_lock.rb +0 -6
  44. data/lib/ice_cube/validations/second_of_minute.rb +4 -10
  45. data/lib/ice_cube/validations/secondly_interval.rb +2 -8
  46. data/lib/ice_cube/validations/until.rb +2 -8
  47. data/lib/ice_cube/validations/weekly_interval.rb +5 -11
  48. data/lib/ice_cube/validations/yearly_interval.rb +3 -9
  49. data/lib/ice_cube/version.rb +1 -3
  50. data/lib/ice_cube.rb +51 -51
  51. metadata +23 -8
  52. data/spec/spec_helper.rb +0 -79
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::HourOfDay
4
-
5
3
  # Add hour of day validations
6
4
  def hour_of_day(*hours)
7
5
  hours.flatten.each do |hour|
@@ -22,7 +20,7 @@ module IceCube
22
20
  freq = base_interval_validation.interval
23
21
 
24
22
  first_hour = Array(validations[:hour_of_day]).min_by(&:value)
25
- time = TimeUtil::TimeWrapper.new(start_time, false)
23
+ time = TimeUtil::TimeWrapper.new(start_time, true)
26
24
  if freq > 1 && base_interval_validation.type == :hour
27
25
  offset = first_hour.validate(opening_time, start_time)
28
26
  time.add(:hour, offset - freq)
@@ -30,13 +28,12 @@ module IceCube
30
28
  time.hour = first_hour.value
31
29
  end
32
30
 
33
- super opening_time, time.to_time
31
+ super(opening_time, time.to_time)
34
32
  end
35
33
 
36
34
  class Validation < Validations::FixedValue
37
-
38
35
  attr_reader :hour
39
- alias :value :hour
36
+ alias_method :value, :hour
40
37
 
41
38
  def initialize(hour)
42
39
  @hour = hour
@@ -63,16 +60,13 @@ module IceCube
63
60
  end
64
61
 
65
62
  def build_ical(builder)
66
- builder['BYHOUR'] << hour
63
+ builder["BYHOUR"] << hour
67
64
  end
68
65
 
69
66
  StringBuilder.register_formatter(:hour_of_day) do |segments|
70
67
  str = StringBuilder.sentence(segments)
71
- IceCube::I18n.t('ice_cube.at_hours_of_the_day', count: segments.size, segments: str)
68
+ IceCube::I18n.t("ice_cube.at_hours_of_the_day", count: segments.size, segments: str)
72
69
  end
73
-
74
70
  end
75
-
76
71
  end
77
-
78
72
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::HourlyInterval
4
-
5
3
  def interval(interval)
6
4
  verify_alignment(interval, :hour, :interval) { |error| raise error }
7
5
 
@@ -12,7 +10,6 @@ module IceCube
12
10
  end
13
11
 
14
12
  class Validation
15
-
16
13
  attr_reader :interval
17
14
 
18
15
  def initialize(interval)
@@ -30,7 +27,7 @@ module IceCube
30
27
  def validate(step_time, start_time)
31
28
  t0, t1 = start_time.to_i, step_time.to_i
32
29
  sec = (t1 - t1 % ONE_HOUR) -
33
- (t0 - t0 % ONE_HOUR)
30
+ (t0 - t0 % ONE_HOUR)
34
31
  hours = sec / ONE_HOUR
35
32
  offset = (hours % interval).nonzero?
36
33
  interval - offset if offset
@@ -45,12 +42,9 @@ module IceCube
45
42
  end
46
43
 
47
44
  def build_ical(builder)
48
- builder['FREQ'] << 'HOURLY'
49
- builder['INTERVAL'] << interval unless interval == 1
45
+ builder["FREQ"] << "HOURLY"
46
+ builder["INTERVAL"] << interval unless interval == 1
50
47
  end
51
-
52
48
  end
53
-
54
49
  end
55
-
56
50
  end
@@ -1,5 +1,4 @@
1
1
  module IceCube
2
-
3
2
  # This validation mixin is used by the various "fixed-time" (e.g. day,
4
3
  # day_of_month, hour_of_day) Validation and ScheduleLock::Validation modules.
5
4
  # It is not a standalone rule validation like the others.
@@ -9,12 +8,11 @@ module IceCube
9
8
  # schedule's start_time
10
9
  #
11
10
  module Validations::Lock
12
-
13
- INTERVALS = {:min => 60, :sec => 60, :hour => 24, :month => 12, :wday => 7}
11
+ INTERVALS = {min: 60, sec: 60, hour: 24, month: 12, wday: 7}
14
12
 
15
13
  def validate(time, start_time)
16
14
  case type
17
- when :day then validate_day_lock(time, start_time)
15
+ when :day then validate_day_lock(time, start_time)
18
16
  when :hour then validate_hour_lock(time, start_time)
19
17
  else validate_interval_lock(time, start_time)
20
18
  end
@@ -28,7 +26,7 @@ module IceCube
28
26
  def validate_interval_lock(time, start_time)
29
27
  t0 = starting_unit(start_time)
30
28
  t1 = time.send(type)
31
- t0 >= t1 ? t0 - t1 : INTERVALS[type] - t1 + t0
29
+ (t0 >= t1) ? t0 - t1 : INTERVALS[type] - t1 + t0
32
30
  end
33
31
 
34
32
  # Lock the hour if explicitly set by hour_of_day, but allow for the nearest
@@ -39,12 +37,10 @@ module IceCube
39
37
  h1 = time.hour
40
38
  if h0 >= h1
41
39
  h0 - h1
40
+ elsif (dst_offset = TimeUtil.dst_change(time))
41
+ h0 - h1 + dst_offset
42
42
  else
43
- if dst_offset = TimeUtil.dst_change(time)
44
- h0 - h1 + dst_offset
45
- else
46
- 24 - h1 + h0
47
- end
43
+ 24 - h1 + h0
48
44
  end
49
45
  end
50
46
 
@@ -77,11 +73,11 @@ module IceCube
77
73
  if value && value > 0
78
74
  until_next_month = days_in_month + sleeps
79
75
  else
80
- until_next_month = start < 28 ? days_in_month : TimeUtil.days_to_next_month(date)
76
+ until_next_month = (start < 28) ? days_in_month : TimeUtil.days_to_next_month(date)
81
77
  until_next_month += sleeps - month_overflow
82
78
  end
83
79
 
84
- sleeps >= 0 ? sleeps : until_next_month
80
+ (sleeps >= 0) ? sleeps : until_next_month
85
81
  end
86
82
 
87
83
  def starting_unit(start_time)
@@ -89,7 +85,5 @@ module IceCube
89
85
  start += INTERVALS[type] while start < 0
90
86
  start
91
87
  end
92
-
93
88
  end
94
-
95
89
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::MinuteOfHour
4
-
5
3
  def minute_of_hour(*minutes)
6
4
  minutes.flatten.each do |minute|
7
5
  unless minute.is_a?(Integer)
@@ -22,13 +20,12 @@ module IceCube
22
20
  first_minute = validations[:minute_of_hour].min_by(&:value)
23
21
  time = TimeUtil::TimeWrapper.new(start_time, false)
24
22
  time.min = first_minute.value
25
- super opening_time, time.to_time
23
+ super(opening_time, time.to_time)
26
24
  end
27
25
 
28
26
  class Validation < Validations::FixedValue
29
-
30
27
  attr_reader :minute
31
- alias :value :minute
28
+ alias_method :value, :minute
32
29
 
33
30
  def initialize(minute)
34
31
  @minute = minute
@@ -55,16 +52,13 @@ module IceCube
55
52
  end
56
53
 
57
54
  def build_ical(builder)
58
- builder['BYMINUTE'] << minute
55
+ builder["BYMINUTE"] << minute
59
56
  end
60
57
 
61
58
  StringBuilder.register_formatter(:minute_of_hour) do |segments|
62
59
  str = StringBuilder.sentence(segments)
63
- IceCube::I18n.t('ice_cube.on_minutes_of_hour', count: segments.size, segments: str)
60
+ IceCube::I18n.t("ice_cube.on_minutes_of_hour", count: segments.size, segments: str)
64
61
  end
65
-
66
62
  end
67
-
68
63
  end
69
-
70
64
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::MinutelyInterval
4
-
5
3
  def interval(interval)
6
4
  verify_alignment(interval, :min, :interval) { |error| raise error }
7
5
 
@@ -12,7 +10,6 @@ module IceCube
12
10
  end
13
11
 
14
12
  class Validation
15
-
16
13
  attr_reader :interval
17
14
 
18
15
  def initialize(interval)
@@ -30,14 +27,14 @@ module IceCube
30
27
  def validate(step_time, start_time)
31
28
  t0, t1 = start_time.to_i, step_time.to_i
32
29
  sec = (t1 - t1 % ONE_MINUTE) -
33
- (t0 - t0 % ONE_MINUTE)
30
+ (t0 - t0 % ONE_MINUTE)
34
31
  minutes = sec / ONE_MINUTE
35
32
  offset = (minutes % interval).nonzero?
36
33
  interval - offset if offset
37
34
  end
38
35
 
39
36
  def build_s(builder)
40
- builder.base = IceCube::I18n.t('ice_cube.each_minute', count: interval)
37
+ builder.base = IceCube::I18n.t("ice_cube.each_minute", count: interval)
41
38
  end
42
39
 
43
40
  def build_hash(builder)
@@ -45,12 +42,9 @@ module IceCube
45
42
  end
46
43
 
47
44
  def build_ical(builder)
48
- builder['FREQ'] << 'MINUTELY'
49
- builder['INTERVAL'] << interval unless interval == 1
45
+ builder["FREQ"] << "MINUTELY"
46
+ builder["INTERVAL"] << interval unless interval == 1
50
47
  end
51
-
52
48
  end
53
-
54
49
  end
55
-
56
50
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::MonthOfYear
4
-
5
3
  def month_of_year(*months)
6
4
  months.flatten.each do |month|
7
5
  unless month.is_a?(Integer) || month.is_a?(Symbol)
@@ -16,9 +14,8 @@ module IceCube
16
14
  end
17
15
 
18
16
  class Validation < Validations::FixedValue
19
-
20
17
  attr_reader :month
21
- alias :value :month
18
+ alias_method :value, :month
22
19
 
23
20
  def initialize(month)
24
21
  @month = month
@@ -45,15 +42,12 @@ module IceCube
45
42
  end
46
43
 
47
44
  def build_ical(builder)
48
- builder['BYMONTH'] << month
45
+ builder["BYMONTH"] << month
49
46
  end
50
47
 
51
48
  StringBuilder.register_formatter(:month_of_year) do |segments|
52
49
  IceCube::I18n.t("ice_cube.in", target: StringBuilder.sentence(segments))
53
50
  end
54
-
55
51
  end
56
-
57
52
  end
58
-
59
53
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::MonthlyInterval
4
-
5
3
  def interval(interval)
6
4
  interval = normalized_interval(interval)
7
5
  verify_alignment(interval, :month, :interval) { |error| raise error }
@@ -13,7 +11,6 @@ module IceCube
13
11
  end
14
12
 
15
13
  class Validation
16
-
17
14
  attr_reader :interval
18
15
 
19
16
  def initialize(interval)
@@ -31,13 +28,13 @@ module IceCube
31
28
  def validate(step_time, start_time)
32
29
  t0, t1 = start_time, step_time
33
30
  months = (t1.month - t0.month) +
34
- (t1.year - t0.year) * 12
31
+ (t1.year - t0.year) * 12
35
32
  offset = (months % interval).nonzero?
36
33
  interval - offset if offset
37
34
  end
38
35
 
39
36
  def build_s(builder)
40
- builder.base = IceCube::I18n.t('ice_cube.each_month', count: interval)
37
+ builder.base = IceCube::I18n.t("ice_cube.each_month", count: interval)
41
38
  end
42
39
 
43
40
  def build_hash(builder)
@@ -45,12 +42,9 @@ module IceCube
45
42
  end
46
43
 
47
44
  def build_ical(builder)
48
- builder['FREQ'] << 'MONTHLY'
49
- builder['INTERVAL'] << interval unless interval == 1
45
+ builder["FREQ"] << "MONTHLY"
46
+ builder["INTERVAL"] << interval unless interval == 1
50
47
  end
51
-
52
48
  end
53
-
54
49
  end
55
-
56
50
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::ScheduleLock
4
-
5
3
  # Lock the given time units to the units from schedule's +start_time+
6
4
  # These locks are all clobberable by other rules of the same #type
7
5
  # using +clobber_base_validation+
@@ -13,7 +11,6 @@ module IceCube
13
11
  end
14
12
 
15
13
  class Validation < Validations::FixedValue
16
-
17
14
  attr_reader :type, :value
18
15
 
19
16
  def initialize(type)
@@ -42,9 +39,6 @@ module IceCube
42
39
  # no -op
43
40
  def build_ical(builder)
44
41
  end
45
-
46
42
  end
47
-
48
43
  end
49
-
50
44
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::SecondOfMinute
4
-
5
3
  def second_of_minute(*seconds)
6
4
  seconds.flatten.each do |second|
7
5
  unless second.is_a?(Integer)
@@ -22,13 +20,12 @@ module IceCube
22
20
  first_second = Array(validations[:second_of_minute]).min_by(&:value)
23
21
  time = TimeUtil::TimeWrapper.new(start_time, false)
24
22
  time.sec = first_second.value
25
- super opening_time, time.to_time
23
+ super(opening_time, time.to_time)
26
24
  end
27
25
 
28
26
  class Validation < Validations::FixedValue
29
-
30
27
  attr_reader :second
31
- alias :value :second
28
+ alias_method :value, :second
32
29
 
33
30
  def initialize(second)
34
31
  @second = second
@@ -55,16 +52,13 @@ module IceCube
55
52
  end
56
53
 
57
54
  def build_ical(builder)
58
- builder['BYSECOND'] << second
55
+ builder["BYSECOND"] << second
59
56
  end
60
57
 
61
58
  StringBuilder.register_formatter(:second_of_minute) do |segments|
62
59
  str = StringBuilder.sentence(segments)
63
- IceCube::I18n.t('ice_cube.on_seconds_of_minute', count: segments.size, segments: str)
60
+ IceCube::I18n.t("ice_cube.on_seconds_of_minute", count: segments.size, segments: str)
64
61
  end
65
-
66
62
  end
67
-
68
63
  end
69
-
70
64
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::SecondlyInterval
4
-
5
3
  def interval(interval)
6
4
  verify_alignment(interval, :sec, :interval) { |error| raise error }
7
5
 
@@ -12,7 +10,6 @@ module IceCube
12
10
  end
13
11
 
14
12
  class Validation
15
-
16
13
  attr_reader :interval
17
14
 
18
15
  def initialize(interval)
@@ -42,12 +39,9 @@ module IceCube
42
39
  end
43
40
 
44
41
  def build_ical(builder)
45
- builder['FREQ'] << 'SECONDLY'
46
- builder['INTERVAL'] << interval unless interval == 1
42
+ builder["FREQ"] << "SECONDLY"
43
+ builder["INTERVAL"] << interval unless interval == 1
47
44
  end
48
-
49
45
  end
50
-
51
46
  end
52
-
53
47
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::Until
4
-
5
3
  extend Deprecated
6
4
 
7
5
  # Value reader for limit
@@ -16,7 +14,6 @@ module IceCube
16
14
  end
17
15
 
18
16
  class Validation
19
-
20
17
  attr_reader :time
21
18
 
22
19
  def initialize(time)
@@ -38,7 +35,7 @@ module IceCube
38
35
 
39
36
  def build_s(builder)
40
37
  date = IceCube::I18n.l(time, format: IceCube.to_s_time_format)
41
- builder.piece(:until) << IceCube::I18n.t('ice_cube.until', date: date)
38
+ builder.piece(:until) << IceCube::I18n.t("ice_cube.until", date: date)
42
39
  end
43
40
 
44
41
  def build_hash(builder)
@@ -46,11 +43,8 @@ module IceCube
46
43
  end
47
44
 
48
45
  def build_ical(builder)
49
- builder['UNTIL'] << IcalBuilder.ical_utc_format(time)
46
+ builder["UNTIL"] << IcalBuilder.ical_utc_format(time)
50
47
  end
51
-
52
48
  end
53
-
54
49
  end
55
-
56
50
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::WeeklyInterval
4
-
5
3
  def interval(interval, week_start = :sunday)
6
4
  @interval = normalized_interval(interval)
7
5
  @week_start = TimeUtil.wday_to_sym(week_start)
@@ -11,7 +9,6 @@ module IceCube
11
9
  end
12
10
 
13
11
  class Validation
14
-
15
12
  attr_reader :interval, :week_start
16
13
 
17
14
  def initialize(interval, week_start)
@@ -33,13 +30,13 @@ module IceCube
33
30
  d0 = Date.new(t0.year, t0.month, t0.day)
34
31
  d1 = Date.new(t1.year, t1.month, t1.day)
35
32
  days = (d1 - TimeUtil.normalize_wday(d1.wday, week_start)) -
36
- (d0 - TimeUtil.normalize_wday(d0.wday, week_start))
33
+ (d0 - TimeUtil.normalize_wday(d0.wday, week_start))
37
34
  offset = ((days.to_i / 7) % interval).nonzero?
38
35
  (interval - offset) * 7 if offset
39
36
  end
40
37
 
41
38
  def build_s(builder)
42
- builder.base = IceCube::I18n.t('ice_cube.each_week', count: interval)
39
+ builder.base = IceCube::I18n.t("ice_cube.each_week", count: interval)
43
40
  end
44
41
 
45
42
  def build_hash(builder)
@@ -48,15 +45,12 @@ module IceCube
48
45
  end
49
46
 
50
47
  def build_ical(builder)
51
- builder['FREQ'] << 'WEEKLY'
48
+ builder["FREQ"] << "WEEKLY"
52
49
  unless interval == 1
53
- builder['INTERVAL'] << interval
54
- builder['WKST'] << week_start.to_s.upcase[0..1]
50
+ builder["INTERVAL"] << interval
51
+ builder["WKST"] << week_start.to_s.upcase[0..1]
55
52
  end
56
53
  end
57
-
58
54
  end
59
-
60
55
  end
61
-
62
56
  end
@@ -1,7 +1,5 @@
1
1
  module IceCube
2
-
3
2
  module Validations::YearlyInterval
4
-
5
3
  def interval(interval)
6
4
  @interval = normalized_interval(interval)
7
5
  replace_validations_for(:interval, [Validation.new(@interval)])
@@ -10,7 +8,6 @@ module IceCube
10
8
  end
11
9
 
12
10
  class Validation
13
-
14
11
  attr_reader :interval
15
12
 
16
13
  def initialize(interval)
@@ -32,7 +29,7 @@ module IceCube
32
29
  end
33
30
 
34
31
  def build_s(builder)
35
- builder.base = IceCube::I18n.t('ice_cube.each_year', count: interval)
32
+ builder.base = IceCube::I18n.t("ice_cube.each_year", count: interval)
36
33
  end
37
34
 
38
35
  def build_hash(builder)
@@ -40,14 +37,11 @@ module IceCube
40
37
  end
41
38
 
42
39
  def build_ical(builder)
43
- builder['FREQ'] << 'YEARLY'
40
+ builder["FREQ"] << "YEARLY"
44
41
  unless interval == 1
45
- builder['INTERVAL'] << interval
42
+ builder["INTERVAL"] << interval
46
43
  end
47
44
  end
48
-
49
45
  end
50
-
51
46
  end
52
-
53
47
  end
@@ -1,5 +1,3 @@
1
1
  module IceCube
2
-
3
- VERSION = '0.16.4'
4
-
2
+ VERSION = "0.17.0"
5
3
  end