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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0056aa765b7668e44d115f964c4fb11f1632ecf99206145c89aed0fb58f2b4d0
4
- data.tar.gz: a4fb19d6ff3859c728c7d8a43f28f64bb092c89226772de31b5b22f1e57e2cf6
3
+ metadata.gz: 84fecc39005beffa957b1602ff86ace6ca5419a1215d35011034ac6c78b5e0bf
4
+ data.tar.gz: f0a09a62d06ef9f10a1ee4559a4aac1b8e39eaa8a86ee81ce90d67212c9c1811
5
5
  SHA512:
6
- metadata.gz: 32f1cb2460325a2291d2732c2f3ec906c7c16c2c5838564df7bfa56f362c0049d37c1ef2658db6c057faf31183869bbd8d6fc4702f4056f0a8bc4d143933cc68
7
- data.tar.gz: 46e242047cd4e0c1c3651dc3e7ff03028d044a96b6c4c915d994114226c5ed30c8668248b14caac8165b51a283ba6ab9455badc5c27c6f7a31468753086216c4
6
+ metadata.gz: 40c406b9b4181c5e1085127bbab26b71c5a47842d685521b9fa1ec43e58e529d8591c24ae675760ed2a3dcc9644dca7fcb6db12a5e651b67670af413c16addcc
7
+ data.tar.gz: fc5f6ee2184884f4580123550e3d3edbb113114de4f7dacad340ef8c37711e9388335fdf029a06971fefe6a666ae0ca615f2852101384f986750333c3f85b0de
@@ -1,3 +1,9 @@
1
+ 2.6.2
2
+ -------
3
+
4
+ - Fix activerecord association cache. (#109)
5
+ - Fix fetch_by_uniq_key cache key with prefix. (#120)
6
+
1
7
  2.6.1
2
8
  -------
3
9
 
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
- if defined?(::Paranoia)
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) }
@@ -49,7 +49,7 @@ module SecondLevelCache
49
49
  end
50
50
 
51
51
  ext_key = keys.join(",")
52
- "uniq_key_#{name}_#{ext_key}"
52
+ "#{SecondLevelCache.configure.cache_key_prefix}/uniq_key_#{name}_#{ext_key}"
53
53
  end
54
54
 
55
55
  def record_attributes_equal_where_values?(record, where_values)
@@ -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]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SecondLevelCache
4
- VERSION = "2.6.1"
4
+ VERSION = "2.6.2"
5
5
  end
@@ -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
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Base.connection.create_table(:paranoids, force: true) do |t|
4
+ t.datetime :deleted_at
5
+ end
6
+
7
+ class Paranoid < ApplicationRecord
8
+ second_level_cache
9
+ acts_as_paranoid
10
+ end
@@ -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
@@ -27,6 +27,7 @@ require "model/order_item"
27
27
  require "model/account"
28
28
  require "model/animal"
29
29
  require "model/contribution"
30
+ require "model/paranoid"
30
31
 
31
32
  DatabaseCleaner[:active_record].strategy = :truncation
32
33
 
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.1
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-05-22 00:00:00.000000000 Z
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