attribute-depends-calculator 0.2 → 0.3
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/.gitignore +1 -0
- data/.travis.yml +9 -0
- data/Gemfile +2 -9
- data/Gemfile.global +10 -0
- data/Gemfile.rails40 +5 -0
- data/Gemfile.rails41 +5 -0
- data/Gemfile.rails50 +5 -0
- data/README.md +18 -7
- data/attribute-depends-calculator.gemspec +1 -1
- data/lib/attribute_depends_calculator/factory.rb +22 -3
- data/lib/attribute_depends_calculator/parameter.rb +12 -5
- data/lib/attribute_depends_calculator/version.rb +1 -1
- metadata +8 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 610ef3f54cde8fa3b3d074bf14072dd40e343215
|
4
|
+
data.tar.gz: d7f007351bf8cb3d93d58d5881f6ab701ca9719d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9349e547e3c5b87bf6445aaf7243effa2367ed1b2ff2ababddcc323c96d58959e3ccc00f7f18b6c3407735182489ca0bf2dc01337199afd43e203ca52d0929f
|
7
|
+
data.tar.gz: 2cee06a7cada6e7c99f39da8ae2de5a4157d5d510983ff0146cd54ae13a2286a717ef8ac25bef857d10b379d5db702be89de0863d2bff96c76c25714bc316eb0
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,12 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in attribute-depends-calculator.gemspec
|
4
|
-
gemspec
|
1
|
+
eval_gemfile('Gemfile.global')
|
5
2
|
|
6
3
|
group :test do
|
7
|
-
gem 'rails', '
|
8
|
-
gem 'sqlite3', '>=1.3.6'
|
9
|
-
gem 'rspec', '~> 2.11'
|
10
|
-
gem 'database_cleaner'
|
11
|
-
gem 'coveralls', require: false
|
4
|
+
gem 'rails', '4.2.7.1'
|
12
5
|
end
|
data/Gemfile.global
ADDED
data/Gemfile.rails40
ADDED
data/Gemfile.rails41
ADDED
data/Gemfile.rails50
ADDED
data/README.md
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
|
4
4
|
The scenario of the gem is when you have an attribute on model that value depends of a calculation of other model's attribute which attribute's model related. AttributeDependsCalculator will help you solve the case
|
5
5
|
|
6
|
+
## Requirements
|
7
|
+
1. Ruby **2.0+**
|
8
|
+
2. Rails **4.0+**
|
9
|
+
|
6
10
|
## Installation
|
7
11
|
|
8
12
|
Add this line to your application's Gemfile:
|
@@ -41,7 +45,7 @@ order.reload.total_price
|
|
41
45
|
```
|
42
46
|
As above show the price of order automatically update when whatever order_items changes
|
43
47
|
|
44
|
-
##
|
48
|
+
## Advanced
|
45
49
|
|
46
50
|
The options **operator** had two cateogries of value, the default value of the gem is expression **sum**
|
47
51
|
|
@@ -104,16 +108,23 @@ end
|
|
104
108
|
```
|
105
109
|
|
106
110
|
|
111
|
+
**Proc**
|
112
|
+
|
113
|
+
Proc can be passing in operator option, and the only one params is the active reload of the depended relate Model
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
class Order < ActiveRecord::Base
|
117
|
+
...
|
118
|
+
depend discount_price: {order_items: :price, operator: -> (items) { items.sum(:price) * discount } }
|
119
|
+
end
|
120
|
+
```
|
107
121
|
|
108
122
|
|
109
123
|
|
110
|
-
## Contributing
|
111
124
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
116
|
-
5. Create new Pull Request
|
125
|
+
|
126
|
+
## Contributing
|
127
|
+
Bug reports and pull requests are welcome [on GitHub](https://github.com/falm/attribute-depends-calculator)
|
117
128
|
|
118
129
|
## License
|
119
130
|
MIT © [Falm](https://github.com/falm)
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
spec.licenses = ["MIT"]
|
21
21
|
|
22
|
+
spec.required_ruby_version = '>= 2.0'
|
22
23
|
spec.add_development_dependency "bundler", "~> 1.11"
|
23
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
-
spec.add_development_dependency 'rack', '~> 1.5'
|
25
25
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module AttributeDependsCalculator
|
2
4
|
class Factory
|
3
5
|
|
@@ -5,9 +7,9 @@ module AttributeDependsCalculator
|
|
5
7
|
|
6
8
|
attr_accessor :parameter
|
7
9
|
|
8
|
-
extend Forwardable
|
10
|
+
extend ::Forwardable
|
9
11
|
|
10
|
-
def_delegators :parameter, :depend_association_name, :depend_column, :expression
|
12
|
+
def_delegators :parameter, :depend_association_name, :depend_column, :expression, :proc?, :callback
|
11
13
|
|
12
14
|
def initialize(klass, column, params)
|
13
15
|
self.klass, self.column = klass, column
|
@@ -17,6 +19,7 @@ module AttributeDependsCalculator
|
|
17
19
|
|
18
20
|
def perform
|
19
21
|
define_calculator
|
22
|
+
define_operator_callback
|
20
23
|
append_callbacks
|
21
24
|
end
|
22
25
|
|
@@ -25,12 +28,28 @@ module AttributeDependsCalculator
|
|
25
28
|
def define_calculator
|
26
29
|
self.klass.class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
27
30
|
def #{calculate_method_name}
|
28
|
-
total =
|
31
|
+
total = #{calculate}
|
29
32
|
update(:#{column} => total)
|
30
33
|
end
|
31
34
|
METHOD
|
32
35
|
end
|
33
36
|
|
37
|
+
def calculate
|
38
|
+
if self.proc?
|
39
|
+
"self.#{column}_depends_callback(#{depend_association_name})"
|
40
|
+
else
|
41
|
+
"self.#{depend_association_name}.#{expression}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def define_operator_callback
|
46
|
+
callback, column = self.callback, self.column
|
47
|
+
return if callback.nil?
|
48
|
+
self.klass.class_eval do
|
49
|
+
define_method "#{column}_depends_callback", &callback
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
34
53
|
def calculate_method_name
|
35
54
|
"calculate_and_update_#{column}"
|
36
55
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module AttributeDependsCalculator
|
2
2
|
class Parameter
|
3
3
|
|
4
|
-
attr_accessor :params, :depend_association_name, :depend_column, :operator
|
4
|
+
attr_accessor :params, :depend_association_name, :depend_column, :operator, :expression
|
5
5
|
|
6
6
|
OPERATORS = %i(+ *)
|
7
7
|
METHODS = %i(sum average count minimum maximum)
|
@@ -15,21 +15,28 @@ module AttributeDependsCalculator
|
|
15
15
|
def fetch
|
16
16
|
self.depend_association_name = params.keys.first
|
17
17
|
self.depend_column = params.values.first
|
18
|
-
end
|
19
|
-
|
20
|
-
def expression
|
21
18
|
operator_filter
|
22
19
|
end
|
23
20
|
|
24
21
|
def operator_filter
|
25
|
-
if OPERATORS.include? operator
|
22
|
+
self.expression = if OPERATORS.include? operator
|
26
23
|
"pluck(:#{depend_column}).compact.reduce(0, :#{operator})"
|
27
24
|
elsif METHODS.include? operator
|
28
25
|
"#{operator}(:#{depend_column})"
|
26
|
+
elsif operator.kind_of? Proc
|
27
|
+
@proc = operator
|
29
28
|
else
|
30
29
|
raise 'The operator of depends calculator are incorrect'
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
33
|
+
def proc?
|
34
|
+
!@proc.nil?
|
35
|
+
end
|
36
|
+
|
37
|
+
def callback
|
38
|
+
@proc
|
39
|
+
end
|
40
|
+
|
34
41
|
end
|
35
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attribute-depends-calculator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Hou
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rack
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.5'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.5'
|
55
41
|
description: auto calculate collect of depends attribute value and save when that
|
56
42
|
changes
|
57
43
|
email:
|
@@ -65,6 +51,10 @@ files:
|
|
65
51
|
- ".rspec"
|
66
52
|
- ".travis.yml"
|
67
53
|
- Gemfile
|
54
|
+
- Gemfile.global
|
55
|
+
- Gemfile.rails40
|
56
|
+
- Gemfile.rails41
|
57
|
+
- Gemfile.rails50
|
68
58
|
- README.md
|
69
59
|
- Rakefile
|
70
60
|
- attribute-depends-calculator.gemspec
|
@@ -89,7 +79,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
79
|
requirements:
|
90
80
|
- - ">="
|
91
81
|
- !ruby/object:Gem::Version
|
92
|
-
version: '0'
|
82
|
+
version: '2.0'
|
93
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
84
|
requirements:
|
95
85
|
- - ">="
|
@@ -97,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
87
|
version: '0'
|
98
88
|
requirements: []
|
99
89
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.6.
|
90
|
+
rubygems_version: 2.6.8
|
101
91
|
signing_key:
|
102
92
|
specification_version: 4
|
103
93
|
summary: calculate depends attribute automatically
|