theusual 0.0.7 → 0.0.8
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/lib/theusual/time.rb +74 -15
- data/lib/theusual/version.rb +1 -1
- data/test/test_time.rb +38 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7dacb5e7a014566aa0c349f8d1ebf456a7668657
|
4
|
+
data.tar.gz: b7ef75744482e6bffd73885d698337619e130ac4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc9842b4be2725073029d4fae4c424df5ea22cf7af53fa669c36cf8ab85fde7bdff882a5f05348b9b7385912e52a9cca759989be4715ee36922732eba7e82739
|
7
|
+
data.tar.gz: 65cf8436c7fa60ed4b15f32267c5d5a15a8432f965a87e724cc5ed9bdd85a0f322e23c05384a8d2a1398bcfcca8eb79f925fd5ca061e13d6ac8812d975846a19
|
data/lib/theusual/time.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
class Time
|
2
|
+
MINUTES_IN_THREE_QUARTERS_YEAR = 394200
|
3
|
+
MINUTES_IN_QUARTER_YEAR = 131400
|
4
|
+
MINUTES_IN_YEAR = 525600
|
5
|
+
|
2
6
|
|
3
7
|
def self.at_ms ms
|
4
8
|
# convert an integer representing Unix time in milliseconds
|
@@ -10,23 +14,78 @@ class Time
|
|
10
14
|
(to_f * 1_000).to_i
|
11
15
|
end
|
12
16
|
|
17
|
+
# inspired by actionview/lib/action_view/helpers/date_helper.rb
|
18
|
+
def humanize(to_time = nil, options = {})
|
19
|
+
from_time = self.utc
|
20
|
+
to_time ||= Time.now.utc
|
21
|
+
from_time, to_time = to_time, from_time if from_time > to_time
|
22
|
+
|
23
|
+
distance_in_minutes = ((to_time.to_i - from_time.to_i) / 60.0).to_i
|
24
|
+
distance_in_seconds = (to_time.to_i - from_time.to_i).to_i
|
13
25
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
res = case distance_in_minutes
|
27
|
+
when 0
|
28
|
+
if options[:seconds]
|
29
|
+
case distance_in_seconds
|
30
|
+
when 1 then [ :a_second ]
|
31
|
+
when 2..4 then [ :less_than_x_seconds, 5 ]
|
32
|
+
when 5..9 then [ :less_than_x_seconds, 10 ]
|
33
|
+
when 10..29 then [ :less_than_x_seconds, 30 ]
|
34
|
+
when 30..39 then [ :half_a_minute ]
|
35
|
+
when 40..59 then [ :less_than_a_minute ]
|
36
|
+
else [ :a_minute ]
|
37
|
+
end
|
38
|
+
else
|
39
|
+
if distance_in_seconds == 0
|
40
|
+
[ :just_now ]
|
41
|
+
else
|
42
|
+
[ :less_than_a_minute ]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
when 1 then [ :a_minute ]
|
46
|
+
when 2...45 then [ :x_minutes, distance_in_minutes ]
|
47
|
+
when 45...59 then [ :about_an_hour ]
|
48
|
+
when 60 then [ :an_hour ]
|
49
|
+
when 61...90 then [ :about_an_hour ]
|
50
|
+
# 90 mins up to 24 hours
|
51
|
+
when 90...1440 then [ :about_x_hours, (distance_in_minutes.to_f / 60.0).round ]
|
52
|
+
# 24 hours up to hours
|
53
|
+
when 1440...2160 then [ :a_day ]
|
54
|
+
# 36 hours up to 30 days
|
55
|
+
when 2160...43200 then [ :x_days, (distance_in_minutes.to_f / 1440.0).round ]
|
56
|
+
# 30 days up to 60 days
|
57
|
+
when 43200...86400 then [ :about_x_months, (distance_in_minutes.to_f / 43200.0).round ]
|
58
|
+
# 60 days up to 365 days
|
59
|
+
when 86400...525600 then [ :x_months, (distance_in_minutes.to_f / 43200.0).round ]
|
60
|
+
else
|
61
|
+
fyear = from_time.year
|
62
|
+
fyear += 1 if from_time.month >= 3
|
63
|
+
tyear = to_time.year
|
64
|
+
tyear -= 1 if to_time.month < 3
|
65
|
+
leap_years = (fyear > tyear) ? 0 : (fyear..tyear).count{|x| Date.leap?(x)}
|
66
|
+
minute_offset_for_leap_year = leap_years * 1440
|
67
|
+
# Discount the leap year days when calculating year distance.
|
68
|
+
# e.g. if there are 20 leap year days between 2 dates having the same day
|
69
|
+
# and month then the based on 365 days calculation
|
70
|
+
# the distance in years will come out to over 80 years when in written
|
71
|
+
# English it would read better as about 80 years.
|
72
|
+
minutes_with_offset = distance_in_minutes - minute_offset_for_leap_year
|
73
|
+
remainder = (minutes_with_offset % MINUTES_IN_YEAR)
|
74
|
+
distance_in_years = (minutes_with_offset.div MINUTES_IN_YEAR)
|
75
|
+
if remainder < MINUTES_IN_QUARTER_YEAR
|
76
|
+
[ :about_x_years, distance_in_years ]
|
77
|
+
elsif remainder < MINUTES_IN_THREE_QUARTERS_YEAR
|
78
|
+
[ :over_x_years, distance_in_years ]
|
79
|
+
else
|
80
|
+
[ :almost_x_years, distance_in_years + 1 ]
|
81
|
+
end
|
29
82
|
end
|
83
|
+
|
84
|
+
if res.count > 1
|
85
|
+
res.first.to_s.sub 'x', res.last.to_s
|
86
|
+
else
|
87
|
+
res.first.to_s
|
88
|
+
end.gsub '_', ' '
|
30
89
|
end
|
31
90
|
|
32
91
|
end
|
data/lib/theusual/version.rb
CHANGED
data/test/test_time.rb
CHANGED
@@ -5,26 +5,58 @@ TheUsual::load 'time'
|
|
5
5
|
|
6
6
|
class TimeTest < Minitest::Test
|
7
7
|
|
8
|
-
def
|
8
|
+
def test_ms
|
9
|
+
ts = Time.now.utc
|
10
|
+
|
11
|
+
assert(ts.to_ms.class < Integer)
|
12
|
+
|
13
|
+
assert(
|
14
|
+
# to_ms will truncate, so allow for small error
|
15
|
+
ts - Time.at_ms(ts.to_ms) <= 0.001
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def test_humanize
|
9
21
|
assert_equal(
|
10
22
|
'just now',
|
11
23
|
Time.new.humanize
|
12
24
|
)
|
13
25
|
|
14
26
|
assert_equal(
|
15
|
-
'a
|
16
|
-
(Time.new -
|
27
|
+
'less than a minute',
|
28
|
+
(Time.new - 50).humanize
|
17
29
|
)
|
18
30
|
|
19
31
|
assert_equal(
|
20
|
-
'
|
21
|
-
(Time.new -
|
32
|
+
'a second',
|
33
|
+
(Time.new - 1).humanize(nil, seconds: true)
|
22
34
|
)
|
23
35
|
|
24
36
|
assert_equal(
|
25
|
-
'a minute
|
37
|
+
'a minute',
|
26
38
|
(Time.new - 60).humanize
|
27
39
|
)
|
40
|
+
|
41
|
+
assert_equal(
|
42
|
+
'an hour',
|
43
|
+
(Time.new - 60 * 60).humanize
|
44
|
+
)
|
45
|
+
|
46
|
+
assert_equal(
|
47
|
+
'an hour',
|
48
|
+
(Time.new - 60 * 60 - 5).humanize
|
49
|
+
)
|
50
|
+
|
51
|
+
assert_equal(
|
52
|
+
'about an hour',
|
53
|
+
(Time.new - 60 * 61).humanize
|
54
|
+
)
|
55
|
+
|
56
|
+
assert_equal(
|
57
|
+
'a day',
|
58
|
+
(Time.new - 60 * 60 * 24).humanize
|
59
|
+
)
|
28
60
|
end
|
29
61
|
|
30
62
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: theusual
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pepper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|