trailblazer-finder 0.1.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop-https---raw-githubusercontent-com-trailblazer-meta-master-rubocop-yml +101 -0
  4. data/.rubocop.yml +3 -43
  5. data/.rubocop_todo.yml +42 -196
  6. data/.travis.yml +5 -8
  7. data/Gemfile +2 -2
  8. data/LICENSE.txt +7 -21
  9. data/README.md +177 -292
  10. data/Rakefile +12 -12
  11. data/lib/trailblazer/finder.rb +48 -23
  12. data/lib/trailblazer/finder/activity/find.rb +57 -0
  13. data/lib/trailblazer/finder/activity/prepare.rb +29 -0
  14. data/lib/trailblazer/finder/activity/prepare/adapters.rb +66 -0
  15. data/lib/trailblazer/finder/activity/prepare/entity.rb +32 -0
  16. data/lib/trailblazer/finder/activity/prepare/filters.rb +36 -0
  17. data/lib/trailblazer/finder/activity/prepare/paging.rb +49 -0
  18. data/lib/trailblazer/finder/activity/prepare/params.rb +33 -0
  19. data/lib/trailblazer/finder/activity/prepare/properties.rb +47 -0
  20. data/lib/trailblazer/finder/activity/prepare/sorting.rb +57 -0
  21. data/lib/trailblazer/finder/activity/process.rb +18 -0
  22. data/lib/trailblazer/finder/activity/process/adapters.rb +48 -0
  23. data/lib/trailblazer/finder/activity/process/filters.rb +28 -0
  24. data/lib/trailblazer/finder/activity/process/paging.rb +26 -0
  25. data/lib/trailblazer/finder/activity/process/predicates.rb +30 -0
  26. data/lib/trailblazer/finder/activity/process/sorting.rb +26 -0
  27. data/lib/trailblazer/finder/adapters/active_record/paging.rb +9 -8
  28. data/lib/trailblazer/finder/adapters/active_record/predicates.rb +78 -17
  29. data/lib/trailblazer/finder/adapters/active_record/sorting.rb +14 -12
  30. data/lib/trailblazer/finder/adapters/basic/paging.rb +21 -0
  31. data/lib/trailblazer/finder/adapters/basic/predicates.rb +115 -0
  32. data/lib/trailblazer/finder/adapters/basic/sorting.rb +40 -0
  33. data/lib/trailblazer/finder/adapters/kaminari/paging.rb +21 -0
  34. data/lib/trailblazer/finder/adapters/sequel/paging.rb +9 -8
  35. data/lib/trailblazer/finder/adapters/sequel/predicates.rb +78 -17
  36. data/lib/trailblazer/finder/adapters/sequel/sorting.rb +17 -15
  37. data/lib/trailblazer/finder/adapters/will_paginate/paging.rb +21 -0
  38. data/lib/trailblazer/finder/base.rb +20 -83
  39. data/lib/trailblazer/finder/dsl.rb +56 -0
  40. data/lib/trailblazer/finder/find.rb +28 -15
  41. data/lib/trailblazer/finder/helpers/basic.rb +44 -0
  42. data/lib/trailblazer/finder/helpers/sorting.rb +54 -0
  43. data/lib/trailblazer/finder/utils/array.rb +20 -0
  44. data/lib/trailblazer/finder/utils/extra.rb +10 -20
  45. data/lib/trailblazer/finder/utils/hash.rb +36 -0
  46. data/lib/trailblazer/finder/utils/splitter.rb +16 -17
  47. data/lib/trailblazer/finder/utils/string.rb +20 -10
  48. data/lib/trailblazer/finder/version.rb +3 -1
  49. data/lib/trailblazer/operation/finder.rb +20 -19
  50. data/spec/spec_helper.rb +5 -11
  51. data/spec/spec_helper_active_record.rb +11 -12
  52. data/spec/spec_helper_sequel.rb +4 -4
  53. data/spec/spec_helper_will_paginate.rb +13 -0
  54. data/spec/trailblazer/finder/adapters/active_record_spec.rb +267 -0
  55. data/spec/trailblazer/finder/adapters/basic_spec.rb +251 -0
  56. data/spec/trailblazer/finder/adapters/kaminari_spec.rb +78 -32
  57. data/spec/trailblazer/finder/adapters/sequel_spec.rb +267 -0
  58. data/spec/trailblazer/finder/adapters/will_paginate_spec.rb +81 -40
  59. data/spec/trailblazer/finder/base_spec.rb +292 -204
  60. data/spec/trailblazer/finder/dsl_spec.rb +213 -0
  61. data/spec/trailblazer/finder/utils/hash_spec.rb +26 -0
  62. data/spec/trailblazer/finder/utils/splitter_spec.rb +39 -0
  63. data/spec/trailblazer/finder/utils/string_spec.rb +52 -9
  64. data/spec/trailblazer/operation/finder_spec.rb +35 -32
  65. data/trailblazer-finder.gemspec +31 -30
  66. metadata +119 -137
  67. data/lib/trailblazer/finder/adapters.rb +0 -26
  68. data/lib/trailblazer/finder/adapters/active_record.rb +0 -32
  69. data/lib/trailblazer/finder/adapters/data_mapper.rb +0 -32
  70. data/lib/trailblazer/finder/adapters/data_mapper/paging.rb +0 -20
  71. data/lib/trailblazer/finder/adapters/data_mapper/predicates.rb +0 -42
  72. data/lib/trailblazer/finder/adapters/data_mapper/sorting.rb +0 -38
  73. data/lib/trailblazer/finder/adapters/friendly_id.rb +0 -31
  74. data/lib/trailblazer/finder/adapters/kaminari.rb +0 -18
  75. data/lib/trailblazer/finder/adapters/sequel.rb +0 -32
  76. data/lib/trailblazer/finder/adapters/will_paginate.rb +0 -18
  77. data/lib/trailblazer/finder/errors/block_ignored.rb +0 -11
  78. data/lib/trailblazer/finder/errors/invalid_defined_by_value.rb +0 -11
  79. data/lib/trailblazer/finder/errors/invalid_number.rb +0 -16
  80. data/lib/trailblazer/finder/errors/missing_entity_type.rb +0 -11
  81. data/lib/trailblazer/finder/errors/with_ignored.rb +0 -11
  82. data/lib/trailblazer/finder/features.rb +0 -23
  83. data/lib/trailblazer/finder/features/paging.rb +0 -55
  84. data/lib/trailblazer/finder/features/predicate.rb +0 -32
  85. data/lib/trailblazer/finder/features/sorting.rb +0 -108
  86. data/lib/trailblazer/finder/filter.rb +0 -66
  87. data/lib/trailblazer/finder/predicates.rb +0 -39
  88. data/lib/trailblazer/finder/utils/deep_locate.rb +0 -30
  89. data/lib/trailblazer/finder/utils/params.rb +0 -28
  90. data/lib/trailblazer/finder/utils/parse.rb +0 -25
  91. data/spec/spec_helper_data_mapper.rb +0 -35
  92. data/spec/support/paging_shared_example.rb +0 -65
  93. data/spec/support/sorting_shared_example.rb +0 -125
  94. data/spec/trailblazer/finder/adapters/active_record/base_spec.rb +0 -112
  95. data/spec/trailblazer/finder/adapters/active_record/paging_spec.rb +0 -64
  96. data/spec/trailblazer/finder/adapters/active_record/predicates_spec.rb +0 -101
  97. data/spec/trailblazer/finder/adapters/active_record/sorting_spec.rb +0 -99
  98. data/spec/trailblazer/finder/adapters/data_mapper/base_spec.rb +0 -112
  99. data/spec/trailblazer/finder/adapters/data_mapper/paging_spec.rb +0 -64
  100. data/spec/trailblazer/finder/adapters/data_mapper/predicates_spec.rb +0 -100
  101. data/spec/trailblazer/finder/adapters/data_mapper/sorting_spec.rb +0 -97
  102. data/spec/trailblazer/finder/adapters/friendly_id_spec.rb +0 -46
  103. data/spec/trailblazer/finder/adapters/sequel/base_spec.rb +0 -125
  104. data/spec/trailblazer/finder/adapters/sequel/paging_spec.rb +0 -64
  105. data/spec/trailblazer/finder/adapters/sequel/predicates_spec.rb +0 -89
  106. data/spec/trailblazer/finder/adapters/sequel/sorting_spec.rb +0 -110
  107. data/spec/trailblazer/finder/adapters_spec.rb +0 -110
  108. data/spec/trailblazer/finder/features/paging_spec.rb +0 -104
  109. data/spec/trailblazer/finder/features/predicates_spec.rb +0 -99
  110. data/spec/trailblazer/finder/features/sorting_spec.rb +0 -96
  111. data/spec/trailblazer/finder/features_spec.rb +0 -55
  112. data/spec/trailblazer/finder/filter_spec.rb +0 -133
  113. data/spec/trailblazer/finder/find_spec.rb +0 -72
  114. data/spec/trailblazer/finder/utils/extra_spec.rb +0 -41
  115. data/spec/trailblazer/finder/utils/params_spec.rb +0 -39
  116. data/spec/trailblazer/finder/utils/parse_spec.rb +0 -33
  117. data/spec/trailblazer/operation/paging_spec.rb +0 -68
  118. data/spec/trailblazer/operation/predicates_spec.rb +0 -127
  119. data/spec/trailblazer/operation/sorting_spec.rb +0 -80
  120. data/spec/trailblazer/test_spec.rb +0 -41
data/Rakefile CHANGED
@@ -1,29 +1,29 @@
1
- require 'bundler/gem_tasks'
2
- require 'rspec/core/rake_task'
3
- require 'rubocop/rake_task'
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require "rubocop/rake_task"
4
4
 
5
5
  RSpec::Core::RakeTask.new(:spec) do |t|
6
- t.rspec_opts = '--format documentation --format RspecJunitFormatter --out test-reports/spec.xml'
6
+ t.rspec_opts = "--format documentation --format RspecJunitFormatter --out test-reports/spec.xml"
7
7
  end
8
8
  RSpec::Core::RakeTask.new(:tests) do |t|
9
- t.rspec_opts = '--format progress --format documentation'
9
+ t.rspec_opts = "--format progress --format documentation"
10
10
  end
11
11
  RSpec::Core::RakeTask.new(:spec_report) do |t|
12
- t.rspec_opts = '--format html --out reports/rspec_results.html'
12
+ t.rspec_opts = "--format html --out reports/rspec_results.html"
13
13
  end
14
14
 
15
15
  RuboCop::RakeTask.new(:rubocop)
16
16
 
17
- desc 'Remove temporary files'
17
+ desc "Remove temporary files"
18
18
  task :clean do
19
- %x{rm -rf *.gem doc pkg coverage test-reports}
20
- %x{rm -f `find . -name '*.rbc'`}
19
+ `rm -rf *.gem doc pkg coverage test-reports`
20
+ %x(rm -f `find . -name '*.rbc'`)
21
21
  end
