subroutine 3.0.2 → 3.0.4

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: a69ecebbd8549a3067d41ac4d8981d51c175614f4e052b296226cdce3ad15b30
4
- data.tar.gz: e375bae8ee9f1e73ff3eb3128373d50e4cd20af0cf68eaeef16af28688ca2d36
3
+ metadata.gz: fb0e95ecb87d3b848cbc99714e68405ead97c7c82b2ea7e80b49925502a15790
4
+ data.tar.gz: dfdae7d9a7a7b227eb35cecc53334412c0d27259f7b8f3bc5a83cf8e402faebd
5
5
  SHA512:
6
- metadata.gz: bc51e2794c9a41589aec6d47097cc13644f6e9683b5d5e99ce13310dcf07184d23896dd493ab00ddf54dfa648d7b6236a45968318194b8da53ac66663ae28fc7
7
- data.tar.gz: ef4e70f7bf48e180485082f1107b84a9ffbc02037dcc100432435d07d6a634d427ce58546f3010f24723f7e9fbdac52067944fba1294c71078ce11cf30e66488
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, _options = {}|
123
+ ::Subroutine::TypeCaster.register :time, :timestamp, :datetime do |value, options = {}|
119
124
  next nil unless value.present?
120
125
 
121
- ::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)
140
+ end
122
141
  end
123
142
 
124
143
  ::Subroutine::TypeCaster.register :hash, :object, :hashmap, :dict do |value, _options = {}|
@@ -4,7 +4,7 @@ module Subroutine
4
4
 
5
5
  MAJOR = 3
6
6
  MINOR = 0
7
- PATCH = 2
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,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 = '2023-05-05T10:00:30Z'
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.2
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-04-03 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