ndr_support 5.8.2 → 5.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3f90df368cddc8835eb228b45b2e03088caf7ff494c6dd71538a255ed81ee17
4
- data.tar.gz: b7efe09d5283db3ee78934b727893817c772bb1564c02eaa453e216d562e23b1
3
+ metadata.gz: dc18cac2fe1d6de32316e751a1f4f9cd8050bdb2c3972e14c62a490a5cb10f15
4
+ data.tar.gz: 627714611718a64058082b873dddd855b6b6434395082d78381e8ad1954f7da6
5
5
  SHA512:
6
- metadata.gz: 3b5dd0eeb3aec3bf88b4bc71620a661f3fe8a76eb9deef2c6dd8ec8e4d42faf9328f4934531fc0b36e65947f62d7163e4d0165324c8f17df8a1dfa042d942dc1
7
- data.tar.gz: ba3cad435e924c140fd528a1cee8bd2e1aa8ccc2431f852d093e01bf7d16e8db21ceecdde3bd3cc53aed7465ffcaa0568f67b0226cbce1f957ced9d35a221ba8
6
+ metadata.gz: 7f2849f48fa7316c6ae326f87b17b95d225a975716d80ad5ae56e4b7a0b01b2f6bf82976c65070b144a5833cb7765516f383c378cccd96a9c60b52daa4e12a31
7
+ data.tar.gz: 862f14d702ebaccd054860aeaae4b93fac9b724dfeeb99581cd8ff0967169a3c267cd205e0ee1893c8b86d03f834db6d1afd7bed59e17f2881a2e80e75824f3c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  ## [Unreleased]
2
- *no unreleased changes*
2
+ * No unreleased changes
3
+
4
+ ## 5.9.0 / 2022-04-26
5
+ ## Fixed
6
+ * Support Rails 6.1
7
+ * Support Ruby 3.1
8
+
9
+ ## Changed
10
+ * Drop support for Ruby 2.6
11
+
12
+ ## 5.8.4 / 2021-12-27
13
+ ## Fixed
14
+ * Support 2023 public holidays
15
+
16
+ ## 5.8.3 / 2021-11-25
17
+ ## Fixed
18
+ * remove circular dependencies between Ourdate and Daterange
3
19
 
4
20
  ## 5.8.2 / 2021-10-11
5
21
  ## Fixed
@@ -11,7 +27,6 @@
11
27
 
12
28
  ## 5.8.0 / 2021-04-19
13
29
  ## Added
14
-
15
30
  * Add ability to disable date reversing in Daterange
16
31
 
17
32
  ## Fixed
data/code_safety.yml CHANGED
@@ -1,115 +1,123 @@
1
1
  ---
2
2
  file safety:
3
3
  ".github/CODEOWNERS":
4
- comments:
4
+ comments:
5
5
  reviewed_by: ollietulloch
6
6
  safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
7
7
  ".github/workflows/lint.yml":
8
- comments:
8
+ comments:
9
9
  reviewed_by: ollietulloch
10
10
  safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
11
11
  ".github/workflows/test.yml":
12
- comments:
13
- reviewed_by: ollietulloch
14
- safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
12
+ comments:
13
+ reviewed_by: brian.shand
14
+ safe_revision: e91fab5ac8474b001ca3805c6cce8eefa6b49f2d
15
15
  ".gitignore":
16
- comments:
16
+ comments:
17
17
  reviewed_by: josh.pencheon
18
18
  safe_revision: a02f14cbf1fc36fbaf820365fdedfdc9af326db1
19
19
  ".rubocop.yml":
20
- comments:
20
+ comments:
21
21
  reviewed_by: josh.pencheon
22
22
  safe_revision: a02f14cbf1fc36fbaf820365fdedfdc9af326db1
23
23
  CHANGELOG.md:
24
- comments:
25
- reviewed_by: ollietulloch
26
- safe_revision: de292b8dd286a0164a67cda49bbbbc8ba75409cc
24
+ comments:
25
+ reviewed_by: brian.shand
26
+ safe_revision: '0317988580be42bc3a3b64680e340223268c525f'
27
27
  CODE_OF_CONDUCT.md:
28
- comments:
28
+ comments:
29
29
  reviewed_by: timgentry
30
30
  safe_revision: c752769b91c0e782be0acf44e56bbc066a275365
31
31
  Gemfile:
32
- comments:
32
+ comments:
33
33
  reviewed_by: timgentry
