ndr_support 5.6.1 → 5.8.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 +23 -0
- data/README.md +1 -1
- data/code_safety.yml +52 -46
- data/lib/ndr_support/concerns/working_days.rb +10 -0
- data/lib/ndr_support/daterange.rb +39 -14
- data/lib/ndr_support/integer/julian_date_conversions.rb +0 -2
- 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 -2
- 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/ndr_support.gemspec +4 -6
- data/test/daterange_test.rb +71 -5
- data/test/string/cleaning_test.rb +3 -0
- data/test/string/conversions_test.rb +4 -4
- data/test/threat_scanner_test.rb +2 -0
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 462829abf36ac966363473bfcbe8916ab485af8473fd2653cc506092d367948f
|
4
|
+
data.tar.gz: 8120ba92a97ec0958f74c97c720b4bf885f3b1a211ff529412065996db56c23b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b58fcc435bfac08ff05d7234ba2752c5e43f2d07c0bf2f46a12ea94247ba5b5eb71c4a9d7d0c1ac567fcc87cdf84809919002234ea9852179c952740d2dac2d2
|
7
|
+
data.tar.gz: 8a505f48fbf895c63eca3d3f43a54eaefdd3111a0294fb9430f0960aa57f6e2bde82fdbacf1601e6126a17469e40549fc516284288de2ce1e2601e3c356b1a52
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,29 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
*no unreleased changes*
|
3
3
|
|
4
|
+
## 5.8.1 / 2021-10-11
|
5
|
+
### Patched
|
6
|
+
* Added fix for failing threat scanner tests (#22)
|
7
|
+
|
8
|
+
## 5.8.0 / 2021-04-19
|
9
|
+
## Added
|
10
|
+
|
11
|
+
* Add ability to disable date reversing in Daterange
|
12
|
+
|
13
|
+
## Fixed
|
14
|
+
* Support Ruby 2.6-3.0.
|
15
|
+
* Fix ruby warnings
|
16
|
+
|
17
|
+
## 5.7.1 / 2021-01-03
|
18
|
+
## Fixed
|
19
|
+
* Postcodeize old Newport postcodes
|
20
|
+
* Bump rake version
|
21
|
+
* Support 2022 public holidays
|
22
|
+
|
23
|
+
## 5.7.0 / 2020-06-30
|
24
|
+
## Added
|
25
|
+
* Handle three char months in Daterange
|
26
|
+
|
4
27
|
## 5.6.1 / 2020-01-02
|
5
28
|
## Fixed
|
6
29
|
* Fix issue with 2020 public holiday
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# NdrSupport [](https://github.com/publichealthengland/ndr_support/actions?query=workflow%3Atest) [](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: 12f40dced9c3878efa20b938c2de579870ccf925
|
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
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,8 +86,8 @@ 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
|
@@ -100,12 +106,12 @@ file safety:
|
|
100
106
|
safe_revision: 50a4293953f9ae227823c390b069a3ed4825074c
|
101
107
|
lib/ndr_support/ourdate.rb:
|
102
108
|
comments:
|
103
|
-
reviewed_by:
|
104
|
-
safe_revision:
|
109
|
+
reviewed_by: ollietulloch
|
110
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
105
111
|
lib/ndr_support/ourtime.rb:
|
106
112
|
comments:
|
107
|
-
reviewed_by:
|
108
|
-
safe_revision:
|
113
|
+
reviewed_by: ollietulloch
|
114
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
109
115
|
lib/ndr_support/password.rb:
|
110
116
|
comments: with input from brian.shand
|
111
117
|
reviewed_by: josh.pencheon
|
@@ -124,44 +130,44 @@ file safety:
|
|
124
130
|
safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
|
125
131
|
lib/ndr_support/safe_path.rb:
|
126
132
|
comments:
|
127
|
-
reviewed_by:
|
128
|
-
safe_revision:
|
133
|
+
reviewed_by: ollietulloch
|
134
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
129
135
|
lib/ndr_support/string/cleaning.rb:
|
130
136
|
comments:
|
131
|
-
reviewed_by:
|
132
|
-
safe_revision:
|
137
|
+
reviewed_by: brianshand
|
138
|
+
safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
|
133
139
|
lib/ndr_support/string/conversions.rb:
|
134
140
|
comments:
|
135
|
-
reviewed_by:
|
136
|
-
safe_revision:
|
141
|
+
reviewed_by: ollietulloch
|
142
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
137
143
|
lib/ndr_support/tasks.rb:
|
138
144
|
comments:
|
139
145
|
reviewed_by: timgentry
|
140
146
|
safe_revision: 62337584a32e5c30c2e9af7cd998a9df684885cc
|
141
147
|
lib/ndr_support/threat_scanner.rb:
|
142
148
|
comments:
|
143
|
-
reviewed_by:
|
144
|
-
safe_revision:
|
149
|
+
reviewed_by: brianshand
|
150
|
+
safe_revision: befa1d4f27448d5be4e133f442c2b5fbac7d8f25
|
145
151
|
lib/ndr_support/utf8_encoding.rb:
|
146
152
|
comments:
|
147
153
|
reviewed_by: josh.pencheon
|
148
154
|
safe_revision: 8e024a4bacfd36e172aad4b800f1960faae0b4b6
|
149
155
|
lib/ndr_support/utf8_encoding/control_characters.rb:
|
150
156
|
comments:
|
151
|
-
reviewed_by:
|
152
|
-
safe_revision:
|
157
|
+
reviewed_by: ollietulloch
|
158
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
153
159
|
lib/ndr_support/utf8_encoding/force_binary.rb:
|
154
160
|
comments:
|
155
|
-
reviewed_by:
|
156
|
-
safe_revision:
|
161
|
+
reviewed_by: ollietulloch
|
162
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
157
163
|
lib/ndr_support/utf8_encoding/object_support.rb:
|
158
164
|
comments:
|
159
|
-
reviewed_by:
|
160
|
-
safe_revision:
|
165
|
+
reviewed_by: ollietulloch
|
166
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
161
167
|
lib/ndr_support/version.rb:
|
162
168
|
comments:
|
163
|
-
reviewed_by:
|
164
|
-
safe_revision:
|
169
|
+
reviewed_by: ollietulloch
|
170
|
+
safe_revision: 12f40dced9c3878efa20b938c2de579870ccf925
|
165
171
|
lib/ndr_support/working_days.rb:
|
166
172
|
comments:
|
167
173
|
reviewed_by: josh.pencheon
|
@@ -172,8 +178,8 @@ file safety:
|
|
172
178
|
safe_revision: 29595e6431587ff9b7db6e3ad3abbb3577bff99c
|
173
179
|
ndr_support.gemspec:
|
174
180
|
comments:
|
175
|
-
reviewed_by:
|
176
|
-
safe_revision:
|
181
|
+
reviewed_by: ollietulloch
|
182
|
+
safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
|
177
183
|
test/array_test.rb:
|
178
184
|
comments:
|
179
185
|
reviewed_by: timgentry
|
@@ -184,8 +190,8 @@ file safety:
|
|
184
190
|
safe_revision: fe6c3beff445e3c84ed0c89f08e1ab10bfb00587
|
185
191
|
test/daterange_test.rb:
|
186
192
|
comments:
|
187
|
-
reviewed_by:
|
188
|
-
safe_revision:
|
193
|
+
reviewed_by: ollietulloch
|
194
|
+
safe_revision: 7b9c9525a5d9d319ddec75d5106c85a53f77e3f4
|
189
195
|
test/hash_test.rb:
|
190
196
|
comments:
|
191
197
|
reviewed_by: timgentry
|
@@ -240,20 +246,20 @@ file safety:
|
|
240
246
|
safe_revision: b562d0c15ff1b1d565522a47e6bae47ea09706f0
|
241
247
|
test/string/cleaning_test.rb:
|
242
248
|
comments:
|
243
|
-
reviewed_by:
|
244
|
-
safe_revision:
|
249
|
+
reviewed_by: brianshand
|
250
|
+
safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
|
245
251
|
test/string/conversions_test.rb:
|
246
252
|
comments:
|
247
|
-
reviewed_by:
|
248
|
-
safe_revision:
|
253
|
+
reviewed_by: ollietulloch
|
254
|
+
safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
|
249
255
|
test/test_helper.rb:
|
250
256
|
comments:
|
251
257
|
reviewed_by: josh.pencheon
|
252
258
|
safe_revision: 34ae80f2952f0bfd18688541862774cbaaa6c5f5
|
253
259
|
test/threat_scanner_test.rb:
|
254
260
|
comments:
|
255
|
-
reviewed_by:
|
256
|
-
safe_revision:
|
261
|
+
reviewed_by: ollietulloch
|
262
|
+
safe_revision: fbb6ef9804040aa2e38257d9f5c487bde18a490d
|
257
263
|
test/utf8_encoding/control_characters_test.rb:
|
258
264
|
comments:
|
259
265
|
reviewed_by: timgentry
|
@@ -97,6 +97,16 @@ module WorkingDays
|
|
97
97
|
'2021-08-30', # Monday - Summer bank holiday
|
98
98
|
'2021-12-27', # Monday - Christmas Day
|
99
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)
|
100
110
|
].map { |str| Date.parse(str) }
|
101
111
|
|
102
112
|
def self.check_lookup
|
@@ -8,6 +8,9 @@ class Daterange
|
|
8
8
|
|
9
9
|
OKYEARS = 1880..2030
|
10
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
|
13
|
+
|
11
14
|
def self.extract(dates_string)
|
12
15
|
dates_string.to_s.split(',').map { |str| new(str) }
|
13
16
|
end
|
@@ -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
|
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,7 +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
|
-
|
87
|
+
redefine_method :to_date do |pattern = nil|
|
88
88
|
return nil if blank?
|
89
89
|
|
90
90
|
pattern = '%d%m%Y' if 'ddmmyyyy' == pattern
|
@@ -117,7 +117,7 @@ class String
|
|
117
117
|
year += 100 if year <= Ourdate.today.year % 100
|
118
118
|
year += 1900
|
119
119
|
elsif 9 == length && self =~ /\A\d{2}[^A-Z0-9][A-Z]{3}[^A-Z0-9]\d{2}\z/i
|
120
|
-
# dd/
|
120
|
+
# dd/mon/yy, rare case.
|
121
121
|
year += 100 if year <= Ourdate.today.year % 100
|
122
122
|
year += 1900
|
123
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,9 +22,9 @@ 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'
|
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
|
+
assert_equal(dr.to_s, dr2.to_s)
|
32
|
+
end
|
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')
|
31
45
|
assert_equal(dr.to_s, dr2.to_s)
|
32
46
|
end
|
33
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
|
|
@@ -226,4 +254,42 @@ class DaterangeTest < Minitest::Test
|
|
226
254
|
refute_equal dr1, nil
|
227
255
|
refute_equal dr1, 0
|
228
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
|
229
295
|
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)
|
@@ -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)
|
data/test/threat_scanner_test.rb
CHANGED
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.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-10-11 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
|
@@ -309,7 +309,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
309
309
|
requirements:
|
310
310
|
- - ">="
|
311
311
|
- !ruby/object:Gem::Version
|
312
|
-
version: 2.
|
312
|
+
version: 2.6.0
|
313
313
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
314
314
|
requirements:
|
315
315
|
- - ">="
|