active_model_cachers 2.1.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21afadb49c4f398b05f590e42e2d68dc972c4156601327aba48b218b5bfce70f
4
- data.tar.gz: c25d240a1b3c891ee31a191f72d8540e282724cc0638e79c3089cc17ada31dfc
3
+ metadata.gz: 26cbc738077c571fd681dba6f83be1faf69672e52f6d21ef242ff1bec6d7b8d1
4
+ data.tar.gz: efa2374d6689b0c2fc1c2738293053ecfcc67720840f53ec7ef789c6a84543b3
5
5
  SHA512:
6
- metadata.gz: 75634a849304a07c250dae3d82d9ff9eb579873b976482de1987e01b28f5cf95878edf53e3b83bc5eb794e7e1f31bf537018299a4d93bf4ba083dc74b4063403
7
- data.tar.gz: 1b05f797d94393b3d95a3b172a3276808f5bd6f3088d168698e2aa4ce55588aa6c1d58a62afbd29ab45ad9bb2c12d08c472aae0f718f549a5470d2a8e7af9256
6
+ metadata.gz: 179179ebf0b2b926963bdfc64392b65c952c5246cfdf4475196bfb9f5af6d2e8996f2c686bc33d031b3ef579c3736a68055e558363df991bb9708275f129f187
7
+ data.tar.gz: 21bac3df913b18a496c926816d2553c6fb84248d912b6a7861e41f03a37a82059ae86e14264f3f67fbc6bb23894e8bfd3514021d3b14d4d1d1af03c28907eafd
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## Change Log
2
2
 
3
+ ### [v2.1.1](https://github.com/khiav223577/active_model_cachers/compare/v2.1.0...v2.1.1) 2018/05/25
4
+ - [#35](https://github.com/khiav223577/active_model_cachers/pull/35) Preventing registering same callbacks in some cases (@khiav223577)
5
+ - [#34](https://github.com/khiav223577/active_model_cachers/pull/34) Enhance - automatically clean cache when `#touch` (@ff2248)
6
+ - [#33](https://github.com/khiav223577/active_model_cachers/pull/33) [Enhance] Code Climate Gem Deprecation (@berniechiu)
7
+
3
8
  ### [v2.1.0](https://github.com/khiav223577/active_model_cachers/compare/v2.0.3...v2.1.0) 2018/05/18
4
9
  - [#32](https://github.com/khiav223577/active_model_cachers/pull/32) Add test cases to test "store all data in hash" (@khiav223577)
5
10
  - [#31](https://github.com/khiav223577/active_model_cachers/pull/31) Change the syntax of getting self from cache (@khiav223577)
@@ -72,6 +72,11 @@ module ActiveModelCachers
72
72
  return query_attribute(binding, id)
73
73
  end
74
74
 
75
+ def extract_class_and_column
76
+ return [class_name, nil] if single_association?
77
+ return [@klass.to_s, @column]
78
+ end
79
+
75
80
  private
76
81
 
77
82
  def query_self(binding, id)
@@ -5,38 +5,49 @@ module ActiveModelCachers
5
5
  @defined_map = {}
6
6
 
7
7
  class << self
8
+ def get_cacher_klass(klass)
9
+ @defined_map[klass] ||= create_cacher_klass_at(klass)
10
+ end
11
+
8
12
  def define_cacher_method(attr, primary_key, service_klasses)
9
13
  cacher_klass = get_cacher_klass(attr.klass)
10
14
  method = attr.column
11
15
  return cacher_klass.define_find_by(attr, primary_key, service_klasses) if method == nil
12
- cacher_klass.attributes << method
13
- cacher_klass.send(:define_method, method){ exec_by(attr, primary_key, service_klasses, :get) }
14
- cacher_klass.send(:define_method, "peek_#{method}"){ exec_by(attr, primary_key, service_klasses, :peek) }
15
- cacher_klass.send(:define_method, "clean_#{method}"){ exec_by(attr, primary_key, service_klasses, :clean_cache) }
16
- end
17
-
18
- def get_cacher_klass(klass)
19
- @defined_map[klass] ||= create_cacher_klass_at(klass)
16
+ cacher_klass.send(:define_methods, method, {
17
+ method => ->{ exec_by(attr, primary_key, service_klasses, :get) },
18
+ "peek_#{method}" => ->{ exec_by(attr, primary_key, service_klasses, :peek) },
19
+ "clean_#{method}" => ->{ exec_by(attr, primary_key, service_klasses, :clean_cache) },
20
+ })
20
21
  end
21
22
 
22
23
  def define_find_by(attr, primary_key, service_klasses)
23
24
  if @find_by_mapping == nil
24
25
  @find_by_mapping = {}
25
- attributes << :find_by
26
- define_method(:find_by){|args| exec_find_by(args, :get) }
27
- define_method(:peek_by){|args| exec_find_by(args, :peek) }
28
- define_method(:clean_by){|args| exec_find_by(args, :clean_cache) }
26
+ define_methods(:find_by, {
27
+ :find_by => ->(args){ exec_find_by(args, :get) },
28
+ :peek_by => ->(args){ exec_find_by(args, :peek) },
29
+ :clean_by => ->(args){ exec_find_by(args, :clean_cache) },
30
+ })
29
31
  end
30
32
  @find_by_mapping[primary_key] = [attr, service_klasses]
31
33
  end
32
34
 
35
+ private
36
+
37
+ def define_methods(attribute, methods_mapping)
38
+ if attributes.include?(attribute)
39
+ methods_mapping.keys.each{|s| undef_method(s) }
40
+ else
41
+ attributes << attribute
42
+ end
43
+ methods_mapping.each{|method, block| define_method(method, &block) }
44
+ end
45
+
33
46
  def get_data_from_find_by_mapping(primary_key)
34
47
  return if @find_by_mapping == nil
35
48
  return @find_by_mapping[primary_key]
36
49
  end
37
50
 
38
- private
39
-
40
51
  def create_cacher_klass_at(target)
41
52
  cacher_klass = Class.new(self)
42
53
  cacher_klass.instance_variable_set(:@find_by_mapping, nil) # to remove warning: instance variable @find_by_mapping not initialized
@@ -60,7 +71,7 @@ module ActiveModelCachers
60
71
 
61
72
  def exec_find_by(args, method) # e.g. args = {course_id: xx}
62
73
  primary_key = args.keys.sort.first # Support only one key now.
63
- attr, service_klasses = self.class.get_data_from_find_by_mapping(primary_key)
74
+ attr, service_klasses = self.class.send(:get_data_from_find_by_mapping, primary_key)
64
75
  return if service_klasses == nil
65
76
  return exec_by(attr, primary_key, service_klasses, method, data: args[primary_key])
66
77
  end
@@ -16,13 +16,21 @@ module ActiveModelCachers
16
16
  attr = AttrModel.new(self, column, foreign_key: foreign_key, primary_key: primary_key)
17
17
  return cache_belongs_to(attr) if attr.belongs_to?
18
18
 
19
+ loaded = false
20
+ class_name, *infos = get_expire_infos(attr, expire_by, foreign_key)
21
+ set_klass_to_mapping(attr, class_name) do
22
+ next if !loaded
23
+ cache_at(column, query, expire_by: expire_by, on: on, foreign_key: foreign_key, primary_key: primary_key)
24
+ end
25
+ loaded = true
26
+
19
27
  query ||= ->(id){ attr.query_model(self, id) }
20
28
  service_klass = CacheServiceFactory.create_for_active_model(attr, query)
21
29
  Cacher.define_cacher_method(attr, attr.primary_key || :id, [service_klass])
22
30
 
23
- if (infos = get_expire_infos(attr, expire_by, foreign_key))
31
+ if class_name
24
32
  with_id = (expire_by.is_a?(Symbol) || query.parameters.size == 1)
25
- service_klass.define_callback_for_cleaning_cache(*infos, with_id, on: on)
33
+ service_klass.define_callback_for_cleaning_cache(class_name, *infos, with_id, on: on)
26
34
  end
27
35
 
28
36
  return service_klass
@@ -35,6 +43,12 @@ module ActiveModelCachers
35
43
 
36
44
  private
37
45
 
46
+ def set_klass_to_mapping(attr, class_name)
47
+ ActiveSupport::Dependencies.onload(class_name || self.to_s) do
48
+ yield if CacheServiceFactory.set_klass_to_mapping(attr, self)
49
+ end
50
+ end
51
+
38
52
  def get_expire_infos(attr, expire_by, foreign_key)
39
53
  if expire_by.is_a?(Symbol)
40
54
  expire_attr = get_association_attr(expire_by)
@@ -5,6 +5,7 @@ require 'active_model_cachers/cache_service'
5
5
  module ActiveModelCachers
6
6
  class CacheServiceFactory
7
7
  @key_class_mapping = {}
8
+ @cache_key_klass_mapping = {}
8
9
 
9
10
  class << self
10
11
  def has_cacher?(attr)
@@ -12,9 +13,7 @@ module ActiveModelCachers
12
13
  end
13
14
 
14
15
  def create_for_active_model(attr, query)
15
- cache_key = get_cache_key(attr)
16
- service_klass = create(cache_key, query)
17
- return service_klass
16
+ create(get_cache_key(attr), query)
18
17
  end
19
18
 
20
19
  def create(cache_key, query)
@@ -27,15 +26,30 @@ module ActiveModelCachers
27
26
  }[]
28
27
  end
29
28
 
29
+ def set_klass_to_mapping(attr, current_klass)
30
+ cache_key = get_cache_key(attr)
31
+ reflect = attr.klass.reflect_on_association(:posts)
32
+ changed = clean_klass_cache_if_reloaded!(cache_key, current_klass, attr)
33
+ @cache_key_klass_mapping[cache_key] = current_klass
34
+ return changed
35
+ end
36
+
30
37
  private
31
38
 
32
39
  def get_cache_key(attr)
33
- class_name, column = (attr.single_association? ? [attr.class_name, nil] : [attr.klass, attr.column])
40
+ class_name, column = attr.extract_class_and_column
34
41
  return "active_model_cachers_#{class_name}_at_#{column}" if column
35
42
  foreign_key = attr.foreign_key(reverse: true)
36
43
  return "active_model_cachers_#{class_name}_by_#{foreign_key}" if foreign_key and foreign_key.to_s != 'id'
37
44
  return "active_model_cachers_#{class_name}"
38
45
  end
46
+
47
+ def clean_klass_cache_if_reloaded!(cache_key, current_klass, attr)
48
+ origin_klass, @cache_key_klass_mapping[cache_key] = @cache_key_klass_mapping[cache_key], current_klass
49
+ return false if origin_klass == nil or origin_klass == current_klass # when code reloaded in development.
50
+ @key_class_mapping[cache_key] = nil
51
+ return true
52
+ end
39
53
  end
40
54
  end
41
55
  end
@@ -3,12 +3,12 @@ require 'active_support/dependencies'
3
3
 
4
4
  module ActiveModelCachers::Hook
5
5
  module Depdenencies
6
- def onload(const_name, &block)
6
+ def onload(const_name, times: 1, &block)
7
7
  const = const_name if not const_name.is_a?(String)
8
8
  if const or Module.const_defined?(const_name)
9
9
  (const || const_name.constantize).instance_exec(&block)
10
10
  else
11
- load_hooks[const_name].push(block)
11
+ load_hooks[const_name].push(block: block, times: times)
12
12
  end
13
13
  end
14
14
 
@@ -17,7 +17,19 @@ module ActiveModelCachers::Hook
17
17
  end
18
18
 
19
19
  def new_constants_in(*)
20
- new_constants = super.each{|s| load_hooks[s].each{|hook| s.constantize.instance_exec(&hook) } }
20
+ new_constants = super.each do |const_name|
21
+ hooks = load_hooks[const_name]
22
+ need_compact = false
23
+ hooks.each_with_index do |hook, idx|
24
+ if (hook[:times] -= 1) < 0
25
+ hooks[idx] = nil
26
+ need_compact = true
27
+ next
28
+ end
29
+ const_name.constantize.instance_exec(&hook[:block])
30
+ end
31
+ hooks.compact! if need_compact
32
+ end
21
33
  return new_constants
22
34
  end
23
35
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ActiveModelCachers
3
- VERSION = '2.1.1'
3
+ VERSION = '2.1.2'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_model_cachers
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - khiav reoy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-25 00:00:00.000000000 Z
11
+ date: 2018-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler