identity_cache 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +2 -1
- data/CHANGELOG.md +1 -1
- data/Gemfile.rails42 +2 -2
- data/README.md +1 -1
- data/lib/identity_cache/belongs_to_caching.rb +14 -10
- data/lib/identity_cache/cache_key_generation.rb +5 -2
- data/lib/identity_cache/configuration_dsl.rb +24 -16
- data/lib/identity_cache/version.rb +1 -1
- data/lib/identity_cache.rb +1 -0
- data/test/normalized_has_many_test.rb +2 -1
- metadata +4 -26
- checksums.yaml.gz.sig +0 -4
- data.tar.gz.sig +0 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abed676c785bc468fee7349b8e28af469499b78b
|
4
|
+
data.tar.gz: e64ed12cef1b57634416a2d4183313fae2a5f491
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd1e569f94285089975e400da50e183731115c186b538ad822edf0bcb6bdf50c6b152a3b159d4196bb5749cd793f3745b19d744821e96479ba5106a1703d3785
|
7
|
+
data.tar.gz: 45358caea4c1d9ef27a682736cf180cbe982a9ce48946b842c6f788d0cb31c47658ed478f2c056e8e736b71e78dfa9af08abdbc5989e99ef12a96450a0197a3e
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2.2
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile.rails42
CHANGED
data/README.md
CHANGED
@@ -221,4 +221,4 @@ IdentityCache is also very much _opt-in_ by deliberate design. This means Identi
|
|
221
221
|
|
222
222
|
- JRuby will not work with this current version, as we are using the memcached gem internally to interface with memcache.
|
223
223
|
- See CHANGELOG.md for a list of changes to the library over time.
|
224
|
-
- The
|
224
|
+
- The library is MIT licensed and we welcome contributions. See CONTRIBUTING.md for more information.
|
@@ -9,18 +9,22 @@ module IdentityCache
|
|
9
9
|
|
10
10
|
module ClassMethods
|
11
11
|
def cache_belongs_to(association, options = {})
|
12
|
-
|
12
|
+
raise NotImplementedError if options[:embed]
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
options[:foreign_key] ||= reflect_on_association(association).foreign_key
|
17
|
-
options[:association_class] ||= reflect_on_association(association).klass
|
18
|
-
options[:prepopulate_method_name] ||= "prepopulate_fetched_#{association}"
|
19
|
-
if options[:embed]
|
20
|
-
raise NotImplementedError
|
21
|
-
else
|
22
|
-
build_normalized_belongs_to_cache(association, options)
|
14
|
+
unless association_reflection = reflect_on_association(association)
|
15
|
+
raise AssociationError, "Association named '#{association}' was not found on #{self.class}"
|
23
16
|
end
|
17
|
+
|
18
|
+
options = {}
|
19
|
+
self.cached_belongs_tos[association] = options
|
20
|
+
|
21
|
+
options[:embed] = false
|
22
|
+
options[:cached_accessor_name] = "fetch_#{association}"
|
23
|
+
options[:foreign_key] = association_reflection.foreign_key
|
24
|
+
options[:association_class] = association_reflection.klass
|
25
|
+
options[:prepopulate_method_name] = "prepopulate_fetched_#{association}"
|
26
|
+
|
27
|
+
build_normalized_belongs_to_cache(association, options)
|
24
28
|
end
|
25
29
|
|
26
30
|
def build_normalized_belongs_to_cache(association, options)
|
@@ -24,12 +24,15 @@ module IdentityCache
|
|
24
24
|
|
25
25
|
module ClassMethods
|
26
26
|
def rails_cache_key(id)
|
27
|
-
"#{
|
27
|
+
"#{prefixed_rails_cache_key}#{id}"
|
28
28
|
end
|
29
29
|
|
30
30
|
def rails_cache_key_prefix
|
31
31
|
@rails_cache_key_prefix ||= IdentityCache::CacheKeyGeneration.denormalized_schema_hash(self)
|
32
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
def prefixed_rails_cache_key
|
35
|
+
"#{rails_cache_key_namespace}blob:#{base_class.name}:#{rails_cache_key_prefix}:"
|
33
36
|
end
|
34
37
|
|
35
38
|
def rails_cache_index_key_for_fields_and_values(fields, values)
|
@@ -94,10 +94,13 @@ module IdentityCache
|
|
94
94
|
# * inverse_name: The name of the parent in the association if the name is
|
95
95
|
# not the lowercase pluralization of the parent object's class
|
96
96
|
def cache_has_many(association, options = {})
|
97
|
+
options = options.slice(:embed, :inverse_name)
|
97
98
|
options[:embed] = :ids unless options.has_key?(:embed)
|
98
99
|
deprecate_embed_option(options, false, :ids)
|
99
100
|
options[:inverse_name] ||= self.name.underscore.to_sym
|
100
|
-
|
101
|
+
unless self.reflect_on_association(association)
|
102
|
+
raise AssociationError, "Association named '#{association}' was not found on #{self.class}"
|
103
|
+
end
|
101
104
|
self.cached_has_manys[association] = options
|
102
105
|
|
103
106
|
case options[:embed]
|
@@ -132,9 +135,12 @@ module IdentityCache
|
|
132
135
|
# necessary if the name is not the lowercase pluralization of the
|
133
136
|
# parent object's class)
|
134
137
|
def cache_has_one(association, options = {})
|
138
|
+
options = options.slice(:embed, :inverse_name)
|
135
139
|
options[:embed] = true unless options.has_key?(:embed)
|
136
140
|
options[:inverse_name] ||= self.name.underscore.to_sym
|
137
|
-
|
141
|
+
unless self.reflect_on_association(association)
|
142
|
+
raise AssociationError, "Association named '#{association}' was not found on #{self.class}"
|
143
|
+
end
|
138
144
|
self.cached_has_ones[association] = options
|
139
145
|
|
140
146
|
if options[:embed] == true
|
@@ -201,10 +207,10 @@ module IdentityCache
|
|
201
207
|
end
|
202
208
|
|
203
209
|
def build_recursive_association_cache(association, options) #:nodoc:
|
204
|
-
options[:association_class]
|
205
|
-
options[:cached_accessor_name]
|
206
|
-
options[:records_variable_name]
|
207
|
-
options[:population_method_name]
|
210
|
+
options[:association_class] = reflect_on_association(association).klass
|
211
|
+
options[:cached_accessor_name] = "fetch_#{association}"
|
212
|
+
options[:records_variable_name] = "cached_#{association}"
|
213
|
+
options[:population_method_name] = "populate_#{association}_cache"
|
208
214
|
|
209
215
|
|
210
216
|
unless instance_methods.include?(options[:cached_accessor_name].to_sym)
|
@@ -218,20 +224,21 @@ module IdentityCache
|
|
218
224
|
end
|
219
225
|
CODE
|
220
226
|
|
221
|
-
|
227
|
+
options[:only_on_foreign_key_change] = false
|
228
|
+
add_parent_expiry_hook(options)
|
222
229
|
end
|
223
230
|
end
|
224
231
|
|
225
232
|
def build_id_embedded_has_many_cache(association, options) #:nodoc:
|
226
233
|
singular_association = association.to_s.singularize
|
227
|
-
options[:association_class]
|
228
|
-
options[:cached_accessor_name]
|
229
|
-
options[:ids_name]
|
230
|
-
options[:cached_ids_name]
|
231
|
-
options[:ids_variable_name]
|
232
|
-
options[:records_variable_name]
|
233
|
-
options[:population_method_name]
|
234
|
-
options[:prepopulate_method_name]
|
234
|
+
options[:association_class] = reflect_on_association(association).klass
|
235
|
+
options[:cached_accessor_name] = "fetch_#{association}"
|
236
|
+
options[:ids_name] = "#{singular_association}_ids"
|
237
|
+
options[:cached_ids_name] = "fetch_#{options[:ids_name]}"
|
238
|
+
options[:ids_variable_name] = "cached_#{options[:ids_name]}"
|
239
|
+
options[:records_variable_name] = "cached_#{association}"
|
240
|
+
options[:population_method_name] = "populate_#{association}_cache"
|
241
|
+
options[:prepopulate_method_name] = "prepopulate_fetched_#{association}"
|
235
242
|
|
236
243
|
self.class_eval(<<-CODE, __FILE__, __LINE__ + 1)
|
237
244
|
attr_reader :#{options[:ids_variable_name]}
|
@@ -260,7 +267,8 @@ module IdentityCache
|
|
260
267
|
end
|
261
268
|
CODE
|
262
269
|
|
263
|
-
|
270
|
+
options[:only_on_foreign_key_change] = true
|
271
|
+
add_parent_expiry_hook(options)
|
264
272
|
end
|
265
273
|
|
266
274
|
def attribute_dynamic_fetcher(attribute, fields, values) #:nodoc:
|
data/lib/identity_cache.rb
CHANGED
@@ -21,6 +21,7 @@ module IdentityCache
|
|
21
21
|
DELETED_TTL = 1000
|
22
22
|
|
23
23
|
class AlreadyIncludedError < StandardError; end
|
24
|
+
class AssociationError < StandardError; end
|
24
25
|
class InverseAssociationError < StandardError
|
25
26
|
def initialize
|
26
27
|
super "Inverse name for association could not be determined. Please use the :inverse_name option to specify the inverse association name for this cache."
|
@@ -147,7 +147,8 @@ class NormalizedHasManyTest < IdentityCache::TestCase
|
|
147
147
|
|
148
148
|
def test_saving_child_with_touch_true_on_parent_expires_parent
|
149
149
|
IdentityCache.cache.expects(:delete).with(@record.primary_cache_index_key).once
|
150
|
-
@not_cached.
|
150
|
+
@not_cached.name = 'Changed'
|
151
|
+
@not_cached.save!
|
151
152
|
end
|
152
153
|
|
153
154
|
end
|
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.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Camilo Lopez
|
@@ -13,30 +13,8 @@ authors:
|
|
13
13
|
- Francis Bogsanyi
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
|
-
cert_chain:
|
17
|
-
-
|
18
|
-
-----BEGIN CERTIFICATE-----
|
19
|
-
MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ8wDQYDVQQDDAZhZG1p
|
20
|
-
bnMxFzAVBgoJkiaJk/IsZAEZFgdzaG9waWZ5MRMwEQYKCZImiZPyLGQBGRYDY29t
|
21
|
-
MB4XDTE0MDUxNTIwMzM0OFoXDTE1MDUxNTIwMzM0OFowPzEPMA0GA1UEAwwGYWRt
|
22
|
-
aW5zMRcwFQYKCZImiZPyLGQBGRYHc2hvcGlmeTETMBEGCgmSJomT8ixkARkWA2Nv
|
23
|
-
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL0/81O3e1vh5smcwp2G
|
24
|
-
MpLQ6q0kejQLa65bPYPxdzWA1SYOKyGfw+yR9LdFzsuKpwWzKq6zX35lj1IckWS4
|
25
|
-
bNBEQzxmufUxU0XPM02haFB8fOfDJzdXsWte9Ge4IFwahwn68gpMqN+BvxL+KMYz
|
26
|
-
Iut9YmN44d4LZdsENEIO5vmybuG2vYDz7R56qB0PA+Q2P2CdhymsBad2DQs69FBo
|
27
|
-
uico9V6VMYYctL9lCYdzu9IXrOYNTt88suKIVzzAlHOKeN0Ng5qdztFoTR8sfxDr
|
28
|
-
Ydg3KHl5n47wlpgd8R0f/4b5gGxW+v9pyJCgQnLlRu7DedVSvv7+GMtj3g9r3nhJ
|
29
|
-
KqECAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFI/o
|
30
|
-
maf34HXbUOQsdoLHacEKQgunMB0GA1UdEQQWMBSBEmFkbWluc0BzaG9waWZ5LmNv
|
31
|
-
bTAdBgNVHRIEFjAUgRJhZG1pbnNAc2hvcGlmeS5jb20wDQYJKoZIhvcNAQEFBQAD
|
32
|
-
ggEBADkK9aj5T0HPExsov4EoMWFnO+G7RQ28C30VAfKxnL2UxG6i4XMHVs6Xi94h
|
33
|
-
qXFw1ec9Y2eDUqaolT3bviOk9BB197+A8Vz/k7MC6ci2NE+yDDB7HAC8zU6LAx8Y
|
34
|
-
Iqvw7B/PSZ/pz4bUVFlTATif4mi1vO3lidRkdHRtM7UePSn2rUpOi0gtXBP3bLu5
|
35
|
-
YjHJN7wx5cugMEyroKITG5gL0Nxtu21qtOlHX4Hc4KdE2JqzCPOsS4zsZGhgwhPs
|
36
|
-
fl3hbtVFTqbOlwL9vy1fudXcolIE/ZTcxQ+er07ZFZdKCXayR9PPs64heamfn0fp
|
37
|
-
TConQSX2BnZdhIEYW+cKzEC/bLc=
|
38
|
-
-----END CERTIFICATE-----
|
39
|
-
date: 2015-01-06 00:00:00.000000000 Z
|
16
|
+
cert_chain: []
|
17
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
40
18
|
dependencies:
|
41
19
|
- !ruby/object:Gem::Dependency
|
42
20
|
name: ar_transaction_changes
|
@@ -289,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
289
267
|
version: '0'
|
290
268
|
requirements: []
|
291
269
|
rubyforge_project:
|
292
|
-
rubygems_version: 2.
|
270
|
+
rubygems_version: 2.4.5
|
293
271
|
signing_key:
|
294
272
|
specification_version: 4
|
295
273
|
summary: IdentityCache lets you specify how you want to cache your model objects,
|
checksums.yaml.gz.sig
DELETED
data.tar.gz.sig
DELETED
metadata.gz.sig
DELETED
Binary file
|