iso8601 0.8.5 → 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Dockerfile +1 -1
- data/Makefile +6 -1
- data/README.md +3 -0
- data/circle.yml +13 -0
- data/lib/iso8601/date.rb +2 -0
- data/lib/iso8601/date_time.rb +2 -2
- data/lib/iso8601/duration.rb +15 -0
- data/lib/iso8601/time.rb +17 -7
- data/lib/iso8601/version.rb +1 -1
- data/spec/iso8601/date_spec.rb +8 -2
- data/spec/iso8601/date_time_spec.rb +9 -2
- data/spec/iso8601/duration_spec.rb +8 -1
- data/spec/iso8601/time_spec.rb +11 -3
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5334fbf980f84b7381e75406df4aa142096aa195
|
4
|
+
data.tar.gz: 60b7dc50b02cbf3814faa7403b6d0c569f0ff611
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab405a0c6d9b7c7a82c17d11604ece0155632197ea1a91351df1953ee1aeb787ce7335d84a230604e3de636ef682d8e9dc042df4792ea99027fd5d98d50781e9
|
7
|
+
data.tar.gz: 74c27f8c93e799e6de99cd1564a91381d01bfafdf984c86445d03548377d6c3985cbf4b67a78cde4ce1751181126f47de2eae27761bc17af7c882f9176ca639d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.8.6
|
2
|
+
|
3
|
+
* Fix #26 operations with Date, DateTime and Time with Duration (ex. `ISO8601::DateTime.new('2012-07-07T20:20:20Z') - ISO8601::Duration.new('PT10M')`.)
|
4
|
+
* Fix #25 accept time components with timezone and only hour component (ex. `ISO8601::Time.new('T10+01:00')`.)
|
5
|
+
* Fix Docker image for testing and inspecting.
|
6
|
+
|
1
7
|
## 0.8.5
|
2
8
|
|
3
9
|
* Fix `DateTime#hash`
|
data/Dockerfile
CHANGED
data/Makefile
CHANGED
data/README.md
CHANGED
@@ -19,6 +19,9 @@ times) standard.
|
|
19
19
|
|
20
20
|
Check the [changelog](https://github.com/arnau/ISO8601/blob/master/CHANGELOG.md) if you are upgrading from an older version.
|
21
21
|
|
22
|
+
## Documentation
|
23
|
+
|
24
|
+
Check the [rubydoc documentation](http://www.rubydoc.info/gems/iso8601).
|
22
25
|
|
23
26
|
## Comments about this implementation
|
24
27
|
|
data/circle.yml
ADDED
data/lib/iso8601/date.rb
CHANGED
@@ -47,6 +47,7 @@ module ISO8601
|
|
47
47
|
#
|
48
48
|
# @return [ISO8601::Date] New date resulting of the addition
|
49
49
|
def +(other)
|
50
|
+
other = other.to_days if other.respond_to?(:to_days)
|
50
51
|
ISO8601::Date.new((@date + other).iso8601)
|
51
52
|
end
|
52
53
|
##
|
@@ -56,6 +57,7 @@ module ISO8601
|
|
56
57
|
#
|
57
58
|
# @return [ISO8601::Date] New date resulting of the substraction
|
58
59
|
def -(other)
|
60
|
+
other = other.to_days if other.respond_to?(:to_days)
|
59
61
|
ISO8601::Date.new((@date - other).iso8601)
|
60
62
|
end
|
61
63
|
##
|
data/lib/iso8601/date_time.rb
CHANGED
@@ -30,7 +30,7 @@ module ISO8601
|
|
30
30
|
#
|
31
31
|
# @param [Numeric] other The seconds to add
|
32
32
|
def +(other)
|
33
|
-
moment = @date_time.to_time.localtime(zone) + other.round(1)
|
33
|
+
moment = @date_time.to_time.localtime(zone) + other.to_f.round(1)
|
34
34
|
|
35
35
|
self.class.new(moment.strftime('%Y-%m-%dT%H:%M:%S.%N%:z'))
|
36
36
|
end
|
@@ -39,7 +39,7 @@ module ISO8601
|
|
39
39
|
#
|
40
40
|
# @param [Numeric] other The seconds to substract
|
41
41
|
def -(other)
|
42
|
-
moment = @date_time.to_time.localtime(zone) - other.round(1)
|
42
|
+
moment = @date_time.to_time.localtime(zone) - other.to_f.round(1)
|
43
43
|
|
44
44
|
self.class.new(moment.strftime('%Y-%m-%dT%H:%M:%S.%N%:z'))
|
45
45
|
end
|
data/lib/iso8601/duration.rb
CHANGED
@@ -170,6 +170,21 @@ module ISO8601
|
|
170
170
|
atoms = [years, months, weeks, days, hours, minutes, seconds]
|
171
171
|
atoms.map(&:to_seconds).reduce(&:+)
|
172
172
|
end
|
173
|
+
##
|
174
|
+
# @return [Numeric] The duration in days
|
175
|
+
def to_days
|
176
|
+
(to_seconds / 86400)
|
177
|
+
end
|
178
|
+
##
|
179
|
+
# @return [Integer] The integer part of the duration in seconds
|
180
|
+
def to_i
|
181
|
+
to_seconds.to_i
|
182
|
+
end
|
183
|
+
##
|
184
|
+
# @return [Float] The duration in seconds coerced to float
|
185
|
+
def to_f
|
186
|
+
to_seconds.to_f
|
187
|
+
end
|
173
188
|
|
174
189
|
private
|
175
190
|
|
data/lib/iso8601/time.rb
CHANGED
@@ -63,7 +63,7 @@ module ISO8601
|
|
63
63
|
#
|
64
64
|
# @return [ISO8601::Time] New time resulting of the addition
|
65
65
|
def +(other)
|
66
|
-
moment = @time.to_time.localtime(zone) + other.round(1)
|
66
|
+
moment = @time.to_time.localtime(zone) + other.to_f.round(1)
|
67
67
|
base = ::Date.parse(moment.strftime('%Y-%m-%d'))
|
68
68
|
|
69
69
|
self.class.new(moment.strftime('T%H:%M:%S.%L%:z'), base)
|
@@ -75,7 +75,7 @@ module ISO8601
|
|
75
75
|
#
|
76
76
|
# @return [ISO8601::Time] New time resulting of the substraction
|
77
77
|
def -(other)
|
78
|
-
moment = @time.to_time.localtime(zone) - other.round(1)
|
78
|
+
moment = @time.to_time.localtime(zone) - other.to_f.round(1)
|
79
79
|
base = ::Date.parse(moment.strftime('%Y-%m-%d'))
|
80
80
|
|
81
81
|
self.class.new(moment.strftime('T%H:%M:%S.%L%:z'), base)
|
@@ -115,22 +115,32 @@ module ISO8601
|
|
115
115
|
fail ISO8601::Errors::UnknownPattern, @original if hour.nil?
|
116
116
|
|
117
117
|
@separator = separator
|
118
|
+
require_separator = !minute.nil?
|
118
119
|
|
119
120
|
hour = hour.to_i
|
120
121
|
minute = minute.to_i
|
121
122
|
second = second.nil? ? 0.0 : second.tr(',', '.').to_f
|
122
123
|
|
123
|
-
|
124
|
+
atoms = [hour, minute, second, zone].compact
|
124
125
|
|
125
|
-
[hour, minute, second, zone].compact
|
126
|
-
end
|
127
126
|
|
128
|
-
|
127
|
+
fail ISO8601::Errors::UnknownPattern, @original unless valid_zone?(zone, require_separator)
|
128
|
+
|
129
|
+
atoms
|
130
|
+
end
|
131
|
+
##
|
132
|
+
# @param [String] zone The timezone offset as Z or +-hh[:mm].
|
133
|
+
# @param [Boolean] require_separator Flag to determine if the separator
|
134
|
+
# consistency check is required as patterns with only hour atom have no
|
135
|
+
# separator but the timezone can.
|
136
|
+
def valid_zone?(zone, require_separator)
|
129
137
|
zone_regexp = /^(Z|[+-]\d{2}(?:(:?)\d{2})?)$/
|
130
138
|
_, offset, separator = zone_regexp.match(zone).to_a.compact
|
131
139
|
|
132
140
|
wrong_pattern = !zone.nil? && offset.nil?
|
133
|
-
|
141
|
+
if (require_separator)
|
142
|
+
invalid_separators = zone.to_s.match(/^[+-]\d{2}:?\d{2}$/) && (@separator != separator)
|
143
|
+
end
|
134
144
|
|
135
145
|
!(wrong_pattern || invalid_separators)
|
136
146
|
end
|
data/lib/iso8601/version.rb
CHANGED
data/spec/iso8601/date_spec.rb
CHANGED
@@ -54,15 +54,21 @@ describe ISO8601::Date do
|
|
54
54
|
end
|
55
55
|
|
56
56
|
describe '#+' do
|
57
|
-
it "should return the result of the addition" do
|
57
|
+
it "should return the result of the addition of a number" do
|
58
58
|
expect((ISO8601::Date.new('2012-07-07') + 7).to_s).to eq('2012-07-14')
|
59
59
|
end
|
60
|
+
it "should return the result of the addition of a Duration" do
|
61
|
+
expect((ISO8601::Date.new('2012-07-07') + ISO8601::Duration.new('P7D')).to_s).to eq('2012-07-14')
|
62
|
+
end
|
60
63
|
end
|
61
64
|
|
62
65
|
describe '#-' do
|
63
|
-
it "should return the result of the
|
66
|
+
it "should return the result of the subtraction" do
|
64
67
|
expect((ISO8601::Date.new('2012-07-07') - 7).to_s).to eq('2012-06-30')
|
65
68
|
end
|
69
|
+
it "should return the result of the subtraction" do
|
70
|
+
expect((ISO8601::Date.new('2012-07-07') - ISO8601::Duration.new('P7D')).to_s).to eq('2012-06-30')
|
71
|
+
end
|
66
72
|
end
|
67
73
|
|
68
74
|
describe '#to_a' do
|
@@ -102,7 +102,7 @@ describe ISO8601::DateTime do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
describe '#+' do
|
105
|
-
it "should return the result of the addition" do
|
105
|
+
it "should return the result of the addition of a number" do
|
106
106
|
expect((ISO8601::DateTime.new('2012-07-07T20:20:20Z') + 10).to_s).to eq('2012-07-07T20:20:30+00:00')
|
107
107
|
expect((ISO8601::DateTime.new('2012-07-07T20:20:20.5Z') + 10).to_s).to eq('2012-07-07T20:20:30.5+00:00')
|
108
108
|
expect((ISO8601::DateTime.new('2012-07-07T20:20:20+02:00') + 10.09).to_s).to eq('2012-07-07T20:20:30.1+02:00')
|
@@ -111,12 +111,19 @@ describe ISO8601::DateTime do
|
|
111
111
|
expect((ISO8601::DateTime.new('2012-07-07T20:20:20.5Z') + 10).second).to eq(30.5)
|
112
112
|
expect((ISO8601::DateTime.new('2012-07-07T20:20:20+02:00') + 10.09).second).to eq(30.1)
|
113
113
|
end
|
114
|
+
it "should return the result of the addition of a Duration" do
|
115
|
+
expect((ISO8601::DateTime.new('2012-07-07T20:20:20Z') + ISO8601::Duration.new("PT10S")).to_s).to eq('2012-07-07T20:20:30+00:00')
|
116
|
+
expect((ISO8601::DateTime.new('2015-07-07T20:20:20Z') + ISO8601::Duration.new("P10D")).to_s).to eq('2015-07-17T20:20:20+00:00')
|
117
|
+
end
|
114
118
|
end
|
115
119
|
|
116
120
|
describe '#-' do
|
117
|
-
it "should return the result of the
|
121
|
+
it "should return the result of the subtraction of a number" do
|
118
122
|
expect((ISO8601::DateTime.new('2012-07-07T20:20:20Z') - 10).to_s).to eq('2012-07-07T20:20:10+00:00')
|
119
123
|
end
|
124
|
+
it "should return the result of the subtraction of a Duration" do
|
125
|
+
expect((ISO8601::DateTime.new('2012-07-07T20:20:20Z') - ISO8601::Duration.new(10)).to_s).to eq('2012-07-07T20:20:10+00:00')
|
126
|
+
end
|
120
127
|
end
|
121
128
|
|
122
129
|
describe '#to_a' do
|
@@ -100,7 +100,7 @@ RSpec.describe ISO8601::Duration do
|
|
100
100
|
expect { ISO8601::Duration.new('PT1H', ISO8601::DateTime.new('2000-01-01')) - ISO8601::Duration.new('PT1H') }.to raise_error(ISO8601::Errors::DurationBaseError)
|
101
101
|
end
|
102
102
|
|
103
|
-
it "should return the result of the
|
103
|
+
it "should return the result of the subtraction" do
|
104
104
|
expect(ISO8601::Duration.new('P1Y1M1DT1H1M1S') - ISO8601::Duration.new('PT10S')).to be_an_instance_of(ISO8601::Duration)
|
105
105
|
expect((ISO8601::Duration.new('P1Y1M1DT1H1M11S') - ISO8601::Duration.new('PT10S')).to_s).to eq('P1Y1M1DT1H1M1S')
|
106
106
|
expect((ISO8601::Duration.new('P1Y1M1DT1H1M11S') - ISO8601::Duration.new('P1Y1M1DT1H1M11S')).to_s).to eq('PT0S')
|
@@ -111,6 +111,13 @@ RSpec.describe ISO8601::Duration do
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
describe "#to_days" do
|
115
|
+
it "should return the days of a duration" do
|
116
|
+
expect(ISO8601::Duration.new('P1Y', ISO8601::DateTime.new('2010-01-01')).to_days).to eq(365)
|
117
|
+
expect(ISO8601::Duration.new('P1D').to_days).to eq(1)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
114
121
|
describe '#to_seconds' do
|
115
122
|
context 'positive durations' do
|
116
123
|
it "should return the seconds of a P[n]Y duration in a common year" do
|
data/spec/iso8601/time_spec.rb
CHANGED
@@ -17,6 +17,8 @@ describe ISO8601::Time do
|
|
17
17
|
|
18
18
|
it "should parse any allowed pattern" do
|
19
19
|
expect { ISO8601::Time.new('T10') }.to_not raise_error
|
20
|
+
expect { ISO8601::Time.new('T10-00:00') }.to_not raise_error
|
21
|
+
expect { ISO8601::Time.new('T10Z') }.to_not raise_error
|
20
22
|
expect { ISO8601::Time.new('T10:30') }.to_not raise_error
|
21
23
|
expect { ISO8601::Time.new('T10:30Z') }.to_not raise_error
|
22
24
|
expect { ISO8601::Time.new('T10:30:12') }.to_not raise_error
|
@@ -28,6 +30,7 @@ describe ISO8601::Time do
|
|
28
30
|
expect { ISO8601::Time.new('T103012+04') }.to_not raise_error
|
29
31
|
expect { ISO8601::Time.new('T10:30:12-00:00') }.to_not raise_error
|
30
32
|
expect { ISO8601::Time.new('T16:26:10,5Z') }.to_not raise_error
|
33
|
+
expect { ISO8601::Time.new('T10+00:00') }.to_not raise_error
|
31
34
|
end
|
32
35
|
|
33
36
|
context 'reduced patterns' do
|
@@ -56,7 +59,7 @@ describe ISO8601::Time do
|
|
56
59
|
end
|
57
60
|
|
58
61
|
describe '#+' do
|
59
|
-
it "should return the result of the addition" do
|
62
|
+
it "should return the result of the addition of a number" do
|
60
63
|
expect((ISO8601::Time.new('T20:20:20Z') + 10).to_s).to eq('T20:20:30+00:00')
|
61
64
|
expect((ISO8601::Time.new('T20:20:20.5Z') + 10).to_s).to eq('T20:20:30.5+00:00')
|
62
65
|
expect((ISO8601::Time.new('T20:20:20+02:00') + 10.09).to_s).to eq('T20:20:30.1+02:00')
|
@@ -65,14 +68,19 @@ describe ISO8601::Time do
|
|
65
68
|
expect((ISO8601::Time.new('T20:20:20.5Z') + 10).second).to eq(30.5)
|
66
69
|
expect((ISO8601::Time.new('T20:20:20+02:00') + 10.09).second).to eq(30.1)
|
67
70
|
end
|
68
|
-
|
71
|
+
it "should return the result of the addition of a Duration" do
|
72
|
+
expect((ISO8601::Time.new('T20:20:20Z') + ISO8601::Duration.new("PT10S")).to_s).to eq('T20:20:30+00:00')
|
73
|
+
end
|
69
74
|
end
|
70
75
|
|
71
76
|
describe '#-' do
|
72
|
-
it "should return the result of the
|
77
|
+
it "should return the result of the subtraction of a number" do
|
73
78
|
expect((ISO8601::Time.new('T20:20:20+01:00') - 10).to_s).to eq('T20:20:10+01:00')
|
74
79
|
expect((ISO8601::Time.new('T20:20:20.11+02:00') - 10).to_s).to eq('T20:20:10.1+02:00')
|
75
80
|
end
|
81
|
+
it "should return the result of the subtraction of a Duration" do
|
82
|
+
expect((ISO8601::Time.new('T20:20:20+01:00') - ISO8601::Duration.new("PT10S")).to_s).to eq('T20:20:10+01:00')
|
83
|
+
end
|
76
84
|
end
|
77
85
|
|
78
86
|
describe '#to_a' do
|
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.8.
|
4
|
+
version: 0.8.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arnau Siches
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- README.md
|
60
60
|
- Rakefile
|
61
61
|
- Vagrantfile
|
62
|
+
- circle.yml
|
62
63
|
- iso8601.gemspec
|
63
64
|
- lib/iso8601.rb
|
64
65
|
- lib/iso8601/atoms.rb
|
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
95
|
version: '0'
|
95
96
|
requirements: []
|
96
97
|
rubyforge_project: iso8601
|
97
|
-
rubygems_version: 2.
|
98
|
+
rubygems_version: 2.4.5
|
98
99
|
signing_key:
|
99
100
|
specification_version: 4
|
100
101
|
summary: Ruby parser to work with ISO 8601 dateTimes and durations - http://en.wikipedia.org/wiki/ISO_8601
|