garner 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +17 -0
- data/lib/garner/cache/object_identity.rb +4 -3
- data/lib/garner/mixins/mongoid_document.rb +2 -0
- data/lib/garner/strategies/keys/caller_strategy.rb +12 -8
- data/lib/garner/strategies/keys/request_get_strategy.rb +3 -1
- data/lib/garner/strategies/keys/request_post_strategy.rb +24 -0
- data/lib/garner/version.rb +1 -1
- data/lib/garner.rb +1 -0
- metadata +28 -27
data/README.md
CHANGED
@@ -142,6 +142,7 @@ Available Key Strategies
|
|
142
142
|
* `Garner::Strategies::Keys::Version` inserts the output of a `version` method, when available, primarily targeted at API implementations.
|
143
143
|
* `Garner::Strategies::Keys::Key` inserts the value of `:key` within the requested context, useful to explicitly declare an element of a cache key.
|
144
144
|
* `Garner::Strategies::Keys::RequestGet` inserts the value of HTTP request's GET parameters into the cache key when `:request` is present in the context.
|
145
|
+
* `Garner::Strategies::Keys::RequestPost` inserts the value of HTTP request's POST parameters into the cache key when `:request` is present in the context.
|
145
146
|
* `Garner::Strategies::Keys::RequestPath` inserts the value of the HTTP request's path into the cache key when `:request` is present in the context.
|
146
147
|
|
147
148
|
Fetching Objects Directly from Cache
|
@@ -156,6 +157,22 @@ Garner::Cache::ObjectIdentity.cache({ bind: [ Model, { id: object_id }] }) do
|
|
156
157
|
end
|
157
158
|
```
|
158
159
|
|
160
|
+
When fetching directly from the cache, it may be useful to supply a generational cache key in addition to the bindings. (When the generational component changes, the cache result is invalidated independent of the bindings' state.) E.g.:
|
161
|
+
|
162
|
+
```ruby
|
163
|
+
Garner::Cache::ObjectIdentity.cache(bind: [Model, {id: object_id}], key: {v: '1'}) do
|
164
|
+
# ...
|
165
|
+
end
|
166
|
+
```
|
167
|
+
|
168
|
+
Or, using the Grape mix-in:
|
169
|
+
|
170
|
+
```ruby
|
171
|
+
cache_or_304(bind: [User, current_user.id], key: {v: '1'}) do
|
172
|
+
# ...
|
173
|
+
end
|
174
|
+
```
|
175
|
+
|
159
176
|
Various cache stores, including Memcached, support bulk read operations. The [Dalli gem](https://github.com/mperham/dalli) exposes this via the `read_multi` method. When invoked with a collection of bindings, Garner will call `read_multi` if available. This may significantly reduce the number of network roundtrips to the cache servers.
|
160
177
|
|
161
178
|
``` ruby
|
@@ -38,7 +38,8 @@ module Garner
|
|
38
38
|
Garner::Strategies::Keys::Caller,
|
39
39
|
Garner::Strategies::Keys::Version,
|
40
40
|
Garner::Strategies::Keys::RequestPath,
|
41
|
-
Garner::Strategies::Keys::RequestGet
|
41
|
+
Garner::Strategies::Keys::RequestGet,
|
42
|
+
Garner::Strategies::Keys::RequestPost
|
42
43
|
]
|
43
44
|
|
44
45
|
CACHE_STRATEGIES = [
|
@@ -65,7 +66,7 @@ module Garner
|
|
65
66
|
end
|
66
67
|
# attempt to do a read_multi if the cache supports it
|
67
68
|
read_multi = keys.size > 1 && Garner.config.cache.respond_to?(:read_multi)
|
68
|
-
local_cache = read_multi ? Garner.config.cache.read_multi(keys) : {}
|
69
|
+
local_cache = read_multi ? Garner.config.cache.read_multi(*keys) : {}
|
69
70
|
# fetch all missing values
|
70
71
|
bindings.each_with_index.map do |binding, index|
|
71
72
|
key = keys[index]
|
@@ -164,7 +165,7 @@ module Garner
|
|
164
165
|
find_or_create_key_prefix_for(el[:klass], el[:object])
|
165
166
|
}.join(",") + ":" +
|
166
167
|
Digest::MD5.hexdigest(
|
167
|
-
KEY_STRATEGIES.map { |strategy| context[strategy.field] }.compact.join("\n")
|
168
|
+
KEY_STRATEGIES.map { |strategy| context[strategy.field] }.uniq.compact.join("\n")
|
168
169
|
)
|
169
170
|
end
|
170
171
|
|
@@ -32,8 +32,10 @@ module Garner
|
|
32
32
|
obj = self
|
33
33
|
docs = []
|
34
34
|
while obj.metadata && obj.embedded?
|
35
|
+
# FIXME: This is not a robust check for cycles
|
35
36
|
break if docs.detect { |doc| doc.class == obj.class }
|
36
37
|
parent = obj.send(obj.metadata.inverse)
|
38
|
+
break unless parent
|
37
39
|
docs << parent
|
38
40
|
obj = parent
|
39
41
|
end
|
@@ -16,15 +16,19 @@ module Garner
|
|
16
16
|
return rc
|
17
17
|
end
|
18
18
|
|
19
|
-
caller
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
19
|
+
if caller
|
20
|
+
caller.each do |line|
|
21
|
+
next unless line
|
22
|
+
split = line.split(":")
|
23
|
+
next unless split && split.length >= 2
|
24
|
+
path = (Pathname.new(split[0]).realpath.to_s rescue nil)
|
25
|
+
next if (! path) || path.empty? || path.include?("lib/garner")
|
26
|
+
next unless path.include?("/app/") || path.include?("/spec/")
|
27
|
+
rc[field] = "#{path}:#{split[1]}"
|
28
|
+
break
|
29
|
+
end
|
27
30
|
end
|
31
|
+
|
28
32
|
rc
|
29
33
|
end
|
30
34
|
end
|
@@ -11,7 +11,9 @@ module Garner
|
|
11
11
|
|
12
12
|
def apply(key, context = {})
|
13
13
|
key = key ? key.dup : {}
|
14
|
-
|
14
|
+
if context && (request = context[:request]) && [ "GET", "HEAD" ].include?(request.request_method)
|
15
|
+
key[field] = context[:request].GET.dup
|
16
|
+
end
|
15
17
|
key
|
16
18
|
end
|
17
19
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Garner
|
2
|
+
module Strategies
|
3
|
+
module Keys
|
4
|
+
# Inject the request POST parameters into the key.
|
5
|
+
module RequestPost
|
6
|
+
class << self
|
7
|
+
|
8
|
+
def field
|
9
|
+
:params
|
10
|
+
end
|
11
|
+
|
12
|
+
def apply(key, context = {})
|
13
|
+
key = key ? key.dup : {}
|
14
|
+
if context && (request = context[:request]) && request.request_method == "POST"
|
15
|
+
key[field] = request.POST.dup
|
16
|
+
end
|
17
|
+
key
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/garner/version.rb
CHANGED
data/lib/garner.rb
CHANGED
@@ -11,6 +11,7 @@ require 'garner/strategies/keys/version_strategy'
|
|
11
11
|
require 'garner/strategies/keys/caller_strategy'
|
12
12
|
require 'garner/strategies/keys/request_path_strategy'
|
13
13
|
require 'garner/strategies/keys/request_get_strategy'
|
14
|
+
require 'garner/strategies/keys/request_post_strategy'
|
14
15
|
require 'garner/strategies/keys/key_strategy'
|
15
16
|
require 'garner/strategies/keys/jsonp_strategy'
|
16
17
|
# etag strategies
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-05-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -83,7 +83,7 @@ dependencies:
|
|
83
83
|
requirements:
|
84
84
|
- - ! '>='
|
85
85
|
- !ruby/object:Gem::Version
|
86
|
-
version:
|
86
|
+
version: 1.3.0
|
87
87
|
type: :development
|
88
88
|
prerelease: false
|
89
89
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -91,13 +91,13 @@ dependencies:
|
|
91
91
|
requirements:
|
92
92
|
- - ! '>='
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: 1.3.0
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
name: grape
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
98
98
|
none: false
|
99
99
|
requirements:
|
100
|
-
- - '
|
100
|
+
- - ! '>='
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: 0.2.0
|
103
103
|
type: :development
|
@@ -105,7 +105,7 @@ dependencies:
|
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
108
|
-
- - '
|
108
|
+
- - ! '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.2.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
@@ -113,81 +113,81 @@ dependencies:
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
none: false
|
115
115
|
requirements:
|
116
|
-
- - '
|
116
|
+
- - ! '>='
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version: 0
|
118
|
+
version: '0'
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
none: false
|
123
123
|
requirements:
|
124
|
-
- - '
|
124
|
+
- - ! '>='
|
125
125
|
- !ruby/object:Gem::Version
|
126
|
-
version: 0
|
126
|
+
version: '0'
|
127
127
|
- !ruby/object:Gem::Dependency
|
128
128
|
name: rspec
|
129
129
|
requirement: !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|
132
|
-
- -
|
132
|
+
- - ! '>='
|
133
133
|
- !ruby/object:Gem::Version
|
134
|
-
version:
|
134
|
+
version: 2.10.0
|
135
135
|
type: :development
|
136
136
|
prerelease: false
|
137
137
|
version_requirements: !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
|
-
- -
|
140
|
+
- - ! '>='
|
141
141
|
- !ruby/object:Gem::Version
|
142
|
-
version:
|
142
|
+
version: 2.10.0
|
143
143
|
- !ruby/object:Gem::Dependency
|
144
144
|
name: jeweler
|
145
145
|
requirement: !ruby/object:Gem::Requirement
|
146
146
|
none: false
|
147
147
|
requirements:
|
148
|
-
- - '
|
148
|
+
- - ! '>='
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version:
|
150
|
+
version: '0'
|
151
151
|
type: :development
|
152
152
|
prerelease: false
|
153
153
|
version_requirements: !ruby/object:Gem::Requirement
|
154
154
|
none: false
|
155
155
|
requirements:
|
156
|
-
- - '
|
156
|
+
- - ! '>='
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
158
|
+
version: '0'
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
160
|
name: mongoid
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
162
162
|
none: false
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - ! '>='
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
166
|
+
version: 3.0.0
|
167
167
|
type: :development
|
168
168
|
prerelease: false
|
169
169
|
version_requirements: !ruby/object:Gem::Requirement
|
170
170
|
none: false
|
171
171
|
requirements:
|
172
|
-
- -
|
172
|
+
- - ! '>='
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
174
|
+
version: 3.0.0
|
175
175
|
- !ruby/object:Gem::Dependency
|
176
176
|
name: dalli
|
177
177
|
requirement: !ruby/object:Gem::Requirement
|
178
178
|
none: false
|
179
179
|
requirements:
|
180
|
-
- -
|
180
|
+
- - ! '>='
|
181
181
|
- !ruby/object:Gem::Version
|
182
|
-
version: '
|
182
|
+
version: '0'
|
183
183
|
type: :development
|
184
184
|
prerelease: false
|
185
185
|
version_requirements: !ruby/object:Gem::Requirement
|
186
186
|
none: false
|
187
187
|
requirements:
|
188
|
-
- -
|
188
|
+
- - ! '>='
|
189
189
|
- !ruby/object:Gem::Version
|
190
|
-
version: '
|
190
|
+
version: '0'
|
191
191
|
- !ruby/object:Gem::Dependency
|
192
192
|
name: yard
|
193
193
|
requirement: !ruby/object:Gem::Requirement
|
@@ -260,6 +260,7 @@ files:
|
|
260
260
|
- lib/garner/strategies/keys/key_strategy.rb
|
261
261
|
- lib/garner/strategies/keys/request_get_strategy.rb
|
262
262
|
- lib/garner/strategies/keys/request_path_strategy.rb
|
263
|
+
- lib/garner/strategies/keys/request_post_strategy.rb
|
263
264
|
- lib/garner/strategies/keys/version_strategy.rb
|
264
265
|
- lib/garner/version.rb
|
265
266
|
- LICENSE.md
|
@@ -279,7 +280,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
279
280
|
version: '0'
|
280
281
|
segments:
|
281
282
|
- 0
|
282
|
-
hash: -
|
283
|
+
hash: -971041197
|
283
284
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
284
285
|
none: false
|
285
286
|
requirements:
|