lock_and_cache 2.2.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +6 -0
- data/README.md +1 -0
- data/lib/lock_and_cache/key.rb +29 -4
- data/lib/lock_and_cache/version.rb +1 -1
- data/spec/lock_and_cache_spec.rb +60 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90b85cb8a2f2d566cbf6cd7a69375ee6772206c8
|
4
|
+
data.tar.gz: fae5041a751ce3617604de792c8f0cc6400919d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b54fa87634f6e9378eec8ab209eed851a41bd1e13e5cc10af293b80d0d68b217cd46ddbf496cbe49e959ec6f6dc100f582201e8ca316940eb0b6ad2db8b880c5
|
7
|
+
data.tar.gz: 1002dc77996ab481d8d150261cde2d7b8e9afc08640edad85ca5171ba7f6b5ac6d1dfcfbb249c956b67e13ef2813f48b88c04e69c07196cef84898e567800480
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -215,6 +215,7 @@ You can expire nil values with a different timeout (`nil_expires`) than other va
|
|
215
215
|
## Wishlist
|
216
216
|
|
217
217
|
* Convert most tests to use standalone mode, which is easier to understand
|
218
|
+
* Make explicit Key unit tests
|
218
219
|
* Check options
|
219
220
|
* Lengthen heartbeat so it's not so sensitive
|
220
221
|
* Clarify which options are seconds or milliseconds
|
data/lib/lock_and_cache/key.rb
CHANGED
@@ -17,21 +17,38 @@ module LockAndCache
|
|
17
17
|
def extract_class_name(context)
|
18
18
|
(context.class == ::Class) ? context.name : context.class.name
|
19
19
|
end
|
20
|
+
|
21
|
+
# @private
|
22
|
+
#
|
23
|
+
# Extract id from context. Calls #lock_and_cache_key if available, otherwise #id
|
24
|
+
def extract_context_id(context)
|
25
|
+
if context.class == ::Class
|
26
|
+
nil
|
27
|
+
elsif context.respond_to?(:lock_and_cache_key)
|
28
|
+
context.lock_and_cache_key
|
29
|
+
elsif context.respond_to?(:id)
|
30
|
+
context.id
|
31
|
+
else
|
32
|
+
raise "#{context} must respond to #lock_and_cache_key or #id"
|
33
|
+
end
|
34
|
+
end
|
20
35
|
end
|
21
36
|
|
22
37
|
METHOD_NAME_IN_CALLER = /in `([^']+)'/
|
23
38
|
|
39
|
+
attr_reader :context
|
24
40
|
attr_reader :method_id
|
25
|
-
attr_reader :class_name
|
26
41
|
|
27
42
|
def initialize(parts, options = {})
|
28
43
|
@_parts = parts
|
44
|
+
@context = options[:context]
|
29
45
|
@method_id = if options.has_key?(:method_id)
|
30
46
|
options[:method_id]
|
31
47
|
elsif options.has_key?(:caller)
|
32
48
|
Key.extract_method_id_from_caller options[:caller]
|
49
|
+
elsif context
|
50
|
+
raise "supposed to call context with method_id or caller"
|
33
51
|
end
|
34
|
-
@class_name = Key.extract_class_name options[:context] if options.has_key?(:context)
|
35
52
|
end
|
36
53
|
|
37
54
|
# A (non-cryptographic) digest of the key parts for use as the cache key
|
@@ -46,8 +63,8 @@ module LockAndCache
|
|
46
63
|
|
47
64
|
# A human-readable representation of the key parts
|
48
65
|
def key
|
49
|
-
@key ||= if
|
50
|
-
[class_name, method_id, parts]
|
66
|
+
@key ||= if context
|
67
|
+
[class_name, context_id, method_id, parts].compact
|
51
68
|
else
|
52
69
|
parts
|
53
70
|
end
|
@@ -66,6 +83,14 @@ module LockAndCache
|
|
66
83
|
|
67
84
|
alias debug key
|
68
85
|
|
86
|
+
def context_id
|
87
|
+
@context_id ||= Key.extract_context_id context
|
88
|
+
end
|
89
|
+
|
90
|
+
def class_name
|
91
|
+
@class_name ||= Key.extract_class_name context
|
92
|
+
end
|
93
|
+
|
69
94
|
# An array of the parts we use for the key
|
70
95
|
def parts
|
71
96
|
@parts ||= @_parts.map do |v|
|
data/spec/lock_and_cache_spec.rb
CHANGED
@@ -17,6 +17,12 @@ class Foo
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def cached_rand
|
21
|
+
lock_and_cache do
|
22
|
+
rand
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
20
26
|
def click_null
|
21
27
|
lock_and_cache do
|
22
28
|
nil
|
@@ -48,6 +54,32 @@ class Foo
|
|
48
54
|
end
|
49
55
|
end
|
50
56
|
|
57
|
+
class FooId
|
58
|
+
include LockAndCache
|
59
|
+
def click
|
60
|
+
lock_and_cache do
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
def id
|
65
|
+
@id ||= rand
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class FooClass
|
70
|
+
class << self
|
71
|
+
include LockAndCache
|
72
|
+
def click
|
73
|
+
lock_and_cache do
|
74
|
+
nil
|
75
|
+
end
|
76
|
+
end
|
77
|
+
def id
|
78
|
+
raise "called id"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
51
83
|
require 'set'
|
52
84
|
$clicking = Set.new
|
53
85
|
class Bar
|
@@ -152,6 +184,34 @@ describe LockAndCache do
|
|
152
184
|
expect(foo.click_last_hash_as_options).to eq(3)
|
153
185
|
end
|
154
186
|
|
187
|
+
it "calls #lock_and_cache_key" do
|
188
|
+
expect(foo).to receive(:lock_and_cache_key)
|
189
|
+
foo.click
|
190
|
+
end
|
191
|
+
|
192
|
+
it "calls #lock_and_cache_key to differentiate" do
|
193
|
+
a = Foo.new 1
|
194
|
+
b = Foo.new 2
|
195
|
+
expect(a.cached_rand).not_to eq(b.cached_rand)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe 'self-identification in context mode' do
|
200
|
+
it "calls #id for non-class" do
|
201
|
+
foo_id = FooId.new
|
202
|
+
expect(foo_id).to receive(:id)
|
203
|
+
foo_id.click
|
204
|
+
end
|
205
|
+
it "calls class name for non-class" do
|
206
|
+
foo_id = FooId.new
|
207
|
+
expect(FooId).to receive(:name)
|
208
|
+
foo_id.click
|
209
|
+
end
|
210
|
+
it "uses class name for class" do
|
211
|
+
expect(FooClass).to receive(:name)
|
212
|
+
expect(FooClass).not_to receive(:id)
|
213
|
+
FooClass.click
|
214
|
+
end
|
155
215
|
end
|
156
216
|
|
157
217
|
describe "locking" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lock_and_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seamus Abshere
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|