iso8601 0.9.1 → 0.10.0

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
- SHA1:
3
- metadata.gz: 7914ac8d5219dd6b3fe4628c4d7ad8f152e8e2c6
4
- data.tar.gz: 2cbee2da317086254dc93762a8513d20b7e68c0e
2
+ SHA256:
3
+ metadata.gz: 3c7b4ba1e602e306fa8bc033780f6a4f239aa2d592b4721f78e17dfc20bf61bc
4
+ data.tar.gz: e7eeec472d8ed97d6ca44790b633c5ce881c26ae7363db7d6f786b7c8032b6e1
5
5
  SHA512:
6
- metadata.gz: 6a32d6585c8d0a226317237e2741ba15a7bc156a727ce4e73c04d04bcc85f987bfb1f6f6a29b40508de57ee4dbe96ad6b036306449479a3c19a4ba947cf2d88e
7
- data.tar.gz: fb5653793de6ec27dc4ef8acef0364ad9744fc3770cf0606f4071b07cd4057afb3aa41c9d478bf588527cbda0bde82dddc7a2d072885678680becac6b537a339
6
+ metadata.gz: 6a2c878595f95c960deb2c70ea2a27adf74930545518147d3d0364ef23874a4efb54c5b6f640ef4df463994eed013afb78b3d7002b7796ef588873f966907cb6
7
+ data.tar.gz: ea64e2bb8a9bebb77f8ad5d4611db9c72904e815abfd8047843b0dee1c5f4c6b9e95d081c23738f4098c80229774f707c598e61437e698c8f5b93f5d1448c9d1
@@ -1,3 +1,9 @@
1
+ ## 0.10.0
2
+
3
+ * Fix `TimeInterval` with `<duration>/<end>` patterns and leap years.
4
+ * Fix decimal fractions on date atoms. **WARNING** some duration patterns are
5
+ no longer valid.
6
+
1
7
  ## 0.9.1
2
8
 
3
9
  * Fix `Duration#to_pattern` for negative durations based on a `Numeric` (thanks @figwit).
@@ -26,10 +26,9 @@ bundle install
26
26
  Add your code and tests and check it passes:
27
27
 
28
28
  ```sh
29
- make test # mri, rbx, jruby
29
+ make test # mri, jruby
30
30
  # or
31
31
  make mri-test
32
- make rbx-test
33
32
  make jruby-test
34
33
  ```
35
34
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # ISO8601
1
+ u ISO8601
2
2
 
3
3
  Version 0.9.0 is **not compatible** with previous versions. Atoms and Durations
4
4
  changed their interface when treating base dates so it is only applied when
@@ -24,7 +24,6 @@ times) standard.
24
24
  ## Supported versions
25
25
 
26
26
  * MRI 2.x
27
- * RBX 2
28
27
  * JRuby 9
29
28
 
30
29
  ## Documentation
@@ -49,7 +48,6 @@ take a look to the implementation notes:
49
48
  You can alse target specific runtimes:
50
49
 
51
50
  $ make mri-test
52
- $ make rbx-test
53
51
  $ make jruby-test
54
52
 
55
53
  ### Raw
data/Rakefile CHANGED
@@ -1,2 +1 @@
1
- #!/usr/bin/env rake
2
1
  require 'bundler/gem_tasks'
@@ -1,8 +1,7 @@
1
- # encoding: utf-8
2
-
3
1
  $LOAD_PATH.push File.expand_path('../lib', __FILE__)
4
2
  require 'iso8601/version'
5
3
 
4
+ # rubocop:disable Metrics/BlockLength
6
5
  Gem::Specification.new do |s|
7
6
  s.name = 'iso8601'
8
7
  s.version = ISO8601::VERSION
@@ -11,14 +10,14 @@ Gem::Specification.new do |s|
11
10
  s.email = 'arnau.siches@gmail.com'
12
11
  s.homepage = 'https://github.com/arnau/ISO8601'
13
12
  s.summary = "Ruby parser to work with ISO 8601 dateTimes and durations - http://en.wikipedia.org/wiki/ISO_8601"
14
- s.description = <<-EOD
13
+ s.description = <<-DESC
15
14
  ISO8601 is a simple implementation in Ruby of the ISO 8601 (Data elements and
16
15
  interchange formats - Information interchange - Representation of dates
17
16
  and times) standard.
18
- EOD
17
+ DESC
19
18
  s.license = 'MIT'
20
19
  s.rubyforge_project = 'iso8601'
21
- s.files = %W(CHANGELOG.md
20
+ s.files = %w[CHANGELOG.md
22
21
  CONTRIBUTING.md
23
22
  Gemfile
24
23
  LICENSE
@@ -56,14 +55,14 @@ Gem::Specification.new do |s|
56
55
  spec/iso8601/time_spec.rb
57
56
  spec/iso8601/weeks_spec.rb
58
57
  spec/iso8601/years_spec.rb
59
- spec/spec_helper.rb)
58
+ spec/spec_helper.rb]
60
59
  s.test_files = s.files.grep(%r{^spec/})
61
60
  s.require_paths = ['lib']
62
61
 
63
62
  s.has_rdoc = 'yard'
64
63
  s.required_ruby_version = '>= 2.0.0'
65
- s.add_development_dependency 'rspec', '~> 3.4'
66
- s.add_development_dependency 'rubocop', '~> 0.40'
67
- s.add_development_dependency 'pry', '~> 0.10.3'
68
- s.add_development_dependency 'pry-doc', '~> 0.8.0'
64
+ s.add_development_dependency 'rspec', '~> 3.6'
65
+ s.add_development_dependency 'rubocop', '~> 0.50'
66
+ s.add_development_dependency 'pry', '~> 0.11.0'
67
+ s.add_development_dependency 'pry-doc', '~> 0.11.0'
69
68
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'time'
4
2
  require 'forwardable'
5
3
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  module Atomic
5
3
  include Comparable
@@ -27,7 +25,7 @@ module ISO8601
27
25
  #
28
26
  # @return [String]
29
27
  def to_s
30
- (value.zero?) ? '' : "#{value}#{symbol}"
28
+ value.zero? ? '' : "#{value}#{symbol}"
31
29
  end
32
30
 
33
31
  ##
@@ -66,13 +64,13 @@ module ISO8601
66
64
  ##
67
65
  # Validates the atom is a Numeric
68
66
  def valid_atom?(atom)
