garner 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
- Garner [![Build Status](https://secure.travis-ci.org/dblock/garner.png)](http://travis-ci.org/dblock/garner)
1
+ Garner [![Build Status](https://secure.travis-ci.org/artsy/garner.png)](http://travis-ci.org/artsy/garner)
2
2
  ======
3
3
 
4
4
  Garner is a practical Rack-based cache implementation for RESTful APIs with support for HTTP 304 Not Modified based on time and ETags, model and instance binding and hierarchical invalidation. Garner is currently targeted at [Grape](https://github.com/intridea/grape), other systems may need some work.
5
5
 
6
+ To "garner" means to gather data from various sources and to make it readily available in one place, kind-of like a cache!
7
+
6
8
  Usage
7
9
  -----
8
10
 
@@ -39,7 +41,7 @@ The cached value can also be bound to other models. For example, if a user has a
39
41
 
40
42
  ``` ruby
41
43
  get "/me/address" do
42
- cache_or_304(:bind => [ User, current_user.id ]) do
44
+ cache_or_304({ :bind => [ User, current_user.id ] }) do
43
45
  current_user.address
44
46
  end
45
47
  end
@@ -77,6 +79,44 @@ end
77
79
 
78
80
  Please contribute other invalidation mixins.
79
81
 
82
+ Role-Based Caching
83
+ ------------------
84
+
85
+ Role-Based caching is a subset of the generic problem of binding data to groups of other objects. For example, a `Widget` may have a different representation for an `admin` vs. a `user`. In Garner you can inject something called a "key strategy" into the current key generation pipeline. A strategy is a plain module that must implement two methods: `apply` and `field`. The former applies a strategy to a key within a context and the latter is a unique name that is produced by the strategy.
86
+
87
+ The following example introduces the role of the current user into the cache key.
88
+
89
+ ``` ruby
90
+ module MyApp
91
+ module Garner
92
+ module RoleStrategy
93
+ class << self
94
+ def field
95
+ :role
96
+ end
97
+ def apply(key, context = {})
98
+ key = key ? key.dup : {}
99
+ key[:role] = current_user.role
100
+ key
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ ```
107
+
108
+ Garner key strategies are applied in order and can be currently set at application startup time.
109
+
110
+ ```
111
+ Garner::Cache::ObjectIdentity::KEY_STRATEGIES = [
112
+ Garner::Strategies::Keys::Caller, # support multiple calls from the same function
113
+ MyApp::Garner::RoleStrategy, # custom strategy for role-based access
114
+ Garner::Strategies::Keys::RequestPath # injects the HTTP request's URL
115
+ ]
116
+ ```
117
+
118
+ This method of registration does need improvement, please contribute.
119
+
80
120
  Configuration
81
121
  -------------
82
122
 
@@ -32,16 +32,22 @@ module Garner
32
32
  end
33
33
 
34
34
  def cache_or_304(options = {}, &block)
35
- binding, context = cache_binding_and_context(options)
36
- # metadata written in a previous GET
37
- metadata = Garner::Cache::ObjectIdentity.cache_metadata(binding, context)
38
- error!("Not Modified", 304) if metadata && fresh?(metadata)
39
- rc = cache(options, &block)
40
- # metadata has been generated by cache
41
- metadata = Garner::Cache::ObjectIdentity.cache_metadata(binding, context)
42
- self.last_modified = metadata[:last_modified]
43
- self.etag = metadata[:etag]
44
- rc
35
+ unless cache_enabled?
36
+ yield
37
+ else
38
+ binding, context = cache_binding_and_context(options)
39
+ # metadata written in a previous GET
40
+ metadata = Garner::Cache::ObjectIdentity.cache_metadata(binding, context)
41
+ error!("Not Modified", 304) if metadata && fresh?(metadata)
42
+ rc = cache(options, &block)
43
+ # metadata has been generated by cache
44
+ metadata = Garner::Cache::ObjectIdentity.cache_metadata(binding, context)
45
+ if metadata
46
+ self.last_modified = metadata[:last_modified]
47
+ self.etag = metadata[:etag]
48
+ end
49
+ rc
50
+ end
45
51
  end
46
52
 
47
53
  private
@@ -1,5 +1,5 @@
1
1
  module Garner
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
4
4
 
5
5
 
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.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-06-22 00:00:00.000000000 Z
13
+ date: 2012-06-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
17
- requirement: &70275893494820 !ruby/object:Gem::Requirement
17
+ requirement: &70317016435700 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70275893494820
25
+ version_requirements: *70317016435700
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: json
28
- requirement: &70275893493960 !ruby/object:Gem::Requirement
28
+ requirement: &70317016434120 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70275893493960
36
+ version_requirements: *70317016434120
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: multi_json
39
- requirement: &70275893493440 !ruby/object:Gem::Requirement
39
+ requirement: &70317016432160 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *70275893493440
47
+ version_requirements: *70317016432160
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: activesupport
50
- requirement: &70275893492560 !ruby/object:Gem::Requirement
50
+ requirement: &70317016430400 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70275893492560
58
+ version_requirements: *70317016430400
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: bundler
61
- requirement: &70275893491640 !ruby/object:Gem::Requirement
61
+ requirement: &70317016428340 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70275893491640
69
+ version_requirements: *70317016428340
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: grape
72
- requirement: &70275893490880 !ruby/object:Gem::Requirement
72
+ requirement: &70317016441760 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - =
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 0.2.0
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *70275893490880
80
+ version_requirements: *70317016441760
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: rack-test
83
- requirement: &70275893489940 !ruby/object:Gem::Requirement
83
+ requirement: &70317016438060 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - =
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 0.6.1
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *70275893489940
91
+ version_requirements: *70317016438060
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: rspec
94
- requirement: &70275893489020 !ruby/object:Gem::Requirement
94
+ requirement: &70317016452220 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ~>
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: '2.10'
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *70275893489020
102
+ version_requirements: *70317016452220
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: jeweler
105
- requirement: &70275893503600 !ruby/object:Gem::Requirement
105
+ requirement: &70317016480360 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - =
@@ -110,10 +110,10 @@ dependencies:
110
110
  version: 1.8.3
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *70275893503600
113
+ version_requirements: *70317016480360
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: mongoid
116
- requirement: &70275893502040 !ruby/object:Gem::Requirement
116
+ requirement: &70317016476340 !ruby/object:Gem::Requirement
117
117
  none: false
118
118
  requirements:
119
119
  - - ~>
@@ -121,10 +121,10 @@ dependencies:
121
121
  version: '2.4'
122
122
  type: :development
123
123
  prerelease: false
124
- version_requirements: *70275893502040
124
+ version_requirements: *70317016476340
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bson_ext
127
- requirement: &70275893500500 !ruby/object:Gem::Requirement
127
+ requirement: &70317020028420 !ruby/object:Gem::Requirement
128
128
  none: false
129
129
  requirements:
130
130
  - - ~>
@@ -132,10 +132,10 @@ dependencies:
132
132
  version: '1.6'
133
133
  type: :development
134
134
  prerelease: false
135
- version_requirements: *70275893500500
135
+ version_requirements: *70317020028420
136
136
  - !ruby/object:Gem::Dependency
137
137
  name: yard
138
- requirement: &70275893499420 !ruby/object:Gem::Requirement
138
+ requirement: &70317020022760 !ruby/object:Gem::Requirement
139
139
  none: false
140
140
  requirements:
141
141
  - - ! '>='
@@ -143,10 +143,10 @@ dependencies:
143
143
  version: '0'
144
144
  type: :development
145
145
  prerelease: false
146
- version_requirements: *70275893499420
146
+ version_requirements: *70317020022760
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: redcarpet
149
- requirement: &70275893498780 !ruby/object:Gem::Requirement
149
+ requirement: &70317020102160 !ruby/object:Gem::Requirement
150
150
  none: false
151
151
  requirements:
152
152
  - - ! '>='
@@ -154,10 +154,10 @@ dependencies:
154
154
  version: '0'
155
155
  type: :development
156
156
  prerelease: false
157
- version_requirements: *70275893498780
157
+ version_requirements: *70317020102160
158
158
  - !ruby/object:Gem::Dependency
159
159
  name: github-markup
160
- requirement: &70275893498280 !ruby/object:Gem::Requirement
160
+ requirement: &70317020288700 !ruby/object:Gem::Requirement
161
161
  none: false
162
162
  requirements:
163
163
  - - ! '>='
@@ -165,7 +165,7 @@ dependencies:
165
165
  version: '0'
166
166
  type: :development
167
167
  prerelease: false
168
- version_requirements: *70275893498280
168
+ version_requirements: *70317020288700
169
169
  description: Garner is a set of Rack middleware and cache helpers that implement various
170
170
  strategies.
171
171
  email: dblock@dblock.org
@@ -206,7 +206,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
206
206
  version: '0'
207
207
  segments:
208
208
  - 0
209
- hash: 3544902871771726004
209
+ hash: 1217542249029147985
210
210
  required_rubygems_version: !ruby/object:Gem::Requirement
211
211
  none: false
212
212
  requirements: