subroutine 3.0.4 → 3.0.5

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: fb0e95ecb87d3b848cbc99714e68405ead97c7c82b2ea7e80b49925502a15790
4
- data.tar.gz: dfdae7d9a7a7b227eb35cecc53334412c0d27259f7b8f3bc5a83cf8e402faebd
3
+ metadata.gz: e7441c613353cda046900b7165d787576d3cb757943496fb7b4ccc65a9f5faf1
4
+ data.tar.gz: b154f7ab48dc32c391be450bc684ee34d59451d6e327d90f463654d53e8f0a55
5
5
  SHA512:
6
- metadata.gz: b0e0f0d68c428bbed21dd09adc7b98890281fc61b69a6a04cebdb34848a8da9db9ff2cdabf9a5257741a5e1d13592cadfe056f3d4fd274fe74aa9bcac830b439
7
- data.tar.gz: 046725136d9300e595dcfd0f83fd6fd9b1271b28bdb213bee2f7a9504c8291841c2c35c48abe13d2e0b0eb137698c0c42e553836099dfd5b61c24f51d41c77ff
6
+ metadata.gz: 9da5a1f35f9888ebc970e23c60e53871258d837767b6baf3597fb216c64eca039171d993f4abc8c02627b678623e47df35defe5a79799a6c166ff7aebc2cb712
7
+ data.tar.gz: 5df7cc84df8ec5b19f60f9101fb66abeee95b578b474d956d378857132a60881a039c55ddecc4b8e6405b1ef9c95fb69f5b3d2d3ffc3fd5cb02bdce0aba8da4d
@@ -4,6 +4,8 @@ require 'date'
4
4
  require 'time'
5
5
  require 'bigdecimal'
6
6
  require 'securerandom'
7
+ require 'active_support'
8
+ require 'active_support/json'
7
9
  require 'active_support/core_ext/date_time/acts_like'
8
10
  require 'active_support/core_ext/date_time/calculations'
9
11
  require 'active_support/core_ext/object/acts_like'
@@ -111,7 +113,7 @@ end
111
113
  t ||= value if value.is_a?(::Time)
112
114
  t ||= value if value.try(:acts_like?, :time)
113
115
  t ||= ::Time.parse(String(value))
114
- t.utc.iso8601
116
+ t.utc.iso8601(::ActiveSupport::JSON::Encoding.time_precision)
115
117
  end
116
118
 
117
119
  ::Subroutine::TypeCaster.register :date do |value, _options = {}|
@@ -123,21 +125,16 @@ end
123
125
  ::Subroutine::TypeCaster.register :time, :timestamp, :datetime do |value, options = {}|
124
126
  next nil unless value.present?
125
127
 
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)
128
+ value = if value.try(:acts_like?, :time)
129
+ value.to_time
130
+ else
131
+ ::Time.parse(String(value))
140
132
  end
133
+
134
+ # High precision must be opted into. The original implementation is to set usec:0
135
+ next value if options[:precision] == :high || ::Subroutine.preserve_time_precision?
136
+
137
+ value.change(usec: 0)
141
138
  end
142
139
 
143
140
  ::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 = 4
7
+ PATCH = 5
8
8
  PRE = nil
9
9
 
10
10
  VERSION = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
data/lib/subroutine.rb CHANGED
@@ -3,3 +3,17 @@
3
3
  require "subroutine/version"
4
4
  require "subroutine/fields"
5
5
  require "subroutine/op"
6
+
7
+ module Subroutine
8
+
9
+ def self.preserve_time_precision=(bool)
10
+ @preserve_time_precision = !!bool
11
+ end
12
+
13
+ def self.preserve_time_precision?
14
+ return !!@preserve_time_precision if defined?(@preserve_time_precision)
15
+
16
+ false
17
+ end
18
+
19
+ end
@@ -316,6 +316,20 @@ module Subroutine
316
316
  assert_equal 0, op.time_input.usec
317
317
  end
318
318
 
319
+ def test_time_inputs__with_preserve_time_precision
320
+ Subroutine.stubs(:preserve_time_precision?).returns(true)
321
+
322
+ time = Time.at(1678741605.123456).utc
323
+ op.time_input = time
324
+ assert_equal 2023, op.time_input.year
325
+ assert_equal 3, op.time_input.month
326
+ assert_equal 13, op.time_input.day
327
+ assert_equal 21, op.time_input.hour
328
+ assert_equal 6, op.time_input.min
329
+ assert_equal 45, op.time_input.sec
330
+ assert_equal 123456, op.time_input.usec
331
+ end
332
+
319
333
  def test_time_inputs__with_high_precision
320
334
  op.precise_time_input = nil
321
335
  assert_nil op.precise_time_input
@@ -410,11 +424,11 @@ module Subroutine
410
424
 
411
425
  op.iso_time_input = '2022-12-22T10:30:24Z'
412
426
  assert_equal ::String, op.iso_time_input.class
413
- assert_equal '2022-12-22T10:30:24Z', op.iso_time_input
427
+ assert_equal '2022-12-22T10:30:24.000Z', op.iso_time_input
414
428
 
415
- op.iso_time_input = Time.parse('2022-12-22T10:30:24Z')
429
+ op.iso_time_input = Time.parse('2022-12-22T10:30:24.123456Z')
416
430
  assert_equal ::String, op.iso_time_input.class
417
- assert_equal '2022-12-22T10:30:24Z', op.iso_time_input
431
+ assert_equal '2022-12-22T10:30:24.123Z', op.iso_time_input
418
432
  end
419
433
 
420
434
  def test_file_inputs
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
4
+ version: 3.0.5
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-11 00:00:00.000000000 Z
11
+ date: 2024-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel