customize 0.0.3 → 0.0.4
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/Gemfile +2 -0
- data/Gemfile.lock +11 -3
- data/VERSION +1 -1
- data/app/controllers/customize/inherit_nodes_controller.rb +27 -0
- data/app/models/customize/character.rb +31 -0
- data/{lib → app/models}/customize/inherit_node.rb +8 -0
- data/config/routes.rb +8 -0
- data/customize.gemspec +12 -4
- data/lib/customize.rb +1 -2
- data/lib/customize/characterize.rb +7 -1
- data/lib/customize/engine.rb +1 -0
- data/lib/customize/inherited.rb +27 -0
- data/lib/generators/customize/templates/migration.rb +1 -1
- data/spec/customize/characterize_spec.rb +15 -5
- data/spec/customize/inherited_spec.rb +21 -0
- data/spec/dummy/config/routes.rb +1 -0
- metadata +39 -5
- data/lib/customize/character.rb +0 -5
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -38,7 +38,7 @@ GEM
|
|
38
38
|
rack-test (>= 0.5.4)
|
39
39
|
selenium-webdriver (~> 2.0)
|
40
40
|
xpath (~> 0.1.4)
|
41
|
-
childprocess (0.3.
|
41
|
+
childprocess (0.3.2)
|
42
42
|
ffi (~> 1.0.6)
|
43
43
|
cucumber (1.1.9)
|
44
44
|
builder (>= 2.1.2)
|
@@ -52,8 +52,12 @@ GEM
|
|
52
52
|
gherkin (2.9.3)
|
53
53
|
json (>= 1.4.6)
|
54
54
|
git (1.2.5)
|
55
|
+
has_scope (0.5.1)
|
55
56
|
hike (1.2.1)
|
56
57
|
i18n (0.6.0)
|
58
|
+
inherited_resources (1.3.1)
|
59
|
+
has_scope (~> 0.5.0)
|
60
|
+
responders (~> 0.6)
|
57
61
|
jeweler (1.8.3)
|
58
62
|
bundler (~> 1.0)
|
59
63
|
git (>= 1.2.5)
|
@@ -96,6 +100,8 @@ GEM
|
|
96
100
|
rake (0.9.2.2)
|
97
101
|
rdoc (3.12)
|
98
102
|
json (~> 1.4)
|
103
|
+
responders (0.9.1)
|
104
|
+
railties (~> 3.1)
|
99
105
|
rspec (2.9.0)
|
100
106
|
rspec-core (~> 2.9.0)
|
101
107
|
rspec-expectations (~> 2.9.0)
|
@@ -116,8 +122,8 @@ GEM
|
|
116
122
|
libwebsocket (~> 0.1.3)
|
117
123
|
multi_json (~> 1.0)
|
118
124
|
rubyzip
|
119
|
-
simplecov (0.6.
|
120
|
-
multi_json (~> 1.
|
125
|
+
simplecov (0.6.2)
|
126
|
+
multi_json (~> 1.3)
|
121
127
|
simplecov-html (~> 0.5.3)
|
122
128
|
simplecov-html (0.5.3)
|
123
129
|
sprockets (2.1.2)
|
@@ -147,6 +153,8 @@ DEPENDENCIES
|
|
147
153
|
bundler (>= 1.0.0)
|
148
154
|
capybara (>= 0.4.0)
|
149
155
|
cucumber
|
156
|
+
has_scope
|
157
|
+
inherited_resources
|
150
158
|
jeweler (>= 1.8.3)
|
151
159
|
rails (>= 3.0.12)
|
152
160
|
rdoc (~> 3.12)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Customize::InheritNodesController < InheritedResources::Base
|
2
|
+
include InheritedResources::DSL
|
3
|
+
respond_to :json, :xml
|
4
|
+
has_scope :by_type
|
5
|
+
|
6
|
+
custom_actions :resource=>:select
|
7
|
+
|
8
|
+
index! do |format|
|
9
|
+
format.json do
|
10
|
+
render :json=>collection.collect{|item|{:label=>item.node.label,:value=>item.node.id}}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def select
|
15
|
+
select! do |format|
|
16
|
+
node = Customize::InheritNode.find params[:target]
|
17
|
+
begin
|
18
|
+
resource.node.inherit node.node
|
19
|
+
rescue
|
20
|
+
end
|
21
|
+
format.json do
|
22
|
+
render :json=>resource.save
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Customize::Character < ActiveRecord::Base
|
2
|
+
attr_accessor :content
|
3
|
+
self.table_name = "customize_characters"
|
4
|
+
serialize :value
|
5
|
+
belongs_to :related, :polymorphic => true
|
6
|
+
|
7
|
+
before_validation do |object|
|
8
|
+
unless object.content.nil?
|
9
|
+
case
|
10
|
+
when object.content =~ /\d+/
|
11
|
+
object.value = content.to_i
|
12
|
+
object.value_type = :integer
|
13
|
+
when content =~ /(true)|(false)/
|
14
|
+
object.value = Boolean.new content
|
15
|
+
object.value_type = :boolean
|
16
|
+
when content =~ /[0-9\.]+/
|
17
|
+
object.value = Decimal.new content
|
18
|
+
object.value_type = :decimal
|
19
|
+
when content =~ /^\[/
|
20
|
+
object.value = ""
|
21
|
+
object.value_type = :list
|
22
|
+
when content =~ /^\{/
|
23
|
+
object.value = ""
|
24
|
+
object.value_type = :hash
|
25
|
+
else
|
26
|
+
object.value = content
|
27
|
+
object.value_type = :string
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,11 +1,19 @@
|
|
1
1
|
class Customize::InheritNode < ActiveRecord::Base
|
2
2
|
self.table_name = "customize_inherit_nodes"
|
3
3
|
belongs_to :parent_node, :class_name=>self.name, :foreign_key=> 'parent_id'
|
4
|
+
belongs_to :node, :polymorphic=>true
|
4
5
|
has_many :children, :class_name=>self.name, :foreign_key=>'parent_id'
|
6
|
+
|
7
|
+
scope :by_type, lambda { |type| where(:node_type=>type) }
|
5
8
|
|
6
9
|
after_destroy { |object|
|
7
10
|
object.class.where("right > :right and node_type = :type",
|
8
11
|
:right=>object.right, :type=>object.node_type).update_all("right = right -2")
|
9
12
|
}
|
13
|
+
|
14
|
+
def leaf?
|
15
|
+
children.empty?
|
16
|
+
end
|
17
|
+
|
10
18
|
end
|
11
19
|
|
data/config/routes.rb
ADDED
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.4"
|
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-
|
12
|
+
s.date = "2012-05-02"
|
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 = [
|
@@ -24,12 +24,14 @@ Gem::Specification.new do |s|
|
|
24
24
|
"README.rdoc",
|
25
25
|
"Rakefile",
|
26
26
|
"VERSION",
|
27
|
+
"app/controllers/customize/inherit_nodes_controller.rb",
|
28
|
+
"app/models/customize/character.rb",
|
29
|
+
"app/models/customize/inherit_node.rb",
|
30
|
+
"config/routes.rb",
|
27
31
|
"customize.gemspec",
|
28
32
|
"lib/customize.rb",
|
29
|
-
"lib/customize/character.rb",
|
30
33
|
"lib/customize/characterize.rb",
|
31
34
|
"lib/customize/engine.rb",
|
32
|
-
"lib/customize/inherit_node.rb",
|
33
35
|
"lib/customize/inherited.rb",
|
34
36
|
"lib/generators/customize/USAGE",
|
35
37
|
"lib/generators/customize/customize_generator.rb",
|
@@ -85,6 +87,8 @@ Gem::Specification.new do |s|
|
|
85
87
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
86
88
|
s.add_runtime_dependency(%q<rails>, [">= 3.0.12"])
|
87
89
|
s.add_runtime_dependency(%q<capybara>, [">= 0.4.0"])
|
90
|
+
s.add_runtime_dependency(%q<inherited_resources>, [">= 0"])
|
91
|
+
s.add_runtime_dependency(%q<has_scope>, [">= 0"])
|
88
92
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
89
93
|
s.add_development_dependency(%q<rspec-rails>, [">= 2.8.0"])
|
90
94
|
s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
|
@@ -97,6 +101,8 @@ Gem::Specification.new do |s|
|
|
97
101
|
else
|
98
102
|
s.add_dependency(%q<rails>, [">= 3.0.12"])
|
99
103
|
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
104
|
+
s.add_dependency(%q<inherited_resources>, [">= 0"])
|
105
|
+
s.add_dependency(%q<has_scope>, [">= 0"])
|
100
106
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
101
107
|
s.add_dependency(%q<rspec-rails>, [">= 2.8.0"])
|
102
108
|
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
@@ -110,6 +116,8 @@ Gem::Specification.new do |s|
|
|
110
116
|
else
|
111
117
|
s.add_dependency(%q<rails>, [">= 3.0.12"])
|
112
118
|
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
119
|
+
s.add_dependency(%q<inherited_resources>, [">= 0"])
|
120
|
+
s.add_dependency(%q<has_scope>, [">= 0"])
|
113
121
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
114
122
|
s.add_dependency(%q<rspec-rails>, [">= 2.8.0"])
|
115
123
|
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
data/lib/customize.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
require 'has_scope'
|
2
3
|
require 'customize/engine'
|
3
4
|
|
4
5
|
module Customize
|
5
6
|
autoload :Characterize, 'customize/characterize'
|
6
7
|
autoload :Inherited, 'customize/inherited'
|
7
|
-
autoload :InheritNode, 'customize/inherit_node'
|
8
|
-
autoload :Character, 'customize/character'
|
9
8
|
end
|
@@ -4,6 +4,7 @@ module Customize
|
|
4
4
|
def self.included base
|
5
5
|
base.extend ClassMethods
|
6
6
|
base.has_many :characters, :class_name=>Customize::Character.name, :as=>:related
|
7
|
+
base.accepts_nested_attributes_for :characters
|
7
8
|
end
|
8
9
|
|
9
10
|
module ClassMethods
|
@@ -20,7 +21,12 @@ module Customize
|
|
20
21
|
}.call
|
21
22
|
|
22
23
|
end
|
23
|
-
|
24
|
+
|
25
|
+
def inherited_characters
|
26
|
+
if self.class.include?(Customize::Inherited)
|
27
|
+
Character.where(:related_id=>ascent_ids, :related_type=>self.class.name)
|
28
|
+
end
|
29
|
+
end
|
24
30
|
end
|
25
31
|
|
26
32
|
end
|
data/lib/customize/engine.rb
CHANGED
data/lib/customize/inherited.rb
CHANGED
@@ -2,12 +2,15 @@ module Customize
|
|
2
2
|
module Inherited
|
3
3
|
def self.included base
|
4
4
|
base.extend ClassMethods
|
5
|
+
|
5
6
|
base.has_one :inherit_node, :class_name=>Customize::InheritNode.name, :as=>:node, :dependent=>:destroy
|
6
7
|
|
7
8
|
base.after_create { |object|
|
8
9
|
object.create_inherit_node :left=>0, :right=>1
|
9
10
|
}
|
10
11
|
|
12
|
+
base.delegate :leaf?, :to=>:inherit_node
|
13
|
+
|
11
14
|
base.before_destroy { |object|
|
12
15
|
raise 'object should not have children when destroy' if object.inherit_node.children.size > 0
|
13
16
|
}
|
@@ -18,11 +21,35 @@ module Customize
|
|
18
21
|
def root
|
19
22
|
joins(:inherit_node).where("parent_id is null")
|
20
23
|
end
|
24
|
+
|
25
|
+
def type_tree
|
26
|
+
roots = root
|
27
|
+
converter = proc {|items|
|
28
|
+
out = items.collect { |item|
|
29
|
+
{:id=>item.id,:label=>item.label,:inherit_node_id=>item.inherit_node.id, :children=>converter.call(item.children)}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
converter.call(roots)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def parent
|
38
|
+
inherit_node.parent_node.try(:node)
|
39
|
+
end
|
40
|
+
|
41
|
+
def children
|
42
|
+
inherit_node.children.collect(&:node)
|
43
|
+
end
|
44
|
+
|
45
|
+
def label
|
46
|
+
self.to_s
|
21
47
|
end
|
22
48
|
|
23
49
|
def inherit parent
|
24
50
|
raise 'should be save first' if self.new_record?
|
25
51
|
raise 'should be same class' if self.class != parent.class
|
52
|
+
raise 'should not be self' if self.id == parent.id
|
26
53
|
inherit_node.parent_id = parent.inherit_node.id
|
27
54
|
right = parent.inherit_node.right
|
28
55
|
InheritNode.where("right >= ?", inherit_node.left).update_all("right = right+2")
|
@@ -9,8 +9,8 @@ describe Customize::Characterize do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
model do
|
12
|
-
include Customize::Characterize
|
13
12
|
include Customize::Inherited
|
13
|
+
include Customize::Characterize
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -31,10 +31,20 @@ describe Customize::Characterize do
|
|
31
31
|
subject.character[:foo].should be_true
|
32
32
|
end
|
33
33
|
|
34
|
+
it :should_not_return_inherited_characters do
|
35
|
+
subject.inherited_characters.should be_nil
|
36
|
+
end
|
34
37
|
end
|
35
38
|
|
36
39
|
context :model_with_inherit do
|
37
|
-
subject {
|
40
|
+
subject {
|
41
|
+
Customize::Character.delete_all
|
42
|
+
parent = Product.create!
|
43
|
+
parent.characters.create! :key=>:p, :value=>1
|
44
|
+
p = Product.create!
|
45
|
+
p.inherit parent
|
46
|
+
p
|
47
|
+
}
|
38
48
|
|
39
49
|
it "has characters" do
|
40
50
|
subject.characters.should_not be_nil
|
@@ -70,11 +80,11 @@ describe Customize::Characterize do
|
|
70
80
|
end
|
71
81
|
|
72
82
|
it "has inherited character" do
|
73
|
-
parent = Product.create!
|
74
|
-
parent.characters.create! :key=>:p, :value=>1
|
75
|
-
subject.inherit parent
|
76
83
|
subject.character[:p].should == 1
|
77
84
|
end
|
85
|
+
it :has_def_inherited_characters do
|
86
|
+
subject.inherited_characters.should_not be_empty
|
87
|
+
end
|
78
88
|
end
|
79
89
|
|
80
90
|
end
|
@@ -51,6 +51,27 @@ describe Customize::Inherited do
|
|
51
51
|
@child.ascents.should have(1).items
|
52
52
|
end
|
53
53
|
|
54
|
+
it "child is leaf" do
|
55
|
+
@child.leaf?.should be_true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "parent is not leaf" do
|
59
|
+
@parent.leaf?.should_not be_true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "convert type_tree" do
|
63
|
+
tree = Product.type_tree
|
64
|
+
tree.first[:id].should == @parent.id
|
65
|
+
tree.first[:children].should have(1).items
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should not inherit self" do
|
69
|
+
expect {
|
70
|
+
@parent.inherit @parent
|
71
|
+
}.to raise_error
|
72
|
+
end
|
73
|
+
|
74
|
+
|
54
75
|
context "new node" do
|
55
76
|
subject { Product.new }
|
56
77
|
|
data/spec/dummy/config/routes.rb
CHANGED
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.4
|
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-
|
12
|
+
date: 2012-05-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -43,6 +43,38 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 0.4.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: inherited_resources
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: has_scope
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
46
78
|
- !ruby/object:Gem::Dependency
|
47
79
|
name: sqlite3
|
48
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -202,12 +234,14 @@ files:
|
|
202
234
|
- README.rdoc
|
203
235
|
- Rakefile
|
204
236
|
- VERSION
|
237
|
+
- app/controllers/customize/inherit_nodes_controller.rb
|
238
|
+
- app/models/customize/character.rb
|
239
|
+
- app/models/customize/inherit_node.rb
|
240
|
+
- config/routes.rb
|
205
241
|
- customize.gemspec
|
206
242
|
- lib/customize.rb
|
207
|
-
- lib/customize/character.rb
|
208
243
|
- lib/customize/characterize.rb
|
209
244
|
- lib/customize/engine.rb
|
210
|
-
- lib/customize/inherit_node.rb
|
211
245
|
- lib/customize/inherited.rb
|
212
246
|
- lib/generators/customize/USAGE
|
213
247
|
- lib/generators/customize/customize_generator.rb
|
@@ -265,7 +299,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
265
299
|
version: '0'
|
266
300
|
segments:
|
267
301
|
- 0
|
268
|
-
hash:
|
302
|
+
hash: -24310993
|
269
303
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
270
304
|
none: false
|
271
305
|
requirements:
|