ndr_support 5.5.0 → 5.7.1
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 +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