subroutine 3.0.3 → 3.0.4

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: a2dedf592996ae8331d333379af49033a3f5a3e74a4c8dd8d8cf5fbe7c878258
4
- data.tar.gz: ab33d0b731a9f28b52e4661fdcb6626d6eda2f2e8883a8f05ecfa2b529f2961a
3
+ metadata.gz: fb0e95ecb87d3b848cbc99714e68405ead97c7c82b2ea7e80b49925502a15790
4
+ data.tar.gz: dfdae7d9a7a7b227eb35cecc53334412c0d27259f7b8f3bc5a83cf8e402faebd
5
5
  SHA512:
6
- metadata.gz: 26617e51aeb874dbabb64ad62add32903ad734014ed09e4b0c59f81829bb9bbf728726ab4c7690d82ce1280967b59507c689a58464c13216ad46df87b99c0ff5
7
- data.tar.gz: 3a45d5cbac6d68660c875e0c7163b403276b360a7d37efb86199d2b593c04876060e6f83b99cef3e0dd2c144cba2c75c11a2eeb51a17253bfff49cb6657c55c7
6
+ metadata.gz: b0e0f0d68c428bbed21dd09adc7b98890281fc61b69a6a04cebdb34848a8da9db9ff2cdabf9a5257741a5e1d13592cadfe056f3d4fd274fe74aa9bcac830b439
7
+ data.tar.gz: 046725136d9300e595dcfd0f83fd6fd9b1271b28bdb213bee2f7a9504c8291841c2c35c48abe13d2e0b0eb137698c0c42e553836099dfd5b61c24f51d41c77ff
@@ -4,11 +4,14 @@ require 'date'
4
4
  require 'time'
5
5
  require 'bigdecimal'
6
6
  require 'securerandom'
7
+ require 'active_support/core_ext/date_time/acts_like'
8
+ require 'active_support/core_ext/date_time/calculations'
7
9
  require 'active_support/core_ext/object/acts_like'
8
10
  require 'active_support/core_ext/object/blank'
9
11
  require 'active_support/core_ext/object/try'
10
12
  require 'active_support/core_ext/array/wrap'
11
13
  require 'active_support/core_ext/time/acts_like'
14
+ require 'active_support/core_ext/time/calculations'
12
15
 
13
16
  module Subroutine
14
17
  module TypeCaster
@@ -117,13 +120,23 @@ end
117
120
  ::Date.parse(String(value))
118
121
  end
119
122
 
120
- ::Subroutine::TypeCaster.register :time, :timestamp, :datetime do |value, _options = {}|
123
+ ::Subroutine::TypeCaster.register :time, :timestamp, :datetime do |value, options = {}|
121
124
  next nil unless value.present?
122
125
 
123
- if value.try(:acts_like?, :time)
124
- value
125
- else
126
- ::Time.parse(String(value))
126
+ if options[:precision] == :high
127
+ if value.try(:acts_like?, :time)
128
+ value.to_time
129
+ else
130
+ ::Time.parse(String(value))
131
+ end
132
+ else # precision == :seconds
133
+ time = if value.try(:acts_like?, :time)
134
+ value.to_time
135
+ else
136
+ ::Time.parse(String(value))
137
+ end
138
+
139
+ time.change(usec: 0)
127
140
  end
128
141
  end
129
142
 
@@ -4,7 +4,7 @@ module Subroutine
4
4
 
5
5
  MAJOR = 3
6
6
  MINOR = 0
7
- PATCH = 3
7
+ PATCH = 4
8
8
  PRE = nil
9
9
 
10
10
  VERSION = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
@@ -241,7 +241,7 @@ module Subroutine
241
241
  assert_nil op.date_input
242
242
  end
243
243
 
244
- def test_time_inputs
244
+ def test_time_inputs__with_seconds_precision
245
245
  op.time_input = nil
246
246
  assert_nil op.time_input
247
247
 
