attribute-depends-calculator 0.2 → 0.3

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
  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