double_write_cache_stores 0.4.0 → 0.5.0
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.
- checksums.yaml +5 -5
- data/.codeclimate.yml +7 -0
- data/.github/workflows/test.yml +60 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +44 -13
- data/.ruby-version +1 -1
- data/Appraisals +18 -0
- data/README.md +16 -3
- data/Rakefile +6 -1
- data/activesupport.gemfile +1 -1
- data/activesupport.gemfile.lock +1 -1
- data/compose.yaml +9 -0
- data/double_write_cache_stores.gemspec +7 -4
- data/gemfiles/activesupport_5_2.gemfile +7 -0
- data/gemfiles/activesupport_6_0.gemfile +7 -0
- data/gemfiles/activesupport_6_1.gemfile +7 -0
- data/gemfiles/activesupport_7_0.gemfile +7 -0
- data/gemfiles/without_activesupport.gemfile +5 -0
- data/lib/double_write_cache_stores/client.rb +20 -4
- data/lib/double_write_cache_stores/version.rb +1 -1
- data/lib/double_write_cache_stores.rb +1 -2
- data/lib/mem_cache_store_patch.rb +4 -39
- data/spec/double_write_cache_stores/client_spec.rb +14 -29
- data/spec/spec_helper.rb +1 -20
- metadata +46 -12
- data/.travis.yml +0 -21
- data/lib/dalli_store_patch.rb +0 -42
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: '09e3ef0241622ad655a775f6eb0cbb8ad558449935e2fcc3e023f1ab9afcc3b7'
|
|
4
|
+
data.tar.gz: 0ab94920920dc1d8debbae83a303a647a8730b8a066755990274b76498a6bae8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f728dd727b40ad69ce8238fcfe9c0ca8826612c16bdf8b7a870c4396a2eab3991a388b436d2fdd03ccefa913b6343603e114f5b408fe40f92949d4ff5218bec8
|
|
7
|
+
data.tar.gz: 05004ee53248b487720fb6fff66f57288ab05090a94904f1a7ce52fce11c62cf3d630b038a7d45a793659845b259f91e340ab07197a80f168abf5d5b1e663548
|
data/.codeclimate.yml
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
concurrency:
|
|
8
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
9
|
+
cancel-in-progress: true
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
ruby:
|
|
18
|
+
- "2.5"
|
|
19
|
+
- "2.6"
|
|
20
|
+
- "2.7"
|
|
21
|
+
- "3.0"
|
|
22
|
+
- "3.1"
|
|
23
|
+
- "3.2"
|
|
24
|
+
gemfile:
|
|
25
|
+
- gemfiles/activesupport_5_2.gemfile
|
|
26
|
+
- gemfiles/activesupport_6_0.gemfile
|
|
27
|
+
- gemfiles/activesupport_6_1.gemfile
|
|
28
|
+
- gemfiles/activesupport_7_0.gemfile
|
|
29
|
+
- gemfiles/without_activesupport.gemfile
|
|
30
|
+
exclude:
|
|
31
|
+
- ruby: "2.5"
|
|
32
|
+
gemfile: gemfiles/activesupport_7_0.gemfile
|
|
33
|
+
- ruby: "2.6"
|
|
34
|
+
gemfile: gemfiles/activesupport_7_0.gemfile
|
|
35
|
+
- ruby: "3.0"
|
|
36
|
+
gemfile: gemfiles/activesupport_5_2.gemfile
|
|
37
|
+
- ruby: "3.0"
|
|
38
|
+
gemfile: gemfiles/activesupport_5_2.gemfile
|
|
39
|
+
- ruby: "3.1"
|
|
40
|
+
gemfile: gemfiles/activesupport_5_2.gemfile
|
|
41
|
+
- ruby: "3.2"
|
|
42
|
+
gemfile: gemfiles/activesupport_5_2.gemfile
|
|
43
|
+
services:
|
|
44
|
+
memcached_11211:
|
|
45
|
+
image: memcached
|
|
46
|
+
ports:
|
|
47
|
+
- 11211:11211
|
|
48
|
+
memcached_21211:
|
|
49
|
+
image: memcached
|
|
50
|
+
ports:
|
|
51
|
+
- 21211:11211
|
|
52
|
+
env:
|
|
53
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v4
|
|
56
|
+
- uses: ruby/setup-ruby@v1
|
|
57
|
+
with:
|
|
58
|
+
ruby-version: ${{ matrix.ruby }}
|
|
59
|
+
bundler-cache: true
|
|
60
|
+
- run: bundle exec rake
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -2,17 +2,17 @@ AllCops:
|
|
|
2
2
|
Exclude:
|
|
3
3
|
- "vendor/**/*"
|
|
4
4
|
DisplayCopNames: true
|
|
5
|
+
NewCops: disable
|
|
6
|
+
TargetRubyVersion: 2.5
|
|
7
|
+
SuggestExtensions: false
|
|
5
8
|
|
|
6
9
|
Style/AsciiComments:
|
|
7
10
|
Enabled: false
|
|
8
11
|
|
|
9
|
-
Style/BracesAroundHashParameters:
|
|
10
|
-
Enabled: false
|
|
11
|
-
|
|
12
12
|
Style/Documentation:
|
|
13
13
|
Enabled: false
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Layout/ExtraSpacing:
|
|
16
16
|
Enabled: false
|
|
17
17
|
|
|
18
18
|
Style/GuardClause:
|
|
@@ -27,11 +27,11 @@ Style/ModuleFunction:
|
|
|
27
27
|
Style/StringLiterals:
|
|
28
28
|
EnforcedStyle: double_quotes
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Layout/SpaceBeforeFirstArg:
|
|
31
31
|
Enabled: false
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
EnforcedStyle:
|
|
33
|
+
Layout/IndentationConsistency:
|
|
34
|
+
EnforcedStyle: indented_internal_methods
|
|
35
35
|
|
|
36
36
|
Style/SignalException:
|
|
37
37
|
EnforcedStyle: only_raise
|
|
@@ -42,19 +42,50 @@ Style/HashSyntax:
|
|
|
42
42
|
- "**/*.rake"
|
|
43
43
|
- "Rakefile"
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
Layout/LineLength:
|
|
46
46
|
Max: 160
|
|
47
|
-
Exclude:
|
|
48
|
-
- "db/migrate/*.rb"
|
|
49
47
|
|
|
50
|
-
NumericLiterals:
|
|
48
|
+
Style/NumericLiterals:
|
|
51
49
|
MinDigits: 7
|
|
52
50
|
|
|
53
51
|
Lint/AssignmentInCondition:
|
|
54
52
|
Enabled: false
|
|
55
53
|
|
|
56
|
-
|
|
54
|
+
Layout/BlockAlignment:
|
|
57
55
|
Enabled: false
|
|
58
56
|
|
|
59
57
|
Metrics/MethodLength:
|
|
60
|
-
|
|
58
|
+
Enabled: false
|
|
59
|
+
|
|
60
|
+
Style/FrozenStringLiteralComment:
|
|
61
|
+
Enabled: false
|
|
62
|
+
|
|
63
|
+
Style/NestedParenthesizedCalls:
|
|
64
|
+
Enabled: false
|
|
65
|
+
|
|
66
|
+
Metrics/BlockLength:
|
|
67
|
+
Enabled: false
|
|
68
|
+
|
|
69
|
+
Layout/EmptyLineAfterGuardClause:
|
|
70
|
+
Enabled: false
|
|
71
|
+
|
|
72
|
+
Style/MutableConstant:
|
|
73
|
+
Enabled: false
|
|
74
|
+
|
|
75
|
+
Style/ExpandPathArguments:
|
|
76
|
+
Enabled: false
|
|
77
|
+
|
|
78
|
+
Style/Alias:
|
|
79
|
+
Enabled: false
|
|
80
|
+
|
|
81
|
+
Style/SafeNavigation:
|
|
82
|
+
Enabled: false
|
|
83
|
+
|
|
84
|
+
Style/IfUnlessModifier:
|
|
85
|
+
Enabled: false
|
|
86
|
+
|
|
87
|
+
Style/ExplicitBlockArgument:
|
|
88
|
+
Enabled: false
|
|
89
|
+
|
|
90
|
+
Lint/AmbiguousBlockAssociation:
|
|
91
|
+
Enabled: false
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
3.2.3
|
data/Appraisals
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
appraise "without_activesupport" do
|
|
2
|
+
end
|
|
3
|
+
|
|
4
|
+
appraise "activesupport_5_2" do
|
|
5
|
+
gem "activesupport", "~> 5.2.8.1"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
appraise "activesupport_6_0" do
|
|
9
|
+
gem "activesupport", "~> 6.0.6.1"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
appraise "activesupport_6_1" do
|
|
13
|
+
gem "activesupport", "~> 6.1.7.7"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
appraise "activesupport_7_0" do
|
|
17
|
+
gem "activesupport", "~> 7.0.8.1"
|
|
18
|
+
end
|
data/README.md
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
# DoubleWriteCacheStores
|
|
2
2
|
|
|
3
|
-
[](https://github.com/mixigroup/double_write_cache_stores/actions/workflows/test.yml)
|
|
4
4
|
|
|
5
5
|
pre-warming(double write to cach store and other cache store) cache store wrapper. will switch cache store.
|
|
6
6
|
|
|
7
7
|
## Support backend cache store
|
|
8
8
|
|
|
9
9
|
- ActiveSupport::Cache::MemCacheStore
|
|
10
|
-
- ActiveSupport::Cache::DalliStore in Dalli
|
|
11
10
|
- Dalli::Client
|
|
12
11
|
|
|
13
12
|
## Installation
|
|
@@ -60,9 +59,23 @@ Rails.cache.fetch("key") do
|
|
|
60
59
|
end
|
|
61
60
|
```
|
|
62
61
|
|
|
62
|
+
## Run tests locally
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
docker compose up -d
|
|
66
|
+
bundle install
|
|
67
|
+
bundle exec appraisal install
|
|
68
|
+
bundle exec appraisal activesupport_7_0 rake
|
|
69
|
+
|
|
70
|
+
#bundle exec appraisal activesupport_5_2 rake
|
|
71
|
+
#bundle exec appraisal activesupport_6_0 rake
|
|
72
|
+
#bundle exec appraisal activesupport_6_1 rake
|
|
73
|
+
#bundle exec appraisal without_activesupport rake
|
|
74
|
+
```
|
|
75
|
+
|
|
63
76
|
## Contributing
|
|
64
77
|
|
|
65
|
-
1. Fork it ( http://github.com/
|
|
78
|
+
1. Fork it ( http://github.com/mixigroup/double_write_cache_stores/fork )
|
|
66
79
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
67
80
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
68
81
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/Rakefile
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
require "bundler/gem_tasks"
|
|
2
2
|
require "rspec/core/rake_task"
|
|
3
|
+
require "rubocop/rake_task"
|
|
3
4
|
|
|
4
5
|
RSpec::Core::RakeTask.new(:spec)
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
RuboCop::RakeTask.new do |task|
|
|
8
|
+
task.options = %w[-c .rubocop.yml]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
task default: %i[rubocop spec]
|
data/activesupport.gemfile
CHANGED
data/activesupport.gemfile.lock
CHANGED
data/compose.yaml
ADDED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
1
|
lib = File.expand_path("../lib", __FILE__)
|
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
3
|
require "double_write_cache_stores/version"
|
|
@@ -18,11 +17,15 @@ Gem::Specification.new do |spec|
|
|
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
18
|
spec.require_paths = ["lib"]
|
|
20
19
|
|
|
21
|
-
spec.
|
|
20
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.5")
|
|
22
21
|
|
|
23
|
-
spec.
|
|
22
|
+
spec.add_runtime_dependency "dalli", "~> 3.0"
|
|
23
|
+
|
|
24
|
+
spec.add_development_dependency "appraisal", "~> 2.5.0"
|
|
25
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
|
26
|
+
spec.add_development_dependency "pry"
|
|
24
27
|
spec.add_development_dependency "rake"
|
|
25
28
|
spec.add_development_dependency "rspec"
|
|
26
|
-
spec.add_development_dependency "
|
|
29
|
+
spec.add_development_dependency "rubocop"
|
|
27
30
|
spec.add_development_dependency "tilt", "1.3.7"
|
|
28
31
|
end
|
|
@@ -21,6 +21,8 @@ module DoubleWriteCacheStores
|
|
|
21
21
|
@read_and_write_store.get_cas key
|
|
22
22
|
elsif @read_and_write_store.respond_to? :read_cas
|
|
23
23
|
@read_and_write_store.read_cas key
|
|
24
|
+
elsif @read_and_write_store.respond_to? :dalli
|
|
25
|
+
@read_and_write_store.dalli.get_cas key
|
|
24
26
|
end
|
|
25
27
|
end
|
|
26
28
|
|
|
@@ -31,6 +33,8 @@ module DoubleWriteCacheStores
|
|
|
31
33
|
options ||= {}
|
|
32
34
|
options[:cas] = cas
|
|
33
35
|
@read_and_write_store.write_cas key, value, options
|
|
36
|
+
elsif @read_and_write_store.respond_to? :dalli
|
|
37
|
+
@read_and_write_store.dalli.set_cas key, value, cas, options
|
|
34
38
|
end
|
|
35
39
|
|
|
36
40
|
if @write_only_store && cas_unique
|
|
@@ -51,8 +55,20 @@ module DoubleWriteCacheStores
|
|
|
51
55
|
end
|
|
52
56
|
|
|
53
57
|
def touch(key, ttl = nil)
|
|
54
|
-
result = @read_and_write_store.touch
|
|
55
|
-
|
|
58
|
+
result = if @read_and_write_store.respond_to? :touch
|
|
59
|
+
@read_and_write_store.touch key, ttl
|
|
60
|
+
elsif @read_and_write_store.respond_to? :dalli
|
|
61
|
+
@read_and_write_store.dalli.touch key, ttl
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if @write_only_store
|
|
65
|
+
if @write_only_store.respond_to? :touch
|
|
66
|
+
@write_only_store.touch key, ttl
|
|
67
|
+
elsif @write_only_store.respond_to? :dalli
|
|
68
|
+
@write_only_store.dalli.touch key, ttl
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
56
72
|
result
|
|
57
73
|
end
|
|
58
74
|
|
|
@@ -164,7 +180,7 @@ module DoubleWriteCacheStores
|
|
|
164
180
|
cache_store.incr key, amount, ttl, default
|
|
165
181
|
elsif cache_store.respond_to? :increment
|
|
166
182
|
options[:initial] = amount unless options.key?(:initial)
|
|
167
|
-
cache_store.increment key, amount, options
|
|
183
|
+
cache_store.increment key, amount, **options
|
|
168
184
|
end
|
|
169
185
|
end
|
|
170
186
|
|
|
@@ -175,7 +191,7 @@ module DoubleWriteCacheStores
|
|
|
175
191
|
cache_store.decr key, amount, ttl, default
|
|
176
192
|
elsif cache_store.respond_to? :decrement
|
|
177
193
|
options[:initial] = 0 unless options.key?(:initial)
|
|
178
|
-
cache_store.decrement key, amount, options
|
|
194
|
+
cache_store.decrement key, amount, **options
|
|
179
195
|
end
|
|
180
196
|
end
|
|
181
197
|
|
|
@@ -4,7 +4,7 @@ module DoubleWriteCacheStores
|
|
|
4
4
|
begin
|
|
5
5
|
require "active_support"
|
|
6
6
|
loaded_active_support = true
|
|
7
|
-
rescue LoadError # rubocop:disable Lint/
|
|
7
|
+
rescue LoadError # rubocop:disable Lint/SuppressedException
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
loaded_active_support.freeze
|
|
@@ -21,6 +21,5 @@ require "double_write_cache_stores/client"
|
|
|
21
21
|
require "double_write_cache_stores/base_exception"
|
|
22
22
|
|
|
23
23
|
require "dalli"
|
|
24
|
-
require "dalli_store_patch"
|
|
25
24
|
|
|
26
25
|
require "mem_cache_store_patch" if DoubleWriteCacheStores.loaded_active_support?
|
|
@@ -1,48 +1,13 @@
|
|
|
1
1
|
# monky patch
|
|
2
|
-
# support touch interface for ActiveSupport::Cache::MemCacheStore
|
|
3
2
|
module MemCacheStorePatch
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
ttl ||= options[:expires_in].to_i if options[:expires_in]
|
|
7
|
-
@data.touch(key, ttl)
|
|
8
|
-
rescue Dalli::DalliError => e
|
|
9
|
-
logger.error("DalliError (#{e}): #{e.message}") if logger
|
|
10
|
-
nil
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def read_cas(name, options = nil)
|
|
14
|
-
options ||= {}
|
|
15
|
-
key = namespaced_key(name, options)
|
|
16
|
-
|
|
17
|
-
instrument(:get_cas, key) do |_payload|
|
|
18
|
-
@data.get_cas(key)
|
|
19
|
-
end
|
|
20
|
-
rescue Dalli::DalliError => e
|
|
21
|
-
logger.error("DalliError: #{e.message}") if logger
|
|
22
|
-
raise if raise_errors?
|
|
23
|
-
false
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def write_cas(name, value, options = nil)
|
|
27
|
-
options ||= {}
|
|
28
|
-
key = namespaced_key(name, options)
|
|
29
|
-
expires_in = options[:expires_in]
|
|
30
|
-
|
|
31
|
-
instrument(:set_cas, key, value) do |_payload|
|
|
32
|
-
cas = options.delete(:cas) || 0
|
|
33
|
-
expires_in = options.delete(:expires_in)
|
|
34
|
-
@data.set_cas(key, value, cas, expires_in, options)
|
|
35
|
-
end
|
|
36
|
-
rescue Dalli::DalliError => e
|
|
37
|
-
logger.error("DalliError: #{e.message}") if logger
|
|
38
|
-
raise if raise_errors?
|
|
39
|
-
false
|
|
3
|
+
def dalli
|
|
4
|
+
@data
|
|
40
5
|
end
|
|
41
6
|
end
|
|
42
7
|
|
|
43
8
|
begin
|
|
44
9
|
require "active_support/cache/mem_cache_store"
|
|
45
10
|
|
|
46
|
-
ActiveSupport::Cache::MemCacheStore.
|
|
47
|
-
rescue LoadError # rubocop:disable Lint/
|
|
11
|
+
ActiveSupport::Cache::MemCacheStore.include MemCacheStorePatch
|
|
12
|
+
rescue LoadError # rubocop:disable Lint/SuppressedException
|
|
48
13
|
end
|
|
@@ -9,7 +9,7 @@ def get_or_read(store, key)
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
describe DoubleWriteCacheStores::Client do
|
|
12
|
-
describe
|
|
12
|
+
describe "#initialize" do
|
|
13
13
|
let(:options) { { namespace: "app_v1", compress: true } }
|
|
14
14
|
it "different cache store instance" do
|
|
15
15
|
expect { DoubleWriteCacheStores::Client.new Dalli::Client.new("localhost:11211", options), "bad instance object" }.to raise_error RuntimeError
|
|
@@ -40,7 +40,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
shared_examples "cache store example" do |cache_store|
|
|
43
|
-
describe
|
|
43
|
+
describe "#read_multi" do
|
|
44
44
|
before do
|
|
45
45
|
cache_store.write "key-a", "example-value-a", expires_in: 86400
|
|
46
46
|
cache_store.write "key-b", "example-value-b", expires_in: 86400
|
|
@@ -55,12 +55,12 @@ describe DoubleWriteCacheStores::Client do
|
|
|
55
55
|
expect(results["key-c"]).to eq nil
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
it
|
|
58
|
+
it "returns values equal #get_multi" do
|
|
59
59
|
expect(cache_store.read_multi("key-a", "key-b")).to eq cache_store.get_multi("key-a", "key-b")
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
-
describe
|
|
63
|
+
describe "#fetch" do
|
|
64
64
|
before do
|
|
65
65
|
cache_store.write "key-a", "example-value-a", expires_in: 1
|
|
66
66
|
end
|
|
@@ -110,7 +110,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
110
110
|
end
|
|
111
111
|
end
|
|
112
112
|
|
|
113
|
-
describe
|
|
113
|
+
describe "#delete" do
|
|
114
114
|
before do
|
|
115
115
|
cache_store.write "will-delete-key", "example-will-delete-value", expires_in: 86400
|
|
116
116
|
expect(cache_store.delete "will-delete-key").to be true
|
|
@@ -123,7 +123,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
123
123
|
it_behaves_like "Equal values", cache_store, "will-delete-key", nil
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
-
describe
|
|
126
|
+
describe "#touch" do
|
|
127
127
|
let(:expire_ttl) { 1 }
|
|
128
128
|
|
|
129
129
|
before do
|
|
@@ -152,7 +152,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
152
152
|
end
|
|
153
153
|
end
|
|
154
154
|
|
|
155
|
-
describe
|
|
155
|
+
describe "#write" do
|
|
156
156
|
before do
|
|
157
157
|
cache_store.write "key", "example-write-value", expires_in: 86400
|
|
158
158
|
end
|
|
@@ -164,7 +164,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
164
164
|
it_behaves_like "Equal values", cache_store, "key", "example-write-value"
|
|
165
165
|
end
|
|
166
166
|
|
|
167
|
-
describe
|
|
167
|
+
describe "#read" do
|
|
168
168
|
before do
|
|
169
169
|
cache_store.write "key", "example-read-value", expires_in: 86400
|
|
170
170
|
end
|
|
@@ -178,7 +178,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
178
178
|
end
|
|
179
179
|
end
|
|
180
180
|
|
|
181
|
-
describe
|
|
181
|
+
describe "#flush" do
|
|
182
182
|
before do
|
|
183
183
|
cache_store.write "will-flush-key", "will-flush-value", expires_in: 86400
|
|
184
184
|
expect(cache_store.read "will-flush-key").to eq "will-flush-value"
|
|
@@ -197,7 +197,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
197
197
|
it { expect((cache_store.read key).to_i).to eq expected_value }
|
|
198
198
|
end
|
|
199
199
|
|
|
200
|
-
describe
|
|
200
|
+
describe "#increment" do
|
|
201
201
|
let(:key) { "key-increment" }
|
|
202
202
|
after { cache_store.flush }
|
|
203
203
|
|
|
@@ -250,7 +250,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
250
250
|
end
|
|
251
251
|
end
|
|
252
252
|
|
|
253
|
-
describe
|
|
253
|
+
describe "#decrement" do
|
|
254
254
|
let(:key) { "key-decrement" }
|
|
255
255
|
after { cache_store.flush }
|
|
256
256
|
|
|
@@ -303,7 +303,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
303
303
|
end
|
|
304
304
|
end
|
|
305
305
|
|
|
306
|
-
describe
|
|
306
|
+
describe "#[]=(key,value) and get #[](key)" do
|
|
307
307
|
it "set value and get value" do
|
|
308
308
|
cache_store["key"] = "example-value"
|
|
309
309
|
expect(cache_store["key"]).to eq "example-value"
|
|
@@ -316,7 +316,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
316
316
|
end
|
|
317
317
|
|
|
318
318
|
describe "cas" do
|
|
319
|
-
describe
|
|
319
|
+
describe "#get_cas" do
|
|
320
320
|
before do
|
|
321
321
|
cache_store.set_cas "get-cas-key", "get-cas-value"
|
|
322
322
|
end
|
|
@@ -329,7 +329,7 @@ describe DoubleWriteCacheStores::Client do
|
|
|
329
329
|
it_behaves_like("Equal values", cache_store, "get-cas-key", "get-cas-value")
|
|
330
330
|
end
|
|
331
331
|
|
|
332
|
-
describe
|
|
332
|
+
describe "#set_cas" do
|
|
333
333
|
let :cas_unique do
|
|
334
334
|
cache_store.set_cas("set-cas-key", "set-cas-value")
|
|
335
335
|
cache_store.get_cas("set-cas-key")[1]
|
|
@@ -364,21 +364,6 @@ describe DoubleWriteCacheStores::Client do
|
|
|
364
364
|
it_behaves_like "cache store example", one_cache_store
|
|
365
365
|
end
|
|
366
366
|
end
|
|
367
|
-
|
|
368
|
-
context "ActiveSupport :dalli_store in Dalli" do
|
|
369
|
-
read_and_write_store = ActiveSupport::Cache.lookup_store :dalli_store, "localhost:11211"
|
|
370
|
-
write_only_store = ActiveSupport::Cache.lookup_store :dalli_store, "localhost:21211"
|
|
371
|
-
|
|
372
|
-
context "double cache store" do
|
|
373
|
-
copy_cache_store = DoubleWriteCacheStores::Client.new(read_and_write_store, write_only_store)
|
|
374
|
-
it_behaves_like "cache store example", copy_cache_store
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
context "one cache store object" do
|
|
378
|
-
one_cache_store = DoubleWriteCacheStores::Client.new(read_and_write_store, nil)
|
|
379
|
-
it_behaves_like "cache store example", one_cache_store
|
|
380
|
-
end
|
|
381
|
-
end
|
|
382
367
|
else
|
|
383
368
|
skip "Not load ActiveSupport"
|
|
384
369
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -3,23 +3,4 @@ require "pry"
|
|
|
3
3
|
$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
|
|
4
4
|
require "double_write_cache_stores"
|
|
5
5
|
require "dalli"
|
|
6
|
-
require "dalli/
|
|
7
|
-
|
|
8
|
-
PID_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/pids")
|
|
9
|
-
PORTS = [11211, 21211]
|
|
10
|
-
|
|
11
|
-
RSpec.configure do |conf|
|
|
12
|
-
FileUtils.mkdir_p PID_DIR
|
|
13
|
-
|
|
14
|
-
PORTS.each do |port|
|
|
15
|
-
pid = File.expand_path(PID_DIR + "/memcached-spec-#{port}.pid")
|
|
16
|
-
` memcached -d -p #{port} -P #{pid} `
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
conf.after(:suite) do
|
|
20
|
-
PORTS.each do |port|
|
|
21
|
-
pid = File.expand_path(PID_DIR + "/memcached-spec-#{port}.pid")
|
|
22
|
-
` cat #{pid} | xargs kill -9 `
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
6
|
+
require "dalli/client"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: double_write_cache_stores
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- hirocaster
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-04-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dalli
|
|
@@ -16,28 +16,56 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: '3.0'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: '3.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: appraisal
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 2.5.0
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 2.5.0
|
|
27
41
|
- !ruby/object:Gem::Dependency
|
|
28
42
|
name: bundler
|
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
|
30
44
|
requirements:
|
|
31
45
|
- - "~>"
|
|
32
46
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
47
|
+
version: '2.0'
|
|
34
48
|
type: :development
|
|
35
49
|
prerelease: false
|
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
51
|
requirements:
|
|
38
52
|
- - "~>"
|
|
39
53
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
54
|
+
version: '2.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: pry
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
41
69
|
- !ruby/object:Gem::Dependency
|
|
42
70
|
name: rake
|
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -67,7 +95,7 @@ dependencies:
|
|
|
67
95
|
- !ruby/object:Gem::Version
|
|
68
96
|
version: '0'
|
|
69
97
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
98
|
+
name: rubocop
|
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
|
72
100
|
requirements:
|
|
73
101
|
- - ">="
|
|
@@ -102,19 +130,26 @@ executables: []
|
|
|
102
130
|
extensions: []
|
|
103
131
|
extra_rdoc_files: []
|
|
104
132
|
files:
|
|
133
|
+
- ".codeclimate.yml"
|
|
134
|
+
- ".github/workflows/test.yml"
|
|
105
135
|
- ".gitignore"
|
|
106
136
|
- ".rspec"
|
|
107
137
|
- ".rubocop.yml"
|
|
108
138
|
- ".ruby-version"
|
|
109
|
-
-
|
|
139
|
+
- Appraisals
|
|
110
140
|
- Gemfile
|
|
111
141
|
- LICENSE.txt
|
|
112
142
|
- README.md
|
|
113
143
|
- Rakefile
|
|
114
144
|
- activesupport.gemfile
|
|
115
145
|
- activesupport.gemfile.lock
|
|
146
|
+
- compose.yaml
|
|
116
147
|
- double_write_cache_stores.gemspec
|
|
117
|
-
-
|
|
148
|
+
- gemfiles/activesupport_5_2.gemfile
|
|
149
|
+
- gemfiles/activesupport_6_0.gemfile
|
|
150
|
+
- gemfiles/activesupport_6_1.gemfile
|
|
151
|
+
- gemfiles/activesupport_7_0.gemfile
|
|
152
|
+
- gemfiles/without_activesupport.gemfile
|
|
118
153
|
- lib/double_write_cache_stores.rb
|
|
119
154
|
- lib/double_write_cache_stores/base_exception.rb
|
|
120
155
|
- lib/double_write_cache_stores/client.rb
|
|
@@ -135,15 +170,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
135
170
|
requirements:
|
|
136
171
|
- - ">="
|
|
137
172
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: '
|
|
173
|
+
version: '2.5'
|
|
139
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
175
|
requirements:
|
|
141
176
|
- - ">="
|
|
142
177
|
- !ruby/object:Gem::Version
|
|
143
178
|
version: '0'
|
|
144
179
|
requirements: []
|
|
145
|
-
|
|
146
|
-
rubygems_version: 2.5.0
|
|
180
|
+
rubygems_version: 3.4.19
|
|
147
181
|
signing_key:
|
|
148
182
|
specification_version: 4
|
|
149
183
|
summary: Double write cache stores wrapper.
|
data/.travis.yml
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
language: ruby
|
|
2
|
-
install: bundle install --jobs=3 --retry=3
|
|
3
|
-
cache:
|
|
4
|
-
directories:
|
|
5
|
-
- vendor/bundle
|
|
6
|
-
rvm:
|
|
7
|
-
- 2.2.3
|
|
8
|
-
- 2.1.7
|
|
9
|
-
- 2.0.0-p647
|
|
10
|
-
|
|
11
|
-
gemfile:
|
|
12
|
-
- Gemfile
|
|
13
|
-
- activesupport.gemfile
|
|
14
|
-
|
|
15
|
-
addons:
|
|
16
|
-
apt:
|
|
17
|
-
packages:
|
|
18
|
-
- memcached
|
|
19
|
-
|
|
20
|
-
script:
|
|
21
|
-
- bundle exec rake spec
|
data/lib/dalli_store_patch.rb
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# monky patch
|
|
2
|
-
# support cas interface for ActiveSupport::Cache::DalliStore
|
|
3
|
-
module DalliStorePatch
|
|
4
|
-
def touch(key, ttl = nil)
|
|
5
|
-
ttl ||= options[:expires_in].to_i
|
|
6
|
-
@data.touch key, ttl
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def read_cas(name, options = {})
|
|
10
|
-
name = namespaced_key(name, options)
|
|
11
|
-
|
|
12
|
-
instrument(:get_cas, name) do |_payload|
|
|
13
|
-
with { |c| c.get_cas(name) }
|
|
14
|
-
end
|
|
15
|
-
rescue Dalli::DalliError => e
|
|
16
|
-
logger.error("DalliError: #{e.message}") if logger
|
|
17
|
-
raise if raise_errors?
|
|
18
|
-
false
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def write_cas(name, value, options = {})
|
|
22
|
-
name = namespaced_key(name, options)
|
|
23
|
-
expires_in = options[:expires_in]
|
|
24
|
-
|
|
25
|
-
instrument(:set_cas, name, value) do |_payload|
|
|
26
|
-
cas = options.delete(:cas) || 0
|
|
27
|
-
expires_in = options.delete(:expires_in)
|
|
28
|
-
with { |c| c.set_cas(name, value, cas, expires_in, options) }
|
|
29
|
-
end
|
|
30
|
-
rescue Dalli::DalliError => e
|
|
31
|
-
logger.error("DalliError: #{e.message}") if logger
|
|
32
|
-
raise if raise_errors?
|
|
33
|
-
false
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
begin
|
|
38
|
-
require "active_support/cache/dalli_store"
|
|
39
|
-
|
|
40
|
-
ActiveSupport::Cache::DalliStore.send(:include, DalliStorePatch)
|
|
41
|
-
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
|
42
|
-
end
|