nested_set 1.6.7 → 1.6.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.
- data/Gemfile +1 -1
- data/Gemfile.lock +2 -2
- data/README.md +5 -4
- data/VERSION +1 -1
- data/lib/nested_set/base.rb +25 -15
- data/nested_set.gemspec +5 -5
- data/test/fixtures/category.rb +10 -0
- data/test/nested_set/helper_test.rb +1 -1
- data/test/nested_set_test.rb +11 -0
- metadata +61 -67
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -52,7 +52,7 @@ GEM
|
|
52
52
|
rake (>= 0.8.7)
|
53
53
|
thor (~> 0.14.4)
|
54
54
|
rake (0.8.7)
|
55
|
-
sqlite3
|
55
|
+
sqlite3 (1.3.4)
|
56
56
|
thor (0.14.6)
|
57
57
|
tzinfo (0.3.23)
|
58
58
|
|
@@ -65,4 +65,4 @@ DEPENDENCIES
|
|
65
65
|
bench_press (>= 0.3.1)
|
66
66
|
jeweler
|
67
67
|
railties (>= 3.0.0)
|
68
|
-
sqlite3
|
68
|
+
sqlite3
|
data/README.md
CHANGED
@@ -92,10 +92,11 @@ Benchmark tests
|
|
92
92
|
|
93
93
|
You can learn more about nested sets at:
|
94
94
|
|
95
|
-
[1](http://
|
96
|
-
[2](http://
|
97
|
-
[3](http://
|
98
|
-
[4](http://
|
95
|
+
[1](http://en.wikipedia.org/wiki/Nested_set_model)
|
96
|
+
[2](http://www.ibase.ru/devinfo/DBMSTrees/9603d06.html)
|
97
|
+
[3](http://threebit.net/tutorials/nestedset/tutorial1.html)
|
98
|
+
[4](http://rdoc.info/github/rails/acts_as_nested_set/master/ActiveRecord/Acts/NestedSet/ClassMethods)
|
99
|
+
[5](http://agilewebdevelopment.com/plugins/betternestedset)
|
99
100
|
|
100
101
|
## How to contribute
|
101
102
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.8
|
data/lib/nested_set/base.rb
CHANGED
@@ -222,7 +222,7 @@ module CollectiveIdea #:nodoc:
|
|
222
222
|
nodes_for_rebuild(node, node_scope).each{ |n| set_left_and_rights.call(n) }
|
223
223
|
# set right
|
224
224
|
node[right_column_name] = indices[node_scope] += 1
|
225
|
-
node.save
|
225
|
+
node.save(:validate => false)
|
226
226
|
end
|
227
227
|
|
228
228
|
# Find root node(s)
|
@@ -478,6 +478,11 @@ module CollectiveIdea #:nodoc:
|
|
478
478
|
siblings.where("#{q_left} > ?", left).first
|
479
479
|
end
|
480
480
|
|
481
|
+
# Lock rows whose lfts and rgts are to be updated
|
482
|
+
def lock_check(cond=nil)
|
483
|
+
nested_set_scope.select(primary_key_column_name).where(cond).lock
|
484
|
+
end
|
485
|
+
|
481
486
|
# Shorthand method for finding the left sibling and moving to the left of it.
|
482
487
|
def move_left
|
483
488
|
move_to_left_of left_sibling
|
@@ -576,16 +581,19 @@ module CollectiveIdea #:nodoc:
|
|
576
581
|
# back to the left so the counts still work.
|
577
582
|
def destroy_descendants
|
578
583
|
return if right.nil? || left.nil? || skip_before_destroy
|
579
|
-
reload_nested_set
|
580
|
-
|
581
584
|
self.class.base_class.transaction do
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
585
|
+
lock_check(["#{quoted_right_column_name} > ?", right])
|
586
|
+
reload_nested_set
|
587
|
+
case destroy_method
|
588
|
+
when :delete_all then
|
589
|
+
nested_set_scope.delete_all(["#{q_left} > ? AND #{q_right} < ?", left, right])
|
590
|
+
|
591
|
+
else
|
592
|
+
descendants.each do |model|
|
593
|
+
model.skip_before_destroy = true
|
594
|
+
model.respond_to?(destroy_method) ? model.send(destroy_method) : raise(NoMethodError, "#{model} does not have a method #{destroy_method}")
|
595
|
+
end
|
596
|
+
|
589
597
|
end
|
590
598
|
|
591
599
|
# update lefts and rights for remaining nodes
|
@@ -604,6 +612,11 @@ module CollectiveIdea #:nodoc:
|
|
604
612
|
end
|
605
613
|
end
|
606
614
|
|
615
|
+
# just a shortcut
|
616
|
+
def destroy_method
|
617
|
+
acts_as_nested_set_options[:dependent]
|
618
|
+
end
|
619
|
+
|
607
620
|
# reload left, right, and parent
|
608
621
|
def reload_nested_set
|
609
622
|
reload(:select => "#{quoted_left_column_name}, " +
|
@@ -650,11 +663,8 @@ module CollectiveIdea #:nodoc:
|
|
650
663
|
a, b, c, d = [self[left_column_name], self[right_column_name], bound, other_bound].sort
|
651
664
|
|
652
665
|
# select the rows in the model between a and d, and apply a lock
|
653
|
-
|
654
|
-
|
655
|
-
:conditions => ["#{quoted_left_column_name} >= :a and #{quoted_right_column_name} <= :d", {:a => a, :d => d}],
|
656
|
-
:lock => true
|
657
|
-
)
|
666
|
+
cond = ["#{quoted_left_column_name} >= :a and #{quoted_right_column_name} <= :d", { :a => a, :d => d }]
|
667
|
+
lock_check(cond)
|
658
668
|
|
659
669
|
new_parent = case position
|
660
670
|
when :child; target.id
|
data/nested_set.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{nested_set}
|
8
|
-
s.version = "1.6.
|
8
|
+
s.version = "1.6.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Brandon Keepers", "Daniel Morrison"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-08-31}
|
13
13
|
s.description = %q{An awesome nested set implementation for Active Record}
|
14
14
|
s.email = %q{info@collectiveidea.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -62,14 +62,14 @@ Gem::Specification.new do |s|
|
|
62
62
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
63
63
|
s.add_runtime_dependency(%q<railties>, [">= 3.0.0"])
|
64
64
|
s.add_runtime_dependency(%q<activerecord>, [">= 3.0.0"])
|
65
|
-
s.add_development_dependency(%q<sqlite3
|
65
|
+
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
66
66
|
s.add_development_dependency(%q<actionpack>, [">= 3.0.0"])
|
67
67
|
s.add_development_dependency(%q<bench_press>, [">= 0.3.1"])
|
68
68
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
69
69
|
else
|
70
70
|
s.add_dependency(%q<railties>, [">= 3.0.0"])
|
71
71
|
s.add_dependency(%q<activerecord>, [">= 3.0.0"])
|
72
|
-
s.add_dependency(%q<sqlite3
|
72
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
73
73
|
s.add_dependency(%q<actionpack>, [">= 3.0.0"])
|
74
74
|
s.add_dependency(%q<bench_press>, [">= 0.3.1"])
|
75
75
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
@@ -77,7 +77,7 @@ Gem::Specification.new do |s|
|
|
77
77
|
else
|
78
78
|
s.add_dependency(%q<railties>, [">= 3.0.0"])
|
79
79
|
s.add_dependency(%q<activerecord>, [">= 3.0.0"])
|
80
|
-
s.add_dependency(%q<sqlite3
|
80
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
81
81
|
s.add_dependency(%q<actionpack>, [">= 3.0.0"])
|
82
82
|
s.add_dependency(%q<bench_press>, [">= 0.3.1"])
|
83
83
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
data/test/fixtures/category.rb
CHANGED
@@ -24,3 +24,13 @@ end
|
|
24
24
|
class Category_DefaultScope < Category
|
25
25
|
default_scope order('categories.id ASC')
|
26
26
|
end
|
27
|
+
|
28
|
+
class Category_WithCustomDestroy < ActiveRecord::Base
|
29
|
+
set_table_name 'categories'
|
30
|
+
acts_as_nested_set
|
31
|
+
|
32
|
+
private :destroy
|
33
|
+
def custom_destroy
|
34
|
+
destroy
|
35
|
+
end
|
36
|
+
end
|
@@ -118,7 +118,7 @@ class HelperTest < ActionView::TestCase
|
|
118
118
|
['Child 2', 3],
|
119
119
|
['Child 2.1', 4]
|
120
120
|
]
|
121
|
-
actual = nested_set_options Category_NoToArray.find(3) do |c|
|
121
|
+
actual = nested_set_options Category_NoToArray.find(3) do |c, l|
|
122
122
|
c.name
|
123
123
|
end
|
124
124
|
assert_equal expected, actual
|
data/test/nested_set_test.rb
CHANGED
@@ -684,6 +684,17 @@ class NestedSetTest < ActiveSupport::TestCase
|
|
684
684
|
assert Category.valid?
|
685
685
|
end
|
686
686
|
|
687
|
+
def test_custom_destroy_method_does_not_invalidate
|
688
|
+
Category_WithCustomDestroy.acts_as_nested_set_options[:dependent] = :custom_destroy
|
689
|
+
Category_WithCustomDestroy.find_by_name('Child 2').custom_destroy
|
690
|
+
assert Category_WithCustomDestroy.valid?
|
691
|
+
end
|
692
|
+
|
693
|
+
def test_custom_destroy_raises_an_error_if_method_does_not_exist
|
694
|
+
Category.acts_as_nested_set_options[:dependent] = :custom_destroy
|
695
|
+
assert_raise(NoMethodError) { categories(:child_2).destroy }
|
696
|
+
end
|
697
|
+
|
687
698
|
def test_assigning_parent_id_on_create
|
688
699
|
category = Category.create!(:name => "Child", :parent_id => categories(:child_2).id)
|
689
700
|
assert_equal categories(:child_2), category.parent
|
metadata
CHANGED
@@ -1,94 +1,91 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: nested_set
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.6.8
|
4
5
|
prerelease:
|
5
|
-
version: 1.6.7
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Brandon Keepers
|
9
9
|
- Daniel Morrison
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
date: 2011-06-20 00:00:00 +04:00
|
13
|
+
date: 2011-08-31 00:00:00.000000000 +04:00
|
15
14
|
default_executable:
|
16
|
-
dependencies:
|
17
|
-
- !ruby/object:Gem::Dependency
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
18
17
|
name: railties
|
19
|
-
requirement: &
|
18
|
+
requirement: &27660600 !ruby/object:Gem::Requirement
|
20
19
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
24
23
|
version: 3.0.0
|
25
24
|
type: :runtime
|
26
25
|
prerelease: false
|
27
|
-
version_requirements: *
|
28
|
-
- !ruby/object:Gem::Dependency
|
26
|
+
version_requirements: *27660600
|
27
|
+
- !ruby/object:Gem::Dependency
|
29
28
|
name: activerecord
|
30
|
-
requirement: &
|
29
|
+
requirement: &27660100 !ruby/object:Gem::Requirement
|
31
30
|
none: false
|
32
|
-
requirements:
|
33
|
-
- -
|
34
|
-
- !ruby/object:Gem::Version
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
35
34
|
version: 3.0.0
|
36
35
|
type: :runtime
|
37
36
|
prerelease: false
|
38
|
-
version_requirements: *
|
39
|
-
- !ruby/object:Gem::Dependency
|
40
|
-
name: sqlite3
|
41
|
-
requirement: &
|
37
|
+
version_requirements: *27660100
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: sqlite3
|
40
|
+
requirement: &27659600 !ruby/object:Gem::Requirement
|
42
41
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version:
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
47
46
|
type: :development
|
48
47
|
prerelease: false
|
49
|
-
version_requirements: *
|
50
|
-
- !ruby/object:Gem::Dependency
|
48
|
+
version_requirements: *27659600
|
49
|
+
- !ruby/object:Gem::Dependency
|
51
50
|
name: actionpack
|
52
|
-
requirement: &
|
51
|
+
requirement: &27659120 !ruby/object:Gem::Requirement
|
53
52
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
57
56
|
version: 3.0.0
|
58
57
|
type: :development
|
59
58
|
prerelease: false
|
60
|
-
version_requirements: *
|
61
|
-
- !ruby/object:Gem::Dependency
|
59
|
+
version_requirements: *27659120
|
60
|
+
- !ruby/object:Gem::Dependency
|
62
61
|
name: bench_press
|
63
|
-
requirement: &
|
62
|
+
requirement: &27658640 !ruby/object:Gem::Requirement
|
64
63
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
68
67
|
version: 0.3.1
|
69
68
|
type: :development
|
70
69
|
prerelease: false
|
71
|
-
version_requirements: *
|
72
|
-
- !ruby/object:Gem::Dependency
|
70
|
+
version_requirements: *27658640
|
71
|
+
- !ruby/object:Gem::Dependency
|
73
72
|
name: jeweler
|
74
|
-
requirement: &
|
73
|
+
requirement: &27658160 !ruby/object:Gem::Requirement
|
75
74
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version:
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
80
79
|
type: :development
|
81
80
|
prerelease: false
|
82
|
-
version_requirements: *
|
81
|
+
version_requirements: *27658160
|
83
82
|
description: An awesome nested set implementation for Active Record
|
84
83
|
email: info@collectiveidea.com
|
85
84
|
executables: []
|
86
|
-
|
87
85
|
extensions: []
|
88
|
-
|
89
|
-
extra_rdoc_files:
|
86
|
+
extra_rdoc_files:
|
90
87
|
- README.md
|
91
|
-
files:
|
88
|
+
files:
|
92
89
|
- .autotest
|
93
90
|
- Gemfile
|
94
91
|
- Gemfile.lock
|
@@ -118,35 +115,32 @@ files:
|
|
118
115
|
has_rdoc: true
|
119
116
|
homepage: http://github.com/skyeagle/nested_set
|
120
117
|
licenses: []
|
121
|
-
|
122
118
|
post_install_message:
|
123
119
|
rdoc_options: []
|
124
|
-
|
125
|
-
require_paths:
|
120
|
+
require_paths:
|
126
121
|
- lib
|
127
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
123
|
none: false
|
129
|
-
requirements:
|
130
|
-
- -
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
|
133
|
-
segments:
|
124
|
+
requirements:
|
125
|
+
- - ! '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
segments:
|
134
129
|
- 0
|
135
|
-
|
136
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
hash: -14733230779459134
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
132
|
none: false
|
138
|
-
requirements:
|
139
|
-
- -
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version:
|
133
|
+
requirements:
|
134
|
+
- - ! '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
142
137
|
requirements: []
|
143
|
-
|
144
138
|
rubyforge_project:
|
145
139
|
rubygems_version: 1.6.2
|
146
140
|
signing_key:
|
147
141
|
specification_version: 3
|
148
142
|
summary: An awesome nested set implementation for Active Record
|
149
|
-
test_files:
|
143
|
+
test_files:
|
150
144
|
- test/benchmarks.rb
|
151
145
|
- test/db/schema.rb
|
152
146
|
- test/fixtures/category.rb
|