69
- fail ISO8601::Errors::TypeError,
70
- "The atom argument for #{self.class} should be a Numeric value." unless atom.is_a?(Numeric)
67
+ raise(ISO8601::Errors::TypeError, "The atom argument for #{self.class} should be a Numeric value.") \
68
+ unless atom.is_a?(Numeric)
71
69
  end
72
70
 
73
71
  def valid_base?(base)
74
- fail ISO8601::Errors::TypeError,
75
- "The base argument for #{self.class} should be a ISO8601::DateTime instance or nil." unless base.is_a?(ISO8601::DateTime) || base.nil?
72
+ raise(ISO8601::Errors::TypeError, "The base argument for #{self.class} should be a ISO8601::DateTime instance or nil.") \
73
+ unless base.is_a?(ISO8601::DateTime) || base.nil?
76
74
  end
77
75
  end
78
76
  end
@@ -112,6 +112,7 @@ module ISO8601
112
112
  # @param [String] input
113
113
  #
114
114
  # @return [Array<Integer>]
115
+ # rubocop:disable Metrics/AbcSize
115
116
  def atomize(input)
116
117
  week_date = parse_weekdate(input)
117
118
  return atomize_week_date(input, week_date[2], week_date[1]) unless week_date.nil?
@@ -121,7 +122,7 @@ module ISO8601
121
122
 
122
123
  _, year, separator, month, day = parse_date(input)
123
124
 
124
- fail ISO8601::Errors::UnknownPattern, @original if year.nil?
125
+ raise(ISO8601::Errors::UnknownPattern, @original) if year.nil?
125
126
 
126
127
  @separator = separator
127
128
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # A DateTime representation
@@ -59,7 +57,7 @@ module ISO8601
59
57
  def to_a
60
58
  [year, month, day, hour, minute, second, zone]
61
59
  end
62
- alias_method :atoms, :to_a
60
+ alias atoms to_a
63
61
 
64
62
  ##
65
63
  # Converts DateTime to a floating point number of seconds since the Epoch.
@@ -98,8 +96,9 @@ module ISO8601
98
96
  # It enhances the parsing capabilities of the native DateTime.
99
97
  #
100
98
  # @param [String] date_time The ISO representation
99
+ # rubocop:disable Metrics/AbcSize
101
100
  def parse(date_time)
102
- fail ISO8601::Errors::UnknownPattern, date_time if date_time.empty?
101
+ raise(ISO8601::Errors::UnknownPattern, date_time) if date_time.empty?
103
102
 
104
103
  date, time = date_time.split('T')
105
104
 
@@ -107,10 +106,8 @@ module ISO8601
107
106
  time_atoms = Array(time && parse_time(time))
108
107
  separators = [date_atoms.pop, time_atoms.pop]
109
108
 
110
- fail ISO8601::Errors::UnknownPattern,
111
- @original unless valid_representation?(date_atoms, time_atoms)
112
- fail ISO8601::Errors::UnknownPattern,
113
- @original unless valid_separators?(separators)
109
+ raise(ISO8601::Errors::UnknownPattern, @original) unless valid_representation?(date_atoms, time_atoms)
110
+ raise(ISO8601::Errors::UnknownPattern, @original) unless valid_separators?(separators)
114
111
 
115
112
  ::DateTime.new(*(date_atoms + time_atoms).compact)
116
113
  end
@@ -146,7 +143,7 @@ module ISO8601
146
143
  return true if separators.length == 1 || separators[0] == :ignore
147
144
 
148
145
  unless separators.all?(&:empty?)
149
- return false if (separators.first.length != separators.last.length)
146
+ return false if separators.first.length != separators.last.length
150
147
  end
151
148
 
152
149
  true
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # The Days atom in a {ISO8601::Duration}
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # A duration representation. When no base is provided, all atoms use an
@@ -24,6 +22,7 @@ module ISO8601
24
22
  # di == dp # => true
25
23
  # di == ds # => true
26
24
  #
25
+ # rubocop:disable Metrics/ClassLength
27
26
  class Duration
28
27
  ##
29
28
  # @param [String, Numeric] input The duration pattern
@@ -42,7 +41,7 @@ module ISO8601
42
41
  ##
43
42
  # @return [String] The string representation of the duration
44
43
  attr_reader :pattern
45
- alias_method :to_s, :pattern
44
+ alias to_s pattern
46
45
 
47
46
  ##
48
47
  # @return [ISO8601::Years] The years of the duration
@@ -188,7 +187,7 @@ module ISO8601
188
187
  #
189
188
  # @return [Hash<Float>]
190
189
  def atomize(input)
191
- duration = parse(input) || fail(ISO8601::Errors::UnknownPattern, input)
190
+ duration = parse(input) || raise(ISO8601::Errors::UnknownPattern, input)
192
191
 
193
192
  valid_pattern?(duration)
194
193
 
@@ -212,7 +211,7 @@ module ISO8601
212
211
  end
213
212
 
214
213
  def sign_to_i(sign)
215
- (sign == '-') ? -1 : 1
214
+ sign == '-' ? -1 : 1
216
215
  end
217
216
 
218
217
  def parse(input)
@@ -220,9 +219,9 @@ module ISO8601
220
219
  (?<sign>\+|-)?
221
220
  P(?:
222
221
  (?:
223
- (?:(?<years>\d+(?:[,.]\d+)?)Y)?
224
- (?:(?<months>\d+(?:[.,]\d+)?)M)?
225
- (?:(?<days>\d+(?:[.,]\d+)?)D)?
222
+ (?:(?<years>\d+)Y)?
223
+ (?:(?<months>\d+)M)?
224
+ (?:(?<days>\d+)D)?
226
225
  (?<time>T
227
226
  (?:(?<hours>\d+(?:[.,]\d+)?)H)?
228
227
  (?:(?<minutes>\d+(?:[.,]\d+)?)M)?
@@ -238,10 +237,11 @@ module ISO8601
238
237
  # @param [Numeric] value The seconds to promote
239
238
  #
240
239
  # @return [ISO8601::Duration]
240
+ # rubocop:disable Metrics/AbcSize
241
241
  def seconds_to_iso(value)
242
242
  return self.class.new('PT0S') if value.zero?
243
243
 
244
- sign_str = (value < 0) ? '-' : ''
244
+ sign_str = value < 0 ? '-' : ''
245
245
  value = value.abs
246
246
 
247
247
  y, y_mod = decompose_atom(value, years)
@@ -266,11 +266,11 @@ module ISO8601
266
266
  end
267
267
 
268
268
  def to_time_s(*args)
269
- (args.map(&:value).reduce(&:+) > 0) ? "T#{args.map(&:to_s).join('')}" : ''
269
+ args.map(&:value).reduce(&:+) > 0 ? "T#{args.map(&:to_s).join('')}" : ''
270
270
  end
271
271
 
272
272
  def validate_base(input)
273
- fail ISO8601::Errors::TypeError unless input.nil? || input.is_a?(ISO8601::DateTime)
273
+ raise(ISO8601::Errors::TypeError) unless input.nil? || input.is_a?(ISO8601::DateTime)
274
274
 
275
275
  input
276
276
  end
@@ -288,20 +288,19 @@ module ISO8601
288
288
  missing_time = (weeks.nil? && !components[:time].nil? && time.empty?)
289
289
  empty = missing_time || all.empty?
290
290
 
291
- fail ISO8601::Errors::UnknownPattern,
292
- @pattern if empty
291
+ raise(ISO8601::Errors::UnknownPattern, @pattern) if empty
293
292
  end
294
293
 
295
294
  def valid_fractions?(values)
296
295
  values = values.reject(&:zero?)
297
- fractions = values.select { |a| (a % 1) != 0 }
296
+ fractions = values.reject { |a| (a % 1).zero? }
298
297
  consistent = (fractions.size == 1 && fractions.last != values.last)
299
298
 
300
- fail ISO8601::Errors::InvalidFractions if fractions.size > 1 || consistent
299
+ raise(ISO8601::Errors::InvalidFractions) if fractions.size > 1 || consistent
301
300
  end
302
301
 
303
302
  def compare_bases(other, base)
304
- fail ISO8601::Errors::DurationBaseError, other if base != other.base
303
+ raise(ISO8601::Errors::DurationBaseError, other) if base != other.base
305
304
  end
306
305
 
307
306
  ##
@@ -321,7 +320,7 @@ module ISO8601
321
320
  when Numeric
322
321
  other.to_f
323
322
  else
324
- fail(ISO8601::Errors::TypeError, other)
323
+ raise(ISO8601::Errors::TypeError, other)
325
324
  end
326
325
  end
327
326
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # The Hours atom in a {ISO8601::Duration}
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # The Minutes atom in a {ISO8601::Duration}
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # A Months atom in a {ISO8601::Duration}
@@ -36,7 +34,7 @@ module ISO8601
36
34
  # @return [Numeric]
37
35
  def factor(base = nil)
38
36
  return AVERAGE_FACTOR if base.nil?
39
- return zero_calculation(base) if atom.zero?
37
+ return calculation(1, base) if atom.zero?
40
38
 
41
39
  calculation(atom, base)
42
40
  end
@@ -49,12 +47,7 @@ module ISO8601
49
47
  #
50
48
  # @return [Numeric]
51
49
  def to_seconds(base = nil)
52
- valid_base?(base)
53
-
54
- return (AVERAGE_FACTOR * atom) if base.nil?
55
- return zero_calculation(base) if atom.zero?
56
-
57
- calculation(atom, base) * atom
50
+ factor(base) * atom
58
51
  end
59
52
 
60
53
  ##
@@ -67,27 +60,20 @@ module ISO8601
67
60
 
68
61
  private
69
62
 
70
- def zero_calculation(base)
71
- month = (base.month <= 12) ? base.month : (base.month % 12)
72
- year = base.year + ((base.month) / 12).to_i
73
-
74
- (::Time.utc(year, month) - ::Time.utc(base.year, base.month))
75
- end
76
-
77
63
  def calculation(atom, base)
78
64
  initial = base.month + atom
79
65
  if initial <= 0
80
66
  month = base.month + atom
81
67
 
82
- if initial % 12 == 0
68
+ if (initial % 12).zero?
83
69
  year = base.year + (initial / 12) - 1
84
70
  month = 12
85
71
  else
86
72
  year = base.year + (initial / 12).floor
87
- month = (12 + initial > 0) ? (12 + initial) : (12 + (initial % -12))
73
+ month = 12 + initial > 0 ? (12 + initial) : (12 + (initial % -12))
88
74
  end
89
75
  else
90
- month = (initial <= 12) ? initial : (initial % 12)
76
+ month = initial <= 12 ? initial : (initial % 12)
91
77
  month = 12 if month.zero?
92
78
  year = base.year + ((base.month + atom) / 12).to_i
93
79
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # The Seconds atom in a {ISO8601::Duration}
@@ -113,12 +113,12 @@ module ISO8601
113
113
  # @param [String] input
114
114
  #
115
115
  # @return [Array<Integer, Float>]
116
+ # rubocop:disable Metrics/AbcSize
116
117
  def atomize(input)
117
118
  _, time, zone = parse_timezone(input)
118
119
  _, hour, separator, minute, second = parse_time(time)
119
120
 
120
- fail ISO8601::Errors::UnknownPattern,
121
- @original if hour.nil?
121
+ raise(ISO8601::Errors::UnknownPattern, @original) if hour.nil?
122
122
 
123
123
  @separator = separator
124
124
  require_separator = require_separator(minute)
@@ -129,8 +129,7 @@ module ISO8601
129
129
 
130
130
  atoms = [hour, minute, second, zone].compact
131
131
 
132
- fail ISO8601::Errors::UnknownPattern,
133
- @original unless valid_zone?(zone, require_separator)
132
+ raise(ISO8601::Errors::UnknownPattern, @original) unless valid_zone?(zone, require_separator)
134
133
 
135
134
  atoms
136
135
  end
@@ -180,7 +179,7 @@ module ISO8601
180
179
  #
181
180
  # @return [::DateTime]
182
181
  def compose(atoms, base)
183
- ::DateTime.new(*[base.year, base.month, base.day], *atoms)
182
+ ::DateTime.new(base.year, base.month, base.day, *atoms)
184
183
  rescue ArgumentError
185
184
  raise ISO8601::Errors::RangeError, @original
186
185
  end
@@ -95,7 +95,7 @@ module ISO8601
95
95
  when Array
96
96
  from_atoms(input)
97
97
  else
98
- fail(ISO8601::Errors::TypeError, 'The pattern must be a String or a Hash')
98
+ raise(ISO8601::Errors::TypeError, 'The pattern must be a String or a Hash')
99
99
  end
100
100
  end
101
101
 
@@ -111,14 +111,14 @@ module ISO8601
111
111
  #
112
112
  # @return [ISO8601::DateTime] start time
113
113
  attr_reader :first
114
- alias_method :start_time, :first
114
+ alias start_time first
115
115
 
116
116
  ##
117
117
  # The end time (last) of the interval.
118
118
  #
119
119
  # @return [ISO8601::DateTime] end time
120
120
  attr_reader :last
121
- alias_method :end_time, :last
121
+ alias end_time last
122
122
 
123
123
  ##
124
124
  # The pattern for the interval.
@@ -129,7 +129,7 @@ module ISO8601
129
129
 
130
130
  "#{@atoms.first}/#{@atoms.last}"
131
131
  end
132
- alias_method :to_s, :pattern
132
+ alias to_s pattern
133
133
 
134
134
  ##
135
135
  # The size of the interval. If any bound is a Duration, the
@@ -137,8 +137,8 @@ module ISO8601
137
137
  #
138
138
  # @return [Float] Size of the interval in seconds
139
139
  attr_reader :size
140
- alias_method :to_f, :size
141
- alias_method :length, :size
140
+ alias to_f size
141
+ alias length size
142
142
 
143
143
  ##
144
144
  # Checks if the interval is empty.
@@ -159,13 +159,13 @@ module ISO8601
159
159
  #
160
160
  # @return [Boolean]
161
161
  def include?(other)
162
- fail(ISO8601::Errors::TypeError, 'The parameter must respond_to #to_time') \
162
+ raise(ISO8601::Errors::TypeError, "The parameter must respond_to #to_time") \
163
163
  unless other.respond_to?(:to_time)
164
164
 
165
165
  (first.to_time <= other.to_time &&
166
166
  last.to_time >= other.to_time)
167
167
  end
168
- alias_method :member?, :include?
168
+ alias member? include?
169
169
 
170
170
  ##
171
171
  # Returns true if the interval is a subset of the given interval.
@@ -177,7 +177,7 @@ module ISO8601
177
177
  #
178
178
  # @return [Boolean]
179
179
  def subset?(other)
180
- fail(ISO8601::Errors::TypeError, "The parameter must be an instance of #{self.class}") \
180
+ raise(ISO8601::Errors::TypeError, "The parameter must be an instance of #{self.class}") \
181
181
  unless other.is_a?(self.class)
182
182
 
183
183
  other.include?(first) && other.include?(last)
@@ -193,7 +193,7 @@ module ISO8601
193
193
  #
194
194
  # @return [Boolean]
195
195
  def superset?(other)
196
- fail(ISO8601::Errors::TypeError, "The parameter must be an instance of #{self.class}") \
196
+ raise(ISO8601::Errors::TypeError, "The parameter must be an instance of #{self.class}") \
197
197
  unless other.is_a?(self.class)
198
198
 
199
199
  include?(other.first) && include?(other.last)
@@ -209,8 +209,7 @@ module ISO8601
209
209
  #
210
210
  # @return [Boolean]
211
211
  def intersect?(other)
212
- fail(ISO8601::Errors::TypeError,
213
- "The parameter must be an instance of #{self.class}") \
212
+ raise(ISO8601::Errors::TypeError, "The parameter must be an instance of #{self.class}") \
214
213
  unless other.is_a?(self.class)
215
214
 
216
215
  include?(other.first) || include?(other.last)
@@ -225,7 +224,7 @@ module ISO8601
225
224
  #
226
225
  # @return [Boolean]
227
226
  def intersection(other)
228
- fail(ISO8601::Errors::IntervalError, "The intervals are disjoint") \
227
+ raise(ISO8601::Errors::IntervalError, "The intervals are disjoint") \
229
228
  if disjoint?(other) && other.disjoint?(self)
230
229
 
231
230
  return self if subset?(other)
@@ -274,14 +273,30 @@ module ISO8601
274
273
  @atoms.hash
275
274
  end
276
275
 
276
+ def self.valid_date_time?(time, message = "Expected a ISO8601::DateTime")
277
+ return true if time.is_a?(ISO8601::DateTime)
278
+
279
+ raise(ISO8601::Errors::TypeError, message)
280
+ end
281
+
282
+ def self.guard_from_datetimes(atoms, message)
283
+ atoms.all? { |x| valid_date_time?(x, message) }
284
+ end
285
+
286
+ def self.guard_from_duration(atoms, message)
287
+ raise(ISO8601::Errors::TypeError, message) \
288
+ unless atoms.any? { |x| x.is_a?(ISO8601::Duration) } &&
289
+ atoms.any? { |x| x.is_a?(ISO8601::DateTime) }
290
+ end
291
+
277
292
  private
278
293
 
279
294
  # Initialize a TimeInterval ISO8601 by a pattern. If you initialize it with
280
295
  # a duration pattern, the second argument is mandatory because you need to
281
296
  # specify an start/end point to calculate the interval.
282
297
  #
283
- # @param [String] pattern This parameter define a full time interval. These
284
- # patterns are defined in the ISO8601:
298
+ # @param [String] pattern This parameter defines a full time interval.
299
+ # Valid patterns are defined in the ISO8601 as:
285
300
  # * <start_time>/<end_time>
286
301
  # * <start_time>/<duration>
287
302
  # * <duration>/<end_time>
@@ -289,19 +304,21 @@ module ISO8601
289
304
  # @raise [ISO8601::Errors::UnknownPattern] If given pattern is not a valid
290
305
  # ISO8601 pattern.
291
306
  def parse(pattern)
292
- fail(ISO8601::Errors::UnknownPattern, pattern) unless pattern.include?('/')
307
+ raise(ISO8601::Errors::UnknownPattern, pattern) unless pattern.include?('/')
293
308
 
294
309
  @pattern = pattern
295
310
  subpatterns = pattern.split('/')
296
311
 
297
- fail(ISO8601::Errors::UnknownPattern, pattern) if subpatterns.size != 2
312
+ raise(ISO8601::Errors::UnknownPattern, pattern) if subpatterns.size != 2
298
313
 
299
- @atoms = subpatterns.map { |x| parse_subpattern(x) }
314
+ fst = parse_start_subpattern(subpatterns.first)
315
+ snd = parse_subpattern(subpatterns.last)
316
+ @atoms = [fst, snd]
300
317
  @first, @last, @size = limits(@atoms)
301
318
  end
302
319
 
303
320
  def sort_pair(a, b)
304
- (a.first < b.first) ? [a, b] : [b, a]
321
+ a.first < b.first ? [a, b] : [b, a]
305
322
  end
306
323
 
307
324
  ##
@@ -316,6 +333,12 @@ module ISO8601
316
333
  ISO8601::DateTime.new(pattern)
317
334
  end
318
335
 
336
+ def parse_start_subpattern(pattern)
337
+ return ISO8601::Duration.new("-#{pattern}") if pattern.start_with?('P')
338
+
339
+ ISO8601::DateTime.new(pattern)
340
+ end
341
+
319
342
  ##
320
343
  # See the constructor methods.
321
344
  #
@@ -334,13 +357,10 @@ module ISO8601
334
357
  def limits(atoms)
335
358
  valid_atoms?(atoms)
336
359
 
337
- if atoms.none? { |x| x.is_a?(ISO8601::Duration) }
338
- return tuple_by_both(atoms)
339
- elsif atoms.first.is_a?(ISO8601::Duration)
340
- return tuple_by_end(atoms)
341
- else
342
- return tuple_by_start(atoms)
343
- end
360
+ return tuple_by_both(atoms) if atoms.none? { |x| x.is_a?(ISO8601::Duration) }
361
+ return tuple_by_end(atoms) if atoms.first.is_a?(ISO8601::Duration)
362
+
363
+ tuple_by_start(atoms)
344
364
  end
345
365
 
346
366
  def tuple_by_both(atoms)
@@ -351,9 +371,9 @@ module ISO8601
351
371
 
352
372
  def tuple_by_end(atoms)
353
373
  seconds = atoms.first.to_seconds(atoms.last)
354
- [(atoms.last - seconds),
374
+ [(atoms.last + seconds),
355
375
  atoms.last,
356
- seconds]
376
+ seconds.abs]
357
377
  end
358
378
 
359
379
  def tuple_by_start(atoms)
@@ -364,29 +384,12 @@ module ISO8601
364
384
  end
365
385
 
366
386
  def valid_atoms?(atoms)
367
- fail(ISO8601::Errors::UnknownPattern,
368
- "The pattern of a time interval can't be <duration>/<duration>") \
387
+ raise(ISO8601::Errors::UnknownPattern, "The pattern of a time interval can't be <duration>/<duration>") \
369
388
  if atoms.all? { |x| x.is_a?(ISO8601::Duration) }
370
389
  end
371
390
 
372
391
  def valid_date_time?(time)
373
- self.valid_date_time?(time)
374
- end
375
-
376
- def self.valid_date_time?(time, message = 'Expected a ISO8601::DateTime')
377
- return true if time.is_a?(ISO8601::DateTime)
378
-
379
- fail(ISO8601::Errors::TypeError, message)
380
- end
381
-
382
- def self.guard_from_datetimes(atoms, message)
383
- atoms.all? { |x| valid_date_time?(x, message) }
384
- end
385
-
386
- def self.guard_from_duration(atoms, message)
387
- fail(ISO8601::Errors::TypeError, message) \
388
- unless atoms.any? { |x| x.is_a?(ISO8601::Duration) } &&
389
- atoms.any? { |x| x.is_a?(ISO8601::DateTime) }
392
+ valid_date_time?(time)
390
393
  end
391
394
  end
392
395
  end
@@ -1,5 +1,5 @@
1
1
  module ISO8601
2
2
  ##
3
3
  # The gem version
4
- VERSION = '0.9.1'
4
+ VERSION = '0.10.0'.freeze
5
5
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # A Weeks atom in a {ISO8601::Duration}
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module ISO8601
4
2
  ##
5
3
  # A Years atom in a {ISO8601::Duration}
@@ -47,16 +45,18 @@ module ISO8601
47
45
  ##
48
46
  # The amount of seconds
49
47
  #
48
+ # TODO: Fractions of year will fail
49
+ #
50
50
  # @param [ISO8601::DateTime, nil] base (nil) The base datetime to compute
51
51
  # the year length.
52
52
  #
53
53
  # @return [Numeric]
54
54
  def to_seconds(base = nil)
55
55
  valid_base?(base)
56
+ return factor(base) * atom if base.nil?
57
+ target = ::Time.utc(base.year + atom.to_i, base.month, base.day, base.hour, base.minute, base.second)
56
58
 
57
- return (AVERAGE_FACTOR * atom) if base.nil?
58
-
59
- ::Time.utc(year(atom, base)) - ::Time.utc(base.year)
59
+ target - base.to_time
60
60
  end
61
61
 
62
62
  ##
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'spec_helper'
4
2
 
5
3
  describe ISO8601::DateTime do
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'spec_helper'
4
2
 
5
3
  RSpec.describe ISO8601::Duration do
@@ -22,21 +20,13 @@ RSpec.describe ISO8601::Duration do
22
20
  end
23
21
 
24
22
  it "should raise a ISO8601::Errors::InvalidFraction for any invalid patterns" do
25
- expect { ISO8601::Duration.new('P1.5Y0.5M') }.to raise_error(ISO8601::Errors::InvalidFractions)
26
- expect { ISO8601::Duration.new('P1.5Y1M') }.to raise_error(ISO8601::Errors::InvalidFractions)
27
- expect { ISO8601::Duration.new('P1.5MT10.5S') }.to raise_error(ISO8601::Errors::InvalidFractions)
23
+ expect { ISO8601::Duration.new('PT10.5M10.5S') }.to raise_error(ISO8601::Errors::InvalidFractions)
28
24
  end
29
25
 
30
26
  it "should parse any allowed pattern" do
31
27
  expect { ISO8601::Duration.new('P1Y') }.to_not raise_error
32
- expect { ISO8601::Duration.new('P0.5Y') }.to_not raise_error
33
- expect { ISO8601::Duration.new('P0,5Y') }.to_not raise_error
34
28
  expect { ISO8601::Duration.new('P1Y1M') }.to_not raise_error
35
- expect { ISO8601::Duration.new('P1Y0.5M') }.to_not raise_error
36
- expect { ISO8601::Duration.new('P1Y0,5M') }.to_not raise_error
37
29
  expect { ISO8601::Duration.new('P1Y1M1D') }.to_not raise_error
38
- expect { ISO8601::Duration.new('P1Y1M0.5D') }.to_not raise_error
39
- expect { ISO8601::Duration.new('P1Y1M0,5D') }.to_not raise_error
40
30
  expect { ISO8601::Duration.new('P1Y1M1DT1H') }.to_not raise_error
41
31
  expect { ISO8601::Duration.new('P1Y1M1DT0.5H') }.to_not raise_error
42
32
  expect { ISO8601::Duration.new('P1Y1M1DT0,5H') }.to_not raise_error
@@ -268,8 +258,8 @@ RSpec.describe ISO8601::Duration do
268
258
  end
269
259
 
270
260
  it "should equal by hash identity" do
271
- expect(ISO8601::Duration.new('PT1H').eql? ISO8601::Duration.new('PT1H')).to be_truthy
272
- expect(ISO8601::Duration.new('PT1H').eql? ISO8601::Duration.new('PT60M')).to be_falsy
261
+ expect(ISO8601::Duration.new('PT1H').eql?(ISO8601::Duration.new('PT1H'))).to be_truthy
262
+ expect(ISO8601::Duration.new('PT1H').eql?(ISO8601::Duration.new('PT60M'))).to be_falsy
273
263
  end
274
264
  end
275
265
 
@@ -5,17 +5,17 @@ RSpec.describe ISO8601::Hours do
5
5
  let(:subject) { ISO8601::Hours.new(1) }
6
6
 
7
7
  it "should respond to the Atomic interface" do
8
- [:factor,
9
- :to_seconds,
10
- :symbol,
11
- :to_i,
12
- :to_f,
13
- :to_s,
14
- :value,
15
- :<=>,
16
- :eql?,
17
- :hash,
18
- :valid_atom?].each { |m| expect(subject).to respond_to(m) }
8
+ %i[factor
9
+ to_seconds
10
+ symbol
11
+ to_i
12
+ to_f
13
+ to_s
14
+ value
15
+ <=>
16
+ eql?
17
+ hash
18
+ valid_atom?].each { |m| expect(subject).to respond_to(m) }
19
19
  end
20
20
  end
21
21
 
@@ -5,17 +5,17 @@ RSpec.describe ISO8601::Minutes do
5
5
  let(:subject) { ISO8601::Minutes.new(1) }
6
6
 
7
7
  it "should respond to the Atomic interface" do
8
- [:factor,
9
- :to_seconds,
10
- :symbol,
11
- :to_i,
12
- :to_f,
13
- :to_s,
14
- :value,
15
- :<=>,
16
- :eql?,
17
- :hash,
18
- :valid_atom?].each { |m| expect(subject).to respond_to(m) }
8
+ %i[factor
9
+ to_seconds
10
+ symbol
11
+ to_i
12
+ to_f
13
+ to_s
14
+ value
15
+ <=>
16
+ eql?
17
+ hash
18
+ valid_atom?].each { |m| expect(subject).to respond_to(m) }
19
19
  end
20
20
  end
21
21
 
@@ -7,21 +7,25 @@ RSpec.describe ISO8601::Months do
7
7
  let(:common_february) { ISO8601::DateTime.new('2010-02-01') }
8
8
  let(:leap_february) { ISO8601::DateTime.new('2000-02-01') }
9
9
 
10
+ let(:common_december) { ISO8601::DateTime.new('2017-12-01') }
11
+ let(:leap_december) { ISO8601::DateTime.new('2000-12-01') }
12
+
13
+
10
14
  describe 'Atomic' do
11
15
  let(:subject) { ISO8601::Months.new(1) }
12
16
 
13
17
  it "should respond to the Atomic interface" do
14
- [:factor,
15
- :to_seconds,
16
- :symbol,
17
- :to_i,
18
- :to_f,
19
- :to_s,
20
- :value,
21
- :<=>,
22
- :eql?,
23
- :hash,
24
- :valid_atom?].each { |m| expect(subject).to respond_to(m) }
18
+ %i[factor
19
+ to_seconds
20
+ symbol
21
+ to_i
22
+ to_f
23
+ to_s
24
+ value
25
+ <=>
26
+ eql?
27
+ hash
28
+ valid_atom?].each { |m| expect(subject).to respond_to(m) }
25
29
  end
26
30
  end
27
31
 
@@ -29,6 +33,7 @@ RSpec.describe ISO8601::Months do
29
33
  it "should return the Month factor" do
30
34
  expect { ISO8601::Months.new(1).factor }.to_not raise_error
31
35
  expect(ISO8601::Months.new(2).factor).to eq(2628000)
36
+ expect(ISO8601::Months.new(0).factor).to eq(2628000)
32
37
  end
33
38
 
34
39
  it "should return the Month factor for a common year" do
@@ -55,6 +60,9 @@ RSpec.describe ISO8601::Months do
55
60
 
56
61
  it "should return the amount of seconds for a common year" do
57
62
  expect(ISO8601::Months.new(2).to_seconds(common_year)).to eq(5097600)
63
+ expect(ISO8601::Months.new(1).to_seconds(common_year)).to eq(2678400)
64
+ expect(ISO8601::Months.new(0).to_seconds(common_year)).to eq(0)
65
+ expect(ISO8601::Months.new(0).to_seconds(common_december)).to eq(0)
58
66
  end
59
67
 
60
68
  it "should return the amount of seconds for a leap year" do
@@ -5,17 +5,17 @@ RSpec.describe ISO8601::Seconds do
5
5
  let(:subject) { ISO8601::Seconds.new(1) }
6
6
 
7
7
  it "should respond to the Atomic interface" do
8
- [:factor,
9
- :to_seconds,
10
- :symbol,
11
- :to_i,
12
- :to_f,
13
- :to_s,
14
- :value,
15
- :<=>,
16
- :eql?,
17
- :hash,
18
- :valid_atom?].each { |m| expect(subject).to respond_to(m) }
8
+ %i[factor
9
+ to_seconds
10
+ symbol
11
+ to_i
12
+ to_f
13
+ to_s
14
+ value
15
+ <=>
16
+ eql?
17
+ hash
18
+ valid_atom?].each { |m| expect(subject).to respond_to(m) }
19
19
  end
20
20
  end
21
21
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'spec_helper'
4
2
 
5
3
  RSpec.describe ISO8601::TimeInterval do
@@ -56,19 +54,13 @@ RSpec.describe ISO8601::TimeInterval do
56
54
  context "allowed patterns" do
57
55
  it "should parse <start>/<duration>" do
58
56
  expect { ISO8601::TimeInterval.parse('2007-03-01T13:00:00Z/P1Y') }.to_not raise_error
59
- expect { ISO8601::TimeInterval.parse('2007-03-01T13:00:00Z/P0.5Y') }.to_not raise_error
60
- expect { ISO8601::TimeInterval.parse('2007-03-01T13:00:00Z/P1Y0.5M') }.to_not raise_error
61
- expect { ISO8601::TimeInterval.parse('2007-03-01T13:00:00Z/P1Y0,5M') }.to_not raise_error
62
57
  expect { ISO8601::TimeInterval.parse('2007-03-01T13:00:00Z/P1Y1M1D') }.to_not raise_error
63
58
  expect { ISO8601::TimeInterval.parse('2007-03-01T13:00:00Z/P1Y1M1DT1H1M1.0S') }.to_not raise_error
64
59
  expect { ISO8601::TimeInterval.parse('2007-03-01T13:00:00Z/P1Y1M1DT1H1M1,0S') }.to_not raise_error
65
60
  end
66
61
 
67
62
  it "should parse <duration>/<end>" do
68
- expect { ISO8601::TimeInterval.parse('P1Y0,5M/2010-05-09T10:30:12+04') }.to_not raise_error
69
63
  expect { ISO8601::TimeInterval.parse('P1Y1M1D/2010-05-09T10:30:12+04:00') }.to_not raise_error
70
- expect { ISO8601::TimeInterval.parse('P1Y1M0.5D/2010-05-09T10:30:12-04:00') }.to_not raise_error
71
- expect { ISO8601::TimeInterval.parse('P1Y1M0,5D/2010-05-09T10:30:12-00:00') }.to_not raise_error
72
64
  expect { ISO8601::TimeInterval.parse('P1Y1M1DT1H/-2014-05-31T16:26:00Z') }.to_not raise_error
73
65
  expect { ISO8601::TimeInterval.parse('P1Y1M1DT0.5H/2014-05-31T16:26:10.5Z') }.to_not raise_error
74
66
  expect { ISO8601::TimeInterval.parse('P1Y1M1DT0,5H/2014-05-31T16:26:10,5Z') }.to_not raise_error
@@ -180,6 +172,107 @@ RSpec.describe ISO8601::TimeInterval do
180
172
  expect(ISO8601::TimeInterval.parse(pattern2).first).to eq(start_time)
181
173
  expect(ISO8601::TimeInterval.parse(pattern3).first).to eq(start_time)
182
174
  end
175
+
176
+ describe "November" do
177
+ pairs = [
178
+ {pattern: 'P1Y/2017-11-09T07:00:00Z',
179
+ start_time: ISO8601::DateTime.new('2016-11-09T07:00:00Z')},
180
+ {pattern: 'P1M/2017-11-09T07:00:00Z',
181
+ start_time: ISO8601::DateTime.new('2017-10-09T07:00:00Z')},
182
+ {pattern: 'P1D/2017-11-09T07:00:00Z',
183
+ start_time: ISO8601::DateTime.new('2017-11-08T07:00:00Z')},
184
+ {pattern: 'PT1H/2017-11-09T07:00:00Z',
185
+ start_time: ISO8601::DateTime.new('2017-11-09T06:00:00Z')},
186
+ ]
187
+
188
+ pairs.each do |pair|
189
+ it "should calculate correctly the start_time for #{pair[:pattern]}" do
190
+ expect(ISO8601::TimeInterval.parse(pair[:pattern]).first.to_s).to eq(pair[:start_time].to_s)
191
+ end
192
+ end
193
+ end
194
+
195
+ describe "December" do
196
+ pairs = [
197
+ {pattern: 'P1Y/2017-12-09T07:00:00Z',
198
+ start_time: ISO8601::DateTime.new('2016-12-09T07:00:00Z')},
199
+ {pattern: 'P1M/2017-12-09T07:00:00Z',
200
+ start_time: ISO8601::DateTime.new('2017-11-09T07:00:00Z')},
201
+ {pattern: 'P3D/2017-12-06T18:30:00Z',
202
+ start_time: ISO8601::DateTime.new('2017-12-03T18:30:00Z')},
203
+ {pattern: 'P1D/2017-12-09T07:00:00Z',
204
+ start_time: ISO8601::DateTime.new('2017-12-08T07:00:00Z')},
205
+ {pattern: 'PT1H/2017-12-09T07:00:00Z',
206
+ start_time: ISO8601::DateTime.new('2017-12-09T06:00:00Z')},
207
+ ]
208
+
209
+ pairs.each do |pair|
210
+ it "should calculate correctly the start_time for #{pair[:pattern]}" do
211
+ expect(ISO8601::TimeInterval.parse(pair[:pattern]).first.to_s).to eq(pair[:start_time].to_s)
212
+ end
213
+ end
214
+ end
215
+
216
+ describe "January" do
217
+ pairs = [
218
+ {pattern: 'P1Y/2017-01-01T00:00:00Z',
219
+ start_time: ISO8601::DateTime.new('2016-01-01T00:00:00Z')},
220
+ {pattern: 'P1M/2017-01-01T00:00:00Z',
221
+ start_time: ISO8601::DateTime.new('2016-12-01T00:00:00Z')},
222
+ {pattern: 'P1D/2017-01-01T00:00:00Z',
223
+ start_time: ISO8601::DateTime.new('2016-12-31T00:00:00Z')},
224
+ {pattern: 'PT1H/2017-01-01T01:00:00Z',
225
+ start_time: ISO8601::DateTime.new('2017-01-01T00:00:00Z')},
226
+ ]
227
+
228
+ pairs.each do |pair|
229
+ it "should calculate correctly the start_time for #{pair[:pattern]}" do
230
+ expect(ISO8601::TimeInterval.parse(pair[:pattern]).first.to_s).to eq(pair[:start_time].to_s)
231
+ end
232
+ end
233
+ end
234
+
235
+ describe "February" do
236
+ pairs = [
237
+ {pattern: 'P1Y/2017-02-01T00:00:00Z',
238
+ start_time: ISO8601::DateTime.new('2016-02-01T00:00:00Z')},
239
+ {pattern: 'P1M/2017-02-01T00:00:00Z',
240
+ start_time: ISO8601::DateTime.new('2017-01-01T00:00:00Z')},
241
+ {pattern: 'P1D/2017-02-01T00:00:00Z',
242
+ start_time: ISO8601::DateTime.new('2017-01-31T00:00:00Z')},
243
+ {pattern: 'PT1H/2017-02-01T01:00:00Z',
244
+ start_time: ISO8601::DateTime.new('2017-02-01T00:00:00Z')},
245
+ ]
246
+
247
+ pairs.each do |pair|
248
+ it "should calculate correctly the start_time for #{pair[:pattern]}" do
249
+ expect(ISO8601::TimeInterval.parse(pair[:pattern]).first.to_s).to eq(pair[:start_time].to_s)
250
+ end
251
+ end
252
+ end
253
+
254
+ describe "March" do
255
+ pairs = [
256
+ {pattern: 'P1Y/2017-03-01T00:00:00Z',
257
+ start_time: ISO8601::DateTime.new('2016-03-01T00:00:00Z')},
258
+ {pattern: 'P1M/2017-03-01T00:00:00Z',
259
+ start_time: ISO8601::DateTime.new('2017-02-01T00:00:00Z')},
260
+ {pattern: 'P1D/2017-03-01T00:00:00Z',
261
+ start_time: ISO8601::DateTime.new('2017-02-28T00:00:00Z')},
262
+ {pattern: 'PT1H/2017-03-01T01:00:00Z',
263
+ start_time: ISO8601::DateTime.new('2017-03-01T00:00:00Z')},
264
+ ]
265
+
266
+ pairs.each do |pair|
267
+ it "should calculate correctly the start_time for #{pair[:pattern]}" do
268
+ expect(ISO8601::TimeInterval.parse(pair[:pattern]).first.to_s).to eq(pair[:start_time].to_s)
269
+ end
270
+ end
271
+ end
272
+
273
+
274
+
275
+
183
276
  end
184
277
 
185
278
  describe "#last" do
@@ -207,8 +300,8 @@ RSpec.describe ISO8601::TimeInterval do
207
300
 
208
301
  describe "#to_s" do
209
302
  it "should return the pattern if TimeInterval is initialized with a pattern" do
210
- pattern = 'P1Y1M1DT0,5H/2014-05-31T16:26:10,5Z'
211
- pattern2 = '2007-03-01T13:00:00Z/P1Y0,5M'
303
+ pattern = 'P1Y1M1DT0,5S/2014-05-31T16:26:10Z'
304
+ pattern2 = '2007-03-01T13:00:00Z/P1Y'
212
305
 
213
306
  expect(ISO8601::TimeInterval.parse(pattern).to_s).to eq(pattern)
214
307
  expect(ISO8601::TimeInterval.parse(pattern2).to_s).to eq(pattern2)
@@ -5,17 +5,17 @@ RSpec.describe ISO8601::Weeks do
5
5
  let(:subject) { ISO8601::Weeks.new(1) }
6
6
 
7
7
  it "should respond to the Atomic interface" do
8
- [:factor,
9
- :to_seconds,
10
- :symbol,
11
- :to_i,
12
- :to_f,
13
- :to_s,
14
- :value,
15
- :<=>,
16
- :eql?,
17
- :hash,
18
- :valid_atom?].each { |m| expect(subject).to respond_to(m) }
8
+ %i[factor
9
+ to_seconds
10
+ symbol
11
+ to_i
12
+ to_f
13
+ to_s
14
+ value
15
+ <=>
16
+ eql?
17
+ hash
18
+ valid_atom?].each { |m| expect(subject).to respond_to(m) }
19
19
  end
20
20
  end
21
21
 
@@ -8,17 +8,17 @@ RSpec.describe ISO8601::Years do
8
8
  let(:subject) { ISO8601::Years.new(1) }
9
9
 
10
10
  it "should respond to the Atomic interface" do
11
- [:factor,
12
- :to_seconds,
13
- :symbol,
14
- :to_i,
15
- :to_f,
16
- :to_s,
17
- :value,
18
- :<=>,
19
- :eql?,
20
- :hash,
21
- :valid_atom?].each { |m| expect(subject).to respond_to(m) }
11
+ %i[factor
12
+ to_seconds
13
+ symbol
14
+ to_i
15
+ to_f
16
+ to_s
17
+ value
18
+ <=>
19
+ eql?
20
+ hash
21
+ valid_atom?].each { |m| expect(subject).to respond_to(m) }
22
22
  end
23
23
  end
24
24
 
@@ -31,6 +31,7 @@ RSpec.describe ISO8601::Years do
31
31
 
32
32
  it "should return the Year factor for a common year" do
33
33
  expect(ISO8601::Years.new(1).factor(common_year)).to eq(31536000)
34
+ expect(ISO8601::Years.new(0).factor(common_year)).to eq(31536000)
34
35
  end
35
36
 
36
37
  it "should return the Year factor for a leap year" do
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  $LOAD_PATH.unshift File.expand_path('..', __FILE__)
4
2
  require 'iso8601'
5
3
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iso8601
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arnau Siches
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-21 00:00:00.000000000 Z
11
+ date: 2017-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.4'
19
+ version: '3.6'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.4'
26
+ version: '3.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubocop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.40'
33
+ version: '0.50'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.40'
40
+ version: '0.50'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.10.3
47
+ version: 0.11.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.10.3
54
+ version: 0.11.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pry-doc
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.8.0
61
+ version: 0.11.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.8.0
68
+ version: 0.11.0
69
69
  description: |2
70
70
  ISO8601 is a simple implementation in Ruby of the ISO 8601 (Data elements and
71
71
  interchange formats - Information interchange - Representation of dates
@@ -134,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
134
  version: '0'
135
135
  requirements: []
136
136
  rubyforge_project: iso8601
137
- rubygems_version: 2.6.4
137
+ rubygems_version: 2.7.3
138
138
  signing_key:
139
139
  specification_version: 4
140
140
  summary: Ruby parser to work with ISO 8601 dateTimes and durations - http://en.wikipedia.org/wiki/ISO_8601
@@ -152,4 +152,3 @@ test_files:
152
152
  - spec/iso8601/weeks_spec.rb
153
153
  - spec/iso8601/years_spec.rb
154
154
  - spec/spec_helper.rb
155
- has_rdoc: yard