moments 0.0.1.alpha → 0.2.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 +5 -5
- data/.editorconfig +12 -0
- data/.gitignore +2 -0
- data/.rspec +1 -1
- data/.rubocop.yml +81 -0
- data/.travis.yml +9 -4
- data/CHANGELOG.md +43 -0
- data/Gemfile +2 -0
- data/{LICENSE.txt → LICENSE.md} +0 -0
- data/README.md +29 -4
- data/Rakefile +2 -1
- data/lib/moments/difference.rb +132 -46
- data/lib/moments/version.rb +13 -4
- data/lib/moments.rb +5 -2
- data/moments.gemspec +18 -17
- data/spec/lib/moments/difference_spec.rb +726 -110
- data/spec/lib/moments_spec.rb +6 -15
- data/spec/spec_helper.rb +2 -6
- metadata +48 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0b85363c9163c9935f75833c74b4e7d587cc70d962ca4f86e14e6d8a3bb14196
|
4
|
+
data.tar.gz: 1a6421e682139a2cefb0b82d12bcd5d08cb2f8220ab20a65f9646938e0ee1653
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 360367e75466166fc7bb786fa4d0247b23d7ba61b118286bc137c7b697ef25a12bf3d847f0b2907de9a899ee1d3132298b5196ef93387b536e800fca8132c24a
|
7
|
+
data.tar.gz: e374f88fd8029894bdeee1e0ea79ae58188552fe43438dfb56e37335a36121b91c6b14e0d8b7a814ff0901c10c9928916051f1ea38a1b28997bce3ff47f932a9
|
data/.editorconfig
ADDED
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
TargetRubyVersion: 2.5
|
5
|
+
NewCops: enable
|
6
|
+
SuggestExtensions: false
|
7
|
+
Exclude:
|
8
|
+
- 'gemfiles/*.gemfile'
|
9
|
+
- 'vendor/**/*'
|
10
|
+
|
11
|
+
Style/Documentation:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Style/BlockDelimiters:
|
15
|
+
Exclude:
|
16
|
+
- spec/**/*_spec.rb
|
17
|
+
|
18
|
+
Style/GuardClause:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Style/IfUnlessModifier:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
Layout/SpaceInsideHashLiteralBraces:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
Style/Lambda:
|
28
|
+
Enabled: false
|
29
|
+
|
30
|
+
Style/RaiseArgs:
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
Style/SignalException:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
Metrics/AbcSize:
|
37
|
+
Max: 25
|
38
|
+
|
39
|
+
Metrics/ClassLength:
|
40
|
+
Max: 120
|
41
|
+
|
42
|
+
Metrics/ModuleLength:
|
43
|
+
Max: 100
|
44
|
+
|
45
|
+
Layout/LineLength:
|
46
|
+
Enabled: false
|
47
|
+
|
48
|
+
Metrics/BlockLength:
|
49
|
+
Exclude:
|
50
|
+
- spec/**/*_spec.rb
|
51
|
+
|
52
|
+
Metrics/MethodLength:
|
53
|
+
Max: 15
|
54
|
+
|
55
|
+
Style/SingleLineBlockParams:
|
56
|
+
Enabled: false
|
57
|
+
|
58
|
+
Layout/EndAlignment:
|
59
|
+
EnforcedStyleAlignWith: variable
|
60
|
+
|
61
|
+
Style/FormatString:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
Layout/MultilineMethodCallIndentation:
|
65
|
+
EnforcedStyle: indented
|
66
|
+
|
67
|
+
Layout/MultilineOperationIndentation:
|
68
|
+
EnforcedStyle: indented
|
69
|
+
|
70
|
+
Style/WordArray:
|
71
|
+
Enabled: false
|
72
|
+
|
73
|
+
Style/RedundantSelf:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
Layout/HashAlignment:
|
77
|
+
Enabled: true
|
78
|
+
EnforcedLastArgumentHashStyle: always_ignore
|
79
|
+
|
80
|
+
Style/TrivialAccessors:
|
81
|
+
AllowPredicates: true
|
data/.travis.yml
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
sudo: false
|
2
|
+
cache: bundler
|
1
3
|
language: ruby
|
2
4
|
script: "bundle exec rspec"
|
5
|
+
before_install:
|
6
|
+
- gem update --system
|
7
|
+
- gem --version
|
8
|
+
- bundle install
|
3
9
|
rvm:
|
4
|
-
- 2.
|
5
|
-
-
|
6
|
-
-
|
7
|
-
- jruby-head
|
10
|
+
- 2.5.0
|
11
|
+
- 2.6.0
|
12
|
+
- 2.7.0
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## [Unreleased](https://github.com/excpt/moments/tree/HEAD)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/excpt/moments/compare/v0.1.0...HEAD)
|
6
|
+
|
7
|
+
**Closed issues:**
|
8
|
+
|
9
|
+
- Make a new release [\#7](https://github.com/excpt/moments/issues/7)
|
10
|
+
|
11
|
+
**Merged pull requests:**
|
12
|
+
|
13
|
+
- Parse string input whenever possible [\#10](https://github.com/excpt/moments/pull/10) ([RomanVanLoo](https://github.com/RomanVanLoo))
|
14
|
+
- Add `in_weeks` [\#9](https://github.com/excpt/moments/pull/9) ([RomanVanLoo](https://github.com/RomanVanLoo))
|
15
|
+
- Release 0.1.0 [\#8](https://github.com/excpt/moments/pull/8) ([excpt](https://github.com/excpt))
|
16
|
+
- Fix `#in_*` for times with miliseconds [\#6](https://github.com/excpt/moments/pull/6) ([AlexWayfer](https://github.com/AlexWayfer))
|
17
|
+
- Fix diffs with different timezones, `Date` diffs and `#in_years` [\#5](https://github.com/excpt/moments/pull/5) ([AlexWayfer](https://github.com/AlexWayfer))
|
18
|
+
- Add `#in_*` methods, like `#in_seconds` [\#4](https://github.com/excpt/moments/pull/4) ([AlexWayfer](https://github.com/AlexWayfer))
|
19
|
+
- Many improvements [\#2](https://github.com/excpt/moments/pull/2) ([AlexWayfer](https://github.com/AlexWayfer))
|
20
|
+
|
21
|
+
## [v0.1.0](https://github.com/excpt/moments/tree/v0.1.0) (2020-08-18)
|
22
|
+
|
23
|
+
[Full Changelog](https://github.com/excpt/moments/compare/v0.0.2.alpha...v0.1.0)
|
24
|
+
|
25
|
+
**Closed issues:**
|
26
|
+
|
27
|
+
- Replace Travis CI with another CI [\#3](https://github.com/excpt/moments/issues/3)
|
28
|
+
|
29
|
+
## [v0.0.2.alpha](https://github.com/excpt/moments/tree/v0.0.2.alpha) (2014-11-14)
|
30
|
+
|
31
|
+
[Full Changelog](https://github.com/excpt/moments/compare/v0.0.1.alpha...v0.0.2.alpha)
|
32
|
+
|
33
|
+
## [v0.0.1.alpha](https://github.com/excpt/moments/tree/v0.0.1.alpha) (2014-05-26)
|
34
|
+
|
35
|
+
[Full Changelog](https://github.com/excpt/moments/compare/9b7612483150b52000ab4948d5c2217945230a1d...v0.0.1.alpha)
|
36
|
+
|
37
|
+
**Closed issues:**
|
38
|
+
|
39
|
+
- Test ticket from Code Climate [\#1](https://github.com/excpt/moments/issues/1)
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
|
data/Gemfile
CHANGED
data/{LICENSE.txt → LICENSE.md}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
# Moments
|
1
|
+
# Moments [](http://badge.fury.io/rb/moments)
|
2
2
|
|
3
|
+
[](https://codeship.com/projects/53081)
|
3
4
|
[](https://travis-ci.org/excpt/moments)
|
4
5
|
[](https://codeclimate.com/github/excpt/moments)
|
6
|
+
[](https://codeclimate.com/github/excpt/moments)
|
7
|
+
[](https://gemnasium.com/excpt/moments)
|
5
8
|
|
6
9
|
Handles time differences and calculations.
|
7
10
|
|
@@ -9,18 +12,40 @@ Handles time differences and calculations.
|
|
9
12
|
|
10
13
|
Add this line to your application's Gemfile:
|
11
14
|
|
12
|
-
|
15
|
+
```ruby
|
16
|
+
gem 'moments'
|
17
|
+
```
|
13
18
|
|
14
19
|
And then execute:
|
15
20
|
|
16
|
-
|
21
|
+
```sh
|
22
|
+
$ bundle
|
23
|
+
```
|
17
24
|
|
18
25
|
Or install it yourself as:
|
19
26
|
|
20
|
-
|
27
|
+
```sh
|
28
|
+
$ gem install moments
|
29
|
+
```
|
21
30
|
|
22
31
|
## Usage
|
23
32
|
|
33
|
+
```ruby
|
34
|
+
require 'moments'
|
35
|
+
|
36
|
+
t1 = Time.new 2015, 1, 1, 0, 0, 0
|
37
|
+
t2 = Time.now # 2020, 8, 6, 19, 29, 6
|
38
|
+
|
39
|
+
diff = Moments.difference t1, t2
|
40
|
+
|
41
|
+
puts diff.to_hash
|
42
|
+
# { years: 5, months: 7, days: 5, hours: 19, minutes: 29, seconds: 6 }
|
43
|
+
|
44
|
+
puts diff.in_months
|
45
|
+
# 67 (5 * 12 + 7)
|
46
|
+
# there are also methods for each component
|
47
|
+
```
|
48
|
+
|
24
49
|
## Contributing
|
25
50
|
|
26
51
|
1. Fork it ( https://github.com/excpt/moments/fork )
|
data/Rakefile
CHANGED
data/lib/moments/difference.rb
CHANGED
@@ -1,13 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
1
5
|
module Moments
|
6
|
+
# Calculates differences between two given Time instances.
|
2
7
|
class Difference
|
8
|
+
DATE_PARTS = {
|
9
|
+
years: :year,
|
10
|
+
months: :month,
|
11
|
+
days: :day
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
TIME_PARTS = {
|
15
|
+
hours: :hour,
|
16
|
+
minutes: :min,
|
17
|
+
seconds: :sec
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
private_constant :DATE_PARTS, :TIME_PARTS
|
21
|
+
|
22
|
+
# == Parameters:
|
23
|
+
# from::
|
24
|
+
# A instance of Time
|
25
|
+
# to::
|
26
|
+
# A instance of Time
|
3
27
|
def initialize(from, to)
|
4
|
-
@from = from
|
5
|
-
@to
|
28
|
+
@from = parse_argument from
|
29
|
+
@to = parse_argument to
|
6
30
|
|
7
|
-
|
8
|
-
message = "Start date (#{from}) must be less or equal than the end date (#{@to})."
|
9
|
-
raise ArgumentError.new(message)
|
10
|
-
end
|
31
|
+
@ordered_from, @ordered_to = [@from, @to].sort
|
11
32
|
|
12
33
|
precise_difference
|
13
34
|
end
|
@@ -28,56 +49,121 @@ module Moments
|
|
28
49
|
@from > @to
|
29
50
|
end
|
30
51
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
hours = @to.hour - @from.hour
|
35
|
-
days = @to.day - @from.day
|
36
|
-
months = @to.month - @from.month
|
37
|
-
years = @to.year - @from.year
|
38
|
-
|
39
|
-
if seconds < 0
|
40
|
-
seconds += 60
|
41
|
-
minutes -= 1
|
42
|
-
end
|
52
|
+
def in_seconds
|
53
|
+
@ordered_to.to_i - @ordered_from.to_i
|
54
|
+
end
|
43
55
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
56
|
+
def in_minutes
|
57
|
+
in_seconds / 60
|
58
|
+
end
|
59
|
+
|
60
|
+
def in_hours
|
61
|
+
in_minutes / 60
|
62
|
+
end
|
63
|
+
|
64
|
+
def in_days
|
65
|
+
in_hours / 24
|
66
|
+
end
|
67
|
+
|
68
|
+
def in_weeks
|
69
|
+
in_days / 7
|
70
|
+
end
|
71
|
+
|
72
|
+
def in_months
|
73
|
+
months_diff = @ordered_to.month - @ordered_from.month
|
74
|
+
months_diff -= 1 if months_diff.positive? && @ordered_to.mday < @ordered_from.mday
|
75
|
+
|
76
|
+
((@ordered_to.year - @ordered_from.year) * 12) + months_diff
|
77
|
+
end
|
48
78
|
|
49
|
-
|
50
|
-
|
51
|
-
|
79
|
+
def in_years
|
80
|
+
years_diff = @ordered_to.year - @ordered_from.year
|
81
|
+
|
82
|
+
return years_diff unless years_diff.positive?
|
83
|
+
return years_diff if @ordered_to.month > @ordered_from.month
|
84
|
+
|
85
|
+
if (@ordered_to.month < @ordered_from.month) || (@ordered_to.mday < @ordered_from.mday)
|
86
|
+
years_diff -= 1
|
52
87
|
end
|
53
88
|
|
54
|
-
|
55
|
-
|
89
|
+
years_diff
|
90
|
+
end
|
56
91
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
days = previous_month_days + days
|
61
|
-
end
|
92
|
+
private
|
93
|
+
|
94
|
+
TIME_CLASSES = [Time, DateTime].freeze
|
62
95
|
|
63
|
-
|
96
|
+
private_constant :TIME_CLASSES
|
97
|
+
|
98
|
+
def parse_argument(value)
|
99
|
+
case value
|
100
|
+
when *TIME_CLASSES
|
101
|
+
value.to_time.getutc
|
102
|
+
when Date
|
103
|
+
value.to_time
|
104
|
+
when String
|
105
|
+
begin
|
106
|
+
Time.parse(value).getutc
|
107
|
+
rescue ArgumentError
|
108
|
+
unsupported_format
|
109
|
+
end
|
110
|
+
else
|
111
|
+
unsupported_format
|
64
112
|
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def unsupported_format
|
116
|
+
raise ArgumentError, 'Unsupported format'
|
117
|
+
end
|
118
|
+
|
119
|
+
def precise_difference
|
120
|
+
@diff = calculate_diff
|
121
|
+
|
122
|
+
calculate :seconds, :minutes
|
123
|
+
calculate :minutes, :hours
|
124
|
+
calculate :hours, :days, 24
|
125
|
+
calculate_days
|
126
|
+
calculate :months, :years, 12
|
127
|
+
|
128
|
+
@diff
|
129
|
+
end
|
65
130
|
|
66
|
-
|
67
|
-
|
68
|
-
|
131
|
+
def calculate_diff
|
132
|
+
are_time_parts = [@from, @to].all? do |value|
|
133
|
+
TIME_CLASSES.any? { |time_class| value.is_a?(time_class) }
|
69
134
|
end
|
70
135
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
136
|
+
(are_time_parts ? DATE_PARTS.merge(TIME_PARTS) : DATE_PARTS)
|
137
|
+
.transform_values do |method_name|
|
138
|
+
@ordered_to.public_send(method_name) - @ordered_from.public_send(method_name)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def calculate(attribute, difference, stepping = 60)
|
143
|
+
return unless @diff.key?(attribute) && @diff.key?(difference)
|
144
|
+
|
145
|
+
return if @diff[attribute] >= 0
|
146
|
+
|
147
|
+
@diff[attribute] += stepping
|
148
|
+
@diff[difference] -= 1
|
79
149
|
end
|
80
150
|
|
81
|
-
|
151
|
+
def calculate_days
|
152
|
+
return if @diff[:days] >= 0
|
153
|
+
|
154
|
+
previous_month_days = (Time.new(@to.year, @to.month, 1) - 1).day
|
155
|
+
@diff[:days] = precise_previous_month_days(
|
156
|
+
@diff[:days], previous_month_days, @from.day
|
157
|
+
)
|
158
|
+
@diff[:months] -= 1
|
159
|
+
end
|
160
|
+
|
161
|
+
def precise_previous_month_days(days, previous, from)
|
162
|
+
if previous < from
|
163
|
+
previous + days + (from - previous)
|
164
|
+
else
|
165
|
+
previous + days
|
166
|
+
end
|
167
|
+
end
|
82
168
|
end
|
83
|
-
end
|
169
|
+
end
|
data/lib/moments/version.rb
CHANGED
@@ -1,14 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Moments::Version module
|
1
4
|
module Moments
|
2
5
|
def self.gem_version
|
3
6
|
Gem::Version.new VERSION::STRING
|
4
7
|
end
|
5
8
|
|
9
|
+
# Moments version builder module
|
6
10
|
module VERSION
|
11
|
+
# major version
|
7
12
|
MAJOR = 0
|
8
|
-
|
9
|
-
|
10
|
-
|
13
|
+
# minor version
|
14
|
+
MINOR = 2
|
15
|
+
# patch version
|
16
|
+
PATCH = 0
|
17
|
+
# alpha, beta, etc. tag
|
18
|
+
PRE = nil
|
11
19
|
|
12
|
-
|
20
|
+
# Build version string
|
21
|
+
STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
13
22
|
end
|
14
23
|
end
|
data/lib/moments.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
|
2
|
-
require 'moments/difference'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
3
|
+
require_relative 'moments/version'
|
4
|
+
require_relative 'moments/difference'
|
5
|
+
|
6
|
+
# Entrypoint for the moments gem
|
4
7
|
module Moments
|
5
8
|
def self.difference(from, to)
|
6
9
|
Moments::Difference.new from, to
|
data/moments.gemspec
CHANGED
@@ -1,24 +1,25 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
require 'moments/version'
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/moments/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
11
|
-
spec.summary
|
12
|
-
spec.description
|
13
|
-
spec.homepage
|
14
|
-
spec.license
|
6
|
+
spec.name = 'moments'
|
7
|
+
spec.version = Moments.gem_version
|
8
|
+
spec.authors = ['Tim Rudat']
|
9
|
+
spec.email = ['timrudat@gmail.com']
|
10
|
+
spec.summary = 'Handles time differences.'
|
11
|
+
spec.description = ''
|
12
|
+
spec.homepage = 'https://github.com/excpt/moments'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
-
spec.
|
19
|
-
spec.require_paths = ["lib"]
|
18
|
+
spec.require_paths = ['lib']
|
20
19
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
20
|
+
spec.add_development_dependency 'bundler'
|
21
|
+
spec.add_development_dependency 'github_changelog_generator'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'rubocop'
|
24
25
|
end
|