attribute_cache 0.1.1 → 0.2.0

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: efa6e9e1044472ae54ebeac9e70d18a52d20b93461f79526b0ad73857ab2d82c
4
- data.tar.gz: d5bd1fc2e76d72e64f00eccc7272b77aaecb61b9ab39675499bced0dd7a89eca
3
+ metadata.gz: 66a21b6648b4cfdfd46b0a30e6f98e574638b0b7fefe09e13b9cf1d566a6c358
4
+ data.tar.gz: e31fae03845ef5bb5d0b8144b502539a299258d7fecf863420ab246d9444e2a3
5
5
  SHA512:
6
- metadata.gz: dbce65bc84784353b25dd06439f4af95307c633d36751f409a58f75f9b0f3d8fa8f5a0c67689ce2fc8c81c9c83dfb65c358fc646d1085663b023179b78c0c996
7
- data.tar.gz: 1cf6172850c165c3145fa4599c663f1a60ff11514e6534d390725433afd746188493d3703299be10a5b1422b2de315f4289eeb2d193d702c356e5c70c228b66e
6
+ metadata.gz: 8b7b7e01e7e9d516b76be4c1b55cc28ecd7a224912174a13ce0b8c7ea814398a51978e5142560f721850883debc2c9dee814677e6aa554dc34e3ac8bc90248fa
7
+ data.tar.gz: 49133b0d6ebb635ca0676b6526b560f4c94cd806bbc4c6abfe47b469d414394c3f78bb8cb2605cc11e273cfa3b4cec8eaf8936bcaeb49301d8ff80980b30c51c
@@ -1,47 +1,69 @@
1
+ require 'first_existing'
1
2
  require 'attribute_cache/version'
2
3
  require 'attribute_cache/railtie'
4
+ require 'attribute_cache/attribute_cache'
3
5
 
4
6
  module AttributeCache
5
7
  extend ActiveSupport::Concern
6
8
 
7
9
  included do
8
- def self.attribute_cache(name, attribute: nil, callback: nil, callback_prefix: 'calculate',
9
- attribute_prefix: 'cached', &block)
10
- attribute ||= :"#{attribute_prefix}_#{name}"
11
- callback ||= :"#{callback_prefix}_#{name}"
10
+ def self.attribute_cache(name, options = {}, &block)
11
+ options.default! :attribute_prefix, 'cached'
12
+ options.default! :callback_prefix, 'calculate'
12
13
 
13
- set_method = "set_#{name}"
14
- set_save_method = "set_#{name}!"
14
+ options.default! :attribute, :"#{options[:attribute_prefix]}_#{name}"
15
+ options.default! :callback, :"#{options[:callback_prefix]}_#{name}"
15
16
 
16
- define_method set_method do
17
- write_attribute(attribute, call_callback(callback, self, &block))
17
+ options[:callback] = block if block_given?
18
+
19
+ options.default! :cache_on_create, false
20
+ options.default! :dependent_on, []
21
+
22
+ options[:dependent_on] = [options[:dependent_on]] unless options[:dependent_on].is_a? Array
23
+
24
+ attr_cache = AttributeCache.new(
25
+ name: name,
26
+ attribute: options[:attribute],
27
+ callback: options[:callback]
28
+ )
29
+
30
+ if options[:cache_on_create]
31
+ before_create(if: -> { read_attribute(options[:attribute]).nil? }) do
32
+ attr_cache.set_attribute(self)
33
+ end
18
34
  end
19
- define_method("invalidate_#{name}") { send(set_method) }
20
35
 
21
- define_method set_save_method do
22
- send(set_method)
23
- save
36
+ if options[:dependent_on].count.positive?
37
+ before_update(if: -> { dependent_attribute_will_change(self, options[:dependent_on]) }) do
38
+ attr_cache.invalidate_attribute(self)
39
+ end
24
40
  end
25
- define_method("invalidate_#{name}!") { send(set_save_method) }
26
41
 
27
- define_method name do |save: true, keep_blanks: true|
28
- setter = save ? set_save_method : set_method
29
- send(setter) if read_attribute(attribute).nil? || !keep_blanks && read_attribute(attribute).blank?
30
- read_attribute(attribute)
42
+ define_method("set_#{name}") do |save: false|
43
+ attr_cache.set_attribute(self, save: save)
44
+ end
45
+
46
+ define_method("invalidate_#{name}") do |save: false|
47
+ attr_cache.invalidate_attribute(self, save: save)
48
+ end
49
+
50
+ define_method("set_#{name}!") do
51
+ attr_cache.set_attribute!(self)
52
+ end
53
+
54
+ define_method("invalidate_#{name}!") do
55
+ attr_cache.invalidate_attribute!(self)
56
+ end
57
+
58
+ define_method(name) do |save: true, keep_blanks: true|
59
+ attr_cache.value(self, save: save, keep_blanks: keep_blanks)
31
60
  end
32
61
  end
33
62
  end
34
63
 
35
- def call_callback(callback, record)
36
- return yield if block_given?
64
+ private
37
65
 
38
- case callback
39
- when Symbol, String
40
- record.send(callback)
41
- when Proc
42
- callback[]
43
- else
44
- raise 'An invalid callback was provided!'
45
- end
66
+ def dependent_attribute_will_change(record, dependent_on)
67
+ dependent_on.any? { |d| record.will_save_change_to_attribute?(d) }
46
68
  end
47
69
  end
@@ -0,0 +1,42 @@
1
+ module AttributeCache
2
+ class AttributeCache
3
+ def initialize(name:, attribute:, callback:)
4
+ @name = name
5
+ @attribute = attribute
6
+ @callback = callback
7
+ end
8
+
9
+ def set_attribute(record, save: false)
10
+ record.write_attribute(@attribute, execute_callback(record))
11
+ record.save if save
12
+ end
13
+ alias invalidate_attribute set_attribute
14
+
15
+ def set_attribute!(record)
16
+ set_attribute(record, save: true)
17
+ end
18
+ alias invalidate_attribute! set_attribute!
19
+
20
+ def value(record, save:, keep_blanks:)
21
+ set_attribute(record, save: save) if cached_value(record).nil? || !keep_blanks && cached_value(record).blank?
22
+ cached_value(record)
23
+ end
24
+
25
+ private
26
+
27
+ def cached_value(record)
28
+ record.read_attribute(@attribute)
29
+ end
30
+
31
+ def execute_callback(record)
32
+ case @callback
33
+ when Symbol, String
34
+ record.send(@callback)
35
+ when Proc
36
+ @callback[]
37
+ else
38
+ raise 'An invalid callback was provided!'
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,3 +1,3 @@
1
1
  module AttributeCache
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attribute_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Lockard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-18 00:00:00.000000000 Z
11
+ date: 2021-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: first_existing
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -85,6 +99,7 @@ files:
85
99
  - README.md
86
100
  - Rakefile
87
101
  - lib/attribute_cache.rb
102
+ - lib/attribute_cache/attribute_cache.rb
88
103
  - lib/attribute_cache/railtie.rb
89
104
  - lib/attribute_cache/version.rb
90
105
  - lib/tasks/attribute_cache_tasks.rake