decouplio 1.0.0alpha

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 (136) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +53 -0
  3. data/.dockerignore +12 -0
  4. data/.gitignore +13 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +106 -0
  7. data/.rubocop_todo.yml +147 -0
  8. data/.ruby-version +1 -0
  9. data/.vscode/settings.json +3 -0
  10. data/Dockerfile +12 -0
  11. data/Gemfile +8 -0
  12. data/LICENSE +21 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +29 -0
  15. data/Rakefile +8 -0
  16. data/benchmarks/.ruby-version +1 -0
  17. data/benchmarks/Dockerfile +12 -0
  18. data/benchmarks/Gemfile +11 -0
  19. data/benchmarks/benchmarks.rb +527 -0
  20. data/bin/console +15 -0
  21. data/bin/setup +8 -0
  22. data/decouplio.gemspec +40 -0
  23. data/docker-compose.yml +18 -0
  24. data/docs/_config.yml +1 -0
  25. data/docs/benchmarks.md +1 -0
  26. data/docs/context.md +74 -0
  27. data/docs/context.rb +62 -0
  28. data/docs/doby.md +80 -0
  29. data/docs/doby.rb +38 -0
  30. data/docs/error_store.md +347 -0
  31. data/docs/error_store.rb +202 -0
  32. data/docs/fail.md +1016 -0
  33. data/docs/fail.rb +762 -0
  34. data/docs/index.md +25 -0
  35. data/docs/inner_action.md +63 -0
  36. data/docs/inner_action.rb +43 -0
  37. data/docs/logic_block.md +25 -0
  38. data/docs/octo.md +269 -0
  39. data/docs/octo.rb +164 -0
  40. data/docs/pass.md +309 -0
  41. data/docs/pass.rb +213 -0
  42. data/docs/quick_start.md +71 -0
  43. data/docs/quick_start.rb +38 -0
  44. data/docs/resq.md +263 -0
  45. data/docs/resq.rb +176 -0
  46. data/docs/step.md +737 -0
  47. data/docs/step.rb +526 -0
  48. data/docs/step_as_a_service.md +109 -0
  49. data/docs/step_as_a_service.rb +77 -0
  50. data/docs/wrap.md +232 -0
  51. data/docs/wrap.rb +137 -0
  52. data/lib/decouplio/action.rb +111 -0
  53. data/lib/decouplio/composer.rb +599 -0
  54. data/lib/decouplio/const/colors.rb +25 -0
  55. data/lib/decouplio/const/reserved_methods.rb +18 -0
  56. data/lib/decouplio/const/results.rb +13 -0
  57. data/lib/decouplio/const/types.rb +173 -0
  58. data/lib/decouplio/const/validations/action_option_class.rb +17 -0
  59. data/lib/decouplio/const/validations/common.rb +14 -0
  60. data/lib/decouplio/const/validations/fail.rb +34 -0
  61. data/lib/decouplio/const/validations/logic.rb +15 -0
  62. data/lib/decouplio/const/validations/octo.rb +44 -0
  63. data/lib/decouplio/const/validations/palp.rb +20 -0
  64. data/lib/decouplio/const/validations/pass.rb +32 -0
  65. data/lib/decouplio/const/validations/resq.rb +67 -0
  66. data/lib/decouplio/const/validations/step.rb +35 -0
  67. data/lib/decouplio/const/validations/wrap.rb +41 -0
  68. data/lib/decouplio/default_error_handler.rb +24 -0
  69. data/lib/decouplio/errors/action_class_error.rb +26 -0
  70. data/lib/decouplio/errors/base_error.rb +30 -0
  71. data/lib/decouplio/errors/error_store_error.rb +17 -0
  72. data/lib/decouplio/errors/extra_key_for_fail_error.rb +26 -0
  73. data/lib/decouplio/errors/extra_key_for_octo_error.rb +26 -0
  74. data/lib/decouplio/errors/extra_key_for_pass_error.rb +26 -0
  75. data/lib/decouplio/errors/extra_key_for_resq_error.rb +29 -0
  76. data/lib/decouplio/errors/extra_key_for_step_error.rb +23 -0
  77. data/lib/decouplio/errors/extra_key_for_wrap_error.rb +23 -0
  78. data/lib/decouplio/errors/fail_controversial_keys_error.rb +26 -0
  79. data/lib/decouplio/errors/fail_finish_him_error.rb +26 -0
  80. data/lib/decouplio/errors/fail_is_first_step_error.rb +18 -0
  81. data/lib/decouplio/errors/invalid_error_class_error.rb +29 -0
  82. data/lib/decouplio/errors/invalid_wrap_name_error.rb +23 -0
  83. data/lib/decouplio/errors/logic_is_not_defined_error.rb +23 -0
  84. data/lib/decouplio/errors/logic_redefinition_error.rb +23 -0
  85. data/lib/decouplio/errors/octo_block_is_not_defined_error.rb +18 -0
  86. data/lib/decouplio/errors/octo_controversial_keys_error.rb +26 -0
  87. data/lib/decouplio/errors/options_validation_error.rb +7 -0
  88. data/lib/decouplio/errors/palp_block_is_not_defined_error.rb +18 -0
  89. data/lib/decouplio/errors/palp_is_not_defined_error.rb +26 -0
  90. data/lib/decouplio/errors/palp_validation_error.rb +21 -0
  91. data/lib/decouplio/errors/pass_controversial_keys_error.rb +26 -0
  92. data/lib/decouplio/errors/pass_finish_him_error.rb +26 -0
  93. data/lib/decouplio/errors/required_options_is_missing_for_octo_error.rb +25 -0
  94. data/lib/decouplio/errors/resq_definition_error.rb +21 -0
  95. data/lib/decouplio/errors/resq_error_class_error.rb +29 -0
  96. data/lib/decouplio/errors/resq_handler_method_error.rb +26 -0
  97. data/lib/decouplio/errors/step_controversial_keys_error.rb +26 -0
  98. data/lib/decouplio/errors/step_finish_him_error.rb +26 -0
  99. data/lib/decouplio/errors/step_is_not_defined_for_fail_error.rb +26 -0
  100. data/lib/decouplio/errors/step_is_not_defined_for_step_error.rb +27 -0
  101. data/lib/decouplio/errors/step_is_not_defined_for_wrap_error.rb +26 -0
  102. data/lib/decouplio/errors/step_name_error.rb +20 -0
  103. data/lib/decouplio/errors/wrap_block_is_not_defined_error.rb +18 -0
  104. data/lib/decouplio/errors/wrap_controversial_keys_error.rb +26 -0
  105. data/lib/decouplio/errors/wrap_finish_him_error.rb +26 -0
  106. data/lib/decouplio/errors/wrap_klass_method_error.rb +23 -0
  107. data/lib/decouplio/flow.rb +17 -0
  108. data/lib/decouplio/logic_dsl.rb +96 -0
  109. data/lib/decouplio/octo_hash_case.rb +31 -0
  110. data/lib/decouplio/octo_options_validator.rb +89 -0
  111. data/lib/decouplio/options_validator.rb +566 -0
  112. data/lib/decouplio/processor.rb +20 -0
  113. data/lib/decouplio/steps/base_resq.rb +31 -0
  114. data/lib/decouplio/steps/base_step.rb +16 -0
  115. data/lib/decouplio/steps/doby.rb +32 -0
  116. data/lib/decouplio/steps/fail.rb +50 -0
  117. data/lib/decouplio/steps/if_condition_fail.rb +28 -0
  118. data/lib/decouplio/steps/if_condition_pass.rb +26 -0
  119. data/lib/decouplio/steps/inner_action_fail.rb +55 -0
  120. data/lib/decouplio/steps/inner_action_pass.rb +38 -0
  121. data/lib/decouplio/steps/inner_action_step.rb +51 -0
  122. data/lib/decouplio/steps/octo.rb +22 -0
  123. data/lib/decouplio/steps/pass.rb +35 -0
  124. data/lib/decouplio/steps/resq_fail.rb +10 -0
  125. data/lib/decouplio/steps/resq_pass.rb +10 -0
  126. data/lib/decouplio/steps/service_fail.rb +51 -0
  127. data/lib/decouplio/steps/service_pass.rb +36 -0
  128. data/lib/decouplio/steps/service_step.rb +47 -0
  129. data/lib/decouplio/steps/step.rb +43 -0
  130. data/lib/decouplio/steps/unless_condition_fail.rb +28 -0
  131. data/lib/decouplio/steps/unless_condition_pass.rb +26 -0
  132. data/lib/decouplio/steps/wrap.rb +62 -0
  133. data/lib/decouplio/validators/condition.rb +49 -0
  134. data/lib/decouplio/version.rb +5 -0
  135. data/lib/decouplio.rb +7 -0
  136. metadata +266 -0
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class Fail < BaseStep
8
+ def initialize(name:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @on_success_type = on_success_type
12
+ @on_failure_type = on_failure_type
13
+ end
14
+
15
+ def process(instance:)
16
+ instance.append_railway_flow(@name)
17
+ result = instance.send(@name, **instance.ctx)
18
+
19
+ resolve(result: result, instance: instance)
20
+ end
21
+
22
+ private
23
+
24
+ def resolve(result:, instance:)
25
+ if result
26
+ case @on_success_type
27
+ when Decouplio::Const::Results::PASS
28
+ instance.pass_action
29
+ Decouplio::Const::Results::PASS
30
+ when Decouplio::Const::Results::FAIL
31
+ instance.fail_action
32
+ Decouplio::Const::Results::PASS
33
+ when Decouplio::Const::Results::FINISH_HIM
34
+ instance.fail_action
35
+ Decouplio::Const::Results::FINISH_HIM
36
+ end
37
+ elsif @on_failure_type == Decouplio::Const::Results::PASS
38
+ instance.pass_action
39
+ Decouplio::Const::Results::FAIL
40
+ elsif @on_failure_type == Decouplio::Const::Results::FAIL
41
+ instance.fail_action
42
+ Decouplio::Const::Results::FAIL
43
+ elsif @on_failure_type == Decouplio::Const::Results::FINISH_HIM
44
+ instance.fail_action
45
+ Decouplio::Const::Results::FINISH_HIM
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class IfConditionFail < Decouplio::Steps::BaseStep
8
+ def initialize(name:)
9
+ super()
10
+ @name = name
11
+ end
12
+
13
+ def process(instance:)
14
+ result = instance.send(@name, **instance.ctx)
15
+
16
+ resolve(result: result, instance: instance)
17
+ end
18
+
19
+ private
20
+
21
+ def resolve(result:, instance:)
22
+ instance.fail_action
23
+
24
+ result ? Decouplio::Const::Results::PASS : Decouplio::Const::Results::FAIL
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class IfConditionPass < Decouplio::Steps::BaseStep
8
+ def initialize(name:)
9
+ super()
10
+ @name = name
11
+ end
12
+
13
+ def process(instance:)
14
+ result = instance.send(@name, **instance.ctx)
15
+
16
+ resolve(result: result)
17
+ end
18
+
19
+ private
20
+
21
+ def resolve(result:)
22
+ result ? Decouplio::Const::Results::PASS : Decouplio::Const::Results::FAIL
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class InnerActionFail < Decouplio::Steps::BaseStep
8
+ def initialize(name:, action:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @action = action
12
+ @on_success_type = on_success_type
13
+ @on_failure_type = on_failure_type
14
+ end
15
+
16
+ def process(instance:)
17
+ instance.append_railway_flow(@name)
18
+ outcome = @action.call(parent_ctx: instance.ctx, parent_railway_flow: instance.railway_flow)
19
+
20
+ resolve(outcome: outcome, instance: instance)
21
+ end
22
+
23
+ private
24
+
25
+ def resolve(outcome:, instance:)
26
+ result = outcome.success?
27
+
28
+ instance.error_store.merge(outcome.error_store)
29
+
30
+ if result
31
+ case @on_success_type
32
+ when Decouplio::Const::Results::PASS
33
+ instance.pass_action
34
+ Decouplio::Const::Results::PASS
35
+ when Decouplio::Const::Results::FAIL
36
+ instance.fail_action
37
+ Decouplio::Const::Results::PASS
38
+ when Decouplio::Const::Results::FINISH_HIM
39
+ instance.fail_action
40
+ Decouplio::Const::Results::FINISH_HIM
41
+ end
42
+ elsif @on_failure_type == Decouplio::Const::Results::PASS
43
+ instance.pass_action
44
+ Decouplio::Const::Results::FAIL
45
+ elsif @on_failure_type == Decouplio::Const::Results::FAIL
46
+ instance.fail_action
47
+ Decouplio::Const::Results::FAIL
48
+ elsif @on_failure_type == Decouplio::Const::Results::FINISH_HIM
49
+ instance.fail_action
50
+ Decouplio::Const::Results::FINISH_HIM
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class InnerActionPass < Decouplio::Steps::BaseStep
8
+ def initialize(name:, action:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @action = action
12
+ @on_success_type = on_success_type
13
+ @on_failure_type = on_failure_type
14
+ end
15
+
16
+ def process(instance:)
17
+ instance.append_railway_flow(@name)
18
+ outcome = @action.call(parent_ctx: instance.ctx, parent_railway_flow: instance.railway_flow)
19
+
20
+ resolve(outcome: outcome, instance: instance)
21
+ end
22
+
23
+ private
24
+
25
+ def resolve(outcome:, instance:)
26
+ instance.error_store.merge(outcome.error_store)
27
+
28
+ instance.pass_action
29
+
30
+ if @on_success_type == Decouplio::Const::Results::FINISH_HIM
31
+ Decouplio::Const::Results::FINISH_HIM
32
+ else
33
+ Decouplio::Const::Results::PASS
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class InnerActionStep < Decouplio::Steps::BaseStep
8
+ def initialize(name:, action:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @action = action
12
+ @on_success_type = on_success_type
13
+ @on_failure_type = on_failure_type
14
+ end
15
+
16
+ def process(instance:)
17
+ instance.append_railway_flow(@name)
18
+ outcome = @action.call(parent_ctx: instance.ctx, parent_railway_flow: instance.railway_flow)
19
+
20
+ resolve(outcome: outcome, instance: instance)
21
+ end
22
+
23
+ private
24
+
25
+ def resolve(outcome:, instance:)
26
+ result = outcome.success?
27
+
28
+ instance.error_store.merge(outcome.error_store)
29
+
30
+ if result
31
+ if [Decouplio::Const::Results::PASS, Decouplio::Const::Results::FAIL].include?(@on_success_type)
32
+ instance.pass_action
33
+ Decouplio::Const::Results::PASS
34
+ elsif @on_success_type == Decouplio::Const::Results::FINISH_HIM
35
+ instance.pass_action
36
+ Decouplio::Const::Results::FINISH_HIM
37
+ end
38
+ elsif @on_failure_type == Decouplio::Const::Results::PASS
39
+ instance.pass_action
40
+ Decouplio::Const::Results::FAIL
41
+ elsif @on_failure_type == Decouplio::Const::Results::FAIL
42
+ instance.fail_action
43
+ Decouplio::Const::Results::FAIL
44
+ elsif @on_failure_type == Decouplio::Const::Results::FINISH_HIM
45
+ instance.fail_action
46
+ Decouplio::Const::Results::FINISH_HIM
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class Octo < BaseStep
8
+ attr_accessor :hash_case
9
+
10
+ def initialize(name:, ctx_key:)
11
+ super()
12
+ @name = name
13
+ @ctx_key = ctx_key
14
+ end
15
+
16
+ def process(instance:)
17
+ instance.append_railway_flow(@name)
18
+ instance[@ctx_key]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class Pass < Decouplio::Steps::BaseStep
8
+ def initialize(name:, on_success_type:)
9
+ super()
10
+ @name = name
11
+ @on_success_type = on_success_type
12
+ end
13
+
14
+ def process(instance:)
15
+ instance.append_railway_flow(@name)
16
+ instance.send(@name, **instance.ctx)
17
+
18
+ resolve(instance: instance)
19
+ end
20
+
21
+ private
22
+
23
+ def resolve(instance:)
24
+ instance.pass_action
25
+
26
+ if @on_success_type == Decouplio::Const::Results::FINISH_HIM
27
+ Decouplio::Const::Results::FINISH_HIM
28
+ else
29
+ instance.pass_action
30
+ Decouplio::Const::Results::PASS
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_resq'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class ResqFail < BaseResq
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_resq'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class ResqPass < Decouplio::Steps::BaseResq
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class ServiceFail < Decouplio::Steps::BaseStep
8
+ def initialize(name:, service:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @service = service
12
+ @on_success_type = on_success_type
13
+ @on_failure_type = on_failure_type
14
+ end
15
+
16
+ def process(instance:)
17
+ instance.append_railway_flow(@name)
18
+ result = @service.call(ctx: instance.ctx)
19
+
20
+ resolve(result: result, instance: instance)
21
+ end
22
+
23
+ private
24
+
25
+ def resolve(result:, instance:)
26
+ if result
27
+ case @on_success_type
28
+ when Decouplio::Const::Results::PASS
29
+ instance.pass_action
30
+ Decouplio::Const::Results::PASS
31
+ when Decouplio::Const::Results::FAIL
32
+ instance.fail_action
33
+ Decouplio::Const::Results::PASS
34
+ when Decouplio::Const::Results::FINISH_HIM
35
+ instance.fail_action
36
+ Decouplio::Const::Results::FINISH_HIM
37
+ end
38
+ elsif @on_failure_type == Decouplio::Const::Results::PASS
39
+ instance.pass_action
40
+ Decouplio::Const::Results::FAIL
41
+ elsif @on_failure_type == Decouplio::Const::Results::FAIL
42
+ instance.fail_action
43
+ Decouplio::Const::Results::FAIL
44
+ elsif @on_failure_type == Decouplio::Const::Results::FINISH_HIM
45
+ instance.fail_action
46
+ Decouplio::Const::Results::FINISH_HIM
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class ServicePass < Decouplio::Steps::BaseStep
8
+ def initialize(name:, service:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @service = service
12
+ @on_success_type = on_success_type
13
+ @on_failure_type = on_failure_type
14
+ end
15
+
16
+ def process(instance:)
17
+ instance.append_railway_flow(@name)
18
+ @service.call(ctx: instance.ctx)
19
+
20
+ resolve(instance: instance)
21
+ end
22
+
23
+ private
24
+
25
+ def resolve(instance:)
26
+ instance.pass_action
27
+
28
+ if @on_success_type == Decouplio::Const::Results::FINISH_HIM
29
+ Decouplio::Const::Results::FINISH_HIM
30
+ else
31
+ Decouplio::Const::Results::PASS
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class ServiceStep < Decouplio::Steps::BaseStep
8
+ def initialize(name:, service:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @service = service
12
+ @on_success_type = on_success_type
13
+ @on_failure_type = on_failure_type
14
+ end
15
+
16
+ def process(instance:)
17
+ instance.append_railway_flow(@name)
18
+ result = @service.call(ctx: instance.ctx)
19
+
20
+ resolve(result: result, instance: instance)
21
+ end
22
+
23
+ private
24
+
25
+ def resolve(result:, instance:)
26
+ if result
27
+ if [Decouplio::Const::Results::PASS, Decouplio::Const::Results::FAIL].include?(@on_success_type)
28
+ instance.pass_action
29
+ Decouplio::Const::Results::PASS
30
+ elsif @on_success_type == Decouplio::Const::Results::FINISH_HIM
31
+ instance.pass_action
32
+ Decouplio::Const::Results::FINISH_HIM
33
+ end
34
+ elsif @on_failure_type == Decouplio::Const::Results::PASS
35
+ instance.pass_action
36
+ Decouplio::Const::Results::FAIL
37
+ elsif @on_failure_type == Decouplio::Const::Results::FAIL
38
+ instance.fail_action
39
+ Decouplio::Const::Results::FAIL
40
+ elsif @on_failure_type == Decouplio::Const::Results::FINISH_HIM
41
+ instance.fail_action
42
+ Decouplio::Const::Results::FINISH_HIM
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class Step < Decouplio::Steps::BaseStep
8
+ def initialize(name:, on_success_type:, on_failure_type:)
9
+ super()
10
+ @name = name
11
+ @on_success_type = on_success_type
12
+ @on_failure_type = on_failure_type
13
+ end
14
+
15
+ def process(instance:)
16
+ instance.append_railway_flow(@name)
17
+ result = instance.send(@name, **instance.ctx)
18
+ resolve(result: result, instance: instance)
19
+ end
20
+
21
+ def resolve(result:, instance:)
22
+ if result
23
+ if [Decouplio::Const::Results::PASS, Decouplio::Const::Results::FAIL].include?(@on_success_type)
24
+ instance.pass_action
25
+ Decouplio::Const::Results::PASS
26
+ elsif @on_success_type == Decouplio::Const::Results::FINISH_HIM
27
+ instance.pass_action
28
+ Decouplio::Const::Results::FINISH_HIM
29
+ end
30
+ elsif @on_failure_type == Decouplio::Const::Results::PASS
31
+ instance.pass_action
32
+ Decouplio::Const::Results::FAIL
33
+ elsif @on_failure_type == Decouplio::Const::Results::FAIL
34
+ instance.fail_action
35
+ Decouplio::Const::Results::FAIL
36
+ elsif @on_failure_type == Decouplio::Const::Results::FINISH_HIM
37
+ instance.fail_action
38
+ Decouplio::Const::Results::FINISH_HIM
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class UnlessConditionFail < Decouplio::Steps::BaseStep
8
+ def initialize(name:)
9
+ super()
10
+ @name = name
11
+ end
12
+
13
+ def process(instance:)
14
+ result = instance.send(@name, **instance.ctx)
15
+
16
+ resolve(result: result, instance: instance)
17
+ end
18
+
19
+ private
20
+
21
+ def resolve(result:, instance:)
22
+ instance.fail_action
23
+
24
+ result ? Decouplio::Const::Results::FAIL : Decouplio::Const::Results::PASS
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Steps
7
+ class UnlessConditionPass < Decouplio::Steps::BaseStep
8
+ def initialize(name:)
9
+ super()
10
+ @name = name
11
+ end
12
+
13
+ def process(instance:)
14
+ result = instance.send(@name, **instance.ctx)
15
+
16
+ resolve(result: result)
17
+ end
18
+
19
+ private
20
+
21
+ def resolve(result:)
22
+ result ? Decouplio::Const::Results::FAIL : Decouplio::Const::Results::PASS
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_step'
4
+ require_relative '../processor'
5
+
6
+ module Decouplio
7
+ module Steps
8
+ class Wrap < Decouplio::Steps::BaseStep
9
+ def initialize(name:, klass:, method:, wrap_flow:, on_success_type:, on_failure_type:)
10
+ super()
11
+ @name = name
12
+ @klass = klass
13
+ @method = method
14
+ @wrap_flow = wrap_flow
15
+ @on_success_type = on_success_type
16
+ @on_failure_type = on_failure_type
17
+ end
18
+
19
+ def process(instance:)
20
+ instance.append_railway_flow(@name)
21
+ if specific_wrap?
22
+ @klass.public_send(@method) do
23
+ Decouplio::Processor.call(instance: instance, **@wrap_flow)
24
+ end
25
+ else
26
+ Decouplio::Processor.call(instance: instance, **@wrap_flow)
27
+ end
28
+
29
+ resolve(instance: instance)
30
+ end
31
+
32
+ private
33
+
34
+ def specific_wrap?
35
+ @klass && @method
36
+ end
37
+
38
+ def resolve(instance:)
39
+ result = instance.success?
40
+
41
+ if result
42
+ if [Decouplio::Const::Results::PASS, Decouplio::Const::Results::FAIL].include?(@on_success_type)
43
+ instance.pass_action
44
+ Decouplio::Const::Results::PASS
45
+ elsif @on_success_type == Decouplio::Const::Results::FINISH_HIM
46
+ instance.pass_action
47
+ Decouplio::Const::Results::FINISH_HIM
48
+ end
49
+ elsif @on_failure_type == Decouplio::Const::Results::PASS
50
+ instance.pass_action
51
+ Decouplio::Const::Results::FAIL
52
+ elsif @on_failure_type == Decouplio::Const::Results::FAIL
53
+ instance.fail_action
54
+ Decouplio::Const::Results::FAIL
55
+ elsif @on_failure_type == Decouplio::Const::Results::FINISH_HIM
56
+ instance.fail_action
57
+ Decouplio::Const::Results::FINISH_HIM
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # require_relative 'base_step'
4
+
5
+ module Decouplio
6
+ module Validators
7
+ class Condition
8
+ ONE = 1 # lol
9
+
10
+ def self.validate(condition_options:, type:)
11
+ return if condition_options.size == ONE
12
+
13
+ case type
14
+ when Decouplio::Const::Types::STEP_TYPE,
15
+ Decouplio::Const::Types::RESQ_TYPE_STEP,
16
+ Decouplio::Const::Types::ACTION_TYPE_STEP
17
+ raise Decouplio::Errors::StepControversialKeysError.new(
18
+ errored_option: condition_options.to_s,
19
+ details: %i[if unless]
20
+ )
21
+ when Decouplio::Const::Types::FAIL_TYPE,
22
+ Decouplio::Const::Types::RESQ_TYPE_FAIL,
23
+ Decouplio::Const::Types::ACTION_TYPE_FAIL
24
+ raise Decouplio::Errors::FailControversialKeysError.new(
25
+ errored_option: condition_options.to_s,
26
+ details: %i[if unless]
27
+ )
28
+ when Decouplio::Const::Types::PASS_TYPE,
29
+ Decouplio::Const::Types::RESQ_TYPE_PASS,
30
+ Decouplio::Const::Types::ACTION_TYPE_PASS
31
+ raise Decouplio::Errors::PassControversialKeysError.new(
32
+ errored_option: condition_options.to_s,
33
+ details: %i[if unless]
34
+ )
35
+ when Decouplio::Const::Types::OCTO_TYPE
36
+ raise Decouplio::Errors::OctoControversialKeysError.new(
37
+ errored_option: condition_options.to_s,
38
+ details: %i[if unless]
39
+ )
40
+ when Decouplio::Const::Types::WRAP_TYPE
41
+ raise Decouplio::Errors::WrapControversialKeysError.new(
42
+ errored_option: condition_options.to_s,
43
+ details: %i[if unless]
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decouplio
4
+ VERSION = '1.0.0alpha'
5
+ end