customize 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/app/models/customize/formular.rb +5 -3
- data/app/models/customize/inherit_node.rb +7 -0
- data/customize.gemspec +2 -2
- data/lib/customize/calculator/base.rb +8 -4
- data/lib/customize/calculator/expression_calculator.rb +1 -1
- data/lib/customize/inherited.rb +50 -17
- data/spec/customize/formulaic_spec.rb +1 -1
- data/spec/customize/inherited_spec.rb +26 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
@@ -4,12 +4,14 @@ module Customize
|
|
4
4
|
serialize :calculator_attributes
|
5
5
|
|
6
6
|
def calculator
|
7
|
+
return unless calculator_name
|
7
8
|
cal = calculator_name.constantize
|
8
9
|
cal_ins = cal.new
|
9
|
-
|
10
|
-
(calculator_attributes.keys & cal.inputs)
|
10
|
+
calculator_attributes.try :symbolize_keys! if calculator_attributes.respond_to? :symbolize_keys!
|
11
|
+
names = (calculator_attributes.keys.map!(&:to_sym) & cal.inputs) if calculator_attributes
|
12
|
+
names.each do |name|
|
11
13
|
cal_ins.instance_variable_set "@#{name}", calculator_attributes[name]
|
12
|
-
end if
|
14
|
+
end if names
|
13
15
|
cal_ins
|
14
16
|
end
|
15
17
|
end
|
@@ -3,6 +3,13 @@ class Customize::InheritNode < ActiveRecord::Base
|
|
3
3
|
belongs_to :parent_node, :class_name=>self.name, :foreign_key=> 'parent_id'
|
4
4
|
belongs_to :node, :polymorphic=>true
|
5
5
|
has_many :children, :class_name=>self.name, :foreign_key=>'parent_id'
|
6
|
+
has_many :ancestors, :class_name=>self.name, :finder_sql=> proc {
|
7
|
+
%Q{
|
8
|
+
select distinct nodes.*
|
9
|
+
from customize_inherit_nodes nodes
|
10
|
+
where nodes.right > #{right} and nodes.left < #{left} and nodes.node_type = "#{node_type}"
|
11
|
+
}
|
12
|
+
}
|
6
13
|
|
7
14
|
scope :by_type, lambda { |type| where(:node_type=>type) }
|
8
15
|
|
data/customize.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "customize"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ryan Wong"]
|
12
|
-
s.date = "2012-05-
|
12
|
+
s.date = "2012-05-04"
|
13
13
|
s.description = "\n\t\teasy customize your domain model, including:\n\t\tcharacterize;\n\t\tinherit;\n\t\tformula\n\t"
|
14
14
|
s.email = "ryan@idolgo.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -1,15 +1,19 @@
|
|
1
1
|
module Customize
|
2
2
|
module Calculator
|
3
|
-
class Base
|
3
|
+
class Base
|
4
4
|
cattr_accessor :inputs
|
5
|
-
|
5
|
+
self.inputs = []
|
6
6
|
def self.input name
|
7
7
|
sym = name.to_sym
|
8
|
-
|
8
|
+
inputs << sym
|
9
9
|
attr_accessor sym
|
10
10
|
end
|
11
11
|
|
12
|
-
def calculate instance
|
12
|
+
def calculate instance, options={}
|
13
|
+
end
|
14
|
+
|
15
|
+
def persisted?
|
16
|
+
false
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
data/lib/customize/inherited.rb
CHANGED
@@ -5,6 +5,28 @@ module Customize
|
|
5
5
|
|
6
6
|
base.has_one :inherit_node, :class_name=>Customize::InheritNode.name, :as=>:node, :dependent=>:destroy
|
7
7
|
|
8
|
+
base.scope :ascents_for, lambda { |object, options={:include=>false}|
|
9
|
+
ntn = Customize::InheritNode.table_name
|
10
|
+
node = object.inherit_node
|
11
|
+
condition_string = if options[:include]
|
12
|
+
"#{ntn}.left <= ? and #{ntn}.right >= ?"
|
13
|
+
else
|
14
|
+
"#{ntn}.left < ? and #{ntn}.right > ?"
|
15
|
+
end
|
16
|
+
base.joins(:inherit_node).where(condition_string, node.left, node.right)
|
17
|
+
}
|
18
|
+
|
19
|
+
base.scope :descents_for, lambda { |object, options={:include=>false}|
|
20
|
+
ntn = Customize::InheritNode.table_name
|
21
|
+
node = object.inherit_node
|
22
|
+
condition_string = if options[:include]
|
23
|
+
"#{ntn}.left >= ? and #{ntn}.right <= ?"
|
24
|
+
else
|
25
|
+
"#{ntn}.left > ? and #{ntn}.right < ?"
|
26
|
+
end
|
27
|
+
base.joins(:inherit_node).where(condition_string, node.left, node.right)
|
28
|
+
}
|
29
|
+
|
8
30
|
base.after_create { |object|
|
9
31
|
object.create_inherit_node :left=>0, :right=>1
|
10
32
|
}
|
@@ -14,6 +36,8 @@ module Customize
|
|
14
36
|
base.before_destroy { |object|
|
15
37
|
raise 'object should not have children when destroy' if object.inherit_node.children.size > 0
|
16
38
|
}
|
39
|
+
|
40
|
+
|
17
41
|
|
18
42
|
end
|
19
43
|
|
@@ -50,30 +74,39 @@ module Customize
|
|
50
74
|
raise 'should be save first' if self.new_record?
|
51
75
|
raise 'should be same class' if self.class != parent.class
|
52
76
|
raise 'should not be self' if self.id == parent.id
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
77
|
+
self.class.transaction do
|
78
|
+
inherit_node.parent_id = parent.inherit_node.id
|
79
|
+
right = parent.inherit_node.right
|
80
|
+
InheritNode.where("right >= ?", inherit_node.left).update_all("right = right+2")
|
81
|
+
inherit_node.left = right
|
82
|
+
inherit_node.right = right + 1
|
83
|
+
inherit_node.save
|
84
|
+
end
|
59
85
|
end
|
60
86
|
|
61
|
-
def
|
62
|
-
return [] if
|
63
|
-
|
64
|
-
r.pluck(:node_id)
|
87
|
+
def ascents options={:include=>false}
|
88
|
+
return [] if new_record?
|
89
|
+
self.class.ascents_for self, options
|
65
90
|
end
|
66
91
|
|
67
|
-
def
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
r.
|
92
|
+
def inherit_association name, options={:include=>false}
|
93
|
+
association_table_name = association(name).aliased_table_name
|
94
|
+
|
95
|
+
r = ascents(options).joins(name).select("#{association_table_name}.*").uniq
|
96
|
+
r.map(&name).flatten
|
72
97
|
end
|
73
98
|
|
74
|
-
def
|
75
|
-
|
99
|
+
def descents
|
100
|
+
return [] if new_record?
|
101
|
+
self.class.descents_for self
|
76
102
|
end
|
77
103
|
|
104
|
+
def ascent_ids
|
105
|
+
ascents.map(&:id)
|
106
|
+
end
|
107
|
+
|
108
|
+
def descent_ids
|
109
|
+
descents.map(&:id)
|
110
|
+
end
|
78
111
|
end
|
79
112
|
end
|
@@ -8,6 +8,16 @@ describe Customize::Inherited do
|
|
8
8
|
end
|
9
9
|
model do
|
10
10
|
include Customize::Inherited
|
11
|
+
has_many :product_objects
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
with_model :product_object do
|
16
|
+
table do |t|
|
17
|
+
t.references :product
|
18
|
+
end
|
19
|
+
model do
|
20
|
+
belongs_to :product
|
11
21
|
end
|
12
22
|
end
|
13
23
|
|
@@ -103,5 +113,21 @@ describe Customize::Inherited do
|
|
103
113
|
end
|
104
114
|
end
|
105
115
|
|
116
|
+
context "associations" do
|
117
|
+
subject {
|
118
|
+
p1 = Product.create
|
119
|
+
p2 = Product.create
|
120
|
+
p2.inherit p1
|
121
|
+
p1.product_objects.create
|
122
|
+
p2.product_objects.create
|
123
|
+
p2
|
124
|
+
}
|
125
|
+
|
126
|
+
it "should have 2 inherit_association :product_objects" do
|
127
|
+
pending "cannot pass with with_model"
|
128
|
+
subject.inherit_association(:product_objects,:include=>true).should have(2).times
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
106
132
|
end
|
107
133
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: customize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -304,7 +304,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
304
304
|
version: '0'
|
305
305
|
segments:
|
306
306
|
- 0
|
307
|
-
hash:
|
307
|
+
hash: -197001151
|
308
308
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
309
309
|
none: false
|
310
310
|
requirements:
|