iso8601 0.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -6,10 +6,27 @@ times) standard.
6
6
 
7
7
  ## Comments
8
8
 
9
- Because Durations and DateTime has substract method, Durations has sign to represent a negative value:
9
+ ### Duration sign
10
10
 
11
- * `(ISO8601::Duration.new("PT10S") - ISO8601::Duration.new("PT12S")).to_s #=> "-PT2S"`
12
- * `(ISO8601::Duration.new("-PT10S") + ISO8601::Duration.new("PT12S")).to_s #=> "PT2S"`
11
+ Because Durations and DateTime has a substraction method, Durations has sign to be able to represent a negative value:
12
+
13
+ (ISO8601::Duration.new('PT10S') - ISO8601::Duration.new('PT12S')).to_s #=> '-PT2S'
14
+ (ISO8601::Duration.new('-PT10S') + ISO8601::Duration.new('PT12S')).to_s #=> 'PT2S'
15
+
16
+ ### Separators
17
+
18
+ Although, the spec allows three separator types: period (.), comma (,), and raised period (·) by now I keep just the period option.
19
+
20
+ ### Century treatment
21
+
22
+ The specification says that you can express a reduced precision year
23
+ just giving the century (i.e. '20' to refer the inclusive range 2000-2999).
24
+
25
+ This implementation expands the century to the first value for its range
26
+ so:
27
+
28
+ ISO8601::DateTime.new('20').century # => 20
29
+ ISO8601::DateTime.new('20').year # => 2000
13
30
 
14
31
 
15
32
  ## TODO
@@ -18,12 +35,16 @@ Because Durations and DateTime has substract method, Durations has sign to repre
18
35
  * Recurring time intervals
19
36
  * Ordinal date pattern (YYYY-DDD)
20
37
  * Week date pattern (YYYY-Www-D)
38
+ * Treat the `201005` as `2000-10-05` instead of `2010-05`
21
39
 
22
40
  ## Contributors
23
41
 
24
42
  * [Nick Lynch](https://github.com/njlynch)
25
43
  * [Pelle Braendgaard](https://github.com/pelle)
26
44
  * [Takahiro Noda](https://github.com/tnoda)
45
+ * [Porras](https://github.com/porras)
46
+
47
+ ## License
48
+
49
+ Arnau Siches under the [MIT License](https://github.com/arnau/ISO8601/blob/master/LICENSE)
27
50
 
28
- ## Credits
29
- Arnau Siches under [LGPL](http://www.gnu.org/licenses/lgpl.html) license. LICENSE file for details.
data/Rakefile CHANGED
@@ -1 +1,2 @@
1
- require "bundler/gem_tasks"
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
data/iso8601.gemspec CHANGED
@@ -1,26 +1,30 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "iso8601"
1
+ # encoding: utf-8
2
+
3
+ $:.push File.expand_path('../lib', __FILE__)
4
+ require 'iso8601'
4
5
 
5
6
  Gem::Specification.new do |s|
6
- s.name = "iso8601"
7
- s.version = ISO8601::VERSION
8
- s.authors = ["Arnau Siches"]
9
- s.email = ["arnau.siches@gmail.com"]
10
- s.homepage = "https://github.com/arnau/ISO8601"
11
- s.summary = %q{Ruby parser to work with ISO8601 dateTimes and durations - http://en.wikipedia.org/wiki/ISO_8601}
12
- s.description = %q{ISO8601 is a simple implementation of the ISO 8601 (Data elements and
13
- interchange formats - Information interchange - Representation of dates and
14
- times) standard.}
7
+ s.name = 'iso8601'
8
+ s.version = ISO8601::VERSION
9
+ s.date = Time.now.strftime('%Y-%m-%d')
10
+ s.authors = ['Arnau Siches']
11
+ s.email = 'arnau.siches@gmail.com'
12
+ s.homepage = 'https://github.com/arnau/ISO8601'
13
+ s.summary = "Ruby parser to work with ISO 8601 dateTimes and durations - http://en.wikipedia.org/wiki/ISO_8601"
14
+ s.description = <<-EOD
15
+ ISO8601 is a simple implementation in Ruby of the ISO 8601 (Data elements and
16
+ interchange formats - Information interchange - Representation of dates
17
+ and times) standard.
18
+ EOD
19
+ s.license = 'MIT'
20
+ s.rubyforge_project = 'iso8601'
15
21
 
16
- s.rubyforge_project = "iso8601"
22
+ s.files = `git ls-files`.split("\n")
23
+ s.test_files = s.files.grep(%r{^(spec|features)/})
24
+ s.require_paths = ['lib']
17
25
 
18
- s.files = `git ls-files`.split("\n")
19
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
- s.require_paths = ["lib"]
26
+ s.has_rdoc = 'yard'
22
27
 
23
- # specify any dependencies here; for example:
24
- # s.add_development_dependency "rspec"
25
- # s.add_runtime_dependency "rest-client"
28
+ s.add_development_dependency 'rspec', '~> 2.0'
29
+ s.add_development_dependency 'ZenTest', '~> 4.8'
26
30
  end
data/lib/iso8601.rb CHANGED
@@ -1,10 +1,12 @@
1
+ # encoding: utf-8
2
+
1
3
  module ISO8601
2
- VERSION = "0.2"
4
+ VERSION = '0.4.0'
3
5
  end
4
6
 
5
- require "time"
7
+ require 'time'
6
8
 
7
- require "iso8601/errors"
8
- require "iso8601/atoms"
9
- require "iso8601/dateTime"
10
- require "iso8601/duration"
9
+ require 'iso8601/errors'
10
+ require 'iso8601/atoms'
11
+ require 'iso8601/dateTime'
12
+ require 'iso8601/duration'
data/lib/iso8601/atoms.rb CHANGED
@@ -1,35 +1,51 @@
1
- module ISO8601
1
+ # encoding: utf-8
2
2
 
3
- # Represents a generic atom in a +ISO8601::Duration+.
3
+ module ISO8601
4
+ ##
5
+ # A generic atom in a {ISO8601::Duration}
6
+ #
7
+ # @abstract
4
8
  class Atom
9
+ ##
10
+ # @param [Numeric] atom The atom value
11
+ # @param [ISO8601::DateTime, nil] base (nil) The base datetime to
12
+ # compute the atom factor.
5
13
  def initialize(atom, base=nil)
6
- is_number?(atom, "First argument for #{self.inspect} must be an Integer or a Float.")
14
+ raise TypeError, "The atom argument for #{self.inspect} should be a Numeric value." unless atom.kind_of? Numeric
15
+ raise TypeError, "The base argument for #{self.inspect} should be a ISO8601::DateTime instance or nil." unless base.kind_of? ISO8601::DateTime or base.nil?
7
16
  @atom = atom
8
17
  @base = base
9
18
  end
10
-
19
+ ##
20
+ # The integer representation of the atom
11
21
  def to_i
12
- @atom
22
+ @atom.to_i
13
23
  end
24
+ ##
25
+ # The amount of seconds of the atom
14
26
  def to_seconds
15
27
  @atom * self.factor
16
28
  end
17
-
18
- private
19
- def is_number?(arg, error_message=nil)
20
- raise TypeError, error_message unless (arg.is_a? Integer or arg.is_a? Float)
21
- end
29
+ ##
30
+ # The atom factor to compute the amount of seconds for the atom
31
+ def factor
32
+ raise NotImplementedError, "The #factor method should be implemented for each subclass"
33
+ end
22
34
  end
23
-
35
+ ##
36
+ # A Years atom in a {ISO8601::Duration}
37
+ #
24
38
  # A “calendar year” is the cyclic time interval in a calendar which is
25
39
  # required for one revolution of the Earth around the Sun and approximated to
26
40
  # an integral number of “calendar days”.
27
-
28
- #A “duration year” is the duration of 365 or 366 “calendar days” depending on
41
+ #
42
+ # A “duration year” is the duration of 365 or 366 “calendar days” depending on
29
43
  # the start and/or the end of the corresponding time interval within the
30
44
  # specific “calendar year”.
31
45
  class Years < ISO8601::Atom
32
-
46
+ ##
47
+ # The Year factor
48
+ #
33
49
  # The “duration year” average is calculated through time intervals of 400
34
50
  # “duration years”. Each cycle of 400 “duration years” has 303 “common
35
51
  # years” of 365 “calendar days” and 97 “leap years” of 366 “calendar days”.
@@ -37,22 +53,27 @@ module ISO8601
37
53
  if @base.nil?
38
54
  ((365 * 303 + 366 * 97) / 400) * 86400
39
55
  elsif @atom == 0
40
- 0
56
+ year = (@base.year).to_i
57
+ (Time.utc(year) - Time.utc(@base.year))
41
58
  else
42
59
  year = (@base.year + @atom).to_i
43
60
  (Time.utc(year) - Time.utc(@base.year)) / @atom
44
61
  end
45
62
  end
46
63
  end
47
-
64
+ ##
65
+ # A Months atom in a {ISO8601::Duration}
66
+ #
48
67
  # A “calendar month” is the time interval resulting from the division of a
49
68
  # “calendar year” in 12 time intervals.
50
-
69
+ #
51
70
  # A “duration month” is the duration of 28, 29, 30 or 31 “calendar days”
52
71
  # depending on the start and/or the end of the corresponding time interval
53
72
  # within the specific “calendar month”.
54
73
  class Months < ISO8601::Atom
55
-
74
+ ##
75
+ # The Month factor
76
+ #
56
77
  # The “duration month” average is calculated through time intervals of 400
57
78
  # “duration years”. Each cycle of 400 “duration years” has 303 “common
58
79
  # years” of 365 “calendar days” and 97 “leap years” of 366 “calendar days”.
@@ -60,7 +81,9 @@ module ISO8601
60
81
  if @base.nil?
61
82
  (((365 * 303 + 366 * 97) / 400) * 86400) / 12
62
83
  elsif @atom == 0
63
- 0
84
+ month = (@base.month <= 12) ? (@base.month) : ((@base.month) % 12)
85
+ year = @base.year + ((@base.month) / 12).to_i
86
+ (Time.utc(year, month) - Time.utc(@base.year, @base.month))
64
87
  else
65
88
  month = (@base.month + @atom <= 12) ? (@base.month + @atom) : ((@base.month + @atom) % 12)
66
89
  year = @base.year + ((@base.month + @atom) / 12).to_i
@@ -68,47 +91,57 @@ module ISO8601
68
91
  end
69
92
  end
70
93
  end
71
-
94
+ ##
95
+ # A Weeks atom in a {ISO8601::Duration}
72
96
  class Weeks < ISO8601::Atom
73
-
74
- # A week is equal to 604800 seconds.
97
+ ##
98
+ # The Week factor
75
99
  def factor
76
100
  604800
77
101
  end
78
102
  end
79
-
103
+ ##
104
+ # The Days atom in a {ISO8601::Duration}
105
+ #
80
106
  # A “calendar day” is the time interval which starts at a certain time of day
81
107
  # at a certain “calendar day” and ends at the same time of day at the next
82
108
  # “calendar day”.
83
109
  class Days < ISO8601::Atom
84
-
85
- # A day is equal to 86400 seconds.
110
+ ##
111
+ # The Day factor
86
112
  def factor
87
113
  86400
88
114
  end
89
115
  end
90
-
116
+ ##
117
+ # The Hours atom in a {ISO8601::Duration}
91
118
  class Hours < ISO8601::Atom
92
-
93
- # An hour is equal to 3600 seconds.
119
+ ##
120
+ # The Hour factor
94
121
  def factor
95
122
  3600
96
123
  end
97
124
  end
125
+ ##
126
+ # The Minutes atom in a {ISO8601::Duration}
98
127
  class Minutes < ISO8601::Atom
99
-
100
- # A minute is equal to 60 seconds.
128
+ ##
129
+ # The Minute factor
101
130
  def factor
102
131
  60
103
132
  end
104
133
  end
105
-
134
+ ##
135
+ # The Seconds atom in a {ISO8601::Duration}
136
+ #
106
137
  # The second is the base unit of measurement of time in the International
107
138
  # System of Units (SI) as defined by the International Committee of Weights
108
139
  # and Measures (CIPM, i.e. Comité International des Poids et Mesures)
109
140
  class Seconds < ISO8601::Atom
141
+ ##
142
+ # The Second factor
110
143
  def factor
111
144
  1
112
145
  end
113
146
  end
114
- end
147
+ end
@@ -1,32 +1,42 @@
1
+ # encoding: utf-8
2
+
1
3
  module ISO8601
4
+ ##
5
+ # A DateTime representation
6
+ #
7
+ # @todo Review the pattern `201005`. It has to be `20-10-05` instead of `2010-05`.
8
+ # The specification doesn't allow a YYYYMM. It should be always
9
+ # YYYY-MM.
2
10
  class DateTime
3
- attr_reader :date_time, :century, :year, :month, :day, :hour, :minute, :second, :timezone
11
+ attr_reader :century, :year, :month, :day, :hour, :minute, :second, :timezone
12
+ ##
13
+ # @param [String] date_time The datetime pattern
4
14
  def initialize(date_time)
5
15
  @dt = /^(?:
6
- (\d{2})(\d{2})?
16
+ (\d{2})(\d{2})? # Year. It can be either two digits (the century) or four digits (the full year)
7
17
  (?:
8
18
  (-)?(\d{2})
9
- )?
19
+ )? # Month with an optional separator
10
20
  (?:
11
- (\3)?(\d{2})
21
+ (\3)?(\d{2}) # Day with an optional separator which is the same for the Month
12
22
  )?
13
- )?
23
+ )? # Date
14
24
  (?:
15
- T(\d{2})
25
+ T(\d{2}) # Hour
16
26
  (?:
17
- (:)?(\d{2})
27
+ (:)?(\d{2}) # Minute with an optional separator
18
28
  )?
19
29
  (?:
20
- (\8)?(\d{2})
21
- )?
30
+ (\8)?(\d{2}) # Second with an optional separator which is the same that for the Minute
31
+ )? # Time
22
32
  (
23
33
  Z|([+-])
24
- (\d{2})
34
+ (\d{2}) # Timezone hour
25
35
  (?:
26
- (\8)?
27
- (\d{2})
36
+ (\8)? # Separator which should be the same that for the Minute
37
+ (\d{2}) # Timezone minute
28
38
  )?
29
- )?
39
+ )? # Timezone
30
40
  )?
31
41
  $/x.match(date_time) or raise ISO8601::Errors::UnknownPattern.new(date_time)
32
42
 
@@ -52,12 +62,21 @@ module ISO8601
52
62
  :full => @dt[12].nil? ? (Time.now.gmt_offset / 3600) : (@dt[12] == "Z" ? 0 : @dt[12]),
53
63
  :sign => @dt[13],
54
64
  :hour => @dt[12].nil? ? (Time.now.gmt_offset / 3600) : (@dt[12] == "Z" ? 0 : @dt[14].to_i),
55
- :minute => (@dt[12].nil? or @dt[12] == "Z") ? 0 : @dt[14].to_i
65
+ :minute => (@dt[12].nil? or @dt[12] == "Z") ? 0 : @dt[13].to_i
56
66
  }
57
67
 
58
68
  valid_pattern?
59
69
  valid_range?
60
70
  end
71
+ ##
72
+ # Returns the datetime string representation
73
+ def to_s
74
+ @date_time
75
+ end
76
+ ##
77
+ # Converts the object to a Time instance
78
+ #
79
+ # @return [Time] The object converted
61
80
  def to_time
62
81
  raise RangeError if @year.nil?
63
82
  if @month.nil?
@@ -69,17 +88,21 @@ module ISO8601
69
88
  Time.parse(@date_time).getutc
70
89
  end
71
90
  end
91
+ ##
92
+ # Addition
93
+ #
94
+ # @param [ISO8601::DateTime] The seconds to add
72
95
  def +(d)
73
- raise TypeError unless (d.is_a? Float or d.is_a? Integer)
74
- Time.utc(@year, @month, @day, @hour, @minute, @second) + d
96
+ raise TypeError unless d.kind_of? Numeric
97
+ ISO8601::DateTime.new((Time.utc(@year, @month, @day, @hour, @minute, @second) + d).iso8601)
75
98
  end
99
+ ##
100
+ # Substraction
101
+ #
102
+ # @param [ISO8601::DateTime] The seconds to substract
76
103
  def -(d)
77
- raise TypeError unless (d.is_a? Float or d.is_a? Integer or d.is_a? ISO8601::DateTime)
78
- if (d.is_a? ISO8601::DateTime)
79
- Time.utc(@year, @month, @day, @hour, @minute, @second) - Time.utc(d.year, d.month, d.day, d.hour, d.minute, d.second)
80
- else
81
- Time.utc(@year, @month, @day, @hour, @minute, @second) - d
82
- end
104
+ raise TypeError unless d.kind_of? Numeric
105
+ ISO8601::DateTime.new((Time.utc(@year, @month, @day, @hour, @minute, @second) - d).iso8601)
83
106
  end
84
107
  private
85
108
  def valid_pattern?
@@ -1,11 +1,37 @@
1
- module ISO8601
1
+ # encoding: utf-8
2
2
 
3
+ module ISO8601
4
+ ##
3
5
  # Represents a duration in ISO 8601 format
6
+ #
7
+ # @todo Support fraction values for years, months, days, weeks, hours
8
+ # and minutes
4
9
  class Duration
5
10
  attr_reader :base, :atoms
6
- def initialize(duration, base = nil)
7
- @duration = /^(\+|-)?P(((\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+(?:\.\d+)?S)?)?)|(\d+W))$/.match(duration)
8
- @base = base #date base for duration calculations
11
+ ##
12
+ # @param [String, Numeric] pattern The duration pattern
13
+ # @param [ISO8601::DateTime, nil] base (nil) The base datetime to
14
+ # calculate the duration properly
15
+ def initialize(pattern, base = nil)
16
+ # we got seconds instead of an ISO8601 duration
17
+ pattern = "PT#{pattern}S" if (pattern.kind_of? Numeric)
18
+ @duration = /^(\+|-)? # Sign
19
+ P(
20
+ (
21
+ (\d+Y)? # Years
22
+ (\d+M)? # Months
23
+ (\d+D)? # Days
24
+ (T
25
+ (\d+H)? # Hours
26
+ (\d+M)? # Minutes
27
+ (\d+(?:\.\d+)?S)? # Seconds
28
+ )? # Time
29
+ )
30
+ |(\d+W) # Weeks
31
+ ) # Duration
32
+ $/x.match(pattern) or raise ISO8601::Errors::UnknownPattern.new(pattern)
33
+
34
+ @base = base
9
35
  valid_pattern?
10
36
  valid_base?
11
37
  @atoms = {
@@ -18,86 +44,117 @@ module ISO8601
18
44
  :seconds => @duration[10].nil? ? 0 : @duration[10].chop.to_f * sign
19
45
  }
20
46
  end
21
-
47
+ ##
48
+ # Assigns a new base datetime
49
+ #
50
+ # @return [ISO8601::DateTime, nil]
22
51
  def base=(value)
23
52
  @base = value
53
+ valid_base?
24
54
  return @base
25
55
  end
26
-
27
- # Returns the original string of the duration
56
+ ##
57
+ # @return [String] The string representation of the duration
28
58
  def to_s
29
59
  @duration[0]
30
60
  end
31
-
32
- # Returns the years of the duration
61
+ ##
62
+ # @return [ISO8601::Years] The years of the duration
33
63
  def years
34
64
  ISO8601::Years.new(@atoms[:years], @base)
35
65
  end
36
-
37
- # Returns the months of the duration
66
+ ##
67
+ # @return [ISO8601::Months] The months of the duration
38
68
  def months
39
- base = @base.nil? ? nil : @base + self.years.to_seconds # prevent computing duplicated time
69
+ # Changes the base to compute the months for the right base year
70
+ base = @base.nil? ? nil : @base + self.years.to_seconds
40
71
  ISO8601::Months.new(@atoms[:months], base)
41
72
  end
42
-
43
- # Returns the weeks of the duration
73
+ ##
74
+ # @return [ISO8601::Weeks] The weeks of the duration
44
75
  def weeks
45
76
  ISO8601::Weeks.new(@atoms[:weeks], @base)
46
77
  end
47
-
48
- # Returns the days of the duration
78
+ ##
79
+ # @return [ISO8601::Days] The days of the duration
49
80
  def days
50
81
  ISO8601::Days.new(@atoms[:days], @base)
51
82
  end
52
-
53
- # Returns the hours of the duration
83
+ ##
84
+ # @return [ISO8601::Hours] The hours of the duration
54
85
  def hours
55
86
  ISO8601::Hours.new(@atoms[:hours], @base)
56
87
  end
57
-
58
- # Returns the minutes of the duration
88
+ ##
89
+ # @return [ISO8601::Minutes] The minutes of the duration
59
90
  def minutes
60
91
  ISO8601::Minutes.new(@atoms[:minutes], @base)
61
92
  end
62
-
63
- # Returns the seconds of the duration
93
+ ##
94
+ # @return [ISO8601::Seconds] The seconds of the duration
64
95
  def seconds
65
96
  ISO8601::Seconds.new(@atoms[:seconds], @base)
66
97
  end
67
-
68
- # Returns the duration in seconds
98
+ ##
99
+ # @return [Numeric] The duration in seconds
69
100
  def to_seconds
70
101
  years, months, weeks, days, hours, minutes, seconds = self.years.to_seconds, self.months.to_seconds, self.weeks.to_seconds, self.days.to_seconds, self.hours.to_seconds, self.minutes.to_seconds, self.seconds.to_seconds
71
102
  return years + months + weeks + days + hours + minutes + seconds
72
103
  end
73
-
74
- # Returns the absolute value of duration
104
+ ##
105
+ # @return [ISO8601::Duration] The absolute representation of the duration
75
106
  def abs
76
- return self.to_s.sub!(/^[-+]/, "")
77
- end
78
-
107
+ absolute = self.to_s.sub(/^[-+]/, '')
108
+ return ISO8601::Duration.new(absolute)
109
+ end
110
+ ##
111
+ # Addition
112
+ #
113
+ # @param [ISO8601::Duration] duration The duration to add
114
+ #
115
+ # @raise [ISO8601::Errors::DurationBaseError] If bases doesn't match
116
+ # @return [ISO8601::Duration]
79
117
  def +(duration)
80
- raise ISO8601::Errors::DurationBaseError.new(duration) if self.base != duration.base
81
- d1 = self.to_seconds
118
+ raise ISO8601::Errors::DurationBaseError.new(duration) if @base.to_s != duration.base.to_s
119
+ d1 = to_seconds
82
120
  d2 = duration.to_seconds
83
- return self.seconds_to_iso(d1 + d2)
84
- end
121
+ return seconds_to_iso(d1 + d2)
122
+ end
123
+ ##
124
+ # Substraction
125
+ #
126
+ # @param [ISO8601::Duration] duration The duration to substract
127
+ #
128
+ # @raise [ISO8601::Errors::DurationBaseError] If bases doesn't match
129
+ # @return [ISO8601::Duration]
85
130
  def -(duration)
86
- raise ISO8601::Errors::DurationBaseError.new(duration) if self.base != duration.base
87
- d1 = self.to_seconds
131
+ raise ISO8601::Errors::DurationBaseError.new(duration) if @base.to_s != duration.base.to_s
132
+ d1 = to_seconds
88
133
  d2 = duration.to_seconds
89
- return self.seconds_to_iso(d1 - d2)
90
- # return d1 - d2
134
+ duration = d1 - d2
135
+ if duration == 0
136
+ return ISO8601::Duration.new('PT0S')
137
+ else
138
+ return seconds_to_iso(duration)
139
+ end
91
140
  end
92
-
93
- # Convenience method to turn instance method (which can take into
94
- # account a base time or duration) into a simple class method.
95
- def self.seconds_to_iso(duration)
96
- return ISO8601::Duration.new('P0Y').seconds_to_iso(duration)
141
+ ##
142
+ # @param [ISO8601::Duration] duration The duration to compare
143
+ #
144
+ # @raise [ISO8601::Errors::DurationBaseError] If bases doesn't match
145
+ # @return [Boolean]
146
+ def ==(duration)
147
+ raise ISO8601::Errors::DurationBaseError.new(duration) if @base.to_s != duration.base.to_s
148
+ (self.to_seconds == duration.to_seconds)
97
149
  end
98
150
 
151
+ private
152
+ ##
153
+ # @param [Numeric] duration The seconds to promote
154
+ #
155
+ # @return [ISO8601::Duration]
99
156
  def seconds_to_iso(duration)
100
- sign = "-" if (duration < 0)
157
+ sign = '-' if (duration < 0)
101
158
  duration = duration.abs
102
159
  years, y_mod = (duration / self.years.factor).to_i, (duration % self.years.factor)
103
160
  months, m_mod = (y_mod / self.months.factor).to_i, (y_mod % self.months.factor)
@@ -119,22 +176,21 @@ module ISO8601
119
176
  return ISO8601::Duration.new(date_time)
120
177
  end
121
178
 
122
- private
123
- def sign
124
- (@duration[1].nil? or @duration[1] == "+") ? 1 : -1
125
- end
126
- def valid_base?
127
- if !(@base.is_a? NilClass or @base.is_a? ISO8601::DateTime)
128
- raise TypeError
129
- end
179
+ def sign
180
+ (@duration[1].nil? or @duration[1] == "+") ? 1 : -1
181
+ end
182
+ def valid_base?
183
+ if !(@base.nil? or @base.kind_of? ISO8601::DateTime)
184
+ raise TypeError
130
185
  end
131
- def valid_pattern?
132
- if @duration.nil? or
133
- (@duration[4].nil? and @duration[5].nil? and @duration[6].nil? and @duration[7].nil? and @duration[11].nil?) or
134
- (!@duration[7].nil? and @duration[8].nil? and @duration[9].nil? and @duration[10].nil? and @duration[11].nil?)
186
+ end
187
+ def valid_pattern?
188
+ if @duration.nil? or
189
+ (@duration[4].nil? and @duration[5].nil? and @duration[6].nil? and @duration[7].nil? and @duration[11].nil?) or
190
+ (!@duration[7].nil? and @duration[8].nil? and @duration[9].nil? and @duration[10].nil? and @duration[11].nil?)
135
191
 
136
- raise ISO8601::Errors::UnknownPattern.new(@duration)
137
- end
192
+ raise ISO8601::Errors::UnknownPattern.new(@duration)
138
193
  end
194
+ end
139
195
  end
140
196
  end