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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e21f71716e6733363c47fb4fb1f457ec616a913902729cb40fa8a227a77d530
4
- data.tar.gz: 9b251bf890fb3d835c256fe81d136d51327e749970c21bad0a77529e12655384
3
+ metadata.gz: 8e95a05bf2c1dd28e2bfe10716b35e761c5db50ac58947f168585692b588c499
4
+ data.tar.gz: 49ed22feef4c4a22ea2094883263eaf81d24a497cff6d0977fa23c6889518e77
5
5
  SHA512:
6
- metadata.gz: f603f2982d2615bfc0a4b1963f324ee633a1e9fa8248c575ae52a74403b3dc514a1cbec13b2f162f351e297d6d3df50e9cd8ace0692571f3f8202603fd969598
7
- data.tar.gz: 9c3248c3286b5eba6ebf757a8e1f43958c585718f768de8798be3d482a5cfda28e36dfba1286782d9701d587aa3bc7465828f5c576e17bf0ccce377ce974743f
6
+ metadata.gz: aaa5b6b7e04962f01738e60815f338c3c54ca38c5862ab5b5a373a9f9628712670d75db1f7bae9e2e2830e6cf511a36b9bc0ec304822352e0e64b94caa375160
7
+ data.tar.gz: e204589b6cd0951139bea6d2d96d23d4ec0bfe7d0c2be501bdd0ed1668802d4dbb3a7866e73242d004bce25cfc9d8407b934051a3c5afe29b101fe813cee49d5
@@ -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)
@@ -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: brian.shand
16
- safe_revision: c88f5ac8c12fd657bb142144e0d3afaa7f9bc361
15
+ reviewed_by: josh.pencheon
16
+ safe_revision: 0cfcfac5ddcd721a67dcd23f04cbf6bc2278b922
17
17
  CHANGELOG.md:
18
18
  comments:
19
- reviewed_by: josh.pencheon
20
- safe_revision: ea1f7dc9a164981570ee2ad7c38197fdb17a6880
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
- lib/ndr_support.rb:
49
+ gemfiles/Gemfile.rails60:
62
50
  comments:
63
51
  reviewed_by: josh.pencheon
64
- safe_revision: ed8ff421cc9353456af13a37049a07ce2545aac1
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: josh.pencheon
72
- safe_revision: e5671bd9435490d521028d02bc91ccb47c74c580
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: 3553509e52b3697d361cfa4c6f8a67754ed942d3
68
+ safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
77
69
  lib/ndr_support/daterange.rb:
78
70
  comments:
79
- reviewed_by: brian.shand
80
- safe_revision: c7ed8bc16be8ec803dfaeb3473fbc538b54587ec
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: brian.shand
136
- safe_revision: 60cc69774d5aff92252558feae9604544def7583
131
+ reviewed_by: brianshand
132
+ safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
137
133
  lib/ndr_support/string/conversions.rb:
138
134
  comments:
139
- reviewed_by: brian.shand
140
- safe_revision: 0a06fed3e7530185497f786decdb77a62d35e101
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: josh.pencheon
148
- safe_revision: ed8ff421cc9353456af13a37049a07ce2545aac1
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: ea1f7dc9a164981570ee2ad7c38197fdb17a6880
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: josh.pencheon
176
- safe_revision: c197b91c07807345f2caf07ec4c14d8b9cbb4e53
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: timgentry
184
- safe_revision: 506a317e59d0ccb5b32d813b74d822f35a55cea9
183
+ reviewed_by: josh.pencheon
184
+ safe_revision: fe6c3beff445e3c84ed0c89f08e1ab10bfb00587
185
185
  test/daterange_test.rb:
186
186
  comments:
187
- reviewed_by: brian.shand
188
- safe_revision: c7ed8bc16be8ec803dfaeb3473fbc538b54587ec
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: brian.shand
240
- safe_revision: 60cc69774d5aff92252558feae9604544def7583
243
+ reviewed_by: brianshand
244
+ safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
241
245
  test/string/conversions_test.rb:
242
246
  comments:
243
- reviewed_by: brian.shand
244
- safe_revision: 1955bf30ffe581610981f0148569e252cba02926
247
+ reviewed_by: ollietulloch
248
+ safe_revision: 9a4b8e53f477725c2c2be5000b3c9e66f07d7389
245
249
  test/test_helper.rb:
246
250
  comments:
247
251
  reviewed_by: josh.pencheon
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '..'
4
+
5
+ gem 'activerecord', '~> 6.0.0rc1'
6
+ gem 'activesupport', '~> 6.0.0rc1'
@@ -21,3 +21,5 @@ require 'ndr_support/yaml/serialization_migration'
21
21
  module NdrSupport
22
22
  # Your code goes here...
23
23
  end
24
+
25
+ WorkingDays.check_lookup
@@ -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
- whole_days_to(other).count do |day|
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
- whole_days_to(other).count(&:weekday?)
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 whole_days_to(other)
112
- [self].tap do |days|
113
- loop do
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
- days.shift # Drop `self` off the front
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
@@ -1,8 +1,6 @@
1
1
  require 'yaml'
2
2
  require 'date'
3
-
4
- require 'ndr_support/concerns/working_days'
5
- [Time, Date, DateTime].each { |klass| klass.send(:include, WorkingDays) }
3
+ require 'ndr_support/working_days'
6
4
 
7
5
  class Date
8
6
  # to_iso output must be SQL safe for security reasons
@@ -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..2020
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 =~ /[^0-9\-\/\. ]/ # only allow digits, hyphen, slash, dot, space
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 =~ /([\/\.\-])/ # find a slash or dot or hyphen
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
@@ -10,6 +10,7 @@ class String
10
10
  [A-Z][0-9][0-9] |
11
11
  [A-Z][0-9][A-Z] |
12
12
  [A-Z][A-Z][0-9] |
13
+ NPT |
13
14
  [A-Z][A-Z][0-9][0-9] |
14
15
  [A-Z][A-Z][0-9][A-Z]
15
16
  )
@@ -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 !~ /\d{8}/
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/mmm/yy, rare case.
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
@@ -1,4 +1,5 @@
1
1
  require 'English'
2
+ require 'shellwords'
2
3
 
3
4
  # Runs a virus/malware check against the given path, using ClamAV.
4
5
  #
@@ -3,5 +3,5 @@
3
3
  # This defines the NdrSupport version. If you change it, rebuild and commit the gem.
4
4
  # Use "rake build" to build the gem, see rake -T for all bundler rake tasks.
5
5
  module NdrSupport
6
- VERSION = '5.5.0'
6
+ VERSION = '5.7.1'
7
7
  end
@@ -0,0 +1,5 @@
1
+ require 'date'
2
+ require 'ndr_support/concerns/working_days'
3
+ require 'ndr_support/integer/working_days'
4
+
5
+ [Time, Date, DateTime].each { |klass| klass.send(:include, WorkingDays) }
@@ -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', '>= 4.0.13', '< 5.3'
24
- spec.add_dependency 'activesupport', '>= 4.0.13', '< 5.3'
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', '~> 1.7'
27
- spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'bundler'
27
+ spec.add_development_dependency 'rake', '>= 12.3.3'
28
28
 
29
- spec.required_ruby_version = '>= 2.1.0'
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', '~> 3.1', '>= 3.1.3'
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
@@ -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
- assert ''.to_date('%Y-%m-%d').blank?
244
- assert ' '.to_date('%Y-%m-%d').blank?
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/mmm/yy string to_date' do
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.5.0
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: 2018-11-16 00:00:00.000000000 Z
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: 4.0.13
19
+ version: 5.2.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.3'
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: 4.0.13
29
+ version: 5.2.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.3'
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: 4.0.13
39
+ version: 5.2.0
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: '5.3'
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: 4.0.13
49
+ version: 5.2.0
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: '5.3'
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: '1.7'
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: '1.7'
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: '10.0'
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: '10.0'
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: '3.1'
115
+ version: '5.4'
116
116
  - - ">="
117
117
  - !ruby/object:Gem::Version
118
- version: 3.1.3
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: '3.1'
125
+ version: '5.4'
126
126
  - - ">="
127
127
  - !ruby/object:Gem::Version
128
- version: 3.1.3
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.1.0
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
- rubyforge_project:
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
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '..'
4
-
5
- gem 'activerecord', '~> 4.2.0'
6
- gem 'activesupport', '~> 4.2.0'
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '..'
4
-
5
- gem 'activerecord', '~> 5.0.0'
6
- gem 'activesupport', '~> 5.0.0'
@@ -1,9 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '..'
4
-
5
- # Minitest 5.10.2 doesn't work with Rails version
6
- gem 'minitest', '< 5.10.2'
7
-
8
- gem 'activerecord', '~> 5.1.0'
9
- gem 'activesupport', '~> 5.1.0'