garner 0.4.5 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +35 -0
- data/.travis.yml +13 -0
- data/CHANGELOG.md +130 -0
- data/CONTRIBUTING.md +118 -0
- data/Gemfile +3 -0
- data/README.md +1 -0
- data/Rakefile +39 -0
- data/UPGRADING.md +118 -0
- data/garner.gemspec +44 -0
- data/lib/garner.rb +21 -21
- data/lib/garner/cache.rb +13 -6
- data/lib/garner/cache/binding.rb +6 -14
- data/lib/garner/cache/context.rb +11 -12
- data/lib/garner/cache/identity.rb +1 -1
- data/lib/garner/config.rb +12 -7
- data/lib/garner/mixins/active_record.rb +3 -3
- data/lib/garner/mixins/active_record/base.rb +2 -2
- data/lib/garner/mixins/mongoid.rb +4 -4
- data/lib/garner/mixins/mongoid/document.rb +8 -12
- data/lib/garner/mixins/mongoid/identity.rb +5 -6
- data/lib/garner/mixins/rack.rb +1 -2
- data/lib/garner/strategies/binding/invalidation/base.rb +2 -4
- data/lib/garner/strategies/binding/invalidation/binding_index.rb +1 -3
- data/lib/garner/strategies/binding/invalidation/touch.rb +0 -2
- data/lib/garner/strategies/binding/key/base.rb +1 -3
- data/lib/garner/strategies/binding/key/binding_index.rb +3 -4
- data/lib/garner/strategies/binding/key/cache_key.rb +0 -2
- data/lib/garner/strategies/binding/key/safe_cache_key.rb +2 -3
- data/lib/garner/strategies/context/key/base.rb +1 -3
- data/lib/garner/strategies/context/key/caller.rb +9 -12
- data/lib/garner/strategies/context/key/jsonp.rb +3 -6
- data/lib/garner/strategies/context/key/request_get.rb +2 -4
- data/lib/garner/strategies/context/key/request_path.rb +1 -3
- data/lib/garner/strategies/context/key/request_post.rb +2 -4
- data/lib/garner/version.rb +1 -1
- data/spec/garner/cache/context_spec.rb +38 -0
- data/spec/garner/cache/identity_spec.rb +68 -0
- data/spec/garner/cache_spec.rb +49 -0
- data/spec/garner/config_spec.rb +17 -0
- data/spec/garner/mixins/mongoid/document_spec.rb +80 -0
- data/spec/garner/mixins/mongoid/identity_spec.rb +140 -0
- data/spec/garner/mixins/rack_spec.rb +48 -0
- data/spec/garner/strategies/binding/invalidation/binding_index_spec.rb +14 -0
- data/spec/garner/strategies/binding/invalidation/touch_spec.rb +23 -0
- data/spec/garner/strategies/binding/key/binding_index_spec.rb +245 -0
- data/spec/garner/strategies/binding/key/cache_key_spec.rb +29 -0
- data/spec/garner/strategies/binding/key/safe_cache_key_spec.rb +61 -0
- data/spec/garner/strategies/context/key/caller_spec.rb +106 -0
- data/spec/garner/strategies/context/key/jsonp_spec.rb +22 -0
- data/spec/garner/strategies/context/key/request_get_spec.rb +33 -0
- data/spec/garner/strategies/context/key/request_path_spec.rb +28 -0
- data/spec/garner/strategies/context/key/request_post_spec.rb +34 -0
- data/spec/garner/version_spec.rb +11 -0
- data/spec/integration/active_record_spec.rb +43 -0
- data/spec/integration/grape_spec.rb +33 -0
- data/spec/integration/mongoid_spec.rb +355 -0
- data/spec/integration/rack_spec.rb +77 -0
- data/spec/integration/sinatra_spec.rb +29 -0
- data/spec/performance/strategy_benchmark.rb +59 -0
- data/spec/performance/support/benchmark_context.rb +31 -0
- data/spec/performance/support/benchmark_context_wrapper.rb +67 -0
- data/spec/shared/binding_invalidation_strategy.rb +17 -0
- data/spec/shared/binding_key_strategy.rb +35 -0
- data/spec/shared/conditional_get.rb +48 -0
- data/spec/shared/context_key_strategy.rb +24 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/spec_support.rb +5 -0
- data/spec/support/active_record.rb +36 -0
- data/spec/support/cache.rb +15 -0
- data/spec/support/garner.rb +5 -0
- data/spec/support/mongoid.rb +71 -0
- metadata +155 -157
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9a593ed7c69343123cf6aa7152da17d9403455cc
|
4
|
+
data.tar.gz: 2c93f44ef0551b09a947a54dd1dcdaac8145dac4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f1448f9b7506742c5ceaae135f9e193080e76350366ed9e62cde64c7dd47f0dd7064a934dad934e6ae722823f64c5044da92899d6934c57924e29b9836ce3d21
|
7
|
+
data.tar.gz: 61ffea9d8c44c86e5fae7f5db352c0fa83880e6e8d317533e81953d5c36ded5beec5802d5846916fbcbc1f9f243898646e4c0f32aad163a002671a9f53eba837
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- vendor/**/*
|
4
|
+
|
5
|
+
LineLength:
|
6
|
+
Enabled: false
|
7
|
+
|
8
|
+
MethodLength:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
ClassLength:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
CyclomaticComplexity:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Documentation:
|
18
|
+
# don't require classes to be documented
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Encoding:
|
22
|
+
# no need to always specify encoding
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
DoubleNegation:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
RaiseArgs:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
RescueModifier:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
ModuleFunction:
|
35
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
0.5.0 (7/17/2014)
|
2
|
+
-----------------
|
3
|
+
|
4
|
+
* [#70](https://github.com/artsy/garner/pull/70): Added a `whiny_nils` configuration variable (default: `true`) which determines whether Garner raises exceptions on `nil` bindings - [@fancyremarker](https://github.com/fancyremarker).
|
5
|
+
* [#72](https://github.com/artsy/garner/issues/72): Fix: ActiveRecord 4 support, `cache_key` is now in `:nsec` format - [@dblock](https://github.com/dblock).
|
6
|
+
* [#74](https://github.com/artsy/garner/pull/74): Removed Jeweler, rewritten .gemspec - [@dblock](https://github.com/dblock).
|
7
|
+
* [#76](https://github.com/artsy/garner/pull/76): Added Rubocop, Ruby-style linter - [@dblock](https://github.com/dblock).
|
8
|
+
* [#77](https://github.com/artsy/garner/pull/77): Running tests on Ruby 2.0, 2.1.2, Rubinius and JRuby - [@dblock](https://github.com/dblock).
|
9
|
+
|
10
|
+
0.4.5 (10/15/2013)
|
11
|
+
------------------
|
12
|
+
|
13
|
+
* Fixed [#62](https://github.com/artsy/garner/issues/62): fix garnered_find in `Garner::Mixins::Mongoid::Document.garnered_find` to support finding multiple objects, matching Mongoid's find - [@mzikherman](https://github.com/mzikherman).
|
14
|
+
* Fixed [#60](https://github.com/artsy/garner/issues/60): don't return cache keys for Mongoid::Document#identify(nil) - [@fancyremarker](https://github.com/fancyremarker).
|
15
|
+
|
16
|
+
0.4.4 (7/11/2013)
|
17
|
+
-----------------
|
18
|
+
|
19
|
+
* Fixed [#47](https://github.com/artsy/garner/issues/47): use a database index when generating proxy binding in `Garner::Mixins::Mongoid::Identity` with multiple `Garner.config.mongoid_identity_fields` - [@dblock](https://github.com/dblock).
|
20
|
+
|
21
|
+
0.4.3 (7/5/2013)
|
22
|
+
----------------
|
23
|
+
|
24
|
+
* Stored `ruby_context` from which a `Garner::Cache::Identity` was initialized as an `attr_accessor` on the object - [@fancyremarker](https://github.com/fancyremarker).
|
25
|
+
* Fixed `cache_enabled?` logic and added a `nocache` declaration to `Garner::Cache::Identity` - [@fancyremarker](https://github.com/fancyremarker).
|
26
|
+
* Fixed #44, in which the BindingIndex was mistakenly storing values to cache for bindings with a nil canonical binding - [@fancyremarker](https://github.com/fancyremarker).
|
27
|
+
* Added `Garner.config.invalidate_mongoid_root` option, to always invalidate the root document when an embedded document is invalidated - [@fancyremarker](https://github.com/fancyremarker).
|
28
|
+
|
29
|
+
0.4.2 (6/28/2013)
|
30
|
+
-----------------
|
31
|
+
|
32
|
+
* Fixed `Caller` strategy when using Rails - [@fancyremarker](https://github.com/fancyremarker).
|
33
|
+
|
34
|
+
0.4.1 (6/28/2013)
|
35
|
+
-----------------
|
36
|
+
|
37
|
+
* Added a `rake benchmark` task to compare different binding key/invalidation strategy pairs - [@fancyremarker](https://github.com/fancyremarker).
|
38
|
+
* Improved the performance of the `SafeCacheKey` strategy on virtual `Garner::Mixins::Mongoid::Identity` bindings by properly memoizing the corresponding document - [@fancyremarker](https://github.com/fancyremarker).
|
39
|
+
* Improved the performance of the `SafeCacheKey` strategy on class bindings by making 1 database call per key application, instead of 3 - [@fancyremarker](https://github.com/fancyremarker).
|
40
|
+
* Removed the `Garner.config.mongoid_binding_key_strategy` and `Garner.config.mongoid_invalidation_key_strategy`. Garner now uses just one default key/invalidation strategy pair for all binding types - [@fancyremarker](https://github.com/fancyremarker).
|
41
|
+
* Added an ActiveRecord mixin, `Garner::Mixins::ActiveRecord::Base`, per #35 - [@fancyremarker](https://github.com/fancyremarker).
|
42
|
+
* Eliminated the need to `require "garner/mixins/rack"` before declaring `Garner.config.rack_context_key_strategies`, per #35 - [@fancyremarker](https://github.com/fancyremarker).
|
43
|
+
* Fixed a bug in binding to classes via the `SafeCacheKey` and `Touch` strategy pair, where class-bound results would not be invalidated when an instance of the class was destroyed - [@fancyremarker](https://github.com/fancyremarker).
|
44
|
+
* Added `BindingIndex` binding key/invalidation strategy pair, which uses a two-level lookup for computing cache keys - [@fancyremarker](https://github.com/fancyremarker).
|
45
|
+
|
46
|
+
0.4.0 (6/14/2013)
|
47
|
+
-----------------
|
48
|
+
|
49
|
+
* Complete rewrite of Garner. See [UPGRADING](UPGRADING.md) for details on how to upgrade from Garner 0.3.3 and earlier versions - [@fancyremarker](https://github.com/fancyremarker).
|
50
|
+
* Fixed #6: Garner fails if Mongoid not loaded yet - [@fancyremarker](https://github.com/fancyremarker).
|
51
|
+
* Closed #12: Support arrays in `Garner.config.mongoid_identity_fields`- [@fancyremarker](https://github.com/fancyremarker).
|
52
|
+
* Closed #13: Replace faulty multiple-identity logic- [@fancyremarker](https://github.com/fancyremarker).
|
53
|
+
* Fixed #14: Disambiguate binding models by `:id` and `:slug`- [@fancyremarker](https://github.com/fancyremarker).
|
54
|
+
* Fixed #15: Remove need for `cache_as` from subclassed Mongoid models - [@fancyremarker](https://github.com/fancyremarker).
|
55
|
+
* Closed #23: Abstract all Grape mixins to be more generically Rack mixins - [@fancyremarker](https://github.com/fancyremarker).
|
56
|
+
* Closed #24: Implement `garnered_find` method for `Mongoid::Document` classes - [@fancyremarker](https://github.com/fancyremarker).
|
57
|
+
* Extracted `Binding`, `Context` and `Identity` as explicit classes from `ObjectIdentity` - [@fancyremarker](https://github.com/fancyremarker).
|
58
|
+
* Added support for all ActiveModel-compliant ORMs - [@fancyremarker](https://github.com/fancyremarker).
|
59
|
+
* Removed HTTP caching responsibilities from the library entirely - [@fancyremarker](https://github.com/fancyremarker).
|
60
|
+
* Introduced a `SafeCacheKey` binding key strategy, which appends subsecond precision to cache keys, to make them usable - [@fancyremarker](https://github.com/fancyremarker).
|
61
|
+
* Added a `cache_key` implementation at the class level in Mongoid, which returns the `cache_key` of the most recently updated document in the collection (by `:updated_at`) - [@fancyremarker](https://github.com/fancyremarker).
|
62
|
+
* Fixed #29: Restrict the filename string used for the `Caller` context key strategy to just the portion of the path relevant to the current app. In a Rails app, this defaults to Rails.root; otherwise we search for the nearest ancestor directory containing a Gemfile - [@fancyremarker](https://github.com/fancyremarker).
|
63
|
+
|
64
|
+
0.3.3 (6/10/2013)
|
65
|
+
-----------------
|
66
|
+
|
67
|
+
* Fix: parent documents are properly invalidated on creation of an embedded document - [@fancyremarker](https://github.com/fancyremarker).
|
68
|
+
|
69
|
+
0.3.2 (5/16/2013)
|
70
|
+
-----------------
|
71
|
+
|
72
|
+
* Fix: calling `invalidate` on an embedded document in an `embeds_many` relationship - [@fancyremarker](https://github.com/fancyremarker).
|
73
|
+
* `Garner::Strategies::Keys::Caller` no longer depends on ActiveSupport - [@oripekelman](https://github.com/oripekelman), [@dblock](https://github.com/dblock).
|
74
|
+
* Added `Garner::Strategies::Keys::RequestPost` for POST parameters - [@oripekelman](https://github.com/oripekelman).
|
75
|
+
|
76
|
+
0.3.1
|
77
|
+
-----
|
78
|
+
|
79
|
+
* Do not attempt to fetch again objects in `Garner::Cache::ObjectIdentity.cache_multi` after they were not retrieved from `read_multi`, write them directly to cache - [@dblock](https://github.com/dblock).
|
80
|
+
|
81
|
+
0.3
|
82
|
+
---
|
83
|
+
|
84
|
+
* Added `Garner::Cache::ObjectIdentity.cache_multi` that can now take an array of bindings to return an array of objects - [@dblock](https://github.com/dblock).
|
85
|
+
* When fetching an array of objects via `Garner::Cache::ObjectIdentity.cache_multi`, Garner will use `read_multi` if provided by the cache store - [@dblock](https://github.com/dblock).
|
86
|
+
|
87
|
+
0.2.1
|
88
|
+
-----
|
89
|
+
|
90
|
+
* Faster invalidation on Mongoid model creation, only invalidate class - [@dblock](https://github.com/dblock).
|
91
|
+
* Invalidate cache after a Mongoid model has been updated or destroyed, not before - [@dblock](https://github.com/dblock).
|
92
|
+
|
93
|
+
0.2
|
94
|
+
---
|
95
|
+
|
96
|
+
* The `Keys::Caller` strategy now allows specifying the caller explicitly by passing a `:caller` as part of the context - [@fancyremarker](https://github.com/fancyremarker).
|
97
|
+
* Fix: `invalidate` no longer writes a new index key for each object binding; instead it only deletes existing index keys - [@fancyremarker](https://github.com/fancyremarker).
|
98
|
+
* Fix: Invoking Garner helper methods from within an IRB session no longer crashes inside the `Keys::Caller` strategy - [@fancyremarker](https://github.com/fancyremarker).
|
99
|
+
|
100
|
+
0.1.3
|
101
|
+
-----
|
102
|
+
|
103
|
+
* Split `Garner::Objects::ETag` into a configurable `Garner::Strategies::ETags` module, making `Garner::Strategies::ETags::GrapeETag` the new default, for better integration with Grape - [@fancyremarker](https://github.com/fancyremarker).
|
104
|
+
* Added `Garner::Strategies::Keys::Key`, that inserts the value of `:key` within the requested context, useful to explicitly declare an element of a cache key - [@dblock](https://github.com/dblock).
|
105
|
+
* Fix: `Garner::Strategies::Keys::Caller` excludes lines with `lib/garner`, workaround for Heroku - [@dblock](https://github.com/dblock).
|
106
|
+
* Only load Grape and Mongoid mixins when necessary - [@billgloff](https://github.com/billgloff).
|
107
|
+
* Fix: Grape API version is properly passed through to key context when using `Garner::Strategies::Keys::Version` - [@fancyremarker](https://github.com/fancyremarker).
|
108
|
+
* Added support for caching responses to JSONP requests, via `Garner::Strategies::Keys::Jsonp` - [@fancyremarker](https://github.com/fancyremarker).
|
109
|
+
|
110
|
+
0.1.2
|
111
|
+
-----
|
112
|
+
|
113
|
+
* Fix: `Garner::Mixins::Grape::Cache` improperly handles `nil` cache hits or `cache_enabled?` returning `false` in `cache_or_304` - [@dblock](https://github.com/dblock).
|
114
|
+
|
115
|
+
0.1.1
|
116
|
+
-----
|
117
|
+
|
118
|
+
* Initial public release at [GoRuCo](http://goruco.com), read the [announcement](http://artsy.github.com/blog/2012/05/30/restful-api-caching-with-garner/).
|
119
|
+
* Grape mixin takes a single parameter, binding and context are extracted from it - [@dblock](https://github.com/dblock).
|
120
|
+
|
121
|
+
0.1
|
122
|
+
---
|
123
|
+
|
124
|
+
* Initial implementation based on [@fancyremarker](https://github.com/fancyremarker)'s original code.
|
125
|
+
* Rack middleware for cache busting, `Garner::Middleware::Cache::Bust` - [@dblock](https://github.com/dblock).
|
126
|
+
* Generating ETags, `Garner::Objects::ETag` - [@dblock](https://github.com/dblock).
|
127
|
+
* `Garner::Cache::ObjectIdentity` cache - [@dblock](https://github.com/dblock).
|
128
|
+
* `Version`, `Caller`, `RequestPath` and `RequestGet` key generation strategies - [@dblock](https://github.com/dblock).
|
129
|
+
* `Expiration` cache strategy - [@dblock](https://github.com/dblock).
|
130
|
+
* [Grape](https://github.com/intridea/grape) and [Mongoid](https://github.com/mongoid/mongoid/) mixins - [@dblock](https://github.com/dblock).
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
Contributing to Garner
|
2
|
+
======================
|
3
|
+
|
4
|
+
Garner is work of [many of contributors](https://github.com/artsy/garner/graphs/contributors). You're encouraged to submit [pull requests](https://github.com/artsy/garner/pulls), [propose features and discuss issues](https://github.com/artsy/garner/issues).
|
5
|
+
|
6
|
+
#### Fork the Project
|
7
|
+
|
8
|
+
Fork the [project on Github](https://github.com/artsy/garner) and check out your copy.
|
9
|
+
|
10
|
+
```
|
11
|
+
git clone https://github.com/contributor/garner.git
|
12
|
+
cd garner
|
13
|
+
git remote add upstream https://github.com/artsy/garner.git
|
14
|
+
```
|
15
|
+
|
16
|
+
#### Create a Topic Branch
|
17
|
+
|
18
|
+
Make sure your fork is up-to-date and create a topic branch for your feature or bug fix.
|
19
|
+
|
20
|
+
```
|
21
|
+
git checkout master
|
22
|
+
git pull upstream master
|
23
|
+
git checkout -b my-feature-branch
|
24
|
+
```
|
25
|
+
|
26
|
+
#### Bundle Install and Test
|
27
|
+
|
28
|
+
Ensure that you can build the project and run tests.
|
29
|
+
|
30
|
+
```
|
31
|
+
bundle install
|
32
|
+
bundle exec rake
|
33
|
+
```
|
34
|
+
|
35
|
+
#### Write Tests
|
36
|
+
|
37
|
+
Try to write a test that reproduces the problem you're trying to fix or describes a feature that you want to build. Add to [spec](spec).
|
38
|
+
|
39
|
+
We definitely appreciate pull requests that highlight or reproduce a problem, even without a fix.
|
40
|
+
|
41
|
+
#### Write Code
|
42
|
+
|
43
|
+
Implement your feature or bug fix.
|
44
|
+
|
45
|
+
Ruby style is enforced with [Rubocop](https://github.com/bbatsov/rubocop), run `bundle exec rubocop` and fix any style issues highlighted.
|
46
|
+
|
47
|
+
Make sure that `bundle exec rake` completes without errors.
|
48
|
+
|
49
|
+
#### Write Documentation
|
50
|
+
|
51
|
+
Document any external behavior in the [README](README.md).
|
52
|
+
|
53
|
+
#### Update Changelog
|
54
|
+
|
55
|
+
Add a line to [CHANGELOG](CHANGELOG.md) under *Next Release*. Make it look like every other line, including your name and link to your Github account.
|
56
|
+
|
57
|
+
#### Commit Changes
|
58
|
+
|
59
|
+
Make sure git knows your name and email address:
|
60
|
+
|
61
|
+
```
|
62
|
+
git config --global user.name "Your Name"
|
63
|
+
git config --global user.email "contributor@example.com"
|
64
|
+
```
|
65
|
+
|
66
|
+
Writing good commit logs is important. A commit log should describe what changed and why.
|
67
|
+
|
68
|
+
```
|
69
|
+
git add ...
|
70
|
+
git commit
|
71
|
+
```
|
72
|
+
|
73
|
+
#### Push
|
74
|
+
|
75
|
+
```
|
76
|
+
git push origin my-feature-branch
|
77
|
+
```
|
78
|
+
|
79
|
+
#### Make a Pull Request
|
80
|
+
|
81
|
+
Go to https://github.com/contributor/garner and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days.
|
82
|
+
|
83
|
+
#### Rebase
|
84
|
+
|
85
|
+
If you've been working on a change for a while, rebase with upstream/master.
|
86
|
+
|
87
|
+
```
|
88
|
+
git fetch upstream
|
89
|
+
git rebase upstream/master
|
90
|
+
git push origin my-feature-branch -f
|
91
|
+
```
|
92
|
+
|
93
|
+
#### Update CHANGELOG Again
|
94
|
+
|
95
|
+
Update the [CHANGELOG](CHANGELOG.md) with the pull request number. A typical entry looks as follows.
|
96
|
+
|
97
|
+
```
|
98
|
+
* [#123](https://github.com/artsy/garner/pull/123): Reticulated splines - [@contributor](https://github.com/contributor).
|
99
|
+
```
|
100
|
+
|
101
|
+
Amend your previous commit and force push the changes.
|
102
|
+
|
103
|
+
```
|
104
|
+
git commit --amend
|
105
|
+
git push origin my-feature-branch -f
|
106
|
+
```
|
107
|
+
|
108
|
+
#### Check on Your Pull Request
|
109
|
+
|
110
|
+
Go back to your pull request after a few minutes and see whether it passed muster with Travis-CI. Everything should look green, otherwise fix issues and amend your commit as described above.
|
111
|
+
|
112
|
+
#### Be Patient
|
113
|
+
|
114
|
+
It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there!
|
115
|
+
|
116
|
+
#### Thank You
|
117
|
+
|
118
|
+
Please do know that we really appreciate and value your time and work. We love you, really.
|
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -212,6 +212,7 @@ The full list of `Garner.config` attributes is:
|
|
212
212
|
* `:mongoid_identity_fields`: Identity fields considered legal for the `identity` method. Defaults to `[:_id]`.
|
213
213
|
* `:caller_root`: Root path of application, to be stripped out of value strings generated by the `Caller` context key strategy. Defaults to `Rails.root` if in a Rails environment; otherwise to the nearest ancestor directory containing a Gemfile.
|
214
214
|
* `:invalidate_mongoid_root`: If set to true, invalidates the `_root` document along with any embedded Mongoid document binding. Defaults to `true`.
|
215
|
+
* `:whiny_nils`: If set to true, raises an exception when a `nil` binding is specified (i.e., `garner.bind(nil)`). Defaults to `true`.
|
215
216
|
|
216
217
|
Contributing
|
217
218
|
------------
|
data/Rakefile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
|
4
|
+
require File.expand_path('../lib/garner/version', __FILE__)
|
5
|
+
|
6
|
+
begin
|
7
|
+
Bundler.setup(:default, :development)
|
8
|
+
rescue Bundler::BundlerError => e
|
9
|
+
$stderr.puts e.message
|
10
|
+
$stderr.puts 'Run `bundle install` to install missing gems'
|
11
|
+
exit e.status_code
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'rake'
|
15
|
+
require 'rspec/core'
|
16
|
+
require 'rspec/core/rake_task'
|
17
|
+
|
18
|
+
Bundler::GemHelper.install_tasks
|
19
|
+
|
20
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
21
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'yard'
|
25
|
+
YARD::Rake::YardocTask.new(:doc)
|
26
|
+
|
27
|
+
task :benchmark do
|
28
|
+
require 'performance/strategy_benchmark'
|
29
|
+
StrategyBenchmark.new(
|
30
|
+
n: ENV['N'].try(&:to_i),
|
31
|
+
d: ENV['D'].try(&:to_i),
|
32
|
+
r: ENV['R'].try(&:to_i)
|
33
|
+
).run!
|
34
|
+
end
|
35
|
+
|
36
|
+
require 'rubocop/rake_task'
|
37
|
+
RuboCop::RakeTask.new(:rubocop)
|
38
|
+
|
39
|
+
task default: [:rubocop, :spec]
|
data/UPGRADING.md
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
Upgrading
|
2
|
+
=========
|
3
|
+
|
4
|
+
From <= 0.3.3 to >= 0.4.0
|
5
|
+
-------------------------
|
6
|
+
|
7
|
+
### Binding Strategies
|
8
|
+
|
9
|
+
The API for declaring cache bindings has changed completely. Instead of passing a hash to `cache`, you may now call `bind` on the `garner` method. `bind` takes an explicit object as its argument. So, for example:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
cache({ bind: [ User, current_user.id ] }) do
|
13
|
+
current_user.address
|
14
|
+
end
|
15
|
+
```
|
16
|
+
|
17
|
+
now becomes:
|
18
|
+
```ruby
|
19
|
+
garner.bind(current_user) do
|
20
|
+
current_user.address
|
21
|
+
end
|
22
|
+
```
|
23
|
+
|
24
|
+
To accommodate virtual object bindings (object references by class name and ID alone), Garner 0.4.0 provides an `identify` method as part of its Mongoid mixin. So,
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
cache({ :bind => [Widget, params[:id]] }) { }
|
28
|
+
```
|
29
|
+
|
30
|
+
now becomes:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
garner.bind(Widget.identify(params[:id]))
|
34
|
+
```
|
35
|
+
|
36
|
+
Please consult the following table for translations from all documented pre-0.4.0 Garner bindings:
|
37
|
+
|
38
|
+
| 0.3.3 Binding | 0.4.0 Binding |
|
39
|
+
|---------------|---------------|
|
40
|
+
| `bind: { klass: Widget, object: { id: params[:id] } }` | `bind(Widget.identify(id))` |
|
41
|
+
| `bind: { klass: Widget }` | `bind(Widget)` |
|
42
|
+
| `bind: [Widget]` | `bind(Widget)` |
|
43
|
+
| `bind: [Widget, params[:id]]` | `bind(Widget.identify(params[:id]))` |
|
44
|
+
| `bind: [User, { id: current_user.id }]` | `bind(current_user)` |
|
45
|
+
| `bind: [[Widget], [User, { id: current_user.id }]]` | `bind(Widget).bind(current_user)` |
|
46
|
+
|
47
|
+
### Grape Integration
|
48
|
+
|
49
|
+
With Garner 0.4.0, a single Rack mixin provides all necessary integration for Garner and Grape. Change:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
class API < Grape::API
|
53
|
+
use Garner::Middleware::Cache::Bust
|
54
|
+
helpers Garner::Mixins::Grape::Cache
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
to:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
class API < Grape::API
|
62
|
+
helpers Garner::Mixins::Rack
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
66
|
+
### Mongoid Integration
|
67
|
+
|
68
|
+
The API for Mongoid integration is unchanged. Please continue to include the Mongoid mixin by placing the following code in an initializer:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
require "garner"
|
72
|
+
require "garner/mixins/mongoid"
|
73
|
+
|
74
|
+
module Mongoid
|
75
|
+
module Document
|
76
|
+
include Garner::Mixins::Mongoid::Document
|
77
|
+
end
|
78
|
+
end
|
79
|
+
```
|
80
|
+
|
81
|
+
### HTTP Caching
|
82
|
+
|
83
|
+
Garner no longer provides HTTP caching, beginning with 0.4.0. We recommend using `Rack::ConditionalGet` in combination with `Rack::ETag` instead. These can be easily mixed into your existing Grape app like so:
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
class API < Grape::API
|
87
|
+
use Rack::ConditionalGet
|
88
|
+
use Rack::ETag
|
89
|
+
end
|
90
|
+
```
|
91
|
+
|
92
|
+
Moreover, `cache_or_304` is no longer implemented in Garner 0.4.0. All calls to `cache_or_304` should be replaced with `garner` blocks, just like any `cache` block. To give a specific example,
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
cache_or_304({ bind: [ User, current_user.id ] }) do
|
96
|
+
current_user.address
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
should become:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
garner.bind(current_user) do
|
104
|
+
current_user.address
|
105
|
+
end
|
106
|
+
```
|
107
|
+
|
108
|
+
### Context Key Strategies
|
109
|
+
|
110
|
+
You should no longer need to explicitly define key strategies. You can remove definitions like:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
Garner::Cache::ObjectIdentity::KEY_STRATEGIES = [
|
114
|
+
# ...
|
115
|
+
]
|
116
|
+
```
|
117
|
+
|
118
|
+
from your initializers. If you have custom context key strategies, please refer to [request_get.rb](/artsy/garner/blob/master/lib/garner/strategies/context/key/request_get.rb) for an example of how to write new context key strategies. They can be added to `Garner.config.context_key_strategies`, or if only applicable to the Rack context, `Garner.config.rack_context_key_strategies`.
|