acts_as_tree-1.8 1.1.0

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,5 @@
1
+ *.gem
2
+ .bundle
3
+ pkg/*
4
+ .rvmrc
5
+ Gemfile.lock
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ruby-head
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'rake'
7
+ end
@@ -0,0 +1,76 @@
1
+ # ActsAsTree [![Build Status](https://secure.travis-ci.org/amerine/acts_as_tree.png?branch=master)][travis] [![Dependency Status](https://gemnasium.com/amerine/acts_as_tree.png?travis)][gemnasium]
2
+ [travis]: (http://travis-ci.org/amerine/acts_as_tree)
3
+ [gemnasium]: (https://gemnasium.com/amerine/acts_as_tree)
4
+
5
+
6
+ ActsAsTree extends ActiveRecord to add simple support for organizing items into
7
+ parent–children relationships.
8
+
9
+ ## Example
10
+
11
+ class Category < ActiveRecord::Base
12
+ include ActsAsTree
13
+
14
+ acts_as_tree order: "name"
15
+ end
16
+
17
+ root = Category.create("name" => "root")
18
+ child1 = root.children.create("name" => "child1")
19
+ subchild1 = child1.children.create("name" => "subchild1")
20
+
21
+ root.parent # => nil
22
+ child1.parent # => root
23
+ root.children # => [child1]
24
+ root.children.first.children.first # => subchild1
25
+
26
+ ## Compatibility
27
+
28
+ We no longer support Ruby 1.8 or versions if Rails/ActiveRecord older than 3.0. If you're using a version of ActiveRecord older than 3.0 please use 0.1.1.
29
+
30
+ Moving forward we will do our best to support the latest versions of ActiveRecord and Ruby.
31
+
32
+ ## Change Log
33
+ * 1.1.0 - April 24th, 2012
34
+ * Deprecate the ActiveRecord::Acts::Tree module in favor of ActsAsTree
35
+ * 1.0.1 - April 18th, 2012
36
+ * Include the Railtie for easier loading in Rails. Will reassess the forced module inclusion in the future.
37
+ * 1.0.0 - April 14th, 2012
38
+ * Official 1.0 release. Force users to include the ActiveRecord::Acts::Tree module.
39
+ * 0.2.0 - April 9, 2012
40
+ * Rails 3 Support
41
+ * 0.1.1 - February 3, 2010
42
+ * Bug Fixes
43
+ * 0.1.0 - October 9th, 2009
44
+ * First Gem Release
45
+
46
+ ## Note on Patches/Pull Requests
47
+
48
+ 1. Fork the project.
49
+ 2. Make your feature addition or bug fix.
50
+ 3. Add tests for it. This is important so we don't break it in a future version
51
+ unintentionally.
52
+ 4. Commit, do not mess with rakefile, version, or history. (if you want to have
53
+ your own version, that is fine but bump version in a commit by itself so we can
54
+ ignore when we pull)
55
+ 5. Send us a pull request. Bonus points for topic branches.
56
+
57
+ ## License (MIT)
58
+
59
+ Copyright (c) 2007 David Heinemeier Hansson
60
+
61
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
62
+ this software and associated documentation files (the 'Software'), to deal in the
63
+ Software without restriction, including without limitation the rights to use,
64
+ copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
65
+ Software, and to permit persons to whom the Software is furnished to do so,
66
+ subject to the following conditions:
67
+
68
+ The above copyright notice and this permission notice shall be included in all
69
+ copies or substantial portions of the Software.
70
+
71
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
72
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
73
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
74
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
75
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
76
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,21 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ desc "Run the tests."
4
+ task :test do
5
+ $: << "lib" << "test"
6
+ Dir["test/*_test.rb"].each { |f| require f[5..-4] }
7
+ end
8
+
9
+ task :default => :test
10
+
11
+ # Run the rdoc task to generate rdocs for this gem
12
+ require 'rdoc/task'
13
+ RDoc::Task.new do |rdoc|
14
+ require "acts_as_tree/version"
15
+ version = ActsAsTree::VERSION
16
+
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = "acts_as_tree-rails3 #{version}"
19
+ rdoc.rdoc_files.include('README*')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'acts_as_tree/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'acts_as_tree-1.8'
7
+ s.version = ActsAsTree::VERSION
8
+ s.authors = ['Erik Dahlstrand', 'Rails Core', 'Mark Turner', 'Swanand Pagnis']
9
+ s.email = ['erik.dahlstrand@gmail.com', 'mark@amerine.net', 'swanand.pagnis@gmail.com']
10
+ s.homepage = 'https://github.com/dryade/acts_as_tree'
11
+ s.summary = %q{Provides a simple tree behaviour to active_record models.}
12
+ s.description = %q{A gem that adds simple support for organizing ActiveRecord models into parent–children relationships.}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+ s.rdoc_options = ["--charset=UTF-8"]
19
+
20
+ s.add_dependency "activerecord", ">= 3.0.0"
21
+
22
+ # Dependencies (installed via 'bundle install')...
23
+ s.add_development_dependency "sqlite3"
24
+ s.add_development_dependency "rdoc"
25
+ end
@@ -0,0 +1,169 @@
1
+ require 'acts_as_tree/version'
2
+
3
+ module ActsAsTree
4
+
5
+ if defined? Rails::Railtie
6
+ require 'rails'
7
+ class Railtie < Rails::Railtie
8
+ initializer 'acts_as_tree.insert_into_active_record' do
9
+ ActiveSupport.on_load :active_record do
10
+ ActsAsTree::Railtie.insert
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ class Railtie
17
+ def self.insert
18
+ if defined?(ActiveRecord)
19
+ ActiveRecord::Base.send(:include, ActsAsTree)
20
+ end
21
+ end
22
+ end
23
+
24
+ def self.included(base)
25
+ base.extend(ClassMethods)
26
+ end
27
+
28
+ # Specify this +acts_as+ extension if you want to model a tree structure
29
+ # by providing a parent association and a children association. This
30
+ # requires that you have a foreign key column, which by default is called
31
+ # +parent_id+.
32
+ #
33
+ # class Category < ActiveRecord::Base
34
+ # include ActiveRecord::Acts:Tree
35
+ #
36
+ # acts_as_tree :order => "name"
37
+ # end
38
+ #
39
+ # Example:
40
+ # root
41
+ # \_ child1
42
+ # \_ subchild1
43
+ # \_ subchild2
44
+ #
45
+ # root = Category.create("name" => "root")
46
+ # child1 = root.children.create("name" => "child1")
47
+ # subchild1 = child1.children.create("name" => "subchild1")
48
+ #
49
+ # root.parent # => nil
50
+ # child1.parent # => root
51
+ # root.children # => [child1]
52
+ # root.children.first.children.first # => subchild1
53
+ #
54
+ # In addition to the parent and children associations, the following
55
+ # instance methods are added to the class after calling
56
+ # <tt>acts_as_tree</tt>:
57
+ # * <tt>siblings</tt> - Returns all the children of the parent, excluding
58
+ # the current node (<tt>[subchild2]</tt> when called
59
+ # on <tt>subchild1</tt>)
60
+ # * <tt>self_and_siblings</tt> - Returns all the children of the parent,
61
+ # including the current node (<tt>[subchild1, subchild2]</tt>
62
+ # when called on <tt>subchild1</tt>)
63
+ # * <tt>ancestors</tt> - Returns all the ancestors of the current node
64
+ # (<tt>[child1, root]</tt> when called on <tt>subchild2</tt>)
65
+ # * <tt>root</tt> - Returns the root of the current node (<tt>root</tt>
66
+ # when called on <tt>subchild2</tt>)
67
+ module ClassMethods
68
+ # Configuration options are:
69
+ #
70
+ # * <tt>foreign_key</tt> - specifies the column name to use for tracking
71
+ # of the tree (default: +parent_id+)
72
+ # * <tt>order</tt> - makes it possible to sort the children according to
73
+ # this SQL snippet.
74
+ # * <tt>counter_cache</tt> - keeps a count in a +children_count+ column
75
+ # if set to +true+ (default: +false+).
76
+ def acts_as_tree(options = {})
77
+ configuration = {
78
+ :foreign_key => "parent_id",
79
+ :order => nil,
80
+ :counter_cache => nil,
81
+ :dependent => :destroy
82
+ }
83
+
84
+ configuration.update(options) if options.is_a?(Hash)
85
+
86
+ belongs_to :parent, :class_name => name,
87
+ :foreign_key => configuration[:foreign_key],
88
+ :counter_cache => configuration[:counter_cache],
89
+ :inverse_of => :children
90
+
91
+ has_many :children, :class_name => name,
92
+ :foreign_key => configuration[:foreign_key],
93
+ :order => configuration[:order],
94
+ :dependent => configuration[:dependent],
95
+ :inverse_of => :parent
96
+
97
+ class_eval <<-EOV
98
+ include ActsAsTree::InstanceMethods
99
+
100
+ after_update :update_parents_counter_cache
101
+
102
+ def self.roots
103
+ order_option = %Q{#{configuration.fetch :order, "nil"}}
104
+
105
+ find(:all, :conditions => "#{configuration[:foreign_key]} IS NULL",
106
+ :order => order_option)
107
+ end
108
+
109
+ def self.root
110
+ order_option = %Q{#{configuration.fetch :order, "nil"}}
111
+
112
+ find(:first, :conditions => "#{configuration[:foreign_key]} IS NULL",
113
+ :order => order_option)
114
+ end
115
+ EOV
116
+ end
117
+ end
118
+
119
+ module InstanceMethods
120
+ # Returns list of ancestors, starting from parent until root.
121
+ #
122
+ # subchild1.ancestors # => [child1, root]
123
+ def ancestors
124
+ node, nodes = self, []
125
+ nodes << node = node.parent while node.parent
126
+ nodes
127
+ end
128
+
129
+ # Returns the root node of the tree.
130
+ def root
131
+ node = self
132
+ node = node.parent while node.parent
133
+ node
134
+ end
135
+
136
+ # Returns all siblings of the current node.
137
+ #
138
+ # subchild1.siblings # => [subchild2]
139
+ def siblings
140
+ self_and_siblings - [self]
141
+ end
142
+
143
+ # Returns all siblings and a reference to the current node.
144
+ #
145
+ # subchild1.self_and_siblings # => [subchild1, subchild2]
146
+ def self_and_siblings
147
+ parent ? parent.children : self.class.roots
148
+ end
149
+
150
+ # Returns children (without subchildren) and current node itself.
151
+ #
152
+ # root.self_and_children # => [root, child1]
153
+ def self_and_children
154
+ [self] + self.children
155
+ end
156
+
157
+ private
158
+
159
+ def update_parents_counter_cache
160
+ if self.respond_to?(:children_count) && parent_id_changed?
161
+ self.class.decrement_counter(:children_count, parent_id_was)
162
+ self.class.increment_counter(:children_count, parent_id)
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ # Deprecating the following code in the future.
169
+ require 'acts_as_tree/active_record/acts/tree'
@@ -0,0 +1,15 @@
1
+ require 'acts_as_tree'
2
+
3
+ module ActiveRecord
4
+ module Acts #:nodoc:
5
+ module Tree
6
+ include ::ActsAsTree
7
+
8
+ def self.included(base)
9
+ Kernel.warn "[DEPRECATION] The module ActiveRecord::Acts::Tree has moved to ActsAsTree"
10
+
11
+ base.extend ::ActsAsTree::ClassMethods
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module ActsAsTree
2
+ VERSION = "1.1.0"
3
+ end
@@ -0,0 +1,304 @@
1
+ require 'test/unit'
2
+ require 'active_record'
3
+ require 'acts_as_tree'
4
+
5
+ class Test::Unit::TestCase
6
+ def assert_queries(num = 1)
7
+ $query_count = 0
8
+ yield
9
+ ensure
10
+ assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
11
+ end
12
+
13
+ def assert_no_queries(&block)
14
+ assert_queries(0, &block)
15
+ end
16
+ end
17
+
18
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
19
+
20
+ # AR keeps printing annoying schema statements
21
+ $stdout = StringIO.new
22
+
23
+ def setup_db
24
+ ActiveRecord::Base.logger
25
+ ActiveRecord::Schema.define(version: 1) do
26
+ create_table :mixins do |t|
27
+ t.column :type, :string
28
+ t.column :parent_id, :integer
29
+ t.column :children_count, :integer, default: 0
30
+ end
31
+ end
32
+ end
33
+
34
+ def teardown_db
35
+ ActiveRecord::Base.connection.tables.each do |table|
36
+ ActiveRecord::Base.connection.drop_table(table)
37
+ end
38
+ end
39
+
40
+ class Mixin < ActiveRecord::Base
41
+ include ActsAsTree
42
+ end
43
+
44
+ class TreeMixin < Mixin
45
+ acts_as_tree foreign_key: "parent_id", order: "id"
46
+ end
47
+
48
+ class TreeMixinWithoutOrder < Mixin
49
+ acts_as_tree foreign_key: "parent_id"
50
+ end
51
+
52
+ class TreeMixinNullify < Mixin
53
+ acts_as_tree foreign_key: "parent_id", order: "id", dependent: :nullify
54
+ end
55
+
56
+ class TreeMixinWithCounterCache < Mixin
57
+ acts_as_tree foreign_key: "parent_id", order: "id", counter_cache: :children_count
58
+ end
59
+
60
+ class RecursivelyCascadedTreeMixin < Mixin
61
+ acts_as_tree foreign_key: "parent_id"
62
+ has_one :first_child, class_name: 'RecursivelyCascadedTreeMixin', foreign_key: :parent_id
63
+ end
64
+
65
+ class TreeTest < Test::Unit::TestCase
66
+
67
+ def setup
68
+ setup_db
69
+ @root1 = TreeMixin.create!
70
+ @root_child1 = TreeMixin.create! parent_id: @root1.id
71
+ @child1_child = TreeMixin.create! parent_id: @root_child1.id
72
+ @child1_child_child = TreeMixin.create! parent_id: @child1_child.id
73
+ @root_child2 = TreeMixin.create! parent_id: @root1.id
74
+ @root2 = TreeMixin.create!
75
+ @root3 = TreeMixin.create!
76
+ end
77
+
78
+ def teardown
79
+ teardown_db
80
+ end
81
+
82
+ def test_children
83
+ assert_equal @root1.children, [@root_child1, @root_child2]
84
+ assert_equal @root_child1.children, [@child1_child]
85
+ assert_equal @child1_child.children, [@child1_child_child]
86
+ assert_equal @child1_child_child.children, []
87
+ assert_equal @root_child2.children, []
88
+ end
89
+
90
+ def test_parent
91
+ assert_equal @root_child1.parent, @root1
92
+ assert_equal @root_child1.parent, @root_child2.parent
93
+ assert_nil @root1.parent
94
+ end
95
+
96
+ def test_delete
97
+ assert_equal 7, TreeMixin.count
98
+ @root1.destroy
99
+ assert_equal 2, TreeMixin.count
100
+ @root2.destroy
101
+ @root3.destroy
102
+ assert_equal 0, TreeMixin.count
103
+ end
104
+
105
+ def test_insert
106
+ @extra = @root1.children.create
107
+
108
+ assert @extra
109
+
110
+ assert_equal @extra.parent, @root1
111
+
112
+ assert_equal 3, @root1.reload.children.count
113
+ assert @root1.children.include?(@extra)
114
+ assert @root1.children.include?(@root_child1)
115
+ assert @root1.children.include?(@root_child2)
116
+ end
117
+
118
+ def test_ancestors
119
+ assert_equal [], @root1.ancestors
120
+ assert_equal [@root1], @root_child1.ancestors
121
+ assert_equal [@root_child1, @root1], @child1_child.ancestors
122
+ assert_equal [@root1], @root_child2.ancestors
123
+ assert_equal [], @root2.ancestors
124
+ assert_equal [], @root3.ancestors
125
+ end
126
+
127
+ def test_root
128
+ assert_equal @root1, TreeMixin.root
129
+ assert_equal @root1, @root1.root
130
+ assert_equal @root1, @root_child1.root
131
+ assert_equal @root1, @child1_child.root
132
+ assert_equal @root1, @root_child2.root
133
+ assert_equal @root2, @root2.root
134
+ assert_equal @root3, @root3.root
135
+ end
136
+
137
+ def test_roots
138
+ assert_equal [@root1, @root2, @root3], TreeMixin.roots
139
+ end
140
+
141
+ def test_siblings
142
+ assert_equal [@root2, @root3], @root1.siblings
143
+ assert_equal [@root_child2], @root_child1.siblings
144
+ assert_equal [], @child1_child.siblings
145
+ assert_equal [@root_child1], @root_child2.siblings
146
+ assert_equal [@root1, @root3], @root2.siblings
147
+ assert_equal [@root1, @root2], @root3.siblings
148
+ end
149
+
150
+ def test_self_and_siblings
151
+ assert_equal [@root1, @root2, @root3], @root1.self_and_siblings
152
+ assert_equal [@root_child1, @root_child2], @root_child1.self_and_siblings
153
+ assert_equal [@child1_child], @child1_child.self_and_siblings
154
+ assert_equal [@root_child1, @root_child2], @root_child2.self_and_siblings
155
+ assert_equal [@root1, @root2, @root3], @root2.self_and_siblings
156
+ assert_equal [@root1, @root2, @root3], @root3.self_and_siblings
157
+ end
158
+
159
+ def test_self_and_children
160
+ assert_equal [@root1, @root_child1, @root_child2], @root1.self_and_children
161
+ assert_equal [@root2], @root2.self_and_children
162
+ end
163
+
164
+ def test_nullify
165
+ root4 = TreeMixinNullify.create!
166
+ root4_child = TreeMixinNullify.create! parent_id: root4.id
167
+
168
+ assert_equal 2, TreeMixinNullify.count
169
+ assert_equal root4.id, root4_child.parent_id
170
+
171
+ root4.destroy
172
+
173
+ assert_equal 1, TreeMixinNullify.count
174
+ assert_nil root4_child.reload.parent_id
175
+ end
176
+
177
+ end
178
+
179
+ class TreeTestWithEagerLoading < Test::Unit::TestCase
180
+
181
+ def setup
182
+ teardown_db
183
+ setup_db
184
+ @root1 = TreeMixin.create!
185
+ @root_child1 = TreeMixin.create! parent_id: @root1.id
186
+ @child1_child = TreeMixin.create! parent_id: @root_child1.id
187
+ @root_child2 = TreeMixin.create! parent_id: @root1.id
188
+ @root2 = TreeMixin.create!
189
+ @root3 = TreeMixin.create!
190
+
191
+ @rc1 = RecursivelyCascadedTreeMixin.create!
192
+ @rc2 = RecursivelyCascadedTreeMixin.create! parent_id: @rc1.id
193
+ @rc3 = RecursivelyCascadedTreeMixin.create! parent_id: @rc2.id
194
+ @rc4 = RecursivelyCascadedTreeMixin.create! parent_id: @rc3.id
195
+ end
196
+
197
+ def teardown
198
+ teardown_db
199
+ end
200
+
201
+ def test_eager_association_loading
202
+ roots = TreeMixin.find :all, include: :children,
203
+ conditions: "mixins.parent_id IS NULL",
204
+ order: "mixins.id"
205
+
206
+ assert_equal [@root1, @root2, @root3], roots
207
+
208
+ assert_no_queries do
209
+ assert_equal 2, roots[0].children.count
210
+ assert_equal 0, roots[1].children.count
211
+ assert_equal 0, roots[2].children.count
212
+ end
213
+ end
214
+
215
+ def test_eager_association_loading_with_recursive_cascading_three_levels_has_many
216
+ root_node = RecursivelyCascadedTreeMixin.find :first,
217
+ include: {children: {children: :children}},
218
+ order: 'mixins.id'
219
+
220
+ assert_equal @rc4, assert_no_queries { root_node.children.first.children.first.children.first }
221
+ end
222
+
223
+ def test_eager_association_loading_with_recursive_cascading_three_levels_has_one
224
+ root_node = RecursivelyCascadedTreeMixin.find :first,
225
+ include: {first_child: {first_child: :first_child}},
226
+ order: 'mixins.id'
227
+
228
+ assert_equal @rc4, assert_no_queries { root_node.first_child.first_child.first_child }
229
+ end
230
+
231
+ def test_eager_association_loading_with_recursive_cascading_three_levels_belongs_to
232
+ leaf_node = RecursivelyCascadedTreeMixin.find :first,
233
+ include: {parent: {parent: :parent}},
234
+ order: 'mixins.id DESC'
235
+
236
+ assert_equal @rc1, assert_no_queries { leaf_node.parent.parent.parent }
237
+ end
238
+ end
239
+
240
+ class TreeTestWithoutOrder < Test::Unit::TestCase
241
+
242
+ def setup
243
+ setup_db
244
+ @root1 = TreeMixinWithoutOrder.create!
245
+ @root2 = TreeMixinWithoutOrder.create!
246
+ end
247
+
248
+ def teardown
249
+ teardown_db
250
+ end
251
+
252
+ def test_root
253
+ assert [@root1, @root2].include? TreeMixinWithoutOrder.root
254
+ end
255
+
256
+ def test_roots
257
+ assert_equal [], [@root1, @root2] - TreeMixinWithoutOrder.roots
258
+ end
259
+ end
260
+
261
+ class UnsavedTreeTest < Test::Unit::TestCase
262
+ def setup
263
+ setup_db
264
+ @root = TreeMixin.new
265
+ @root_child = @root.children.build
266
+ end
267
+
268
+ def teardown
269
+ teardown_db
270
+ end
271
+
272
+ def test_inverse_of
273
+ # We want children to be aware of their parent before saving either
274
+ assert_equal @root, @root_child.parent
275
+ end
276
+ end
277
+
278
+
279
+ class TreeTestWithCounterCache < Test::Unit::TestCase
280
+ def setup
281
+ teardown_db
282
+ setup_db
283
+ @root = TreeMixinWithCounterCache.create!
284
+ @child1 = TreeMixinWithCounterCache.create! parent_id: @root.id
285
+ @child1_child1 = TreeMixinWithCounterCache.create! parent_id: @child1.id
286
+ @child2 = TreeMixinWithCounterCache.create! parent_id: @root.id
287
+ end
288
+
289
+ def teardown
290
+ teardown_db
291
+ end
292
+
293
+ def test_counter_cache
294
+ assert_equal 2, @root.reload.children_count
295
+ assert_equal 1, @child1.reload.children_count
296
+ end
297
+
298
+ def test_update_parents_counter_cache
299
+ @child1_child1.update_attributes(:parent_id => @root.id)
300
+ assert_equal 3, @root.reload.children_count
301
+ assert_equal 0, @child1.reload.children_count
302
+ end
303
+
304
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_tree-1.8
3
+ version: !ruby/object:Gem::Version
4
+ hash: 19
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 1
9
+ - 0
10
+ version: 1.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Erik Dahlstrand
14
+ - Rails Core
15
+ - Mark Turner
16
+ - Swanand Pagnis
17
+ autorequire:
18
+ bindir: bin
19
+ cert_chain: []
20
+
21
+ date: 2013-02-22 00:00:00 Z
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ version_requirements: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 3
32
+ - 0
33
+ - 0
34
+ version: 3.0.0
35
+ requirement: *id001
36
+ type: :runtime
37
+ prerelease: false
38
+ name: activerecord
39
+ - !ruby/object:Gem::Dependency
40
+ version_requirements: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ requirement: *id002
50
+ type: :development
51
+ prerelease: false
52
+ name: sqlite3
53
+ - !ruby/object:Gem::Dependency
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ requirement: *id003
64
+ type: :development
65
+ prerelease: false
66
+ name: rdoc
67
+ description: "A gem that adds simple support for organizing ActiveRecord models into parent\xE2\x80\x93children relationships."
68
+ email:
69
+ - erik.dahlstrand@gmail.com
70
+ - mark@amerine.net
71
+ - swanand.pagnis@gmail.com
72
+ executables: []
73
+
74
+ extensions: []
75
+
76
+ extra_rdoc_files: []
77
+
78
+ files:
79
+ - .gitignore
80
+ - .travis.yml
81
+ - Gemfile
82
+ - README.md
83
+ - Rakefile
84
+ - acts_as_tree.gemspec
85
+ - lib/acts_as_tree.rb
86
+ - lib/acts_as_tree/active_record/acts/tree.rb
87
+ - lib/acts_as_tree/version.rb
88
+ - test/acts_as_tree_test.rb
89
+ homepage: https://github.com/dryade/acts_as_tree
90
+ licenses: []
91
+
92
+ post_install_message:
93
+ rdoc_options:
94
+ - --charset=UTF-8
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ hash: 3
103
+ segments:
104
+ - 0
105
+ version: "0"
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ hash: 3
112
+ segments:
113
+ - 0
114
+ version: "0"
115
+ requirements: []
116
+
117
+ rubyforge_project:
118
+ rubygems_version: 1.8.24
119
+ signing_key:
120
+ specification_version: 3
121
+ summary: Provides a simple tree behaviour to active_record models.
122
+ test_files: []
123
+