@@ -256,22 +256,139 @@ module Subroutine
256
256
  assert_equal 0, op.time_input.min
257
257
  assert_equal 0, op.time_input.sec
258
258
 
259
+ op.time_input = ::DateTime.new(2022, 12, 22)
260
+ assert_equal ::Time, op.time_input.class
261
+ refute_equal ::DateTime, op.time_input.class
262
+
263
+ assert_equal 0, op.time_input.utc_offset
264
+ assert_equal 2022, op.time_input.year
265
+ assert_equal 12, op.time_input.month
266
+ assert_equal 22, op.time_input.day
267
+ assert_equal 0, op.time_input.hour
268
+ assert_equal 0, op.time_input.min
269
+ assert_equal 0, op.time_input.sec
270
+
259
271
  op.time_input = '2023-05-05T10:00:30.123456Z'
260
272
  assert_equal ::Time, op.time_input.class
261
273
  refute_equal ::DateTime, op.time_input.class
262
274
 
275
+ assert_equal 0, op.time_input.utc_offset
276
+ assert_equal 2023, op.time_input.year
277
+ assert_equal 5, op.time_input.month
278
+ assert_equal 5, op.time_input.day
279
+ assert_equal 10, op.time_input.hour
280
+ assert_equal 0, op.time_input.min
281
+ assert_equal 30, op.time_input.sec
282
+ assert_equal 0, op.time_input.usec
283
+
284
+ op.time_input = '2023-05-05T10:00:30Z'
285
+ assert_equal ::Time, op.time_input.class
286
+ assert_equal 0, op.time_input.utc_offset
263
287
  assert_equal 2023, op.time_input.year
264
288
  assert_equal 5, op.time_input.month
265
289
  assert_equal 5, op.time_input.day
266
290
  assert_equal 10, op.time_input.hour
267
291
  assert_equal 0, op.time_input.min
268
292
  assert_equal 30, op.time_input.sec
269
- assert_equal 123456, op.time_input.usec
293
+ assert_equal 0, op.time_input.usec
270
294
 
271
- time = Time.at(1678741605.123456)
295
+ op.time_input = '2024-11-11T16:42:23.246+0100'
296
+ assert_equal ::Time, op.time_input.class
297
+ assert_equal 3600, op.time_input.utc_offset
298
+ assert_equal 2024, op.time_input.year
299
+ assert_equal 11, op.time_input.month
300
+ assert_equal 11, op.time_input.day
301
+ assert_equal 16, op.time_input.hour
302
+ assert_equal 42, op.time_input.min
303
+ assert_equal 23, op.time_input.sec
304
+ assert_equal 0, op.time_input.usec
305
+
306
+ time = Time.at(1678741605.123456).utc
272
307
  op.time_input = time
273
- assert_equal time, op.time_input
274
- assert_equal time.object_id, op.time_input.object_id
308
+ refute_equal time, op.time_input
309
+ refute_equal time.object_id, op.time_input.object_id
310
+ assert_equal 2023, op.time_input.year
311
+ assert_equal 3, op.time_input.month
312
+ assert_equal 13, op.time_input.day
313
+ assert_equal 21, op.time_input.hour
314
+ assert_equal 6, op.time_input.min
315
+ assert_equal 45, op.time_input.sec
316
+ assert_equal 0, op.time_input.usec
317
+ end
318
+
319
+ def test_time_inputs__with_high_precision
320
+ op.precise_time_input = nil
321
+ assert_nil op.precise_time_input
322
+
323
+ op.precise_time_input = '2022-12-22'
324
+ assert_equal ::Time, op.precise_time_input.class
325
+ refute_equal ::DateTime, op.precise_time_input.class
326
+
327
+ assert_equal 2022, op.precise_time_input.year
328
+ assert_equal 12, op.precise_time_input.month
329
+ assert_equal 22, op.precise_time_input.day
330
+ assert_equal 0, op.precise_time_input.hour
331
+ assert_equal 0, op.precise_time_input.min
332
+ assert_equal 0, op.precise_time_input.sec
333
+
334
+ op.precise_time_input = ::DateTime.new(2022, 12, 22)
335
+ assert_equal ::Time, op.precise_time_input.class
336
+ refute_equal ::DateTime, op.precise_time_input.class
337
+
338
+ assert_equal 0, op.precise_time_input.utc_offset
339
+ assert_equal 2022, op.precise_time_input.year
340
+ assert_equal 12, op.precise_time_input.month
341
+ assert_equal 22, op.precise_time_input.day
342
+ assert_equal 0, op.precise_time_input.hour
343
+ assert_equal 0, op.precise_time_input.min
344
+ assert_equal 0, op.precise_time_input.sec
345
+
346
+ op.precise_time_input = '2023-05-05T10:00:30.123456Z'
347
+ assert_equal ::Time, op.precise_time_input.class
348
+ refute_equal ::DateTime, op.precise_time_input.class
349
+
350
+ assert_equal 0, op.precise_time_input.utc_offset
351
+ assert_equal 2023, op.precise_time_input.year
352
+ assert_equal 5, op.precise_time_input.month
353
+ assert_equal 5, op.precise_time_input.day
354
+ assert_equal 10, op.precise_time_input.hour
355
+ assert_equal 0, op.precise_time_input.min
356
+ assert_equal 30, op.precise_time_input.sec
357
+ assert_equal 123456, op.precise_time_input.usec
358
+
359
+ op.precise_time_input = '2023-05-05T10:00:30Z'
360
+ assert_equal ::Time, op.precise_time_input.class
361
+ assert_equal 0, op.precise_time_input.utc_offset
362
+ assert_equal 2023, op.precise_time_input.year
363
+ assert_equal 5, op.precise_time_input.month
364
+ assert_equal 5, op.precise_time_input.day
365
+ assert_equal 10, op.precise_time_input.hour
366
+ assert_equal 0, op.precise_time_input.min
367
+ assert_equal 30, op.precise_time_input.sec
368
+ assert_equal 0, op.precise_time_input.usec
369
+
370
+ op.precise_time_input = '2024-11-11T16:42:23.246+0100'
371
+ assert_equal ::Time, op.precise_time_input.class
372
+ assert_equal 3600, op.precise_time_input.utc_offset
373
+ assert_equal 2024, op.precise_time_input.year
374
+ assert_equal 11, op.precise_time_input.month
375
+ assert_equal 11, op.precise_time_input.day
376
+ assert_equal 16, op.precise_time_input.hour
377
+ assert_equal 42, op.precise_time_input.min
378
+ assert_equal 23, op.precise_time_input.sec
379
+ assert_equal 246000, op.precise_time_input.usec
380
+
381
+ time = Time.at(1678741605.123456).utc
382
+ op.precise_time_input = time
383
+ assert_equal time, op.precise_time_input
384
+ assert_equal time.object_id, op.precise_time_input.object_id
385
+ assert_equal 2023, op.precise_time_input.year
386
+ assert_equal 3, op.precise_time_input.month
387
+ assert_equal 13, op.precise_time_input.day
388
+ assert_equal 21, op.precise_time_input.hour
389
+ assert_equal 6, op.precise_time_input.min
390
+ assert_equal 45, op.precise_time_input.sec
391
+ assert_equal 123456, op.precise_time_input.usec
275
392
  end
276
393
 
277
394
  def test_iso_date_inputs
data/test/support/ops.rb CHANGED
@@ -177,6 +177,7 @@ class TypeCastOp < ::Subroutine::Op
177
177
  boolean :boolean_input
178
178
  date :date_input
179
179
  time :time_input, default: -> { Time.now }
180
+ time :precise_time_input, precision: :high
180
181
  iso_date :iso_date_input
181
182
  iso_time :iso_time_input
182
183
  object :object_input
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: subroutine
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Nelson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-05 00:00:00.000000000 Z
11
+ date: 2024-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel