dbee-active_record 2.0.4 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +14 -13
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +4 -10
  5. data/CHANGELOG.md +24 -0
  6. data/Guardfile +2 -1
  7. data/README.md +1 -1
  8. data/dbee-active_record.gemspec +21 -8
  9. data/exe/.gitkeep +0 -0
  10. data/lib/dbee/providers/active_record_provider.rb +3 -3
  11. data/lib/dbee/providers/active_record_provider/expression_builder.rb +96 -55
  12. data/lib/dbee/providers/active_record_provider/maker.rb +37 -0
  13. data/lib/dbee/providers/active_record_provider/{expression_builder/constraint_maker.rb → makers/constraint.rb} +12 -12
  14. data/lib/dbee/providers/active_record_provider/{expression_builder/order_maker.rb → makers/order.rb} +9 -9
  15. data/lib/dbee/providers/active_record_provider/makers/select.rb +81 -0
  16. data/lib/dbee/providers/active_record_provider/makers/where.rb +111 -0
  17. data/lib/dbee/providers/active_record_provider/version.rb +1 -1
  18. data/spec/db_helper.rb +134 -14
  19. data/spec/dbee/providers/active_record_provider/expression_builder_spec.rb +90 -0
  20. data/spec/dbee/providers/active_record_provider/makers/where_spec.rb +260 -0
  21. data/spec/dbee/providers/active_record_provider_spec.rb +112 -14
  22. data/spec/fixtures/active_record_snapshots/five_table_query.yaml +1 -0
  23. data/spec/fixtures/active_record_snapshots/multiple_same_table_query_with_static_constraints.yaml +1 -0
  24. data/spec/fixtures/active_record_snapshots/one_table_empty_query.yaml +11 -0
  25. data/spec/fixtures/active_record_snapshots/one_table_query.yaml +1 -0
  26. data/spec/fixtures/active_record_snapshots/one_table_query_with_ascending_sort.yaml +1 -0
  27. data/spec/fixtures/active_record_snapshots/one_table_query_with_descending_sort.yaml +1 -0
  28. data/spec/fixtures/active_record_snapshots/one_table_query_with_filters.yaml +9 -8
  29. data/spec/fixtures/active_record_snapshots/one_table_query_with_limit.yaml +1 -0
  30. data/spec/fixtures/active_record_snapshots/one_table_query_with_multiple_sorts.yaml +1 -0
  31. data/spec/fixtures/active_record_snapshots/partitioner_example_1_query.yaml +1 -0
  32. data/spec/fixtures/active_record_snapshots/partitioner_example_2_query.yaml +1 -0
  33. data/spec/fixtures/active_record_snapshots/reverse_polymorphic_query.yaml +1 -0
  34. data/spec/fixtures/active_record_snapshots/two_table_query.yaml +1 -0
  35. data/spec/fixtures/active_record_snapshots/two_table_query_with_aggregation.yaml +72 -0
  36. data/spec/fixtures/active_record_snapshots/two_table_query_with_pivoting.yaml +89 -0
  37. data/spec/fixtures/models.yaml +112 -84
  38. data/spec/spec_helper.rb +13 -2
  39. metadata +96 -28
  40. data/lib/dbee/providers/active_record_provider/expression_builder/select_maker.rb +0 -33
  41. data/lib/dbee/providers/active_record_provider/expression_builder/where_maker.rb +0 -68
data/spec/spec_helper.rb CHANGED
@@ -7,8 +7,15 @@
7
7
  # LICENSE file in the root directory of this source tree.
8
8
  #
9
9
 
10
- require 'yaml'
11
10
  require 'pry'
11
+ require 'super_diff/rspec'
12
+ require 'yaml'
13
+
14
+ RSpec.configure do |config|
15
+ # Allow for disabling auto focus mode in certain environments like CI to
16
+ # prevent false positives when only a subset of the suite passes.
17
+ config.filter_run_when_matching :focus unless ENV['DISABLE_RSPEC_FOCUS'] == 'true'
18
+ end
12
19
 
13
20
  unless ENV['DISABLE_SIMPLECOV'] == 'true'
14
21
  require 'simplecov'
@@ -35,7 +42,7 @@ def fixture(*filename)
35
42
  end
36
43
 
37
44
  def yaml_fixture_files(*directory)
38
- Dir[File.join('spec', 'fixtures', *directory, '*.yaml')].map do |filename|
45
+ Dir[File.join('spec', 'fixtures', *directory, '**', '*.yaml')].map do |filename|
39
46
  [
40
47
  filename,
41
48
  yaml_file_read(filename)
@@ -50,3 +57,7 @@ end
50
57
  def file_read(*filename)
51
58
  File.open(File.join(*filename), 'r:bom|utf-8').read
52
59
  end
60
+
61
+ def models
62
+ yaml_fixture('models.yaml')
63
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbee-active_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ruggio
8
- autorequire:
9
- bindir: bin
8
+ - Craig Kattner
9
+ autorequire:
10
+ bindir: exe
10
11
  cert_chain: []
11
- date: 2020-02-13 00:00:00.000000000 Z
12
+ date: 2021-03-11 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activerecord
@@ -36,20 +37,14 @@ dependencies:
36
37
  requirements:
37
38
  - - "~>"
38
39
  - !ruby/object:Gem::Version
39
- version: '2'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 2.0.3
40
+ version: '3'
43
41
  type: :runtime
44
42
  prerelease: false
45
43
  version_requirements: !ruby/object:Gem::Requirement
46
44
  requirements:
47
45
  - - "~>"
48
46
  - !ruby/object:Gem::Version
49
- version: '2'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 2.0.3
47
+ version: '3'
53
48
  - !ruby/object:Gem::Dependency
54
49
  name: guard-rspec
55
50
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +87,20 @@ dependencies:
92
87
  - - "~>"
93
88
  - !ruby/object:Gem::Version
94
89
  version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: pry-byebug
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
95
104
  - !ruby/object:Gem::Dependency
96
105
  name: rake
97
106
  requirement: !ruby/object:Gem::Requirement
@@ -126,42 +135,70 @@ dependencies:
126
135
  requirements:
127
136
  - - "~>"
128
137
  - !ruby/object:Gem::Version
129
- version: 0.79.0
138
+ version: '1'
130
139
  type: :development
131
140
  prerelease: false
132
141
  version_requirements: !ruby/object:Gem::Requirement
133
142
  requirements:
134
143
  - - "~>"
135
144
  - !ruby/object:Gem::Version
136
- version: 0.79.0
145
+ version: '1'
146
+ - !ruby/object:Gem::Dependency
147
+ name: rubocop-rake
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ - !ruby/object:Gem::Dependency
161
+ name: rubocop-rspec
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
137
174
  - !ruby/object:Gem::Dependency
138
175
  name: simplecov
139
176
  requirement: !ruby/object:Gem::Requirement
140
177
  requirements:
141
178
  - - "~>"
142
179
  - !ruby/object:Gem::Version
143
- version: 0.17.0
180
+ version: 0.19.0
144
181
  type: :development
145
182
  prerelease: false
146
183
  version_requirements: !ruby/object:Gem::Requirement
147
184
  requirements:
148
185
  - - "~>"
149
186
  - !ruby/object:Gem::Version
150
- version: 0.17.0
187
+ version: 0.19.0
151
188
  - !ruby/object:Gem::Dependency
152
189
  name: simplecov-console
153
190
  requirement: !ruby/object:Gem::Requirement
154
191
  requirements:
155
192
  - - "~>"
156
193
  - !ruby/object:Gem::Version
157
- version: 0.6.0
194
+ version: 0.7.0
158
195
  type: :development
159
196
  prerelease: false
160
197
  version_requirements: !ruby/object:Gem::Requirement
161
198
  requirements:
162
199
  - - "~>"
163
200
  - !ruby/object:Gem::Version
164
- version: 0.6.0
201
+ version: 0.7.0
165
202
  - !ruby/object:Gem::Dependency
166
203
  name: sqlite3
167
204
  requirement: !ruby/object:Gem::Requirement
@@ -176,12 +213,26 @@ dependencies:
176
213
  - - "~>"
177
214
  - !ruby/object:Gem::Version
178
215
  version: '1'
216
+ - !ruby/object:Gem::Dependency
217
+ name: super_diff
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '0.6'
223
+ type: :development
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.6'
179
230
  description: " By default Dbee ships with no underlying SQL generator. This library
180
231
  will plug in ActiveRecord into Dbee and Dbee will use it for SQL generation.\n"
181
232
  email:
182
233
  - mruggio@bluemarblepayroll.com
183
- executables:
184
- - console
234
+ - ckattner@bluemarblepayroll.com
235
+ executables: []
185
236
  extensions: []
186
237
  extra_rdoc_files: []
187
238
  files:
@@ -199,20 +250,25 @@ files:
199
250
  - Rakefile
200
251
  - bin/console
201
252
  - dbee-active_record.gemspec
253
+ - exe/.gitkeep
202
254
  - lib/dbee/providers/active_record_provider.rb
203
255
  - lib/dbee/providers/active_record_provider/expression_builder.rb
204
- - lib/dbee/providers/active_record_provider/expression_builder/constraint_maker.rb
205
- - lib/dbee/providers/active_record_provider/expression_builder/order_maker.rb
206
- - lib/dbee/providers/active_record_provider/expression_builder/select_maker.rb
207
- - lib/dbee/providers/active_record_provider/expression_builder/where_maker.rb
256
+ - lib/dbee/providers/active_record_provider/maker.rb
257
+ - lib/dbee/providers/active_record_provider/makers/constraint.rb
258
+ - lib/dbee/providers/active_record_provider/makers/order.rb
259
+ - lib/dbee/providers/active_record_provider/makers/select.rb
260
+ - lib/dbee/providers/active_record_provider/makers/where.rb
208
261
  - lib/dbee/providers/active_record_provider/obfuscated_alias_maker.rb
209
262
  - lib/dbee/providers/active_record_provider/safe_alias_maker.rb
210
263
  - lib/dbee/providers/active_record_provider/version.rb
211
264
  - spec/config/database.yaml.ci
212
265
  - spec/db_helper.rb
266
+ - spec/dbee/providers/active_record_provider/expression_builder_spec.rb
267
+ - spec/dbee/providers/active_record_provider/makers/where_spec.rb
213
268
  - spec/dbee/providers/active_record_provider_spec.rb
214
269
  - spec/fixtures/active_record_snapshots/five_table_query.yaml
215
270
  - spec/fixtures/active_record_snapshots/multiple_same_table_query_with_static_constraints.yaml
271
+ - spec/fixtures/active_record_snapshots/one_table_empty_query.yaml
216
272
  - spec/fixtures/active_record_snapshots/one_table_query.yaml
217
273
  - spec/fixtures/active_record_snapshots/one_table_query_with_ascending_sort.yaml
218
274
  - spec/fixtures/active_record_snapshots/one_table_query_with_descending_sort.yaml
@@ -223,13 +279,20 @@ files:
223
279
  - spec/fixtures/active_record_snapshots/partitioner_example_2_query.yaml
224
280
  - spec/fixtures/active_record_snapshots/reverse_polymorphic_query.yaml
225
281
  - spec/fixtures/active_record_snapshots/two_table_query.yaml
282
+ - spec/fixtures/active_record_snapshots/two_table_query_with_aggregation.yaml
283
+ - spec/fixtures/active_record_snapshots/two_table_query_with_pivoting.yaml
226
284
  - spec/fixtures/models.yaml
227
285
  - spec/spec_helper.rb
228
286
  homepage: https://github.com/bluemarblepayroll/dbee-active_record
229
287
  licenses:
230
288
  - MIT
231
- metadata: {}
232
- post_install_message:
289
+ metadata:
290
+ bug_tracker_uri: https://github.com/bluemarblepayroll/dbee-active_record/issues
291
+ changelog_uri: https://github.com/bluemarblepayroll/dbee-active_record/blob/master/CHANGELOG.md
292
+ documentation_uri: https://www.rubydoc.info/gems/dbee-active_record
293
+ homepage_uri: https://github.com/bluemarblepayroll/dbee-active_record
294
+ source_code_uri: https://github.com/bluemarblepayroll/dbee-active_record
295
+ post_install_message:
233
296
  rdoc_options: []
234
297
  require_paths:
235
298
  - lib
@@ -237,7 +300,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
237
300
  requirements:
238
301
  - - ">="
239
302
  - !ruby/object:Gem::Version
240
- version: 2.3.8
303
+ version: '2.5'
241
304
  required_rubygems_version: !ruby/object:Gem::Requirement
242
305
  requirements:
243
306
  - - ">="
@@ -245,15 +308,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
308
  version: '0'
246
309
  requirements: []
247
310
  rubygems_version: 3.0.3
248
- signing_key:
311
+ signing_key:
249
312
  specification_version: 4
250
313
  summary: Plugs in ActiveRecord so Dbee can use Arel for SQL generation.
251
314
  test_files:
252
315
  - spec/config/database.yaml.ci
253
316
  - spec/db_helper.rb
317
+ - spec/dbee/providers/active_record_provider/expression_builder_spec.rb
318
+ - spec/dbee/providers/active_record_provider/makers/where_spec.rb
254
319
  - spec/dbee/providers/active_record_provider_spec.rb
255
320
  - spec/fixtures/active_record_snapshots/five_table_query.yaml
256
321
  - spec/fixtures/active_record_snapshots/multiple_same_table_query_with_static_constraints.yaml
322
+ - spec/fixtures/active_record_snapshots/one_table_empty_query.yaml
257
323
  - spec/fixtures/active_record_snapshots/one_table_query.yaml
258
324
  - spec/fixtures/active_record_snapshots/one_table_query_with_ascending_sort.yaml
259
325
  - spec/fixtures/active_record_snapshots/one_table_query_with_descending_sort.yaml
@@ -264,5 +330,7 @@ test_files:
264
330
  - spec/fixtures/active_record_snapshots/partitioner_example_2_query.yaml
265
331
  - spec/fixtures/active_record_snapshots/reverse_polymorphic_query.yaml
266
332
  - spec/fixtures/active_record_snapshots/two_table_query.yaml
333
+ - spec/fixtures/active_record_snapshots/two_table_query_with_aggregation.yaml
334
+ - spec/fixtures/active_record_snapshots/two_table_query_with_pivoting.yaml
267
335
  - spec/fixtures/models.yaml
268
336
  - spec/spec_helper.rb
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Dbee
11
- module Providers
12
- class ActiveRecordProvider
13
- class ExpressionBuilder
14
- # Derives Arel#project predicates.
15
- class SelectMaker
16
- include Singleton
17
-
18
- def make(column, arel_column, alias_maker)
19
- column_alias = quote(alias_maker.make(column.display))
20
-
21
- arel_column.as(column_alias)
22
- end
23
-
24
- private
25
-
26
- def quote(value)
27
- ActiveRecord::Base.connection.quote(value)
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Dbee
11
- module Providers
12
- class ActiveRecordProvider
13
- class ExpressionBuilder
14
- # Derives Arel#where predicates.
15
- class WhereMaker
16
- include Singleton
17
-
18
- FILTER_EVALUATORS = {
19
- Query::Filters::Contains => ->(column, val) { column.matches("%#{val}%") },
20
- Query::Filters::Equals => ->(column, val) { column.eq(val) },
21
- Query::Filters::GreaterThan => ->(column, val) { column.gt(val) },
22
- Query::Filters::GreaterThanOrEqualTo => ->(column, val) { column.gteq(val) },
23
- Query::Filters::LessThan => ->(column, val) { column.lt(val) },
24
- Query::Filters::LessThanOrEqualTo => ->(column, val) { column.lteq(val) },
25
- Query::Filters::NotContain => ->(column, val) { column.does_not_match("%#{val}%") },
26
- Query::Filters::NotEquals => ->(column, val) { column.not_eq(val) },
27
- Query::Filters::NotStartWith => ->(column, val) { column.does_not_match("#{val}%") },
28
- Query::Filters::StartsWith => ->(column, val) { column.matches("#{val}%") }
29
- }.freeze
30
-
31
- private_constant :FILTER_EVALUATORS
32
-
33
- def make(filter, arel_column)
34
- values = normalize(filter.value)
35
-
36
- if filter.is_a?(Query::Filters::Equals) && values.length > 1
37
- arel_column.in(values)
38
- elsif filter.is_a?(Query::Filters::NotEquals) && values.length > 1
39
- arel_column.not_in(values)
40
- else
41
- use_or(filter, arel_column)
42
- end
43
- end
44
-
45
- private
46
-
47
- def normalize(value)
48
- value ? Array(value).flatten : [nil]
49
- end
50
-
51
- def use_or(filter, arel_column)
52
- predicates = normalize(filter.value).map do |coerced_value|
53
- method = FILTER_EVALUATORS[filter.class]
54
-
55
- raise ArgumentError, "cannot compile filter: #{filter}" unless method
56
-
57
- method.call(arel_column, coerced_value)
58
- end
59
-
60
- predicates.inject(predicates.shift) do |memo, predicate|
61
- memo.or(predicate)
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
68
- end