identity_cache 0.4.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +5 -5
  2. data/.github/probots.yml +2 -0
  3. data/.github/workflows/ci.yml +92 -0
  4. data/.gitignore +2 -0
  5. data/.rubocop.yml +5 -0
  6. data/CAVEATS.md +25 -0
  7. data/CHANGELOG.md +73 -19
  8. data/Gemfile +5 -1
  9. data/LICENSE +1 -1
  10. data/README.md +49 -27
  11. data/Rakefile +14 -5
  12. data/dev.yml +12 -16
  13. data/gemfiles/Gemfile.latest-release +8 -0
  14. data/gemfiles/Gemfile.min-supported +7 -0
  15. data/gemfiles/Gemfile.rails-edge +7 -0
  16. data/identity_cache.gemspec +29 -10
  17. data/lib/identity_cache.rb +78 -51
  18. data/lib/identity_cache/belongs_to_caching.rb +12 -40
  19. data/lib/identity_cache/cache_fetcher.rb +6 -5
  20. data/lib/identity_cache/cache_hash.rb +2 -2
  21. data/lib/identity_cache/cache_invalidation.rb +4 -11
  22. data/lib/identity_cache/cache_key_generation.rb +17 -65
  23. data/lib/identity_cache/cache_key_loader.rb +128 -0
  24. data/lib/identity_cache/cached.rb +7 -0
  25. data/lib/identity_cache/cached/association.rb +87 -0
  26. data/lib/identity_cache/cached/attribute.rb +123 -0
  27. data/lib/identity_cache/cached/attribute_by_multi.rb +37 -0
  28. data/lib/identity_cache/cached/attribute_by_one.rb +88 -0
  29. data/lib/identity_cache/cached/belongs_to.rb +100 -0
  30. data/lib/identity_cache/cached/embedded_fetching.rb +41 -0
  31. data/lib/identity_cache/cached/prefetcher.rb +61 -0
  32. data/lib/identity_cache/cached/primary_index.rb +96 -0
  33. data/lib/identity_cache/cached/recursive/association.rb +109 -0
  34. data/lib/identity_cache/cached/recursive/has_many.rb +9 -0
  35. data/lib/identity_cache/cached/recursive/has_one.rb +9 -0
  36. data/lib/identity_cache/cached/reference/association.rb +16 -0
  37. data/lib/identity_cache/cached/reference/has_many.rb +105 -0
  38. data/lib/identity_cache/cached/reference/has_one.rb +100 -0
  39. data/lib/identity_cache/configuration_dsl.rb +53 -215
  40. data/lib/identity_cache/encoder.rb +95 -0
  41. data/lib/identity_cache/expiry_hook.rb +36 -0
  42. data/lib/identity_cache/fallback_fetcher.rb +2 -1
  43. data/lib/identity_cache/load_strategy/eager.rb +28 -0
  44. data/lib/identity_cache/load_strategy/lazy.rb +71 -0
  45. data/lib/identity_cache/load_strategy/load_request.rb +20 -0
  46. data/lib/identity_cache/load_strategy/multi_load_request.rb +27 -0
  47. data/lib/identity_cache/mem_cache_store_cas.rb +53 -0
  48. data/lib/identity_cache/memoized_cache_proxy.rb +137 -58
  49. data/lib/identity_cache/parent_model_expiration.rb +46 -11
  50. data/lib/identity_cache/query_api.rb +102 -408
  51. data/lib/identity_cache/railtie.rb +8 -0
  52. data/lib/identity_cache/record_not_found.rb +6 -0
  53. data/lib/identity_cache/should_use_cache.rb +1 -0
  54. data/lib/identity_cache/version.rb +3 -2
  55. data/lib/identity_cache/with_primary_index.rb +136 -0
  56. data/lib/identity_cache/without_primary_index.rb +24 -3
  57. data/performance/cache_runner.rb +25 -73
  58. data/performance/cpu.rb +4 -3
  59. data/performance/externals.rb +4 -3
  60. data/performance/profile.rb +6 -5
  61. data/railgun.yml +16 -0
  62. metadata +60 -73
  63. data/.travis.yml +0 -30
  64. data/Gemfile.rails42 +0 -6
  65. data/Gemfile.rails50 +0 -6
  66. data/test/attribute_cache_test.rb +0 -110
  67. data/test/cache_fetch_includes_test.rb +0 -46
  68. data/test/cache_hash_test.rb +0 -14
  69. data/test/cache_invalidation_test.rb +0 -139
  70. data/test/deeply_nested_associated_record_test.rb +0 -19
  71. data/test/denormalized_has_many_test.rb +0 -211
  72. data/test/denormalized_has_one_test.rb +0 -160
  73. data/test/fetch_multi_test.rb +0 -308
  74. data/test/fetch_test.rb +0 -258
  75. data/test/fixtures/serialized_record.mysql2 +0 -0
  76. data/test/fixtures/serialized_record.postgresql +0 -0
  77. data/test/helpers/active_record_objects.rb +0 -106
  78. data/test/helpers/database_connection.rb +0 -72
  79. data/test/helpers/serialization_format.rb +0 -42
  80. data/test/helpers/update_serialization_format.rb +0 -24
  81. data/test/identity_cache_test.rb +0 -29
  82. data/test/index_cache_test.rb +0 -161
  83. data/test/memoized_attributes_test.rb +0 -49
  84. data/test/memoized_cache_proxy_test.rb +0 -107
  85. data/test/normalized_belongs_to_test.rb +0 -107
  86. data/test/normalized_has_many_test.rb +0 -231
  87. data/test/normalized_has_one_test.rb +0 -9
  88. data/test/prefetch_associations_test.rb +0 -364
  89. data/test/readonly_test.rb +0 -109
  90. data/test/recursive_denormalized_has_many_test.rb +0 -131
  91. data/test/save_test.rb +0 -82
  92. data/test/schema_change_test.rb +0 -112
  93. data/test/serialization_format_change_test.rb +0 -16
  94. data/test/test_helper.rb +0 -140
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: identity_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Camilo Lopez
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2017-02-02 00:00:00.000000000 Z
17
+ date: 2021-01-08 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: ar_transaction_changes
@@ -22,28 +22,28 @@ dependencies:
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '1.0'
25
+ version: '1.1'
26
26
  type: :runtime
27
27
  prerelease: false
28
28
  version_requirements: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '1.0'
32
+ version: '1.1'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: activerecord
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 4.2.0
39
+ version: '5.2'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 4.2.0
46
+ version: '5.2'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: memcached
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: 1.0.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: dalli
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: rake
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -184,24 +198,28 @@ dependencies:
184
198
  - - ">="
185
199
  - !ruby/object:Gem::Version
186
200
  version: '0'
187
- description: Opt in read through ActiveRecord caching.
201
+ description: Opt-in read through Active Record caching.
188
202
  email:
189
203
  - gems@shopify.com
190
204
  executables: []
191
205
  extensions: []
192
206
  extra_rdoc_files: []
193
207
  files:
208
+ - ".github/probots.yml"
209
+ - ".github/workflows/ci.yml"
194
210
  - ".gitignore"
195
- - ".travis.yml"
211
+ - ".rubocop.yml"
212
+ - CAVEATS.md
196
213
  - CHANGELOG.md
197
214
  - CONTRIBUTING.md
198
215
  - Gemfile
199
- - Gemfile.rails42
200
- - Gemfile.rails50
201
216
  - LICENSE
202
217
  - README.md
203
218
  - Rakefile
204
219
  - dev.yml
220
+ - gemfiles/Gemfile.latest-release
221
+ - gemfiles/Gemfile.min-supported
222
+ - gemfiles/Gemfile.rails-edge
205
223
  - identity_cache.gemspec
206
224
  - lib/identity_cache.rb
207
225
  - lib/identity_cache/belongs_to_caching.rb
@@ -209,51 +227,50 @@ files:
209
227
  - lib/identity_cache/cache_hash.rb
210
228
  - lib/identity_cache/cache_invalidation.rb
211
229
  - lib/identity_cache/cache_key_generation.rb
230
+ - lib/identity_cache/cache_key_loader.rb
231
+ - lib/identity_cache/cached.rb
232
+ - lib/identity_cache/cached/association.rb
233
+ - lib/identity_cache/cached/attribute.rb
234
+ - lib/identity_cache/cached/attribute_by_multi.rb
235
+ - lib/identity_cache/cached/attribute_by_one.rb
236
+ - lib/identity_cache/cached/belongs_to.rb
237
+ - lib/identity_cache/cached/embedded_fetching.rb
238
+ - lib/identity_cache/cached/prefetcher.rb
239
+ - lib/identity_cache/cached/primary_index.rb
240
+ - lib/identity_cache/cached/recursive/association.rb
241
+ - lib/identity_cache/cached/recursive/has_many.rb
242
+ - lib/identity_cache/cached/recursive/has_one.rb
243
+ - lib/identity_cache/cached/reference/association.rb
244
+ - lib/identity_cache/cached/reference/has_many.rb
245
+ - lib/identity_cache/cached/reference/has_one.rb
212
246
  - lib/identity_cache/configuration_dsl.rb
247
+ - lib/identity_cache/encoder.rb
248
+ - lib/identity_cache/expiry_hook.rb
213
249
  - lib/identity_cache/fallback_fetcher.rb
250
+ - lib/identity_cache/load_strategy/eager.rb
251
+ - lib/identity_cache/load_strategy/lazy.rb
252
+ - lib/identity_cache/load_strategy/load_request.rb
253
+ - lib/identity_cache/load_strategy/multi_load_request.rb
254
+ - lib/identity_cache/mem_cache_store_cas.rb
214
255
  - lib/identity_cache/memoized_cache_proxy.rb
215
256
  - lib/identity_cache/parent_model_expiration.rb
216
257
  - lib/identity_cache/query_api.rb
258
+ - lib/identity_cache/railtie.rb
259
+ - lib/identity_cache/record_not_found.rb
217
260
  - lib/identity_cache/should_use_cache.rb
218
261
  - lib/identity_cache/version.rb
262
+ - lib/identity_cache/with_primary_index.rb
219
263
  - lib/identity_cache/without_primary_index.rb
220
264
  - performance/cache_runner.rb
221
265
  - performance/cpu.rb
222
266
  - performance/externals.rb
223
267
  - performance/profile.rb
268
+ - railgun.yml
224
269
  - shipit.rubygems.yml
225
- - test/attribute_cache_test.rb
226
- - test/cache_fetch_includes_test.rb
227
- - test/cache_hash_test.rb
228
- - test/cache_invalidation_test.rb
229
- - test/deeply_nested_associated_record_test.rb
230
- - test/denormalized_has_many_test.rb
231
- - test/denormalized_has_one_test.rb
232
- - test/fetch_multi_test.rb
233
- - test/fetch_test.rb
234
- - test/fixtures/serialized_record.mysql2
235
- - test/fixtures/serialized_record.postgresql
236
- - test/helpers/active_record_objects.rb
237
- - test/helpers/database_connection.rb
238
- - test/helpers/serialization_format.rb
239
- - test/helpers/update_serialization_format.rb
240
- - test/identity_cache_test.rb
241
- - test/index_cache_test.rb
242
- - test/memoized_attributes_test.rb
243
- - test/memoized_cache_proxy_test.rb
244
- - test/normalized_belongs_to_test.rb
245
- - test/normalized_has_many_test.rb
246
- - test/normalized_has_one_test.rb
247
- - test/prefetch_associations_test.rb
248
- - test/readonly_test.rb
249
- - test/recursive_denormalized_has_many_test.rb
250
- - test/save_test.rb
251
- - test/schema_change_test.rb
252
- - test/serialization_format_change_test.rb
253
- - test/test_helper.rb
254
270
  homepage: https://github.com/Shopify/identity_cache
255
271
  licenses: []
256
- metadata: {}
272
+ metadata:
273
+ allowed_push_host: https://rubygems.org
257
274
  post_install_message:
258
275
  rdoc_options: []
259
276
  require_paths:
@@ -262,48 +279,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
262
279
  requirements:
263
280
  - - ">="
264
281
  - !ruby/object:Gem::Version
265
- version: 2.2.0
282
+ version: 2.5.0
266
283
  required_rubygems_version: !ruby/object:Gem::Requirement
267
284
  requirements:
268
285
  - - ">="
269
286
  - !ruby/object:Gem::Version
270
287
  version: '0'
271
288
  requirements: []
272
- rubyforge_project:
273
- rubygems_version: 2.5.1
289
+ rubygems_version: 3.0.3
274
290
  signing_key:
275
291
  specification_version: 4
276
292
  summary: IdentityCache lets you specify how you want to cache your model objects,
277
293
  at the model level, and adds a number of convenience methods for accessing those
278
294
  objects through the cache. Memcached is used as the backend cache store, and the
279
295
  database is only hit when a copy of the object cannot be found in Memcached.
280
- test_files:
281
- - test/attribute_cache_test.rb
282
- - test/cache_fetch_includes_test.rb
283
- - test/cache_hash_test.rb
284
- - test/cache_invalidation_test.rb
285
- - test/deeply_nested_associated_record_test.rb
286
- - test/denormalized_has_many_test.rb
287
- - test/denormalized_has_one_test.rb
288
- - test/fetch_multi_test.rb
289
- - test/fetch_test.rb
290
- - test/fixtures/serialized_record.mysql2
291
- - test/fixtures/serialized_record.postgresql
292
- - test/helpers/active_record_objects.rb
293
- - test/helpers/database_connection.rb
294
- - test/helpers/serialization_format.rb
295
- - test/helpers/update_serialization_format.rb
296
- - test/identity_cache_test.rb
297
- - test/index_cache_test.rb
298
- - test/memoized_attributes_test.rb
299
- - test/memoized_cache_proxy_test.rb
300
- - test/normalized_belongs_to_test.rb
301
- - test/normalized_has_many_test.rb
302
- - test/normalized_has_one_test.rb
303
- - test/prefetch_associations_test.rb
304
- - test/readonly_test.rb
305
- - test/recursive_denormalized_has_many_test.rb
306
- - test/save_test.rb
307
- - test/schema_change_test.rb
308
- - test/serialization_format_change_test.rb
309
- - test/test_helper.rb
296
+ test_files: []
@@ -1,30 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - '2.2.6'
5
- - '2.3.3'
6
-
7
- gemfile:
8
- - Gemfile.rails42
9
- - Gemfile.rails50
10
-
11
- matrix:
12
- exclude:
13
- - gemfile: Gemfile.rails50
14
- env: DB=postgresql
15
-
16
- env:
17
- - DB=mysql2
18
- - DB=postgresql
19
-
20
- services:
21
- - memcache
22
- - mysql
23
-
24
- sudo: false
25
-
26
- before_script:
27
- - mysql -e 'create database identity_cache_test'
28
- - psql -c 'create database identity_cache_test;' -U postgres
29
-
30
- cache: bundler
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
3
-
4
- gem 'activerecord', '~> 4.2.0'
5
- gem 'activesupport', '~> 4.2.0'
6
- gem 'mysql2', '~> 0.3.13'
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
3
-
4
- gem 'activerecord', '~> 5.0.0'
5
- gem 'activesupport', '~> 5.0.0'
6
- gem 'mysql2', '>= 0.3.18', '< 0.5'
@@ -1,110 +0,0 @@
1
- require "test_helper"
2
-
3
- class AttributeCacheTest < IdentityCache::TestCase
4
- NAMESPACE = IdentityCache::CacheKeyGeneration::DEFAULT_NAMESPACE
5
-
6
- def setup
7
- super
8
- AssociatedRecord.cache_attribute :name
9
-
10
- @parent = Item.create!(:title => 'bob')
11
- @record = @parent.associated_records.create!(:name => 'foo')
12
- @name_attribute_key = "#{NAMESPACE}attr:AssociatedRecord:name:id:#{cache_hash(@record.id.to_s)}"
13
- IdentityCache.cache.clear
14
- end
15
-
16
- def test_attribute_values_are_fetched_and_returned_on_cache_misses
17
- fetch = Spy.on(IdentityCache.cache, :fetch).and_call_through
18
-
19
- assert_queries(1) do
20
- assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1)
21
- end
22
- assert fetch.has_been_called_with?(@name_attribute_key)
23
- end
24
-
25
- def test_attribute_values_are_returned_on_cache_hits
26
- assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1)
27
-
28
- assert_queries(0) do
29
- assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1)
30
- end
31
- end
32
-
33
- def test_nil_is_stored_in_the_cache_on_cache_misses
34
- assert_nil AssociatedRecord.fetch_name_by_id(2)
35
-
36
- assert_queries(0) do
37
- assert_nil AssociatedRecord.fetch_name_by_id(2)
38
- end
39
- end
40
-
41
- def test_cached_attribute_values_are_expired_from_the_cache_when_an_existing_record_is_saved
42
- assert_queries(1) { assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1) }
43
- assert_queries(0) { assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1) }
44
-
45
- @record.save!
46
-
47
- assert_queries(1) { assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1) }
48
- end
49
-
50
- def test_cached_attribute_values_are_expired_from_the_cache_when_an_existing_record_with_changed_attributes_is_saved
51
- assert_queries(1) { assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1) }
52
- assert_queries(0) { assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1) }
53
-
54
- @record.name = 'bar'
55
- @record.save!
56
-
57
- assert_queries(1) { assert_equal 'bar', AssociatedRecord.fetch_name_by_id(1) }
58
- end
59
-
60
- def test_cached_attribute_values_are_expired_from_the_cache_when_an_existing_record_is_destroyed
61
- assert_queries(1) { assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1) }
62
- assert_queries(0) { assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1) }
63
-
64
- @record.destroy
65
-
66
- assert_queries(1) { assert_nil AssociatedRecord.fetch_name_by_id(1) }
67
- end
68
-
69
- def test_cached_attribute_values_are_expired_from_the_cache_when_a_new_record_is_saved
70
- new_id = 2
71
- assert_queries(1) { assert_nil AssociatedRecord.fetch_name_by_id(new_id) }
72
- assert_queries(0) { assert_nil AssociatedRecord.fetch_name_by_id(new_id) }
73
-
74
- @parent.associated_records.create(:name => 'bar')
75
-
76
- assert_queries(1) { assert_equal 'bar', AssociatedRecord.fetch_name_by_id(new_id) }
77
- end
78
-
79
- def test_fetching_by_attribute_delegates_to_block_if_transactions_are_open
80
- IdentityCache.cache.expects(:read).never
81
-
82
- @record.transaction do
83
- assert_queries(1) do
84
- assert_equal 'foo', AssociatedRecord.fetch_name_by_id(1)
85
- end
86
- end
87
- end
88
-
89
- def test_previously_stored_cached_nils_are_busted_by_new_record_saves
90
- assert_nil AssociatedRecord.fetch_name_by_id(2)
91
- AssociatedRecord.create(:name => "Jim")
92
- assert_equal "Jim", AssociatedRecord.fetch_name_by_id(2)
93
- end
94
-
95
- def test_cache_attribute_on_derived_model_raises
96
- assert_raises(IdentityCache::DerivedModelError) do
97
- StiRecordTypeA.cache_attribute :name
98
- end
99
- end
100
-
101
- def test_cache_attribute_respects_should_use_cache
102
- AssociatedRecord.stubs(:should_use_cache?).returns(false)
103
-
104
- assert_queries(1) do
105
- assert_memcache_operations(0) do
106
- AssociatedRecord.fetch_name_by_id(@record.id)
107
- end
108
- end
109
- end
110
- end
@@ -1,46 +0,0 @@
1
- require "test_helper"
2
-
3
- class CacheFetchIncludesTest < IdentityCache::TestCase
4
- def setup
5
- super
6
- end
7
-
8
- def test_cached_embedded_has_manys_are_included_in_includes
9
- Item.send(:cache_has_many, :associated_records, :embed => true)
10
- assert_equal [:associated_records], Item.send(:cache_fetch_includes)
11
- end
12
-
13
- def test_cached_nonembedded_has_manys_are_included_in_includes
14
- Item.send(:cache_has_many, :associated_records, :embed => :ids)
15
- assert_equal [], Item.send(:cache_fetch_includes)
16
- end
17
-
18
- def test_cached_has_ones_are_included_in_includes
19
- Item.send(:cache_has_one, :associated)
20
- assert_equal [:associated], Item.send(:cache_fetch_includes)
21
- end
22
-
23
- def test_cached_nonembedded_belongs_tos_are_not_included_in_includes
24
- Item.send(:cache_belongs_to, :item)
25
- assert_equal [], Item.send(:cache_fetch_includes)
26
- end
27
-
28
- def test_cached_child_associations_are_included_in_includes
29
- Item.send(:cache_has_many, :associated_records, :embed => true)
30
- AssociatedRecord.send(:cache_has_many, :deeply_associated_records, :embed => true)
31
- assert_equal [{:associated_records => [:deeply_associated_records]}], Item.send(:cache_fetch_includes)
32
- end
33
-
34
- def test_multiple_cached_associations_and_child_associations_are_included_in_includes
35
- Item.send(:cache_has_many, :associated_records, :embed => true)
36
- PolymorphicRecord.send(:include, IdentityCache::WithoutPrimaryIndex)
37
- Item.send(:cache_has_many, :polymorphic_records, {:inverse_name => :owner, :embed => true})
38
- Item.send(:cache_has_one, :associated, :embed => true)
39
- AssociatedRecord.send(:cache_has_many, :deeply_associated_records, :embed => true)
40
- assert_equal [
41
- {:associated_records => [:deeply_associated_records]},
42
- :polymorphic_records,
43
- {:associated => [:deeply_associated_records]}
44
- ], Item.send(:cache_fetch_includes)
45
- end
46
- end
@@ -1,14 +0,0 @@
1
- require 'test_helper'
2
-
3
- class CacheHashTest < IdentityCache::TestCase
4
-
5
- def test_memcache_hash
6
- 3.times do
7
- random_str = Array.new(200){rand(36).to_s(36)}.join
8
- hash_val = IdentityCache.memcache_hash(random_str)
9
- assert hash_val
10
- assert_kind_of Numeric, hash_val
11
- assert_equal 0, (hash_val >> 64)
12
- end
13
- end
14
- end