gitlab_chronic_duration 0.10.6.2 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +12 -7
- data/README.md +1 -1
- data/gitlab_chronic_duration.gemspec +2 -2
- data/lib/chronic_duration/version.rb +1 -3
- data/lib/gitlab_chronic_duration.rb +10 -1
- data/spec/lib/chronic_duration_spec.rb +51 -46
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd977f94bc4ee464a30cfacd01d6253b80257a12954999177ceea000d5062e3c
|
4
|
+
data.tar.gz: df6259ba488ea8602b07fde675dda671a4c935e66fba40e394ac7dc958010a1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 820338929f8edee97de15fcdc6a3de01f5ea02ab327628c48805f3b02fa4a5a05d168fd75f63843873f3ce078369bdbd2d731fbffa7db0052fcc99765e42b85a
|
7
|
+
data.tar.gz: deac822896c3f81c5f776fa1375ed6e23aad9ee27213b1192e863502f9419d56fba805a30f7c276707353dd98a97a8d4e3bd937a8ebf683e87e2a8731a75783b
|
data/.gitlab-ci.yml
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
before_script:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
.default:
|
2
|
+
image: "ruby:${RUBY_VERSION}"
|
3
|
+
before_script:
|
4
|
+
- ruby -v
|
5
|
+
- which ruby
|
6
|
+
- gem install bundler
|
7
|
+
- bundle install --jobs $(nproc) "${FLAGS[@]}"
|
8
8
|
|
9
9
|
rspec:
|
10
|
+
extends:
|
11
|
+
- .default
|
10
12
|
stage: test
|
11
13
|
script:
|
12
14
|
- bundle exec rspec
|
15
|
+
parallel:
|
16
|
+
matrix:
|
17
|
+
- RUBY_VERSION: ['2.7', '3.0', '3.1', '3.2']
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.email = ["henry@poydar.com"]
|
12
12
|
gem.description = %q{A simple Ruby natural language parser for elapsed time. (For example, 4 hours and 30 minutes, 6 minutes 4 seconds, 3 days, etc.) Returns all results in seconds. Will return an integer unless you get tricky and need a float. (4 minutes and 13.47 seconds, for example.) The reverse can also be performed via the output method.}
|
13
13
|
gem.summary = %q{A simple Ruby natural language parser for elapsed time}
|
14
|
-
gem.homepage = "https://gitlab.com/gitlab-org/gitlab-chronic-duration"
|
14
|
+
gem.homepage = "https://gitlab.com/gitlab-org/ruby/gems/gitlab-chronic-duration"
|
15
15
|
gem.license = "MIT"
|
16
16
|
|
17
17
|
gem.files = `git ls-files`.split($/)
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_runtime_dependency "numerizer", "~> 0.2"
|
23
23
|
|
24
24
|
gem.add_development_dependency "rake", "~> 10.0.3"
|
25
|
-
gem.add_development_dependency "rspec", "~>
|
25
|
+
gem.add_development_dependency "rspec", "~> 3.12"
|
26
26
|
|
27
27
|
|
28
28
|
end
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# NOTE:
|
2
|
+
# Changes to this file should be kept in sync with
|
3
|
+
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/chronic_duration.js.
|
4
|
+
|
1
5
|
require 'numerizer' unless defined?(Numerizer)
|
2
6
|
|
3
7
|
module ChronicDuration
|
@@ -220,7 +224,8 @@ private
|
|
220
224
|
# Parse 3:41:59 and return 3 hours 41 minutes 59 seconds
|
221
225
|
def filter_by_type(string)
|
222
226
|
chrono_units_list = duration_units_list.reject {|v| v == "weeks"}
|
223
|
-
|
227
|
+
|
228
|
+
if string.gsub(' ', '') =~ time_matcher
|
224
229
|
res = []
|
225
230
|
string.gsub(' ', '').split(':').reverse.each_with_index do |v,k|
|
226
231
|
return unless chrono_units_list[k]
|
@@ -233,6 +238,10 @@ private
|
|
233
238
|
res
|
234
239
|
end
|
235
240
|
|
241
|
+
def time_matcher
|
242
|
+
/^[0-9]+:[0-9]+(:[0-9]+){0,4}(\.[0-9]*)?$/
|
243
|
+
end
|
244
|
+
|
236
245
|
def float_matcher
|
237
246
|
/[0-9]*\.?[0-9]+/
|
238
247
|
end
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# NOTE:
|
2
|
+
# Changes to this file should be kept in sync with
|
3
|
+
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/frontend/chronic_duration_spec.js.
|
4
|
+
|
1
5
|
require 'spec_helper'
|
2
6
|
|
3
7
|
describe ChronicDuration do
|
@@ -34,11 +38,11 @@ describe ChronicDuration do
|
|
34
38
|
context "when string can't be parsed" do
|
35
39
|
|
36
40
|
it "returns nil" do
|
37
|
-
ChronicDuration.parse('gobblygoo').
|
41
|
+
expect(ChronicDuration.parse('gobblygoo')).to be_nil
|
38
42
|
end
|
39
43
|
|
40
44
|
it "cannot parse zero" do
|
41
|
-
ChronicDuration.parse('0').
|
45
|
+
expect(ChronicDuration.parse('0')).to be_nil
|
42
46
|
end
|
43
47
|
|
44
48
|
context "when @@raise_exceptions set to true" do
|
@@ -54,47 +58,47 @@ describe ChronicDuration do
|
|
54
58
|
end
|
55
59
|
|
56
60
|
it "should return zero if the string parses as zero and the keep_zero option is true" do
|
57
|
-
ChronicDuration.parse('0', :keep_zero => true).
|
61
|
+
expect(ChronicDuration.parse('0', :keep_zero => true)).to eq(0)
|
58
62
|
end
|
59
63
|
|
60
64
|
it "should return a float if seconds are in decimals" do
|
61
|
-
ChronicDuration.parse('12 mins 3.141 seconds').
|
65
|
+
expect(ChronicDuration.parse('12 mins 3.141 seconds')).to be_a(Float)
|
62
66
|
end
|
63
67
|
|
64
68
|
it "should return an integer unless the seconds are in decimals" do
|
65
|
-
ChronicDuration.parse('12 mins 3 seconds').
|
69
|
+
expect(ChronicDuration.parse('12 mins 3 seconds')).to be_a(Integer)
|
66
70
|
end
|
67
71
|
|
68
72
|
it "should be able to parse minutes by default" do
|
69
|
-
ChronicDuration.parse('5', :default_unit => "minutes").
|
73
|
+
expect(ChronicDuration.parse('5', :default_unit => "minutes")).to eq(300)
|
70
74
|
end
|
71
75
|
|
72
76
|
@exemplars.each do |k, v|
|
73
77
|
it "parses a duration like #{k}" do
|
74
|
-
ChronicDuration.parse(k).
|
78
|
+
expect(ChronicDuration.parse(k)).to eq(v)
|
75
79
|
end
|
76
80
|
end
|
77
81
|
|
78
82
|
context 'with :hours_per_day and :days_per_month params' do
|
79
83
|
it 'uses provided :hours_per_day' do
|
80
|
-
ChronicDuration.parse('1d', hours_per_day: 24).
|
81
|
-
ChronicDuration.parse('1d', hours_per_day: 8).
|
84
|
+
expect(ChronicDuration.parse('1d', hours_per_day: 24)).to eq(24 * 60 * 60)
|
85
|
+
expect(ChronicDuration.parse('1d', hours_per_day: 8)).to eq(8 * 60 * 60)
|
82
86
|
end
|
83
87
|
|
84
88
|
it 'uses provided :days_per_month' do
|
85
|
-
ChronicDuration.parse('1mo', days_per_month: 30).
|
86
|
-
ChronicDuration.parse('1mo', days_per_month: 20).
|
89
|
+
expect(ChronicDuration.parse('1mo', days_per_month: 30)).to eq(30 * 24 * 60 * 60)
|
90
|
+
expect(ChronicDuration.parse('1mo', days_per_month: 20)).to eq(20 * 24 * 60 * 60)
|
87
91
|
|
88
|
-
ChronicDuration.parse('1w', days_per_month: 30).
|
89
|
-
ChronicDuration.parse('1w', days_per_month: 20).
|
92
|
+
expect(ChronicDuration.parse('1w', days_per_month: 30)).to eq(7 * 24 * 60 * 60)
|
93
|
+
expect(ChronicDuration.parse('1w', days_per_month: 20)).to eq(5 * 24 * 60 * 60)
|
90
94
|
end
|
91
95
|
|
92
96
|
it 'uses provided both :hours_per_day and :days_per_month' do
|
93
|
-
ChronicDuration.parse('1mo', days_per_month: 30, hours_per_day: 24).
|
94
|
-
ChronicDuration.parse('1mo', days_per_month: 20, hours_per_day: 8).
|
97
|
+
expect(ChronicDuration.parse('1mo', days_per_month: 30, hours_per_day: 24)).to eq(30 * 24 * 60 * 60)
|
98
|
+
expect(ChronicDuration.parse('1mo', days_per_month: 20, hours_per_day: 8)).to eq(20 * 8 * 60 * 60)
|
95
99
|
|
96
|
-
ChronicDuration.parse('1w', days_per_month: 30, hours_per_day: 24).
|
97
|
-
ChronicDuration.parse('1w', days_per_month: 20, hours_per_day: 8).
|
100
|
+
expect(ChronicDuration.parse('1w', days_per_month: 30, hours_per_day: 24)).to eq(7 * 24 * 60 * 60)
|
101
|
+
expect(ChronicDuration.parse('1w', days_per_month: 20, hours_per_day: 8)).to eq(5 * 8 * 60 * 60)
|
98
102
|
end
|
99
103
|
end
|
100
104
|
end
|
@@ -187,7 +191,7 @@ describe ChronicDuration do
|
|
187
191
|
@exemplars.each do |k, v|
|
188
192
|
v.each do |key, val|
|
189
193
|
it "properly outputs a duration of #{k} seconds as #{val} using the #{key.to_s} format option" do
|
190
|
-
ChronicDuration.output(k, :format => key).
|
194
|
+
expect(ChronicDuration.output(k, :format => key)).to eq(val)
|
191
195
|
end
|
192
196
|
end
|
193
197
|
end
|
@@ -214,83 +218,84 @@ describe ChronicDuration do
|
|
214
218
|
@keep_zero_exemplars.each do |k, v|
|
215
219
|
v.each do |key, val|
|
216
220
|
it "should properly output a duration of 0 seconds as #{val.nil? ? "nil" : val} using the #{key.to_s} format option, if the keep_zero option is #{k.to_s}" do
|
217
|
-
ChronicDuration.output(0, :format => key, :keep_zero => k).
|
221
|
+
expect(ChronicDuration.output(0, :format => key, :keep_zero => k)).to eq(val)
|
218
222
|
end
|
219
223
|
end
|
220
224
|
end
|
221
225
|
|
222
226
|
it "returns weeks when needed" do
|
223
|
-
ChronicDuration.output(45*24*60*60, :weeks => true).
|
227
|
+
expect(ChronicDuration.output(45*24*60*60, :weeks => true)).to match(/.*wk.*/)
|
224
228
|
end
|
225
229
|
|
226
230
|
it "returns hours and minutes only when :hours_only option specified" do
|
227
|
-
ChronicDuration.output(395*24*60*60 + 15*60, :limit_to_hours => true).
|
231
|
+
expect(ChronicDuration.output(395*24*60*60 + 15*60, :limit_to_hours => true)).to eq('9480 hrs 15 mins')
|
228
232
|
end
|
229
233
|
|
230
234
|
context 'with :hours_per_day and :days_per_month params' do
|
231
235
|
it 'uses provided :hours_per_day' do
|
232
|
-
ChronicDuration.output(24 * 60 * 60, hours_per_day: 24).
|
233
|
-
ChronicDuration.output(24 * 60 * 60, hours_per_day: 8).
|
236
|
+
expect(ChronicDuration.output(24 * 60 * 60, hours_per_day: 24)).to eq('1 day')
|
237
|
+
expect(ChronicDuration.output(24 * 60 * 60, hours_per_day: 8)).to eq('3 days')
|
234
238
|
end
|
235
239
|
|
236
240
|
it 'uses provided :days_per_month' do
|
237
|
-
ChronicDuration.output(7 * 24 * 60 * 60, weeks: true, days_per_month: 30).
|
238
|
-
ChronicDuration.output(7 * 24 * 60 * 60, weeks: true, days_per_month: 20).
|
241
|
+
expect(ChronicDuration.output(7 * 24 * 60 * 60, weeks: true, days_per_month: 30)).to eq('1 wk')
|
242
|
+
expect(ChronicDuration.output(7 * 24 * 60 * 60, weeks: true, days_per_month: 20)).to eq('1 wk 2 days')
|
239
243
|
end
|
240
244
|
|
241
245
|
it 'uses provided both :hours_per_day and :days_per_month' do
|
242
|
-
ChronicDuration.output(7 * 24 * 60 * 60, weeks: true, days_per_month: 30, hours_per_day: 24).
|
243
|
-
ChronicDuration.output(5 * 8 * 60 * 60, weeks: true, days_per_month: 20, hours_per_day: 8).
|
246
|
+
expect(ChronicDuration.output(7 * 24 * 60 * 60, weeks: true, days_per_month: 30, hours_per_day: 24)).to eq('1 wk')
|
247
|
+
expect(ChronicDuration.output(5 * 8 * 60 * 60, weeks: true, days_per_month: 20, hours_per_day: 8)).to eq('1 wk')
|
244
248
|
end
|
245
249
|
|
246
250
|
it 'uses provided params alonside with :weeks when converting to months' do
|
247
|
-
ChronicDuration.output(30 * 24 * 60 * 60, days_per_month: 30, hours_per_day: 24).
|
248
|
-
ChronicDuration.output(30 * 24 * 60 * 60, days_per_month: 30, hours_per_day: 24, weeks: true).
|
251
|
+
expect(ChronicDuration.output(30 * 24 * 60 * 60, days_per_month: 30, hours_per_day: 24)).to eq('1 mo')
|
252
|
+
expect(ChronicDuration.output(30 * 24 * 60 * 60, days_per_month: 30, hours_per_day: 24, weeks: true)).to eq('1 mo 2 days')
|
249
253
|
|
250
|
-
ChronicDuration.output(20 * 8 * 60 * 60, days_per_month: 20, hours_per_day: 8).
|
251
|
-
ChronicDuration.output(20 * 8 * 60 * 60, days_per_month: 20, hours_per_day: 8, weeks: true).
|
254
|
+
expect(ChronicDuration.output(20 * 8 * 60 * 60, days_per_month: 20, hours_per_day: 8)).to eq('1 mo')
|
255
|
+
expect(ChronicDuration.output(20 * 8 * 60 * 60, days_per_month: 20, hours_per_day: 8, weeks: true)).to eq('1 mo')
|
252
256
|
end
|
253
257
|
end
|
254
258
|
|
255
259
|
it "returns the specified number of units if provided" do
|
256
|
-
ChronicDuration.output(4 * 3600 + 60 + 1, units: 2).
|
257
|
-
ChronicDuration.output(6 * 30 * 24 * 3600 + 24 * 3600 + 3600 + 60 + 1, units: 3, format: :long).
|
260
|
+
expect(ChronicDuration.output(4 * 3600 + 60 + 1, units: 2)).to eq('4 hrs 1 min')
|
261
|
+
expect(ChronicDuration.output(6 * 30 * 24 * 3600 + 24 * 3600 + 3600 + 60 + 1, units: 3, format: :long)).to eq('6 months 1 day 1 hour')
|
258
262
|
end
|
259
263
|
|
260
264
|
context "when the format is not specified" do
|
261
265
|
|
262
266
|
it "uses the default format" do
|
263
|
-
ChronicDuration.output(2 * 3600 + 20 * 60).
|
267
|
+
expect(ChronicDuration.output(2 * 3600 + 20 * 60)).to eq('2 hrs 20 mins')
|
264
268
|
end
|
265
269
|
|
266
270
|
end
|
267
271
|
|
268
272
|
@exemplars.each do |seconds, format_spec|
|
269
273
|
format_spec.each do |format, _|
|
270
|
-
it "outputs a duration for #{seconds} that parses back to the same thing when using the #{format
|
271
|
-
ChronicDuration.parse(
|
274
|
+
it "outputs a duration for #{seconds} that parses back to the same thing when using the #{format} format" do
|
275
|
+
expect(ChronicDuration.parse(
|
276
|
+
ChronicDuration.output(seconds, format: format, use_complete_matcher: true)
|
277
|
+
)).to eq(seconds)
|
272
278
|
end
|
273
279
|
end
|
274
280
|
end
|
275
281
|
|
276
282
|
it "uses user-specified joiner if provided" do
|
277
|
-
ChronicDuration.output(2 * 3600 + 20 * 60, joiner: ', ').
|
283
|
+
expect(ChronicDuration.output(2 * 3600 + 20 * 60, joiner: ', ')).to eq('2 hrs, 20 mins')
|
278
284
|
end
|
279
|
-
|
280
285
|
end
|
281
286
|
|
282
287
|
describe ".filter_by_type" do
|
283
288
|
|
284
289
|
it "receives a chrono-formatted time like 3:14 and return a human time like 3 minutes 14 seconds" do
|
285
|
-
ChronicDuration.instance_eval("filter_by_type('3:14')").
|
290
|
+
expect(ChronicDuration.instance_eval("filter_by_type('3:14')")).to eq('3 minutes 14 seconds')
|
286
291
|
end
|
287
292
|
|
288
293
|
it "receives chrono-formatted time like 12:10:14 and return a human time like 12 hours 10 minutes 14 seconds" do
|
289
|
-
ChronicDuration.instance_eval("filter_by_type('12:10:14')").
|
294
|
+
expect(ChronicDuration.instance_eval("filter_by_type('12:10:14')")).to eq('12 hours 10 minutes 14 seconds')
|
290
295
|
end
|
291
296
|
|
292
297
|
it "returns the input if it's not a chrono-formatted time" do
|
293
|
-
ChronicDuration.instance_eval("filter_by_type('4 hours')").
|
298
|
+
expect(ChronicDuration.instance_eval("filter_by_type('4 hours')")).to eq('4 hours')
|
294
299
|
end
|
295
300
|
|
296
301
|
end
|
@@ -298,15 +303,15 @@ describe ChronicDuration do
|
|
298
303
|
describe ".cleanup" do
|
299
304
|
|
300
305
|
it "cleans up extraneous words" do
|
301
|
-
ChronicDuration.instance_eval("cleanup('4 days and 11 hours')").
|
306
|
+
expect(ChronicDuration.instance_eval("cleanup('4 days and 11 hours')")).to eq('4 days 11 hours')
|
302
307
|
end
|
303
308
|
|
304
309
|
it "cleans up extraneous spaces" do
|
305
|
-
ChronicDuration.instance_eval("cleanup(' 4 days and 11 hours')").
|
310
|
+
expect(ChronicDuration.instance_eval("cleanup(' 4 days and 11 hours')")).to eq('4 days 11 hours')
|
306
311
|
end
|
307
312
|
|
308
313
|
it "inserts spaces where there aren't any" do
|
309
|
-
ChronicDuration.instance_eval("cleanup('4m11.5s')").
|
314
|
+
expect(ChronicDuration.instance_eval("cleanup('4m11.5s')")).to eq('4 minutes 11.5 seconds')
|
310
315
|
end
|
311
316
|
|
312
317
|
end
|
@@ -324,8 +329,8 @@ describe ChronicDuration do
|
|
324
329
|
|
325
330
|
it "should parse knowing the work week" do
|
326
331
|
week = ChronicDuration.parse('5d')
|
327
|
-
ChronicDuration.parse('40h').
|
328
|
-
ChronicDuration.parse('1w').
|
332
|
+
expect(ChronicDuration.parse('40h')).to eq(week)
|
333
|
+
expect(ChronicDuration.parse('1w')).to eq(week)
|
329
334
|
end
|
330
335
|
end
|
331
336
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab_chronic_duration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hpoydar
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numerizer
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: '3.12'
|
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:
|
54
|
+
version: '3.12'
|
55
55
|
description: A simple Ruby natural language parser for elapsed time. (For example,
|
56
56
|
4 hours and 30 minutes, 6 minutes 4 seconds, 3 days, etc.) Returns all results in
|
57
57
|
seconds. Will return an integer unless you get tricky and need a float. (4 minutes
|
@@ -75,11 +75,11 @@ files:
|
|
75
75
|
- lib/gitlab_chronic_duration.rb
|
76
76
|
- spec/lib/chronic_duration_spec.rb
|
77
77
|
- spec/spec_helper.rb
|
78
|
-
homepage: https://gitlab.com/gitlab-org/gitlab-chronic-duration
|
78
|
+
homepage: https://gitlab.com/gitlab-org/ruby/gems/gitlab-chronic-duration
|
79
79
|
licenses:
|
80
80
|
- MIT
|
81
81
|
metadata: {}
|
82
|
-
post_install_message:
|
82
|
+
post_install_message:
|
83
83
|
rdoc_options: []
|
84
84
|
require_paths:
|
85
85
|
- lib
|
@@ -94,8 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '0'
|
96
96
|
requirements: []
|
97
|
-
rubygems_version: 3.
|
98
|
-
signing_key:
|
97
|
+
rubygems_version: 3.4.19
|
98
|
+
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: A simple Ruby natural language parser for elapsed time
|
101
101
|
test_files:
|