ndr_support 5.5.1 → 5.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -1
- data/README.md +1 -1
- data/code_safety.yml +64 -46
- data/lib/ndr_support/concerns/working_days.rb +33 -11
- data/lib/ndr_support/date_and_time_extensions.rb +1 -3
- data/lib/ndr_support/daterange.rb +40 -15
- data/lib/ndr_support/integer/julian_date_conversions.rb +0 -2
- data/lib/ndr_support/integer/working_days.rb +11 -0
- data/lib/ndr_support/ourdate.rb +4 -2
- data/lib/ndr_support/ourtime.rb +2 -2
- data/lib/ndr_support/safe_path.rb +1 -0
- data/lib/ndr_support/string/cleaning.rb +1 -0
- data/lib/ndr_support/string/conversions.rb +2 -3
- data/lib/ndr_support/threat_scanner.rb +1 -0
- data/lib/ndr_support/utf8_encoding/control_characters.rb +0 -2
- data/lib/ndr_support/utf8_encoding/force_binary.rb +0 -2
- data/lib/ndr_support/utf8_encoding/object_support.rb +0 -2
- data/lib/ndr_support/version.rb +1 -1
- data/lib/ndr_support/working_days.rb +5 -0
- data/ndr_support.gemspec +5 -7
- data/test/concerns/working_days_test.rb +18 -0
- data/test/daterange_test.rb +77 -5
- data/test/integer/working_days_test.rb +14 -0
- data/test/string/cleaning_test.rb +3 -0
- data/test/string/conversions_test.rb +6 -6
- metadata +15 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 902f81bfb91abe5145aebc693e0f200b621db63183963e6c1bc0d2c7ef783c7e
|
4
|
+
data.tar.gz: 8bb91d0cfa4e64493330d9fa1eeb2765452e45547d751df43daf954da5a06ddd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b006ab6c6ea53f6ce5b47dc38fd290d1b9679995eacea4cbd269477e79e06bc2a1a752b273d707dce3a127e8c605b08fae8dfa6c1a606bb272f290521f66d971
|
7
|
+
data.tar.gz: 193a182ca039ba2113d1701c75511eb00bd8c4ce3e52e5797c7a6846c3963fdca392b3374faa79b9fdf78e25ad3514f87d1bbc2bc6545f68092f698b7ab93a33
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,40 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
*no unreleased changes*
|
3
3
|
|
4
|
+
## 5.8.0 / 2021-04-19
|
5
|
+
## Added
|
6
|
+
|
7
|
+
* Add ability to disable date reversing in Daterange
|
8
|
+
|
9
|
+
## Fixed
|
10
|
+
* Support Ruby 2.6-3.0.
|
11
|
+
* Fix ruby warnings
|
12
|
+
|
13
|
+
## 5.7.1 / 2021-01-03
|
14
|
+
## Fixed
|
15
|
+
* Postcodeize old Newport postcodes
|
16
|
+
* Bump rake version
|
17
|
+
* Support 2022 public holidays
|
18
|
+
|
19
|
+
## 5.7.0 / 2020-06-30
|
20
|
+
## Added
|
21
|
+
* Handle three char months in Daterange
|
22
|
+
|
23
|
+
## 5.6.1 / 2020-01-02
|
24
|
+
## Fixed
|
25
|
+
* Fix issue with 2020 public holiday
|
26
|
+
* Support 2021 public holidays
|
27
|
+
* Ensure dateranges up to 2030 are supported
|
28
|
+
|
29
|
+
## 5.6.0 / 2019-08-29
|
30
|
+
### Added
|
31
|
+
* Add `Integer#working_days_since`. (#11)
|
32
|
+
|
4
33
|
## 5.5.1 / 2019-05-15
|
5
34
|
### Fixed
|
6
35
|
* Support Ruby 2.6, Rails 6.0. Minimum Ruby/Rails versions are now 2.5/5.2
|
7
36
|
* Warn when WorkingDays lookup is getting stale
|
8
|
-
* Improved date parsing in String#to_date
|
37
|
+
* Improved date parsing in `String#to_date`
|
9
38
|
|
10
39
|
## 5.5.0 / 2018-11-16
|
11
40
|
### Added
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# NdrSupport [![Build Status](https://
|
1
|
+
# NdrSupport [![Build Status](https://github.com/publichealthengland/ndr_support/workflows/Test/badge.svg)](https://github.com/publichealthengland/ndr_support/actions?query=workflow%3Atest) [![Gem Version](https://badge.fury.io/rb/ndr_support.svg)](https://rubygems.org/gems/ndr_support)
|
2
2
|
|
3
3
|
This is the Public Health England (PHE) National Disease Registers (NDR) Support ruby gem, providing:
|
4
4
|
|
data/code_safety.yml
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
---
|
2
2
|
file safety:
|
3
|
+
".github/CODEOWNERS":
|
4
|
+
comments:
|
5
|
+
reviewed_by: ollietulloch
|
6
|
+
safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
|
7
|
+
".github/workflows/lint.yml":
|
8
|
+
comments:
|
9
|
+
reviewed_by: ollietulloch
|
10
|
+
safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
|
11
|
+
".github/workflows/test.yml":
|
12
|
+
comments:
|
13
|
+
reviewed_by: ollietulloch
|
14
|
+
safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
|
3
15
|
".gitignore":
|
4
16
|
comments:
|
5
17
|
reviewed_by: josh.pencheon
|
@@ -8,16 +20,10 @@ file safety:
|
|
8
20
|
comments:
|
9
21
|
reviewed_by: josh.pencheon
|
10
22
|
safe_revision: a02f14cbf1fc36fbaf820365fdedfdc9af326db1
|
11
|
-
".travis.yml":
|
12
|
-
comments: 'diff failed; reviewed whole file. Revision c88f5ac8c12fd657bb142144e0d3afaa7f9bc361:
|
13
|
-
Slack notification secret is public/private key encrypted, so not a disclosure
|
14
|
-
risk. As a secondary protection, it''s excluded from the .gem file by ndr_support.gemspec'
|
15
|
-
reviewed_by: josh.pencheon
|
16
|
-
safe_revision: 0cfcfac5ddcd721a67dcd23f04cbf6bc2278b922
|
17
23
|
CHANGELOG.md:
|
18
24
|
comments:
|
19
|
-
reviewed_by:
|
20
|
-
safe_revision:
|
25
|
+
reviewed_by: ollietulloch
|
26
|
+
safe_revision: b0dc20ab24516ac5c3ecb6c7078b56a20dd2fbd5
|
21
27
|
CODE_OF_CONDUCT.md:
|
22
28
|
comments:
|
23
29
|
reviewed_by: timgentry
|
@@ -36,8 +42,8 @@ file safety:
|
|
36
42
|
safe_revision: 90328cca8494539257e192a63b240a91c89f0616
|
37
43
|
README.md:
|
38
44
|
comments:
|
39
|
-
reviewed_by:
|
40
|
-
safe_revision:
|
45
|
+
reviewed_by: ollietulloch
|
46
|
+
safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
|
41
47
|
Rakefile:
|
42
48
|
comments:
|
43
49
|
reviewed_by: timgentry
|
@@ -60,16 +66,16 @@ file safety:
|
|
60
66
|
safe_revision: 4a4ed24d2cfe7e1736baadf4cf6e0fece6823be1
|
61
67
|
lib/ndr_support/concerns/working_days.rb:
|
62
68
|
comments:
|
63
|
-
reviewed_by:
|
64
|
-
safe_revision:
|
69
|
+
reviewed_by: brianshand
|
70
|
+
safe_revision: b72baa322dc58820ccd615a178371c2e5dab113c
|
65
71
|
lib/ndr_support/date_and_time_extensions.rb:
|
66
72
|
comments:
|
67
73
|
reviewed_by: josh.pencheon
|
68
|
-
safe_revision:
|
74
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
69
75
|
lib/ndr_support/daterange.rb:
|
70
76
|
comments:
|
71
|
-
reviewed_by:
|
72
|
-
safe_revision:
|
77
|
+
reviewed_by: ollietulloch
|
78
|
+
safe_revision: 7b9c9525a5d9d319ddec75d5106c85a53f77e3f4
|
73
79
|
lib/ndr_support/hash.rb:
|
74
80
|
comments:
|
75
81
|
reviewed_by: pauleves
|
@@ -80,12 +86,16 @@ file safety:
|
|
80
86
|
safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
|
81
87
|
lib/ndr_support/integer/julian_date_conversions.rb:
|
82
88
|
comments:
|
83
|
-
reviewed_by:
|
84
|
-
safe_revision:
|
89
|
+
reviewed_by: ollietulloch
|
90
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
85
91
|
lib/ndr_support/integer/rounding.rb:
|
86
92
|
comments:
|
87
93
|
reviewed_by: josh.pencheon
|
88
94
|
safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
|
95
|
+
lib/ndr_support/integer/working_days.rb:
|
96
|
+
comments:
|
97
|
+
reviewed_by: josh.pencheon
|
98
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
89
99
|
lib/ndr_support/nil.rb:
|
90
100
|
comments:
|
91
101
|
reviewed_by: pauleves
|
@@ -96,12 +106,12 @@ file safety:
|
|
96
106
|
safe_revision: 50a4293953f9ae227823c390b069a3ed4825074c
|
97
107
|
lib/ndr_support/ourdate.rb:
|
98
108
|
comments:
|
99
|
-
reviewed_by:
|
100
|
-
safe_revision:
|
109
|
+
reviewed_by: ollietulloch
|
110
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
101
111
|
lib/ndr_support/ourtime.rb:
|
102
112
|
comments:
|
103
|
-
reviewed_by:
|
104
|
-
safe_revision:
|
113
|
+
reviewed_by: ollietulloch
|
114
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
105
115
|
lib/ndr_support/password.rb:
|
106
116
|
comments: with input from brian.shand
|
107
117
|
reviewed_by: josh.pencheon
|
@@ -120,64 +130,68 @@ file safety:
|
|
120
130
|
safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
|
121
131
|
lib/ndr_support/safe_path.rb:
|
122
132
|
comments:
|
123
|
-
reviewed_by:
|
124
|
-
safe_revision:
|
133
|
+
reviewed_by: ollietulloch
|
134
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
125
135
|
lib/ndr_support/string/cleaning.rb:
|
126
136
|
comments:
|
127
|
-
reviewed_by:
|
128
|
-
safe_revision:
|
137
|
+
reviewed_by: brianshand
|
138
|
+
safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
|
129
139
|
lib/ndr_support/string/conversions.rb:
|
130
140
|
comments:
|
131
|
-
reviewed_by:
|
132
|
-
safe_revision:
|
141
|
+
reviewed_by: ollietulloch
|
142
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
133
143
|
lib/ndr_support/tasks.rb:
|
134
144
|
comments:
|
135
145
|
reviewed_by: timgentry
|
136
146
|
safe_revision: 62337584a32e5c30c2e9af7cd998a9df684885cc
|
137
147
|
lib/ndr_support/threat_scanner.rb:
|
138
148
|
comments:
|
139
|
-
reviewed_by:
|
140
|
-
safe_revision:
|
149
|
+
reviewed_by: brianshand
|
150
|
+
safe_revision: befa1d4f27448d5be4e133f442c2b5fbac7d8f25
|
141
151
|
lib/ndr_support/utf8_encoding.rb:
|
142
152
|
comments:
|
143
153
|
reviewed_by: josh.pencheon
|
144
154
|
safe_revision: 8e024a4bacfd36e172aad4b800f1960faae0b4b6
|
145
155
|
lib/ndr_support/utf8_encoding/control_characters.rb:
|
146
156
|
comments:
|
147
|
-
reviewed_by:
|
148
|
-
safe_revision:
|
157
|
+
reviewed_by: ollietulloch
|
158
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
149
159
|
lib/ndr_support/utf8_encoding/force_binary.rb:
|
150
160
|
comments:
|
151
|
-
reviewed_by:
|
152
|
-
safe_revision:
|
161
|
+
reviewed_by: ollietulloch
|
162
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
153
163
|
lib/ndr_support/utf8_encoding/object_support.rb:
|
154
164
|
comments:
|
155
|
-
reviewed_by:
|
156
|
-
safe_revision:
|
165
|
+
reviewed_by: ollietulloch
|
166
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
157
167
|
lib/ndr_support/version.rb:
|
168
|
+
comments:
|
169
|
+
reviewed_by: ollietulloch
|
170
|
+
safe_revision: b0dc20ab24516ac5c3ecb6c7078b56a20dd2fbd5
|
171
|
+
lib/ndr_support/working_days.rb:
|
158
172
|
comments:
|
159
173
|
reviewed_by: josh.pencheon
|
160
|
-
safe_revision:
|
174
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
161
175
|
lib/ndr_support/yaml/serialization_migration.rb:
|
162
176
|
comments:
|
163
177
|
reviewed_by: timgentry
|
164
178
|
safe_revision: 29595e6431587ff9b7db6e3ad3abbb3577bff99c
|
165
179
|
ndr_support.gemspec:
|
166
180
|
comments:
|
167
|
-
reviewed_by:
|
168
|
-
safe_revision:
|
181
|
+
reviewed_by: ollietulloch
|
182
|
+
safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
|
169
183
|
test/array_test.rb:
|
170
184
|
comments:
|
171
185
|
reviewed_by: timgentry
|
172
186
|
safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
|
173
187
|
test/concerns/working_days_test.rb:
|
174
188
|
comments:
|
175
|
-
reviewed_by:
|
176
|
-
safe_revision:
|
189
|
+
reviewed_by: josh.pencheon
|
190
|
+
safe_revision: fe6c3beff445e3c84ed0c89f08e1ab10bfb00587
|
177
191
|
test/daterange_test.rb:
|
178
192
|
comments:
|
179
|
-
reviewed_by:
|
180
|
-
safe_revision:
|
193
|
+
reviewed_by: ollietulloch
|
194
|
+
safe_revision: 7b9c9525a5d9d319ddec75d5106c85a53f77e3f4
|
181
195
|
test/hash_test.rb:
|
182
196
|
comments:
|
183
197
|
reviewed_by: timgentry
|
@@ -190,6 +204,10 @@ file safety:
|
|
190
204
|
comments:
|
191
205
|
reviewed_by: josh.pencheon
|
192
206
|
safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
|
207
|
+
test/integer/working_days_test.rb:
|
208
|
+
comments:
|
209
|
+
reviewed_by: josh.pencheon
|
210
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
193
211
|
test/nil_test.rb:
|
194
212
|
comments:
|
195
213
|
reviewed_by: timgentry
|
@@ -228,12 +246,12 @@ file safety:
|
|
228
246
|
safe_revision: b562d0c15ff1b1d565522a47e6bae47ea09706f0
|
229
247
|
test/string/cleaning_test.rb:
|
230
248
|
comments:
|
231
|
-
reviewed_by:
|
232
|
-
safe_revision:
|
249
|
+
reviewed_by: brianshand
|
250
|
+
safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
|
233
251
|
test/string/conversions_test.rb:
|
234
252
|
comments:
|
235
|
-
reviewed_by:
|
236
|
-
safe_revision:
|
253
|
+
reviewed_by: ollietulloch
|
254
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
237
255
|
test/test_helper.rb:
|
238
256
|
comments:
|
239
257
|
reviewed_by: josh.pencheon
|
@@ -3,6 +3,8 @@ require 'active_support/time'
|
|
3
3
|
# This module contains logic for #working_days_until, #weekday?, and #public_holiday?.
|
4
4
|
module WorkingDays
|
5
5
|
WEEK_DAYS = 1..5
|
6
|
+
|
7
|
+
# TODO: could we use https://github.com/alphagov/gds-api-adapters ?
|
6
8
|
HOLIDAYS = [ # Sourced from https://www.gov.uk/bank-holidays
|
7
9
|
# 2012
|
8
10
|
'2012-01-02', # Monday - New Year's Day (substitute day)
|
@@ -81,11 +83,30 @@ module WorkingDays
|
|
81
83
|
'2020-01-01', # Wednesday - New Year's Day
|
82
84
|
'2020-04-10', # Friday - Good Friday
|
83
85
|
'2020-04-13', # Monday - Easter Monday
|
84
|
-
'2020-05-
|
86
|
+
'2020-05-08', # Friday - Early May bank holiday (moved from Monday)
|
85
87
|
'2020-05-25', # Monday - Spring bank holiday
|
86
88
|
'2020-08-31', # Monday - Summer bank holiday
|
87
89
|
'2020-12-25', # Friday - Christmas Day
|
88
|
-
'2020-12-
|
90
|
+
'2020-12-28', # Monday - Boxing Day (substitute day)
|
91
|
+
# 2021
|
92
|
+
'2021-01-01', # Friday - New Year’s Day
|
93
|
+
'2021-04-02', # Friday - Good Friday
|
94
|
+
'2021-04-05', # Monday - Easter Monday
|
95
|
+
'2021-05-03', # Monday - Early May bank holiday
|
96
|
+
'2021-05-31', # Monday - Spring bank holiday
|
97
|
+
'2021-08-30', # Monday - Summer bank holiday
|
98
|
+
'2021-12-27', # Monday - Christmas Day
|
99
|
+
'2021-12-28', # Tuesday - Boxing Day
|
100
|
+
# 2022
|
101
|
+
'2022-01-03', # Monday - New Year’s Day (substitute day)
|
102
|
+
'2022-04-15', # Friday - Good Friday
|
103
|
+
'2022-04-18', # Monday - Easter Monday
|
104
|
+
'2022-05-02', # Monday - Early May bank holiday
|
105
|
+
'2022-06-02', # Thursday - Spring bank holiday
|
106
|
+
'2022-06-03', # Friday - Platinum Jubilee bank holiday
|
107
|
+
'2022-08-29', # Monday - Summer bank holiday
|
108
|
+
'2022-12-26', # Monday - Boxing Day
|
109
|
+
'2022-12-27', # Tuesday - Christmas Day (substitute day)
|
89
110
|
].map { |str| Date.parse(str) }
|
90
111
|
|
91
112
|
def self.check_lookup
|
@@ -100,7 +121,7 @@ module WorkingDays
|
|
100
121
|
def working_days_until(other)
|
101
122
|
return -other.working_days_until(self) if other < self
|
102
123
|
|
103
|
-
|
124
|
+
count_whole_days_to(other) do |day|
|
104
125
|
day.weekday? && !day.public_holiday?
|
105
126
|
end
|
106
127
|
end
|
@@ -109,7 +130,7 @@ module WorkingDays
|
|
109
130
|
# `other`. Returns negative number if `other` is earlier.
|
110
131
|
def weekdays_until(other)
|
111
132
|
return -other.weekdays_until(self) if other < self
|
112
|
-
|
133
|
+
count_whole_days_to(other, &:weekday?)
|
113
134
|
end
|
114
135
|
|
115
136
|
# Is this a weekday?
|
@@ -124,14 +145,15 @@ module WorkingDays
|
|
124
145
|
|
125
146
|
private
|
126
147
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
next_day = days.last + 1.day
|
131
|
-
next_day <= other ? days.push(next_day) : break
|
132
|
-
end
|
148
|
+
def count_whole_days_to(other, &block)
|
149
|
+
day = self + 1.day
|
150
|
+
count = 0
|
133
151
|
|
134
|
-
|
152
|
+
while day <= other
|
153
|
+
count += 1 if block.call(day)
|
154
|
+
day += 1.day
|
135
155
|
end
|
156
|
+
|
157
|
+
count
|
136
158
|
end
|
137
159
|
end
|
@@ -6,7 +6,10 @@ require 'ndr_support/integer/julian_date_conversions'
|
|
6
6
|
class Daterange
|
7
7
|
attr_reader :date1, :date2, :source
|
8
8
|
|
9
|
-
OKYEARS = 1880..
|
9
|
+
OKYEARS = 1880..2030
|
10
|
+
|
11
|
+
# Raised when dates are not supplied in the correct order if do_not_flip_dates is passed as true:
|
12
|
+
class WrongDateOrderError < StandardError; end
|
10
13
|
|
11
14
|
def self.extract(dates_string)
|
12
15
|
dates_string.to_s.split(',').map { |str| new(str) }
|
@@ -17,15 +20,15 @@ class Daterange
|
|
17
20
|
new(ranges.map(&:date1).compact.min, ranges.map(&:date2).compact.max)
|
18
21
|
end
|
19
22
|
|
20
|
-
def initialize(x1 = nil, x2 = nil)
|
23
|
+
def initialize(x1 = nil, x2 = nil, do_not_sort_dates: false)
|
21
24
|
x1 = x1.to_datetime if x1.is_a?(Date) || x1.is_a?(Time)
|
22
25
|
x2 = x2.to_datetime if x2.is_a?(Date) || x2.is_a?(Time)
|
23
26
|
|
24
27
|
if x1.is_a?(DateTime) && x2.is_a?(DateTime)
|
25
|
-
@date1 = [x1, x2].min
|
26
|
-
@date2 = [x1, x2].max
|
28
|
+
@date1 = do_not_sort_dates ? x1 : [x1, x2].min
|
29
|
+
@date2 = do_not_sort_dates ? x2 : [x1, x2].max
|
27
30
|
@source = nil
|
28
|
-
elsif x1.is_a?(Daterange) && x2.nil?
|
31
|
+
elsif x1.is_a?(Daterange) && x2.nil? # Patient model line 645
|
29
32
|
@date1 = x1.date1
|
30
33
|
@date2 = x1.date2
|
31
34
|
@source = x1.source
|
@@ -34,12 +37,14 @@ class Daterange
|
|
34
37
|
@date2 = x1
|
35
38
|
@source = nil
|
36
39
|
elsif x1.is_a?(String) && x2.nil?
|
37
|
-
self.source
|
40
|
+
self.send(:source=, x1, do_not_sort_dates)
|
38
41
|
else
|
39
42
|
@date1 = nil
|
40
43
|
@date2 = nil
|
41
44
|
@source = nil
|
42
45
|
end
|
46
|
+
raise WrongDateOrderError, 'Invalid date range order' if do_not_sort_dates && @date1 > @date2
|
47
|
+
|
43
48
|
self.freeze
|
44
49
|
end
|
45
50
|
|
@@ -135,24 +140,25 @@ class Daterange
|
|
135
140
|
|
136
141
|
# Update our attribute values using a string representation of the date(s).
|
137
142
|
# +s+ consists of one or more dates separated with spaces.
|
138
|
-
# Each date can be in various formats, e.g. d/m/yyyy, ddmmyyyy, yyyy-mm-dd
|
139
|
-
# Each date can omit days or months, e.g. yyyy, dd/yyyy, yyyy-mm
|
140
|
-
def source=(s)
|
143
|
+
# Each date can be in various formats, e.g. d/m/yyyy, ddmmyyyy, yyyy-mm-dd, dd-mon-yyyy
|
144
|
+
# Each date can omit days or months, e.g. yyyy, dd/yyyy, yyyy-mm, mon-yyyy
|
145
|
+
def source=(s, do_not_sort_dates)
|
141
146
|
@source = s
|
142
147
|
ss = s.upcase.sub(/TO/, ' ') # accept default _to_s format
|
143
|
-
if ss =~
|
148
|
+
if ss =~ %r{[^A-Z0-9\-/\. ]}i # only allow letters, digits, hyphen, slash, dot, space
|
144
149
|
@date1 = @date2 = nil
|
145
150
|
else
|
146
151
|
da = [] # temporary array of arrays of dates
|
147
|
-
ss.split
|
152
|
+
ss.split.each do |vaguedate|
|
148
153
|
da << str_to_date_array(vaguedate)
|
149
154
|
end
|
150
155
|
da.flatten!
|
151
156
|
if da.include?(nil)
|
152
|
-
@date1 = @date2 =
|
157
|
+
@date1 = @date2 = nil
|
153
158
|
else
|
154
|
-
da.sort!
|
155
|
-
@date1
|
159
|
+
da.sort! unless do_not_sort_dates
|
160
|
+
@date1 = da.first
|
161
|
+
@date2 = da.last
|
156
162
|
end
|
157
163
|
end
|
158
164
|
end
|
@@ -184,7 +190,9 @@ class Daterange
|
|
184
190
|
# e.g year only or year/month only) and return an array of 1..3 integers
|
185
191
|
# representing the year, month and day
|
186
192
|
def date_string_parts(ds)
|
187
|
-
if ds =~
|
193
|
+
if ds =~ /\A(\d{1,2}[\/\.\-])?\w{3}[\/\.\-]\d{4}\z/i # dd[-/.]mon[-/.]yyyy or mon[-/.]yyyy
|
194
|
+
result = handle_three_char_months(ds)
|
195
|
+
elsif ds =~ /([\/\.\-])/ # find a slash or dot or hyphen
|
188
196
|
delimiter = $1
|
189
197
|
result = ds.split(delimiter)
|
190
198
|
elsif ds.length == 8 # ddmmyyyy
|
@@ -200,4 +208,21 @@ class Daterange
|
|
200
208
|
result.reverse! unless delimiter == '-' # change to YMD if not ISO format
|
201
209
|
result.collect(&:to_i)
|
202
210
|
end
|
211
|
+
|
212
|
+
def handle_three_char_months(datestring)
|
213
|
+
delimiter = datestring.match(%r{[\/\.\-]})[0]
|
214
|
+
components = datestring.split(delimiter)
|
215
|
+
|
216
|
+
if datestring =~ /\A\d{1,2}#{delimiter}\w{3}#{delimiter}\d{4}\z/i
|
217
|
+
month = abbreviated_month_index_for(components[1])
|
218
|
+
month.nil? ? [] : [components.first, month, components.last]
|
219
|
+
elsif datestring =~ /\A\w{3}#{delimiter}\d{4}\z/i
|
220
|
+
month = abbreviated_month_index_for(components.first)
|
221
|
+
month.nil? ? [] : [month, components.last]
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def abbreviated_month_index_for(string)
|
226
|
+
Date::ABBR_MONTHNAMES.index(string.capitalize)
|
227
|
+
end
|
203
228
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Mixin for working_days
|
2
|
+
class Integer
|
3
|
+
# Returns a date of the number of working days since a given date
|
4
|
+
def working_days_since(date)
|
5
|
+
times do
|
6
|
+
date = date.next
|
7
|
+
date = date.next while date.public_holiday? || !date.weekday?
|
8
|
+
end
|
9
|
+
date
|
10
|
+
end
|
11
|
+
end
|
data/lib/ndr_support/ourdate.rb
CHANGED
@@ -31,6 +31,8 @@ class Ourdate
|
|
31
31
|
# with strings arguments only after the 1970 epoch; before, it returns nil.
|
32
32
|
#++
|
33
33
|
def self.build_datetime(year, month = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0)
|
34
|
+
return nil if year.nil?
|
35
|
+
|
34
36
|
if ActiveRecord::Base.default_timezone == :local
|
35
37
|
# Time.local_time(year, month, day, hour, min, sec, usec).to_datetime
|
36
38
|
# Behave like oracle_adapter.rb
|
@@ -72,8 +74,8 @@ class Ourdate
|
|
72
74
|
end
|
73
75
|
|
74
76
|
def empty?
|
75
|
-
# An unspecified date will be empty. A valid
|
76
|
-
@thedate.nil?
|
77
|
+
# An unspecified date will be empty. A valid date will not.
|
78
|
+
@thedate.nil?
|
77
79
|
end
|
78
80
|
|
79
81
|
def source=(s)
|
data/lib/ndr_support/ourtime.rb
CHANGED
@@ -84,8 +84,7 @@ class String
|
|
84
84
|
|
85
85
|
# Try to convert the string value into a date.
|
86
86
|
# If given a pattern, use it to parse date, otherwise use default setting to parse it
|
87
|
-
|
88
|
-
return '' if empty? # TODO: check if this is used... :/
|
87
|
+
redefine_method :to_date do |pattern = nil|
|
89
88
|
return nil if blank?
|
90
89
|
|
91
90
|
pattern = '%d%m%Y' if 'ddmmyyyy' == pattern
|
@@ -118,7 +117,7 @@ class String
|
|
118
117
|
year += 100 if year <= Ourdate.today.year % 100
|
119
118
|
year += 1900
|
120
119
|
elsif 9 == length && self =~ /\A\d{2}[^A-Z0-9][A-Z]{3}[^A-Z0-9]\d{2}\z/i
|
121
|
-
# dd/
|
120
|
+
# dd/mon/yy, rare case.
|
122
121
|
year += 100 if year <= Ourdate.today.year % 100
|
123
122
|
year += 1900
|
124
123
|
end
|
data/lib/ndr_support/version.rb
CHANGED
data/ndr_support.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path('
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
require 'ndr_support/version'
|
4
4
|
|
@@ -13,9 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.license = 'MIT'
|
14
14
|
|
15
15
|
# Exclude older versions of this gem from the package.
|
16
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |s| s =~
|
17
|
-
# SECURE BNS 2018-08-06: Minimise sharing of (public-key encrypted) slack secrets in .travis.yml
|
18
|
-
spec.files -= %w[.travis.yml] # Not needed in the gem
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |s| s =~ %r{^(\.github|pkg/)} }
|
19
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
19
|
spec.require_paths = ['lib']
|
@@ -24,15 +22,15 @@ Gem::Specification.new do |spec|
|
|
24
22
|
spec.add_dependency 'activesupport', '>= 5.2.0', '< 7'
|
25
23
|
|
26
24
|
spec.add_development_dependency 'bundler'
|
27
|
-
spec.add_development_dependency 'rake', '
|
25
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
28
26
|
|
29
|
-
spec.required_ruby_version = '>= 2.
|
27
|
+
spec.required_ruby_version = '>= 2.6.0'
|
30
28
|
|
31
29
|
# Avoid std-lib minitest (which has different namespace)
|
32
30
|
spec.add_development_dependency 'minitest', '>= 5.0.0'
|
33
31
|
spec.add_development_dependency 'mocha', '~> 1.1'
|
34
32
|
|
35
|
-
spec.add_development_dependency 'ndr_dev_support', '~>
|
33
|
+
spec.add_development_dependency 'ndr_dev_support', '~> 5.4', '>= 5.4.5'
|
36
34
|
spec.add_development_dependency 'guard'
|
37
35
|
spec.add_development_dependency 'listen', '< 3.1' # Bundle 1.12 should be (but isn't) resolving Ruby 2.1 issue
|
38
36
|
spec.add_development_dependency 'guard-rubocop'
|
@@ -119,4 +119,22 @@ class WorkingDaysTest < Minitest::Test
|
|
119
119
|
assert_equal 253, @normal_time.working_days_until(@normal_time + 1.year)
|
120
120
|
assert_equal 253, @normal_date_time.working_days_until(@normal_date_time + 1.year)
|
121
121
|
end
|
122
|
+
|
123
|
+
test 'against GOV.UK holidays' do
|
124
|
+
require 'net/http'
|
125
|
+
require 'json'
|
126
|
+
|
127
|
+
url = 'https://www.gov.uk/bank-holidays/england-and-wales.json'
|
128
|
+
response = Net::HTTP.get(URI(url))
|
129
|
+
|
130
|
+
events = JSON.parse(response)['events']
|
131
|
+
events.each do |event|
|
132
|
+
event_date = event['date']
|
133
|
+
parsed_date = Date.parse(event_date)
|
134
|
+
|
135
|
+
assert parsed_date.public_holiday?, "#{event_date} should be a public holiday"
|
136
|
+
# next if parsed_date.public_holiday?
|
137
|
+
# puts "'#{event_date}', # #{parsed_date.strftime('%A')} - #{event['title']}"
|
138
|
+
end
|
139
|
+
end
|
122
140
|
end
|
data/test/daterange_test.rb
CHANGED
@@ -24,19 +24,47 @@ class DaterangeTest < Minitest::Test
|
|
24
24
|
# assert_match(/\d\d\.\d\d\.\d\d\d\d to \d\d.\d\d.\d\d\d\d/, dr.to_s)
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
d =
|
29
|
-
dr = Daterange.new
|
30
|
-
dr2 = Daterange.new
|
27
|
+
def test_date_time_dates_in_reverse_order_with_do_not_sort_dates_false
|
28
|
+
d = Time.zone.today
|
29
|
+
dr = Daterange.new(d, d + 1)
|
30
|
+
dr2 = Daterange.new(d + 1, d)
|
31
31
|
assert_equal(dr.to_s, dr2.to_s)
|
32
32
|
end
|
33
33
|
|
34
|
+
def test_date_time_dates_in_reverse_order_with_do_not_sort_dates_true
|
35
|
+
d = Time.zone.today
|
36
|
+
Daterange.new(d, d + 1, do_not_sort_dates: true)
|
37
|
+
assert_raises(Daterange::WrongDateOrderError) do
|
38
|
+
Daterange.new(d + 1, d, do_not_sort_dates: true)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_string_dates_in_reverse_order_with_do_not_sort_dates_false
|
43
|
+
dr = Daterange.new('01/01/2019 to 01/01/2020')
|
44
|
+
dr2 = Daterange.new('01/01/2020 to 01/01/2019')
|
45
|
+
assert_equal(dr.to_s, dr2.to_s)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_string_dates_in_reverse_order_with_do_not_sort_dates_true
|
49
|
+
Daterange.new('01/01/2019 to 01/01/2020', do_not_sort_dates: true)
|
50
|
+
assert_raises(Daterange::WrongDateOrderError) do
|
51
|
+
Daterange.new('01/01/2020 to 01/01/2019', do_not_sort_dates: true)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
34
55
|
def test_illegal_strings
|
35
56
|
dr = Daterange.new('01/o1/2000')
|
36
57
|
assert_equal '', dr.to_s
|
37
58
|
assert_nil dr.date1
|
38
59
|
assert_nil dr.date2
|
39
|
-
refute dr.empty?
|
60
|
+
refute dr.empty? # Illegal dates do not count as empty / blank,
|
61
|
+
refute_nil dr.source # but the illegal string is preserved
|
62
|
+
|
63
|
+
dr = Daterange.new('01_01_2000')
|
64
|
+
assert_equal '', dr.to_s
|
65
|
+
assert_nil dr.date1
|
66
|
+
assert_nil dr.date2
|
67
|
+
refute dr.empty? # Illegal dates do not count as empty / blank,
|
40
68
|
refute_nil dr.source # but the illegal string is preserved
|
41
69
|
end
|
42
70
|
|
@@ -63,6 +91,12 @@ class DaterangeTest < Minitest::Test
|
|
63
91
|
assert_equal '1880 2020', dr.source
|
64
92
|
end
|
65
93
|
|
94
|
+
def test_year_range_future
|
95
|
+
s = 2.years.from_now.strftime('%Y')
|
96
|
+
dr = Daterange.new(s)
|
97
|
+
assert_equal s, dr.to_s, "Daterange should support future years up to #{s}"
|
98
|
+
end
|
99
|
+
|
66
100
|
def test_hyphen_month_input_style
|
67
101
|
dr = Daterange.new('2000-05')
|
68
102
|
assert_equal '05.2000', dr.to_s
|
@@ -220,4 +254,42 @@ class DaterangeTest < Minitest::Test
|
|
220
254
|
refute_equal dr1, nil
|
221
255
|
refute_equal dr1, 0
|
222
256
|
end
|
257
|
+
|
258
|
+
def test_three_char_months
|
259
|
+
dr1 = Daterange.new('01-APR-2020')
|
260
|
+
assert_equal '01.04.2020', dr1.date1.to_s
|
261
|
+
assert_equal '01.04.2020', dr1.date2.to_s
|
262
|
+
|
263
|
+
dr2 = Daterange.new('APR-2020')
|
264
|
+
assert_equal '01.04.2020', dr2.date1.to_s
|
265
|
+
assert_equal '30.04.2020', dr2.date2.to_s
|
266
|
+
|
267
|
+
dr3 = Daterange.new('JAN-2020 TO apr-2020')
|
268
|
+
assert_equal '01.01.2020', dr3.date1.to_s
|
269
|
+
assert_equal '30.04.2020', dr3.date2.to_s
|
270
|
+
|
271
|
+
dr4 = Daterange.new('20-JAN-2020 TO 12-Apr-2020')
|
272
|
+
assert_equal '20.01.2020', dr4.date1.to_s
|
273
|
+
assert_equal '12.04.2020', dr4.date2.to_s
|
274
|
+
|
275
|
+
dr5 = Daterange.new('01-BOB-2020')
|
276
|
+
assert_nil dr5.date1
|
277
|
+
assert_nil dr5.date2
|
278
|
+
|
279
|
+
dr6 = Daterange.new('01/APR/2020')
|
280
|
+
assert_equal '01.04.2020', dr6.date1.to_s
|
281
|
+
assert_equal '01.04.2020', dr6.date2.to_s
|
282
|
+
|
283
|
+
dr7 = Daterange.new('APR/2020')
|
284
|
+
assert_equal '01.04.2020', dr7.date1.to_s
|
285
|
+
assert_equal '30.04.2020', dr7.date2.to_s
|
286
|
+
|
287
|
+
dr8 = Daterange.new('JAN/2020 TO apr.2020')
|
288
|
+
assert_equal '01.01.2020', dr8.date1.to_s
|
289
|
+
assert_equal '30.04.2020', dr8.date2.to_s
|
290
|
+
|
291
|
+
dr9 = Daterange.new('20.JAN.2020 TO 12/Apr/2020')
|
292
|
+
assert_equal '20.01.2020', dr9.date1.to_s
|
293
|
+
assert_equal '12.04.2020', dr9.date2.to_s
|
294
|
+
end
|
223
295
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# This tests our Integer working days extension
|
4
|
+
class Integer::WorkingDaysTest < Minitest::Test
|
5
|
+
test 'Integer should be extended with #working_days_since' do
|
6
|
+
assert 1.respond_to?(:working_days_since)
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'Integer#working_days_since should behave correctly' do
|
10
|
+
assert_equal Date.new(2019, 12, 23), 1.working_days_since(Date.new(2019, 12, 20))
|
11
|
+
assert_equal Date.new(2019, 12, 27), 3.working_days_since(Date.new(2019, 12, 20))
|
12
|
+
assert_equal Date.new(2019, 12, 30), 4.working_days_since(Date.new(2019, 12, 20))
|
13
|
+
end
|
14
|
+
end
|
@@ -23,6 +23,9 @@ class String
|
|
23
23
|
assert_equal 'AA9 9AA', 'AA9 9AA'.postcodeize(:db)
|
24
24
|
assert_equal 'AA999AA', 'AA99 9AA'.postcodeize(:db)
|
25
25
|
assert_equal 'AA9A9AA', 'AA9A 9AA'.postcodeize(:db)
|
26
|
+
# Old Newport postcodes until end 1984
|
27
|
+
assert_equal 'NPT 1AA' , 'NPT 1AA'.postcodeize(:db)
|
28
|
+
assert_equal 'NPT 1AA' , 'NPT 1AA'.postcodeize(:db)
|
26
29
|
# Examples of legacy postcodes, that should be unchanged
|
27
30
|
assert_equal 'IP222', 'IP222'.postcodeize(:db)
|
28
31
|
assert_equal 'IP222E', 'IP222E'.postcodeize(:db)
|
@@ -244,8 +244,8 @@ class String::ConversionsTest < Minitest::Test
|
|
244
244
|
assert_equal Ourdate.build_datetime(1998, 02, 13), '1998-02-13'.to_date('%Y-%m-%d')
|
245
245
|
assert_equal Ourdate.build_datetime(1998, 05, 03), '1998-05-03'.to_date('%Y-%m-%d')
|
246
246
|
|
247
|
-
|
248
|
-
|
247
|
+
assert_nil ''.to_date('%Y-%m-%d') # Should behave like Rails-defined to_date
|
248
|
+
assert_nil ' '.to_date('%Y-%m-%d')
|
249
249
|
end
|
250
250
|
|
251
251
|
test '%d-%m-%Y string to_date' do
|
@@ -311,7 +311,7 @@ class String::ConversionsTest < Minitest::Test
|
|
311
311
|
assert_equal Ourdate.build_datetime(2008, 05, 03), '03/05/08'.to_date
|
312
312
|
end
|
313
313
|
|
314
|
-
test 'inferred dd/
|
314
|
+
test 'inferred dd/mon/yy string to_date' do
|
315
315
|
# pre_epoch
|
316
316
|
assert_equal Ourdate.build_datetime(1945, 02, 13), '13/FEB/45'.to_date
|
317
317
|
assert_equal Ourdate.build_datetime(1945, 06, 03), '03/JUN/45'.to_date
|
@@ -357,9 +357,9 @@ class String::ConversionsTest < Minitest::Test
|
|
357
357
|
end
|
358
358
|
|
359
359
|
def assert_ymd(ymd, date)
|
360
|
-
assert_equal ymd
|
361
|
-
assert_equal ymd
|
362
|
-
assert_equal ymd
|
360
|
+
assert_equal ymd[0], date.year, 'years were not equal'
|
361
|
+
assert_equal ymd[1], date.month, 'months were not equal'
|
362
|
+
assert_equal ymd[2], date.day, 'days were not equal'
|
363
363
|
end
|
364
364
|
|
365
365
|
def assert_ymd_parsed(ymd, parse_results)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ndr_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NCRS Development Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -68,16 +68,16 @@ dependencies:
|
|
68
68
|
name: rake
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
|
-
- - "
|
71
|
+
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
73
|
+
version: 12.3.3
|
74
74
|
type: :development
|
75
75
|
prerelease: false
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
|
-
- - "
|
78
|
+
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version:
|
80
|
+
version: 12.3.3
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: minitest
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,20 +112,20 @@ dependencies:
|
|
112
112
|
requirements:
|
113
113
|
- - "~>"
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
version: '
|
115
|
+
version: '5.4'
|
116
116
|
- - ">="
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
118
|
+
version: 5.4.5
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version: '
|
125
|
+
version: '5.4'
|
126
126
|
- - ">="
|
127
127
|
- !ruby/object:Gem::Version
|
128
|
-
version:
|
128
|
+
version: 5.4.5
|
129
129
|
- !ruby/object:Gem::Dependency
|
130
130
|
name: guard
|
131
131
|
requirement: !ruby/object:Gem::Requirement
|
@@ -251,6 +251,7 @@ files:
|
|
251
251
|
- lib/ndr_support/integer/calculations.rb
|
252
252
|
- lib/ndr_support/integer/julian_date_conversions.rb
|
253
253
|
- lib/ndr_support/integer/rounding.rb
|
254
|
+
- lib/ndr_support/integer/working_days.rb
|
254
255
|
- lib/ndr_support/nil.rb
|
255
256
|
- lib/ndr_support/obfuscator.rb
|
256
257
|
- lib/ndr_support/ourdate.rb
|
@@ -269,6 +270,7 @@ files:
|
|
269
270
|
- lib/ndr_support/utf8_encoding/force_binary.rb
|
270
271
|
- lib/ndr_support/utf8_encoding/object_support.rb
|
271
272
|
- lib/ndr_support/version.rb
|
273
|
+
- lib/ndr_support/working_days.rb
|
272
274
|
- lib/ndr_support/yaml/serialization_migration.rb
|
273
275
|
- ndr_support.gemspec
|
274
276
|
- test/array_test.rb
|
@@ -277,6 +279,7 @@ files:
|
|
277
279
|
- test/hash_test.rb
|
278
280
|
- test/integer/calculations_test.rb
|
279
281
|
- test/integer/rounding_test.rb
|
282
|
+
- test/integer/working_days_test.rb
|
280
283
|
- test/nil_test.rb
|
281
284
|
- test/obfuscator_test.rb
|
282
285
|
- test/ourdate_test.rb
|
@@ -306,7 +309,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
306
309
|
requirements:
|
307
310
|
- - ">="
|
308
311
|
- !ruby/object:Gem::Version
|
309
|
-
version: 2.
|
312
|
+
version: 2.6.0
|
310
313
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
311
314
|
requirements:
|
312
315
|
- - ">="
|
@@ -324,6 +327,7 @@ test_files:
|
|
324
327
|
- test/hash_test.rb
|
325
328
|
- test/integer/calculations_test.rb
|
326
329
|
- test/integer/rounding_test.rb
|
330
|
+
- test/integer/working_days_test.rb
|
327
331
|
- test/nil_test.rb
|
328
332
|
- test/obfuscator_test.rb
|
329
333
|
- test/ourdate_test.rb
|