34
34
  safe_revision: 6a7c3764e5315981070eba27b9f0be9d9182476c
35
35
  Guardfile:
36
- comments:
36
+ comments:
37
37
  reviewed_by: timgentry
38
38
  safe_revision: e33e9dae7f38bc449ce9276515a539836dbbbd53
39
39
  LICENSE.txt:
40
- comments:
40
+ comments:
41
41
  reviewed_by: timgentry
42
42
  safe_revision: 90328cca8494539257e192a63b240a91c89f0616
43
43
  README.md:
44
- comments:
44
+ comments:
45
45
  reviewed_by: ollietulloch
46
46
  safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
47
47
  Rakefile:
48
- comments:
48
+ comments:
49
49
  reviewed_by: timgentry
50
50
  safe_revision: e33e9dae7f38bc449ce9276515a539836dbbbd53
51
51
  gemfiles/Gemfile.rails52:
52
- comments:
52
+ comments:
53
53
  reviewed_by: josh.pencheon
54
54
  safe_revision: 8a6bedae77d33d0db1b67eaed7972870b6afc993
55
55
  gemfiles/Gemfile.rails60:
56
- comments:
57
- reviewed_by: josh.pencheon
58
- safe_revision: 0cfcfac5ddcd721a67dcd23f04cbf6bc2278b922
56
+ comments:
57
+ reviewed_by: brian.shand
58
+ safe_revision: 16254a4332aab074a27c8e13859dc4712e707122
59
+ gemfiles/Gemfile.rails61:
60
+ comments:
61
+ reviewed_by: brian.shand
62
+ safe_revision: 16254a4332aab074a27c8e13859dc4712e707122
63
+ gemfiles/Gemfile.rails70:
64
+ comments:
65
+ reviewed_by: brian.shand
66
+ safe_revision: 16254a4332aab074a27c8e13859dc4712e707122
59
67
  lib/ndr_support.rb:
60
- comments:
68
+ comments:
61
69
  reviewed_by: brian.shand
62
70
  safe_revision: 44fbdf72f47f4022c7dc9148150ebc18589dac8f
63
71
  lib/ndr_support/array.rb:
64
- comments:
72
+ comments:
65
73
  reviewed_by: pauleves
66
74
  safe_revision: 4a4ed24d2cfe7e1736baadf4cf6e0fece6823be1
67
75
  lib/ndr_support/concerns/working_days.rb:
68
- comments:
69
- reviewed_by: brianshand
70
- safe_revision: b72baa322dc58820ccd615a178371c2e5dab113c
76
+ comments:
77
+ reviewed_by: brian.shand
78
+ safe_revision: 42b82bdc466503800c021263899cdbbe444b78b0
71
79
  lib/ndr_support/date_and_time_extensions.rb:
72
- comments:
80
+ comments:
73
81
  reviewed_by: josh.pencheon
74
82
  safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
75
83
  lib/ndr_support/daterange.rb:
76
- comments:
77
- reviewed_by: ollietulloch
78
- safe_revision: fc52184297e0a3bcd52b119e2e0add952c8ab7f1
84
+ comments:
85
+ reviewed_by: brian.shand
86
+ safe_revision: 9d19593cc45a9f1724c4b34a1a05a5ff48003084
79
87
  lib/ndr_support/hash.rb:
80
- comments:
88
+ comments:
81
89
  reviewed_by: pauleves
82
90
  safe_revision: 506a317e59d0ccb5b32d813b74d822f35a55cea9
83
91
  lib/ndr_support/integer/calculations.rb:
84
- comments:
92
+ comments:
85
93
  reviewed_by: josh.pencheon
86
94
  safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
87
- lib/ndr_support/integer/julian_date_conversions.rb:
88
- comments:
89
- reviewed_by: ollietulloch
90
- safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
91
95
  lib/ndr_support/integer/rounding.rb:
92
- comments:
96
+ comments:
93
97
  reviewed_by: josh.pencheon
94
98
  safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
95
99
  lib/ndr_support/integer/working_days.rb:
96
- comments:
100
+ comments:
97
101
  reviewed_by: josh.pencheon
98
102
  safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
99
103
  lib/ndr_support/nil.rb:
100
- comments:
104
+ comments:
101
105
  reviewed_by: pauleves
102
106
  safe_revision: 4a4ed24d2cfe7e1736baadf4cf6e0fece6823be1
103
107
  lib/ndr_support/obfuscator.rb:
104
- comments:
108
+ comments:
105
109
  reviewed_by: brian.shand
106
110
  safe_revision: 50a4293953f9ae227823c390b069a3ed4825074c
107
111
  lib/ndr_support/ourdate.rb:
108
- comments:
109
- reviewed_by: ollietulloch
110
- safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
112
+ comments:
113
+ reviewed_by: brian.shand
114
+ safe_revision: 9d19593cc45a9f1724c4b34a1a05a5ff48003084
115
+ lib/ndr_support/ourdate/build_datetime.rb:
116
+ comments:
117
+ reviewed_by: brian.shand
118
+ safe_revision: 9d19593cc45a9f1724c4b34a1a05a5ff48003084
111
119
  lib/ndr_support/ourtime.rb:
112
- comments:
120
+ comments:
113
121
  reviewed_by: ollietulloch
114
122
  safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
115
123
  lib/ndr_support/password.rb:
@@ -121,107 +129,107 @@ file safety:
121
129
  reviewed_by: josh.pencheon
122
130
  safe_revision: f5d1ba50d378286c0541f300d73844240e2eb7c1
123
131
  lib/ndr_support/regexp_range.rb:
124
- comments:
132
+ comments:
125
133
  reviewed_by: pauleves
126
134
  safe_revision: f9341d1c7f797f9fe81af937c383d41c23872b2f
127
135
  lib/ndr_support/safe_file.rb:
128
- comments:
136
+ comments:
129
137
  reviewed_by: josh.pencheon
130
138
  safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
131
139
  lib/ndr_support/safe_path.rb:
132
- comments:
133
- reviewed_by: ollietulloch
134
- safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
140
+ comments:
141
+ reviewed_by: brian.shand
142
+ safe_revision: f4f7cb0803ea34a2f1ba83495d8bcbd942786bce
135
143
  lib/ndr_support/string/cleaning.rb:
136
- comments:
144
+ comments:
137
145
  reviewed_by: brianshand
138
146
  safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
139
147
  lib/ndr_support/string/conversions.rb:
140
- comments:
148
+ comments:
141
149
  reviewed_by: ollietulloch
142
150
  safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
143
151
  lib/ndr_support/tasks.rb:
144
- comments:
152
+ comments:
145
153
  reviewed_by: timgentry
146
154
  safe_revision: 62337584a32e5c30c2e9af7cd998a9df684885cc
147
155
  lib/ndr_support/threat_scanner.rb:
148
- comments:
156
+ comments:
149
157
  reviewed_by: brianshand
150
158
  safe_revision: befa1d4f27448d5be4e133f442c2b5fbac7d8f25
151
159
  lib/ndr_support/utf8_encoding.rb:
152
- comments:
160
+ comments:
153
161
  reviewed_by: josh.pencheon
154
162
  safe_revision: 8e024a4bacfd36e172aad4b800f1960faae0b4b6
155
163
  lib/ndr_support/utf8_encoding/control_characters.rb:
156
- comments:
164
+ comments:
157
165
  reviewed_by: ollietulloch
158
166
  safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
159
167
  lib/ndr_support/utf8_encoding/force_binary.rb:
160
- comments:
168
+ comments:
161
169
  reviewed_by: ollietulloch
162
170
  safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
163
171
  lib/ndr_support/utf8_encoding/object_support.rb:
164
- comments:
172
+ comments:
165
173
  reviewed_by: ollietulloch
166
174
  safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
167
175
  lib/ndr_support/version.rb:
168
- comments:
169
- reviewed_by: ollietulloch
170
- safe_revision: de292b8dd286a0164a67cda49bbbbc8ba75409cc
176
+ comments:
177
+ reviewed_by: brian.shand
178
+ safe_revision: '0317988580be42bc3a3b64680e340223268c525f'
171
179
  lib/ndr_support/working_days.rb:
172
- comments:
180
+ comments:
173
181
  reviewed_by: josh.pencheon
174
182
  safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
175
183
  lib/ndr_support/yaml/serialization_migration.rb:
176
- comments:
177
- reviewed_by: timgentry
178
- safe_revision: 29595e6431587ff9b7db6e3ad3abbb3577bff99c
184
+ comments:
185
+ reviewed_by: brian.shand
186
+ safe_revision: f4f7cb0803ea34a2f1ba83495d8bcbd942786bce
179
187
  ndr_support.gemspec:
