active_period 7.0.0 → 7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +9 -7
- data/README.md +38 -0
- data/active_period.gemspec +1 -1
- data/config/locales/fr.yml +1 -1
- data/lib/active_period/comparable.rb +3 -1
- data/lib/active_period/period.rb +64 -6
- data/lib/active_period/version.rb +1 -1
- data/lib/period.rb +5 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfac8dacceda500a1902d5294bc1085a70471c3b8d9abf0c0bf039c5e6a5bdba
|
4
|
+
data.tar.gz: a016fb107d49981e8eb89caf285012277c30b21a46928c460bc7ad9c5f5e80ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f164a66d035b1f4488a5851fdc9205c2a1836c35c145d63f551fe52038749d86e0c11d6d57eb266aa0c980516e28211a004b0fbe7019335a9ffd29ee0687f22d
|
7
|
+
data.tar.gz: ec860e7598cf0263def6444a9a119efb04aa3631d9f5c1106a7ca690adb9a0c7d1e413ccfd567cb4e9be61de4613c9a77e54dbe06979dc434fd342e92cf50fd4
|
data/Gemfile.lock
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
active_period (7.
|
5
|
-
activesupport (
|
4
|
+
active_period (7.1.0)
|
5
|
+
activesupport (>= 5, <= 7)
|
6
6
|
i18n (~> 1)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activesupport (
|
11
|
+
activesupport (6.1.4)
|
12
12
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
13
13
|
i18n (>= 1.6, < 2)
|
14
14
|
minitest (>= 5.1)
|
15
15
|
tzinfo (~> 2.0)
|
16
|
+
zeitwerk (~> 2.3)
|
16
17
|
builder (3.2.4)
|
17
|
-
concurrent-ruby (1.1.
|
18
|
+
concurrent-ruby (1.1.10)
|
18
19
|
cucumber (7.0.0)
|
19
20
|
builder (~> 3.2, >= 3.2.4)
|
20
21
|
cucumber-core (~> 10.0, >= 10.0.1)
|
@@ -48,18 +49,19 @@ GEM
|
|
48
49
|
cucumber-messages (~> 17.0, >= 17.0.1)
|
49
50
|
diff-lcs (1.4.4)
|
50
51
|
ffi (1.15.3)
|
51
|
-
i18n (1.
|
52
|
+
i18n (1.12.0)
|
52
53
|
concurrent-ruby (~> 1.0)
|
53
54
|
mime-types (3.3.1)
|
54
55
|
mime-types-data (~> 3.2015)
|
55
56
|
mime-types-data (3.2021.0704)
|
56
|
-
minitest (5.
|
57
|
+
minitest (5.16.3)
|
57
58
|
multi_test (0.1.2)
|
58
59
|
rake (10.5.0)
|
59
60
|
sys-uname (1.2.2)
|
60
61
|
ffi (~> 1.1)
|
61
|
-
tzinfo (2.0.
|
62
|
+
tzinfo (2.0.5)
|
62
63
|
concurrent-ruby (~> 1.0)
|
64
|
+
zeitwerk (2.6.0)
|
63
65
|
|
64
66
|
PLATFORMS
|
65
67
|
ruby
|
data/README.md
CHANGED
@@ -82,6 +82,9 @@ Period.new(params[:start_date]..params[:end_date])
|
|
82
82
|
|
83
83
|
# or from a range
|
84
84
|
('01/01/2000'...'01/02/2000').to_period
|
85
|
+
|
86
|
+
# you can also use [] if .new is too long for you
|
87
|
+
Period['01/01/2000'...'01/02/2000']
|
85
88
|
```
|
86
89
|
|
87
90
|
**Note** : `to_period` will always return a **FreePeriod**
|
@@ -204,6 +207,41 @@ These methods return a **StandardPeriod** who include the current period
|
|
204
207
|
Period.this_year.months.second.weeks.last.days.third
|
205
208
|
```
|
206
209
|
|
210
|
+
## Period Combination with `&` and `|`
|
211
|
+
|
212
|
+
You can use `&` to combine overlapping periods
|
213
|
+
And `|` to combine overlapping and tail to head periods
|
214
|
+
If the given periods cannot combine, then `nil` will be return
|
215
|
+
The period we take the ending date from, determine if the ending date is included or excluded
|
216
|
+
|
217
|
+
#### Example for `&`
|
218
|
+
```ruby
|
219
|
+
# Overlapping periods
|
220
|
+
(Period['01/01/2021'..'20/01/2021'] & Period['10/01/2021'...'30/01/2021']).to_s
|
221
|
+
=> "From the 10 January 2021 to the 20 January 2021 included"
|
222
|
+
|
223
|
+
# Theses period cannot combine
|
224
|
+
Period.this_month & Period.next_month
|
225
|
+
=> nil
|
226
|
+
```
|
227
|
+
|
228
|
+
#### Example for `|`
|
229
|
+
```ruby
|
230
|
+
# Overlapping periods
|
231
|
+
(Period['01/01/2021'..'20/01/2021'] | Period['10/01/2021'...'30/01/2021']).to_s
|
232
|
+
=> "From the 01 January 2021 to the 30 January 2021 excluded"
|
233
|
+
|
234
|
+
# Example with tail to head
|
235
|
+
(Period.this_month | Period.next_month).to_s
|
236
|
+
=> "From the 01 September 2022 to the 31 October 2022 included"
|
237
|
+
(Period['01/01/2021'..'09/01/2021'] | Period['10/01/2021'..'20/01/2021']).to_s
|
238
|
+
=> "From the 01 January 2021 to the 20 January 2021 included"
|
239
|
+
|
240
|
+
# Theses period cannot combine
|
241
|
+
Period['01/01/2021'...'09/01/2021'] | Period['10/01/2021'..'20/01/2021']
|
242
|
+
=> nil
|
243
|
+
```
|
244
|
+
|
207
245
|
## Boundless Period
|
208
246
|
|
209
247
|
Boundless period are fully supported and work as you expect them to do
|
data/active_period.gemspec
CHANGED
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec|
|
|
38
38
|
|
39
39
|
spec.required_ruby_version = '>= 2.7'
|
40
40
|
|
41
|
-
spec.add_runtime_dependency 'activesupport', '>= 5', '
|
41
|
+
spec.add_runtime_dependency 'activesupport', '>= 5', '< 8'
|
42
42
|
spec.add_runtime_dependency 'i18n', '~> 1'
|
43
43
|
|
44
44
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
data/config/locales/fr.yml
CHANGED
@@ -5,7 +5,7 @@ fr:
|
|
5
5
|
comparable:
|
6
6
|
incomparable_error: Les arguments ne sont pas comparables
|
7
7
|
collection:
|
8
|
-
param_period_must_be_a_period:
|
8
|
+
param_period_must_be_a_period: Le paramètre doit hériter de la class Period
|
9
9
|
period:
|
10
10
|
base_class_is_abstract: Period est une class abstraite qui ne doit pas être utiliser directement
|
11
11
|
begin_date_is_invalid: Date de début invalide
|
@@ -16,12 +16,14 @@ module ActivePeriod
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def <=>(other)
|
19
|
+
raise ArgumentError, I18n.t(:incomparable_error, scope: %i[active_period comparable]) unless other.is_a?(ActiveSupport::Duration)
|
20
|
+
|
19
21
|
if other.is_a?(ActiveSupport::Duration) || other.is_a?(Numeric)
|
20
22
|
to_i <=> other.to_i
|
21
23
|
elsif self.class != other.class
|
22
24
|
raise ArgumentError, I18n.t(:incomparable_error, scope: %i[active_period comparable])
|
23
25
|
else
|
24
|
-
(
|
26
|
+
(self.begin <=> other)
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
data/lib/active_period/period.rb
CHANGED
@@ -9,7 +9,7 @@ class ActivePeriod::Period < Range
|
|
9
9
|
# @param range [Range] A valid range
|
10
10
|
# @param allow_beginless [Boolean] Is it allow to creat a beginless range
|
11
11
|
# @param allow_endless [Boolean] Is it allow to creat an endless range
|
12
|
-
# @return [self] A new instance of ActivePeriod::
|
12
|
+
# @return [self] A new instance of ActivePeriod::Period
|
13
13
|
# @raise ArgumentError if the params range is not a Range
|
14
14
|
# @raise ArgumentError if the params range is invalid
|
15
15
|
def initialize(range, allow_beginless: true, allow_endless: true)
|
@@ -25,8 +25,6 @@ class ActivePeriod::Period < Range
|
|
25
25
|
raise ::ArgumentError, I18n.t(:end_date_is_invalid, scope: %i[active_period period]) if !allow_endless && to.nil?
|
26
26
|
to = to.try(:end_of_day) || to
|
27
27
|
|
28
|
-
# raise ::ArgumentError, I18n.t(:endless_excluded_end_is_forbiden, scope: %i[active_period period]) if to.nil? && range.exclude_end?
|
29
|
-
# to = to.prev_day if range.exclude_end?
|
30
28
|
if range.exclude_end? && from && to && from.to_date == to.to_date
|
31
29
|
raise ::ArgumentError, I18n.t(:start_is_equal_to_end_excluded, scope: %i[active_period period])
|
32
30
|
end
|
@@ -70,19 +68,79 @@ class ActivePeriod::Period < Range
|
|
70
68
|
raise NotImplementedError
|
71
69
|
end
|
72
70
|
|
73
|
-
# @param other [ActivePeriod::
|
71
|
+
# @param other [ActivePeriod::Period, ActiveSupport::Duration, Numeric] Any kind of ActivePeriod::Period, ActiveSupport::Duration or Numeric (in seconds)
|
74
72
|
# @return [Boolean] true if period are equals, false otherwise
|
75
|
-
# @raise ArgumentError if params other is not a ActivePeriod::
|
73
|
+
# @raise ArgumentError if params other is not a ActivePeriod::Period of some kind
|
76
74
|
def ==(other)
|
77
75
|
if other.class.ancestors.include?(ActivePeriod::Period)
|
78
76
|
from == other.from && self.calculated_end == other.calculated_end
|
79
|
-
elsif other.is_a?(ActiveSupport::Duration)
|
77
|
+
elsif other.is_a?(ActiveSupport::Duration)
|
80
78
|
super(other)
|
79
|
+
elsif other.is_a?(Numeric)
|
80
|
+
super(other.seconds)
|
81
81
|
else
|
82
82
|
raise ArgumentError
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
+
# @param other [ActivePeriod::Period] Any kind of ActivePeriod::Period object
|
87
|
+
# @return [Boolean] true if period and class are the same, false otherwise
|
88
|
+
# @raise ArgumentError if params other is not a ActivePeriod::Period of some kind
|
89
|
+
def ===(other)
|
90
|
+
self == other && self.class == other.class
|
91
|
+
end
|
92
|
+
|
93
|
+
# @param other [ActivePeriod::Period] Any kind of ActivePeriod::Period object
|
94
|
+
# @return [ActivePeriod::Period, nil] Any kind of ActivePeriod::FreePeriod if period overlap, nil otherwise
|
95
|
+
# @raise ArgumentError if params other is not a ActivePeriod::Period of some kind
|
96
|
+
def &(other)
|
97
|
+
raise ArgumentError, I18n.t(:incomparable_error, scope: %i[active_period comparable]) unless other.class.ancestors.include?(ActivePeriod::Period)
|
98
|
+
|
99
|
+
# self 9------12
|
100
|
+
# other 1-----------10
|
101
|
+
if self.begin.in?(other) && !calculated_end.in?(other)
|
102
|
+
Period.new( Range.new(self.begin, other.to, other.exclude_end?) )
|
103
|
+
# self 1-----------10
|
104
|
+
# other 9------12
|
105
|
+
elsif !self.begin.in?(other) && calculated_end.in?(other)
|
106
|
+
Period.new( Range.new(other.begin, to, exclude_end?) )
|
107
|
+
# self 5-----8
|
108
|
+
# other 1-----------10
|
109
|
+
elsif other.include?(self)
|
110
|
+
other
|
111
|
+
# self 1-----------10
|
112
|
+
# other 5-----8
|
113
|
+
elsif self.include?(other)
|
114
|
+
self
|
115
|
+
else
|
116
|
+
nil
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# @param other [ActivePeriod::Period] Any kind of ActivePeriod::Period object
|
121
|
+
# @return [ActivePeriod::Period, nil] Any kind of ActivePeriod::FreePeriod if period overlap, nil otherwise
|
122
|
+
# @raise ArgumentError if params other is not a ActivePeriod::Period of some kind
|
123
|
+
def |(other)
|
124
|
+
raise ArgumentError, I18n.t(:incomparable_error, scope: %i[active_period comparable]) unless other.class.ancestors.include?(ActivePeriod::Period)
|
125
|
+
|
126
|
+
# overlapping or tail to head
|
127
|
+
if self.begin.in?(other) || self.calculated_end.in?(other) || (
|
128
|
+
((self.calculated_end+1.day).beginning_of_day == other.from) ^
|
129
|
+
((other.calculated_end+1.day).beginning_of_day == self.from)
|
130
|
+
)
|
131
|
+
Period.new(
|
132
|
+
Range.new(
|
133
|
+
[self.begin, other.begin].min,
|
134
|
+
[self.to, other.to].max,
|
135
|
+
self.calculated_end > other.calculated_end ? self.exclude_end? : other.exclude_end?
|
136
|
+
)
|
137
|
+
)
|
138
|
+
# no overlapping
|
139
|
+
else
|
140
|
+
nil
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
86
144
|
# @raise NotImplementedError This method should be implemented in daughter class
|
87
145
|
def strftime
|
88
146
|
raise NotImplementedError
|
data/lib/period.rb
CHANGED
@@ -12,6 +12,11 @@ module Period
|
|
12
12
|
ActivePeriod::FreePeriod.new(range, allow_beginless: false, allow_endless: false)
|
13
13
|
end
|
14
14
|
|
15
|
+
# Shorthand to Period.new
|
16
|
+
def self.[](range)
|
17
|
+
Period.new(range)
|
18
|
+
end
|
19
|
+
|
15
20
|
# env_time provide a Fallback if the project dont specify any Time.zone
|
16
21
|
def self.env_time
|
17
22
|
(Time.zone || Time)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_period
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- billau_l
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -17,9 +17,9 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '5'
|
20
|
-
- - "
|
20
|
+
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '8'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,9 +27,9 @@ dependencies:
|
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '5'
|
30
|
-
- - "
|
30
|
+
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '8'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: i18n
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|