22
22
 
23
23
  desc "Build the gem"
24
24
  task :gem do
25
- %x{gem build trailblazer-finder.gemspec}
25
+ `gem build trailblazer-finder.gemspec`
26
26
  end
27
27
 
28
- desc 'Running Tests'
29
- task default: %i[clean spec rubocop]
28
+ desc "Running Tests"
29
+ task default: %i[spec]
@@ -1,32 +1,57 @@
1
- require 'trailblazer/finder/version'
2
- require 'trailblazer/finder/errors/block_ignored'
3
- require 'trailblazer/finder/errors/invalid_defined_by_value'
4
- require 'trailblazer/finder/errors/invalid_number'
5
- require 'trailblazer/finder/errors/missing_entity_type'
6
- require 'trailblazer/finder/errors/with_ignored'
7
- require 'trailblazer/finder'
8
- require 'trailblazer/finder/utils/params'
9
- require 'trailblazer/finder/utils/parse'
10
- require 'trailblazer/finder/utils/string'
11
- require 'trailblazer/finder/utils/extra'
12
- require 'trailblazer/finder/utils/splitter'
13
- require 'trailblazer/finder/utils/deep_locate'
14
- require 'trailblazer/finder/base'
15
- require 'trailblazer/finder/find'
16
- require 'trailblazer/finder/filter'
17
- require 'trailblazer/finder/features'
18
- require 'trailblazer/finder/adapters'
19
- require 'trailblazer/finder/predicates'
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+ require "trailblazer-activity"
5
+ require "dry-types"
6
+ require "ostruct"
7
+
8
+ require "trailblazer/finder/utils/array"
9
+ require "trailblazer/finder/utils/hash"
10
+ require "trailblazer/finder/utils/string"
11
+ require "trailblazer/finder/utils/splitter"
12
+ require "trailblazer/finder/utils/extra"
13
+ require "trailblazer/finder/adapters/active_record/predicates"
14
+ require "trailblazer/finder/adapters/active_record/paging"
15
+ require "trailblazer/finder/adapters/active_record/sorting"
16
+ require "trailblazer/finder/adapters/kaminari/paging"
17
+ require "trailblazer/finder/adapters/will_paginate/paging"
18
+ require "trailblazer/finder/adapters/sequel/predicates"
19
+ require "trailblazer/finder/adapters/sequel/paging"
20
+ require "trailblazer/finder/adapters/sequel/sorting"
21
+ require "trailblazer/finder/adapters/basic/predicates"
22
+ require "trailblazer/finder/adapters/basic/paging"
23
+ require "trailblazer/finder/adapters/basic/sorting"
24
+ require "trailblazer/finder/activity/prepare/entity"
25
+ require "trailblazer/finder/activity/prepare/properties"
26
+ require "trailblazer/finder/activity/prepare/filters"
27
+ require "trailblazer/finder/activity/prepare/params"
28
+ require "trailblazer/finder/activity/prepare/adapters"
29
+ require "trailblazer/finder/activity/prepare/paging"
30
+ require "trailblazer/finder/activity/prepare/sorting"
31
+ require "trailblazer/finder/activity/prepare"
32
+ require "trailblazer/finder/activity/process/adapters"
33
+ require "trailblazer/finder/activity/process/predicates"
34
+ require "trailblazer/finder/activity/process/paging"
35
+ require "trailblazer/finder/activity/process/sorting"
36
+ require "trailblazer/finder/activity/process/filters"
37
+ require "trailblazer/finder/activity/process"
38
+ require "trailblazer/finder/activity/find"
39
+ require "trailblazer/finder/helpers/basic"
40
+ require "trailblazer/finder/helpers/sorting"
41
+ require "trailblazer/finder/dsl"
42
+ require "trailblazer/finder/find"
43
+ require "trailblazer/finder/base"
20
44
 
21
45
  # :nocov:
22
- require 'trailblazer/operation/finder' if Gem.loaded_specs.key?('trailblazer')
46
+ require "trailblazer/operation/finder" if Gem.loaded_specs.key?("trailblazer")
23
47
  # :nocov:
24
48
 
25
49
  module Trailblazer
26
50
  class Finder
51
+ module Types
52
+ include Dry::Types.module
53
+ end
54
+
27
55
  include Base
28
- include Filter
29
- include Features
30
- include Adapters
31
56
  end
32
57
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ # Find Activity
7
+ module Find
8
+ PREDICATES = %w[eq not_eq blank not_blank lt lte gt gte sw not_sw ew not_ew cont not_cont].freeze
9
+
10
+ extend Trailblazer::Activity::Railway()
11
+
12
+ module_function
13
+
14
+ def fetch_filters(ctx, result, attribute)
15
+ filter_attribute = ctx[:filters][attribute]
16
+ result[:filter] = {}
17
+ result[:name] = attribute
18
+ result[:filter][:handler] = filter_attribute[:with] || filter_attribute[:block]
19
+ end
20
+
21
+ def fetch_properties(result, attribute, value, properties)
22
+ splitter = Utils::Splitter.new attribute, value
23
+ PREDICATES.each do |predicate|
24
+ next unless splitter.split_key predicate
25
+ next unless properties.include?(splitter.field.to_sym)
26
+
27
+ result[:name] = splitter.field
28
+ result[:predicate] = predicate
29
+ end
30
+ end
31
+
32
+ def process_params(ctx, **)
33
+ ctx[:params].each do |attribute, value|
34
+ result = {}
35
+
36
+ fetch_filters(ctx, result, attribute) || result if ctx[:filters].include?(attribute)
37
+ fetch_properties(result, attribute, value, ctx[:properties]) || result
38
+ next ctx[:params].delete(attribute) if result.empty?
39
+
40
+ ctx[:process] ||= {}
41
+ ctx[:process][attribute] = result.merge!(value: value)
42
+ end
43
+ true
44
+ end
45
+
46
+ def set_finder(ctx, **)
47
+ ctx[:finder] = Finder::Find.new(ctx[:entity], ctx[:params], ctx[:process], ctx[:paging], ctx[:sorting], ctx[:config])
48
+ end
49
+
50
+ step Subprocess(Prepare), id: :prepare_finder
51
+ step method(:process_params), id: :process_params
52
+ step Subprocess(Process), id: :process_finder
53
+ step method(:set_finder), id: :set_finder
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ # Prepare Activity
7
+ module Prepare
8
+ extend Trailblazer::Activity::Railway()
9
+
10
+ module_function
11
+
12
+ def clean_ctx((ctx, flow_options), **)
13
+ # ctx.delete(:config)
14
+ ctx.delete(:options)
15
+ [Trailblazer::Activity::Right, [ctx, flow_options]]
16
+ end
17
+
18
+ step Subprocess(Prepare::Adapters), id: :prepare_adapters
19
+ step Subprocess(Prepare::Entity), id: :prepare_entity
20
+ step Subprocess(Prepare::Properties), id: :prepare_properties
21
+ step Subprocess(Prepare::Filters), id: :prepare_filters
22
+ step Subprocess(Prepare::Params), id: :prepare_params
23
+ step Subprocess(Prepare::Paging), id: :prepare_paging
24
+ step Subprocess(Prepare::Sorting), id: :prepare_sorting
25
+ step method(:clean_ctx), id: :clean_ctx
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ module Prepare
7
+ # Adapters Activity
8
+ module Adapters
9
+ extend Trailblazer::Activity::Railway()
10
+
11
+ module_function
12
+
13
+ def check_for_adapters(ctx, **)
14
+ adapters = ctx[:config][:adapters]
15
+ return true if adapters.empty?
16
+
17
+ adapters.each do |adapter|
18
+ return true if Finder::Adapters.constants.include?(adapter.to_sym)
19
+ end
20
+ false
21
+ end
22
+
23
+ def validate_adapters(ctx, **)
24
+ adapters = ctx[:config][:adapters]
25
+ return true if adapters.empty?
26
+
27
+ adapters.each do |adapter|
28
+ if ORM_ADAPTERS.include?(adapter)
29
+ return false if (adapters & (ORM_ADAPTERS - [adapter])).any?
30
+ end
31
+ end
32
+ end
33
+
34
+ def invalid_adapters_error(ctx, **)
35
+ (ctx[:errors] ||= []) << {adapters: "One or more of the specified adapters are invalid"}
36
+ end
37
+
38
+ def multiple_orm_error(ctx, **)
39
+ (ctx[:errors] ||= []) << {adapters: "More then one ORM adapter specified"}
40
+ end
41
+
42
+ def set_adapters(ctx, **)
43
+ adapters = ctx[:config][:adapters]
44
+ ctx[:adapters] = (ORM_ADAPTERS & adapters).any? ? adapters : ["Basic"] + adapters
45
+ end
46
+
47
+ step method(:check_for_adapters),
48
+ Output(:success) => Track(:valid),
49
+ Output(:failure) => Track(:invalid_adapters)
50
+ step method(:validate_adapters), magnetic_to: [:valid],
51
+ Output(:success) => Track(:valid),
52
+ Output(:failure) => Track(:multiple_orm)
53
+ fail method(:invalid_adapters_error), magnetic_to: [:invalid_adapters],
54
+ Output(:success) => Track(:failure),
55
+ Output(:failure) => Track(:failure)
56
+ fail method(:multiple_orm_error), magnetic_to: [:multiple_orm],
57
+ Output(:success) => Track(:failure),
58
+ Output(:failure) => Track(:failure)
59
+ step method(:set_adapters), magnetic_to: [:valid],
60
+ Output(:success) => Track(:success),
61
+ Output(:failure) => Track(:failure)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ module Prepare
7
+ # Prepare Entity Activity
8
+ module Entity
9
+ extend Trailblazer::Activity::Railway()
10
+
11
+ module_function
12
+
13
+ def validate_entity(ctx, **)
14
+ ctx[:options][:entity] || ctx[:config][:entity]
15
+ end
16
+
17
+ def invalid_entity_error(ctx, **)
18
+ (ctx[:errors] ||= []) << {entity: "Invalid entity specified"}
19
+ end
20
+
21
+ def set_entity(ctx, **)
22
+ ctx[:entity] = ctx[:options][:entity] || instance_eval(&ctx[:config][:entity])
23
+ end
24
+
25
+ step method(:validate_entity), id: :validate_entity
26
+ fail method(:invalid_entity_error), id: :invalid_entity_error
27
+ step method(:set_entity), id: :set_entity
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ module Prepare
7
+ # Filters Activity
8
+ module Filters
9
+ extend Trailblazer::Activity::Railway()
10
+
11
+ module_function
12
+
13
+ def validate_filters(ctx, **)
14
+ filters = ctx[:config][:filters]
15
+ filters.each do |key, _value|
16
+ return false if !filters[key][:with].nil? && !filters[key][:with].is_a?(Symbol)
17
+ end
18
+ true
19
+ end
20
+
21
+ def invalid_filters_error(ctx, **)
22
+ (ctx[:errors] ||= []) << {filters: "One or more filters are missing a with method definition"}
23
+ end
24
+
25
+ def set_filters(ctx, **)
26
+ ctx[:filters] = ctx[:config][:filters]
27
+ end
28
+
29
+ step method(:validate_filters), id: :validate_filters
30
+ fail method(:invalid_filters_error), id: :invalid_filters_error
31
+ step method(:set_filters), id: :set_filters
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ module Prepare
7
+ # Paging Activity
8
+ module Paging
9
+ extend Trailblazer::Activity::Railway()
10
+
11
+ module_function
12
+
13
+ def check_paging(ctx, **)
14
+ paging = ctx[:config][:paging] || nil
15
+ return false if ctx[:config][:paging].empty? || paging.nil?
16
+
17
+ true
18
+ end
19
+
20
+ def set_paging(ctx, **)
21
+ ctx[:paging] = ctx[:config][:paging] || {}
22
+ ctx[:paging][:current_page] = ctx[:params][:page] || 1
23
+ return true unless ctx[:params][:per_page]
24
+
25
+ ctx[:paging][:per_page] = ctx[:params][:per_page].to_i || ctx[:paging][:per_page]
26
+ ctx[:paging][:per_page] = ctx[:paging][:max_per_page] if ctx[:params][:per_page] > ctx[:paging][:max_per_page]
27
+ ctx[:paging][:per_page] = ctx[:paging][:min_per_page] if ctx[:params][:per_page] < ctx[:paging][:min_per_page]
28
+ true
29
+ end
30
+
31
+ def clear_paging(ctx, **)
32
+ ctx[:params].delete(:page) unless ctx[:params][:page].nil?
33
+ true
34
+ end
35
+
36
+ step method(:check_paging), id: :check_paging,
37
+ Output(:success) => Track(:paging),
38
+ Output(:failure) => Track(:end_paging)
39
+ step method(:set_paging), id: :set_paging, magnetic_to: [:paging],
40
+ Output(:success) => Track(:end_paging),
41
+ Output(:failure) => Track(:failure)
42
+ step method(:clear_paging), id: :clear_paging, magnetic_to: [:end_paging],
43
+ Output(:success) => Track(:success),
44
+ Output(:failure) => Track(:failure)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ module Prepare
7
+ # Params Activity
8
+ module Params
9
+ extend Trailblazer::Activity::Railway()
10
+
11
+ module_function
12
+
13
+ def validate_params(_ctx, **)
14
+ # Should probably validate some things here at some point
15
+ true
16
+ end
17
+
18
+ def invalid_params_error(ctx, **)
19
+ # (ctx[:errors] ||= []) << {params: "One or more parameters are invalid"}
20
+ end
21
+
22
+ def set_params(ctx, **)
23
+ ctx[:params] = ctx[:options][:params] || {}
24
+ end
25
+
26
+ step method(:validate_params), id: :validate_params
27
+ fail method(:invalid_params_error), id: :invalid_params_error
28
+ step method(:set_params), id: :set_params
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trailblazer
4
+ class Finder
5
+ module Activity
6
+ module Prepare
7
+ # Prepare Properties Activity
8
+ module Properties
9
+ extend Trailblazer::Activity::Railway()
10
+
11
+ module_function
12
+
13
+ def check_property_types(ctx, **)
14
+ properties = ctx[:config][:properties] || {}
15
+ return true if properties.empty?
16
+
17
+ properties.each do |key, _value|
18
+ return !properties[key][:type].nil?
19
+ end
20
+ end
21
+
22
+ def validate_property_types(ctx, **)
23
+ properties = ctx[:config][:properties] || {}
24
+ return true if properties.empty?
25
+
26
+ properties.each do |key, _value|
27
+ return properties[key][:type].class.ancestors.include?(Dry::Types::Definition)
28
+ end
29
+ end
30
+
31
+ def invalid_properties_error(ctx, **)
32
+ (ctx[:errors] ||= []) << {properties: "One or more properties are missing a valid type"}
33
+ end
34
+
35
+ def set_properties(ctx, **)
36
+ ctx[:properties] = ctx[:config][:properties]
37
+ end
38
+
39
+ step method(:check_property_types), id: :check_property_types
40
+ step method(:validate_property_types), id: :validate_property_types
41
+ fail method(:invalid_properties_error), id: :invalid_properties_error
42
+ step method(:set_properties), id: :set_properties
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end