customize 0.0.6 → 0.0.7
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.
- data/VERSION +1 -1
- data/customize.gemspec +2 -2
- data/lib/customize/inherited.rb +15 -9
- data/spec/customize/inherited_spec.rb +77 -45
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.7
|
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.7"
|
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-07"
|
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 = [
|
data/lib/customize/inherited.rb
CHANGED
@@ -46,16 +46,20 @@ module Customize
|
|
46
46
|
joins(:inherit_node).where("parent_id is null")
|
47
47
|
end
|
48
48
|
|
49
|
-
def type_tree
|
49
|
+
def type_tree node = nil
|
50
50
|
roots = root
|
51
|
-
converter = proc {|items|
|
52
|
-
out = items.
|
53
|
-
|
51
|
+
converter = proc {|items, node|
|
52
|
+
out = items.select { |item|
|
53
|
+
node.nil? || (item.inherit_node.id != node.id &&
|
54
|
+
(node.parent_node.nil? || item.inherit_node.id != node.parent_node.id))
|
55
|
+
}.collect { |item|
|
56
|
+
{:id=>item.id,:label=>item.label,:inherit_node_id=>item.inherit_node.id, :children=>converter.call(item.children, node)}
|
54
57
|
}
|
55
58
|
}
|
56
59
|
|
57
|
-
converter.call(roots)
|
60
|
+
converter.call(roots, node)
|
58
61
|
end
|
62
|
+
|
59
63
|
end
|
60
64
|
|
61
65
|
def parent
|
@@ -74,6 +78,8 @@ module Customize
|
|
74
78
|
raise 'should be save first' if self.new_record?
|
75
79
|
raise 'should be same class' if self.class != parent.class
|
76
80
|
raise 'should not be self' if self.id == parent.id
|
81
|
+
raise 'should not inherit descents' if self.descent_ids.include? parent.id
|
82
|
+
raise 'should not inherit parent' if self.parent.try(:id) == parent.id
|
77
83
|
self.class.transaction do
|
78
84
|
inherit_node.parent_id = parent.inherit_node.id
|
79
85
|
right = parent.inherit_node.right
|
@@ -90,10 +96,10 @@ module Customize
|
|
90
96
|
end
|
91
97
|
|
92
98
|
def inherit_association name, options={:include=>false}
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
99
|
+
a = association(name)
|
100
|
+
sql = ascents(options).joins(name).select("#{a.aliased_table_name}.#{a.klass.primary_key}").to_sql
|
101
|
+
a.klass.from("(#{sql}) as subquery, #{a.klass.table_name}").
|
102
|
+
where("#{a.klass.table_name}.#{a.klass.primary_key} = subquery.#{a.klass.primary_key}")
|
97
103
|
end
|
98
104
|
|
99
105
|
def descents
|
@@ -28,60 +28,93 @@ describe Customize::Inherited do
|
|
28
28
|
@parent.reload
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
31
|
+
context "inherit" do
|
32
|
+
it "cannot inherit different class" do
|
33
|
+
expect {
|
34
|
+
@child.inherit Object.new
|
35
|
+
}.to raise_error
|
36
|
+
end
|
37
|
+
|
38
|
+
it "have method ascent_ids" do
|
39
|
+
@child.ascent_ids.should_not be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "child should have 1 ascent" do
|
43
|
+
@child.ascent_ids.should have(1).items
|
44
|
+
end
|
45
|
+
|
46
|
+
it "parent should have 1 descent" do
|
47
|
+
@parent.descent_ids.should have(1).items
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should support 2 levels inherit" do
|
51
|
+
c2 = Product.create!
|
52
|
+
c2.inherit @child
|
53
|
+
c2.ascent_ids.should have(2).items
|
54
|
+
@child.ascent_ids.should have(1).items
|
55
|
+
end
|
56
|
+
|
57
|
+
it "root has 1 item" do
|
58
|
+
Product.root.should have(1).items
|
59
|
+
end
|
60
|
+
|
61
|
+
it "child should have ascents" do
|
62
|
+
@child.ascents.should have(1).items
|
63
|
+
end
|
64
|
+
|
65
|
+
it "child is leaf" do
|
66
|
+
@child.leaf?.should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "parent is not leaf" do
|
70
|
+
@parent.leaf?.should_not be_true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should not inherit self" do
|
74
|
+
expect {
|
75
|
+
@parent.inherit @parent
|
76
|
+
}.to raise_error
|
77
|
+
end
|
48
78
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
79
|
+
it "should not inherit parent" do
|
80
|
+
expect {
|
81
|
+
@child.inherit @parent
|
82
|
+
}.to raise_error
|
83
|
+
end
|
55
84
|
|
56
|
-
|
57
|
-
|
58
|
-
|
85
|
+
it "should not inherit child" do
|
86
|
+
expect {
|
87
|
+
@parent.inherit @child
|
88
|
+
}.to raise_error
|
89
|
+
end
|
59
90
|
|
60
|
-
it "child should have ascents" do
|
61
|
-
@child.ascents.should have(1).items
|
62
91
|
end
|
63
92
|
|
64
|
-
|
65
|
-
|
66
|
-
|
93
|
+
context :type_tree do
|
94
|
+
it "convert type_tree" do
|
95
|
+
tree = Product.type_tree
|
96
|
+
tree.first[:id].should == @parent.id
|
97
|
+
tree.first[:children].should have(1).items
|
98
|
+
end
|
67
99
|
|
68
|
-
|
69
|
-
|
70
|
-
|
100
|
+
it "convert type_tree for parent" do
|
101
|
+
tree = Product.type_tree @parent.inherit_node
|
102
|
+
tree.should be_empty
|
103
|
+
end
|
71
104
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
105
|
+
it "convert type_tree for child" do
|
106
|
+
tree = Product.type_tree @child.inherit_node
|
107
|
+
tree.should be_empty
|
108
|
+
end
|
77
109
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
110
|
+
it "convert type_tree for 2lvl-child" do
|
111
|
+
node = Product.create
|
112
|
+
node.inherit @child
|
113
|
+
tree = Product.type_tree node.inherit_node
|
114
|
+
tree.should have(1).items
|
115
|
+
end
|
82
116
|
end
|
83
117
|
|
84
|
-
|
85
118
|
context "new node" do
|
86
119
|
subject { Product.new }
|
87
120
|
|
@@ -124,7 +157,6 @@ describe Customize::Inherited do
|
|
124
157
|
}
|
125
158
|
|
126
159
|
it "should have 2 inherit_association :product_objects" do
|
127
|
-
pending "cannot pass with with_model"
|
128
160
|
subject.inherit_association(:product_objects,:include=>true).should have(2).times
|
129
161
|
end
|
130
162
|
end
|
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.7
|
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-07 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: 562141071
|
308
308
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
309
309
|
none: false
|
310
310
|
requirements:
|