Skip to content

Commit f11d18d

Browse files
authored
Ensure all time zones work for ActiveSupport::TimeWithZone (#35)
* Ensure all time zones work for ActiveSupport::TimeWithZone * Cleanup
1 parent c0ac50b commit f11d18d

File tree

6 files changed

+35
-9
lines changed

6 files changed

+35
-9
lines changed

.standard.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
ignore:
2-
- 'lib/**/*':
3-
- Style/ArgumentsForwarding
1+
ruby_version: 2.7
2+
format: progress
3+
parallel: true

lib/universalid/extensions/active_support/time_with_zone_message_pack_type.rb

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
UniversalID::MessagePackFactory.register(
66
type: ActiveSupport::TimeWithZone,
77
packer: ->(obj, packer) do
8-
packer.write obj.iso8601(9)
9-
packer.write obj.zone
8+
packer.write obj.to_time.utc
9+
packer.write obj.time_zone.tzinfo.identifier
1010
end,
1111
unpacker: ->(unpacker) do
12-
time = Time.parse(unpacker.read)
13-
zone = unpacker.read
14-
ActiveSupport::TimeWithZone.new time, ActiveSupport::TimeZone[zone]
12+
utc = unpacker.read
13+
tz = unpacker.read
14+
utc.in_time_zone ActiveSupport::TimeZone[tz]
1515
end
1616
)
1717

lib/universalid/message_pack_types.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@
1818
require_relative "message_pack_types/ruby/composites/set"
1919

2020
# extensions
21-
Dir["#{__dir__}/extensions/**/*.rb"].each { |f| require f }
21+
Dir["#{__dir__}/extensions/**/*.rb"].sort.each { |f| require f }
2222

2323
UniversalID::MessagePackFactory.create_msgpack_pool

test/test_extension.rb

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
require "minitest/reporters"
1414
require "model_probe"
1515
require "simplecov"
16+
require "timecop"
1617

1718
# MiniTest setup
1819
Minitest.parallel_executor = Minitest::Parallel::Executor.new([Etc.nprocessors, 1].max) # thread count
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# frozen_string_literal: true
2+
3+
class TimeWithZoneTest < Minitest::Test
4+
def test_marshaling_with_universal_id_for_all_active_support_time_zones
5+
month = ActiveSupport::TimeZone["UTC"].now.beginning_of_year
6+
7+
Timecop.freeze time do
8+
11.times do |i|
9+
ActiveSupport::TimeZone.all.each do |time_zone|
10+
time = month.in_time_zone(time_zone).advance(days: rand(1..28), minutes: rand(1..59))
11+
12+
assert time.is_a?(ActiveSupport::TimeWithZone)
13+
14+
uri = URI::UID.build(time).to_s
15+
decoded = URI::UID.parse(uri).decode
16+
17+
assert_equal time, decoded
18+
end
19+
20+
month.advance months: 1
21+
end
22+
end
23+
end
24+
end

universalid.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ Gem::Specification.new do |s|
5252
s.add_development_dependency "simplecov"
5353
s.add_development_dependency "sqlite3"
5454
s.add_development_dependency "standard", ">= 1.32"
55+
s.add_development_dependency "timecop"
5556
end

0 commit comments

Comments
 (0)