acts_as_recursive_tree 2.1.0 → 3.0.0

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +37 -0
  3. data/.github/workflows/lint.yml +31 -0
  4. data/.github/workflows/rubygem.yml +37 -0
  5. data/.gitignore +3 -1
  6. data/.rubocop.yml +30 -1
  7. data/.rubocop_todo.yml +28 -281
  8. data/Appraisals +16 -0
  9. data/CHANGELOG.md +17 -1
  10. data/Gemfile +2 -0
  11. data/README.md +3 -0
  12. data/Rakefile +8 -8
  13. data/acts_as_recursive_tree.gemspec +27 -18
  14. data/gemfiles/ar_52.gemfile +8 -0
  15. data/gemfiles/ar_60.gemfile +8 -0
  16. data/gemfiles/ar_61.gemfile +8 -0
  17. data/lib/acts_as_recursive_tree.rb +7 -11
  18. data/lib/acts_as_recursive_tree/acts_macro.rb +6 -6
  19. data/lib/acts_as_recursive_tree/associations.rb +10 -8
  20. data/lib/acts_as_recursive_tree/builders/ancestors.rb +3 -5
  21. data/lib/acts_as_recursive_tree/builders/descendants.rb +3 -3
  22. data/lib/acts_as_recursive_tree/builders/leaves.rb +7 -8
  23. data/lib/acts_as_recursive_tree/builders/relation_builder.rb +25 -28
  24. data/lib/acts_as_recursive_tree/builders/{strategy.rb → strategies.rb} +4 -7
  25. data/lib/acts_as_recursive_tree/builders/strategies/ancestor.rb +19 -0
  26. data/lib/acts_as_recursive_tree/builders/strategies/descendant.rb +19 -0
  27. data/lib/acts_as_recursive_tree/builders/{strategy → strategies}/join.rb +10 -4
  28. data/lib/acts_as_recursive_tree/builders/{strategy → strategies}/subselect.rb +3 -1
  29. data/lib/acts_as_recursive_tree/config.rb +2 -0
  30. data/lib/acts_as_recursive_tree/model.rb +9 -8
  31. data/lib/acts_as_recursive_tree/options/depth_condition.rb +3 -2
  32. data/lib/acts_as_recursive_tree/options/query_options.rb +10 -1
  33. data/lib/acts_as_recursive_tree/options/values.rb +28 -18
  34. data/lib/acts_as_recursive_tree/railtie.rb +2 -0
  35. data/lib/acts_as_recursive_tree/scopes.rb +8 -4
  36. data/lib/acts_as_recursive_tree/version.rb +3 -1
  37. data/spec/builders_spec.rb +21 -12
  38. data/spec/db/database.rb +11 -4
  39. data/spec/db/database.yml +2 -5
  40. data/spec/db/models.rb +12 -11
  41. data/spec/db/schema.rb +3 -4
  42. data/spec/model/location_spec.rb +7 -11
  43. data/spec/model/node_spec.rb +35 -49
  44. data/spec/model/relation_spec.rb +6 -11
  45. data/spec/spec_helper.rb +54 -55
  46. data/spec/values_spec.rb +23 -19
  47. metadata +111 -25
  48. data/lib/acts_as_recursive_tree/builders.rb +0 -14
  49. data/lib/acts_as_recursive_tree/options.rb +0 -9
data/spec/values_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  shared_examples 'single values' do
@@ -5,11 +7,11 @@ shared_examples 'single values' do
5
7
 
6
8
  it { is_expected.to be_a ActsAsRecursiveTree::Options::Values::SingleValue }
7
9
 
8
- it 'should apply_to' do
10
+ it 'apply_toes' do
9
11
  expect(value.apply_to(attribute).to_sql).to end_with " = #{single_value}"
10
12
  end
11
13
 
12
- it 'should apply_negated_to' do
14
+ it 'apply_negated_toes' do
13
15
  expect(value.apply_negated_to(attribute).to_sql).to end_with " != #{single_value}"
14
16
  end
15
17
  end
@@ -19,8 +21,8 @@ describe ActsAsRecursiveTree::Options::Values do
19
21
  let(:attribute) { table['test_attr'] }
20
22
 
21
23
  context 'invalid agurment' do
22
- it 'should raise exception' do
23
- expect{described_class.create(nil)}.to raise_exception /is not supported/
24
+ it 'raises exception' do
25
+ expect { described_class.create(nil) }.to raise_exception(/is not supported/)
24
26
  end
25
27
  end
26
28
 
@@ -34,53 +36,55 @@ describe ActsAsRecursiveTree::Options::Values do
34
36
  it_behaves_like 'single values' do
35
37
  let(:value_obj) { Node.new(id: single_value) }
36
38
  end
37
-
38
39
  end
39
40
 
40
41
  context 'multi value' do
41
42
  context 'Array' do
42
- let(:array) { [1, 2, 3] }
43
43
  subject(:value) { described_class.create(array) }
44
44
 
45
+ let(:array) { [1, 2, 3] }
46
+
45
47
  it { is_expected.to be_a ActsAsRecursiveTree::Options::Values::MultiValue }
46
48
 
47
- it 'should apply_to' do
49
+ it 'apply_toes' do
48
50
  expect(value.apply_to(attribute).to_sql).to end_with " IN (#{array.join(', ')})"
49
51
  end
50
52
 
51
- it 'should apply_negated_to' do
53
+ it 'apply_negated_toes' do
52
54
  expect(value.apply_negated_to(attribute).to_sql).to end_with " NOT IN (#{array.join(', ')})"
53
55
  end
54
56
  end
55
57
 
56
58
  context 'Range' do
57
- let(:range) { 1..3 }
58
59
  subject(:value) { described_class.create(range) }
59
60
 
60
- it { is_expected.to be_a ActsAsRecursiveTree::Options::Values::MultiValue }
61
+ let(:range) { 1..3 }
62
+
63
+ it { is_expected.to be_a ActsAsRecursiveTree::Options::Values::RangeValue }
61
64
 
62
- it 'should apply_to' do
65
+ it 'apply_toes' do
63
66
  expect(value.apply_to(attribute).to_sql).to end_with "BETWEEN #{range.begin} AND #{range.end}"
64
67
  end
65
68
 
66
- it 'should apply_negated_to' do
67
- expect(value.apply_negated_to(attribute).to_sql).to match /< #{range.begin} OR.* > #{range.end}/
69
+ it 'apply_negated_toes' do
70
+ expect(value.apply_negated_to(attribute).to_sql).to match(/< #{range.begin} OR.* > #{range.end}/)
68
71
  end
69
72
  end
70
73
 
71
74
  context 'Relation' do
72
- let(:relation) { Node.where(name: 'test') }
73
75
  subject(:value) { described_class.create(relation, OpenStruct.new(primary_key: :id)) }
74
76
 
77
+ let(:relation) { Node.where(name: 'test') }
78
+
75
79
  it { is_expected.to be_a ActsAsRecursiveTree::Options::Values::Relation }
76
80
 
77
- it 'should apply_to' do
78
- expect(value.apply_to(attribute).to_sql).to match /IN \(SELECT.*\)/
81
+ it 'apply_toes' do
82
+ expect(value.apply_to(attribute).to_sql).to match(/IN \(SELECT.*\)/)
79
83
  end
80
84
 
81
- it 'should apply_negated_to' do
82
- expect(value.apply_negated_to(attribute).to_sql).to match /NOT IN \(SELECT.*\)/
85
+ it 'apply_negated_toes' do
86
+ expect(value.apply_negated_to(attribute).to_sql).to match(/NOT IN \(SELECT.*\)/)
83
87
  end
84
88
  end
85
89
  end
86
- end
90
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_recursive_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wolfgang Wedelich-John
8
+ - Willem Mulder
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2018-04-06 00:00:00.000000000 Z
12
+ date: 2021-08-02 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activerecord
@@ -16,34 +17,68 @@ dependencies:
16
17
  requirements:
17
18
  - - ">="
18
19
  - !ruby/object:Gem::Version
19
- version: 5.0.0
20
+ version: 5.2.0
20
21
  - - "<"
21
22
  - !ruby/object:Gem::Version
22
- version: 6.0.0
23
+ version: '7.0'
23
24
  type: :runtime
24
25
  prerelease: false
25
26
  version_requirements: !ruby/object:Gem::Requirement
26
27
  requirements:
27
28
  - - ">="
28
29
  - !ruby/object:Gem::Version
29
- version: 5.0.0
30
+ version: 5.2.0
30
31
  - - "<"
31
32
  - !ruby/object:Gem::Version
32
- version: 6.0.0
33
+ version: '7.0'
33
34
  - !ruby/object:Gem::Dependency
34
- name: bundler
35
+ name: activesupport
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 5.2.0
41
+ - - "<"
42
+ - !ruby/object:Gem::Version
43
+ version: '7.0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 5.2.0
51
+ - - "<"
52
+ - !ruby/object:Gem::Version
53
+ version: '7.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: zeitwerk
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '2.4'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '2.4'
68
+ - !ruby/object:Gem::Dependency
69
+ name: appraisal
35
70
  requirement: !ruby/object:Gem::Requirement
36
71
  requirements:
37
72
  - - "~>"
38
73
  - !ruby/object:Gem::Version
39
- version: '1.7'
74
+ version: '2.4'
40
75
  type: :development
41
76
  prerelease: false
42
77
  version_requirements: !ruby/object:Gem::Requirement
43
78
  requirements:
44
79
  - - "~>"
45
80
  - !ruby/object:Gem::Version
46
- version: '1.7'
81
+ version: '2.4'
47
82
  - !ruby/object:Gem::Dependency
48
83
  name: database_cleaner
49
84
  requirement: !ruby/object:Gem::Requirement
@@ -62,30 +97,72 @@ dependencies:
62
97
  name: rake
63
98
  requirement: !ruby/object:Gem::Requirement
64
99
  requirements:
65
- - - "~>"
100
+ - - ">="
66
101
  - !ruby/object:Gem::Version
67
- version: '10.0'
102
+ version: '0'
68
103
  type: :development
69
104
  prerelease: false
70
105
  version_requirements: !ruby/object:Gem::Requirement
71
106
  requirements:
72
- - - "~>"
107
+ - - ">="
73
108
  - !ruby/object:Gem::Version
74
- version: '10.0'
109
+ version: '0'
75
110
  - !ruby/object:Gem::Dependency
76
111
  name: rspec-rails
77
112
  requirement: !ruby/object:Gem::Requirement
78
113
  requirements:
79
- - - "~>"
114
+ - - ">="
80
115
  - !ruby/object:Gem::Version
81
116
  version: '3.5'
82
117
  type: :development
83
118
  prerelease: false
84
119
  version_requirements: !ruby/object:Gem::Requirement
85
120
  requirements:
86
- - - "~>"
121
+ - - ">="
87
122
  - !ruby/object:Gem::Version
88
123
  version: '3.5'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rubocop
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.8.0
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 1.8.0
138
+ - !ruby/object:Gem::Dependency
139
+ name: rubocop-rails
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 2.9.0
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 2.9.0
152
+ - !ruby/object:Gem::Dependency
153
+ name: rubocop-rspec
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 2.1.0
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 2.1.0
89
166
  - !ruby/object:Gem::Dependency
90
167
  name: sqlite3
91
168
  requirement: !ruby/object:Gem::Requirement
@@ -104,35 +181,43 @@ description: "\n This is a ruby gem that provides drop in replacement for acts_
104
181
  but makes use of SQL recursive statement. Be sure to have a DBMS that supports recursive
105
182
  queries when using this gem (e.g. PostgreSQL or SQLite). "
106
183
  email:
107
- - wolfgang.wedelich@1und1.de
184
+ - wolfgang.wedelich@ionos.com
185
+ - 14mRh4X0r@gmail.com
108
186
  executables: []
109
187
  extensions: []
110
188
  extra_rdoc_files: []
111
189
  files:
190
+ - ".github/workflows/ci.yml"
191
+ - ".github/workflows/lint.yml"
192
+ - ".github/workflows/rubygem.yml"
112
193
  - ".gitignore"
113
194
  - ".rspec"
114
195
  - ".rubocop.yml"
115
196
  - ".rubocop_todo.yml"
197
+ - Appraisals
116
198
  - CHANGELOG.md
117
199
  - Gemfile
118
200
  - LICENSE.txt
119
201
  - README.md
120
202
  - Rakefile
121
203
  - acts_as_recursive_tree.gemspec
204
+ - gemfiles/ar_52.gemfile
205
+ - gemfiles/ar_60.gemfile
206
+ - gemfiles/ar_61.gemfile
122
207
  - lib/acts_as_recursive_tree.rb
123
208
  - lib/acts_as_recursive_tree/acts_macro.rb
124
209
  - lib/acts_as_recursive_tree/associations.rb
125
- - lib/acts_as_recursive_tree/builders.rb
126
210
  - lib/acts_as_recursive_tree/builders/ancestors.rb
127
211
  - lib/acts_as_recursive_tree/builders/descendants.rb
128
212
  - lib/acts_as_recursive_tree/builders/leaves.rb
129
213
  - lib/acts_as_recursive_tree/builders/relation_builder.rb
130
- - lib/acts_as_recursive_tree/builders/strategy.rb
131
- - lib/acts_as_recursive_tree/builders/strategy/join.rb
132
- - lib/acts_as_recursive_tree/builders/strategy/subselect.rb
214
+ - lib/acts_as_recursive_tree/builders/strategies.rb
215
+ - lib/acts_as_recursive_tree/builders/strategies/ancestor.rb
216
+ - lib/acts_as_recursive_tree/builders/strategies/descendant.rb
217
+ - lib/acts_as_recursive_tree/builders/strategies/join.rb
218
+ - lib/acts_as_recursive_tree/builders/strategies/subselect.rb
133
219
  - lib/acts_as_recursive_tree/config.rb
134
220
  - lib/acts_as_recursive_tree/model.rb
135
- - lib/acts_as_recursive_tree/options.rb
136
221
  - lib/acts_as_recursive_tree/options/depth_condition.rb
137
222
  - lib/acts_as_recursive_tree/options/query_options.rb
138
223
  - lib/acts_as_recursive_tree/options/values.rb
@@ -152,7 +237,9 @@ files:
152
237
  homepage: https://github.com/1and1/acts_as_recursive_tree
153
238
  licenses:
154
239
  - MIT
155
- metadata: {}
240
+ metadata:
241
+ bug_tracker_uri: https://github.com/1and1/acts_as_recursive_tree/issues
242
+ changelog_uri: https://github.com/1and1/acts_as_recursive_tree/CHANGELOG.md
156
243
  post_install_message:
157
244
  rdoc_options: []
158
245
  require_paths:
@@ -161,15 +248,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
248
  requirements:
162
249
  - - ">="
163
250
  - !ruby/object:Gem::Version
164
- version: 2.0.0
251
+ version: 2.5.0
165
252
  required_rubygems_version: !ruby/object:Gem::Requirement
166
253
  requirements:
167
254
  - - ">="
168
255
  - !ruby/object:Gem::Version
169
256
  version: '0'
170
257
  requirements: []
171
- rubyforge_project:
172
- rubygems_version: 2.7.6
258
+ rubygems_version: 3.1.6
173
259
  signing_key:
174
260
  specification_version: 4
175
261
  summary: Drop in replacement for acts_as_tree but using recursive queries
@@ -1,14 +0,0 @@
1
- module ActsAsRecursiveTree
2
- module Builders
3
- extend ActiveSupport::Autoload
4
-
5
- autoload :Values
6
- autoload :DepthCondition
7
- autoload :QueryOptions
8
- autoload :Strategy
9
- autoload :RelationBuilder
10
- autoload :Descendants
11
- autoload :Ancestors
12
- autoload :Leaves
13
- end
14
- end
@@ -1,9 +0,0 @@
1
- module ActsAsRecursiveTree
2
- module Options
3
- extend ActiveSupport::Autoload
4
-
5
- autoload :Values
6
- autoload :DepthCondition
7
- autoload :QueryOptions
8
- end
9
- end