trailblazer-finder 0.3.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +1 -4
  4. data/CHANGES.md +3 -0
  5. data/LICENSE.txt +1 -1
  6. data/README.md +0 -7
  7. data/lib/trailblazer/finder.rb +9 -18
  8. data/lib/trailblazer/finder/activity/find.rb +26 -28
  9. data/lib/trailblazer/finder/activity/prepare.rb +17 -14
  10. data/lib/trailblazer/finder/activity/prepare_adapters.rb +52 -0
  11. data/lib/trailblazer/finder/activity/prepare_entity.rb +25 -0
  12. data/lib/trailblazer/finder/activity/prepare_filters.rb +29 -0
  13. data/lib/trailblazer/finder/activity/prepare_paging.rb +42 -0
  14. data/lib/trailblazer/finder/activity/prepare_params.rb +27 -0
  15. data/lib/trailblazer/finder/activity/prepare_properties.rb +44 -0
  16. data/lib/trailblazer/finder/activity/prepare_sorting.rb +52 -0
  17. data/lib/trailblazer/finder/activity/process.rb +12 -8
  18. data/lib/trailblazer/finder/activity/process_adapters.rb +40 -0
  19. data/lib/trailblazer/finder/activity/process_filters.rb +21 -0
  20. data/lib/trailblazer/finder/activity/process_paging.rb +19 -0
  21. data/lib/trailblazer/finder/activity/process_predicates.rb +23 -0
  22. data/lib/trailblazer/finder/activity/process_sorting.rb +19 -0
  23. data/lib/trailblazer/finder/version.rb +1 -1
  24. data/lib/trailblazer/operation/finder.rb +42 -49
  25. data/spec/spec_helper.rb +4 -0
  26. data/trailblazer-finder.gemspec +6 -7
  27. metadata +32 -57
  28. data/.rubocop-https---raw-githubusercontent-com-trailblazer-meta-master-rubocop-yml +0 -101
  29. data/lib/trailblazer/finder/activity/prepare/adapters.rb +0 -66
  30. data/lib/trailblazer/finder/activity/prepare/entity.rb +0 -32
  31. data/lib/trailblazer/finder/activity/prepare/filters.rb +0 -36
  32. data/lib/trailblazer/finder/activity/prepare/paging.rb +0 -49
  33. data/lib/trailblazer/finder/activity/prepare/params.rb +0 -33
  34. data/lib/trailblazer/finder/activity/prepare/properties.rb +0 -47
  35. data/lib/trailblazer/finder/activity/prepare/sorting.rb +0 -57
  36. data/lib/trailblazer/finder/activity/process/adapters.rb +0 -48
  37. data/lib/trailblazer/finder/activity/process/filters.rb +0 -28
  38. data/lib/trailblazer/finder/activity/process/paging.rb +0 -26
  39. data/lib/trailblazer/finder/activity/process/predicates.rb +0 -30
  40. data/lib/trailblazer/finder/activity/process/sorting.rb +0 -26
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ class PrepareSorting < Trailblazer::Activity::Railway
7
+ def check_sorting(ctx, **)
8
+ sorting = ctx[:config][:sorting] || nil
9
+ return true unless ctx[:config][:sorting].empty? || sorting.nil?
10
+ end
11
+
12
+ def set_sorting(ctx, **)
13
+ return true if ctx[:params][:sort].nil?
14
+
15
+ sorting = ctx[:params][:sort]
16
+ config = ctx[:config][:sorting]
17
+ ctx[:sorting] = ctx[:sorting] || {}
18
+ sorting.split(",").each do |sorter|
19
+ spt = sorter.split
20
+ ctx[:sorting][spt[0]] = fetch_sort_direction(config[spt[0].to_sym], spt[1]) if config.include?(spt[0].to_sym)
21
+ end
22
+ end
23
+
24
+ def fetch_sort_direction(config_direction, params_direction = nil)
25
+ return config_direction == :asc ? :asc : :desc if params_direction.nil?
26
+
27
+ case params_direction
28
+ when ":asc", :asc, "asc"
29
+ :asc
30
+ else
31
+ :desc
32
+ end
33
+ end
34
+
35
+ def clear_sorting(ctx, **)
36
+ ctx[:params].delete(:sort) unless ctx[:params][:sort].nil?
37
+ true
38
+ end
39
+
40
+ step (:check_sorting),
41
+ Output(:success) => Track(:paging),
42
+ Output(:failure) => Track(:end_sorting)
43
+ step (:set_sorting),
44
+ magnetic_to: :paging,
45
+ Output(:success) => Track(:end_sorting),
46
+ Output(:failure) => Track(:failure)
47
+ step (:clear_sorting),
48
+ magnetic_to: :end_sorting
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,17 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "process_adapters"
4
+ require_relative "process_predicates"
5
+ require_relative "process_paging"
6
+ require_relative "process_sorting"
7
+ require_relative "process_filters"
8
+
3
9
  module Trailblazer
4
10
  class Finder
5
11
  module Activity
6
12
  # Process Activity
7
- module Process
8
- extend Trailblazer::Activity::Railway()
9
-
10
- step Subprocess(Process::Adapters), id: :process_adapters
11
- step Subprocess(Process::Predicates), id: :process_predicates
12
- step Subprocess(Process::Filters), id: :process_filters
13
- step Subprocess(Process::Paging), id: :process_paging
14
- step Subprocess(Process::Sorting), id: :process_sorting
13
+ class Process < Trailblazer::Activity::Railway
14
+ step Subprocess(ProcessAdapters)
15
+ step Subprocess(ProcessPredicates)
16
+ step Subprocess(ProcessFilters)
17
+ step Subprocess(ProcessPaging)
18
+ step Subprocess(ProcessSorting)
15
19
  end
16
20
  end
17
21
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ class ProcessAdapters < Trailblazer::Activity::Railway
7
+ def set_orm_adapters(ctx, **)
8
+ ctx[:adapters].each do |adapter|
9
+ next unless (ORM_ADAPTERS + ["Basic"]).include?(adapter)
10
+
11
+ ctx[:orm] = {}
12
+ ctx[:orm][:adapter] = adapter
13
+ ctx[:orm][:predicates] = "Trailblazer::Finder::Adapters::#{adapter}::Predicates"
14
+ ctx[:orm][:paging] = "Trailblazer::Finder::Adapters::#{adapter}::Paging"
15
+ ctx[:orm][:sorting] = "Trailblazer::Finder::Adapters::#{adapter}::Sorting"
16
+ return true
17
+ end
18
+ end
19
+
20
+ def set_paging_adapters(ctx, **)
21
+ ctx[:adapters].each do |adapter|
22
+ next unless PAGING_ADAPTERS.include?(adapter)
23
+ return false if ctx[:adapters].include?("Basic")
24
+ ctx[:orm][:paging] = "Trailblazer::Finder::Adapters::#{adapter}::Paging"
25
+ return true
26
+ end
27
+ true
28
+ end
29
+
30
+ def invalid_paging_adapter_error(ctx, **)
31
+ (ctx[:errors] ||= []) << {adapters: "Can't use paging adapters like Kaminari without using an ORM like ActiveRecord or Sequel"}
32
+ end
33
+
34
+ step :set_orm_adapters
35
+ step :set_paging_adapters
36
+ fail :invalid_paging_adapter_error
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ class ProcessFilters < Trailblazer::Activity::Railway
7
+ def set_filter_handlers(ctx, **)
8
+ return true unless ctx[:process]
9
+
10
+ ctx[:process].each do |key, value|
11
+ next if ctx[:process][key][:filter].nil?
12
+
13
+ ctx[:process][key][:handler] = Utils::Extra.apply_handler(value[:filter] ? value[:filter][:handler] : "none")
14
+ end
15
+ end
16
+
17
+ step :set_filter_handlers
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ class ProcessPaging < Trailblazer::Activity::Railway
7
+ def set_paging_handler(ctx, **)
8
+ return true if ctx[:paging].nil?
9
+
10
+ ctx[:paging][:handler] = Utils::Extra.apply_handler(
11
+ (Object.const_get(ctx[:orm][:paging]).__send__ :set_paging_handler)
12
+ )
13
+ end
14
+
15
+ step :set_paging_handler
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ class ProcessPredicates < Trailblazer::Activity::Railway
7
+ def set_properties_handler(ctx, **)
8
+ return true if ctx[:process].nil?
9
+
10
+ ctx[:process].each do |key, _value|
11
+ next if ctx[:process][key][:predicate].nil?
12
+
13
+ ctx[:process][key][:handler] = Utils::Extra.apply_handler(
14
+ (Object.const_get(ctx[:orm][:predicates]).__send__ "set_#{ctx[:process][key][:predicate]}_handler".to_sym)
15
+ )
16
+ end
17
+ end
18
+
19
+ step :set_properties_handler
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ class ProcessSorting < Trailblazer::Activity::Railway
7
+ def set_sorting_handler(ctx, **)
8
+ return true if ctx[:sorting].nil?
9
+
10
+ ctx[:sorting][:handler] = Utils::Extra.apply_handler(
11
+ (Object.const_get(ctx[:orm][:sorting]).__send__ :set_sorting_handler)
12
+ )
13
+ end
14
+
15
+ step :set_sorting_handler
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Trailblazer
4
4
  class Finder
5
- VERSION = "0.3.0"
5
+ VERSION = "0.10.0".freeze
6
6
  end
7
7
  end
@@ -1,63 +1,56 @@
1
- # frozen_string_literal: true
2
-
3
1
  # Really gotta clean this up, but can't be bothered right now
4
- module Trailblazer
5
- class Operation
6
- def self.Finder(finder_class, action = nil, entity = nil)
7
- task = Trailblazer::Activity::TaskBuilder::Binary(Finder.new)
8
-
9
- extension = Trailblazer::Activity::TaskWrap::Merge.new(
10
- Wrap::Inject::Defaults(
11
- :"finder.class" => finder_class,
12
- :"finder.entity" => entity,
13
- :"finder.action" => action
14
- )
15
- )
16
-
17
- {task: task, id: "finder.build", Trailblazer::Activity::DSL::Extension.new(extension) => true}
18
- end
2
+ Trailblazer::Operation.instance_eval do
3
+ def self.Finder(finder_class, action = nil, entity = nil)
4
+ task = Trailblazer::Activity::TaskBuilder::Binary(Finder.new)
5
+ injection = Trailblazer::Activity::TaskWrap::Inject::Defaults::Extension(
6
+ :"finder.class" => finder_class,
7
+ :"finder.entity" => entity,
8
+ :"finder.action" => action
9
+ )
10
+
11
+ {task: task, id: "finder.build", extensions: [injection]}
12
+ end
19
13
 
20
- class Finder
21
- def call(options, params:, **)
22
- builder = Finder::Builder.new
23
- options[:finder] = finder = builder.call(options, params)
24
- options[:model] = finder # Don't like it, but somehow it's needed if contracts are loaded
25
- options["result.finder"] = result = Result.new(!finder.nil?, {})
14
+ class Finder
15
+ def call(ctx, options, **)
16
+ builder = Finder::Builder.new
17
+ ctx[:finder] = finder = builder.call(options, options[:params])
18
+ ctx[:model] = finder # Don't like it, but somehow it's needed if contracts are loaded
19
+ ctx[:"result.finder"] = Trailblazer::Operation::Result.new(!finder.nil?, {})
26
20
 
27
- result.success?
28
- end
29
21
 
30
- class Builder
31
- def call(options, params)
32
- finder_class = options[:"finder.class"]
33
- entity = options[:"finder.entity"]
34
- action = options[:"finder.action"]
35
- action = :all unless %i[all single].include?(action)
36
-
37
- send("#{action}!", finder_class, entity, params, options[:"finder.action"])
38
- end
22
+ ctx[:"result.finder"].success?
23
+ end
39
24
 
40
- private
25
+ class Builder
26
+ def call(options, params)
27
+ finder_class = options[:"finder.class"]
28
+ entity = options[:"finder.entity"]
29
+ action = options[:"finder.action"]
30
+ action = :all unless %i[all single].include?(action)
41
31
 
42
- def all!(finder_class, entity, params, *)
43
- finder_class.new(entity: entity, params: params)
44
- end
32
+ send("#{action}!", finder_class, entity, params, options[:"finder.action"])
33
+ end
45
34
 
46
- def single!(finder_class, entity, params, *)
47
- apply_id(params)
48
- if entity.nil?
49
- finder_class.new(params: params).result.first
50
- else
51
- finder_class.new(entity: entity, params: params).result.first
52
- end
53
- end
35
+ private
54
36
 
55
- def apply_id(params)
56
- return if params[:id].nil?
37
+ def all!(finder_class, entity, params, *)
38
+ finder_class.new(entity: entity, params: params)
39
+ end
57
40
 
58
- params[:id_eq] = params[:id] unless params.key?("id")
41
+ def single!(finder_class, entity, params, *)
42
+ apply_id(params)
43
+ if entity.nil?
44
+ finder_class.new(params: params).result.first
45
+ else
46
+ finder_class.new(entity: entity, params: params).result.first
59
47
  end
60
48
  end
49
+
50
+ def apply_id(params)
51
+ return if params[:id].nil?
52
+ params[:id_eq] = params[:id] unless params.key?("id")
53
+ end
61
54
  end
62
55
  end
63
56
  end
data/spec/spec_helper.rb CHANGED
@@ -2,9 +2,13 @@
2
2
 
3
3
  require "bundler/setup"
4
4
  require "pry-byebug"
5
+ require "trailblazer/developer"
6
+ require "trailblazer/activity"
7
+ require "trailblazer/activity/testing"
5
8
 
6
9
  RSpec.configure do |config|
7
10
  config.expect_with(:rspec) { |c| c.syntax = :expect }
11
+ config.include Trailblazer::Activity::Testing::Assertions
8
12
  end
9
13
 
10
14
  require "trailblazer/finder"
@@ -9,16 +9,16 @@ Gem::Specification.new do |spec|
9
9
  spec.version = Trailblazer::Finder::VERSION
10
10
  spec.description = "Trailblazer Finder Objects"
11
11
  spec.summary = "Trailblazer based finder objects. It is designed to be used on its own as a separate gem. It was influenced by popular Ransack gem, but in addition to ActiveRecord, it can be used with Sequel, Hash objects, and RomRB."
12
- spec.authors = ["Nick Sutterer", "Marc Tich"]
13
- spec.email = ["apotonick@gmail.com", "marc@mudsu.com"]
12
+ spec.authors = ["Nick Sutterer", "Marc Tich", "Abdelkader Boudih"]
13
+ spec.email = ["apotonick@gmail.com", "marc@mudsu.com", "terminale@gmail.com"]
14
14
  spec.homepage = "http://trailblazer.to"
15
15
  spec.license = "LGPL-3.0"
16
16
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
17
  spec.test_files = spec.files.grep(%r{^(test)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_dependency "dry-types", "~> 0.14.1"
21
- spec.add_dependency "trailblazer-activity", "~> 0.7.1"
20
+ spec.add_dependency "dry-types"
21
+ spec.add_dependency "trailblazer-activity", ">= 0.10.0"
22
22
 
23
23
  spec.add_development_dependency "activerecord"
24
24
  spec.add_development_dependency "bundler"
@@ -33,10 +33,9 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "sequel"
34
34
  spec.add_development_dependency "simplecov"
35
35
  spec.add_development_dependency "sqlite3"
36
- spec.add_development_dependency "trailblazer", "~> 2.1.0.rc1", "< 2.1.0.rc11"
37
- spec.add_development_dependency "trailblazer-macro", "~> 2.1.0.rc1", "< 2.1.0.rc11"
38
- spec.add_development_dependency "trailblazer-operation", "~> 0.4.1"
36
+ spec.add_development_dependency "trailblazer", "~> 2.1.0"
39
37
  spec.add_development_dependency "will_paginate"
38
+ spec.add_development_dependency "trailblazer-developer"
40
39
 
41
40
  spec.required_ruby_version = ">= 2.3.8"
42
41
  end
metadata CHANGED
@@ -1,44 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-finder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  - Marc Tich
9
+ - Abdelkader Boudih
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2020-03-03 00:00:00.000000000 Z
13
+ date: 2020-03-09 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: dry-types
16
17
  requirement: !ruby/object:Gem::Requirement
17
18
  requirements:
18
- - - "~>"
19
+ - - ">="
19
20
  - !ruby/object:Gem::Version
20
- version: 0.14.1
21
+ version: '0'
21
22
  type: :runtime
22
23
  prerelease: false
23
24
  version_requirements: !ruby/object:Gem::Requirement
24
25
  requirements:
25
- - - "~>"
26
+ - - ">="
26
27
  - !ruby/object:Gem::Version
27
- version: 0.14.1
28
+ version: '0'
28
29
  - !ruby/object:Gem::Dependency
29
30
  name: trailblazer-activity
30
31
  requirement: !ruby/object:Gem::Requirement
31
32
  requirements:
32
- - - "~>"
33
+ - - ">="
33
34
  - !ruby/object:Gem::Version
34
- version: 0.7.1
35
+ version: 0.10.0
35
36
  type: :runtime
36
37
  prerelease: false
37
38
  version_requirements: !ruby/object:Gem::Requirement
38
39
  requirements:
39
- - - "~>"
40
+ - - ">="
40
41
  - !ruby/object:Gem::Version
41
- version: 0.7.1
42
+ version: 0.10.0
42
43
  - !ruby/object:Gem::Dependency
43
44
  name: activerecord
44
45
  requirement: !ruby/object:Gem::Requirement
@@ -227,56 +228,30 @@ dependencies:
227
228
  requirements:
228
229
  - - "~>"
229
230
  - !ruby/object:Gem::Version
230
- version: 2.1.0.rc1
231
- - - "<"
232
- - !ruby/object:Gem::Version
233
- version: 2.1.0.rc11
231
+ version: 2.1.0
234
232
  type: :development
235
233
  prerelease: false
236
234
  version_requirements: !ruby/object:Gem::Requirement
237
235
  requirements:
238
236
  - - "~>"
239
237
  - !ruby/object:Gem::Version
240
- version: 2.1.0.rc1
241
- - - "<"
242
- - !ruby/object:Gem::Version
243
- version: 2.1.0.rc11
238
+ version: 2.1.0
244
239
  - !ruby/object:Gem::Dependency
245
- name: trailblazer-macro
246
- requirement: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - "~>"
249
- - !ruby/object:Gem::Version
250
- version: 2.1.0.rc1
251
- - - "<"
252
- - !ruby/object:Gem::Version
253
- version: 2.1.0.rc11
254
- type: :development
255
- prerelease: false
256
- version_requirements: !ruby/object:Gem::Requirement
257
- requirements:
258
- - - "~>"
259
- - !ruby/object:Gem::Version
260
- version: 2.1.0.rc1
261
- - - "<"
262
- - !ruby/object:Gem::Version
263
- version: 2.1.0.rc11
264
- - !ruby/object:Gem::Dependency
265
- name: trailblazer-operation
240
+ name: will_paginate
266
241
  requirement: !ruby/object:Gem::Requirement
267
242
  requirements:
268
- - - "~>"
243
+ - - ">="
269
244
  - !ruby/object:Gem::Version
270
- version: 0.4.1
245
+ version: '0'
271
246
  type: :development
272
247
  prerelease: false
273
248
  version_requirements: !ruby/object:Gem::Requirement
274
249
  requirements:
275
- - - "~>"
250
+ - - ">="
276
251
  - !ruby/object:Gem::Version
277
- version: 0.4.1
252
+ version: '0'
278
253
  - !ruby/object:Gem::Dependency
279
- name: will_paginate
254
+ name: trailblazer-developer
280
255
  requirement: !ruby/object:Gem::Requirement
281
256
  requirements:
282
257
  - - ">="
@@ -293,12 +268,12 @@ description: Trailblazer Finder Objects
293
268
  email:
294
269
  - apotonick@gmail.com
295
270
  - marc@mudsu.com
271
+ - terminale@gmail.com
296
272
  executables: []
297
273
  extensions: []
298
274
  extra_rdoc_files: []
299
275
  files:
300
276
  - ".gitignore"
301
- - ".rubocop-https---raw-githubusercontent-com-trailblazer-meta-master-rubocop-yml"
302
277
  - ".rubocop.yml"
303
278
  - ".rubocop_todo.yml"
304
279
  - ".travis.yml"
@@ -310,19 +285,19 @@ files:
310
285
  - lib/trailblazer/finder.rb
311
286
  - lib/trailblazer/finder/activity/find.rb
312
287
  - lib/trailblazer/finder/activity/prepare.rb
313
- - lib/trailblazer/finder/activity/prepare/adapters.rb
314
- - lib/trailblazer/finder/activity/prepare/entity.rb
315
- - lib/trailblazer/finder/activity/prepare/filters.rb
316
- - lib/trailblazer/finder/activity/prepare/paging.rb
317
- - lib/trailblazer/finder/activity/prepare/params.rb
318
- - lib/trailblazer/finder/activity/prepare/properties.rb
319
- - lib/trailblazer/finder/activity/prepare/sorting.rb
288
+ - lib/trailblazer/finder/activity/prepare_adapters.rb
289
+ - lib/trailblazer/finder/activity/prepare_entity.rb
290
+ - lib/trailblazer/finder/activity/prepare_filters.rb
291
+ - lib/trailblazer/finder/activity/prepare_paging.rb
292
+ - lib/trailblazer/finder/activity/prepare_params.rb
293
+ - lib/trailblazer/finder/activity/prepare_properties.rb
294
+ - lib/trailblazer/finder/activity/prepare_sorting.rb
320
295
  - lib/trailblazer/finder/activity/process.rb
321
- - lib/trailblazer/finder/activity/process/adapters.rb
322
- - lib/trailblazer/finder/activity/process/filters.rb
323
- - lib/trailblazer/finder/activity/process/paging.rb
324
- - lib/trailblazer/finder/activity/process/predicates.rb
325
- - lib/trailblazer/finder/activity/process/sorting.rb
296
+ - lib/trailblazer/finder/activity/process_adapters.rb
297
+ - lib/trailblazer/finder/activity/process_filters.rb
298
+ - lib/trailblazer/finder/activity/process_paging.rb
299
+ - lib/trailblazer/finder/activity/process_predicates.rb
300
+ - lib/trailblazer/finder/activity/process_sorting.rb
326
301
  - lib/trailblazer/finder/adapters/active_record/paging.rb
327
302
  - lib/trailblazer/finder/adapters/active_record/predicates.rb
328
303
  - lib/trailblazer/finder/adapters/active_record/sorting.rb