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 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: