acts_as_ordered_tree 0.0.7 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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: 0.0.7
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-02-15 00:00:00.000000000Z
13
+ date: 2012-08-16 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: &19980600 !ruby/object:Gem::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: '3'
22
+ version: 3.0.0
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: *19980600
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: '3'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *19980040
30
+ version: 3.0.0
36
31
  - !ruby/object:Gem::Dependency
37
- name: acts_as_tree
38
- requirement: &19979360 !ruby/object:Gem::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.1'
44
- type: :runtime
38
+ version: '1.0'
39
+ type: :development
45
40
  prerelease: false
46
- version_requirements: *19979360
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: acts_as_list
49
- requirement: &19978620 !ruby/object:Gem::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: '0.1'
55
- type: :runtime
54
+ version: 3.0.0
55
+ type: :development
56
56
  prerelease: false
57
- version_requirements: *19978620
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: &19977860 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
61
66
  none: false
62
67
  requirements:
63
68
  - - ! '>='
64
69
  - !ruby/object:Gem::Version
65
- version: '0'
70
+ version: '2.11'
66
71
  type: :development
67
72
  prerelease: false
68
- version_requirements: *19977860
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: simplecov
71
- requirement: &19977100 !ruby/object:Gem::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: '0'
86
+ version: '2.11'
77
87
  type: :development
78
88
  prerelease: false
79
- version_requirements: *19977100
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: sqlite3
82
- requirement: &19976120 !ruby/object:Gem::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: '0'
102
+ version: 1.2.0
88
103
  type: :development
89
104
  prerelease: false
90
- version_requirements: *19976120
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: bundler
93
- requirement: &19945820 !ruby/object:Gem::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: '0'
150
+ version: 0.4.0
99
151
  type: :development
100
152
  prerelease: false
101
- version_requirements: *19945820
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/iterator.rb
117
- - lib/acts_as_ordered_tree/list.rb
118
- - lib/acts_as_ordered_tree/tree.rb
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/database.yml
122
- - spec/iterator_spec.rb
123
- - spec/test_helper.rb
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.10
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: