moments 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +19 -2
- data/README.md +19 -6
- data/lib/moments/difference.rb +20 -7
- data/lib/moments/version.rb +1 -1
- data/lib/moments.rb +6 -2
- data/moments.gemspec +1 -0
- data/spec/lib/moments/difference_precision_spec.rb +40 -0
- data/spec/lib/moments/difference_spec.rb +35 -0
- data/spec/lib/moments_spec.rb +37 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77dbf9115233ea35f1e79c6592da59fde4ec415e7b7a74400a9789a407cd3bdf
|
4
|
+
data.tar.gz: fae4d1e2330151cfc27cb64d63bc10a9d5123e0dd6005a6dfebaa4b77038fd32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4e344eafc3286656abb581eef7cffdc21278b58a7b24c62e7e5e3d64bbb28f213e7fd1eb7e518bc10887336deecb6cf63a3ab4754a7712bedf667f68714530a
|
7
|
+
data.tar.gz: 6c0d50f01f547d3a6b219e5f2d2c34cd2ad277f6a4ec17016fc047280f740e9123c00e60a0ae0f06a503d84e78edae22b709d0d0167345a97e801bbed5536fcc
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,25 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [v0.3.0](https://github.com/excpt/moments/tree/v0.3.0) (2023-11-29)
|
4
4
|
|
5
|
-
[Full Changelog](https://github.com/excpt/moments/compare/v0.
|
5
|
+
[Full Changelog](https://github.com/excpt/moments/compare/v0.2.0...v0.3.0)
|
6
|
+
|
7
|
+
**Implemented enhancements:**
|
8
|
+
|
9
|
+
- Precision? [\#11](https://github.com/excpt/moments/issues/11)
|
10
|
+
|
11
|
+
**Closed issues:**
|
12
|
+
|
13
|
+
- Add documentation for new precision parameter [\#13](https://github.com/excpt/moments/issues/13)
|
14
|
+
|
15
|
+
**Merged pull requests:**
|
16
|
+
|
17
|
+
- A few enhancements [\#15](https://github.com/excpt/moments/pull/15) ([Kris-LIBIS](https://github.com/Kris-LIBIS))
|
18
|
+
- Intruduce optional mode parameter [\#12](https://github.com/excpt/moments/pull/12) ([excpt](https://github.com/excpt))
|
19
|
+
|
20
|
+
## [v0.2.0](https://github.com/excpt/moments/tree/v0.2.0) (2022-05-29)
|
21
|
+
|
22
|
+
[Full Changelog](https://github.com/excpt/moments/compare/v0.1.0...v0.2.0)
|
6
23
|
|
7
24
|
**Closed issues:**
|
8
25
|
|
data/README.md
CHANGED
@@ -1,11 +1,5 @@
|
|
1
1
|
# Moments [](http://badge.fury.io/rb/moments)
|
2
2
|
|
3
|
-
[](https://codeship.com/projects/53081)
|
4
|
-
[](https://travis-ci.org/excpt/moments)
|
5
|
-
[](https://codeclimate.com/github/excpt/moments)
|
6
|
-
[](https://codeclimate.com/github/excpt/moments)
|
7
|
-
[](https://gemnasium.com/excpt/moments)
|
8
|
-
|
9
3
|
Handles time differences and calculations.
|
10
4
|
|
11
5
|
## Installation
|
@@ -44,6 +38,25 @@ puts diff.to_hash
|
|
44
38
|
puts diff.in_months
|
45
39
|
# 67 (5 * 12 + 7)
|
46
40
|
# there are also methods for each component
|
41
|
+
|
42
|
+
from = Time.new(2022, 8, 4, 15, 52, 25, '-06:00')
|
43
|
+
to = Time.new(2022, 8, 18, 15, 52, 31, '-06:00')
|
44
|
+
|
45
|
+
difference = Moments.difference(from, to, :precise).in_minutes
|
46
|
+
# returns: 20_160.1
|
47
|
+
# supports: in_weeks, in_days, in_hours, in_minutes
|
48
|
+
|
49
|
+
ago = Moments.ago t1
|
50
|
+
|
51
|
+
puts ago.to_hash
|
52
|
+
# { years: 5, months: 7, days: 5, hours: 19, minutes: 29, seconds: 6 }
|
53
|
+
|
54
|
+
puts ago.humanized
|
55
|
+
# 5 years, 7 months, 5 days, 19 hours, 29 minutes and 6 seconds
|
56
|
+
|
57
|
+
# #humanized takes care of signularity and omits 0 values
|
58
|
+
puts Moments.difference(t1, Time.new(2015, 2, 1, 19, 0, 1)).humanized
|
59
|
+
# 1 month, 19 hours and 1 second
|
47
60
|
```
|
48
61
|
|
49
62
|
## Contributing
|
data/lib/moments/difference.rb
CHANGED
@@ -21,12 +21,15 @@ module Moments
|
|
21
21
|
|
22
22
|
# == Parameters:
|
23
23
|
# from::
|
24
|
-
#
|
24
|
+
# An instance of Time
|
25
25
|
# to::
|
26
|
-
#
|
27
|
-
|
26
|
+
# An instance of Time
|
27
|
+
# precise::
|
28
|
+
# Option to return minutes, hours, days, years as decimals intead of integer
|
29
|
+
def initialize(from, to, mode = :normal)
|
28
30
|
@from = parse_argument from
|
29
31
|
@to = parse_argument to
|
32
|
+
@precise = mode == :precise
|
30
33
|
|
31
34
|
@ordered_from, @ordered_to = [@from, @to].sort
|
32
35
|
|
@@ -54,19 +57,19 @@ module Moments
|
|
54
57
|
end
|
55
58
|
|
56
59
|
def in_minutes
|
57
|
-
in_seconds / 60
|
60
|
+
in_seconds / (@precise ? 60.0 : 60)
|
58
61
|
end
|
59
62
|
|
60
63
|
def in_hours
|
61
|
-
in_minutes / 60
|
64
|
+
in_minutes / (@precise ? 60.0 : 60)
|
62
65
|
end
|
63
66
|
|
64
67
|
def in_days
|
65
|
-
in_hours / 24
|
68
|
+
in_hours / (@precise ? 24.0 : 24)
|
66
69
|
end
|
67
70
|
|
68
71
|
def in_weeks
|
69
|
-
in_days / 7
|
72
|
+
in_days / (@precise ? 7.0 : 7)
|
70
73
|
end
|
71
74
|
|
72
75
|
def in_months
|
@@ -89,6 +92,16 @@ module Moments
|
|
89
92
|
years_diff
|
90
93
|
end
|
91
94
|
|
95
|
+
def humanized
|
96
|
+
diff_parts = to_hash.each_with_object([]) do |(unit, quantity), parts|
|
97
|
+
parts << "#{quantity} #{quantity == 1 ? unit.to_s[0..-2] : unit}" if quantity.positive?
|
98
|
+
end
|
99
|
+
last_part = diff_parts.pop
|
100
|
+
return last_part if diff_parts.empty?
|
101
|
+
|
102
|
+
[diff_parts.join(', '), last_part].join(' and ')
|
103
|
+
end
|
104
|
+
|
92
105
|
private
|
93
106
|
|
94
107
|
TIME_CLASSES = [Time, DateTime].freeze
|
data/lib/moments/version.rb
CHANGED
data/lib/moments.rb
CHANGED
@@ -5,7 +5,11 @@ require_relative 'moments/difference'
|
|
5
5
|
|
6
6
|
# Entrypoint for the moments gem
|
7
7
|
module Moments
|
8
|
-
def self.difference(from, to)
|
9
|
-
Moments::Difference.new from, to
|
8
|
+
def self.difference(from, to, mode = :normal)
|
9
|
+
Moments::Difference.new from, to, mode
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.ago(from, mode = :normal)
|
13
|
+
Moments::Difference.new from, Time.now, mode
|
10
14
|
end
|
11
15
|
end
|
data/moments.gemspec
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe Moments::Difference do
|
4
|
+
# Thu, 04 Aug 2022 15:52:25 MDT -06:00
|
5
|
+
let(:from) { Time.new(2022, 8, 4, 15, 52, 25, '-06:00') }
|
6
|
+
# Thu, 18 Aug 2022 15:52:31 MDT -06:00
|
7
|
+
let(:to) { Time.new(2022, 8, 18, 15, 52, 31, '-06:00') }
|
8
|
+
|
9
|
+
describe 'minutes' do
|
10
|
+
context 'precision' do
|
11
|
+
subject { Moments.difference(from, to, :precise).in_minutes }
|
12
|
+
|
13
|
+
it { should eq 20_160.1 }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'hours' do
|
18
|
+
context 'precision' do
|
19
|
+
subject { Moments.difference(from, to, :precise).in_hours }
|
20
|
+
|
21
|
+
it { should eq 336.001666666666667 }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'days' do
|
26
|
+
context 'precision' do
|
27
|
+
subject { Moments.difference(from, to, :precise).in_days }
|
28
|
+
|
29
|
+
it { should eq 14.000069444444444 }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'weeks' do
|
34
|
+
context 'precision' do
|
35
|
+
subject { Moments.difference(from, to, :precise).in_weeks }
|
36
|
+
|
37
|
+
it { should eq 2.0000099206349207 }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -807,4 +807,39 @@ describe Moments::Difference do
|
|
807
807
|
it { is_expected.to eq 1 }
|
808
808
|
end
|
809
809
|
end
|
810
|
+
|
811
|
+
context '#humanized' do
|
812
|
+
subject { Moments::Difference.new(from, to).humanized }
|
813
|
+
|
814
|
+
let (:from) { Time.utc 2020, 1, 1, 0, 0, 0 }
|
815
|
+
|
816
|
+
{
|
817
|
+
[2021, 1, 1, 0, 0, 0] => '1 year',
|
818
|
+
[2020, 2, 1, 0, 0, 0] => '1 month',
|
819
|
+
[2020, 1, 2, 0, 0, 0] => '1 day',
|
820
|
+
[2020, 1, 1, 1, 0, 0] => '1 hour',
|
821
|
+
[2020, 1, 1, 0, 1, 0] => '1 minute',
|
822
|
+
[2020, 1, 1, 0, 0, 1] => '1 second',
|
823
|
+
[2022, 1, 1, 0, 0, 0] => '2 years',
|
824
|
+
[2020, 4, 1, 0, 0, 0] => '3 months',
|
825
|
+
[2020, 1, 5, 0, 0, 0] => '4 days',
|
826
|
+
[2020, 1, 1, 5, 0, 0] => '5 hours',
|
827
|
+
[2020, 1, 1, 0, 6, 0] => '6 minutes',
|
828
|
+
[2020, 1, 1, 0, 0, 7] => '7 seconds',
|
829
|
+
[2021, 2, 1, 0, 0, 0] => '1 year and 1 month',
|
830
|
+
[2021, 1, 2, 0, 0, 0] => '1 year and 1 day',
|
831
|
+
[2021, 1, 1, 1, 0, 0] => '1 year and 1 hour',
|
832
|
+
[2021, 1, 1, 0, 1, 0] => '1 year and 1 minute',
|
833
|
+
[2021, 1, 1, 0, 0, 1] => '1 year and 1 second',
|
834
|
+
[2021, 2, 2, 0, 0, 0] => '1 year, 1 month and 1 day',
|
835
|
+
[2021, 2, 1, 1, 0, 0] => '1 year, 1 month and 1 hour',
|
836
|
+
[2022, 4, 5, 5, 6, 7] => '2 years, 3 months, 4 days, 5 hours, 6 minutes and 7 seconds'
|
837
|
+
}.each do |time_array, string|
|
838
|
+
context "with #{string}" do
|
839
|
+
let (:to) { Time.utc *time_array }
|
840
|
+
|
841
|
+
it { is_expected.to eq string}
|
842
|
+
end
|
843
|
+
end
|
844
|
+
end
|
810
845
|
end
|
data/spec/lib/moments_spec.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'timecop'
|
4
|
+
|
3
5
|
describe Moments do
|
4
6
|
describe '#difference' do
|
5
7
|
subject { Moments.difference(from, to) }
|
@@ -9,4 +11,39 @@ describe Moments do
|
|
9
11
|
|
10
12
|
it { is_expected.to be_a Moments::Difference }
|
11
13
|
end
|
14
|
+
|
15
|
+
describe '#ago' do
|
16
|
+
subject { Moments.ago(from) }
|
17
|
+
|
18
|
+
before do
|
19
|
+
Timecop.freeze(to)
|
20
|
+
end
|
21
|
+
|
22
|
+
after do
|
23
|
+
Timecop.return
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:from) { Time.utc 2010, 1, 1, 0, 0, 0 }
|
27
|
+
let(:to) { Time.utc 2016, 6, 5, 3, 2, 1 }
|
28
|
+
|
29
|
+
it { is_expected.to be_a Moments::Difference }
|
30
|
+
|
31
|
+
context '#to_hash' do
|
32
|
+
|
33
|
+
subject { Moments.ago(from).to_hash }
|
34
|
+
let (:expected_result) do
|
35
|
+
{
|
36
|
+
years: 6,
|
37
|
+
months: 5,
|
38
|
+
days: 4,
|
39
|
+
hours: 3,
|
40
|
+
minutes: 2,
|
41
|
+
seconds: 1
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
it { is_expected.to eq expected_result}
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
12
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moments
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Rudat
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: timecop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
description: ''
|
84
98
|
email:
|
85
99
|
- timrudat@gmail.com
|
@@ -101,6 +115,7 @@ files:
|
|
101
115
|
- lib/moments/difference.rb
|
102
116
|
- lib/moments/version.rb
|
103
117
|
- moments.gemspec
|
118
|
+
- spec/lib/moments/difference_precision_spec.rb
|
104
119
|
- spec/lib/moments/difference_spec.rb
|
105
120
|
- spec/lib/moments_spec.rb
|
106
121
|
- spec/spec_helper.rb
|
@@ -124,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
139
|
- !ruby/object:Gem::Version
|
125
140
|
version: '0'
|
126
141
|
requirements: []
|
127
|
-
rubygems_version: 3.
|
142
|
+
rubygems_version: 3.4.22
|
128
143
|
signing_key:
|
129
144
|
specification_version: 4
|
130
145
|
summary: Handles time differences.
|