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.
@@ -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
@@ -1,3 +1,3 @@
1
1
  module AwesomeNestedSet
2
- VERSION = '2.1.6' unless defined?(::AwesomeNestedSet::VERSION)
2
+ VERSION = '3.0.0.rc.1' unless defined?(::AwesomeNestedSet::VERSION)
3
3
  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: 2.1.6
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-02-14 00:00:00.000000000 Z
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: 3.0.0
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: 3.0.0
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.rdoc
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.rdoc
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.rdoc
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: '0'
132
+ version: 1.3.1
117
133
  requirements: []
118
134
  rubyforge_project:
119
- rubygems_version: 1.8.25
135
+ rubygems_version: 2.0.3
120
136
  signing_key:
121
- specification_version: 3
137
+ specification_version: 4
122
138
  summary: An awesome nested set implementation for Active Record
123
139
  test_files: []
140
+ has_rdoc:
@@ -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