ndr_support 5.5.0 → 5.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/code_safety.yml +44 -40
- data/gemfiles/Gemfile.rails60 +6 -0
- data/lib/ndr_support.rb +2 -0
- data/lib/ndr_support/concerns/working_days.rb +47 -9
- data/lib/ndr_support/date_and_time_extensions.rb +1 -3
- data/lib/ndr_support/daterange.rb +24 -5
- data/lib/ndr_support/integer/working_days.rb +11 -0
- data/lib/ndr_support/string/cleaning.rb +1 -0
- data/lib/ndr_support/string/conversions.rb +3 -4
- data/lib/ndr_support/threat_scanner.rb +1 -0
- data/lib/ndr_support/version.rb +1 -1
- data/lib/ndr_support/working_days.rb +5 -0
- data/ndr_support.gemspec +6 -6
- data/test/concerns/working_days_test.rb +18 -0
- data/test/daterange_test.rb +44 -0
- data/test/integer/working_days_test.rb +14 -0
- data/test/string/cleaning_test.rb +3 -0
- data/test/string/conversions_test.rb +13 -3
- metadata +29 -28
- data/gemfiles/Gemfile.rails42 +0 -6
- data/gemfiles/Gemfile.rails50 +0 -6
- data/gemfiles/Gemfile.rails51 +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e95a05bf2c1dd28e2bfe10716b35e761c5db50ac58947f168585692b588c499
|
4
|
+
data.tar.gz: 49ed22feef4c4a22ea2094883263eaf81d24a497cff6d0977fa23c6889518e77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aaa5b6b7e04962f01738e60815f338c3c54ca38c5862ab5b5a373a9f9628712670d75db1f7bae9e2e2830e6cf511a36b9bc0ec304822352e0e64b94caa375160
|
7
|
+
data.tar.gz: e204589b6cd0951139bea6d2d96d23d4ec0bfe7d0c2be501bdd0ed1668802d4dbb3a7866e73242d004bce25cfc9d8407b934051a3c5afe29b101fe813cee49d5
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,32 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
*no unreleased changes*
|
3
3
|
|
4
|
+
## 5.7.1 / 2021-01-03
|
5
|
+
## Fixed
|
6
|
+
* Postcodeize old Newport postcodes
|
7
|
+
* Bump rake version
|
8
|
+
* Support 2022 public holidays
|
9
|
+
|
10
|
+
## 5.7.0 / 2020-06-30
|
11
|
+
## Added
|
12
|
+
* Handle three char months in Daterange
|
13
|
+
|
14
|
+
## 5.6.1 / 2020-01-02
|
15
|
+
## Fixed
|
16
|
+
* Fix issue with 2020 public holiday
|
17
|
+
* Support 2021 public holidays
|
18
|
+
* Ensure dateranges up to 2030 are supported
|
19
|
+
|
20
|
+
## 5.6.0 / 2019-08-29
|
21
|
+
### Added
|
22
|
+
* Add `Integer#working_days_since`. (#11)
|
23
|
+
|
24
|
+
## 5.5.1 / 2019-05-15
|
25
|
+
### Fixed
|
26
|
+
* Support Ruby 2.6, Rails 6.0. Minimum Ruby/Rails versions are now 2.5/5.2
|
27
|
+
* Warn when WorkingDays lookup is getting stale
|
28
|
+
* Improved date parsing in `String#to_date`
|
29
|
+
|
4
30
|
## 5.5.0 / 2018-11-16
|
5
31
|
### Added
|
6
32
|
* Add `ThreatScanner` to wrap ClamAV for virus detection (#10)
|
data/code_safety.yml
CHANGED
@@ -12,12 +12,12 @@ file safety:
|
|
12
12
|
comments: 'diff failed; reviewed whole file. Revision c88f5ac8c12fd657bb142144e0d3afaa7f9bc361:
|
13
13
|
Slack notification secret is public/private key encrypted, so not a disclosure
|
14
14
|
risk. As a secondary protection, it''s excluded from the .gem file by ndr_support.gemspec'
|
15
|
-
reviewed_by:
|
16
|
-
safe_revision:
|
15
|
+
reviewed_by: josh.pencheon
|
16
|
+
safe_revision: 0cfcfac5ddcd721a67dcd23f04cbf6bc2278b922
|
17
17
|
CHANGELOG.md:
|
18
18
|
comments:
|
19
|
-
reviewed_by:
|
20
|
-
safe_revision:
|
19
|
+
reviewed_by: brian.shand
|
20
|
+
safe_revision: f7cfb534917c991a6e1811f1eb4cff2083c141d2
|
21
21
|
CODE_OF_CONDUCT.md:
|
22
22
|
comments:
|
23
23
|
reviewed_by: timgentry
|
@@ -42,42 +42,34 @@ file safety:
|
|
42
42
|
comments:
|
43
43
|
reviewed_by: timgentry
|
44
44
|
safe_revision: e33e9dae7f38bc449ce9276515a539836dbbbd53
|
45
|
-
gemfiles/Gemfile.rails42:
|
46
|
-
comments:
|
47
|
-
reviewed_by: pauleves
|
48
|
-
safe_revision: f76ad0fe72d42b1ff37553c8194935a8b93a6848
|
49
|
-
gemfiles/Gemfile.rails50:
|
50
|
-
comments:
|
51
|
-
reviewed_by: josh.pencheon
|
52
|
-
safe_revision: 55ed1c2a18b9cc4d1d996ee69419f5ee38f87746
|
53
|
-
gemfiles/Gemfile.rails51:
|
54
|
-
comments:
|
55
|
-
reviewed_by: brian.shand
|
56
|
-
safe_revision: 4e87fd9d64fc0f15b359ba60fc48cda54453c647
|
57
45
|
gemfiles/Gemfile.rails52:
|
58
46
|
comments:
|
59
47
|
reviewed_by: josh.pencheon
|
60
48
|
safe_revision: 8a6bedae77d33d0db1b67eaed7972870b6afc993
|
61
|
-
|
49
|
+
gemfiles/Gemfile.rails60:
|
62
50
|
comments:
|
63
51
|
reviewed_by: josh.pencheon
|
64
|
-
safe_revision:
|
52
|
+
safe_revision: 0cfcfac5ddcd721a67dcd23f04cbf6bc2278b922
|
53
|
+
lib/ndr_support.rb:
|
54
|
+
comments:
|
55
|
+
reviewed_by: brian.shand
|
56
|
+
safe_revision: 44fbdf72f47f4022c7dc9148150ebc18589dac8f
|
65
57
|
lib/ndr_support/array.rb:
|
66
58
|
comments:
|
67
59
|
reviewed_by: pauleves
|
68
60
|
safe_revision: 4a4ed24d2cfe7e1736baadf4cf6e0fece6823be1
|
69
61
|
lib/ndr_support/concerns/working_days.rb:
|
70
62
|
comments:
|
71
|
-
reviewed_by:
|
72
|
-
safe_revision:
|
63
|
+
reviewed_by: brianshand
|
64
|
+
safe_revision: b72baa322dc58820ccd615a178371c2e5dab113c
|
73
65
|
lib/ndr_support/date_and_time_extensions.rb:
|
74
66
|
comments:
|
75
67
|
reviewed_by: josh.pencheon
|
76
|
-
safe_revision:
|
68
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
77
69
|
lib/ndr_support/daterange.rb:
|
78
70
|
comments:
|
79
|
-
reviewed_by:
|
80
|
-
safe_revision:
|
71
|
+
reviewed_by: ollietulloch
|
72
|
+
safe_revision: 9a4b8e53f477725c2c2be5000b3c9e66f07d7389
|
81
73
|
lib/ndr_support/hash.rb:
|
82
74
|
comments:
|
83
75
|
reviewed_by: pauleves
|
@@ -94,6 +86,10 @@ file safety:
|
|
94
86
|
comments:
|
95
87
|
reviewed_by: josh.pencheon
|
96
88
|
safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
|
89
|
+
lib/ndr_support/integer/working_days.rb:
|
90
|
+
comments:
|
91
|
+
reviewed_by: josh.pencheon
|
92
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
97
93
|
lib/ndr_support/nil.rb:
|
98
94
|
comments:
|
99
95
|
reviewed_by: pauleves
|
@@ -132,20 +128,20 @@ file safety:
|
|
132
128
|
safe_revision: 4492da77f6a8b678c40dd571fdd46fd936052cca
|
133
129
|
lib/ndr_support/string/cleaning.rb:
|
134
130
|
comments:
|
135
|
-
reviewed_by:
|
136
|
-
safe_revision:
|
131
|
+
reviewed_by: brianshand
|
132
|
+
safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
|
137
133
|
lib/ndr_support/string/conversions.rb:
|
138
134
|
comments:
|
139
|
-
reviewed_by:
|
140
|
-
safe_revision:
|
135
|
+
reviewed_by: ollietulloch
|
136
|
+
safe_revision: 9a4b8e53f477725c2c2be5000b3c9e66f07d7389
|
141
137
|
lib/ndr_support/tasks.rb:
|
142
138
|
comments:
|
143
139
|
reviewed_by: timgentry
|
144
140
|
safe_revision: 62337584a32e5c30c2e9af7cd998a9df684885cc
|
145
141
|
lib/ndr_support/threat_scanner.rb:
|
146
142
|
comments:
|
147
|
-
reviewed_by:
|
148
|
-
safe_revision:
|
143
|
+
reviewed_by: brianshand
|
144
|
+
safe_revision: befa1d4f27448d5be4e133f442c2b5fbac7d8f25
|
149
145
|
lib/ndr_support/utf8_encoding.rb:
|
150
146
|
comments:
|
151
147
|
reviewed_by: josh.pencheon
|
@@ -163,29 +159,33 @@ file safety:
|
|
163
159
|
reviewed_by: timgentry
|
164
160
|
safe_revision: f7adf44fc2772e1926df37abfd9041d41c303328
|
165
161
|
lib/ndr_support/version.rb:
|
162
|
+
comments:
|
163
|
+
reviewed_by: brian.shand
|
164
|
+
safe_revision: f7cfb534917c991a6e1811f1eb4cff2083c141d2
|
165
|
+
lib/ndr_support/working_days.rb:
|
166
166
|
comments:
|
167
167
|
reviewed_by: josh.pencheon
|
168
|
-
safe_revision:
|
168
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
169
169
|
lib/ndr_support/yaml/serialization_migration.rb:
|
170
170
|
comments:
|
171
171
|
reviewed_by: timgentry
|
172
172
|
safe_revision: 29595e6431587ff9b7db6e3ad3abbb3577bff99c
|
173
173
|
ndr_support.gemspec:
|
174
174
|
comments:
|
175
|
-
reviewed_by:
|
176
|
-
safe_revision:
|
175
|
+
reviewed_by: brianshand
|
176
|
+
safe_revision: befa1d4f27448d5be4e133f442c2b5fbac7d8f25
|
177
177
|
test/array_test.rb:
|
178
178
|
comments:
|
179
179
|
reviewed_by: timgentry
|
180
180
|
safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
|
181
181
|
test/concerns/working_days_test.rb:
|
182
182
|
comments:
|
183
|
-
reviewed_by:
|
184
|
-
safe_revision:
|
183
|
+
reviewed_by: josh.pencheon
|
184
|
+
safe_revision: fe6c3beff445e3c84ed0c89f08e1ab10bfb00587
|
185
185
|
test/daterange_test.rb:
|
186
186
|
comments:
|
187
|
-
reviewed_by:
|
188
|
-
safe_revision:
|
187
|
+
reviewed_by: ollietulloch
|
188
|
+
safe_revision: 9a4b8e53f477725c2c2be5000b3c9e66f07d7389
|
189
189
|
test/hash_test.rb:
|
190
190
|
comments:
|
191
191
|
reviewed_by: timgentry
|
@@ -198,6 +198,10 @@ file safety:
|
|
198
198
|
comments:
|
199
199
|
reviewed_by: josh.pencheon
|
200
200
|
safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
|
201
|
+
test/integer/working_days_test.rb:
|
202
|
+
comments:
|
203
|
+
reviewed_by: josh.pencheon
|
204
|
+
safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
|
201
205
|
test/nil_test.rb:
|
202
206
|
comments:
|
203
207
|
reviewed_by: timgentry
|
@@ -236,12 +240,12 @@ file safety:
|
|
236
240
|
safe_revision: b562d0c15ff1b1d565522a47e6bae47ea09706f0
|
237
241
|
test/string/cleaning_test.rb:
|
238
242
|
comments:
|
239
|
-
reviewed_by:
|
240
|
-
safe_revision:
|
243
|
+
reviewed_by: brianshand
|
244
|
+
safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
|
241
245
|
test/string/conversions_test.rb:
|
242
246
|
comments:
|
243
|
-
reviewed_by:
|
244
|
-
safe_revision:
|
247
|
+
reviewed_by: ollietulloch
|
248
|
+
safe_revision: 9a4b8e53f477725c2c2be5000b3c9e66f07d7389
|
245
249
|
test/test_helper.rb:
|
246
250
|
comments:
|
247
251
|
reviewed_by: josh.pencheon
|
data/lib/ndr_support.rb
CHANGED
@@ -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)
|
@@ -77,14 +79,49 @@ module WorkingDays
|
|
77
79
|
'2019-08-26', # Monday - Summer bank holiday
|
78
80
|
'2019-12-25', # Wednesday - Christmas Day
|
79
81
|
'2019-12-26', # Thursday - Boxing Day
|
82
|
+
# 2020
|
83
|
+
'2020-01-01', # Wednesday - New Year's Day
|
84
|
+
'2020-04-10', # Friday - Good Friday
|
85
|
+
'2020-04-13', # Monday - Easter Monday
|
86
|
+
'2020-05-08', # Friday - Early May bank holiday (moved from Monday)
|
87
|
+
'2020-05-25', # Monday - Spring bank holiday
|
88
|
+
'2020-08-31', # Monday - Summer bank holiday
|
89
|
+
'2020-12-25', # Friday - Christmas Day
|
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)
|
80
110
|
].map { |str| Date.parse(str) }
|
81
111
|
|
112
|
+
def self.check_lookup
|
113
|
+
return true if HOLIDAYS.max >= 1.year.from_now
|
114
|
+
|
115
|
+
warn "NdrSupport's WorkingDays extension has under a year of future data. Check for updates?"
|
116
|
+
false
|
117
|
+
end
|
118
|
+
|
82
119
|
# How many complete working days there are until the given
|
83
120
|
# `other`. Returns negative number if `other` is earlier.
|
84
121
|
def working_days_until(other)
|
85
122
|
return -other.working_days_until(self) if other < self
|
86
123
|
|
87
|
-
|
124
|
+
count_whole_days_to(other) do |day|
|
88
125
|
day.weekday? && !day.public_holiday?
|
89
126
|
end
|
90
127
|
end
|
@@ -93,7 +130,7 @@ module WorkingDays
|
|
93
130
|
# `other`. Returns negative number if `other` is earlier.
|
94
131
|
def weekdays_until(other)
|
95
132
|
return -other.weekdays_until(self) if other < self
|
96
|
-
|
133
|
+
count_whole_days_to(other, &:weekday?)
|
97
134
|
end
|
98
135
|
|
99
136
|
# Is this a weekday?
|
@@ -108,14 +145,15 @@ module WorkingDays
|
|
108
145
|
|
109
146
|
private
|
110
147
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
next_day = days.last + 1.day
|
115
|
-
next_day <= other ? days.push(next_day) : break
|
116
|
-
end
|
148
|
+
def count_whole_days_to(other, &block)
|
149
|
+
day = self + 1.day
|
150
|
+
count = 0
|
117
151
|
|
118
|
-
|
152
|
+
while day <= other
|
153
|
+
count += 1 if block.call(day)
|
154
|
+
day += 1.day
|
119
155
|
end
|
156
|
+
|
157
|
+
count
|
120
158
|
end
|
121
159
|
end
|
@@ -6,7 +6,7 @@ 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
10
|
|
11
11
|
def self.extract(dates_string)
|
12
12
|
dates_string.to_s.split(',').map { |str| new(str) }
|
@@ -135,12 +135,12 @@ class Daterange
|
|
135
135
|
|
136
136
|
# Update our attribute values using a string representation of the date(s).
|
137
137
|
# +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
|
138
|
+
# Each date can be in various formats, e.g. d/m/yyyy, ddmmyyyy, yyyy-mm-dd, dd-mon-yyyy
|
139
|
+
# Each date can omit days or months, e.g. yyyy, dd/yyyy, yyyy-mm, mon-yyyy
|
140
140
|
def source=(s)
|
141
141
|
@source = s
|
142
142
|
ss = s.upcase.sub(/TO/, ' ') # accept default _to_s format
|
143
|
-
if ss =~ /[
|
143
|
+
if ss =~ /[^\w0-9\-\/\. ]/i # only allow letters, digits, hyphen, slash, dot, space
|
144
144
|
@date1 = @date2 = nil
|
145
145
|
else
|
146
146
|
da = [] # temporary array of arrays of dates
|
@@ -184,7 +184,9 @@ class Daterange
|
|
184
184
|
# e.g year only or year/month only) and return an array of 1..3 integers
|
185
185
|
# representing the year, month and day
|
186
186
|
def date_string_parts(ds)
|
187
|
-
if ds =~
|
187
|
+
if ds =~ /\A(\d{1,2}[\/\.\-])?\w{3}[\/\.\-]\d{4}\z/i # dd[-/.]mon[-/.]yyyy or mon[-/.]yyyy
|
188
|
+
result = handle_three_char_months(ds)
|
189
|
+
elsif ds =~ /([\/\.\-])/ # find a slash or dot or hyphen
|
188
190
|
delimiter = $1
|
189
191
|
result = ds.split(delimiter)
|
190
192
|
elsif ds.length == 8 # ddmmyyyy
|
@@ -200,4 +202,21 @@ class Daterange
|
|
200
202
|
result.reverse! unless delimiter == '-' # change to YMD if not ISO format
|
201
203
|
result.collect(&:to_i)
|
202
204
|
end
|
205
|
+
|
206
|
+
def handle_three_char_months(datestring)
|
207
|
+
delimiter = datestring.match(%r{[\/\.\-]})[0]
|
208
|
+
components = datestring.split(delimiter)
|
209
|
+
|
210
|
+
if datestring =~ /\A\d{1,2}#{delimiter}\w{3}#{delimiter}\d{4}\z/i
|
211
|
+
month = abbreviated_month_index_for(components[1])
|
212
|
+
month.nil? ? [] : [components.first, month, components.last]
|
213
|
+
elsif datestring =~ /\A\w{3}#{delimiter}\d{4}\z/i
|
214
|
+
month = abbreviated_month_index_for(components.first)
|
215
|
+
month.nil? ? [] : [month, components.last]
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def abbreviated_month_index_for(string)
|
220
|
+
Date::ABBR_MONTHNAMES.index(string.capitalize)
|
221
|
+
end
|
203
222
|
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
|
@@ -85,7 +85,6 @@ class String
|
|
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
87
|
def to_date(pattern = nil)
|
88
|
-
return '' if empty? # TODO: check if this is used... :/
|
89
88
|
return nil if blank?
|
90
89
|
|
91
90
|
pattern = '%d%m%Y' if 'ddmmyyyy' == pattern
|
@@ -112,13 +111,13 @@ class String
|
|
112
111
|
|
113
112
|
if ['yyyy/dd/mm', 'mm/dd/yyyy'].include?(pattern)
|
114
113
|
month, day = day, month
|
115
|
-
elsif 8 == length && self
|
114
|
+
elsif 8 == length && self =~ /\A\d{2}[^A-Z0-9]\d{2}[^A-Z0-9]\d{2}\z/i
|
116
115
|
# dd/mm/yy, rather than yyyymmdd
|
117
116
|
year, day = day, year
|
118
117
|
year += 100 if year <= Ourdate.today.year % 100
|
119
118
|
year += 1900
|
120
|
-
elsif 9 == length
|
121
|
-
# dd/
|
119
|
+
elsif 9 == length && self =~ /\A\d{2}[^A-Z0-9][A-Z]{3}[^A-Z0-9]\d{2}\z/i
|
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
@@ -20,19 +20,19 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
-
spec.add_dependency 'activerecord', '>=
|
24
|
-
spec.add_dependency 'activesupport', '>=
|
23
|
+
spec.add_dependency 'activerecord', '>= 5.2.0', '< 7'
|
24
|
+
spec.add_dependency 'activesupport', '>= 5.2.0', '< 7'
|
25
25
|
|
26
|
-
spec.add_development_dependency 'bundler'
|
27
|
-
spec.add_development_dependency 'rake', '
|
26
|
+
spec.add_development_dependency 'bundler'
|
27
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
28
28
|
|
29
|
-
spec.required_ruby_version = '>= 2.
|
29
|
+
spec.required_ruby_version = '>= 2.5.0'
|
30
30
|
|
31
31
|
# Avoid std-lib minitest (which has different namespace)
|
32
32
|
spec.add_development_dependency 'minitest', '>= 5.0.0'
|
33
33
|
spec.add_development_dependency 'mocha', '~> 1.1'
|
34
34
|
|
35
|
-
spec.add_development_dependency 'ndr_dev_support', '~>
|
35
|
+
spec.add_development_dependency 'ndr_dev_support', '~> 5.4', '>= 5.4.5'
|
36
36
|
spec.add_development_dependency 'guard'
|
37
37
|
spec.add_development_dependency 'listen', '< 3.1' # Bundle 1.12 should be (but isn't) resolving Ruby 2.1 issue
|
38
38
|
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
@@ -63,6 +63,12 @@ class DaterangeTest < Minitest::Test
|
|
63
63
|
assert_equal '1880 2020', dr.source
|
64
64
|
end
|
65
65
|
|
66
|
+
def test_year_range_future
|
67
|
+
s = 2.years.from_now.strftime('%Y')
|
68
|
+
dr = Daterange.new(s)
|
69
|
+
assert_equal s, dr.to_s, "Daterange should support future years up to #{s}"
|
70
|
+
end
|
71
|
+
|
66
72
|
def test_hyphen_month_input_style
|
67
73
|
dr = Daterange.new('2000-05')
|
68
74
|
assert_equal '05.2000', dr.to_s
|
@@ -220,4 +226,42 @@ class DaterangeTest < Minitest::Test
|
|
220
226
|
refute_equal dr1, nil
|
221
227
|
refute_equal dr1, 0
|
222
228
|
end
|
229
|
+
|
230
|
+
def test_three_char_months
|
231
|
+
dr1 = Daterange.new('01-APR-2020')
|
232
|
+
assert_equal '01.04.2020', dr1.date1.to_s
|
233
|
+
assert_equal '01.04.2020', dr1.date2.to_s
|
234
|
+
|
235
|
+
dr2 = Daterange.new('APR-2020')
|
236
|
+
assert_equal '01.04.2020', dr2.date1.to_s
|
237
|
+
assert_equal '30.04.2020', dr2.date2.to_s
|
238
|
+
|
239
|
+
dr3 = Daterange.new('JAN-2020 TO apr-2020')
|
240
|
+
assert_equal '01.01.2020', dr3.date1.to_s
|
241
|
+
assert_equal '30.04.2020', dr3.date2.to_s
|
242
|
+
|
243
|
+
dr4 = Daterange.new('20-JAN-2020 TO 12-Apr-2020')
|
244
|
+
assert_equal '20.01.2020', dr4.date1.to_s
|
245
|
+
assert_equal '12.04.2020', dr4.date2.to_s
|
246
|
+
|
247
|
+
dr5 = Daterange.new('01-BOB-2020')
|
248
|
+
assert_nil dr5.date1
|
249
|
+
assert_nil dr5.date2
|
250
|
+
|
251
|
+
dr6 = Daterange.new('01/APR/2020')
|
252
|
+
assert_equal '01.04.2020', dr6.date1.to_s
|
253
|
+
assert_equal '01.04.2020', dr6.date2.to_s
|
254
|
+
|
255
|
+
dr7 = Daterange.new('APR/2020')
|
256
|
+
assert_equal '01.04.2020', dr7.date1.to_s
|
257
|
+
assert_equal '30.04.2020', dr7.date2.to_s
|
258
|
+
|
259
|
+
dr8 = Daterange.new('JAN/2020 TO apr.2020')
|
260
|
+
assert_equal '01.01.2020', dr8.date1.to_s
|
261
|
+
assert_equal '30.04.2020', dr8.date2.to_s
|
262
|
+
|
263
|
+
dr9 = Daterange.new('20.JAN.2020 TO 12/Apr/2020')
|
264
|
+
assert_equal '20.01.2020', dr9.date1.to_s
|
265
|
+
assert_equal '12.04.2020', dr9.date2.to_s
|
266
|
+
end
|
223
267
|
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)
|
@@ -58,6 +58,10 @@ class String::ConversionsTest < Minitest::Test
|
|
58
58
|
assert_ymd [2001, 3, 2], '02/03/2001'.to_date
|
59
59
|
assert_ymd [2010, 7, 11], '2010-07-11'.to_date
|
60
60
|
|
61
|
+
assert_ymd [2001, 3, 2], '2.3.2001'.to_date
|
62
|
+
assert_ymd [2001, 3, 2], '2/3/2001'.to_date
|
63
|
+
assert_ymd [2010, 7, 11], '2010-7-11'.to_date
|
64
|
+
|
61
65
|
assert_ymd [2001, 2, 3], '2001/02/03'.to_date('yyyy/mm/dd')
|
62
66
|
assert_ymd [2001, 2, 3], '2001/03/02'.to_date('yyyy/dd/mm')
|
63
67
|
assert_ymd [2001, 2, 3], '2001-02-03'.to_date('yyyy-mm-dd')
|
@@ -240,8 +244,8 @@ class String::ConversionsTest < Minitest::Test
|
|
240
244
|
assert_equal Ourdate.build_datetime(1998, 02, 13), '1998-02-13'.to_date('%Y-%m-%d')
|
241
245
|
assert_equal Ourdate.build_datetime(1998, 05, 03), '1998-05-03'.to_date('%Y-%m-%d')
|
242
246
|
|
243
|
-
|
244
|
-
|
247
|
+
assert_nil ''.to_date('%Y-%m-%d') # Should behave like Rails-defined to_date
|
248
|
+
assert_nil ' '.to_date('%Y-%m-%d')
|
245
249
|
end
|
246
250
|
|
247
251
|
test '%d-%m-%Y string to_date' do
|
@@ -307,7 +311,7 @@ class String::ConversionsTest < Minitest::Test
|
|
307
311
|
assert_equal Ourdate.build_datetime(2008, 05, 03), '03/05/08'.to_date
|
308
312
|
end
|
309
313
|
|
310
|
-
test 'inferred dd/
|
314
|
+
test 'inferred dd/mon/yy string to_date' do
|
311
315
|
# pre_epoch
|
312
316
|
assert_equal Ourdate.build_datetime(1945, 02, 13), '13/FEB/45'.to_date
|
313
317
|
assert_equal Ourdate.build_datetime(1945, 06, 03), '03/JUN/45'.to_date
|
@@ -334,6 +338,12 @@ class String::ConversionsTest < Minitest::Test
|
|
334
338
|
assert_equal Ourdate.build_datetime(2008, 05, 03), '03/05/2008 13:38'.to_date
|
335
339
|
end
|
336
340
|
|
341
|
+
test 'incorrectly formatted string to_date' do
|
342
|
+
assert_nil '10-1975'.to_date
|
343
|
+
assert_nil '10.1975A'.to_date
|
344
|
+
assert_nil '10.1975AA'.to_date
|
345
|
+
end
|
346
|
+
|
337
347
|
test 'to_boolean' do
|
338
348
|
assert_equal true, 'true'.to_boolean
|
339
349
|
assert_equal true, 'yes'.to_boolean
|
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.7.1
|
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-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,68 +16,68 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 5.2.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '7'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 5.2.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '7'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: activesupport
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
39
|
+
version: 5.2.0
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '7'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
49
|
+
version: 5.2.0
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: '
|
52
|
+
version: '7'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: bundler
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- - "
|
57
|
+
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
59
|
+
version: '0'
|
60
60
|
type: :development
|
61
61
|
prerelease: false
|
62
62
|
version_requirements: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
|
-
- - "
|
64
|
+
- - ">="
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
66
|
+
version: '0'
|
67
67
|
- !ruby/object:Gem::Dependency
|
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
|
@@ -240,10 +240,8 @@ files:
|
|
240
240
|
- README.md
|
241
241
|
- Rakefile
|
242
242
|
- code_safety.yml
|
243
|
-
- gemfiles/Gemfile.rails42
|
244
|
-
- gemfiles/Gemfile.rails50
|
245
|
-
- gemfiles/Gemfile.rails51
|
246
243
|
- gemfiles/Gemfile.rails52
|
244
|
+
- gemfiles/Gemfile.rails60
|
247
245
|
- lib/ndr_support.rb
|
248
246
|
- lib/ndr_support/array.rb
|
249
247
|
- lib/ndr_support/concerns/working_days.rb
|
@@ -253,6 +251,7 @@ files:
|
|
253
251
|
- lib/ndr_support/integer/calculations.rb
|
254
252
|
- lib/ndr_support/integer/julian_date_conversions.rb
|
255
253
|
- lib/ndr_support/integer/rounding.rb
|
254
|
+
- lib/ndr_support/integer/working_days.rb
|
256
255
|
- lib/ndr_support/nil.rb
|
257
256
|
- lib/ndr_support/obfuscator.rb
|
258
257
|
- lib/ndr_support/ourdate.rb
|
@@ -271,6 +270,7 @@ files:
|
|
271
270
|
- lib/ndr_support/utf8_encoding/force_binary.rb
|
272
271
|
- lib/ndr_support/utf8_encoding/object_support.rb
|
273
272
|
- lib/ndr_support/version.rb
|
273
|
+
- lib/ndr_support/working_days.rb
|
274
274
|
- lib/ndr_support/yaml/serialization_migration.rb
|
275
275
|
- ndr_support.gemspec
|
276
276
|
- test/array_test.rb
|
@@ -279,6 +279,7 @@ files:
|
|
279
279
|
- test/hash_test.rb
|
280
280
|
- test/integer/calculations_test.rb
|
281
281
|
- test/integer/rounding_test.rb
|
282
|
+
- test/integer/working_days_test.rb
|
282
283
|
- test/nil_test.rb
|
283
284
|
- test/obfuscator_test.rb
|
284
285
|
- test/ourdate_test.rb
|
@@ -308,15 +309,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
308
309
|
requirements:
|
309
310
|
- - ">="
|
310
311
|
- !ruby/object:Gem::Version
|
311
|
-
version: 2.
|
312
|
+
version: 2.5.0
|
312
313
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
313
314
|
requirements:
|
314
315
|
- - ">="
|
315
316
|
- !ruby/object:Gem::Version
|
316
317
|
version: '0'
|
317
318
|
requirements: []
|
318
|
-
|
319
|
-
rubygems_version: 2.7.6
|
319
|
+
rubygems_version: 3.0.3
|
320
320
|
signing_key:
|
321
321
|
specification_version: 4
|
322
322
|
summary: NDR Support library
|
@@ -327,6 +327,7 @@ test_files:
|
|
327
327
|
- test/hash_test.rb
|
328
328
|
- test/integer/calculations_test.rb
|
329
329
|
- test/integer/rounding_test.rb
|
330
|
+
- test/integer/working_days_test.rb
|
330
331
|
- test/nil_test.rb
|
331
332
|
- test/obfuscator_test.rb
|
332
333
|
- test/ourdate_test.rb
|
data/gemfiles/Gemfile.rails42
DELETED
data/gemfiles/Gemfile.rails50
DELETED