180
- comments:
181
- reviewed_by: ollietulloch
182
- safe_revision: 993f7719b57eb6ddd8dffa7230ed9ffc69f48749
188
+ comments:
189
+ reviewed_by: brian.shand
190
+ safe_revision: e91fab5ac8474b001ca3805c6cce8eefa6b49f2d
183
191
  test/array_test.rb:
184
- comments:
192
+ comments:
185
193
  reviewed_by: timgentry
186
194
  safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
187
195
  test/concerns/working_days_test.rb:
188
- comments:
196
+ comments:
189
197
  reviewed_by: josh.pencheon
190
198
  safe_revision: fe6c3beff445e3c84ed0c89f08e1ab10bfb00587
191
199
  test/daterange_test.rb:
192
- comments:
200
+ comments:
193
201
  reviewed_by: ollietulloch
194
202
  safe_revision: ccca1dc67e3742efb154e01e01243e7b38180936
195
203
  test/hash_test.rb:
196
- comments:
204
+ comments:
197
205
  reviewed_by: timgentry
198
206
  safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
199
207
  test/integer/calculations_test.rb:
200
- comments:
208
+ comments:
201
209
  reviewed_by: josh.pencheon
202
210
  safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
203
211
  test/integer/rounding_test.rb:
204
- comments:
212
+ comments:
205
213
  reviewed_by: josh.pencheon
206
214
  safe_revision: 2685f35c907af6968a69eabb5ab9424b490d0f40
207
215
  test/integer/working_days_test.rb:
208
- comments:
216
+ comments:
209
217
  reviewed_by: josh.pencheon
210
218
  safe_revision: c1158eccb843b637b4dd82815dc7c081f12b93e4
211
219
  test/nil_test.rb:
212
- comments:
220
+ comments:
213
221
  reviewed_by: timgentry
214
222
  safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
215
223
  test/obfuscator_test.rb:
216
- comments:
224
+ comments:
217
225
  reviewed_by: brian.shand
218
226
  safe_revision: 50a4293953f9ae227823c390b069a3ed4825074c
219
227
  test/ourdate_test.rb:
220
- comments:
228
+ comments:
221
229
  reviewed_by: josh.pencheon
222
230
  safe_revision: 7c32f5a80c1fb7aaf6e850d4b0651a7b47640e15
223
231
  test/ourtime_test.rb:
224
- comments:
232
+ comments:
225
233
  reviewed_by: brian.shand
226
234
  safe_revision: b9bc1e18464a27f84e69ebea083dd6a8d351c8cb
227
235
  test/password_test.rb:
@@ -229,50 +237,50 @@ file safety:
229
237
  reviewed_by: josh.pencheon
230
238
  safe_revision: f5d1ba50d378286c0541f300d73844240e2eb7c1
231
239
  test/regexp_range_test.rb:
232
- comments:
233
- reviewed_by: timgentry
234
- safe_revision: 29595e6431587ff9b7db6e3ad3abbb3577bff99c
240
+ comments:
241
+ reviewed_by: brian.shand
242
+ safe_revision: f4f7cb0803ea34a2f1ba83495d8bcbd942786bce
235
243
  test/resources/filesystem_paths.yml:
236
- comments:
244
+ comments:
237
245
  reviewed_by: timgentry
238
246
  safe_revision: 81061f85ccdf8933adc7f104d7eeaef1e2d71e26
239
247
  test/safe_file_test.rb:
240
- comments:
248
+ comments:
241
249
  reviewed_by: josh.pencheon
242
250
  safe_revision: 24ba08d3a8f4b284678244aaffa2aaa347256900
243
251
  test/safe_path_test.rb:
244
- comments:
252
+ comments:
245
253
  reviewed_by: timgentry
246
254
  safe_revision: b562d0c15ff1b1d565522a47e6bae47ea09706f0
247
255
  test/string/cleaning_test.rb:
248
- comments:
256
+ comments:
249
257
  reviewed_by: brianshand
250
258
  safe_revision: b7b033ad9773cc9037c408a7763b113d31cbf191
251
259
  test/string/conversions_test.rb:
252
- comments:
260
+ comments:
253
261
  reviewed_by: ollietulloch
254
262
  safe_revision: '09b3f97fb4c1afc88d0d070c39796b1f60c39d25'
255
263
  test/test_helper.rb:
256
- comments:
264
+ comments:
257
265
  reviewed_by: josh.pencheon
