dm-is-nested_set 1.0.0.rc2 → 1.0.0.rc3
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 -2
- data/LICENSE +1 -1
- data/Rakefile +3 -4
- data/VERSION +1 -1
- data/dm-is-nested_set.gemspec +9 -12
- data/lib/dm-is-nested_set/is/nested_set.rb +35 -34
- data/lib/dm-is-nested_set.rb +0 -1
- data/spec/integration/nested_set_spec.rb +33 -39
- data/spec/rcov.opts +1 -1
- data/tasks/spec.rake +3 -0
- metadata +13 -30
data/Gemfile
CHANGED
@@ -71,7 +71,7 @@
|
|
71
71
|
source 'http://rubygems.org'
|
72
72
|
|
73
73
|
DATAMAPPER = 'git://github.com/datamapper'
|
74
|
-
DM_VERSION = '~> 1.0.0.
|
74
|
+
DM_VERSION = '~> 1.0.0.rc3'
|
75
75
|
|
76
76
|
group :runtime do # Runtime dependencies (as in the gemspec)
|
77
77
|
|
@@ -83,7 +83,6 @@ group :runtime do # Runtime dependencies (as in the gemspec)
|
|
83
83
|
|
84
84
|
gem 'dm-core', DM_VERSION, :git => "#{DATAMAPPER}/dm-core.git"
|
85
85
|
gem 'dm-adjust', DM_VERSION, :git => "#{DATAMAPPER}/dm-adjust.git"
|
86
|
-
gem 'dm-transactions', DM_VERSION, :git => "#{DATAMAPPER}/dm-transactions.git"
|
87
86
|
|
88
87
|
end
|
89
88
|
|
data/LICENSE
CHANGED
data/Rakefile
CHANGED
@@ -10,14 +10,13 @@ begin
|
|
10
10
|
gem.summary = 'DataMapper plugin allowing the creation of nested sets from data models'
|
11
11
|
gem.description = gem.summary
|
12
12
|
gem.email = 'sindre [a] identu [d] no'
|
13
|
-
gem.homepage = 'http://github.com/datamapper
|
13
|
+
gem.homepage = 'http://github.com/datamapper/%s' % gem.name
|
14
14
|
gem.authors = [ 'Sindre Aarsaether' ]
|
15
15
|
|
16
16
|
gem.rubyforge_project = 'datamapper'
|
17
17
|
|
18
|
-
gem.add_dependency 'dm-core',
|
19
|
-
gem.add_dependency 'dm-adjust',
|
20
|
-
gem.add_dependency 'dm-transactions', '~> 1.0.0.rc2'
|
18
|
+
gem.add_dependency 'dm-core', '~> 1.0.0.rc3'
|
19
|
+
gem.add_dependency 'dm-adjust', '~> 1.0.0.rc3'
|
21
20
|
|
22
21
|
gem.add_development_dependency 'rspec', '~> 1.3'
|
23
22
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.
|
1
|
+
1.0.0.rc3
|
data/dm-is-nested_set.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dm-is-nested_set}
|
8
|
-
s.version = "1.0.0.
|
8
|
+
s.version = "1.0.0.rc3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Sindre Aarsaether"]
|
12
|
-
s.date = %q{2010-05-
|
12
|
+
s.date = %q{2010-05-27}
|
13
13
|
s.description = %q{DataMapper plugin allowing the creation of nested sets from data models}
|
14
14
|
s.email = %q{sindre [a] identu [d] no}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
|
|
37
37
|
"tasks/yard.rake",
|
38
38
|
"tasks/yardstick.rake"
|
39
39
|
]
|
40
|
-
s.homepage = %q{http://github.com/datamapper/dm-
|
40
|
+
s.homepage = %q{http://github.com/datamapper/dm-is-nested_set}
|
41
41
|
s.rdoc_options = ["--charset=UTF-8"]
|
42
42
|
s.require_paths = ["lib"]
|
43
43
|
s.rubyforge_project = %q{datamapper}
|
@@ -53,20 +53,17 @@ Gem::Specification.new do |s|
|
|
53
53
|
s.specification_version = 3
|
54
54
|
|
55
55
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
56
|
-
s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.0.
|
57
|
-
s.add_runtime_dependency(%q<dm-adjust>, ["~> 1.0.0.
|
58
|
-
s.add_runtime_dependency(%q<dm-transactions>, ["~> 1.0.0.rc2"])
|
56
|
+
s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.0.rc3"])
|
57
|
+
s.add_runtime_dependency(%q<dm-adjust>, ["~> 1.0.0.rc3"])
|
59
58
|
s.add_development_dependency(%q<rspec>, ["~> 1.3"])
|
60
59
|
else
|
61
|
-
s.add_dependency(%q<dm-core>, ["~> 1.0.0.
|
62
|
-
s.add_dependency(%q<dm-adjust>, ["~> 1.0.0.
|
63
|
-
s.add_dependency(%q<dm-transactions>, ["~> 1.0.0.rc2"])
|
60
|
+
s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc3"])
|
61
|
+
s.add_dependency(%q<dm-adjust>, ["~> 1.0.0.rc3"])
|
64
62
|
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
65
63
|
end
|
66
64
|
else
|
67
|
-
s.add_dependency(%q<dm-core>, ["~> 1.0.0.
|
68
|
-
s.add_dependency(%q<dm-adjust>, ["~> 1.0.0.
|
69
|
-
s.add_dependency(%q<dm-transactions>, ["~> 1.0.0.rc2"])
|
65
|
+
s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc3"])
|
66
|
+
s.add_dependency(%q<dm-adjust>, ["~> 1.0.0.rc3"])
|
70
67
|
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
71
68
|
end
|
72
69
|
end
|
@@ -203,46 +203,44 @@ module DataMapper
|
|
203
203
|
return false
|
204
204
|
end
|
205
205
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
#
|
212
|
-
if lft && rgt
|
213
|
-
|
214
|
-
|
215
|
-
# find out how wide this node is, as we need to make a gap large enough for it to fit in
|
216
|
-
gap = rgt - lft + 1
|
206
|
+
##
|
207
|
+
# if this node is already positioned we need to move it, and close the gap it leaves behind etc
|
208
|
+
# otherwise we only need to open a gap in the set, and smash that buggar in
|
209
|
+
#
|
210
|
+
if lft && rgt
|
211
|
+
# raise exception if node is trying to move into one of its descendants (infinite loop, spacetime will warp)
|
212
|
+
raise RecursiveNestingError if position > lft && position < rgt
|
213
|
+
# find out how wide this node is, as we need to make a gap large enough for it to fit in
|
214
|
+
gap = rgt - lft + 1
|
217
215
|
|
218
|
-
|
219
|
-
|
216
|
+
# make a gap at position, that is as wide as this node
|
217
|
+
model.base_model.adjust_gap!(nested_set, position - 1, gap)
|
220
218
|
|
221
|
-
|
219
|
+
eager_props = model.properties.values_at(:lft, :rgt)
|
222
220
|
|
223
|
-
|
224
|
-
|
225
|
-
|
221
|
+
# FIXME don't use @api private
|
222
|
+
# offset this node (and all its descendants) to the right position
|
223
|
+
eager_load(eager_props)
|
226
224
|
|
227
|
-
|
228
|
-
|
225
|
+
old_position = lft
|
226
|
+
offset = position - old_position
|
229
227
|
|
230
|
-
|
228
|
+
nested_set.all(:rgt => lft..rgt).adjust!({ :lft => offset, :rgt => offset }, true)
|
231
229
|
|
232
|
-
|
233
|
-
|
230
|
+
# close the gap this movement left behind.
|
231
|
+
model.base_model.adjust_gap!(nested_set, old_position, -gap)
|
234
232
|
|
235
|
-
|
236
|
-
|
233
|
+
# FIXME don't use @api private
|
234
|
+
eager_load(eager_props)
|
237
235
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
end
|
244
|
-
self.parent = ancestor
|
236
|
+
else
|
237
|
+
# make a gap where the new node can be inserted
|
238
|
+
model.base_model.adjust_gap!(nested_set, position - 1, 2)
|
239
|
+
# set the position fields
|
240
|
+
self.lft, self.rgt = position, position + 1
|
245
241
|
end
|
242
|
+
|
243
|
+
self.parent = ancestor
|
246
244
|
end
|
247
245
|
|
248
246
|
##
|
@@ -371,10 +369,13 @@ module DataMapper
|
|
371
369
|
self_and_siblings.detect { |v| v.lft == rgt + 1 }
|
372
370
|
end
|
373
371
|
|
374
|
-
|
372
|
+
private
|
373
|
+
|
375
374
|
def detach
|
376
|
-
|
377
|
-
|
375
|
+
unless lft.nil? || rgt.nil?
|
376
|
+
offset = lft - rgt - 1
|
377
|
+
model.base_model.adjust_gap!(nested_set, rgt, offset)
|
378
|
+
end
|
378
379
|
self.lft, self.rgt = nil, nil
|
379
380
|
end
|
380
381
|
|
data/lib/dm-is-nested_set.rb
CHANGED
@@ -25,8 +25,7 @@ require 'spec_helper'
|
|
25
25
|
# |____________________________________________________________________________________________________|
|
26
26
|
|
27
27
|
describe DataMapper::Is::NestedSet do
|
28
|
-
before do
|
29
|
-
Object.send(:remove_const, :User) if defined?(User)
|
28
|
+
before :all do
|
30
29
|
class ::User
|
31
30
|
include DataMapper::Resource
|
32
31
|
|
@@ -36,48 +35,43 @@ describe DataMapper::Is::NestedSet do
|
|
36
35
|
has n, :categories
|
37
36
|
end
|
38
37
|
|
39
|
-
Object.send(:remove_const, :Category) if defined?(Category)
|
40
38
|
class ::Category
|
41
39
|
include DataMapper::Resource
|
42
40
|
|
43
|
-
property :id,
|
44
|
-
property :name,
|
45
|
-
property :
|
41
|
+
property :id, Serial
|
42
|
+
property :name, String
|
43
|
+
property :type, Discriminator
|
46
44
|
|
47
45
|
belongs_to :user
|
48
46
|
|
49
|
-
is :nested_set, :scope => [:user_id]
|
47
|
+
is :nested_set, :scope => [ :user_id ]
|
50
48
|
|
51
49
|
def pos; [lft,rgt] end # convenience method only for speccing.
|
52
50
|
end
|
53
|
-
|
54
|
-
Object.send(:remove_const, :CustomCategory) if defined?(CustomCategory)
|
55
|
-
class ::CustomCategory < Category; end
|
56
|
-
|
57
|
-
DataMapper.auto_migrate!
|
58
|
-
|
59
|
-
DataMapper.repository do
|
60
|
-
@user = User.create(:name => 'paul')
|
61
|
-
@other = User.create(:name => 'john')
|
62
|
-
|
63
|
-
electronics = @user.categories.create( :name => 'Electronics')
|
64
|
-
televisions = @user.categories.create(:parent => electronics, :name => 'Televisions')
|
65
|
-
tube = @user.categories.create(:parent => televisions, :name => 'Tube')
|
66
|
-
lcd = @user.categories.create(:parent => televisions, :name => 'LCD')
|
67
|
-
plasma = @user.categories.create(:parent => televisions, :name => 'Plasma')
|
68
|
-
portable_electronics = @user.categories.create(:parent => electronics, :name => 'Portable Electronics')
|
69
|
-
mp3_players = @user.categories.create(:parent => portable_electronics, :name => 'MP3 Players')
|
70
|
-
flash = @user.categories.create(:parent => mp3_players, :name => 'Flash')
|
71
|
-
cd_players = @user.categories.create(:parent => portable_electronics, :name => 'CD Players')
|
72
|
-
two_way_radios = @user.categories.create(:parent => portable_electronics, :name => '2 Way Radios')
|
73
|
-
end
|
74
51
|
end
|
75
52
|
|
76
53
|
supported_by :sqlite, :mysql, :postgres do
|
54
|
+
before do
|
55
|
+
DataMapper.repository do
|
56
|
+
@user = User.create(:name => 'paul')
|
57
|
+
@other = User.create(:name => 'john')
|
58
|
+
|
59
|
+
electronics = @user.categories.create( :name => 'Electronics')
|
60
|
+
televisions = @user.categories.create(:parent => electronics, :name => 'Televisions')
|
61
|
+
tube = @user.categories.create(:parent => televisions, :name => 'Tube')
|
62
|
+
lcd = @user.categories.create(:parent => televisions, :name => 'LCD')
|
63
|
+
plasma = @user.categories.create(:parent => televisions, :name => 'Plasma')
|
64
|
+
portable_electronics = @user.categories.create(:parent => electronics, :name => 'Portable Electronics')
|
65
|
+
mp3_players = @user.categories.create(:parent => portable_electronics, :name => 'MP3 Players')
|
66
|
+
flash = @user.categories.create(:parent => mp3_players, :name => 'Flash')
|
67
|
+
cd_players = @user.categories.create(:parent => portable_electronics, :name => 'CD Players')
|
68
|
+
two_way_radios = @user.categories.create(:parent => portable_electronics, :name => '2 Way Radios')
|
69
|
+
end
|
70
|
+
end
|
77
71
|
|
78
72
|
describe 'Class#rebuild_tree_from_set' do
|
79
73
|
it 'should reset all parent_ids correctly' do
|
80
|
-
DataMapper.repository
|
74
|
+
DataMapper.repository do
|
81
75
|
plasma = Category.get(5)
|
82
76
|
plasma.parent_id.should == 2
|
83
77
|
plasma.ancestor.id.should == 2
|
@@ -97,7 +91,7 @@ describe DataMapper::Is::NestedSet do
|
|
97
91
|
|
98
92
|
describe 'Class#leaves and #leaves' do
|
99
93
|
it 'should return all nodes without descendants' do
|
100
|
-
DataMapper.repository
|
94
|
+
DataMapper.repository do
|
101
95
|
Category.leaves.length.should == 6
|
102
96
|
|
103
97
|
r = Category.root
|
@@ -109,7 +103,7 @@ describe DataMapper::Is::NestedSet do
|
|
109
103
|
|
110
104
|
describe '#ancestor, #ancestors and #self_and_ancestors' do
|
111
105
|
it 'should return ancestors in an array' do
|
112
|
-
DataMapper.repository
|
106
|
+
DataMapper.repository do
|
113
107
|
c8 = Category.get(8)
|
114
108
|
c8.ancestor.should == Category.get(7)
|
115
109
|
c8.ancestor.should == c8.parent
|
@@ -122,7 +116,7 @@ describe DataMapper::Is::NestedSet do
|
|
122
116
|
|
123
117
|
describe '#children' do
|
124
118
|
it 'should return children of node' do
|
125
|
-
DataMapper.repository
|
119
|
+
DataMapper.repository do
|
126
120
|
r = Category.root
|
127
121
|
r.children.length.should == 2
|
128
122
|
|
@@ -136,7 +130,7 @@ describe DataMapper::Is::NestedSet do
|
|
136
130
|
|
137
131
|
describe '#descendants and #self_and_descendants' do
|
138
132
|
it 'should return all subnodes of node' do
|
139
|
-
DataMapper.repository
|
133
|
+
DataMapper.repository do
|
140
134
|
r = Category.get(1)
|
141
135
|
r.self_and_descendants.length.should == 10
|
142
136
|
r.descendants.length.should == 9
|
@@ -151,7 +145,7 @@ describe DataMapper::Is::NestedSet do
|
|
151
145
|
|
152
146
|
describe '#siblings and #self_and_siblings' do
|
153
147
|
it 'should return all siblings of node' do
|
154
|
-
DataMapper.repository
|
148
|
+
DataMapper.repository do
|
155
149
|
r = Category.root
|
156
150
|
r.self_and_siblings.length.should == 1
|
157
151
|
r.descendants.length.should == 9
|
@@ -180,7 +174,7 @@ describe DataMapper::Is::NestedSet do
|
|
180
174
|
# 10 | 17 | 18 | - 2 Way Radios
|
181
175
|
|
182
176
|
it 'should move items correctly with :higher / :highest / :lower / :lowest' do
|
183
|
-
DataMapper.repository
|
177
|
+
DataMapper.repository do
|
184
178
|
|
185
179
|
Category.get(4).pos.should == [5,6]
|
186
180
|
|
@@ -211,7 +205,7 @@ describe DataMapper::Is::NestedSet do
|
|
211
205
|
end
|
212
206
|
|
213
207
|
it 'should move items correctly with :indent / :outdent' do
|
214
|
-
DataMapper.repository
|
208
|
+
DataMapper.repository do
|
215
209
|
|
216
210
|
mp3_players = Category.get(7)
|
217
211
|
|
@@ -239,7 +233,7 @@ describe DataMapper::Is::NestedSet do
|
|
239
233
|
|
240
234
|
describe 'moving objects with #move_* #and place_node_at' do
|
241
235
|
it 'should set left/right when choosing a parent' do
|
242
|
-
DataMapper.repository
|
236
|
+
DataMapper.repository do
|
243
237
|
Category.auto_migrate!
|
244
238
|
|
245
239
|
c1 = @user.categories.create(:name => 'New Electronics')
|
@@ -292,7 +286,7 @@ describe DataMapper::Is::NestedSet do
|
|
292
286
|
|
293
287
|
describe 'scoping' do
|
294
288
|
it 'should detach from list when changing scope' do
|
295
|
-
DataMapper.repository
|
289
|
+
DataMapper.repository do
|
296
290
|
plasma = Category.get(5)
|
297
291
|
plasma.pos.should == [7,8]
|
298
292
|
plasma.update(:user => @other)
|
@@ -303,7 +297,7 @@ describe DataMapper::Is::NestedSet do
|
|
303
297
|
|
304
298
|
describe 'integrity' do
|
305
299
|
it 'should detach object from list when deleted' do
|
306
|
-
DataMapper.repository
|
300
|
+
DataMapper.repository do
|
307
301
|
lcd = Category.get(4)
|
308
302
|
lcd.pos.should == [5,6]
|
309
303
|
Category.get(3).destroy
|
data/spec/rcov.opts
CHANGED
data/tasks/spec.rake
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-is-nested_set
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 977940572
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
-
|
11
|
-
version: 1.0.0.
|
10
|
+
- rc3
|
11
|
+
version: 1.0.0.rc3
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Sindre Aarsaether
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-05-
|
19
|
+
date: 2010-05-27 00:00:00 -07:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -27,13 +27,13 @@ dependencies:
|
|
27
27
|
requirements:
|
28
28
|
- - ~>
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
hash:
|
30
|
+
hash: 977940572
|
31
31
|
segments:
|
32
32
|
- 1
|
33
33
|
- 0
|
34
34
|
- 0
|
35
|
-
-
|
36
|
-
version: 1.0.0.
|
35
|
+
- rc3
|
36
|
+
version: 1.0.0.rc3
|
37
37
|
type: :runtime
|
38
38
|
version_requirements: *id001
|
39
39
|
- !ruby/object:Gem::Dependency
|
@@ -44,36 +44,19 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
hash:
|
47
|
+
hash: 977940572
|
48
48
|
segments:
|
49
49
|
- 1
|
50
50
|
- 0
|
51
51
|
- 0
|
52
|
-
-
|
53
|
-
version: 1.0.0.
|
52
|
+
- rc3
|
53
|
+
version: 1.0.0.rc3
|
54
54
|
type: :runtime
|
55
55
|
version_requirements: *id002
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: dm-transactions
|
58
|
-
prerelease: false
|
59
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
|
-
requirements:
|
62
|
-
- - ~>
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
hash: 977940575
|
65
|
-
segments:
|
66
|
-
- 1
|
67
|
-
- 0
|
68
|
-
- 0
|
69
|
-
- rc2
|
70
|
-
version: 1.0.0.rc2
|
71
|
-
type: :runtime
|
72
|
-
version_requirements: *id003
|
73
56
|
- !ruby/object:Gem::Dependency
|
74
57
|
name: rspec
|
75
58
|
prerelease: false
|
76
|
-
requirement: &
|
59
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
77
60
|
none: false
|
78
61
|
requirements:
|
79
62
|
- - ~>
|
@@ -84,7 +67,7 @@ dependencies:
|
|
84
67
|
- 3
|
85
68
|
version: "1.3"
|
86
69
|
type: :development
|
87
|
-
version_requirements: *
|
70
|
+
version_requirements: *id003
|
88
71
|
description: DataMapper plugin allowing the creation of nested sets from data models
|
89
72
|
email: sindre [a] identu [d] no
|
90
73
|
executables: []
|
@@ -115,7 +98,7 @@ files:
|
|
115
98
|
- tasks/yard.rake
|
116
99
|
- tasks/yardstick.rake
|
117
100
|
has_rdoc: true
|
118
|
-
homepage: http://github.com/datamapper/dm-
|
101
|
+
homepage: http://github.com/datamapper/dm-is-nested_set
|
119
102
|
licenses: []
|
120
103
|
|
121
104
|
post_install_message:
|