ice_cube 0.13.0 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b2874169ce6feed9740297977d1dc7a4de82c83
4
- data.tar.gz: 6b7c7b5c35167429740adb2f64eced33413b3e93
3
+ metadata.gz: 39bb12c785e0af4edc922b99cdc1aaabf02cc282
4
+ data.tar.gz: 4cdf399772a0f10987821ef1f420a62ee1cc3ee8
5
5
  SHA512:
6
- metadata.gz: 7d9ec04b5840a45acd23ad7f41e44491ff6cb66f85348d32504ec3116955513eb2e4ec3c8e6281c958d2f6957ec7f08ff67e126a4853618fa748da84d5705638
7
- data.tar.gz: e47242b8441a7eb029ebd4c128030eb004110d539aed236ad1b55a8c02f378483fdf925c93ccbf4c794dd990d6a5b80bd3f9a1728c4d5c6e8f748c3a1f33cce8
6
+ metadata.gz: 38b477ae4371d93de536512ee3917cb9eda9865540a1ba51f240b37ee8819bd3ee1a303fd016583f5df57fe6af9360cf4aaed038a5370f6f1690651b96ed8fc5
7
+ data.tar.gz: e573e3beaae1f23edb49cca2504e133dad770801fbe14e3e9c13ae7889ce482493597406de846443cd2ed5e78e5b6456550421e8d98c016a21f07c8c5c0af6c1
data/lib/ice_cube.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'date'
2
2
  require 'ice_cube/deprecated'
3
+ require 'ice_cube/i18n'
4
+
5
+ IceCube::I18n.detect_backend!
3
6
 
4
7
  module IceCube
5
8
 
@@ -69,7 +72,7 @@ module IceCube
69
72
  # Defines the format used by IceCube when printing out Schedule#to_s.
70
73
  # Defaults to '%B %e, %Y'
71
74
  def self.to_s_time_format
72
- @to_s_time_format ||= '%B %e, %Y'
75
+ IceCube::I18n.t("ice_cube.date.formats.default")
73
76
  end
74
77
 
75
78
  # Sets the format used by IceCube when printing out Schedule#to_s.
@@ -32,15 +32,15 @@ module IceCube
32
32
 
33
33
  def self.ical_utc_format(time)
34
34
  time = time.dup.utc
35
- "#{time.strftime('%Y%m%dT%H%M%SZ')}" # utc time
35
+ IceCube::I18n.l(time, format: '%Y%m%dT%H%M%SZ') # utc time
36
36
  end
37
37
 
38
38
  def self.ical_format(time, force_utc)
39
39
  time = time.dup.utc if force_utc
40
40
  if time.utc?
41
- ":#{time.strftime('%Y%m%dT%H%M%SZ')}" # utc time
41
+ ":#{IceCube::I18n.l(time, format: '%Y%m%dT%H%M%SZ')}" # utc time
42
42
  else
43
- ";TZID=#{time.strftime('%Z:%Y%m%dT%H%M%S')}" # local time specified
43
+ ";TZID=#{IceCube::I18n.l(time, format: '%Z:%Y%m%dT%H%M%S')}" # local time specified
44
44
  end
45
45
  end
46
46
 
@@ -13,14 +13,18 @@ module IceCube
13
13
  end
14
14
 
15
15
  def to_s
16
- @types.each_with_object(@base || '') do |(type, segments), str|
16
+ string = @base || ''
17
+ @types.each do |type, segments|
17
18
  if f = self.class.formatter(type)
18
- str << ' ' << f.call(segments)
19
+ current = f.call(segments)
19
20
  else
20
21
  next if segments.empty?
21
- str << ' ' << self.class.sentence(segments)
22
+ current = self.class.sentence(segments)
22
23
  end
24
+ f = IceCube::I18n.t('ice_cube.string.format')[type] ? type : 'default'
25
+ string = IceCube::I18n.t("ice_cube.string.format.#{f}", rest: string, current: current)
23
26
  end
27
+ string
24
28
  end
25
29
 
26
30
  def self.formatter(type)
@@ -34,27 +38,33 @@ module IceCube
34
38
 
35
39
  module Helpers
36
40
 
37
- NUMBER_SUFFIX = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th']
38
- SPECIAL_SUFFIX = { 11 => 'th', 12 => 'th', 13 => 'th', 14 => 'th' }
39
-
40
41
  # influenced by ActiveSupport's to_sentence
41
42
  def sentence(array)
42
43
  case array.length
43
44
  when 0 ; ''
44
45
  when 1 ; array[0].to_s
45
- when 2 ; "#{array[0]} and #{array[1]}"
46
- else ; "#{array[0...-1].join(', ')}, and #{array[-1]}"
46
+ when 2 ; "#{array[0]}#{IceCube::I18n.t('ice_cube.array.two_words_connector')}#{array[1]}"
47
+ else ; "#{array[0...-1].join(IceCube::I18n.t('ice_cube.array.words_connector'))}#{IceCube::I18n.t('ice_cube.array.last_word_connector')}#{array[-1]}"
47
48
  end
48
49
  end
49
50
 
50
51
  def nice_number(number)
51
- return 'last' if number == -1
52
- suffix = SPECIAL_SUFFIX[number] || NUMBER_SUFFIX[number.abs % 10]
53
- if number < -1
54
- number.abs.to_s << suffix << ' to last'
55
- else
56
- number.to_s << suffix
57
- end
52
+ literal_ordinal(number) || ordinalize(number)
53
+ end
54
+
55
+ def ordinalize(number)
56
+ IceCube::I18n.t('ice_cube.integer.ordinal', number: number, ordinal: ordinal(number))
57
+ end
58
+
59
+ def literal_ordinal(number)
60
+ IceCube::I18n.t("ice_cube.integer.literal_ordinals")[number]
61
+ end
62
+
63
+ def ordinal(number)
64
+ ord = IceCube::I18n.t("ice_cube.integer.ordinals")[number] ||
65
+ IceCube::I18n.t("ice_cube.integer.ordinals")[number % 10] ||
66
+ IceCube::I18n.t('ice_cube.integer.ordinals')[:default]
67
+ number >= 0 ? ord : IceCube::I18n.t("ice_cube.integer.negative", ordinal: ord)
58
68
  end
59
69
 
60
70
  end
@@ -0,0 +1,24 @@
1
+ module IceCube
2
+ module I18n
3
+ def self.t(*args)
4
+ backend.t(*args)
5
+ end
6
+
7
+ def self.l(*args)
8
+ backend.l(*args)
9
+ end
10
+
11
+ def self.backend
12
+ @backend
13
+ end
14
+
15
+ def self.detect_backend!
16
+ require 'i18n'
17
+ ::I18n.load_path += Dir[File.expand_path('../../../config/locales/*{rb,yml}', __FILE__)]
18
+ @backend = ::I18n
19
+ rescue LoadError
20
+ require 'ice_cube/null_i18n'
21
+ @backend = NullI18n
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require 'yaml'
2
+
3
+ module IceCube
4
+ module NullI18n
5
+ def self.t(key, options = {})
6
+ base = key.to_s.split('.').reduce(config) { |hash, current_key| hash[current_key] }
7
+
8
+ base = base[options[:count] == 1 ? "one" : "other"] if options[:count]
9
+
10
+ if base.is_a?(Hash)
11
+ return base.each_with_object({}) do |(key, value), hash|
12
+ hash[key.is_a?(String) ? key.to_sym : key] = value
13
+ end
14
+ end
15
+
16
+ options.reduce(base) { |result, (find, replace)| result.gsub("%{#{find}}", "#{replace}") }
17
+ end
18
+
19
+ def self.l(date_or_time, options = {})
20
+ return date_or_time.strftime(options[:format]) if options[:format]
21
+ date_or_time.strftime(t('ice_cube.date.formats.default'))
22
+ end
23
+
24
+ def self.config
25
+ @config ||= YAML.load(File.read(File.join(File.dirname(__FILE__), '..', '..', 'config', 'locales', 'en.yml')))['en']
26
+ end
27
+ end
28
+ end
@@ -313,11 +313,14 @@ module IceCube
313
313
  def to_s
314
314
  pieces = []
315
315
  rd = recurrence_times_with_start_time - extimes
316
- pieces.concat rd.sort.map { |t| t.strftime(IceCube.to_s_time_format) }
316
+ pieces.concat rd.sort.map { |t| IceCube::I18n.l(t, format: IceCube.to_s_time_format) }
317
317
  pieces.concat rrules.map { |t| t.to_s }
318
- pieces.concat exrules.map { |t| "not #{t.to_s}" }
319
- pieces.concat extimes.sort.map { |t| "not on #{t.strftime(IceCube.to_s_time_format)}" }
320
- pieces.join(' / ')
318
+ pieces.concat exrules.map { |t| IceCube::I18n.t('ice_cube.not', target: t.to_s) }
319
+ pieces.concat extimes.sort.map { |t|
320
+ target = IceCube::I18n.l(t, format: IceCube.to_s_time_format)
321
+ IceCube::I18n.t('ice_cube.not_on', target: target)
322
+ }
323
+ pieces.join(IceCube::I18n.t('ice_cube.pieces_connector'))
321
324
  end
322
325
 
323
326
  # Serialize this schedule to_ical
@@ -51,7 +51,7 @@ module IceCube
51
51
 
52
52
  StringBuilder.register_formatter(:count) do |segments|
53
53
  count = segments.first
54
- "#{count} #{count == 1 ? 'time' : 'times'}"
54
+ IceCube::I18n.t('ice_cube.times', count: count)
55
55
  end
56
56
 
57
57
  end
@@ -35,7 +35,7 @@ module IceCube
35
35
  end
36
36
 
37
37
  def build_s(builder)
38
- builder.base = interval == 1 ? 'Daily' : "Every #{interval} days"
38
+ builder.base = IceCube::I18n.t('ice_cube.each_day', count: interval)
39
39
  end
40
40
 
41
41
  def build_hash(builder)
@@ -54,12 +54,13 @@ module IceCube
54
54
  validation_days.sort!
55
55
  # pick the right shortening, if applicable
56
56
  if validation_days == [0, 6]
57
- 'on Weekends'
57
+ IceCube::I18n.t('ice_cube.on_weekends')
58
58
  elsif validation_days == (1..5).to_a
59
- 'on Weekdays'
59
+ IceCube::I18n.t('ice_cube.on_weekdays')
60
60
  else
61
- segments = validation_days.map { |d| "#{Date::DAYNAMES[d]}s" }
62
- "on #{StringBuilder.sentence(segments)}"
61
+ day_names = ->(d){ "#{IceCube::I18n.t("ice_cube.days_on")[d]}" }
62
+ segments = validation_days.map(&day_names)
63
+ IceCube::I18n.t('ice_cube.on_days', days: StringBuilder.sentence(segments))
63
64
  end
64
65
  end
65
66
 
@@ -43,9 +43,9 @@ module IceCube
43
43
  end
44
44
 
45
45
  StringBuilder.register_formatter(:day_of_month) do |entries|
46
- str = "on the #{StringBuilder.sentence(entries)} "
47
- str << (entries.size == 1 ? 'day of the month' : 'days of the month')
48
- str
46
+ sentence = StringBuilder.sentence(entries)
47
+ str = IceCube::I18n.t('ice_cube.days_of_month', count: entries.size, segments: sentence)
48
+ IceCube::I18n.t('ice_cube.on', sentence: str)
49
49
  end
50
50
 
51
51
  end
@@ -45,7 +45,11 @@ module IceCube
45
45
  end
46
46
 
47
47
  def build_s(builder)
