acts_as_ordered_tree 0.0.7 → 1.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.
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/Appraisals +11 -0
- data/Gemfile +5 -1
- data/README.md +44 -10
- data/Rakefile +4 -0
- data/acts_as_ordered_tree.gemspec +12 -11
- data/lib/acts_as_ordered_tree.rb +99 -34
- data/lib/acts_as_ordered_tree/class_methods.rb +29 -0
- data/lib/acts_as_ordered_tree/fake_scope.rb +28 -0
- data/lib/acts_as_ordered_tree/instance_methods.rb +375 -0
- data/lib/acts_as_ordered_tree/validators.rb +15 -0
- data/lib/acts_as_ordered_tree/version.rb +1 -1
- data/spec/acts_as_ordered_tree_spec.rb +710 -205
- data/spec/db/schema.rb +23 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/factories.rb +14 -0
- data/spec/support/matchers.rb +132 -0
- data/spec/support/models.rb +23 -0
- metadata +118 -51
- data/init.rb +0 -2
- data/lib/acts_as_ordered_tree/iterator.rb +0 -36
- data/lib/acts_as_ordered_tree/list.rb +0 -100
- data/lib/acts_as_ordered_tree/tree.rb +0 -156
- data/spec/database.yml +0 -3
- data/spec/iterator_spec.rb +0 -73
- data/spec/test_helper.rb +0 -53
data/spec/db/schema.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 0) do
|
2
|
+
create_table :categories, :force => true do |t|
|
3
|
+
t.column :name, :string
|
4
|
+
t.column :parent_id, :integer
|
5
|
+
t.column :position, :integer
|
6
|
+
t.column :depth, :integer
|
7
|
+
t.column :categories_count, :integer
|
8
|
+
end
|
9
|
+
|
10
|
+
create_table :renamed_columns, :force => true do |t|
|
11
|
+
t.column :name, :string
|
12
|
+
t.column :mother_id, :integer
|
13
|
+
t.column :red, :integer
|
14
|
+
t.column :pitch, :integer
|
15
|
+
end
|
16
|
+
|
17
|
+
create_table :scoped, :force => true do |t|
|
18
|
+
t.column :scope_type, :string
|
19
|
+
t.column :name, :string
|
20
|
+
t.column :parent_id, :integer
|
21
|
+
t.column :position, :integer
|
22
|
+
end
|
23
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
test_dir = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "bundler/setup"
|
5
|
+
|
6
|
+
require "rspec"
|
7
|
+
require "rspec-expectations"
|
8
|
+
|
9
|
+
begin
|
10
|
+
require "simplecov"
|
11
|
+
SimpleCov.start
|
12
|
+
rescue LoadError
|
13
|
+
#ignore
|
14
|
+
end
|
15
|
+
|
16
|
+
require "active_model"
|
17
|
+
require "active_record"
|
18
|
+
require "action_controller"
|
19
|
+
require "factory_girl"
|
20
|
+
|
21
|
+
require "acts_as_ordered_tree"
|
22
|
+
require "logger"
|
23
|
+
|
24
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
25
|
+
ActiveRecord::Base.logger = Logger.new(ENV['DEBUG'] ? $stderr : '/dev/null')
|
26
|
+
ActiveRecord::Migration.verbose = false
|
27
|
+
load(File.join(test_dir, "db", "schema.rb"))
|
28
|
+
|
29
|
+
require "rspec/rails"
|
30
|
+
require "shoulda-matchers"
|
31
|
+
require "support/models"
|
32
|
+
require "support/factories"
|
33
|
+
require "support/matchers"
|
34
|
+
|
35
|
+
RSpec.configure do |config|
|
36
|
+
config.include FactoryGirl::Syntax::Methods
|
37
|
+
config.use_transactional_fixtures = true
|
38
|
+
|
39
|
+
config.around :each do |example|
|
40
|
+
ActiveRecord::Base.transaction do
|
41
|
+
example.run
|
42
|
+
|
43
|
+
raise ActiveRecord::Rollback
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :default do
|
3
|
+
sequence(:name) { |n| "category #{n}" }
|
4
|
+
end
|
5
|
+
|
6
|
+
factory :default_with_counter_cache do
|
7
|
+
sequence(:name) { |n| "category #{n}" }
|
8
|
+
end
|
9
|
+
|
10
|
+
factory :scoped do
|
11
|
+
sequence(:scope_type) { |n| "type_#{n}" }
|
12
|
+
sequence(:name) { |n| "category #{n}" }
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module RSpec::Matchers
|
2
|
+
|
3
|
+
# it { should fire_callback(:around_move).when_calling(:save) }
|
4
|
+
# it { should fire_callback(:after_move).when_calling(:move_to_left_of, lft_id) }
|
5
|
+
# it { should fire_callback(:around_move).owhen_callingn(:save).at_least(1).time }
|
6
|
+
# it { should fire_callback(:around_move).when_calling(:save).at_most(2).times }
|
7
|
+
# it { should fire_callback(:around_move).when_calling(:save).exactly(2).times }
|
8
|
+
# it { should fire_callback(:around_move).when_calling(:save).once }
|
9
|
+
# it { should fire_callback(:around_move).when_calling(:save).twice }
|
10
|
+
def fire_callback(name)
|
11
|
+
FireCallbackMatcher.new(name)
|
12
|
+
end
|
13
|
+
|
14
|
+
# example { expect(record1, record2, record3).to be_sorted }
|
15
|
+
def be_sorted
|
16
|
+
OrderMatcher.new
|
17
|
+
end
|
18
|
+
|
19
|
+
class FireCallbackMatcher
|
20
|
+
attr_reader :failure_message, :negative_failure_message
|
21
|
+
|
22
|
+
def initialize(callback_name)
|
23
|
+
@callback = callback_name
|
24
|
+
@method = :save
|
25
|
+
@args = []
|
26
|
+
|
27
|
+
@limit_min = 1
|
28
|
+
@limit_max = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def when_calling(method, *args)
|
32
|
+
@method = method
|
33
|
+
@args = args
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def times
|
38
|
+
self
|
39
|
+
end
|
40
|
+
alias time times
|
41
|
+
|
42
|
+
def at_least(times)
|
43
|
+
@limit_min = times == :once ? 1 : times
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def at_most(times)
|
48
|
+
@limit_max = times == :once ? 1 : times
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def exactly(times)
|
53
|
+
at_least(times).at_most(times)
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def once
|
58
|
+
exactly(1)
|
59
|
+
end
|
60
|
+
|
61
|
+
def twice
|
62
|
+
exactly(2)
|
63
|
+
end
|
64
|
+
|
65
|
+
def description
|
66
|
+
"fire callback #@callback when #@method is called"
|
67
|
+
end
|
68
|
+
|
69
|
+
def matches?(subject)
|
70
|
+
@subject = subject
|
71
|
+
|
72
|
+
raise 'Method required' unless @method
|
73
|
+
|
74
|
+
with_temporary_callback do |ivar|
|
75
|
+
@subject.send(@method, *@args)
|
76
|
+
|
77
|
+
@received = @subject.instance_variable_get ivar
|
78
|
+
|
79
|
+
(@limit_min..@limit_max || 1000).include?(@received)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def failure_message_for_should
|
84
|
+
"expected #{@subject.inspect} to fire callback :#@callback when #@method is called (#@limit_min..#@limit_max) times, #@received times fired"
|
85
|
+
end
|
86
|
+
|
87
|
+
def failure_message_for_should_not
|
88
|
+
"expected #{@subject.inspect} not to fire callback :#@callback when #@method is called (#@limit_min..#@limit_max) times, #@received times fired"
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def with_temporary_callback
|
93
|
+
kind, name = @callback.to_s.split('_')
|
94
|
+
|
95
|
+
method_name = :"__temporary_callback_#{object_id}"
|
96
|
+
|
97
|
+
@subject.class.class_eval <<-CODE
|
98
|
+
def #{method_name}
|
99
|
+
@#{method_name} ||= 0
|
100
|
+
@#{method_name} += 1
|
101
|
+
yield if block_given?
|
102
|
+
end
|
103
|
+
#{kind}_#{name} :#{method_name}
|
104
|
+
CODE
|
105
|
+
|
106
|
+
result = yield :"@#{method_name}"
|
107
|
+
|
108
|
+
@subject.class.class_eval <<-CODE
|
109
|
+
skip_callback :#{name}, :#{kind}, :#{method_name}
|
110
|
+
undef_method :#{method_name}
|
111
|
+
CODE
|
112
|
+
|
113
|
+
result
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class OrderMatcher
|
118
|
+
def matches?(*records)
|
119
|
+
@records = Array.wrap(records).flatten
|
120
|
+
|
121
|
+
@records.sort_by { |record| record[record.position_column] } == @records
|
122
|
+
end
|
123
|
+
|
124
|
+
def failure_message_for_should
|
125
|
+
"expected #{@records.inspect} to be ordered by position, but they are not"
|
126
|
+
end
|
127
|
+
|
128
|
+
def failure_message_for_should_not
|
129
|
+
"expected #{@records.inspect} not to be ordered by position, but they are"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Default < ActiveRecord::Base
|
2
|
+
self.table_name = "categories"
|
3
|
+
|
4
|
+
acts_as_ordered_tree
|
5
|
+
end
|
6
|
+
|
7
|
+
class RenamedColumns < ActiveRecord::Base
|
8
|
+
acts_as_ordered_tree :parent_column => :mother_id,
|
9
|
+
:position_column => :red,
|
10
|
+
:depth_column => :pitch
|
11
|
+
end
|
12
|
+
|
13
|
+
class DefaultWithCounterCache < ActiveRecord::Base
|
14
|
+
self.table_name = "categories"
|
15
|
+
|
16
|
+
acts_as_ordered_tree :counter_cache => :categories_count
|
17
|
+
end
|
18
|
+
|
19
|
+
class Scoped < ActiveRecord::Base
|
20
|
+
self.table_name = "scoped"
|
21
|
+
|
22
|
+
acts_as_ordered_tree :scope => :scope_type
|
23
|
+
end
|
metadata
CHANGED
@@ -1,126 +1,188 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_ordered_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Alexei Mikhailov
|
9
|
+
- Vladimir Kuznetsov
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
+
date: 2012-08-16 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
16
|
+
name: activerecord
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
|
-
- -
|
20
|
+
- - ! '>='
|
20
21
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
22
|
+
version: 3.0.0
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: activerecord
|
27
|
-
requirement: &19980040 !ruby/object:Gem::Requirement
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
26
|
none: false
|
29
27
|
requirements:
|
30
|
-
- -
|
28
|
+
- - ! '>='
|
31
29
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
type: :runtime
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *19980040
|
30
|
+
version: 3.0.0
|
36
31
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
32
|
+
name: bundler
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
39
34
|
none: false
|
40
35
|
requirements:
|
41
|
-
- -
|
36
|
+
- - ! '>='
|
42
37
|
- !ruby/object:Gem::Version
|
43
|
-
version: '0
|
44
|
-
type: :
|
38
|
+
version: '1.0'
|
39
|
+
type: :development
|
45
40
|
prerelease: false
|
46
|
-
version_requirements:
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement:
|
48
|
+
name: rails
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
type: :
|
54
|
+
version: 3.0.0
|
55
|
+
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements:
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 3.0.0
|
58
63
|
- !ruby/object:Gem::Dependency
|
59
64
|
name: rspec
|
60
|
-
requirement:
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
61
66
|
none: false
|
62
67
|
requirements:
|
63
68
|
- - ! '>='
|
64
69
|
- !ruby/object:Gem::Version
|
65
|
-
version: '
|
70
|
+
version: '2.11'
|
66
71
|
type: :development
|
67
72
|
prerelease: false
|
68
|
-
version_requirements:
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '2.11'
|
69
79
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
71
|
-
requirement:
|
80
|
+
name: rspec-rails
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
72
82
|
none: false
|
73
83
|
requirements:
|
74
84
|
- - ! '>='
|
75
85
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
86
|
+
version: '2.11'
|
77
87
|
type: :development
|
78
88
|
prerelease: false
|
79
|
-
version_requirements:
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '2.11'
|
80
95
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
82
|
-
requirement:
|
96
|
+
name: shoulda-matchers
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
83
98
|
none: false
|
84
99
|
requirements:
|
85
100
|
- - ! '>='
|
86
101
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
102
|
+
version: 1.2.0
|
88
103
|
type: :development
|
89
104
|
prerelease: false
|
90
|
-
version_requirements:
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.2.0
|
91
111
|
- !ruby/object:Gem::Dependency
|
92
|
-
name:
|
93
|
-
requirement:
|
112
|
+
name: factory_girl
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - <
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '3'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - <
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '3'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: factory_girl_rails
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - <
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '3'
|
135
|
+
type: :development
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - <
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '3'
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: appraisal
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
94
146
|
none: false
|
95
147
|
requirements:
|
96
148
|
- - ! '>='
|
97
149
|
- !ruby/object:Gem::Version
|
98
|
-
version:
|
150
|
+
version: 0.4.0
|
99
151
|
type: :development
|
100
152
|
prerelease: false
|
101
|
-
version_requirements:
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: 0.4.0
|
102
159
|
description:
|
103
160
|
email:
|
104
161
|
- amikhailov83@gmail.com
|
162
|
+
- kv86@mail.ru
|
105
163
|
executables: []
|
106
164
|
extensions: []
|
107
165
|
extra_rdoc_files: []
|
108
166
|
files:
|
109
167
|
- .gitignore
|
168
|
+
- .rspec
|
169
|
+
- Appraisals
|
110
170
|
- Gemfile
|
111
171
|
- README.md
|
112
172
|
- Rakefile
|
113
173
|
- acts_as_ordered_tree.gemspec
|
114
|
-
- init.rb
|
115
174
|
- lib/acts_as_ordered_tree.rb
|
116
|
-
- lib/acts_as_ordered_tree/
|
117
|
-
- lib/acts_as_ordered_tree/
|
118
|
-
- lib/acts_as_ordered_tree/
|
175
|
+
- lib/acts_as_ordered_tree/class_methods.rb
|
176
|
+
- lib/acts_as_ordered_tree/fake_scope.rb
|
177
|
+
- lib/acts_as_ordered_tree/instance_methods.rb
|
178
|
+
- lib/acts_as_ordered_tree/validators.rb
|
119
179
|
- lib/acts_as_ordered_tree/version.rb
|
120
180
|
- spec/acts_as_ordered_tree_spec.rb
|
121
|
-
- spec/
|
122
|
-
- spec/
|
123
|
-
- spec/
|
181
|
+
- spec/db/schema.rb
|
182
|
+
- spec/spec_helper.rb
|
183
|
+
- spec/support/factories.rb
|
184
|
+
- spec/support/matchers.rb
|
185
|
+
- spec/support/models.rb
|
124
186
|
homepage: https://github.com/take-five/acts_as_ordered_tree
|
125
187
|
licenses: []
|
126
188
|
post_install_message:
|
@@ -133,17 +195,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
133
195
|
- - ! '>='
|
134
196
|
- !ruby/object:Gem::Version
|
135
197
|
version: '0'
|
198
|
+
segments:
|
199
|
+
- 0
|
200
|
+
hash: -720580582503752285
|
136
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
202
|
none: false
|
138
203
|
requirements:
|
139
204
|
- - ! '>='
|
140
205
|
- !ruby/object:Gem::Version
|
141
206
|
version: '0'
|
207
|
+
segments:
|
208
|
+
- 0
|
209
|
+
hash: -720580582503752285
|
142
210
|
requirements: []
|
143
211
|
rubyforge_project: acts_as_ordered_tree
|
144
|
-
rubygems_version: 1.8.
|
212
|
+
rubygems_version: 1.8.24
|
145
213
|
signing_key:
|
146
214
|
specification_version: 3
|
147
215
|
summary: ActiveRecord extension for sorted adjacency lists support
|
148
216
|
test_files: []
|
149
|
-
has_rdoc:
|