awesome_nested_set 2.1.6 → 3.0.0.rc.1
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.
- checksums.yaml +7 -0
- data/README.md +163 -0
- data/lib/awesome_nested_set.rb +1 -1
- data/lib/awesome_nested_set/awesome_nested_set.rb +59 -692
- data/lib/awesome_nested_set/columns.rb +72 -0
- data/lib/awesome_nested_set/helper.rb +0 -45
- data/lib/awesome_nested_set/iterator.rb +29 -0
- data/lib/awesome_nested_set/model.rb +212 -0
- data/lib/awesome_nested_set/model/movable.rb +137 -0
- data/lib/awesome_nested_set/model/prunable.rb +58 -0
- data/lib/awesome_nested_set/model/rebuildable.rb +40 -0
- data/lib/awesome_nested_set/model/relatable.rb +121 -0
- data/lib/awesome_nested_set/model/transactable.rb +27 -0
- data/lib/awesome_nested_set/model/validatable.rb +69 -0
- data/lib/awesome_nested_set/move.rb +117 -0
- data/lib/awesome_nested_set/set_validator.rb +63 -0
- data/lib/awesome_nested_set/tree.rb +63 -0
- data/lib/awesome_nested_set/version.rb +1 -1
- metadata +44 -27
- data/README.rdoc +0 -153
@@ -0,0 +1,63 @@
|
|
1
|
+
module CollectiveIdea #:nodoc:
|
2
|
+
module Acts #:nodoc:
|
3
|
+
module NestedSet #:nodoc:
|
4
|
+
class Tree
|
5
|
+
attr_reader :model, :validate_nodes
|
6
|
+
attr_accessor :indices
|
7
|
+
|
8
|
+
delegate :left_column_name, :right_column_name, :quoted_parent_column_full_name,
|
9
|
+
:order_for_rebuild, :scope_for_rebuild,
|
10
|
+
:to => :model
|
11
|
+
|
12
|
+
def initialize(model, validate_nodes)
|
13
|
+
@model = model
|
14
|
+
@validate_nodes = validate_nodes
|
15
|
+
@indices = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def rebuild!
|
19
|
+
# Don't rebuild a valid tree.
|
20
|
+
return true if model.valid?
|
21
|
+
|
22
|
+
root_nodes.each do |root_node|
|
23
|
+
# setup index for this scope
|
24
|
+
indices[scope_for_rebuild.call(root_node)] ||= 0
|
25
|
+
set_left_and_rights(root_node)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def increment_indice!(node)
|
32
|
+
indices[scope_for_rebuild.call(node)] += 1
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_left_and_rights(node)
|
36
|
+
set_left!(node)
|
37
|
+
# find
|
38
|
+
node_children(node).each { |n| set_left_and_rights(n) }
|
39
|
+
set_right!(node)
|
40
|
+
|
41
|
+
node.save!(:validate => validate_nodes)
|
42
|
+
end
|
43
|
+
|
44
|
+
def node_children(node)
|
45
|
+
model.where(["#{quoted_parent_column_full_name} = ? #{scope_for_rebuild.call(node)}", node]).
|
46
|
+
order(order_for_rebuild)
|
47
|
+
end
|
48
|
+
|
49
|
+
def root_nodes
|
50
|
+
model.where("#{quoted_parent_column_full_name} IS NULL").order(order_for_rebuild)
|
51
|
+
end
|
52
|
+
|
53
|
+
def set_left!(node)
|
54
|
+
node[left_column_name] = increment_indice!(node)
|
55
|
+
end
|
56
|
+
|
57
|
+
def set_right!(node)
|
58
|
+
node[right_column_name] = increment_indice!(node)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awesome_nested_set
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 3.0.0.rc.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Brandon Keepers
|
@@ -11,28 +10,25 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date: 2013-
|
13
|
+
date: 2013-08-01 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: activerecord
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - ~>
|
22
20
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
21
|
+
version: 4.0.0
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- -
|
26
|
+
- - ~>
|
30
27
|
- !ruby/object:Gem::Version
|
31
|
-
version:
|
28
|
+
version: 4.0.0
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: rspec-rails
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
33
|
- - ~>
|
38
34
|
- !ruby/object:Gem::Version
|
@@ -40,7 +36,6 @@ dependencies:
|
|
40
36
|
type: :development
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
40
|
- - ~>
|
46
41
|
- !ruby/object:Gem::Version
|
@@ -48,7 +43,6 @@ dependencies:
|
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: rake
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
47
|
- - ~>
|
54
48
|
- !ruby/object:Gem::Version
|
@@ -56,7 +50,6 @@ dependencies:
|
|
56
50
|
type: :development
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
53
|
requirements:
|
61
54
|
- - ~>
|
62
55
|
- !ruby/object:Gem::Version
|
@@ -64,60 +57,84 @@ dependencies:
|
|
64
57
|
- !ruby/object:Gem::Dependency
|
65
58
|
name: combustion
|
66
59
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
60
|
requirements:
|
69
|
-
- -
|
61
|
+
- - '>='
|
70
62
|
- !ruby/object:Gem::Version
|
71
63
|
version: 0.3.3
|
72
64
|
type: :development
|
73
65
|
prerelease: false
|
74
66
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
67
|
requirements:
|
77
|
-
- -
|
68
|
+
- - '>='
|
78
69
|
- !ruby/object:Gem::Version
|
79
70
|
version: 0.3.3
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: database_cleaner
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
80
85
|
description: An awesome nested set implementation for Active Record
|
81
86
|
email: info@collectiveidea.com
|
82
87
|
executables: []
|
83
88
|
extensions: []
|
84
89
|
extra_rdoc_files:
|
85
|
-
- README.
|
90
|
+
- README.md
|
86
91
|
files:
|
87
92
|
- lib/awesome_nested_set/awesome_nested_set.rb
|
93
|
+
- lib/awesome_nested_set/columns.rb
|
88
94
|
- lib/awesome_nested_set/helper.rb
|
95
|
+
- lib/awesome_nested_set/iterator.rb
|
96
|
+
- lib/awesome_nested_set/model/movable.rb
|
97
|
+
- lib/awesome_nested_set/model/prunable.rb
|
98
|
+
- lib/awesome_nested_set/model/rebuildable.rb
|
99
|
+
- lib/awesome_nested_set/model/relatable.rb
|
100
|
+
- lib/awesome_nested_set/model/transactable.rb
|
101
|
+
- lib/awesome_nested_set/model/validatable.rb
|
102
|
+
- lib/awesome_nested_set/model.rb
|
103
|
+
- lib/awesome_nested_set/move.rb
|
104
|
+
- lib/awesome_nested_set/set_validator.rb
|
105
|
+
- lib/awesome_nested_set/tree.rb
|
89
106
|
- lib/awesome_nested_set/version.rb
|
90
107
|
- lib/awesome_nested_set.rb
|
91
108
|
- MIT-LICENSE
|
92
|
-
- README.
|
109
|
+
- README.md
|
93
110
|
- CHANGELOG
|
94
111
|
homepage: http://github.com/collectiveidea/awesome_nested_set
|
95
112
|
licenses:
|
96
113
|
- MIT
|
114
|
+
metadata: {}
|
97
115
|
post_install_message:
|
98
116
|
rdoc_options:
|
99
117
|
- --main
|
100
|
-
- README.
|
118
|
+
- README.md
|
101
119
|
- --inline-source
|
102
120
|
- --line-numbers
|
103
121
|
require_paths:
|
104
122
|
- lib
|
105
123
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
124
|
requirements:
|
108
|
-
- -
|
125
|
+
- - '>='
|
109
126
|
- !ruby/object:Gem::Version
|
110
127
|
version: '0'
|
111
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
-
none: false
|
113
129
|
requirements:
|
114
|
-
- -
|
130
|
+
- - '>'
|
115
131
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
132
|
+
version: 1.3.1
|
117
133
|
requirements: []
|
118
134
|
rubyforge_project:
|
119
|
-
rubygems_version:
|
135
|
+
rubygems_version: 2.0.3
|
120
136
|
signing_key:
|
121
|
-
specification_version:
|
137
|
+
specification_version: 4
|
122
138
|
summary: An awesome nested set implementation for Active Record
|
123
139
|
test_files: []
|
140
|
+
has_rdoc:
|
data/README.rdoc
DELETED
@@ -1,153 +0,0 @@
|
|
1
|
-
= AwesomeNestedSet
|
2
|
-
|
3
|
-
Awesome Nested Set is an implementation of the nested set pattern for ActiveRecord models. It is replacement for acts_as_nested_set and BetterNestedSet, but more awesome.
|
4
|
-
|
5
|
-
Version 2 supports Rails 3. Gem versions prior to 2.0 support Rails 2.
|
6
|
-
|
7
|
-
== What makes this so awesome?
|
8
|
-
|
9
|
-
This is a new implementation of nested set based off of BetterNestedSet that fixes some bugs, removes tons of duplication, adds a few useful methods, and adds STI support.
|
10
|
-
|
11
|
-
== Installation
|
12
|
-
|
13
|
-
Add to your Gemfile:
|
14
|
-
|
15
|
-
gem 'awesome_nested_set'
|
16
|
-
|
17
|
-
== Usage
|
18
|
-
|
19
|
-
To make use of awesome_nested_set, your model needs to have 3 fields: lft, rgt, and parent_id.
|
20
|
-
You can also have an optional field: depth:
|
21
|
-
|
22
|
-
class CreateCategories < ActiveRecord::Migration
|
23
|
-
def self.up
|
24
|
-
create_table :categories do |t|
|
25
|
-
t.string :name
|
26
|
-
t.integer :parent_id
|
27
|
-
t.integer :lft
|
28
|
-
t.integer :rgt
|
29
|
-
t.integer :depth # this is optional.
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.down
|
34
|
-
drop_table :categories
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
Enable the nested set functionality by declaring acts_as_nested_set on your model
|
39
|
-
|
40
|
-
class Category < ActiveRecord::Base
|
41
|
-
acts_as_nested_set
|
42
|
-
end
|
43
|
-
|
44
|
-
Run `rake rdoc` to generate the API docs and see CollectiveIdea::Acts::NestedSet for more info.
|
45
|
-
|
46
|
-
== Callbacks
|
47
|
-
|
48
|
-
There are three callbacks called when moving a node. `before_move`, `after_move` and `around_move`.
|
49
|
-
|
50
|
-
class Category < ActiveRecord::Base
|
51
|
-
acts_as_nested_set
|
52
|
-
|
53
|
-
after_move :rebuild_slug
|
54
|
-
around_move :da_fancy_things_around
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def rebuild_slug
|
59
|
-
# do whatever
|
60
|
-
end
|
61
|
-
|
62
|
-
def da_fancy_things_around
|
63
|
-
# do something...
|
64
|
-
yield # actually moves
|
65
|
-
# do something else...
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
Beside this there are also hooks to act on the newly added or removed children.
|
70
|
-
|
71
|
-
class Category < ActiveRecord::Base
|
72
|
-
acts_as_nested_set :before_add => :do_before_add_stuff,
|
73
|
-
:after_add => :do_after_add_stuff,
|
74
|
-
:before_remove => :do_before_remove_stuff,
|
75
|
-
:after_remove => :do_after_remove_stuff
|
76
|
-
|
77
|
-
private
|
78
|
-
|
79
|
-
def do_before_add_stuff(child_node)
|
80
|
-
# do whatever with the child
|
81
|
-
end
|
82
|
-
|
83
|
-
def do_after_add_stuff(child_node)
|
84
|
-
# do whatever with the child
|
85
|
-
end
|
86
|
-
|
87
|
-
def do_before_remove_stuff(child_node)
|
88
|
-
# do whatever with the child
|
89
|
-
end
|
90
|
-
|
91
|
-
def do_after_remove_stuff(child_node)
|
92
|
-
# do whatever with the child
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
== Protecting attributes from mass assignment
|
98
|
-
|
99
|
-
It's generally best to "white list" the attributes that can be used in mass assignment:
|
100
|
-
|
101
|
-
class Category < ActiveRecord::Base
|
102
|
-
acts_as_nested_set
|
103
|
-
attr_accessible :name, :parent_id
|
104
|
-
end
|
105
|
-
|
106
|
-
If for some reason that is not possible, you will probably want to protect the lft and rgt attributes:
|
107
|
-
|
108
|
-
class Category < ActiveRecord::Base
|
109
|
-
acts_as_nested_set
|
110
|
-
attr_protected :lft, :rgt
|
111
|
-
end
|
112
|
-
|
113
|
-
== Conversion from other trees
|
114
|
-
|
115
|
-
Coming from acts_as_tree or another system where you only have a parent_id? No problem. Simply add the lft & rgt fields as above, and then run
|
116
|
-
|
117
|
-
Category.rebuild!
|
118
|
-
|
119
|
-
Your tree will be converted to a valid nested set. Awesome!
|
120
|
-
|
121
|
-
== View Helper
|
122
|
-
|
123
|
-
The view helper is called #nested_set_options.
|
124
|
-
|
125
|
-
Example usage:
|
126
|
-
|
127
|
-
<%= f.select :parent_id, nested_set_options(Category, @category) {|i| "#{'-' * i.level} #{i.name}" } %>
|
128
|
-
|
129
|
-
<%= select_tag 'parent_id', options_for_select(nested_set_options(Category) {|i| "#{'-' * i.level} #{i.name}" } ) %>
|
130
|
-
|
131
|
-
See CollectiveIdea::Acts::NestedSet::Helper for more information about the helpers.
|
132
|
-
|
133
|
-
== References
|
134
|
-
|
135
|
-
You can learn more about nested sets at: http://threebit.net/tutorials/nestedset/tutorial1.html
|
136
|
-
|
137
|
-
== How to contribute
|
138
|
-
|
139
|
-
If you find what you might think is a bug:
|
140
|
-
|
141
|
-
1. Check the GitHub issue tracker to see if anyone else has had the same issue.
|
142
|
-
https://github.com/collectiveidea/awesome_nested_set/issues/
|
143
|
-
2. If you don't see anything, create an issue with information on how to reproduce it.
|
144
|
-
|
145
|
-
If you want to contribute an enhancement or a fix:
|
146
|
-
|
147
|
-
1. Fork the project on GitHub.
|
148
|
-
https://github.com/collectiveidea/awesome_nested_set/
|
149
|
-
2. Make your changes with tests.
|
150
|
-
3. Commit the changes without making changes to the Rakefile, VERSION, or any other files that aren't related to your enhancement or fix
|
151
|
-
4. Send a pull request.
|
152
|
-
|
153
|
-
Copyright ©2008 Collective Idea, released under the MIT license
|