subroutine 3.0.2 → 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 +4 -4
- data/lib/subroutine/type_caster.rb +21 -2
- data/lib/subroutine/version.rb +1 -1
- data/test/subroutine/type_caster_test.rb +125 -2
- data/test/support/ops.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb0e95ecb87d3b848cbc99714e68405ead97c7c82b2ea7e80b49925502a15790
|
4
|
+
data.tar.gz: dfdae7d9a7a7b227eb35cecc53334412c0d27259f7b8f3bc5a83cf8e402faebd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0e0f0d68c428bbed21dd09adc7b98890281fc61b69a6a04cebdb34848a8da9db9ff2cdabf9a5257741a5e1d13592cadfe056f3d4fd274fe74aa9bcac830b439
|
7
|
+
data.tar.gz: 046725136d9300e595dcfd0f83fd6fd9b1271b28bdb213bee2f7a9504c8291841c2c35c48abe13d2e0b0eb137698c0c42e553836099dfd5b61c24f51d41c77ff
|
@@ -4,9 +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'
|
9
|
+
require 'active_support/core_ext/object/acts_like'
|
7
10
|
require 'active_support/core_ext/object/blank'
|
8
11
|
require 'active_support/core_ext/object/try'
|
9
12
|
require 'active_support/core_ext/array/wrap'
|
13
|
+
require 'active_support/core_ext/time/acts_like'
|
14
|
+
require 'active_support/core_ext/time/calculations'
|
10
15
|
|
11
16
|
module Subroutine
|
12
17
|
module TypeCaster
|
@@ -115,10 +120,24 @@ end
|
|
115
120
|
::Date.parse(String(value))
|
116
121
|
end
|
117
122
|
|
118
|
-
::Subroutine::TypeCaster.register :time, :timestamp, :datetime do |value,
|
123
|
+
::Subroutine::TypeCaster.register :time, :timestamp, :datetime do |value, options = {}|
|
119
124
|
next nil unless value.present?
|
120
125
|
|
121
|
-
|
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)
|
140
|
+
end
|
122
141
|
end
|
123
142
|
|
124
143
|
::Subroutine::TypeCaster.register :hash, :object, :hashmap, :dict do |value, _options = {}|
|
data/lib/subroutine/version.rb
CHANGED
@@ -241,7 +241,7 @@ module Subroutine
|
|
241
241
|
assert_nil op.date_input
|
242
242
|
end
|
243
243
|
|
244
|
-
def
|
244
|
+
def test_time_inputs__with_seconds_precision
|
245
245
|
op.time_input = nil
|
246
246
|
assert_nil op.time_input
|
247
247
|
|
@@ -256,16 +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 =
|
259
|
+
op.time_input = ::DateTime.new(2022, 12, 22)
|
260
260
|
assert_equal ::Time, op.time_input.class
|
261
261
|
refute_equal ::DateTime, op.time_input.class
|
262
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
|
+
|
271
|
+
op.time_input = '2023-05-05T10:00:30.123456Z'
|
272
|
+
assert_equal ::Time, op.time_input.class
|
273
|
+
refute_equal ::DateTime, op.time_input.class
|
274
|
+
|
275
|
+
assert_equal 0, op.time_input.utc_offset
|
263
276
|
assert_equal 2023, op.time_input.year
|
264
277
|
assert_equal 5, op.time_input.month
|
265
278
|
assert_equal 5, op.time_input.day
|
266
279
|
assert_equal 10, op.time_input.hour
|
267
280
|
assert_equal 0, op.time_input.min
|
268
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
|
287
|
+
assert_equal 2023, op.time_input.year
|
288
|
+
assert_equal 5, op.time_input.month
|
289
|
+
assert_equal 5, op.time_input.day
|
290
|
+
assert_equal 10, op.time_input.hour
|
291
|
+
assert_equal 0, op.time_input.min
|
292
|
+
assert_equal 30, op.time_input.sec
|
293
|
+
assert_equal 0, op.time_input.usec
|
294
|
+
|
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
|
307
|
+
op.time_input = time
|
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
|
269
392
|
end
|
270
393
|
|
271
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.
|
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
|
+
date: 2024-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|