acts_as_ordered_tree 1.1.7 → 1.1.8
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/lib/acts_as_ordered_tree.rb +32 -8
- data/lib/acts_as_ordered_tree/class_methods.rb +3 -3
- data/lib/acts_as_ordered_tree/instance_methods.rb +3 -3
- data/lib/acts_as_ordered_tree/relation/base.rb +3 -1
- data/lib/acts_as_ordered_tree/tenacious_transaction.rb +1 -1
- data/lib/acts_as_ordered_tree/version.rb +1 -1
- data/spec/acts_as_ordered_tree_spec.rb +18 -10
- data/spec/db/config.travis.yml +13 -0
- data/spec/db/config.yml +0 -3
- data/spec/spec_helper.rb +3 -1
- metadata +49 -69
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 02d7e5c8d5d4f188a28d709689a5b549c34893ce
|
4
|
+
data.tar.gz: 687a430993d957a16afc33398cf8c18d0068b231
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d3694d0b00dc899e89c91e0d240b7b1cc525f5417236b2a01d4562142589e1e45f7d14311779225a250bd292c6a1f9cb8cb9e7a285a0e5d4359aef71fd8e5771
|
7
|
+
data.tar.gz: 9a5b0b6614b3119962b7e49fc60582d5f912e681f23ddfa3cb1b9ad6061b85ff3c1369fcb0f41db32addce28b7d2011b2c91a1cea3ecc6cfccf7be075cded612
|
data/lib/acts_as_ordered_tree.rb
CHANGED
@@ -5,6 +5,12 @@ require "acts_as_ordered_tree/instance_methods"
|
|
5
5
|
require "acts_as_ordered_tree/validators"
|
6
6
|
|
7
7
|
module ActsAsOrderedTree
|
8
|
+
PROTECTED_ATTRIBUTES_SUPPORTED = ActiveRecord::VERSION::STRING < '4.0.0' ||
|
9
|
+
defined?(ProtectedAttributes)
|
10
|
+
|
11
|
+
# can we use has_many :children, :order => :position
|
12
|
+
PLAIN_ORDER_OPTION_SUPPORTED = ActiveRecord::VERSION::STRING < '4.0.0'
|
13
|
+
|
8
14
|
# == Usage
|
9
15
|
# class Category < ActiveRecord::Base
|
10
16
|
# acts_as_ordered_tree :parent_column => :parent_id,
|
@@ -31,7 +37,6 @@ module ActsAsOrderedTree
|
|
31
37
|
has_many_children_options = {
|
32
38
|
:class_name => "::#{base_class.name}",
|
33
39
|
:foreign_key => options[:parent_column],
|
34
|
-
:order => options[:position_column],
|
35
40
|
:inverse_of => (:parent unless options[:polymorphic]),
|
36
41
|
:dependent => :destroy
|
37
42
|
}
|
@@ -40,15 +45,34 @@ module ActsAsOrderedTree
|
|
40
45
|
has_many_children_options[callback] = options[callback] if options.key?(callback)
|
41
46
|
end
|
42
47
|
|
43
|
-
if
|
44
|
-
has_many_children_options[:
|
45
|
-
|
46
|
-
|
48
|
+
if PLAIN_ORDER_OPTION_SUPPORTED
|
49
|
+
has_many_children_options[:order] = options[:position_column]
|
50
|
+
|
51
|
+
if scope_column_names.any?
|
52
|
+
has_many_children_options[:conditions] = proc do
|
53
|
+
[scope_column_names.map { |c| "#{c} = ?" }.join(' AND '),
|
54
|
+
scope_column_names.map { |c| self[c] }]
|
55
|
+
end
|
47
56
|
end
|
57
|
+
|
58
|
+
has_many :children, has_many_children_options
|
59
|
+
else
|
60
|
+
scope = ->(parent) {
|
61
|
+
relation = order(options[:position_column])
|
62
|
+
|
63
|
+
if scope_column_names.any?
|
64
|
+
relation = relation.where(
|
65
|
+
Hash[scope_column_names.map { |c| [c, parent[c]]}]
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
relation
|
70
|
+
}
|
71
|
+
|
72
|
+
has_many :children, scope, has_many_children_options
|
48
73
|
end
|
49
74
|
|
50
|
-
# create
|
51
|
-
has_many :children, has_many_children_options
|
75
|
+
# create parent association
|
52
76
|
belongs_to :parent,
|
53
77
|
:class_name => "::#{base_class.name}",
|
54
78
|
:foreign_key => options[:parent_column],
|
@@ -67,7 +91,7 @@ module ActsAsOrderedTree
|
|
67
91
|
extend ActiveSupport::Concern
|
68
92
|
|
69
93
|
included do
|
70
|
-
attr_protected depth_column, position_column
|
94
|
+
attr_protected depth_column, position_column if PROTECTED_ATTRIBUTES_SUPPORTED
|
71
95
|
end
|
72
96
|
|
73
97
|
def parent_column
|
@@ -5,11 +5,11 @@ module ActsAsOrderedTree
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
included do
|
8
|
-
scope :preorder, order(arel_table[position_column].asc)
|
9
|
-
scope :roots, where(arel_table[parent_column].eq(nil)).preorder
|
8
|
+
scope :preorder, -> { order(arel_table[position_column].asc) }
|
9
|
+
scope :roots, -> { where(arel_table[parent_column].eq(nil)).preorder }
|
10
10
|
|
11
11
|
# add +leaves+ scope only if counter_cache column present
|
12
|
-
scope :leaves, where(arel_table[children_counter_cache_column].eq(0)) if
|
12
|
+
scope :leaves, -> { where(arel_table[children_counter_cache_column].eq(0)) } if
|
13
13
|
children_counter_cache?
|
14
14
|
|
15
15
|
# when default value for counter_cache is absent we should set it manually
|
@@ -288,7 +288,7 @@ module ActsAsOrderedTree
|
|
288
288
|
target.send(:reload_node)
|
289
289
|
elsif pos != :root && target
|
290
290
|
# load object if node is not an object
|
291
|
-
target = self.class.find(target
|
291
|
+
target = self.class.lock(true).find(target)
|
292
292
|
elsif pos == :root
|
293
293
|
# Obtain lock on all root nodes
|
294
294
|
ordered_tree_scope.
|
@@ -308,7 +308,7 @@ module ActsAsOrderedTree
|
|
308
308
|
# nothing changed - quit
|
309
309
|
return if parent_id == parent_id_was && position == position_was
|
310
310
|
|
311
|
-
self.class.find(self
|
311
|
+
self.class.lock(true).find(self)
|
312
312
|
self[position_column], self[parent_column] = position, parent_id
|
313
313
|
|
314
314
|
move_kind = case
|
@@ -484,7 +484,7 @@ module ActsAsOrderedTree
|
|
484
484
|
|
485
485
|
def ordered_tree_scope #:nodoc:
|
486
486
|
if scope_column_names.empty?
|
487
|
-
self.class.base_class
|
487
|
+
self.class.base_class
|
488
488
|
else
|
489
489
|
self.class.base_class.where Hash[scope_column_names.map { |column| [column, self[column]] }]
|
490
490
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
module ActsAsOrderedTree
|
2
2
|
module Relation
|
3
3
|
class Base < ActiveRecord::Relation
|
4
|
+
EMPTY_SCOPE_METHOD = ActiveRecord::VERSION::STRING < '4.0.0' ? :scoped : :all
|
5
|
+
|
4
6
|
# Create from existing +relation+ or from +class+ and +table+
|
5
7
|
def initialize(class_or_relation, table = nil)
|
6
8
|
relation = class_or_relation
|
7
9
|
|
8
10
|
if class_or_relation.is_a?(Class)
|
9
|
-
relation = class_or_relation.
|
11
|
+
relation = class_or_relation.send(EMPTY_SCOPE_METHOD)
|
10
12
|
table ||= class_or_relation.arel_table
|
11
13
|
|
12
14
|
super(class_or_relation, table)
|
@@ -12,7 +12,7 @@ module ActsAsOrderedTree
|
|
12
12
|
begin
|
13
13
|
transaction(&block)
|
14
14
|
rescue ActiveRecord::StatementInvalid => error
|
15
|
-
raise unless connection.open_transactions.zero?
|
15
|
+
raise unless self.class.connection.open_transactions.zero?
|
16
16
|
raise unless error.message =~ DEADLOCK_MESSAGES
|
17
17
|
raise unless retry_count < RETRY_COUNT
|
18
18
|
retry_count += 1
|
@@ -9,11 +9,13 @@ describe ActsAsOrderedTree, :transactional do
|
|
9
9
|
its(:depth_column) { should eq :depth }
|
10
10
|
its(:children_counter_cache_column) { be_nil }
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
if ActsAsOrderedTree::PROTECTED_ATTRIBUTES_SUPPORTED
|
13
|
+
context "instance" do
|
14
|
+
subject { Default.new }
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
it { should_not allow_mass_assignment_of(:position) }
|
17
|
+
it { should_not allow_mass_assignment_of(:depth) }
|
18
|
+
end
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -30,11 +32,13 @@ describe ActsAsOrderedTree, :transactional do
|
|
30
32
|
its(:position_column) { should eq :red }
|
31
33
|
its(:depth_column) { should eq :pitch }
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
+
if ActsAsOrderedTree::PROTECTED_ATTRIBUTES_SUPPORTED
|
36
|
+
context "instance" do
|
37
|
+
subject { RenamedColumns.new }
|
35
38
|
|
36
|
-
|
37
|
-
|
39
|
+
it { should_not allow_mass_assignment_of(:red) }
|
40
|
+
it { should_not allow_mass_assignment_of(:pitch) }
|
41
|
+
end
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
@@ -422,7 +426,11 @@ describe ActsAsOrderedTree, :transactional do
|
|
422
426
|
|
423
427
|
subject { node.send :reload_node }
|
424
428
|
|
425
|
-
|
429
|
+
if ActiveRecord::VERSION::STRING >= '4.0.0'
|
430
|
+
xit 'ActiveRecord::Persistence#reload method ignores :select option since rails-4.0.0'
|
431
|
+
else
|
432
|
+
its(:name) { should eq 'changed' }
|
433
|
+
end
|
426
434
|
its(:parent_id) { should be_nil }
|
427
435
|
its(:position) { should eq 1 }
|
428
436
|
end
|
@@ -802,7 +810,7 @@ describe ActsAsOrderedTree, :transactional do
|
|
802
810
|
let!(:child1) { create :scoped, :parent => root1 }
|
803
811
|
let!(:orphan) do
|
804
812
|
record = create :scoped, :parent => root1
|
805
|
-
record.class.update_all(
|
813
|
+
record.class.where(:id => record.id).update_all(:scope_type => "t0", :position => 1)
|
806
814
|
record
|
807
815
|
end
|
808
816
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
pg:
|
2
|
+
adapter: postgresql
|
3
|
+
username: postgres
|
4
|
+
database: acts_as_ordered_tree_test
|
5
|
+
min_messages: ERROR
|
6
|
+
mysql:
|
7
|
+
adapter: mysql2
|
8
|
+
database: acts_as_ordered_tree_test
|
9
|
+
username: travis
|
10
|
+
encoding: utf8
|
11
|
+
sqlite3:
|
12
|
+
adapter: sqlite3
|
13
|
+
database: acts_as_ordered_tree.sqlite3.db
|
data/spec/db/config.yml
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -20,7 +20,9 @@ require "acts_as_ordered_tree"
|
|
20
20
|
require "logger"
|
21
21
|
require "yaml"
|
22
22
|
|
23
|
-
|
23
|
+
config_file = ENV['DBCONF'] || 'config.yml'
|
24
|
+
|
25
|
+
ActiveRecord::Base.configurations = YAML::load(IO.read(File.join(test_dir, 'db', config_file)))
|
24
26
|
ActiveRecord::Base.establish_connection(ENV['DB'] || "pg")
|
25
27
|
ActiveRecord::Base.logger = Logger.new(ENV['DEBUG'] ? $stderr : '/dev/null')
|
26
28
|
ActiveRecord::Migration.verbose = false
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_ordered_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 1.1.7
|
4
|
+
version: 1.1.8
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Alexei Mikhailov
|
@@ -10,120 +9,106 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-
|
12
|
+
date: 2013-12-01 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
|
-
|
15
|
+
name: activerecord
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - '>='
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 3.0.0
|
21
|
-
none: false
|
22
|
-
prerelease: false
|
23
|
-
name: activerecord
|
24
21
|
type: :runtime
|
25
|
-
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
24
|
requirements:
|
27
|
-
- -
|
25
|
+
- - '>='
|
28
26
|
- !ruby/object:Gem::Version
|
29
27
|
version: 3.0.0
|
30
|
-
none: false
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
|
-
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
33
31
|
requirements:
|
34
|
-
- -
|
32
|
+
- - '>='
|
35
33
|
- !ruby/object:Gem::Version
|
36
34
|
version: 0.9.2
|
37
|
-
none: false
|
38
|
-
prerelease: false
|
39
|
-
name: rake
|
40
35
|
type: :development
|
41
|
-
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
38
|
requirements:
|
43
|
-
- -
|
39
|
+
- - '>='
|
44
40
|
- !ruby/object:Gem::Version
|
45
41
|
version: 0.9.2
|
46
|
-
none: false
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
|
-
|
43
|
+
name: bundler
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
49
45
|
requirements:
|
50
|
-
- -
|
46
|
+
- - '>='
|
51
47
|
- !ruby/object:Gem::Version
|
52
48
|
version: '1.0'
|
53
|
-
none: false
|
54
|
-
prerelease: false
|
55
|
-
name: bundler
|
56
49
|
type: :development
|
57
|
-
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
52
|
requirements:
|
59
|
-
- -
|
53
|
+
- - '>='
|
60
54
|
- !ruby/object:Gem::Version
|
61
55
|
version: '1.0'
|
62
|
-
none: false
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
|
-
|
57
|
+
name: rspec
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
65
59
|
requirements:
|
66
|
-
- -
|
60
|
+
- - '>='
|
67
61
|
- !ruby/object:Gem::Version
|
68
62
|
version: '2.11'
|
69
|
-
none: false
|
70
|
-
prerelease: false
|
71
|
-
name: rspec
|
72
63
|
type: :development
|
73
|
-
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
66
|
requirements:
|
75
|
-
- -
|
67
|
+
- - '>='
|
76
68
|
- !ruby/object:Gem::Version
|
77
69
|
version: '2.11'
|
78
|
-
none: false
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
|
-
|
71
|
+
name: shoulda-matchers
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
81
73
|
requirements:
|
82
|
-
- -
|
74
|
+
- - '>='
|
83
75
|
- !ruby/object:Gem::Version
|
84
76
|
version: 1.2.0
|
85
|
-
none: false
|
86
|
-
prerelease: false
|
87
|
-
name: shoulda-matchers
|
88
77
|
type: :development
|
89
|
-
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
80
|
requirements:
|
91
|
-
- -
|
81
|
+
- - '>='
|
92
82
|
- !ruby/object:Gem::Version
|
93
83
|
version: 1.2.0
|
94
|
-
none: false
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
|
-
|
85
|
+
name: factory_girl
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
97
87
|
requirements:
|
98
88
|
- - <
|
99
89
|
- !ruby/object:Gem::Version
|
100
90
|
version: '3'
|
101
|
-
none: false
|
102
|
-
prerelease: false
|
103
|
-
name: factory_girl
|
104
91
|
type: :development
|
105
|
-
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
94
|
requirements:
|
107
95
|
- - <
|
108
96
|
- !ruby/object:Gem::Version
|
109
97
|
version: '3'
|
110
|
-
none: false
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
|
-
|
99
|
+
name: appraisal
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
113
101
|
requirements:
|
114
|
-
- -
|
102
|
+
- - '>='
|
115
103
|
- !ruby/object:Gem::Version
|
116
104
|
version: 0.4.0
|
117
|
-
none: false
|
118
|
-
prerelease: false
|
119
|
-
name: appraisal
|
120
105
|
type: :development
|
121
|
-
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
108
|
requirements:
|
123
|
-
- -
|
109
|
+
- - '>='
|
124
110
|
- !ruby/object:Gem::Version
|
125
111
|
version: 0.4.0
|
126
|
-
none: false
|
127
112
|
description:
|
128
113
|
email:
|
129
114
|
- amikhailov83@gmail.com
|
@@ -144,6 +129,7 @@ files:
|
|
144
129
|
- lib/acts_as_ordered_tree/version.rb
|
145
130
|
- spec/acts_as_ordered_tree_spec.rb
|
146
131
|
- spec/concurrency_support_spec.rb
|
132
|
+
- spec/db/config.travis.yml
|
147
133
|
- spec/db/config.yml
|
148
134
|
- spec/db/schema.rb
|
149
135
|
- spec/spec_helper.rb
|
@@ -152,37 +138,31 @@ files:
|
|
152
138
|
- spec/support/models.rb
|
153
139
|
homepage: https://github.com/take-five/acts_as_ordered_tree
|
154
140
|
licenses: []
|
141
|
+
metadata: {}
|
155
142
|
post_install_message:
|
156
143
|
rdoc_options: []
|
157
144
|
require_paths:
|
158
145
|
- lib
|
159
146
|
required_ruby_version: !ruby/object:Gem::Requirement
|
160
147
|
requirements:
|
161
|
-
- -
|
148
|
+
- - '>='
|
162
149
|
- !ruby/object:Gem::Version
|
163
|
-
segments:
|
164
|
-
- 0
|
165
|
-
hash: -154648787
|
166
150
|
version: '0'
|
167
|
-
none: false
|
168
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
152
|
requirements:
|
170
|
-
- -
|
153
|
+
- - '>='
|
171
154
|
- !ruby/object:Gem::Version
|
172
|
-
segments:
|
173
|
-
- 0
|
174
|
-
hash: -154648787
|
175
155
|
version: '0'
|
176
|
-
none: false
|
177
156
|
requirements: []
|
178
157
|
rubyforge_project: acts_as_ordered_tree
|
179
|
-
rubygems_version: 1.
|
158
|
+
rubygems_version: 2.1.11
|
180
159
|
signing_key:
|
181
|
-
specification_version:
|
160
|
+
specification_version: 4
|
182
161
|
summary: ActiveRecord extension for sorted adjacency lists support
|
183
162
|
test_files:
|
184
163
|
- spec/acts_as_ordered_tree_spec.rb
|
185
164
|
- spec/concurrency_support_spec.rb
|
165
|
+
- spec/db/config.travis.yml
|
186
166
|
- spec/db/config.yml
|
187
167
|
- spec/db/schema.rb
|
188
168
|
- spec/spec_helper.rb
|