garner 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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.each do |line|
20
- split = line.split(":")
21
- next unless split.length >= 2
22
- path = (Pathname.new(split[0]).realpath.to_s rescue nil)
23
- next if path.blank? || path.include?("lib/garner")
24
- next unless path.include?("/app/") || path.include?("/spec/")
25
- rc[field] = "#{path}:#{split[1]}"
26
- break
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
- key[field] = context[:request].GET.dup if context && context[:request]
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
@@ -1,3 +1,3 @@
1
1
  module Garner
2
- VERSION = '0.3.1'
2
+ VERSION = '0.3.2'
3
3
  end
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.1
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-01-25 00:00:00.000000000 Z
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: '0'
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: '0'
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.6.1
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.6.1
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: '2.10'
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: '2.10'
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: 1.8.3
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: 1.8.3
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: '3.0'
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: '3.0'
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: '2.6'
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: '2.6'
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: -2019166628533219668
283
+ hash: -971041197
283
284
  required_rubygems_version: !ruby/object:Gem::Requirement
284
285
  none: false
285
286
  requirements: