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 +4 -4
- data/lib/attribute_cache.rb +49 -27
- data/lib/attribute_cache/attribute_cache.rb +42 -0
- data/lib/attribute_cache/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66a21b6648b4cfdfd46b0a30e6f98e574638b0b7fefe09e13b9cf1d566a6c358
|
4
|
+
data.tar.gz: e31fae03845ef5bb5d0b8144b502539a299258d7fecf863420ab246d9444e2a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b7b7e01e7e9d516b76be4c1b55cc28ecd7a224912174a13ce0b8c7ea814398a51978e5142560f721850883debc2c9dee814677e6aa554dc34e3ac8bc90248fa
|
7
|
+
data.tar.gz: 49133b0d6ebb635ca0676b6526b560f4c94cd806bbc4c6abfe47b469d414394c3f78bb8cb2605cc11e273cfa3b4cec8eaf8936bcaeb49301d8ff80980b30c51c
|
data/lib/attribute_cache.rb
CHANGED
@@ -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,
|
9
|
-
|
10
|
-
|
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
|
-
|
14
|
-
|
14
|
+
options.default! :attribute, :"#{options[:attribute_prefix]}_#{name}"
|
15
|
+
options.default! :callback, :"#{options[:callback_prefix]}_#{name}"
|
15
16
|
|
16
|
-
|
17
|
-
|
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
|
-
|
22
|
-
|
23
|
-
|
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
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
36
|
-
return yield if block_given?
|
64
|
+
private
|
37
65
|
|
38
|
-
|
39
|
-
|
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
|
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.
|
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-
|
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
|