trailblazer-finder 0.3.0 → 0.10.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 (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