closure_tree 1.0.0.beta3 → 1.0.0.beta5
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/README.rdoc +1 -0
- data/lib/closure_tree/acts_as_tree.rb +21 -17
- data/lib/closure_tree/version.rb +1 -1
- data/test/dummy/test/unit/tag_test.rb +14 -0
- metadata +28 -34
data/README.rdoc
CHANGED
@@ -105,6 +105,7 @@ Note that the other columns will be null if nodes are created, other than auto-g
|
|
105
105
|
[tag.root?] returns true if this is a root node
|
106
106
|
[tag.child?] returns true if this is a child node. It has a parent.
|
107
107
|
[tag.leaf?] returns true if this is a leaf node. It has no children.
|
108
|
+
[tag.leaves] returns an array of all the nodes in self_and_descendants that are leaves.
|
108
109
|
[tag.level] returns the level, or "generation", for this node in the tree. A root node = 0
|
109
110
|
[tag.parent] returns the node's immediate parent
|
110
111
|
[tag.children] returns an array of immediate children (just those in the next level).
|
@@ -33,23 +33,23 @@ module ClosureTree #:nodoc:
|
|
33
33
|
:foreign_key => parent_column_name,
|
34
34
|
:before_add => :add_child
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
36
|
+
has_and_belongs_to_many :ancestors,
|
37
|
+
:class_name => base_class.to_s,
|
38
|
+
:join_table => hierarchy_table_name,
|
39
|
+
:foreign_key => "descendant_id",
|
40
|
+
:association_foreign_key => "ancestor_id",
|
41
|
+
:order => "generations asc"
|
42
|
+
|
43
|
+
has_and_belongs_to_many :descendants,
|
44
|
+
:class_name => base_class.to_s,
|
45
|
+
:join_table => hierarchy_table_name,
|
46
|
+
:foreign_key => "ancestor_id",
|
47
|
+
:association_foreign_key => "descendant_id",
|
48
|
+
:order => "generations asc"
|
49
49
|
|
50
50
|
scope :roots, where(parent_column_name => nil)
|
51
51
|
|
52
|
-
scope :leaves, includes(:
|
52
|
+
scope :leaves, includes(:descendants).where("#{hierarchy_table_name}.descendant_id is null")
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -69,13 +69,19 @@ module ClosureTree #:nodoc:
|
|
69
69
|
parent_id.nil?
|
70
70
|
end
|
71
71
|
|
72
|
+
# Returns self if +root?+ or the root ancestor
|
73
|
+
def root
|
74
|
+
root? ? self : ancestors.last
|
75
|
+
end
|
76
|
+
|
72
77
|
# Returns true if this node has no children.
|
73
78
|
def leaf?
|
74
79
|
children.empty?
|
75
80
|
end
|
76
81
|
|
77
82
|
def leaves
|
78
|
-
self
|
83
|
+
return [self] if leaf?
|
84
|
+
Tag.leaves.includes(:ancestors).where("ancestors_tags.id = ?", self.id)
|
79
85
|
end
|
80
86
|
|
81
87
|
# Returns true if this node has a parent, and is not a root.
|
@@ -210,8 +216,6 @@ module ClosureTree #:nodoc:
|
|
210
216
|
# Mixed into both classes and instances to provide easy access to the column names
|
211
217
|
module Columns
|
212
218
|
|
213
|
-
protected
|
214
|
-
|
215
219
|
def parent_column_name
|
216
220
|
closure_tree_options[:parent_column_name]
|
217
221
|
end
|
data/lib/closure_tree/version.rb
CHANGED
@@ -100,5 +100,19 @@ class TagTest < ActiveSupport::TestCase
|
|
100
100
|
assert_equal [tags(:california), tags(:united_states), tags(:places)], city.ancestors
|
101
101
|
assert_equal [city, tags(:california), tags(:united_states), tags(:places)], city.self_and_ancestors
|
102
102
|
end
|
103
|
+
|
104
|
+
def test_root
|
105
|
+
assert_equal tags(:grandparent), tags(:grandparent).root
|
106
|
+
assert_equal tags(:grandparent), tags(:parent).root
|
107
|
+
assert_equal tags(:grandparent), tags(:child).root
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_leaves
|
111
|
+
assert Tag.leaves.include? tags(:child)
|
112
|
+
assert Tag.leaves.select{|t|!t.leaf?}.empty?
|
113
|
+
assert_equal [tags(:child)], tags(:grandparent).leaves
|
114
|
+
assert_equal [tags(:child)], tags(:parent).leaves
|
115
|
+
assert_equal [tags(:child)], tags(:child).leaves
|
116
|
+
end
|
103
117
|
end
|
104
118
|
|
metadata
CHANGED
@@ -1,38 +1,35 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: closure_tree
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.beta5
|
4
5
|
prerelease: 6
|
5
|
-
version: 1.0.0.beta3
|
6
6
|
platform: ruby
|
7
7
|
authors: []
|
8
|
-
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-05-26 00:00:00 -07:00
|
11
|
+
date: 2011-05-29 00:00:00.000000000 -07:00
|
14
12
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: activerecord
|
18
|
-
requirement: &
|
16
|
+
requirement: &2160266260 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 3.0.0
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
|
-
version_requirements: *
|
27
|
-
description: " A mostly-API-compatible replacement for the acts_as_tree and awesome_nested_set
|
24
|
+
version_requirements: *2160266260
|
25
|
+
description: ! " A mostly-API-compatible replacement for the acts_as_tree and awesome_nested_set
|
26
|
+
gems,\n but with much better mutation performance thanks to the Closure Tree storage
|
27
|
+
algorithm\n"
|
28
28
|
email:
|
29
29
|
executables: []
|
30
|
-
|
31
30
|
extensions: []
|
32
|
-
|
33
31
|
extra_rdoc_files: []
|
34
|
-
|
35
|
-
files:
|
32
|
+
files:
|
36
33
|
- lib/closure_tree/acts_as_tree.rb
|
37
34
|
- lib/closure_tree/version.rb
|
38
35
|
- lib/closure_tree.rb
|
@@ -62,35 +59,32 @@ files:
|
|
62
59
|
has_rdoc: true
|
63
60
|
homepage:
|
64
61
|
licenses: []
|
65
|
-
|
66
62
|
post_install_message:
|
67
63
|
rdoc_options: []
|
68
|
-
|
69
|
-
require_paths:
|
64
|
+
require_paths:
|
70
65
|
- lib
|
71
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
67
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
segments:
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
segments:
|
78
73
|
- 0
|
79
|
-
|
80
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
hash: 1822137668731567771
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
76
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
77
|
+
requirements:
|
78
|
+
- - ! '>'
|
79
|
+
- !ruby/object:Gem::Version
|
85
80
|
version: 1.3.1
|
86
81
|
requirements: []
|
87
|
-
|
88
82
|
rubyforge_project:
|
89
83
|
rubygems_version: 1.6.2
|
90
84
|
signing_key:
|
91
85
|
specification_version: 3
|
92
86
|
summary: Hierarchies for ActiveRecord models using a Closure Tree storage algorithm
|
93
|
-
test_files:
|
87
|
+
test_files:
|
94
88
|
- test/dummy/Rakefile
|
95
89
|
- test/dummy/app/models/.gitkeep
|
96
90
|
- test/dummy/app/models/tag.rb
|