timely 0.7.0 → 0.8.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/CHANGELOG.md +5 -0
- data/lib/timely/rails.rb +0 -1
- data/lib/timely/rails/date_group.rb +1 -3
- data/lib/timely/version.rb +1 -1
- data/spec/date_group_spec.rb +38 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/coverage_loader.rb +1 -1
- data/timely.gemspec +2 -0
- metadata +30 -5
- data/lib/timely/rails/time_difference.rb +0 -100
- data/spec/rails/time_difference_spec.rb +0 -185
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f77d2dfe978ebc2b98ce38619976758ffd6bf58cbe5ca72e04f74de5e7518a2b
|
4
|
+
data.tar.gz: 4474ac4c99ed979e16692e919cf0ef53ab9f02955c0eab8471bbc238633c7132
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26ea6163458e19c7971828725d620c320fff0bfca048ce22083f5582465e26ac6211191fc2a3dab02b9bd9f35268b823dfe4e6e3f824b82f7cc1da9d5b987ada
|
7
|
+
data.tar.gz: 7257fb9a2e598833115f7b3edf49c6f1c7f980ec45137c21f7cc1f74fd22639401151990dd48b63cf2e0d9500dfb1438e74b972590d17ce1bf6182c7bca7df58
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.8.0
|
4
|
+
|
5
|
+
* [TT-6441] Turns out we don't actually need time difference in QT
|
6
|
+
* [TT-6661] Fix issue when detecting intersecting date groups
|
7
|
+
|
3
8
|
## 0.7.0
|
4
9
|
|
5
10
|
* [TT-6441] Due to TimeDifference being unmaintained bring it into the timely library
|
data/lib/timely/rails.rb
CHANGED
@@ -18,9 +18,7 @@ module Timely
|
|
18
18
|
scope :within_range, lambda { |date_range|
|
19
19
|
# IMPORTANT: Required for correctness in case of string param.
|
20
20
|
dates = Array(date_range)
|
21
|
-
|
22
|
-
scope = scope.or(covering_date(dates.last)) if dates.first != dates.last
|
23
|
-
scope
|
21
|
+
where(arel_table[:start_date].lteq(dates.last)).where(arel_table[:end_date].gteq(dates.first))
|
24
22
|
}
|
25
23
|
|
26
24
|
scope :for_any_weekdays, lambda { |weekdays_int|
|
data/lib/timely/version.rb
CHANGED
data/spec/date_group_spec.rb
CHANGED
@@ -33,6 +33,44 @@ RSpec.describe Timely::DateGroup do
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
RSpec.describe Timely::DateGroup, 'Timely::DateGroup.applying_for_duration' do
|
37
|
+
let!(:date_group_a) { Timely::DateGroup.create!(
|
38
|
+
start_date: '2020-01-01', end_date: '2020-04-04', weekdays: %w[1 1 1 1 1 1 1]
|
39
|
+
) }
|
40
|
+
|
41
|
+
let!(:date_group_b) { Timely::DateGroup.create!(
|
42
|
+
start_date: '2020-04-02', end_date: '2020-04-09', weekdays: %w[1 1 1 1 1 1 1]
|
43
|
+
) }
|
44
|
+
|
45
|
+
subject {
|
46
|
+
Timely::DateGroup.applying_for_duration(Timely::DateRange.new(start_date, end_date)).to_a
|
47
|
+
}
|
48
|
+
|
49
|
+
context 'intersecting dates (inside first)' do
|
50
|
+
let(:start_date) { '2020-03-29'.to_date }
|
51
|
+
let(:end_date) { '2020-04-13'.to_date }
|
52
|
+
it { is_expected.to eq([date_group_a, date_group_b]) }
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'intersecting dates full range' do
|
56
|
+
let(:start_date) { '2020-01-01'.to_date }
|
57
|
+
let(:end_date) { '2020-04-09'.to_date }
|
58
|
+
it { is_expected.to eq([date_group_a, date_group_b]) }
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'touching end of range' do
|
62
|
+
let(:start_date) { '2020-04-09'.to_date }
|
63
|
+
let(:end_date) { '2020-04-09'.to_date }
|
64
|
+
it { is_expected.to eq([date_group_b]) }
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'touching start of range' do
|
68
|
+
let(:start_date) { '2020-04-01'.to_date }
|
69
|
+
let(:end_date) { '2020-04-01'.to_date }
|
70
|
+
it { is_expected.to eq([date_group_a]) }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
36
74
|
RSpec.describe Timely::DateGroup, 'without weekdays' do
|
37
75
|
subject { Timely::DateGroup.new(start_date: Date.current, end_date: Date.current) }
|
38
76
|
it { is_expected.to be_valid }
|
data/spec/spec_helper.rb
CHANGED
@@ -11,6 +11,8 @@ require 'rubygems'
|
|
11
11
|
require 'bundler/setup'
|
12
12
|
require 'rspec/its'
|
13
13
|
require 'active_record'
|
14
|
+
require 'pry'
|
15
|
+
require 'database_cleaner'
|
14
16
|
|
15
17
|
require 'support/coverage_loader'
|
16
18
|
|
@@ -30,4 +32,15 @@ load('spec/schema.rb')
|
|
30
32
|
RSpec.configure do |config|
|
31
33
|
config.run_all_when_everything_filtered = true
|
32
34
|
config.filter_run :focus
|
35
|
+
|
36
|
+
config.before(:suite) do
|
37
|
+
DatabaseCleaner.strategy = :transaction
|
38
|
+
DatabaseCleaner.clean_with(:truncation, except: %w(ar_internal_metadata))
|
39
|
+
end
|
40
|
+
|
41
|
+
config.around(:each) do |example|
|
42
|
+
DatabaseCleaner.cleaning do
|
43
|
+
example.run
|
44
|
+
end
|
45
|
+
end
|
33
46
|
end
|
data/timely.gemspec
CHANGED
@@ -29,10 +29,12 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_development_dependency 'rake'
|
30
30
|
spec.add_development_dependency 'rspec'
|
31
31
|
spec.add_development_dependency 'rspec-its'
|
32
|
+
spec.add_development_dependency 'database_cleaner'
|
32
33
|
spec.add_development_dependency 'rubocop'
|
33
34
|
spec.add_development_dependency 'rubocop-rails'
|
34
35
|
spec.add_development_dependency 'simplecov-rcov'
|
35
36
|
spec.add_development_dependency 'sqlite3'
|
36
37
|
spec.add_development_dependency 'timecop'
|
37
38
|
spec.add_development_dependency 'travis'
|
39
|
+
spec.add_development_dependency 'pry'
|
38
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timely
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Noack
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: database_cleaner
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: rubocop
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,6 +234,20 @@ dependencies:
|
|
220
234
|
- - ">="
|
221
235
|
- !ruby/object:Gem::Version
|
222
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: pry
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
223
251
|
description: Set of time, date, weekday related methods.
|
224
252
|
email:
|
225
253
|
- support@travellink.com.au
|
@@ -254,7 +282,6 @@ files:
|
|
254
282
|
- lib/timely/rails/period.rb
|
255
283
|
- lib/timely/rails/season.rb
|
256
284
|
- lib/timely/rails/time.rb
|
257
|
-
- lib/timely/rails/time_difference.rb
|
258
285
|
- lib/timely/railtie.rb
|
259
286
|
- lib/timely/range.rb
|
260
287
|
- lib/timely/string.rb
|
@@ -277,7 +304,6 @@ files:
|
|
277
304
|
- spec/rails/date_spec.rb
|
278
305
|
- spec/rails/date_time_spec.rb
|
279
306
|
- spec/rails/period_spec.rb
|
280
|
-
- spec/rails/time_difference_spec.rb
|
281
307
|
- spec/rails/time_spec.rb
|
282
308
|
- spec/schema.rb
|
283
309
|
- spec/season_spec.rb
|
@@ -322,7 +348,6 @@ test_files:
|
|
322
348
|
- spec/rails/date_spec.rb
|
323
349
|
- spec/rails/date_time_spec.rb
|
324
350
|
- spec/rails/period_spec.rb
|
325
|
-
- spec/rails/time_difference_spec.rb
|
326
351
|
- spec/rails/time_spec.rb
|
327
352
|
- spec/schema.rb
|
328
353
|
- spec/season_spec.rb
|
@@ -1,100 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'active_support/all'
|
5
|
-
|
6
|
-
module Timely
|
7
|
-
class TimeDifference
|
8
|
-
private_class_method :new
|
9
|
-
|
10
|
-
TIME_COMPONENTS = %i[years months weeks days hours minutes seconds].freeze
|
11
|
-
|
12
|
-
def self.between(start_time, end_time)
|
13
|
-
new(start_time, end_time)
|
14
|
-
end
|
15
|
-
|
16
|
-
def in_years
|
17
|
-
in_component(:years)
|
18
|
-
end
|
19
|
-
|
20
|
-
def in_months
|
21
|
-
(@time_diff / (1.day * 30.42)).round(2)
|
22
|
-
end
|
23
|
-
|
24
|
-
def in_weeks
|
25
|
-
in_component(:weeks)
|
26
|
-
end
|
27
|
-
|
28
|
-
def in_days
|
29
|
-
in_component(:days)
|
30
|
-
end
|
31
|
-
|
32
|
-
def in_hours
|
33
|
-
in_component(:hours)
|
34
|
-
end
|
35
|
-
|
36
|
-
def in_minutes
|
37
|
-
in_component(:minutes)
|
38
|
-
end
|
39
|
-
|
40
|
-
def in_seconds
|
41
|
-
@time_diff
|
42
|
-
end
|
43
|
-
|
44
|
-
def in_each_component
|
45
|
-
Hash[TIME_COMPONENTS.map do |time_component|
|
46
|
-
[time_component, public_send("in_#{time_component}")]
|
47
|
-
end]
|
48
|
-
end
|
49
|
-
|
50
|
-
def in_general
|
51
|
-
remaining = @time_diff
|
52
|
-
Hash[TIME_COMPONENTS.map do |time_component|
|
53
|
-
if remaining > 0
|
54
|
-
rounded_time_component = (remaining / 1.send(time_component).seconds).round(2).floor
|
55
|
-
remaining -= rounded_time_component.send(time_component)
|
56
|
-
[time_component, rounded_time_component]
|
57
|
-
else
|
58
|
-
[time_component, 0]
|
59
|
-
end
|
60
|
-
end]
|
61
|
-
end
|
62
|
-
|
63
|
-
def humanize
|
64
|
-
diff_parts = []
|
65
|
-
in_general.each do |part, quantity|
|
66
|
-
next if quantity <= 0
|
67
|
-
|
68
|
-
part = part.to_s.humanize
|
69
|
-
|
70
|
-
part = part.singularize if quantity <= 1
|
71
|
-
|
72
|
-
diff_parts << "#{quantity} #{part}"
|
73
|
-
end
|
74
|
-
|
75
|
-
last_part = diff_parts.pop
|
76
|
-
if diff_parts.empty?
|
77
|
-
last_part
|
78
|
-
else
|
79
|
-
[diff_parts.join(', '), last_part].join(' and ')
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
|
85
|
-
def initialize(start_time, end_time)
|
86
|
-
start_time = time_in_seconds(start_time)
|
87
|
-
end_time = time_in_seconds(end_time)
|
88
|
-
|
89
|
-
@time_diff = (end_time - start_time).abs
|
90
|
-
end
|
91
|
-
|
92
|
-
def time_in_seconds(time)
|
93
|
-
time.to_time.to_f
|
94
|
-
end
|
95
|
-
|
96
|
-
def in_component(component)
|
97
|
-
(@time_diff / 1.send(component)).round(2)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
@@ -1,185 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Timely::TimeDifference do
|
6
|
-
def self.with_each_class(&block)
|
7
|
-
classes = [Time, Date, DateTime]
|
8
|
-
|
9
|
-
classes.each do |clazz|
|
10
|
-
context "with a #{clazz.name} class" do
|
11
|
-
instance_exec clazz, &block
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe '.between' do
|
17
|
-
with_each_class do |clazz|
|
18
|
-
it 'returns a new TimeDifference instance in each component' do
|
19
|
-
start_time = clazz.new(2011, 1)
|
20
|
-
end_time = clazz.new(2011, 12)
|
21
|
-
|
22
|
-
expect(Timely::TimeDifference.between(start_time, end_time)).to be_a(Timely::TimeDifference)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe '#in_each_component' do
|
28
|
-
with_each_class do |clazz|
|
29
|
-
it 'returns time difference in each component' do
|
30
|
-
start_time = clazz.new(2011, 1)
|
31
|
-
end_time = clazz.new(2011, 12)
|
32
|
-
|
33
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_each_component).to eql(years: 0.91, months: 10.98, weeks: 47.71, days: 334.0, hours: 8016.0, minutes: 480_960.0, seconds: 28_857_600.0)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#in_general' do
|
39
|
-
with_each_class do |clazz|
|
40
|
-
it 'returns time difference in general that matches the total seconds' do
|
41
|
-
start_time = clazz.new(2009, 11)
|
42
|
-
end_time = clazz.new(2011, 1)
|
43
|
-
|
44
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_general).to eql(years: 1, months: 2, weeks: 0, days: 0, hours: 0, minutes: 0, seconds: 0)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe '#humanize' do
|
50
|
-
with_each_class do |clazz|
|
51
|
-
it 'returns a string representing the time difference from in_general' do
|
52
|
-
start_time = clazz.new(2009, 11)
|
53
|
-
end_time = clazz.new(2011, 1)
|
54
|
-
|
55
|
-
expect(Timely::TimeDifference.between(start_time, end_time).humanize).to eql('1 Year and 2 Months')
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe '#in_years' do
|
61
|
-
with_each_class do |clazz|
|
62
|
-
it 'returns time difference in years based on Wolfram Alpha' do
|
63
|
-
start_time = clazz.new(2011, 1)
|
64
|
-
end_time = clazz.new(2011, 12)
|
65
|
-
|
66
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_years).to eql(0.91)
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'returns an absolute difference' do
|
70
|
-
start_time = clazz.new(2011, 12)
|
71
|
-
end_time = clazz.new(2011, 1)
|
72
|
-
|
73
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_years).to eql(0.91)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe '#in_months' do
|
79
|
-
with_each_class do |clazz|
|
80
|
-
it 'returns time difference in months based on Wolfram Alpha' do
|
81
|
-
start_time = clazz.new(2011, 1)
|
82
|
-
end_time = clazz.new(2011, 12)
|
83
|
-
|
84
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_months).to eql(10.98)
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'returns an absolute difference' do
|
88
|
-
start_time = clazz.new(2011, 12)
|
89
|
-
end_time = clazz.new(2011, 1)
|
90
|
-
|
91
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_months).to eql(10.98)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe '#in_weeks' do
|
97
|
-
with_each_class do |clazz|
|
98
|
-
it 'returns time difference in weeks based on Wolfram Alpha' do
|
99
|
-
start_time = clazz.new(2011, 1)
|
100
|
-
end_time = clazz.new(2011, 12)
|
101
|
-
|
102
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_weeks).to eql(47.71)
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'returns an absolute difference' do
|
106
|
-
start_time = clazz.new(2011, 12)
|
107
|
-
end_time = clazz.new(2011, 1)
|
108
|
-
|
109
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_weeks).to eql(47.71)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
describe '#in_days' do
|
115
|
-
with_each_class do |clazz|
|
116
|
-
it 'returns time difference in weeks based on Wolfram Alpha' do
|
117
|
-
start_time = clazz.new(2011, 1)
|
118
|
-
end_time = clazz.new(2011, 12)
|
119
|
-
|
120
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_days).to eql(334.0)
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'returns an absolute difference' do
|
124
|
-
start_time = clazz.new(2011, 12)
|
125
|
-
end_time = clazz.new(2011, 1)
|
126
|
-
|
127
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_days).to eql(334.0)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
describe '#in_hours' do
|
133
|
-
with_each_class do |clazz|
|
134
|
-
it 'returns time difference in hours based on Wolfram Alpha' do
|
135
|
-
start_time = clazz.new(2011, 1)
|
136
|
-
end_time = clazz.new(2011, 12)
|
137
|
-
|
138
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_hours).to eql(8016.0)
|
139
|
-
end
|
140
|
-
|
141
|
-
it 'returns an absolute difference' do
|
142
|
-
start_time = clazz.new(2011, 12)
|
143
|
-
end_time = clazz.new(2011, 1)
|
144
|
-
|
145
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_hours).to eql(8016.0)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
describe '#in_minutes' do
|
151
|
-
with_each_class do |clazz|
|
152
|
-
it 'returns time difference in minutes based on Wolfram Alpha' do
|
153
|
-
start_time = clazz.new(2011, 1)
|
154
|
-
end_time = clazz.new(2011, 12)
|
155
|
-
|
156
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_minutes).to eql(480_960.0)
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'returns an absolute difference' do
|
160
|
-
start_time = clazz.new(2011, 12)
|
161
|
-
end_time = clazz.new(2011, 1)
|
162
|
-
|
163
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_minutes).to eql(480_960.0)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
describe '#in_seconds' do
|
169
|
-
with_each_class do |clazz|
|
170
|
-
it 'returns time difference in seconds based on Wolfram Alpha' do
|
171
|
-
start_time = clazz.new(2011, 1)
|
172
|
-
end_time = clazz.new(2011, 12)
|
173
|
-
|
174
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_seconds).to eql(28_857_600.0)
|
175
|
-
end
|
176
|
-
|
177
|
-
it 'returns an absolute difference' do
|
178
|
-
start_time = clazz.new(2011, 12)
|
179
|
-
end_time = clazz.new(2011, 1)
|
180
|
-
|
181
|
-
expect(Timely::TimeDifference.between(start_time, end_time).in_seconds).to eql(28_857_600.0)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|