48
- builder.piece(:day_of_week) << "#{StringBuilder.nice_number(occ)} #{Date::DAYNAMES[day]}"
48
+ builder.piece(:day_of_week) << IceCube::I18n.t(
49
+ 'ice_cube.days_of_week',
50
+ segments: StringBuilder.nice_number(occ),
51
+ day: IceCube::I18n.t('ice_cube.date.day_names')[day]
52
+ )
49
53
  end
50
54
 
51
55
  def build_hash(builder)
@@ -62,7 +66,8 @@ module IceCube
62
66
  end
63
67
 
64
68
  StringBuilder.register_formatter(:day_of_week) do |segments|
65
- 'on the ' + segments.join(' and ')
69
+ sentence = segments.join(IceCube::I18n.t('ice_cube.array.two_words_connector'))
70
+ IceCube::I18n.t('ice_cube.on', sentence: sentence)
66
71
  end
67
72
 
68
73
  end
@@ -49,9 +49,9 @@ module IceCube
49
49
  end
50
50
 
51
51
  StringBuilder.register_formatter(:day_of_year) do |entries|
52
- str = "on the #{StringBuilder.sentence(entries)} "
53
- str << (entries.size == 1 ? 'day of the year' : 'days of the year')
54
- str
52
+ str = StringBuilder.sentence(entries)
53
+ sentence = IceCube::I18n.t('ice_cube.days_of_year', count: entries.size, segments: str)
54
+ IceCube::I18n.t('ice_cube.on', sentence: sentence)
55
55
  end
56
56
 
57
57
  end
@@ -44,8 +44,8 @@ module IceCube
44
44
  end
45
45
 
46
46
  StringBuilder.register_formatter(:hour_of_day) do |segments|
47
- str = "on the #{StringBuilder.sentence(segments)} "
48
- str << (segments.size == 1 ? 'hour of the day' : 'hours of the day')
47
+ str = StringBuilder.sentence(segments)
48
+ IceCube::I18n.t('ice_cube.at_hours_of_the_day', count: segments.size, segments: str)
49
49
  end
50
50
 
51
51
  end
@@ -35,7 +35,7 @@ module IceCube
35
35
  end
36
36
 
37
37
  def build_s(builder)
38
- builder.base = interval == 1 ? 'Hourly' : "Every #{interval} hours"
38
+ builder.base = IceCube::I18n.t("ice_cube.each_hour", count: interval)
39
39
  end
40
40
 
41
41
  def build_hash(builder)
@@ -43,8 +43,8 @@ module IceCube
43
43
  end
44
44
 
45
45
  StringBuilder.register_formatter(:minute_of_hour) do |segments|
46
- str = "on the #{StringBuilder.sentence(segments)} "
47
- str << (segments.size == 1 ? 'minute of the hour' : 'minutes of the hour')
46
+ str = StringBuilder.sentence(segments)
47
+ IceCube::I18n.t('ice_cube.on_minutes_of_hour', count: segments.size, segments: str)
48
48
  end
49
49
 
50
50
  end
@@ -35,7 +35,7 @@ module IceCube
35
35
  end
36
36
 
37
37
  def build_s(builder)
38
- builder.base = interval == 1 ? 'Minutely' : "Every #{interval} minutes"
38
+ builder.base = IceCube::I18n.t('ice_cube.each_minute', count: interval)
39
39
  end
40
40
 
41
41
  def build_hash(builder)
@@ -32,7 +32,7 @@ module IceCube
32
32
  end
33
33
 
34
34
  def build_s(builder)
35
- builder.piece(:month_of_year) << Date::MONTHNAMES[month]
35
+ builder.piece(:month_of_year) << IceCube::I18n.t("ice_cube.date.month_names")[month]
36
36
  end
37
37
 
38
38
  def build_hash(builder)
@@ -44,7 +44,7 @@ module IceCube
44
44
  end
45
45
 
46
46
  StringBuilder.register_formatter(:month_of_year) do |segments|
47
- "in #{StringBuilder.sentence(segments)}"
47
+ IceCube::I18n.t("ice_cube.in", target: StringBuilder.sentence(segments))
48
48
  end
49
49
 
50
50
  end
@@ -34,7 +34,7 @@ module IceCube
34
34
  end
35
35
 
36
36
  def build_s(builder)
37
- builder.base = interval == 1 ? 'Monthly' : "Every #{interval} months"
37
+ builder.base = IceCube::I18n.t('ice_cube.each_month', count: interval)
38
38
  end
39
39
 
40
40
  def build_hash(builder)
@@ -43,8 +43,8 @@ module IceCube
43
43
  end
44
44
 
45
45
  StringBuilder.register_formatter(:second_of_minute) do |segments|
46
- str = "on the #{StringBuilder.sentence(segments)} "
47
- str << (segments.size == 1 ? 'second of the minute' : 'seconds of the minute')
46
+ str = StringBuilder.sentence(segments)
47
+ IceCube::I18n.t('ice_cube.on_seconds_of_minute', count: segments.size, segments: str)
48
48
  end
49
49
 
50
50
  end
@@ -32,7 +32,7 @@ module IceCube
32
32
  end
33
33
 
34
34
  def build_s(builder)
35
- builder.base = interval == 1 ? 'Secondly' : "Every #{interval} seconds"
35
+ builder.base = IceCube::I18n.t("ice_cube.each_second", count: interval)
36
36
  end
37
37
 
38
38
  def build_hash(builder)
@@ -38,7 +38,8 @@ module IceCube
38
38
  end
39
39
 
40
40
  def build_s(builder)
41
- builder.piece(:until) << "until #{time.strftime(IceCube.to_s_time_format)}"
41
+ date = IceCube::I18n.l(time, format: IceCube.to_s_time_format)
42
+ builder.piece(:until) << IceCube::I18n.t('ice_cube.until', date: date)
42
43
  end
43
44
 
44
45
  def build_hash(builder)
@@ -44,7 +44,7 @@ module IceCube
44
44
  end
45
45
 
46
46
  def build_s(builder)
47
- builder.base = interval == 1 ? 'Weekly' : "Every #{interval} weeks"
47
+ builder.base = IceCube::I18n.t('ice_cube.each_week', count: interval)
48
48
  end
49
49
 
50
50
  def build_hash(builder)
@@ -32,7 +32,7 @@ module IceCube
32
32
  end
33
33
 
34
34
  def build_s(builder)
35
- builder.base = interval == 1 ? 'Yearly' : "Every #{interval} years"
35
+ builder.base = IceCube::I18n.t('ice_cube.each_year', count: interval)
36
36
  end
37
37
 
38
38
  def build_hash(builder)
@@ -1,5 +1,5 @@
1
1
  module IceCube
2
2
 
3
- VERSION = '0.13.0'
3
+ VERSION = '0.13.1'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ice_cube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.13.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Crepezzi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-27 00:00:00.000000000 Z
11
+ date: 2015-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: i18n
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: ice_cube is a recurring date library for Ruby. It allows for quick,
70
84
  programatic expansion of recurring date rules.
71
85
  email: john@crepezzi.com
@@ -81,6 +95,8 @@ files:
81
95
  - lib/ice_cube/errors/count_exceeded.rb
82
96
  - lib/ice_cube/errors/until_exceeded.rb
83
97
  - lib/ice_cube/flexible_hash.rb
98
+ - lib/ice_cube/i18n.rb
99
+ - lib/ice_cube/null_i18n.rb
84
100
  - lib/ice_cube/occurrence.rb
85
101
  - lib/ice_cube/parsers/hash_parser.rb
86
102
  - lib/ice_cube/parsers/ical_parser.rb
@@ -139,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
155
  version: '0'
140
156
  requirements: []
141
157
  rubyforge_project: ice-cube
142
- rubygems_version: 2.4.6
158
+ rubygems_version: 2.4.8
143
159
  signing_key:
144
160
  specification_version: 4
145
161
  summary: Ruby Date Recurrence Library