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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f26cc6d17eed91fc793b014e4bdf1fc3a58a8c77
4
- data.tar.gz: bb121079814fbfccad2f3b8239504d3d2d8b152f
3
+ metadata.gz: 610ef3f54cde8fa3b3d074bf14072dd40e343215
4
+ data.tar.gz: d7f007351bf8cb3d93d58d5881f6ab701ca9719d
5
5
  SHA512:
6
- metadata.gz: e2a04601664feb8771c9d2db48d9aa674675f78875a4c97e918a701af9d1074fe207a5dae6d1aa9257fad95696b5f227e77d396ea56d3105f949895e60128307
7
- data.tar.gz: c104cdd193bf0b0d6519b8ce500eb2b8bb7be8b9b5d9521f54d26ba2aea743e1604fe2d17c7b7fe3e2e1b6467ea1186c2a0f47872eb4059d1beac20001b8a7d5
6
+ metadata.gz: f9349e547e3c5b87bf6445aaf7243effa2367ed1b2ff2ababddcc323c96d58959e3ccc00f7f18b6c3407735182489ca0bf2dc01337199afd43e203ca52d0929f
7
+ data.tar.gz: 2cee06a7cada6e7c99f39da8ae2de5a4157d5d510983ff0146cd54ae13a2286a717ef8ac25bef857d10b379d5db702be89de0863d2bff96c76c25714bc316eb0
data/.gitignore CHANGED
@@ -10,3 +10,4 @@
10
10
  .ruby-version
11
11
  .idea/
12
12
  *.gem
13
+ *.un~
data/.travis.yml CHANGED
@@ -4,5 +4,14 @@ rvm:
4
4
  - 2.1.5
5
5
  - 2.2
6
6
  - 2.3.0
7
+ gemfile:
8
+ - Gemfile
9
+ - Gemfile.rails40
10
+ - Gemfile.rails41
11
+ matrix:
12
+ include:
13
+ - rvm: 2.3.0
14
+ gemfile: Gemfile.rails50
15
+
7
16
  script: xvfb-run rspec
8
17
  before_install: gem install bundler -v 1.11.2
data/Gemfile CHANGED
@@ -1,12 +1,5 @@
1
- source 'https://rubygems.org'
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', '>=4.2.5'
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
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'sqlite3', '>=1.3.6'
7
+ gem 'rspec', '~> 2.11'
8
+ gem 'database_cleaner'
9
+ gem 'coveralls', require: false
10
+ end
data/Gemfile.rails40 ADDED
@@ -0,0 +1,5 @@
1
+ eval_gemfile('Gemfile.global')
2
+
3
+ group :test do
4
+ gem 'rails', '4.0'
5
+ end
data/Gemfile.rails41 ADDED
@@ -0,0 +1,5 @@
1
+ eval_gemfile('Gemfile.global')
2
+
3
+ group :test do
4
+ gem 'rails', '4.1.5'
5
+ end
data/Gemfile.rails50 ADDED
@@ -0,0 +1,5 @@
1
+ eval_gemfile('Gemfile.global')
2
+
3
+ group :test do
4
+ gem 'rails', '5.0.0'
5
+ end
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
- ## Advance
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
- 1. Fork it ( http://github.com/zmbacker/enum_help/fork )
113
- 2. Create your feature branch (`git checkout -b my-new-feature`)
114
- 3. Commit your changes (`git commit -am 'Add some feature'`)
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 = self.#{depend_association_name}.#{expression}
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
@@ -1,4 +1,4 @@
1
1
 
2
2
  module AttributeDependsCalculator
3
- VERSION = '0.2'
3
+ VERSION = '0.3'
4
4
  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.2'
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: 2016-08-02 00:00:00.000000000 Z
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.6
90
+ rubygems_version: 2.6.8
101
91
  signing_key:
102
92
  specification_version: 4
103
93
  summary: calculate depends attribute automatically