ruby-duration 2.0.2 → 2.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/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm 1.9.2@ruby-duration
1
+ rvm 1.9.3@ruby-duration
data/Gemfile.lock CHANGED
@@ -1,22 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-duration (2.0.1)
4
+ ruby-duration (2.1.0)
5
5
  activesupport (>= 3.0.0)
6
6
  i18n
7
7
 
8
8
  GEM
9
9
  remote: http://rubygems.org/
10
10
  specs:
11
- activesupport (3.0.9)
12
- bluecloth (2.0.9)
13
- i18n (0.5.0)
14
- minitest (1.7.2)
15
- rake (0.8.7)
16
- simplecov (0.3.6)
17
- simplecov-html (>= 0.3.7)
18
- simplecov-html (0.3.8)
19
- yard (0.6.1)
11
+ activesupport (3.2.3)
12
+ i18n (~> 0.6)
13
+ multi_json (~> 1.0)
14
+ bluecloth (2.2.0)
15
+ i18n (0.6.0)
16
+ minitest (2.12.0)
17
+ multi_json (1.2.0)
18
+ rake (0.9.2.2)
19
+ simplecov (0.6.1)
20
+ multi_json (~> 1.0)
21
+ simplecov-html (~> 0.5.3)
22
+ simplecov-html (0.5.3)
23
+ yard (0.7.5)
20
24
 
21
25
  PLATFORMS
22
26
  ruby
data/lib/duration.rb CHANGED
@@ -71,6 +71,10 @@ class Duration
71
71
  def %(other)
72
72
  Duration.new(@total % other.to_i)
73
73
  end
74
+
75
+ %w(minutes hours days).each do |meth|
76
+ define_method("total_#{meth}") { @total / MULTIPLES[meth.to_sym] }
77
+ end
74
78
 
75
79
  # Formats a duration in ISO8601.
76
80
  # @see http://en.wikipedia.org/wiki/ISO_8601#Durations
@@ -101,20 +105,28 @@ class Duration
101
105
 
102
106
  # Format a duration into a human-readable string.
103
107
  #
104
- # %w => weeks
105
- # %d => days
106
- # %h => hours
107
- # %m => minutes
108
- # %s => seconds
109
- # %t => total seconds
110
- # %H => zero-padded hours
111
- # %M => zero-padded minutes
112
- # %S => zero-padded seconds
113
- # %~s => locale-dependent "seconds" terminology
114
- # %~m => locale-dependent "minutes" terminology
115
- # %~h => locale-dependent "hours" terminology
116
- # %~d => locale-dependent "days" terminology
117
- # %~w => locale-dependent "weeks" terminology
108
+ # %w => weeks
109
+ # %d => days
110
+ # %h => hours
111
+ # %m => minutes
112
+ # %s => seconds
113
+ # %td => total days
114
+ # %th => total hours
115
+ # %tm => total minutes
116
+ # %ts => total seconds
117
+ # %t => total seconds
118
+ # %H => zero-padded hours
119
+ # %M => zero-padded minutes
120
+ # %S => zero-padded seconds
121
+ # %~s => locale-dependent "seconds" terminology
122
+ # %~m => locale-dependent "minutes" terminology
123
+ # %~h => locale-dependent "hours" terminology
124
+ # %~d => locale-dependent "days" terminology
125
+ # %~w => locale-dependent "weeks" terminology
126
+ # %tdu => total days with locale-dependent unit
127
+ # %thu => total hours with locale-dependent unit
128
+ # %tmu => total minutes with locale-dependent unit
129
+ # %tsu => total seconds with locale-dependent unit
118
130
  #
119
131
  # You can also use the I18n support.
120
132
  # The %~s, %~m, %~h, %~d and %~w can be translated with I18n.
@@ -144,6 +156,10 @@ class Duration
144
156
  'h' => @hours,
145
157
  'm' => @minutes,
146
158
  's' => @seconds,
159
+ 'td' => Proc.new { total_days },
160
+ 'th' => Proc.new { total_hours },
161
+ 'tm' => Proc.new { total_minutes },
162
+ 'ts' => @total,
147
163
  't' => @total,
148
164
  'H' => @hours.to_s.rjust(2, '0'),
149
165
  'M' => @minutes.to_s.rjust(2, '0'),
@@ -152,11 +168,15 @@ class Duration
152
168
  '~m' => i18n_for(:minute),
153
169
  '~h' => i18n_for(:hour),
154
170
  '~d' => i18n_for(:day),
155
- '~w' => i18n_for(:week)
171
+ '~w' => i18n_for(:week),
172
+ 'tdu'=> Proc.new { "#{total_days} #{i18n_for(:total_day)}"},
173
+ 'thu'=> Proc.new { "#{total_hours} #{i18n_for(:total_hour)}"},
174
+ 'tmu'=> Proc.new { "#{total_minutes} #{i18n_for(:total_minute)}"},
175
+ 'tsu'=> Proc.new { "#{total} #{i18n_for(:total)}"}
156
176
  }
157
177
 
158
- format_str.gsub(/%?%(w|d|h|m|s|t|H|M|S|~(?:s|m|h|d|w))/) do |match|
159
- match['%%'] ? match : identifiers[match[1..-1]]
178
+ format_str.gsub(/%?%(w|d|h|m|s|t([dhms]u?)?|H|M|S|~(?:s|m|h|d|w))/) do |match|
179
+ match['%%'] ? match : (identifiers[match[1..-1]].class == Proc ? identifiers[match[1..-1]].call : identifiers[match[1..-1]])
160
180
  end.gsub('%%', '%')
161
181
  end
162
182
 
@@ -183,8 +203,19 @@ private
183
203
  end
184
204
 
185
205
  def i18n_for(singular)
186
- plural = "#{singular}s"
187
- label = send(plural) == 1 ? singular : plural
206
+ if singular == :total
207
+ fn_name = :total
208
+ singular = :second
209
+ plural = 'seconds'
210
+ elsif singular.to_s.start_with?('total_')
211
+ fn_name = "#{singular}s"
212
+ singular = singular.to_s['total_'.length..-1]
213
+ plural = "#{singular}s"
214
+ else
215
+ plural = "#{singular}s"
216
+ fn_name = plural
217
+ end
218
+ label = send(fn_name) == 1 ? singular : plural
188
219
 
189
220
  I18n.t(label, :scope => :ruby_duration, :default => label.to_s)
190
221
  end
@@ -1,3 +1,3 @@
1
1
  class Duration
2
- VERSION = "2.0.2"
3
- end
2
+ VERSION = "2.1.0"
3
+ end
@@ -10,16 +10,22 @@ describe "Duration" do
10
10
  assert_equal 1, d.minutes
11
11
  assert_equal 30, d.seconds
12
12
  assert_equal 90, d.total
13
+ assert_equal 1, d.total_minutes
14
+ assert_equal 0, d.total_hours
15
+ assert_equal 0, d.total_days
13
16
  end
14
17
 
15
18
  it "should initialize given duration in Hash" do
16
19
  d = Duration.new(:weeks => 1, :days => 2, :hours => 3, :minutes => 4, :seconds => 5)
17
- assert_equal 1, d.weeks
18
- assert_equal 2, d.days
19
- assert_equal 3, d.hours
20
- assert_equal 4, d.minutes
21
- assert_equal 5, d.seconds
20
+ assert_equal 1, d.weeks
21
+ assert_equal 2, d.days
22
+ assert_equal 3, d.hours
23
+ assert_equal 4, d.minutes
24
+ assert_equal 5, d.seconds
22
25
  assert_equal 788645, d.total
26
+ assert_equal 13144, d.total_minutes
27
+ assert_equal 219, d.total_hours
28
+ assert_equal 9, d.total_days
23
29
  end
24
30
 
25
31
  describe "mathematical operations" do
@@ -29,22 +35,22 @@ describe "Duration" do
29
35
  assert_equal Duration.new(15), Duration.new(10) + Duration.new(5)
30
36
  end
31
37
 
32
- it "sould -" do
38
+ it "should -" do
33
39
  assert_equal Duration.new(5), Duration.new(10) - 5
34
40
  assert_equal Duration.new(5), Duration.new(10) - Duration.new(5)
35
41
  end
36
42
 
37
- it "sould *" do
43
+ it "should *" do
38
44
  assert_equal Duration.new(20), Duration.new(10) * 2
39
45
  assert_equal Duration.new(20), Duration.new(10) * Duration.new(2)
40
46
  end
41
47
 
42
- it "sould /" do
48
+ it "should /" do
43
49
  assert_equal Duration.new(5), Duration.new(10) / 2
44
50
  assert_equal Duration.new(5), Duration.new(10) / Duration.new(2)
45
51
  end
46
52
 
47
- it "sould %" do
53
+ it "should %" do
48
54
  assert_equal Duration.new(1), Duration.new(10) % 3
49
55
  assert_equal Duration.new(1), Duration.new(10) % Duration.new(3)
50
56
  end
@@ -60,6 +66,61 @@ describe "Duration" do
60
66
  d = Duration.new(:weeks => 1, :days => 1, :hours => 1, :minutes => 1, :seconds => 1)
61
67
  assert_equal "1 week 1 day 1 hour 1 minute 1 second", d.format("%w %~w %d %~d %h %~h %m %~m %s %~s")
62
68
  end
