edge 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/edge.gemspec +4 -3
- data/lib/edge/forest.rb +13 -12
- data/lib/edge/version.rb +1 -1
- data/spec/database_structure.sql +2 -1
- data/spec/forest_spec.rb +8 -8
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c44e87734aaa9f415d1fd27dae95c877c975ef0c
|
4
|
+
data.tar.gz: 5339eb867e7383ada9fc7677f89c84eceaa4844a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce618003724c04a238a18c9f786ebf312f8212da8482ea5b6f1ab5875f61e48a110f0bf4a83a203810a9d71e128cb4dde2e0c4fe6e520f53d82734f1a5e083b1
|
7
|
+
data.tar.gz: 3f324365418e1dbaea369b0806ff1a9d173947018abc45fa13fad78bcd9b985c060834d768973ef2c9e18b541ccce9494effca947f0e3ce933d7dc1679122939
|
data/CHANGELOG.md
CHANGED
data/edge.gemspec
CHANGED
@@ -14,11 +14,12 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.name = "edge"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Edge::VERSION
|
17
|
-
|
17
|
+
|
18
18
|
gem.add_dependency 'activerecord', ">= 3.2.0"
|
19
|
-
|
19
|
+
|
20
20
|
gem.add_development_dependency 'pg'
|
21
|
+
gem.add_development_dependency 'pry'
|
21
22
|
gem.add_development_dependency 'rspec', "~> 2.8.0"
|
22
23
|
gem.add_development_dependency 'guard', ">= 0.10.0"
|
23
|
-
gem.add_development_dependency 'guard-rspec', ">= 0.6.0"
|
24
|
+
gem.add_development_dependency 'guard-rspec', ">= 0.6.0"
|
24
25
|
end
|
data/lib/edge/forest.rb
CHANGED
@@ -22,15 +22,13 @@ module Edge
|
|
22
22
|
|
23
23
|
belongs_to :parent, common_options
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
if forest_order
|
26
|
+
has_many :children, -> { order(forest_order) }, common_options
|
27
27
|
else
|
28
|
-
common_options
|
28
|
+
has_many :children, common_options
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
scope :root, where(forest_foreign_key => nil)
|
31
|
+
scope :root, -> { where(forest_foreign_key => nil) }
|
34
32
|
|
35
33
|
include Edge::Forest::InstanceMethods
|
36
34
|
extend Edge::Forest::ClassMethods
|
@@ -95,18 +93,18 @@ module Edge
|
|
95
93
|
#
|
96
94
|
# Only where scopes can precede this in a scope chain
|
97
95
|
def with_descendants
|
98
|
-
manager = recursive_manager.project(
|
99
|
-
unscoped.where(id
|
96
|
+
manager = recursive_manager.project(arel_table[:id])
|
97
|
+
unscoped.where("id in (#{manager.to_sql})")
|
100
98
|
end
|
101
99
|
|
102
100
|
private
|
103
101
|
def recursive_manager
|
104
102
|
all_nodes = Arel::Table.new(:all_nodes)
|
105
103
|
|
106
|
-
original_term = (current_scope ||
|
104
|
+
original_term = (current_scope || all).select(primary_key, forest_foreign_key).arel
|
107
105
|
iterated_term = Arel::SelectManager.new Arel::Table.engine
|
108
106
|
iterated_term.from(arel_table)
|
109
|
-
.project(arel_table.
|
107
|
+
.project([arel_table[primary_key.to_sym], arel_table[forest_foreign_key.to_sym]])
|
110
108
|
.join(all_nodes)
|
111
109
|
.on(arel_table[forest_foreign_key].eq all_nodes[:id])
|
112
110
|
|
@@ -114,8 +112,11 @@ module Edge
|
|
114
112
|
|
115
113
|
as_statement = Arel::Nodes::As.new all_nodes, union
|
116
114
|
|
117
|
-
manager = Arel::SelectManager.new
|
118
|
-
|
115
|
+
manager = Arel::SelectManager.new(Arel::Table.engine)
|
116
|
+
.with(:recursive, as_statement)
|
117
|
+
.from(all_nodes)
|
118
|
+
.join(arel_table)
|
119
|
+
.on(all_nodes[:id].eq(arel_table[:id]))
|
119
120
|
end
|
120
121
|
end
|
121
122
|
|
data/lib/edge/version.rb
CHANGED
data/spec/database_structure.sql
CHANGED
@@ -3,5 +3,6 @@ DROP TABLE IF EXISTS locations;
|
|
3
3
|
CREATE TABLE locations(
|
4
4
|
id serial PRIMARY KEY,
|
5
5
|
parent_id integer REFERENCES locations,
|
6
|
-
name varchar NOT NULL
|
6
|
+
name varchar NOT NULL,
|
7
|
+
attrs json DEFAULT NULL -- include a column that does not have an operator defined that can be used with union
|
7
8
|
);
|
data/spec/forest_spec.rb
CHANGED
@@ -4,6 +4,8 @@ class Location < ActiveRecord::Base
|
|
4
4
|
acts_as_forest :order => "name"
|
5
5
|
end
|
6
6
|
|
7
|
+
Location.delete_all
|
8
|
+
|
7
9
|
describe "Edge::Forest" do
|
8
10
|
let!(:usa) { Location.create! :name => "USA" }
|
9
11
|
let!(:illinois) { Location.create! :parent => usa, :name => "Illinois" }
|
@@ -131,7 +133,7 @@ describe "Edge::Forest" do
|
|
131
133
|
|
132
134
|
describe "root scope" do
|
133
135
|
it "returns only root nodes" do
|
134
|
-
Location.root.
|
136
|
+
Location.root.should include(usa, canada)
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
@@ -139,13 +141,11 @@ describe "Edge::Forest" do
|
|
139
141
|
it "preloads all parents and children" do
|
140
142
|
forest = Location.find_forest
|
141
143
|
|
142
|
-
Location.
|
143
|
-
:find => Location.where("purposely fail if any Location find happens here")
|
144
|
-
) do
|
144
|
+
Location.where("purposely fail if any Location find happens here").scoping do
|
145
145
|
forest.each do |tree|
|
146
146
|
tree.descendants.each do |node|
|
147
147
|
node.parent.should be
|
148
|
-
node.children.should be_kind_of(
|
148
|
+
node.children.should be_kind_of(ActiveRecord::Associations::CollectionProxy)
|
149
149
|
end
|
150
150
|
end
|
151
151
|
end
|
@@ -198,17 +198,17 @@ describe "Edge::Forest" do
|
|
198
198
|
describe "with_descendants" do
|
199
199
|
context "unscoped" do
|
200
200
|
it "returns all records" do
|
201
|
-
Location.with_descendants.
|
201
|
+
Location.with_descendants.to_a.should =~ Location.all
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
205
205
|
context "scoped" do
|
206
206
|
it "returns a new scope that includes previously scoped records and their descendants" do
|
207
|
-
Location.where(id: canada.id).with_descendants.
|
207
|
+
Location.where(id: canada.id).with_descendants.to_a.should =~ [canada, british_columbia]
|
208
208
|
end
|
209
209
|
|
210
210
|
it "is not commutative" do
|
211
|
-
Location.with_descendants.where(id: canada.id).
|
211
|
+
Location.with_descendants.where(id: canada.id).to_a.should == [canada]
|
212
212
|
end
|
213
213
|
end
|
214
214
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: edge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Christensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
140
|
version: '0'
|
127
141
|
requirements: []
|
128
142
|
rubyforge_project:
|
129
|
-
rubygems_version: 2.0.
|
143
|
+
rubygems_version: 2.0.3
|
130
144
|
signing_key:
|
131
145
|
specification_version: 4
|
132
146
|
summary: Graph functionality for ActiveRecord. Provides tree/forest modeling structure
|
@@ -136,3 +150,4 @@ test_files:
|
|
136
150
|
- spec/database_structure.sql
|
137
151
|
- spec/forest_spec.rb
|
138
152
|
- spec/spec_helper.rb
|
153
|
+
has_rdoc:
|