ruby-duration 3.0.0 → 3.1.0
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.
- data/.travis.yml +1 -1
- data/lib/duration.rb +23 -4
- data/lib/duration/version.rb +1 -1
- data/ruby-duration.gemspec +1 -0
- data/test/helper.rb +2 -2
- data/test/test_duration.rb +43 -5
- metadata +19 -3
data/.travis.yml
CHANGED
data/lib/duration.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
require 'i18n'
|
3
3
|
require 'active_support/core_ext'
|
4
|
+
require 'iso8601'
|
4
5
|
|
5
6
|
# Duration objects are simple mechanisms that allow you to operate on durations
|
6
7
|
# of time. They allow you to know how much time has passed since a certain
|
@@ -39,6 +40,8 @@ class Duration
|
|
39
40
|
unit = unit.to_sym
|
40
41
|
@seconds += args[unit].to_i * multiple if args.key?(unit)
|
41
42
|
end
|
43
|
+
elsif args.kind_of?(String) and args[0] == 'P'
|
44
|
+
@seconds = ISO8601::Duration.new(args).to_seconds
|
42
45
|
else
|
43
46
|
@seconds = args.to_i
|
44
47
|
end
|
@@ -46,6 +49,14 @@ class Duration
|
|
46
49
|
calculate!
|
47
50
|
end
|
48
51
|
|
52
|
+
def self.load string
|
53
|
+
self.new(string)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.dump duration
|
57
|
+
duration.iso8601
|
58
|
+
end
|
59
|
+
|
49
60
|
# Compare this duration to another (or objects that respond to #to_i)
|
50
61
|
def <=>(other)
|
51
62
|
return false unless other.is_a?(Duration)
|
@@ -81,8 +92,8 @@ class Duration
|
|
81
92
|
def iso8601
|
82
93
|
output = 'P'
|
83
94
|
|
84
|
-
|
85
|
-
output << "#{
|
95
|
+
number_of_days = weeks * 7 + days
|
96
|
+
output << "#{number_of_days}D" if number_of_days > 0
|
86
97
|
if seconds > 0 || minutes > 0 || hours > 0
|
87
98
|
output << 'T'
|
88
99
|
output << "#{hours}H" if hours > 0
|
@@ -115,6 +126,10 @@ class Duration
|
|
115
126
|
# %tm => total minutes
|
116
127
|
# %ts => total seconds
|
117
128
|
# %t => total seconds
|
129
|
+
# %MP => minutes with UTF-8 prime
|
130
|
+
# %SP => seconds with UTF-8 double-prime
|
131
|
+
# %MH => minutes with HTML prime
|
132
|
+
# %SH => seconds with HTML double-prime
|
118
133
|
# %H => zero-padded hours
|
119
134
|
# %M => zero-padded minutes
|
120
135
|
# %S => zero-padded seconds
|
@@ -161,6 +176,10 @@ class Duration
|
|
161
176
|
'tm' => Proc.new { total_minutes },
|
162
177
|
'ts' => @total,
|
163
178
|
't' => @total,
|
179
|
+
'MP' => Proc.new { "#{@minutes}′"},
|
180
|
+
'SP' => Proc.new { "#{@seconds}″"},
|
181
|
+
'MH' => Proc.new { "#{@minutes}′"},
|
182
|
+
'SH' => Proc.new { "#{@seconds}″"},
|
164
183
|
'H' => @hours.to_s.rjust(2, '0'),
|
165
184
|
'M' => @minutes.to_s.rjust(2, '0'),
|
166
185
|
'S' => @seconds.to_s.rjust(2, '0'),
|
@@ -172,10 +191,10 @@ class Duration
|
|
172
191
|
'tdu'=> Proc.new { "#{total_days} #{i18n_for(:total_day)}"},
|
173
192
|
'thu'=> Proc.new { "#{total_hours} #{i18n_for(:total_hour)}"},
|
174
193
|
'tmu'=> Proc.new { "#{total_minutes} #{i18n_for(:total_minute)}"},
|
175
|
-
'tsu'=> Proc.new { "#{total} #{i18n_for(:total)}"}
|
194
|
+
'tsu'=> Proc.new { "#{total} #{i18n_for(:total)}"},
|
176
195
|
}
|
177
196
|
|
178
|
-
format_str.gsub(/%?%(w|d|h|m|s|t([dhms]u?)?|H|M|S|~(?:s|m|h|d|w))/) do |match|
|
197
|
+
format_str.gsub(/%?%(w|d|h|m|s|t([dhms]u?)?|MP|SP|MH|SH|H|M|S|~(?:s|m|h|d|w))/) do |match|
|
179
198
|
match['%%'] ? match : (identifiers[match[1..-1]].class == Proc ? identifiers[match[1..-1]].call : identifiers[match[1..-1]])
|
180
199
|
end.gsub('%%', '%')
|
181
200
|
end
|
data/lib/duration/version.rb
CHANGED
data/ruby-duration.gemspec
CHANGED
data/test/helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
require 'rubygems'
|
3
|
-
require 'minitest/
|
3
|
+
require 'minitest/autorun'
|
4
4
|
begin
|
5
5
|
require 'simplecov'
|
6
6
|
SimpleCov.start do
|
@@ -12,4 +12,4 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
12
12
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
13
13
|
require 'ruby-duration'
|
14
14
|
|
15
|
-
MiniTest
|
15
|
+
MiniTest.autorun
|
data/test/test_duration.rb
CHANGED
@@ -28,6 +28,12 @@ describe "Duration" do
|
|
28
28
|
assert_equal 9, d.total_days
|
29
29
|
end
|
30
30
|
|
31
|
+
it 'should load and dump' do
|
32
|
+
duration = Duration.new(:seconds => 3)
|
33
|
+
assert_equal 'PT3S', Duration.dump(duration)
|
34
|
+
assert_equal Duration.load('PT3S'), duration
|
35
|
+
end
|
36
|
+
|
31
37
|
describe "mathematical operations" do
|
32
38
|
|
33
39
|
it "should +" do
|
@@ -123,6 +129,38 @@ describe "Duration" do
|
|
123
129
|
end
|
124
130
|
end
|
125
131
|
|
132
|
+
describe "output typographic marks for minutes and seconds" do
|
133
|
+
it "uses a UTF-8 double prime for seconds" do
|
134
|
+
d = Duration.new(:seconds => 14)
|
135
|
+
assert_equal "14″", d.format("%SP")
|
136
|
+
end
|
137
|
+
|
138
|
+
it "uses a UTF-8 prime for seconds" do
|
139
|
+
d = Duration.new(:minutes => 21)
|
140
|
+
assert_equal "21′", d.format("%MP")
|
141
|
+
end
|
142
|
+
|
143
|
+
it "uses a HTML double prime for seconds" do
|
144
|
+
d = Duration.new(:seconds => 14)
|
145
|
+
assert_equal "14″", d.format("%SH")
|
146
|
+
end
|
147
|
+
|
148
|
+
it "uses a HTML prime for seconds" do
|
149
|
+
d = Duration.new(:minutes => 21)
|
150
|
+
assert_equal "21′", d.format("%MH")
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "creation from iso_8601" do
|
155
|
+
it "should work" do
|
156
|
+
assert_equal 60, Duration.new("PT1M").to_i
|
157
|
+
assert_equal 3630, Duration.new("PT1H30S").to_i
|
158
|
+
|
159
|
+
duration = Duration.new(:weeks => 1, :days => 1, :hours => 2, :minutes => 1, :seconds => 2)
|
160
|
+
assert_equal duration, Duration.new(duration.iso8601)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
126
164
|
describe "#iso_6801" do
|
127
165
|
it "should format seconds" do
|
128
166
|
d = Duration.new(:seconds => 1)
|
@@ -144,20 +182,20 @@ describe "Duration" do
|
|
144
182
|
assert_equal "P1D", d.iso8601
|
145
183
|
end
|
146
184
|
|
147
|
-
it "should format weeks" do
|
185
|
+
it "should format weeks as ndays" do
|
148
186
|
d = Duration.new(:weeks => 1)
|
149
|
-
assert_equal "
|
187
|
+
assert_equal "P7D", d.iso8601
|
150
188
|
end
|
151
189
|
|
152
190
|
it "should format only with given values" do
|
153
191
|
d = Duration.new(:weeks => 1, :days => 2, :hours => 3, :minutes => 4, :seconds => 5)
|
154
|
-
assert_equal "
|
192
|
+
assert_equal "P9DT3H4M5S", d.iso8601
|
155
193
|
|
156
194
|
d = Duration.new(:weeks => 1, :hours => 2, :seconds => 3)
|
157
|
-
assert_equal "
|
195
|
+
assert_equal "P7DT2H3S", d.iso8601
|
158
196
|
|
159
197
|
d = Duration.new(:weeks => 1, :days => 2)
|
160
|
-
assert_equal "
|
198
|
+
assert_equal "P9D", d.iso8601
|
161
199
|
|
162
200
|
d = Duration.new(:hours => 1, :seconds => 30)
|
163
201
|
assert_equal "PT1H30S", d.iso8601
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-duration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-07-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -44,6 +44,22 @@ dependencies:
|
|
44
44
|
- - ! '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: iso8601
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
47
63
|
- !ruby/object:Gem::Dependency
|
48
64
|
name: bundler
|
49
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -180,7 +196,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
180
196
|
version: '0'
|
181
197
|
segments:
|
182
198
|
- 0
|
183
|
-
hash:
|
199
|
+
hash: 1867546005898660473
|
184
200
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
201
|
none: false
|
186
202
|
requirements:
|