awesome_nested_set 3.0.2 → 3.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f8c65ecba7e654a2e914de64f646e5e43416e47
4
- data.tar.gz: c9d4bda2db60143062026f576080982698fa73ff
3
+ metadata.gz: f5ab643ea1dfe98a3df89d5bf2c142fd22d8d96f
4
+ data.tar.gz: 3f6089e375d849c9cb600eb4c776c40323b3e67e
5
5
  SHA512:
6
- metadata.gz: 98ecf4b03fd84f510f84092fe197c73b8a6612dfd80444d9c4dd79d49bdfb3f0ebb4f47966f6ce5e02aadb9006682f1d5fc5cb9c6654682fff286d0585ec1dc1
7
- data.tar.gz: efc4897f020894d3798c6c00782baa3de7409d14f02890608da4f8245f4dfc59708ac6771efe2f1667b8b9f324c78fb3705ddee1b7df3b8d403bbdb13298f6ba
6
+ metadata.gz: 3afe6283157bd9937196de7ffe4239dac7be930417b505b306c92685cfdd703d9cf7463317994bc822490f4a426c0c88f3f3425501036cd00b00025a6f81dc8c
7
+ data.tar.gz: d96cf10ce68aa34ccee951f3b04beec6eebd960748c42502ba48016b3f559cf798c657b2b9b36d4238c38d1ba0dbca08f53dab5f39f3d3bb37044dcb4dafe902
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ 3.0.4
2
+ * Reuse the current model's connection when available [Tim Bugai] [#322](https://github.com/collectiveidea/awesome_nested_set/pull/322)
3
+
4
+ 3.0.3
5
+ * Add :nullify option to :dependent functionality to orphan children rather
6
+ than destroy them.
7
+
1
8
  3.0.2
2
9
  * Fix `dependent: :restrict_with_exception` not allowing a delete to occur. [Brendan Kilfoil]
3
10
  * Replace `Arel::SelectManager#join_sql` with `Arel::SelectManager#join_sources` as `Arel::Node#joins` accepts AST as well. [Swanand Pagnis]
data/README.md CHANGED
@@ -35,10 +35,10 @@ class CreateCategories < ActiveRecord::Migration
35
35
  t.integer :parent_id, :null => true, :index => true
36
36
  t.integer :lft, :null => false, :index => true
37
37
  t.integer :rgt, :null => false, :index => true
38
-
38
+
39
39
  # optional fields
40
- t.integer :depth, :null => false
41
- t.integer :children_count, :null => false
40
+ t.integer :depth, :null => false, :default => 0
41
+ t.integer :children_count, :null => false, :default => 0
42
42
  end
43
43
  end
44
44
 
@@ -63,13 +63,14 @@ Run `rake rdoc` to generate the API docs and see [CollectiveIdea::Acts::NestedSe
63
63
  You can pass various options to `acts_as_nested_set` macro. Configuration options are:
64
64
 
65
65
  * `parent_column`: specifies the column name to use for keeping the position integer (default: parent_id)
66
- * `left_column`: column name for left boundry data (default: lft)
67
- * `right_column`: column name for right boundry data (default: rgt)
66
+ * `left_column`: column name for left boundary data (default: lft)
67
+ * `right_column`: column name for right boundary data (default: rgt)
68
68
  * `depth_column`: column name for the depth data default (default: depth)
69
69
  * `scope`: restricts what is to be considered a list. Given a symbol, it'll attach “_id” (if it hasn't been already) and use that as the foreign key restriction. You can also pass an array to scope by multiple attributes. Example: `acts_as_nested_set :scope => [:notable_id, :notable_type]`
70
- * `dependent`: behavior for cascading destroy. If set to :destroy, all the child objects are destroyed alongside this object by calling their destroy method. If set to :delete_all (default), all the child objects are deleted without calling their destroy method.
70
+ * `dependent`: behavior for cascading destroy. If set to :destroy, all the child objects are destroyed alongside this object by calling their destroy method. If set to :delete_all (default), all the child objects are deleted without calling their destroy method. If set to :nullify, all child objects will become orphaned and become roots themselves.
71
71
  * `counter_cache`: adds a counter cache for the number of children. defaults to false. Example: `acts_as_nested_set :counter_cache => :children_count`
72
72
  * `order_column`: on which column to do sorting, by default it is the left_column_name. Example: `acts_as_nested_set :order_column => :position`
73
+ * `touch`: If set to `true`, then the updated_at timestamp on the ancestors will be set to the current time whenever this object is saved or destroyed (default: false)
73
74
 
74
75
  See [CollectiveIdea::Acts::NestedSet::Model::ClassMethods](/lib/awesome_nested_set/model.rb#L26) for a list of class methods and [CollectiveIdea::Acts::NestedSet::Model](lib/awesome_nested_set/model.rb#L13) for a list of instance methods added to acts_as_nested_set models
75
76
 
@@ -157,7 +158,7 @@ end
157
158
 
158
159
  To make use of `awesome_nested_set`, your model needs to have 3 fields:
159
160
  `lft`, `rgt`, and `parent_id`. The names of these fields are configurable.
160
- You can also have an optional field, `depth`.
161
+ You can also have optional fields, `depth` and `children_count`.
161
162
 
162
163
  Create a migration to add fields:
163
164
 
@@ -167,9 +168,12 @@ class AddNestedToCategories < ActiveRecord::Migration
167
168
  def self.up
168
169
  add_column :categories, :parent_id, :integer # Comment this line if your project already has this column
169
170
  # Category.where(parent_id: 0).update_all(parent_id: nil) # Uncomment this line if your project already has :parent_id
170
- add_column :categories, :lft , :integer
171
- add_column :categories, :rgt , :integer
172
- add_column :categories, :depth , :integer # this is optional.
171
+ add_column :categories, :lft, :integer
172
+ add_column :categories, :rgt, :integer
173
+
174
+ # optional fields
175
+ add_column :categories, :depth, :integer
176
+ add_column :categories, :children_count, :integer
173
177
 
174
178
  # This is necessary to update :lft and :rgt columns
175
179
  Category.rebuild!
@@ -179,7 +183,10 @@ class AddNestedToCategories < ActiveRecord::Migration
179
183
  remove_column :categories, :parent_id
180
184
  remove_column :categories, :lft
181
185
  remove_column :categories, :rgt
182
- remove_column :categories, :depth # this is optional.
186
+
187
+ # optional fields
188
+ remove_column :categories, :depth
189
+ remove_column :categories, :children_count
183
190
  end
184
191
 
185
192
  end
@@ -206,6 +213,8 @@ Category.rebuild!
206
213
 
207
214
  Your tree will be converted to a valid nested set. Awesome!
208
215
 
216
+ Note: You can use `Category.rebuild!(false)` to skip model validations when performing the rebuild.
217
+
209
218
  ## View Helper
210
219
 
211
220
  The view helper is called #nested_set_options.
@@ -87,7 +87,7 @@ module CollectiveIdea #:nodoc:
87
87
  ) if acts_as_nested_set_options[ar_callback]
88
88
  end
89
89
 
90
- has_many :children, -> { order(quoted_order_column_name) },
90
+ has_many :children, -> { order(quoted_order_column_full_name) },
91
91
  has_many_children_options
92
92
  end
93
93
 
@@ -32,23 +32,23 @@ module CollectiveIdea #:nodoc:
32
32
  end
33
33
 
34
34
  def quoted_left_column_name
35
- ActiveRecord::Base.connection.quote_column_name(left_column_name)
35
+ model_connection.quote_column_name(left_column_name)
36
36
  end
37
37
 
38
38
  def quoted_right_column_name
39
- ActiveRecord::Base.connection.quote_column_name(right_column_name)
39
+ model_connection.quote_column_name(right_column_name)
40
40
  end
41
41
 
42
42
  def quoted_depth_column_name
43
- ActiveRecord::Base.connection.quote_column_name(depth_column_name)
43
+ model_connection.quote_column_name(depth_column_name)
44
44
  end
45
45
 
46
46
  def quoted_primary_column_name
47
- ActiveRecord::Base.connection.quote_column_name(primary_column_name)
47
+ model_connection.quote_column_name(primary_column_name)
48
48
  end
