Skip to content

Commit 324b546

Browse files
authored
Add support for ActiveSupport::Cache::Store (#38)
1 parent b42fb76 commit 324b546

File tree

5 files changed

+112
-0
lines changed

5 files changed

+112
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ The following extension datatypes ship with Universal ID:
206206

207207
- `ActiveRecord::Base`
208208
- `ActiveRecord::Relation`
209+
- `ActiveSupport::Cache::Entry`
210+
- `ActiveSupport::Cache::Store`
209211
- `ActiveSupport::TimeWithZone`
210212
- `GlobalID`
211213
- `SignedGlobalID`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
if defined? ActiveSupport::Cache::Entry
4+
5+
UniversalID::MessagePackFactory.register(
6+
type: ActiveSupport::Cache::Entry,
7+
packer: ->(obj, packer) do
8+
packer.write obj.value
9+
packer.write obj.version
10+
packer.write obj.expires_at
11+
end,
12+
unpacker: ->(unpacker) do
13+
value = unpacker.read
14+
version = unpacker.read
15+
expires_at = unpacker.read
16+
ActiveSupport::Cache::Entry.new value, version: version, expires_at: expires_at
17+
end
18+
)
19+
20+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
if defined? ActiveSupport::Cache::Store
4+
5+
UniversalID::MessagePackFactory.register(
6+
type: ActiveSupport::Cache::Store,
7+
packer: ->(obj, packer) do
8+
packer.write obj.class.name
9+
packer.write obj.options
10+
packer.write obj.instance_variable_get(:@data)
11+
end,
12+
unpacker: ->(unpacker) do
13+
class_name = unpacker.read
14+
options = unpacker.read
15+
data = unpacker.read
16+
Object.const_get(class_name).new(options).tap do |store|
17+
store.instance_variable_set :@data, data
18+
end
19+
end
20+
)
21+
22+
end

test/test_extension.rb

+21
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,27 @@ def assert_record(expected, actual)
120120
end
121121
end
122122

123+
def assert_active_support_cache_store(expected, actual, data: scalars, expires_in: nil)
124+
refute data.blank?
125+
126+
data.keys.each do |key|
127+
case key
128+
when :nil_class
129+
assert_nil expected.read(key)
130+
assert_nil actual.read(key)
131+
else
132+
assert_equal expected.read(key), actual.read(key)
133+
end
134+
end
135+
136+
sleep expires_in.to_f
137+
138+
data.keys.each do |key|
139+
assert_nil expected.read(key)
140+
assert_nil actual.read(key)
141+
end
142+
end
143+
123144
def self.scalars
124145
@scalars ||= {
125146
bigdecimal: BigDecimal("123.45"),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# frozen_string_literal: true
2+
3+
class UniversalID::Packer::ActiveSupportCacheStoreTest < Minitest::Test
4+
def test_pack_unpack
5+
expected = ActiveSupport::Cache::MemoryStore.new
6+
scalars.each { |key, val| expected.write key, val, expires_in: 1.second }
7+
packed = UniversalID::Packer.pack(expected)
8+
actual = UniversalID::Packer.unpack(packed)
9+
assert_active_support_cache_store expected, actual, expires_in: 1.second
10+
end
11+
end
12+
13+
class UniversalID::Encoder::ActiveSupportCacheStoreTest < Minitest::Test
14+
def test_encode_decode
15+
expected = ActiveSupport::Cache::MemoryStore.new
16+
scalars.each { |key, val| expected.write key, val, expires_in: 1.second }
17+
encoded = UniversalID::Encoder.encode(expected)
18+
actual = UniversalID::Encoder.decode(encoded)
19+
assert_active_support_cache_store expected, actual, expires_in: 1.second
20+
end
21+
end
22+
23+
class URI::UID::ActiveSupportCacheStoreTest < Minitest::Test
24+
def test_build_parse_decode
25+
expected = ActiveSupport::Cache::MemoryStore.new
26+
scalars.each { |key, val| expected.write key, val, expires_in: 1.second }
27+
uri = URI::UID.build(expected).to_s
28+
actual = URI::UID.parse(uri).decode
29+
assert_active_support_cache_store expected, actual, expires_in: 1.second
30+
end
31+
32+
def test_global_id
33+
expected = ActiveSupport::Cache::MemoryStore.new
34+
scalars.each { |key, val| expected.write key, val, expires_in: 1.second }
35+
gid = URI::UID.build(expected).to_gid_param
36+
actual = URI::UID.from_gid(gid).decode
37+
assert_active_support_cache_store expected, actual, expires_in: 1.second
38+
end
39+
40+
def test_signed_global_id
41+
expected = ActiveSupport::Cache::MemoryStore.new
42+
scalars.each { |key, val| expected.write key, val, expires_in: 1.second }
43+
sgid = URI::UID.build(expected).to_sgid_param
44+
actual = URI::UID.from_sgid(sgid).decode
45+
assert_active_support_cache_store expected, actual, expires_in: 1.second
46+
end
47+
end

0 commit comments

Comments
 (0)