258
266
  safe_revision: 34ae80f2952f0bfd18688541862774cbaaa6c5f5
259
267
  test/threat_scanner_test.rb:
260
- comments:
268
+ comments:
261
269
  reviewed_by: ollietulloch
262
270
  safe_revision: fbb6ef9804040aa2e38257d9f5c487bde18a490d
263
271
  test/utf8_encoding/control_characters_test.rb:
264
- comments:
272
+ comments:
265
273
  reviewed_by: timgentry
266
274
  safe_revision: d210b982841611381a0df02d8f2db9c13e41e42f
267
275
  test/utf8_encoding/force_binary_test.rb:
268
- comments:
276
+ comments:
269
277
  reviewed_by: timgentry
270
278
  safe_revision: 29595e6431587ff9b7db6e3ad3abbb3577bff99c
271
279
  test/utf8_encoding_test.rb:
272
- comments:
280
+ comments:
273
281
  reviewed_by: timgentry
274
282
  safe_revision: 2a5d30674dc9dde336e1dbbbf3c8a98905647432
275
283
  test/yaml/serialization_test.rb:
276
- comments:
277
- reviewed_by: josh.pencheon
278
- safe_revision: 4daf43bf8cb48761471b32ad45c4d1cf97aab476
284
+ comments:
285
+ reviewed_by: brian.shand
286
+ safe_revision: f4f7cb0803ea34a2f1ba83495d8bcbd942786bce
@@ -2,5 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '..'
4
4
 
5
- gem 'activerecord', '~> 6.0.0rc1'
6
- gem 'activesupport', '~> 6.0.0rc1'
5
+ gem 'activerecord', '~> 6.0.0'
6
+ gem 'activesupport', '~> 6.0.0'
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '..'
4
+
5
+ gem 'activerecord', '~> 6.1.0'
6
+ gem 'activesupport', '~> 6.1.0'
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '..'
4
+
5
+ gem 'activerecord', '~> 7.0.0'
6
+ gem 'activesupport', '~> 7.0.0'
@@ -107,6 +107,15 @@ module WorkingDays
107
107
  '2022-08-29', # Monday - Summer bank holiday
108
108
  '2022-12-26', # Monday - Boxing Day
109
109
  '2022-12-27', # Tuesday - Christmas Day (substitute day)
110
+ # 2023
111
+ '2023-01-02', # Monday - New Year’s Day (substitute day)
112
+ '2023-04-07', # Friday - Good Friday
113
+ '2023-04-10', # Monday - Easter Monday
114
+ '2023-05-01', # Monday - Early May bank holiday
115
+ '2023-05-29', # Monday - Spring bank holiday
116
+ '2023-08-28', # Monday - Summer bank holiday
117
+ '2023-12-25', # Monday - Boxing Day
118
+ '2023-12-26', # Tuesday - Christmas Day (substitute day)
110
119
  ].map { |str| Date.parse(str) }
111
120
 
112
121
  def self.check_lookup
@@ -1,6 +1,6 @@
1
1
  require 'active_support/core_ext/enumerable'
2
2
  require 'active_support/time'
3
- require 'ndr_support/integer/julian_date_conversions'
3
+ require 'ndr_support/ourdate/build_datetime'
4
4
 
5
5
  # Our "vague date" class, which can represent a single date or a date range.
6
6
  class Daterange
@@ -188,7 +188,10 @@ class Daterange
188
188
  j1 = j2 = Date.new(parts[0], parts[1], parts[2]).jd
189
189
  end
190
190
 
191
- [j1.jd_to_datetime, j2.jd_to_datetime]
191
+ [j1, j2].collect do |jd|
192
+ date = Date.jd(jd) # Julian date number to Ruby Date
193
+ Ourdate.build_datetime(date.year, date.month, date.day)
194
+ end
192
195
  rescue
193
196
  nil
194
197
  end
@@ -0,0 +1,36 @@
1
+ require 'active_record'
2
+ require 'active_support/time'
3
+
4
+ class Ourdate
5
+ # Construct a daylight saving time safe datetime, with arguments
6
+ #--
7
+ # FIXME: Note that the arguments should be numbers, not strings -- it works
8
+ # with strings arguments only after the 1970 epoch; before, it returns nil.
9
+ #++
10
+ def self.build_datetime(year, month = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0)
11
+ return nil if year.nil?
12
+
13
+ if ActiveRecord::Base.default_timezone == :local
14
+ # Time.local_time(year, month, day, hour, min, sec, usec).to_datetime
15
+ # Behave like oracle_adapter.rb
16
+ seconds = sec + Rational(usec, 10**6)
17
+ time_array = [year, month, day, hour, min, seconds]
18
+ begin
19
+ #--
20
+ # TODO: Fails unit tests unless we .to_datetime here
21
+ # but the risk is we lose the usec component unnecesssarily.
22
+ # Investigate removing .to_datetime below.
23
+ #++
24
+ Time.send(ActiveRecord::Base.default_timezone, *time_array).to_datetime
25
+ rescue
26
+ zone_offset = ActiveRecord::Base.default_timezone == :local ? DateTime.now.offset : 0
27
+ # Append zero calendar reform start to account for dates skipped by calendar reform
28
+ DateTime.new(*time_array[0..5] << zone_offset << 0) rescue nil
29
+ end
30
+ else
31
+ # Only supports fake GMT time -- needs improvement
32
+ # Maybe use Time.zone.local or Time.local_time(year, month, day)
33
+ Time.utc(year, month, day, hour, min, sec, usec).to_datetime
34
+ end
35
+ end
36
+ end
@@ -1,5 +1,6 @@
1
1
  require 'active_record'
2
2
  require 'active_support/time'
3
+ require 'ndr_support/ourdate/build_datetime'
3
4
  require 'ndr_support/date_and_time_extensions'
4
5
  require 'ndr_support/daterange'
5
6
 
@@ -25,38 +26,6 @@ class Ourdate
25
26
  end
26
27
  end
27
28
 
28
- # Construct a daylight saving time safe datetime, with arguments
29
- #--
30
- # FIXME: Note that the arguments should be numbers, not strings -- it works
31
- # with strings arguments only after the 1970 epoch; before, it returns nil.
32
- #++
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
-
36
- if ActiveRecord::Base.default_timezone == :local
37
- # Time.local_time(year, month, day, hour, min, sec, usec).to_datetime
38
- # Behave like oracle_adapter.rb
39
- seconds = sec + Rational(usec, 10**6)
40
- time_array = [year, month, day, hour, min, seconds]
41
- begin
42
- #--
43
- # TODO: Fails unit tests unless we .to_datetime here
44
- # but the risk is we lose the usec component unnecesssarily.
45
- # Investigate removing .to_datetime below.
46
- #++
47
- Time.send(ActiveRecord::Base.default_timezone, *time_array).to_datetime
48
- rescue
49
- zone_offset = ActiveRecord::Base.default_timezone == :local ? DateTime.now.offset : 0
50
- # Append zero calendar reform start to account for dates skipped by calendar reform
51
- DateTime.new(*time_array[0..5] << zone_offset << 0) rescue nil
52
- end
53
- else
54
- # Only supports fake GMT time -- needs improvement
55
- # Maybe use Time.zone.local or Time.local_time(year, month, day)
56
- Time.utc(year, month, day, hour, min, sec, usec).to_datetime
57
- end
58
- end
59
-
60
29
  def initialize(x = nil)
61
30
  if x.is_a?(Date)
62
31
  @thedate = x
@@ -64,13 +64,12 @@ class SafePath
64
64
  # should be used. Attempting to reconfigure with
65
65
  # new settings will raise a security error.
66
66
  def self.configure!(filepath)
67
- if defined?(@@fs_paths)
68
- fail SecurityError, 'Attempt to re-assign SafePath config!'
69
- else
70
- File.open(filepath, 'r') do |file|
71
- @@fs_paths = YAML.load(ERB.new(file.read).result)
72
- @@fs_paths.freeze
73
- end
67
+ raise SecurityError, 'Attempt to re-assign SafePath config!' if defined?(@@fs_paths)
68
+
69
+ File.open(filepath, 'r') do |file|
70
+ @@fs_paths = YAML.safe_load(ERB.new(file.read).result,
71
+ permitted_classes: [Regexp], aliases: true)
72
+ @@fs_paths.freeze
74
73
  end
75
74
  end
76
75
 
@@ -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.8.2'
6
+ VERSION = '5.9.0'
7
7
  end
@@ -8,6 +8,10 @@ module NdrSupport
8
8
  module SerializationMigration
9
9
  include UTF8Encoding
10
10
 
11
+ # Classes we routinely allow to be included in our YAML serialisations, automatically
12
+ # accepted by load_yaml
13
+ YAML_SAFE_CLASSES = [Date, DateTime, Time, Symbol].freeze
14
+
11
15
  # Wrapper around: YAML.load(string)
12
16
  def load_yaml(string, coerce_invalid_chars = false)
13
17
  fix_encoding!(string, coerce_invalid_chars)
@@ -16,7 +20,12 @@ module NdrSupport
16
20
  handle_special_characters!(string, coerce_invalid_chars)
17
21
  fix_encoding!(string, coerce_invalid_chars)
18
22
 
19
- object = Psych.load(string)
23
+ # TODO: Bump NdrSupport major version, and switch to safe_load by default
24
+ object = if Psych::VERSION.start_with?('3.')
25
+ Psych.load(string)
26
+ else
27
+ Psych.safe_load(string, permitted_classes: YAML_SAFE_CLASSES)
28
+ end
20
29
 
21
30
  # Ensure that any string related to the object
22
31
  # we've loaded is also valid UTF-8.
data/ndr_support.gemspec CHANGED
@@ -24,15 +24,15 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency 'bundler'
25
25
  spec.add_development_dependency 'rake', '>= 12.3.3'
26
26
 
27
- spec.required_ruby_version = '>= 2.6.0'
27
+ spec.required_ruby_version = '>= 2.7'
28
28
 
29
29
  # Avoid std-lib minitest (which has different namespace)
30
30
  spec.add_development_dependency 'minitest', '>= 5.0.0'
31
31
  spec.add_development_dependency 'mocha', '~> 1.1'
32
32
 
33
- spec.add_development_dependency 'ndr_dev_support', '~> 5.4', '>= 5.4.5'
33
+ spec.add_development_dependency 'ndr_dev_support', '~> 6.0.2'
34
+
34
35
  spec.add_development_dependency 'guard'
35
- spec.add_development_dependency 'listen', '< 3.1' # Bundle 1.12 should be (but isn't) resolving Ruby 2.1 issue
36
36
  spec.add_development_dependency 'guard-rubocop'
37
37
  spec.add_development_dependency 'guard-shell'
38
38
  spec.add_development_dependency 'guard-minitest'
@@ -16,7 +16,8 @@ class RegexpRangeTest < Minitest::Test
16
16
  regexp_range = RegexpRange.new(0, /^3Ut/)
17
17
 
18
18
  # Don't test YAML serialisation directly, but make it can be loaded:
19
- deserialized_regexp_range = YAML.load(regexp_range.to_yaml)
19
+ deserialized_regexp_range = YAML.safe_load(regexp_range.to_yaml,
20
+ permitted_classes: [RegexpRange, Regexp])
20
21
  assert_instance_of RegexpRange, deserialized_regexp_range
21
22
  assert_equal regexp_range.begin, deserialized_regexp_range.begin
22
23
  assert_equal regexp_range.end, deserialized_regexp_range.end
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  require 'test_helper'
4
2
 
5
3
  class SerializationTest < Minitest::Test
@@ -70,7 +68,7 @@ class SerializationTest < Minitest::Test
70
68
 
71
69
  def assert_times
72
70
  # Dumped by 1.9.3 syck, within era.
73
- loaded = YAML.load("--- !timestamp 2014-03-01\n")
71
+ loaded = YAML.safe_load("--- !timestamp 2014-03-01\n", permitted_classes: YAML_SAFE_CLASSES)
74
72
  assert [Date, Time].include?(loaded.class), '1.9.3 era timestamp class'
75
73
  assert_equal 2014, loaded.year, '1.9.3 era timestamp year'
76
74
  assert_equal 3, loaded.month, '1.9.3 era timestamp month'
@@ -81,17 +79,17 @@ class SerializationTest < Minitest::Test
81
79
  date = Date.new(2014, 3, 1)
82
80
 
83
81
  # Dumped by 1.8.7 syck, within era.
84
- loaded = YAML.load("--- 2014-03-01\n")
82
+ loaded = YAML.safe_load("--- 2014-03-01\n", permitted_classes: YAML_SAFE_CLASSES)
85
83
  assert_equal date, loaded, '1.8.7 era date'
86
84
 
87
85
  # Check default formatting does not affect serialisation:
88
86
  assert_equal '01.03.2014', date.to_s
89
- assert_equal date, YAML.load(date.to_yaml)
87
+ assert_equal date, YAML.safe_load(date.to_yaml, permitted_classes: YAML_SAFE_CLASSES)
90
88
  end
91
89
 
92
90
  def assert_datetimes
93
91
  datetime = DateTime.new(2014, 3, 1, 12, 45, 15)
94
- loaded = YAML.load(datetime.to_yaml)
92
+ loaded = YAML.safe_load(datetime.to_yaml, permitted_classes: YAML_SAFE_CLASSES)
95
93
 
96
94
  assert [DateTime, Time].include?(loaded.class), 'datetime class'
97
95
  assert_equal datetime, loaded.to_datetime
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.8.2
4
+ version: 5.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - NCRS Development Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-11 00:00:00.000000000 Z
11
+ date: 2022-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -112,20 +112,14 @@ dependencies:
112
112
  requirements:
113
113
  - - "~>"
114
114
  - !ruby/object:Gem::Version
115
- version: '5.4'
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- version: 5.4.5
115
+ version: 6.0.2
119
116
  type: :development
120
117
  prerelease: false
121
118
  version_requirements: !ruby/object:Gem::Requirement
122
119
  requirements:
123
120
  - - "~>"
124
121
  - !ruby/object:Gem::Version
125
- version: '5.4'
126
- - - ">="
127
- - !ruby/object:Gem::Version
128
- version: 5.4.5
122
+ version: 6.0.2
129
123
  - !ruby/object:Gem::Dependency
130
124
  name: guard
131
125
  requirement: !ruby/object:Gem::Requirement
@@ -140,20 +134,6 @@ dependencies:
140
134
  - - ">="
141
135
  - !ruby/object:Gem::Version
142
136
  version: '0'
143
- - !ruby/object:Gem::Dependency
144
- name: listen
145
- requirement: !ruby/object:Gem::Requirement
146
- requirements:
147
- - - "<"
148
- - !ruby/object:Gem::Version
149
- version: '3.1'
150
- type: :development
151
- prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- requirements:
154
- - - "<"
155
- - !ruby/object:Gem::Version
156
- version: '3.1'
157
137
  - !ruby/object:Gem::Dependency
158
138
  name: guard-rubocop
159
139
  requirement: !ruby/object:Gem::Requirement
@@ -242,6 +222,8 @@ files:
242
222
  - code_safety.yml
243
223
  - gemfiles/Gemfile.rails52
244
224
  - gemfiles/Gemfile.rails60
225
+ - gemfiles/Gemfile.rails61
226
+ - gemfiles/Gemfile.rails70
245
227
  - lib/ndr_support.rb
246
228
  - lib/ndr_support/array.rb
247
229
  - lib/ndr_support/concerns/working_days.rb
@@ -249,12 +231,12 @@ files:
249
231
  - lib/ndr_support/daterange.rb
250
232
  - lib/ndr_support/hash.rb
251
233
  - lib/ndr_support/integer/calculations.rb
252
- - lib/ndr_support/integer/julian_date_conversions.rb
253
234
  - lib/ndr_support/integer/rounding.rb
254
235
  - lib/ndr_support/integer/working_days.rb
255
236
  - lib/ndr_support/nil.rb
256
237
  - lib/ndr_support/obfuscator.rb
257
238
  - lib/ndr_support/ourdate.rb
239
+ - lib/ndr_support/ourdate/build_datetime.rb
258
240
  - lib/ndr_support/ourtime.rb
259
241
  - lib/ndr_support/password.rb
260
242
  - lib/ndr_support/password/constants.rb
@@ -309,14 +291,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
309
291
  requirements:
310
292
  - - ">="
311
293
  - !ruby/object:Gem::Version
312
- version: 2.6.0
294
+ version: '2.7'
313
295
  required_rubygems_version: !ruby/object:Gem::Requirement
314
296
  requirements:
315
297
  - - ">="
316
298
  - !ruby/object:Gem::Version
317
299
  version: '0'
318
300
  requirements: []
319
- rubygems_version: 3.0.3
301
+ rubygems_version: 3.1.6
320
302
  signing_key:
321
303
  specification_version: 4
322
304
  summary: NDR Support library
@@ -1,12 +0,0 @@
1
- # Extend Integer for use in our Daterange class
2
- class Integer
3
- # Julian date number to Ruby Date
4
- def jd_to_date
5
- Date.jd(self)
6
- end
7
-
8
- def jd_to_datetime
9
- date = jd_to_date
10
- Ourdate.build_datetime(date.year, date.month, date.day)
11
- end
12
- end