69
+
70
+ it "should display total seconds" do
71
+ d = Duration.new(:hours => 1, :minutes => 15)
72
+ assert_equal "4500 seconds", d.format("%tsu")
73
+ end
74
+
75
+ it "should display total seconds in plural form when needed" do
76
+ d = Duration.new(:minutes => 1, :seconds => 1)
77
+ assert_equal "61 seconds", d.format("%tsu")
78
+ end
79
+
80
+ it "should display total minutes as number" do
81
+ d = Duration.new(:hours => 1, :minutes => 15)
82
+ assert_equal "75", d.format("%tm")
83
+ end
84
+
85
+ it 'should display total minutes with unit' do
86
+ d = Duration.new(:hours => 1, :minutes => 15)
87
+ assert_equal "75 minutes", d.format("%tmu")
88
+ end
89
+
90
+ it "should display total minutes in plural form when needed" do
91
+ d = Duration.new(:hours => 1, :minutes => 1)
92
+ assert_equal "61 minutes", d.format("%tmu")
93
+ end
94
+
95
+ it "should display total hours as number" do
96
+ d = Duration.new(:days => 2, :hours => 1)
97
+ assert_equal "49", d.format("%th")
98
+ end
99
+
100
+ it 'should display total hours with unit' do
101
+ d = Duration.new(:days => 2, :hours => 2)
102
+ assert_equal "50 hours", d.format("%thu")
103
+ end
104
+
105
+ it "should display total hours in plural form when needed" do
106
+ d = Duration.new(:days => 1, :hours => 1)
107
+ assert_equal "25 hours", d.format("%thu")
108
+ end
109
+
110
+ it "should display total days as number" do
111
+ d = Duration.new(:weeks => 1, :days => 3)
112
+ assert_equal "10", d.format("%td")
113
+ end
114
+
115
+ it 'should display total days with unit' do
116
+ d = Duration.new(:weeks => 1, :days => 2)
117
+ assert_equal "9 days", d.format("%tdu")
118
+ end
119
+
120
+ it "should display total days in plural form when needed" do
121
+ d = Duration.new(:weeks => 1, :days => 1)
122
+ assert_equal "8 days", d.format("%tdu")
123
+ end
63
124
  end
64
125
 
65
126
  describe "#iso_6801" do
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: 2.0.2
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-08-04 00:00:00.000000000Z
13
+ date: 2012-04-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
- requirement: &2153695180 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: 3.0.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2153695180
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 3.0.0
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: i18n
28
- requirement: &2153694720 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ! '>='
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: '0'
34
39
  type: :runtime
35
40
  prerelease: false
36
- version_requirements: *2153694720
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: bundler
39
- requirement: &2153694260 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ! '>='
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: 1.0.0
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *2153694260
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.0
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: minitest
50
- requirement: &2153693800 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ! '>='
@@ -55,10 +70,15 @@ dependencies:
55
70
  version: '0'
56
71
  type: :development
57
72
  prerelease: false
58
- version_requirements: *2153693800
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
59
79
  - !ruby/object:Gem::Dependency
60
80
  name: yard
61
- requirement: &2153693340 !ruby/object:Gem::Requirement
81
+ requirement: !ruby/object:Gem::Requirement
62
82
  none: false
63
83
  requirements:
64
84
  - - ! '>='
@@ -66,10 +86,15 @@ dependencies:
66
86
  version: '0'
67
87
  type: :development
68
88
  prerelease: false
69
- version_requirements: *2153693340
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
70
95
  - !ruby/object:Gem::Dependency
71
96
  name: rake
72
- requirement: &2153692880 !ruby/object:Gem::Requirement
97
+ requirement: !ruby/object:Gem::Requirement
73
98
  none: false
74
99
  requirements:
75
100
  - - ! '>='
@@ -77,10 +102,15 @@ dependencies:
77
102
  version: '0'
78
103
  type: :development
79
104
  prerelease: false
80
- version_requirements: *2153692880
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
81
111
  - !ruby/object:Gem::Dependency
82
112
  name: simplecov
83
- requirement: &2153692420 !ruby/object:Gem::Requirement
113
+ requirement: !ruby/object:Gem::Requirement
84
114
  none: false
85
115
  requirements:
86
116
  - - ! '>='
@@ -88,10 +118,15 @@ dependencies:
88
118
  version: 0.3.5
89
119
  type: :development
90
120
  prerelease: false
91
- version_requirements: *2153692420
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: 0.3.5
92
127
  - !ruby/object:Gem::Dependency
93
128
  name: bluecloth
94
- requirement: &2153691960 !ruby/object:Gem::Requirement
129
+ requirement: !ruby/object:Gem::Requirement
95
130
  none: false
96
131
  requirements:
97
132
  - - ! '>='
@@ -99,7 +134,12 @@ dependencies:
99
134
  version: 0.3.5
100
135
  type: :development
101
136
  prerelease: false
102
- version_requirements: *2153691960
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: 0.3.5
103
143
  description: Duration type
104
144
  email:
105
145
  - jose@peleteiro.net
@@ -146,8 +186,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
186
  version: 1.3.6
147
187
  requirements: []
148
188
  rubyforge_project: ruby-duration
149
- rubygems_version: 1.8.6
189
+ rubygems_version: 1.8.18
150
190
  signing_key:
151
191
  specification_version: 3
152
192
  summary: Duration type
153
193
  test_files: []
194
+ has_rdoc: