acts_as_tree 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,5 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
- - rbx-19mode
6
5
  - ruby-head
data/README.md CHANGED
@@ -1,14 +1,15 @@
1
- [![Build Status](https://secure.travis-ci.org/amerine/acts_as_tree.png?branch=master)](http://travis-ci.org/amerine/acts_as_tree)
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)
2
4
 
3
- # ActsAsTree
4
5
 
5
- A gem that extends ActiveRecord to add simple support for organizing items into
6
+ ActsAsTree extends ActiveRecord to add simple support for organizing items into
6
7
  parent–children relationships.
7
8
 
8
9
  ## Example
9
10
 
10
11
  class Category < ActiveRecord::Base
11
- include ActiveRecord::Acts::Tree
12
+ include ActsAsTree
12
13
 
13
14
  acts_as_tree order: "name"
14
15
  end
@@ -29,9 +30,14 @@ We no longer support Ruby 1.8 or versions if Rails/ActiveRecord older than 3.0.
29
30
  Moving forward we will do our best to support the latest versions of ActiveRecord and Ruby.
30
31
 
31
32
  ## Change Log
32
-
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.
33
39
  * 0.2.0 - April 9, 2012
34
- * Rails 3 Support
40
+ * Rails 3 Support
35
41
  * 0.1.1 - February 3, 2010
36
42
  * Bug Fixes
37
43
  * 0.1.0 - October 9th, 2009
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ task :default => :test
12
12
  require 'rdoc/task'
13
13
  RDoc::Task.new do |rdoc|
14
14
  require "acts_as_tree/version"
15
- version = ActiveRecord::Acts::Tree::VERSION
15
+ version = ActsAsTree::VERSION
16
16
 
17
17
  rdoc.rdoc_dir = 'rdoc'
18
18
  rdoc.title = "acts_as_tree-rails3 #{version}"
@@ -4,7 +4,7 @@ require 'acts_as_tree/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'acts_as_tree'
7
- s.version = ActiveRecord::Acts::Tree::VERSION
7
+ s.version = ActsAsTree::VERSION
8
8
  s.authors = ['Erik Dahlstrand', 'Rails Core', 'Mark Turner', 'Swanand Pagnis']
9
9
  s.email = ['erik.dahlstrand@gmail.com', 'mark@amerine.net', 'swanand.pagnis@gmail.com']
10
10
  s.homepage = 'https://github.com/amerine/acts_as_tree'
@@ -1,7 +1,7 @@
1
- require 'acts_as_tree/active_record/acts/tree'
2
1
  require 'acts_as_tree/version'
3
2
 
4
3
  module ActsAsTree
4
+
5
5
  if defined? Rails::Railtie
6
6
  require 'rails'
7
7
  class Railtie < Rails::Railtie
@@ -16,8 +16,154 @@ module ActsAsTree
16
16
  class Railtie
17
17
  def self.insert
18
18
  if defined?(ActiveRecord)
19
- ActiveRecord::Base.send(:include, ActiveRecord::Acts::Tree)
19
+ ActiveRecord::Base.send(:include, ActsAsTree)
20
20
  end
21
21
  end
22
22
  end
23
- 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'
@@ -1,147 +1,14 @@
1
+ require 'acts_as_tree'
2
+
1
3
  module ActiveRecord
2
4
  module Acts #:nodoc:
3
- module Tree #:nodoc:
4
- def self.included(base)
5
- base.extend(ClassMethods)
6
- end
7
-
8
- # Specify this +acts_as+ extension if you want to model a tree structure
9
- # by providing a parent association and a children association. This
10
- # requires that you have a foreign key column, which by default is called
11
- # +parent_id+.
12
- #
13
- # class Category < ActiveRecord::Base
14
- # include ActiveRecord::Acts:Tree
15
- #
16
- # acts_as_tree :order => "name"
17
- # end
18
- #
19
- # Example:
20
- # root
21
- # \_ child1
22
- # \_ subchild1
23
- # \_ subchild2
24
- #
25
- # root = Category.create("name" => "root")
26
- # child1 = root.children.create("name" => "child1")
27
- # subchild1 = child1.children.create("name" => "subchild1")
28
- #
29
- # root.parent # => nil
30
- # child1.parent # => root
31
- # root.children # => [child1]
32
- # root.children.first.children.first # => subchild1
33
- #
34
- # In addition to the parent and children associations, the following
35
- # instance methods are added to the class after calling
36
- # <tt>acts_as_tree</tt>:
37
- # * <tt>siblings</tt> - Returns all the children of the parent, excluding
38
- # the current node (<tt>[subchild2]</tt> when called
39
- # on <tt>subchild1</tt>)
40
- # * <tt>self_and_siblings</tt> - Returns all the children of the parent,
41
- # including the current node (<tt>[subchild1, subchild2]</tt>
42
- # when called on <tt>subchild1</tt>)
43
- # * <tt>ancestors</tt> - Returns all the ancestors of the current node
44
- # (<tt>[child1, root]</tt> when called on <tt>subchild2</tt>)
45
- # * <tt>root</tt> - Returns the root of the current node (<tt>root</tt>
46
- # when called on <tt>subchild2</tt>)
47
- module ClassMethods
48
- # Configuration options are:
49
- #
50
- # * <tt>foreign_key</tt> - specifies the column name to use for tracking
51
- # of the tree (default: +parent_id+)
52
- # * <tt>order</tt> - makes it possible to sort the children according to
53
- # this SQL snippet.
54
- # * <tt>counter_cache</tt> - keeps a count in a +children_count+ column
55
- # if set to +true+ (default: +false+).
56
- def acts_as_tree(options = {})
57
- configuration = {
58
- foreign_key: "parent_id",
59
- order: nil,
60
- counter_cache: nil,
61
- dependent: :destroy
62
- }
63
-
64
- configuration.update(options) if options.is_a?(Hash)
65
-
66
- belongs_to :parent, class_name: name,
67
- foreign_key: configuration[:foreign_key],
68
- counter_cache: configuration[:counter_cache],
69
- inverse_of: :children
70
-
71
- has_many :children, class_name: name,
72
- foreign_key: configuration[:foreign_key],
73
- order: configuration[:order],
74
- dependent: configuration[:dependent],
75
- inverse_of: :parent
76
-
77
- class_eval <<-EOV
78
- include ActiveRecord::Acts::Tree::InstanceMethods
79
-
80
- after_update :update_parents_counter_cache
81
-
82
- def self.roots
83
- order_option = %Q{#{configuration.fetch :order, "nil"}}
5
+ module Tree
6
+ include ::ActsAsTree
84
7
 
85
- find(:all, conditions: "#{configuration[:foreign_key]} IS NULL",
86
- order: order_option)
87
- end
88
-
89
- def self.root
90
- order_option = %Q{#{configuration.fetch :order, "nil"}}
91
-
92
- find(:first, conditions: "#{configuration[:foreign_key]} IS NULL",
93
- order: order_option)
94
- end
95
- EOV
96
- end
97
- end
98
-
99
- module InstanceMethods
100
- # Returns list of ancestors, starting from parent until root.
101
- #
102
- # subchild1.ancestors # => [child1, root]
103
- def ancestors
104
- node, nodes = self, []
105
- nodes << node = node.parent while node.parent
106
- nodes
107
- end
108
-
109
- # Returns the root node of the tree.
110
- def root
111
- node = self
112
- node = node.parent while node.parent
113
- node
114
- end
115
-
116
- # Returns all siblings of the current node.
117
- #
118
- # subchild1.siblings # => [subchild2]
119
- def siblings
120
- self_and_siblings - [self]
121
- end
122
-
123
- # Returns all siblings and a reference to the current node.
124
- #
125
- # subchild1.self_and_siblings # => [subchild1, subchild2]
126
- def self_and_siblings
127
- parent ? parent.children : self.class.roots
128
- end
129
-
130
- # Returns children (without subchildren) and current node itself.
131
- #
132
- # root.self_and_children # => [root, child1]
133
- def self_and_children
134
- [self] + self.children
135
- end
136
-
137
- private
8
+ def self.included(base)
9
+ Kernel.warn "[DEPRECATION] The module ActiveRecord::Acts::Tree has moved to ActsAsTree"
138
10
 
139
- def update_parents_counter_cache
140
- if self.respond_to?(:children_count) && parent_id_changed?
141
- self.class.decrement_counter(:children_count, parent_id_was)
142
- self.class.increment_counter(:children_count, parent_id)
143
- end
144
- end
11
+ base.extend ::ActsAsTree::ClassMethods
145
12
  end
146
13
  end
147
14
  end
@@ -1,7 +1,3 @@
1
- module ActiveRecord
2
- module Acts
3
- module Tree
4
- VERSION = "1.0.1"
5
- end
6
- end
1
+ module ActsAsTree
2
+ VERSION = "1.1.0"
7
3
  end
@@ -38,7 +38,7 @@ def teardown_db
38
38
  end
39
39
 
40
40
  class Mixin < ActiveRecord::Base
41
- include ActiveRecord::Acts::Tree
41
+ include ActsAsTree
42
42
  end
43
43
 
44
44
  class TreeMixin < Mixin
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,11 +12,11 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-04-18 00:00:00.000000000 Z
15
+ date: 2012-04-25 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activerecord
19
- requirement: &70288490534000 !ruby/object:Gem::Requirement
19
+ requirement: &70112110455280 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: 3.0.0
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *70288490534000
27
+ version_requirements: *70112110455280
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: sqlite3
30
- requirement: &70288490533300 !ruby/object:Gem::Requirement
30
+ requirement: &70112110454840 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: '0'
36
36
  type: :development
37
37
  prerelease: false
38
- version_requirements: *70288490533300
38
+ version_requirements: *70112110454840
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: rdoc
41
- requirement: &70288490532580 !ruby/object:Gem::Requirement
41
+ requirement: &70112110454380 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,7 +46,7 @@ dependencies:
46
46
  version: '0'
47
47
  type: :development
48
48
  prerelease: false
49
- version_requirements: *70288490532580
49
+ version_requirements: *70112110454380
50
50
  description: A gem that adds simple support for organizing ActiveRecord models into
51
51
  parent–children relationships.
52
52
  email: