attribute-depends-calculator 0.1 → 0.2

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: a046d88fe7d1ad88d0ae1b29dd7041ccfc43b2d2
4
- data.tar.gz: 6596be90ac350adf829691445a560a4cee535513
3
+ metadata.gz: f26cc6d17eed91fc793b014e4bdf1fc3a58a8c77
4
+ data.tar.gz: bb121079814fbfccad2f3b8239504d3d2d8b152f
5
5
  SHA512:
6
- metadata.gz: 79677cba067d8d844f4acc3659f5688b12a932e5305aab398c23d306f0a88bcff11f98a42d5ea4905a316d22cc910d01633a5edfd9398e0b189b22c63808e3cd
7
- data.tar.gz: be9f7bc1aa6256fdfed2ac55b29ac8d5d11dc67e8d9939ca7e0df2dd74870350cc621fae59babd9ab64612bea9d7bb6ce492a21a5a18b5dd08cc86e9e0bf6ab9
6
+ metadata.gz: e2a04601664feb8771c9d2db48d9aa674675f78875a4c97e918a701af9d1074fe207a5dae6d1aa9257fad95696b5f227e77d396ea56d3105f949895e60128307
7
+ data.tar.gz: c104cdd193bf0b0d6519b8ce500eb2b8bb7be8b9b5d9521f54d26ba2aea743e1604fe2d17c7b7fe3e2e1b6467ea1186c2a0f47872eb4059d1beac20001b8a7d5
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore CHANGED
@@ -9,4 +9,4 @@
9
9
  /tmp/
10
10
  .ruby-version
11
11
  .idea/
12
- .gem
12
+ *.gem
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
- # Attribute Depends Calculator [![Build Status](https://travis-ci.org/falm/attribute-depends-calculator.svg?branch=master)](https://travis-ci.org/falm/attribute-depends-calculator) [![Coverage Status](https://coveralls.io/repos/github/falm/attribute-depends-calculator/badge.svg)](https://coveralls.io/github/falm/attribute-depends-calculator)
1
+ # Attribute Depends Calculator
2
+ [![Build Status](https://travis-ci.org/falm/attribute-depends-calculator.svg?branch=master)](https://travis-ci.org/falm/attribute-depends-calculator) [![Coverage Status](https://coveralls.io/repos/github/falm/attribute-depends-calculator/badge.svg?branch=master)](https://coveralls.io/github/falm/attribute-depends-calculator?branch=master) [![Code Climate](https://codeclimate.com/github/falm/attribute-depends-calculator/badges/gpa.svg)](https://codeclimate.com/github/falm/attribute-depends-calculator) [![Dependency Status](https://gemnasium.com/badges/github.com/falm/attribute-depends-calculator.svg)](https://gemnasium.com/github.com/falm/attribute-depends-calculator) [![Gem Version](https://badge.fury.io/rb/attribute-depends-calculator.svg)](https://badge.fury.io/rb/attribute-depends-calculator)
2
3
 
3
- The scenario of the gem is when you have a 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
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
4
5
 
5
6
  ## Installation
6
7
 
@@ -19,7 +20,7 @@ Assume you have model order and order-item
19
20
  ```ruby
20
21
  class Order < ActiveRecord::Base
21
22
  has_many :order_items
22
- depends total_price: {order_items: :price}
23
+ depend total_price: {order_items: :price}
23
24
  end
24
25
 
25
26
  class OrderItem < ActiveRecord::Base
@@ -38,7 +39,73 @@ order_item.update(price: 100)
38
39
  order.reload.total_price
39
40
  #=> 150.0
40
41
  ```
41
- As above price of order automatically update when whatever order_items changes
42
+ As above show the price of order automatically update when whatever order_items changes
43
+
44
+ ## Advance
45
+
46
+ The options **operator** had two cateogries of value, the default value of the gem is expression **sum**
47
+
48
+ #### Operation
49
+
50
+ ```ruby
51
+ class Order < ActiveRecord::Base
52
+ has_many :order_items
53
+ depend total_price: {order_items: :price, operator: :+} # or :*
54
+ end
55
+ ```
56
+
57
+ #### Expression
58
+
59
+ The following expression can be use to calculate the collection of depends attributes
60
+
61
+ **sum**
62
+
63
+ ```ruby
64
+ class Order < ActiveRecord::Base
65
+ ...
66
+ depend total_price: {order_items: :price, operator: :sum} # default
67
+ end
68
+ ```
69
+
70
+ **average**
71
+
72
+ ```ruby
73
+ class Order < ActiveRecord::Base
74
+ ...
75
+ depend avg_price: {order_items: :price, operator: :average}
76
+ end
77
+ ```
78
+
79
+ **count**
80
+
81
+ ```ruby
82
+ class Order < ActiveRecord::Base
83
+ ...
84
+ depend order_items_count: {order_items: :price, operator: :count}
85
+ end
86
+ ```
87
+
88
+ **minimum**
89
+
90
+ ```ruby
91
+ class Order < ActiveRecord::Base
92
+ ...
93
+ depend min_price: {order_items: :price, operator: :minimum}
94
+ end
95
+ ```
96
+
97
+ **maximum**
98
+
99
+ ```ruby
100
+ class Order < ActiveRecord::Base
101
+ ...
102
+ depend max_price: {order_items: :price, operator: :maximum}
103
+ end
104
+ ```
105
+
106
+
107
+
108
+
42
109
 
43
110
  ## Contributing
44
111
 
data/bin/console CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "bundler/setup"
4
- require "attribute/depends/calculator"
5
-
4
+ require 'rails/all'
5
+ require "attribute-depends-calculator"
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
@@ -1,9 +1,18 @@
1
1
  module AttributeDependsCalculator
2
2
  class Factory
3
- attr_accessor :klass, :column, :params, :association, :associate_column, :association_name
3
+
4
+ attr_accessor :klass, :column, :association
5
+
6
+ attr_accessor :parameter
7
+
8
+ extend Forwardable
9
+
10
+ def_delegators :parameter, :depend_association_name, :depend_column, :expression
11
+
4
12
  def initialize(klass, column, params)
5
13
  self.klass, self.column = klass, column
6
- self.association, self.associate_column, self.association_name = fetch_association(params)
14
+ self.parameter = Parameter.new(params)
15
+ self.association = fetch_association
7
16
  end
8
17
 
9
18
  def perform
@@ -14,9 +23,9 @@ module AttributeDependsCalculator
14
23
  private
15
24
 
16
25
  def define_calculator
17
- self.klass.class_eval <<-METHOD, __FILE__, __LINE__
26
+ self.klass.class_eval <<-METHOD, __FILE__, __LINE__ + 1
18
27
  def #{calculate_method_name}
19
- total = self.#{association_name}.pluck(:#{associate_column}).compact.reduce(0, :+)
28
+ total = self.#{depend_association_name}.#{expression}
20
29
  update(:#{column} => total)
21
30
  end
22
31
  METHOD
@@ -27,12 +36,11 @@ module AttributeDependsCalculator
27
36
  end
28
37
 
29
38
  def klass_assoc_name
30
- klass.table_name.singularize
39
+ @assoc_name ||= association.reflect_on_all_associations.find {|assoc| assoc.plural_name == klass.table_name}.name
31
40
  end
32
41
 
33
- def fetch_association(params)
34
- assoc = params.keys.first
35
- [klass.reflect_on_association(assoc).class_name.constantize, params.values.first, assoc]
42
+ def fetch_association
43
+ ObjectSpace.const_get klass.reflect_on_association(depend_association_name).class_name
36
44
  end
37
45
 
38
46
  def append_callbacks
@@ -41,14 +49,14 @@ module AttributeDependsCalculator
41
49
  end
42
50
 
43
51
  def append_callback_hook
44
- self.association.class_eval <<-METHOD, __FILE__, __LINE__
52
+ self.association.class_eval <<-METHOD, __FILE__, __LINE__ + 1
45
53
  after_save :depends_update_#{column}
46
54
  around_destroy :depends_update_#{column}_around
47
55
  METHOD
48
56
  end
49
57
 
50
58
  def define_callback_methods
51
- self.association.class_eval <<-METHOD, __FILE__, __LINE__
59
+ self.association.class_eval <<-METHOD, __FILE__, __LINE__ + 1
52
60
  private
53
61
 
54
62
  def depends_update_#{column}
@@ -1,10 +1,13 @@
1
1
  module AttributeDependsCalculator
2
2
  module Macro
3
- def depend(options)
3
+
4
+ def attribute_depend(options)
4
5
  options.each do |column, option|
5
6
  Factory.new(self, column, option).perform
6
7
  end
7
8
  end
9
+
10
+ alias_method :depend, :attribute_depend
8
11
  end
9
12
  end
10
13
 
@@ -0,0 +1,35 @@
1
+ module AttributeDependsCalculator
2
+ class Parameter
3
+
4
+ attr_accessor :params, :depend_association_name, :depend_column, :operator
5
+
6
+ OPERATORS = %i(+ *)
7
+ METHODS = %i(sum average count minimum maximum)
8
+
9
+ def initialize(params)
10
+ self.operator = params.values_at(:operator).first || :sum
11
+ self.params = params
12
+ fetch
13
+ end
14
+
15
+ def fetch
16
+ self.depend_association_name = params.keys.first
17
+ self.depend_column = params.values.first
18
+ end
19
+
20
+ def expression
21
+ operator_filter
22
+ end
23
+
24
+ def operator_filter
25
+ if OPERATORS.include? operator
26
+ "pluck(:#{depend_column}).compact.reduce(0, :#{operator})"
27
+ elsif METHODS.include? operator
28
+ "#{operator}(:#{depend_column})"
29
+ else
30
+ raise 'The operator of depends calculator are incorrect'
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module AttributeDependsCalculator
3
- VERSION = '0.1'
3
+ VERSION = '0.2'
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.1'
4
+ version: '0.2'
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-07-23 00:00:00.000000000 Z
11
+ date: 2016-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -60,6 +60,7 @@ executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
+ - ".coveralls.yml"
63
64
  - ".gitignore"
64
65
  - ".rspec"
65
66
  - ".travis.yml"
@@ -74,6 +75,7 @@ files:
74
75
  - lib/attribute_depends_calculator/engine.rb
75
76
  - lib/attribute_depends_calculator/factory.rb
76
77
  - lib/attribute_depends_calculator/macro.rb
78
+ - lib/attribute_depends_calculator/parameter.rb
77
79
  - lib/attribute_depends_calculator/version.rb
78
80
  homepage: https://github.com/falm/attribute-depends-calculator
79
81
  licenses: