second_level_cache 2.6.1 → 2.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/lib/second_level_cache/active_record.rb +7 -1
- data/lib/second_level_cache/active_record/base.rb +1 -5
- data/lib/second_level_cache/active_record/belongs_to_association.rb +3 -0
- data/lib/second_level_cache/active_record/fetch_by_uniq_key.rb +1 -1
- data/lib/second_level_cache/active_record/has_one_association.rb +1 -1
- data/lib/second_level_cache/active_record/preloader.rb +2 -1
- data/lib/second_level_cache/adapter/paranoia.rb +24 -0
- data/lib/second_level_cache/mixin.rb +0 -2
- data/lib/second_level_cache/version.rb +1 -1
- data/test/fetch_by_uniq_key_test.rb +6 -5
- data/test/model/paranoid.rb +10 -0
- data/test/model/user.rb +0 -2
- data/test/paranoid_test.rb +16 -0
- data/test/test_helper.rb +1 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84fecc39005beffa957b1602ff86ace6ca5419a1215d35011034ac6c78b5e0bf
|
4
|
+
data.tar.gz: f0a09a62d06ef9f10a1ee4559a4aac1b8e39eaa8a86ee81ce90d67212c9c1811
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40c406b9b4181c5e1085127bbab26b71c5a47842d685521b9fa1ec43e58e529d8591c24ae675760ed2a3dcc9644dca7fcb6db12a5e651b67670af413c16addcc
|
7
|
+
data.tar.gz: fc5f6ee2184884f4580123550e3d3edbb113114de4f7dacad340ef8c37711e9388335fdf029a06971fefe6a666ae0ca615f2852101384f986750333c3f85b0de
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -134,7 +134,7 @@ config.cache_store = [:dalli_store, APP_CONFIG["memcached_host"], { namespace: "
|
|
134
134
|
## Tips:
|
135
135
|
|
136
136
|
* When you want to clear only second level cache apart from other cache for example fragment cache in cache store,
|
137
|
-
you can only change the `cache_key_prefix
|
137
|
+
you can only change the `cache_key_prefix` (default: `slc`):
|
138
138
|
|
139
139
|
```ruby
|
140
140
|
SecondLevelCache.configure.cache_key_prefix = "slc1"
|
@@ -12,7 +12,13 @@ require "second_level_cache/active_record/preloader"
|
|
12
12
|
|
13
13
|
# http://api.rubyonrails.org/classes/ActiveSupport/LazyLoadHooks.html
|
14
14
|
# ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
|
15
|
-
ActiveSupport.on_load(:active_record) do
|
15
|
+
ActiveSupport.on_load(:active_record, run_once: true) do
|
16
|
+
if (Bundler.definition.gem("paranoia") rescue false)
|
17
|
+
require "second_level_cache/adapter/paranoia"
|
18
|
+
include SecondLevelCache::Adapter::Paranoia::ActiveRecord
|
19
|
+
SecondLevelCache::Mixin.send(:prepend, SecondLevelCache::Adapter::Paranoia::Mixin)
|
20
|
+
end
|
21
|
+
|
16
22
|
include SecondLevelCache::Mixin
|
17
23
|
prepend SecondLevelCache::ActiveRecord::Base
|
18
24
|
extend SecondLevelCache::ActiveRecord::FetchByUniqKey
|
@@ -6,11 +6,7 @@ module SecondLevelCache
|
|
6
6
|
def self.prepended(base)
|
7
7
|
base.after_commit :update_second_level_cache, on: :update
|
8
8
|
base.after_commit :write_second_level_cache, on: :create
|
9
|
-
|
10
|
-
base.after_destroy :expire_second_level_cache
|
11
|
-
else
|
12
|
-
base.after_commit :expire_second_level_cache, on: :destroy
|
13
|
-
end
|
9
|
+
base.after_commit :expire_second_level_cache, on: :destroy
|
14
10
|
|
15
11
|
class << base
|
16
12
|
prepend ClassMethods
|
@@ -6,6 +6,9 @@ module SecondLevelCache
|
|
6
6
|
module BelongsToAssociation
|
7
7
|
def find_target
|
8
8
|
return super unless klass.second_level_cache_enabled?
|
9
|
+
return super if klass.default_scopes.present? || reflection.scope
|
10
|
+
return super if reflection.active_record_primary_key.to_s != klass.primary_key
|
11
|
+
|
9
12
|
cache_record = klass.read_second_level_cache(second_level_cache_key)
|
10
13
|
if cache_record
|
11
14
|
return cache_record.tap { |record| set_inverse_instance(record) }
|
@@ -6,7 +6,7 @@ module SecondLevelCache
|
|
6
6
|
module HasOneAssociation
|
7
7
|
def find_target
|
8
8
|
return super unless klass.second_level_cache_enabled?
|
9
|
-
return super if reflection.scope
|
9
|
+
return super if klass.default_scopes.present? || reflection.scope
|
10
10
|
# TODO: implement cache with has_one scope
|
11
11
|
|
12
12
|
through = reflection.options[:through]
|
@@ -9,7 +9,8 @@ module SecondLevelCache
|
|
9
9
|
def records_for(ids, &block)
|
10
10
|
return super unless klass.second_level_cache_enabled?
|
11
11
|
return super unless reflection.is_a?(::ActiveRecord::Reflection::BelongsToReflection)
|
12
|
-
return super if klass.default_scopes.present?
|
12
|
+
return super if klass.default_scopes.present? || reflection.scope
|
13
|
+
return super if association_key_name.to_s != klass.primary_key
|
13
14
|
|
14
15
|
map_cache_keys = ids.map { |id| klass.second_level_cache_key(id) }
|
15
16
|
records_from_cache = ::SecondLevelCache.cache_store.read_multi(*map_cache_keys)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module SecondLevelCache
|
2
|
+
module Adapter
|
3
|
+
module Paranoia
|
4
|
+
module ActiveRecord
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
after_destroy :expire_second_level_cache
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Mixin
|
13
|
+
extend ActiveSupport::Concern
|
14
|
+
|
15
|
+
def write_second_level_cache
|
16
|
+
# Avoid rewrite cache again, when record has been soft deleted
|
17
|
+
return if respond_to?(:deleted?) && send(:deleted?)
|
18
|
+
super
|
19
|
+
end
|
20
|
+
alias update_second_level_cache write_second_level_cache
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -71,8 +71,6 @@ module SecondLevelCache
|
|
71
71
|
|
72
72
|
def write_second_level_cache
|
73
73
|
return unless klass.second_level_cache_enabled?
|
74
|
-
# Avoid rewrite cache again, when record has been soft deleted
|
75
|
-
return if respond_to?(:deleted?) && send(:deleted?)
|
76
74
|
|
77
75
|
marshal = RecordMarshal.dump(self)
|
78
76
|
expires_in = klass.second_level_cache_options[:expires_in]
|
@@ -6,15 +6,16 @@ class FetchByUinqKeyTest < ActiveSupport::TestCase
|
|
6
6
|
def setup
|
7
7
|
@user = User.create name: "hooopo", email: "hoooopo@gmail.com"
|
8
8
|
@post = Post.create slug: "foobar", topic_id: 2
|
9
|
+
@cache_prefix = SecondLevelCache.configure.cache_key_prefix
|
9
10
|
end
|
10
11
|
|
11
12
|
def test_cache_uniq_key
|
12
|
-
assert_equal User.send(:cache_uniq_key, name: "hooopo"), "uniq_key_User_name_hooopo"
|
13
|
-
assert_equal User.send(:cache_uniq_key, foo: 1, bar: 2), "uniq_key_User_foo_1,bar_2"
|
14
|
-
assert_equal User.send(:cache_uniq_key, foo: 1, bar: nil), "uniq_key_User_foo_1,bar_"
|
13
|
+
assert_equal User.send(:cache_uniq_key, name: "hooopo"), "#{@cache_prefix}/uniq_key_User_name_hooopo"
|
14
|
+
assert_equal User.send(:cache_uniq_key, foo: 1, bar: 2), "#{@cache_prefix}/uniq_key_User_foo_1,bar_2"
|
15
|
+
assert_equal User.send(:cache_uniq_key, foo: 1, bar: nil), "#{@cache_prefix}/uniq_key_User_foo_1,bar_"
|
15
16
|
long_val = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
16
|
-
assert_equal User.send(:cache_uniq_key, foo: 1, bar: long_val), "uniq_key_User_foo_1,bar_#{Digest::MD5.hexdigest(long_val)}"
|
17
|
-
assert Contribution.send(:cache_uniq_key, user_id: 1, date: Time.current.to_date), "uniq_key_Contribution_user_id_1,date_#{Time.current.to_date}"
|
17
|
+
assert_equal User.send(:cache_uniq_key, foo: 1, bar: long_val), "#{@cache_prefix}/uniq_key_User_foo_1,bar_#{Digest::MD5.hexdigest(long_val)}"
|
18
|
+
assert Contribution.send(:cache_uniq_key, user_id: 1, date: Time.current.to_date), "#{@cache_prefix}/uniq_key_Contribution_user_id_1,date_#{Time.current.to_date}"
|
18
19
|
end
|
19
20
|
|
20
21
|
def test_record_attributes_equal_where_values
|
data/test/model/user.rb
CHANGED
@@ -9,7 +9,6 @@ ActiveRecord::Base.connection.create_table(:users, force: true) do |t|
|
|
9
9
|
t.integer :status, default: 0
|
10
10
|
t.integer :books_count, default: 0
|
11
11
|
t.integer :images_count, default: 0
|
12
|
-
t.datetime :deleted_at
|
13
12
|
t.timestamps null: false, precision: 6
|
14
13
|
end
|
15
14
|
|
@@ -29,7 +28,6 @@ end
|
|
29
28
|
class User < ApplicationRecord
|
30
29
|
CACHE_VERSION = 3
|
31
30
|
second_level_cache(version: CACHE_VERSION, expires_in: 3.days)
|
32
|
-
acts_as_paranoid
|
33
31
|
|
34
32
|
serialize :options, Array
|
35
33
|
serialize :json_options, JSON if ::ActiveRecord::VERSION::STRING >= "4.1.0"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class ParanoidTest < ActiveSupport::TestCase
|
6
|
+
def setup
|
7
|
+
@paranoid = Paranoid.create
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_expire_cache_when_destroy
|
11
|
+
@paranoid.destroy
|
12
|
+
assert_nil Paranoid.find_by(id: @paranoid.id)
|
13
|
+
assert_nil SecondLevelCache.cache_store.read(@paranoid.second_level_cache_key)
|
14
|
+
assert_nil User.read_second_level_cache(@paranoid.id)
|
15
|
+
end
|
16
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: second_level_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.
|
4
|
+
version: 2.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hooopo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- lib/second_level_cache/active_record/has_one_association.rb
|
129
129
|
- lib/second_level_cache/active_record/persistence.rb
|
130
130
|
- lib/second_level_cache/active_record/preloader.rb
|
131
|
+
- lib/second_level_cache/adapter/paranoia.rb
|
131
132
|
- lib/second_level_cache/config.rb
|
132
133
|
- lib/second_level_cache/log_subscriber.rb
|
133
134
|
- lib/second_level_cache/mixin.rb
|
@@ -150,9 +151,11 @@ files:
|
|
150
151
|
- test/model/image.rb
|
151
152
|
- test/model/order.rb
|
152
153
|
- test/model/order_item.rb
|
154
|
+
- test/model/paranoid.rb
|
153
155
|
- test/model/post.rb
|
154
156
|
- test/model/topic.rb
|
155
157
|
- test/model/user.rb
|
158
|
+
- test/paranoid_test.rb
|
156
159
|
- test/persistence_test.rb
|
157
160
|
- test/polymorphic_association_test.rb
|
158
161
|
- test/preloader_belongs_to_test.rb
|
@@ -195,6 +198,7 @@ test_files:
|
|
195
198
|
- test/preloader_belongs_to_test.rb
|
196
199
|
- test/polymorphic_association_test.rb
|
197
200
|
- test/require_test.rb
|
201
|
+
- test/paranoid_test.rb
|
198
202
|
- test/finder_methods_test.rb
|
199
203
|
- test/preloader_has_one_test.rb
|
200
204
|
- test/preloader_non_integer_test.rb
|
@@ -213,6 +217,7 @@ test_files:
|
|
213
217
|
- test/model/topic.rb
|
214
218
|
- test/model/animal.rb
|
215
219
|
- test/model/order.rb
|
220
|
+
- test/model/paranoid.rb
|
216
221
|
- test/model/application_record.rb
|
217
222
|
- test/model/post.rb
|
218
223
|
- test/model/user.rb
|