49
49
 
50
50
  def quoted_parent_column_name
51
- ActiveRecord::Base.connection.quote_column_name(parent_column_name)
51
+ model_connection.quote_column_name(parent_column_name)
52
52
  end
53
53
 
54
54
  def quoted_scope_column_names
@@ -56,7 +56,7 @@ module CollectiveIdea #:nodoc:
56
56
  end
57
57
 
58
58
  def quoted_order_column_name
59
- ActiveRecord::Base.connection.quote_column_name(order_column)
59
+ model_connection.quote_column_name(order_column)
60
60
  end
61
61
 
62
62
  def quoted_primary_key_column_full_name
@@ -78,6 +78,10 @@ module CollectiveIdea #:nodoc:
78
78
  def quoted_parent_column_full_name
79
79
  "#{quoted_table_name}.#{quoted_parent_column_name}"
80
80
  end
81
+
82
+ def model_connection
83
+ self.is_a?(Class) ? self.connection : self.class.connection
84
+ end
81
85
  end
82
86
  end
83
87
  end
@@ -51,7 +51,9 @@ module CollectiveIdea #:nodoc:
51
51
  return false
52
52
  end
53
53
  return true
54
- else
54
+ elsif acts_as_nested_set_options[:dependent] == :nullify
55
+ descendants.update_all(parent_id: nil)
56
+ else
55
57
  descendants.delete_all
56
58
  end
57
59
  end
@@ -3,16 +3,23 @@ module CollectiveIdea #:nodoc:
3
3
  module NestedSet #:nodoc:
4
4
  module Model
5
5
  module Transactable
6
+ class OpenTransactionsIsNotZero < ActiveRecord::StatementInvalid
7
+ end
8
+
9
+ class DeadlockDetected < ActiveRecord::StatementInvalid
10
+ end
6
11
 
7
12
  protected
8
13
  def in_tenacious_transaction(&block)
9
14
  retry_count = 0
10
15
  begin
11
16
  transaction(&block)
17
+ rescue CollectiveIdea::Acts::NestedSet::Move::ImpossibleMove
18
+ raise
12
19
  rescue ActiveRecord::StatementInvalid => error
13
- raise unless self.class.connection.open_transactions.zero?
20
+ raise OpenTransactionsIsNotZero.new(error.message) unless connection.open_transactions.zero?
14
21
  raise unless error.message =~ /[Dd]eadlock|Lock wait timeout exceeded/
15
- raise unless retry_count < 10
22
+ raise DeadlockDetected.new(error.message) unless retry_count < 10
16
23
  retry_count += 1
17
24
  logger.info "Deadlock detected on retry #{retry_count}, restarting transaction"
18
25
  sleep(rand(retry_count)*0.1) # Aloha protocol
@@ -110,9 +110,12 @@ module CollectiveIdea #:nodoc:
110
110
  [bound, other_bound]
111
111
  end
112
112
 
113
+ class ImpossibleMove < ActiveRecord::StatementInvalid
114
+ end
115
+
113
116
  def prevent_impossible_move
114
117
  if !root && !instance.move_possible?(target)
115
- raise ActiveRecord::ActiveRecordError, "Impossible move, target node cannot be inside moved tree."
118
+ raise ImpossibleMove, "Impossible move, target node cannot be inside moved tree."
116
119
  end
117
120
  end
118
121
 
@@ -1,3 +1,3 @@
1
1
  module AwesomeNestedSet
2
- VERSION = '3.0.2' unless defined?(::AwesomeNestedSet::VERSION)
2
+ VERSION = '3.0.3' unless defined?(::AwesomeNestedSet::VERSION)
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awesome_nested_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-01-08 00:00:00.000000000 Z
13
+ date: 2016-01-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -130,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
130
  requirements:
131
131
  - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: '0'
133
+ version: 1.9.3
134
134
  required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
@@ -138,9 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  version: '0'
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 2.4.5
141
+ rubygems_version: 2.5.1
142
142
  signing_key:
143
143
  specification_version: 4
144
144
  summary: An awesome nested set implementation for Active Record
145
145
  test_files: []
146
- has_rdoc: