dbee-active_record 2.0.4 → 2.2.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 (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