decouplio 1.0.0alpha7 → 1.0.0rc

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +313 -15
  3. data/decouplio.gemspec +8 -2
  4. data/lib/decouplio/action.rb +34 -74
  5. data/lib/decouplio/action_state_printer.rb +34 -0
  6. data/lib/decouplio/const/flows.rb +59 -0
  7. data/lib/decouplio/const/reserved_methods.rb +6 -13
  8. data/lib/decouplio/const/types.rb +1 -165
  9. data/lib/decouplio/const/validations/common.rb +10 -0
  10. data/lib/decouplio/const/validations/octo.rb +16 -0
  11. data/lib/decouplio/const/validations/resq.rb +12 -1
  12. data/lib/decouplio/ctx.rb +13 -0
  13. data/lib/decouplio/default_meta_store.rb +37 -0
  14. data/lib/decouplio/errors/action_class_error.rb +0 -3
  15. data/lib/decouplio/errors/base_error.rb +0 -3
  16. data/lib/decouplio/errors/execution_error.rb +0 -2
  17. data/lib/decouplio/errors/extra_key_for_pass_error.rb +0 -3
  18. data/lib/decouplio/errors/fail_can_not_be_first_step_error.rb +0 -3
  19. data/lib/decouplio/errors/fail_controversial_keys_error.rb +0 -3
  20. data/lib/decouplio/errors/fail_finish_him_error.rb +0 -3
  21. data/lib/decouplio/errors/invalid_error_class_error.rb +0 -3
  22. data/lib/decouplio/errors/invalid_options_for_resq_step.rb +18 -0
  23. data/lib/decouplio/errors/invalid_wrap_name_error.rb +0 -3
  24. data/lib/decouplio/errors/logic_is_not_defined_error.rb +0 -3
  25. data/lib/decouplio/errors/logic_redefinition_error.rb +0 -3
  26. data/lib/decouplio/errors/octo_block_is_not_defined_error.rb +0 -3
  27. data/lib/decouplio/errors/octo_case_is_not_defined_error.rb +19 -0
  28. data/lib/decouplio/errors/octo_controversial_keys_error.rb +0 -3
  29. data/lib/decouplio/errors/{error_store_error.rb → octo_finish_him_is_not_allowed_error.rb} +2 -4
  30. data/lib/decouplio/errors/options_validation_error.rb +13 -1
  31. data/lib/decouplio/errors/palp_block_is_not_defined_error.rb +0 -3
  32. data/lib/decouplio/errors/palp_validation_error.rb +0 -3
  33. data/lib/decouplio/errors/pass_controversial_keys_error.rb +0 -3
  34. data/lib/decouplio/errors/pass_finish_him_error.rb +0 -3
  35. data/lib/decouplio/errors/required_options_is_missing_for_octo_error.rb +0 -3
  36. data/lib/decouplio/errors/resq_definition_error.rb +0 -3
  37. data/lib/decouplio/errors/resq_error_class_error.rb +0 -3
  38. data/lib/decouplio/errors/resq_handler_method_error.rb +0 -3
  39. data/lib/decouplio/errors/step_controversial_keys_error.rb +0 -3
  40. data/lib/decouplio/errors/step_definition_error.rb +17 -0
  41. data/lib/decouplio/errors/step_finish_him_error.rb +0 -3
  42. data/lib/decouplio/errors/step_is_not_defined_for_fail_error.rb +0 -3
  43. data/lib/decouplio/errors/step_is_not_defined_for_pass_error.rb +0 -4
  44. data/lib/decouplio/errors/step_is_not_defined_for_step_error.rb +0 -4
  45. data/lib/decouplio/errors/step_is_not_defined_for_wrap_error.rb +0 -3
  46. data/lib/decouplio/errors/step_name_error.rb +0 -3
  47. data/lib/decouplio/errors/wrap_block_is_not_defined_error.rb +0 -3
  48. data/lib/decouplio/errors/wrap_controversial_keys_error.rb +0 -3
  49. data/lib/decouplio/errors/wrap_finish_him_error.rb +0 -3
  50. data/lib/decouplio/errors/wrap_klass_method_error.rb +0 -3
  51. data/lib/decouplio/graph.rb +9 -0
  52. data/lib/decouplio/logic_dsl.rb +337 -107
  53. data/lib/decouplio/new_flow.rb +283 -0
  54. data/lib/decouplio/octo_hash_case.rb +20 -5
  55. data/lib/decouplio/octo_options_validator.rb +10 -64
  56. data/lib/decouplio/step_validator.rb +200 -0
  57. data/lib/decouplio/steps/base_condition.rb +21 -0
  58. data/lib/decouplio/steps/base_if_condition.rb +11 -0
  59. data/lib/decouplio/steps/base_inner_action.rb +42 -0
  60. data/lib/decouplio/steps/base_octo.rb +26 -0
  61. data/lib/decouplio/steps/base_resq.rb +25 -28
  62. data/lib/decouplio/steps/base_resq_with_mapping.rb +34 -0
  63. data/lib/decouplio/steps/base_service_step.rb +39 -0
  64. data/lib/decouplio/steps/base_step.rb +33 -6
  65. data/lib/decouplio/steps/base_unless_condition.rb +11 -0
  66. data/lib/decouplio/steps/base_wrap.rb +27 -0
  67. data/lib/decouplio/steps/fail.rb +1 -28
  68. data/lib/decouplio/steps/if_condition_fail.rb +1 -21
  69. data/lib/decouplio/steps/if_condition_pass.rb +1 -19
  70. data/lib/decouplio/steps/inner_action_fail.rb +1 -33
  71. data/lib/decouplio/steps/inner_action_pass.rb +12 -30
  72. data/lib/decouplio/steps/inner_action_step.rb +1 -33
  73. data/lib/decouplio/steps/octo_by_key.rb +31 -0
  74. data/lib/decouplio/steps/octo_by_method.rb +31 -0
  75. data/lib/decouplio/steps/pass.rb +5 -26
  76. data/lib/decouplio/steps/resq_fail.rb +0 -2
  77. data/lib/decouplio/steps/resq_pass.rb +1 -3
  78. data/lib/decouplio/steps/resq_with_mapping_fail.rb +8 -0
  79. data/lib/decouplio/steps/resq_with_mapping_pass.rb +8 -0
  80. data/lib/decouplio/steps/service_as_fail.rb +8 -0
  81. data/lib/decouplio/steps/service_as_pass.rb +16 -0
  82. data/lib/decouplio/steps/service_as_step.rb +8 -0
  83. data/lib/decouplio/steps/step.rb +0 -24
  84. data/lib/decouplio/steps/unless_condition_fail.rb +1 -21
  85. data/lib/decouplio/steps/unless_condition_pass.rb +1 -19
  86. data/lib/decouplio/steps/wrap.rb +25 -37
  87. data/lib/decouplio/steps/wrap_with_class.rb +43 -0
  88. data/lib/decouplio/steps/wrap_with_class_method.rb +45 -0
  89. data/lib/decouplio/utils/prepare_resq_mappings.rb +17 -0
  90. data/lib/decouplio/version.rb +1 -1
  91. data/lib/decouplio.rb +93 -0
  92. metadata +32 -55
  93. data/.circleci/config.yml +0 -63
  94. data/.dockerignore +0 -12
  95. data/.gitignore +0 -13
  96. data/.rspec +0 -3
  97. data/.rubocop.yml +0 -116
  98. data/.rubocop_todo.yml +0 -147
  99. data/.ruby-version +0 -1
  100. data/.vscode/settings.json +0 -3
  101. data/Dockerfile +0 -12
  102. data/Gemfile +0 -8
  103. data/benchmarks/.ruby-version +0 -1
  104. data/benchmarks/Dockerfile +0 -12
  105. data/benchmarks/Gemfile +0 -12
  106. data/benchmarks/multi_step_benchmark.rb +0 -336
  107. data/benchmarks/single_step_benchmark.rb +0 -159
  108. data/bin/console +0 -15
  109. data/bin/setup +0 -8
  110. data/docker-compose.yml +0 -29
  111. data/lib/decouplio/composer.rb +0 -691
  112. data/lib/decouplio/const/colors.rb +0 -25
  113. data/lib/decouplio/const/doby_aide_options.rb +0 -16
  114. data/lib/decouplio/const/results.rb +0 -15
  115. data/lib/decouplio/const/step_options.rb +0 -16
  116. data/lib/decouplio/const/validations/aide.rb +0 -38
  117. data/lib/decouplio/const/validations/doby.rb +0 -36
  118. data/lib/decouplio/default_error_handler.rb +0 -39
  119. data/lib/decouplio/errors/aide_can_not_be_first_step_error.rb +0 -18
  120. data/lib/decouplio/errors/aide_controversial_keys_error.rb +0 -26
  121. data/lib/decouplio/errors/aide_finish_him_error.rb +0 -26
  122. data/lib/decouplio/errors/doby_controversial_keys_error.rb +0 -26
  123. data/lib/decouplio/errors/doby_finish_him_error.rb +0 -26
  124. data/lib/decouplio/errors/extra_key_for_fail_error.rb +0 -26
  125. data/lib/decouplio/errors/extra_key_for_octo_error.rb +0 -26
  126. data/lib/decouplio/errors/extra_key_for_resq_error.rb +0 -29
  127. data/lib/decouplio/errors/extra_key_for_step_error.rb +0 -23
  128. data/lib/decouplio/errors/extra_key_for_wrap_error.rb +0 -23
  129. data/lib/decouplio/errors/palp_is_not_defined_error.rb +0 -26
  130. data/lib/decouplio/errors/step_is_not_defined_for_aide_error.rb +0 -26
  131. data/lib/decouplio/errors/step_is_not_defined_for_doby_error.rb +0 -27
  132. data/lib/decouplio/flow.rb +0 -17
  133. data/lib/decouplio/options_validator.rb +0 -716
  134. data/lib/decouplio/processor.rb +0 -20
  135. data/lib/decouplio/steps/aide.rb +0 -37
  136. data/lib/decouplio/steps/doby.rb +0 -37
  137. data/lib/decouplio/steps/octo.rb +0 -27
  138. data/lib/decouplio/steps/service_fail.rb +0 -41
  139. data/lib/decouplio/steps/service_pass.rb +0 -41
  140. data/lib/decouplio/steps/service_step.rb +0 -41
  141. data/lib/decouplio/steps/shared/fail_resolver.rb +0 -40
  142. data/lib/decouplio/steps/shared/step_resolver.rb +0 -43
  143. data/lib/decouplio/validators/condition.rb +0 -59
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base_error'
4
- require_relative '../const/validations/common'
5
-
6
3
  module Decouplio
7
4
  module Errors
8
5
  class StepNameError < Decouplio::Errors::BaseError
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base_error'
4
- require_relative '../const/validations/wrap'
5
-
6
3
  module Decouplio
7
4
  module Errors
8
5
  class WrapBlockIsNotDefinedError < Decouplio::Errors::BaseError
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base_error'
4
- require_relative '../const/validations/wrap'
5
-
6
3
  module Decouplio
7
4
  module Errors
8
5
  class WrapControversialKeysError < Decouplio::Errors::BaseError
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base_error'
4
- require_relative '../const/validations/wrap'
5
-
6
3
  module Decouplio
7
4
  module Errors
8
5
  class WrapFinishHimError < Decouplio::Errors::BaseError
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base_error'
4
- require_relative '../const/validations/wrap'
5
-
6
3
  module Decouplio
7
4
  module Errors
8
5
  class WrapKlassMethodError < Decouplio::Errors::BaseError
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decouplio
4
+ class Graph
5
+ def initialize
6
+ @edges = {}
7
+ end
8
+ end
9
+ end
@@ -1,25 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'flow'
4
- require_relative 'const/types'
5
- require_relative 'const/doby_aide_options'
6
- require_relative 'const/step_options'
7
- require_relative 'octo_hash_case'
8
- require_relative 'errors/options_validation_error'
9
- require_relative 'errors/palp_validation_error'
10
- require_relative 'errors/resq_definition_error'
11
- require_relative 'errors/wrap_block_is_not_defined_error'
12
- require_relative 'errors/palp_block_is_not_defined_error'
13
- require_relative 'errors/fail_can_not_be_first_step_error'
14
- require_relative 'errors/aide_can_not_be_first_step_error'
15
- require_relative 'errors/octo_block_is_not_defined_error'
16
-
17
3
  module Decouplio
18
4
  class LogicDsl
19
- DEFAULT_WRAP_NAME = 'wrap'
20
-
21
5
  class << self
22
- attr_reader :steps, :palps
6
+ attr_reader :steps
23
7
 
24
8
  def inherited(subclass)
25
9
  subclass.init_steps
@@ -27,64 +11,199 @@ module Decouplio
27
11
 
28
12
  def init_steps
29
13
  @steps = []
30
- @palps = {}
31
14
  end
32
15
 
33
16
  def step(stp, **options)
34
- if stp.is_a?(Class) && !(stp < Decouplio::Action)
35
- step_options = {}
17
+ if_condition = options.delete(:if)
18
+ unless_condition = options.delete(:unless)
36
19
 
37
- options.each_key do |key|
38
- step_options[key] = options.delete(key) if Decouplio::Const::StepOptions::ALLOWED.include?(key)
39
- end
20
+ if if_condition && unless_condition
21
+ raise Decouplio::Errors::StepControversialKeysError.new(
22
+ errored_option: { if: if_condition, unless: unless_condition },
23
+ details: %i[if unless]
24
+ )
25
+ end
40
26
 
41
- @steps << {
42
- type: Decouplio::Const::Types::STEP_TYPE,
43
- name: stp,
44
- _args: options,
45
- **step_options
46
- }
27
+ if if_condition
28
+ @steps << Decouplio::Steps::IfConditionPass.new(
29
+ if_condition
30
+ )
31
+ end
32
+ if unless_condition
33
+ @steps << Decouplio::Steps::UnlessConditionPass.new(
34
+ unless_condition
35
+ )
36
+ end
37
+
38
+ if stp.is_a?(Class)
39
+ if stp < Decouplio::Action
40
+ @steps << Decouplio::Steps::InnerActionStep.new(
41
+ stp.name.to_sym,
42
+ stp,
43
+ options.delete(:on_success),
44
+ options.delete(:on_failure),
45
+ options.delete(:on_error),
46
+ options.delete(:finish_him)
47
+ )
48
+ elsif stp.respond_to?(:call)
49
+ @steps << Decouplio::Steps::ServiceAsStep.new(
50
+ stp.name.to_sym,
51
+ stp,
52
+ options.delete(:on_success),
53
+ options.delete(:on_failure),
54
+ options.delete(:on_error),
55
+ options.delete(:finish_him),
56
+ options
57
+ )
58
+ else
59
+ raise Decouplio::Errors::ActionClassError.new(
60
+ step_type: :step,
61
+ errored_option: "step #{stp}"
62
+ )
63
+ end
47
64
  else
48
- @steps << options.merge(type: Decouplio::Const::Types::STEP_TYPE, name: stp)
65
+ @steps << Decouplio::Steps::Step.new(
66
+ stp,
67
+ options.delete(:on_success),
68
+ options.delete(:on_failure),
69
+ options.delete(:on_error),
70
+ options.delete(:finish_him)
71
+ )
49
72
  end
50
73
  end
51
74
 
52
75
  def fail(stp, **options)
53
76
  raise Decouplio::Errors::FailCanNotBeFirstStepError if @steps.empty?
54
77
 
55
- if stp.is_a?(Class) && !(stp < Decouplio::Action)
56
- step_options = {}
57
- options.each_key do |key|
58
- step_options[key] = options.delete(key) if Decouplio::Const::StepOptions::ALLOWED.include?(key)
59
- end
78
+ if_condition = options.delete(:if)
79
+ unless_condition = options.delete(:unless)
80
+
81
+ if if_condition && unless_condition
82
+ raise Decouplio::Errors::FailControversialKeysError.new(
83
+ errored_option: { if: if_condition, unless: unless_condition },
84
+ details: %i[if unless]
85
+ )
86
+ end
60
87
 
61
- @steps << {
62
- type: Decouplio::Const::Types::FAIL_TYPE,
63
- name: stp,
64
- _args: options,
65
- **step_options
66
- }
88
+ if if_condition
89
+ @steps << Decouplio::Steps::IfConditionFail.new(
90
+ if_condition
91
+ )
92
+ end
93
+ if unless_condition
94
+ @steps << Decouplio::Steps::UnlessConditionFail.new(
95
+ unless_condition
96
+ )
97
+ end
98
+
99
+ if stp.is_a?(Class)
100
+ if stp < Decouplio::Action
101
+ @steps << Decouplio::Steps::InnerActionFail.new(
102
+ stp.name.to_sym,
103
+ stp,
104
+ options.delete(:on_success),
105
+ options.delete(:on_failure),
106
+ options.delete(:on_error),
107
+ options.delete(:finish_him)
108
+ )
109
+ elsif stp.respond_to?(:call)
110
+ @steps << Decouplio::Steps::ServiceAsFail.new(
111
+ stp.name.to_sym,
112
+ stp,
113
+ options.delete(:on_success),
114
+ options.delete(:on_failure),
115
+ options.delete(:on_error),
116
+ options.delete(:finish_him),
117
+ options
118
+ )
119
+ else
120
+ raise Decouplio::Errors::ActionClassError.new(
121
+ step_type: :fail,
122
+ errored_option: "fail #{stp}"
123
+ )
124
+ end
67
125
  else
68
- @steps << options.merge(type: Decouplio::Const::Types::FAIL_TYPE, name: stp)
126
+ @steps << Decouplio::Steps::Fail.new(
127
+ stp,
128
+ options.delete(:on_success),
129
+ options.delete(:on_failure),
130
+ options.delete(:on_error),
131
+ options.delete(:finish_him)
132
+ )
69
133
  end
70
134
  end
71
135
 
72
136
  def pass(stp, **options)
73
- if stp.is_a?(Class) && !(stp < Decouplio::Action)
74
- step_options = {}
137
+ on_success = options.delete(:on_success)
138
+ on_failure = options.delete(:on_failure)
75
139
 
76
- options.each_key do |key|
77
- step_options[key] = options.delete(key) if Decouplio::Const::StepOptions::ALLOWED.include?(key)
78
- end
140
+ if on_success
141
+ raise Decouplio::Errors::ExtraKeyForPassError.new(
142
+ errored_option: { on_success: on_success },
143
+ details: :on_success
144
+ )
145
+ elsif on_failure
146
+ raise Decouplio::Errors::ExtraKeyForPassError.new(
147
+ errored_option: { on_failure: on_failure },
148
+ details: :on_failure
149
+ )
150
+ end
151
+
152
+ if_condition = options.delete(:if)
153
+ unless_condition = options.delete(:unless)
154
+
155
+ if if_condition && unless_condition
156
+ raise Decouplio::Errors::PassControversialKeysError.new(
157
+ errored_option: { if: if_condition, unless: unless_condition },
158
+ details: %i[if unless]
159
+ )
160
+ end
161
+
162
+ if if_condition
163
+ @steps << Decouplio::Steps::IfConditionPass.new(
164
+ if_condition
165
+ )
166
+ end
167
+ if unless_condition
168
+ @steps << Decouplio::Steps::UnlessConditionPass.new(
169
+ unless_condition
170
+ )
171
+ end
79
172
 
80
- @steps << {
81
- type: Decouplio::Const::Types::PASS_TYPE,
82
- name: stp,
83
- _args: options,
84
- **step_options
85
- }
173
+ if stp.is_a?(Class)
174
+ if stp < Decouplio::Action
175
+ @steps << Decouplio::Steps::InnerActionPass.new(
176
+ stp.name.to_sym,
177
+ stp,
178
+ nil,
179
+ nil,
180
+ options.delete(:on_error),
181
+ options.delete(:finish_him)
182
+ )
183
+ elsif stp.respond_to?(:call)
184
+ @steps << Decouplio::Steps::ServiceAsPass.new(
185
+ stp.name.to_sym,
186
+ stp,
187
+ nil,
188
+ nil,
189
+ options.delete(:on_error),
190
+ options.delete(:finish_him),
191
+ options
192
+ )
193
+ else
194
+ raise Decouplio::Errors::ActionClassError.new(
195
+ step_type: :pass,
196
+ errored_option: "pass #{stp}"
197
+ )
198
+ end
86
199
  else
87
- @steps << options.merge(type: Decouplio::Const::Types::PASS_TYPE, name: stp)
200
+ @steps << Decouplio::Steps::Pass.new(
201
+ stp,
202
+ nil,
203
+ nil,
204
+ options.delete(:on_error),
205
+ options.delete(:finish_him)
206
+ )
88
207
  end
89
208
  end
90
209
 
@@ -95,77 +214,188 @@ module Decouplio
95
214
 
96
215
  raise Decouplio::Errors::OctoBlockIsNotDefinedError if hash_case.empty?
97
216
 
98
- options[:hash_case] = hash_case
99
- @steps << options.merge(type: Decouplio::Const::Types::OCTO_TYPE, name: octo_name)
100
- end
217
+ if_condition = options.delete(:if)
218
+ unless_condition = options.delete(:unless)
101
219
 
102
- def palp(palp_name, **options, &block)
103
- raise Decouplio::Errors::PalpBlockIsNotDefinedError unless block_given?
220
+ if if_condition && unless_condition
221
+ raise Decouplio::Errors::OctoControversialKeysError.new(
222
+ errored_option: { if: if_condition, unless: unless_condition },
223
+ details: %i[if unless]
224
+ )
225
+ end
104
226
 
105
- options.empty? || raise(Decouplio::Errors::PalpValidationError)
227
+ if if_condition
228
+ @steps << Decouplio::Steps::IfConditionPass.new(
229
+ if_condition
230
+ )
231
+ end
232
+ if unless_condition
233
+ @steps << Decouplio::Steps::UnlessConditionPass.new(
234
+ unless_condition
235
+ )
236
+ end
106
237
 
107
- @palps[palp_name] = Class.new(self, &block)
238
+ by_method = options.delete(:method)
239
+ by_key = options.delete(:ctx_key)
240
+ finish_him = options.delete(:finish_him)
241
+ on_success = options.delete(:on_success)
242
+ on_failure = options.delete(:on_failure)
243
+ on_error = options.delete(:on_error)
244
+
245
+ raise Decouplio::Errors::OctoFinishHimIsNotAllowedError if finish_him
246
+
247
+ if by_key && by_method
248
+ raise Decouplio::Errors::OctoControversialKeysError.new(
249
+ errored_option: { ctx_key: by_key, method: by_method },
250
+ details: %i[ctx_key method]
251
+ )
252
+ end
253
+
254
+ if by_method
255
+ @steps << Decouplio::Steps::OctoByMethod.new(
256
+ octo_name,
257
+ by_method,
258
+ hash_case,
259
+ on_success,
260
+ on_failure,
261
+ on_error,
262
+ finish_him
263
+ )
264
+ elsif by_key
265
+ @steps << Decouplio::Steps::OctoByKey.new(
266
+ octo_name,
267
+ by_key,
268
+ hash_case,
269
+ on_success,
270
+ on_failure,
271
+ on_error,
272
+ finish_him
273
+ )
274
+ else
275
+ raise Decouplio::Errors::RequiredOptionsIsMissingForOctoError.new(
276
+ details: 'ctx_key, method'
277
+ )
278
+ end
108
279
  end
109
280
 
110
- def resq(name = :resq, **options)
111
- unless Decouplio::Const::Types::MAIN_FLOW_TYPES.include?(@steps.last&.[](:type))
281
+ def resq(name = nil, **options)
282
+ unless Decouplio::Const::Flows::MAIN_FLOW.include?(@steps.last.class)
112
283
  raise Decouplio::Errors::ResqDefinitionError
113
284
  end
114
285
 
115
- @steps << {
116
- name: name,
117
- type: Decouplio::Const::Types::RESQ_TYPE,
118
- step_to_resq: @steps.delete(@steps.last),
119
- handler_hash: options
120
- }
286
+ last_step = @steps.delete(@steps.last)
287
+
288
+ resq_step = if name.is_a?(Symbol)
289
+ if Decouplio::Const::Flows::PASS_FLOW.include?(last_step.class)
290
+ Decouplio::Steps::ResqPass.new(
291
+ last_step.name,
292
+ name
293
+ )
294
+ elsif Decouplio::Const::Flows::FAIL_FLOW.include?(last_step.class)
295
+ Decouplio::Steps::ResqFail.new(
296
+ last_step.name,
297
+ name
298
+ )
299
+ else
300
+ raise StandardError, 'Most likely it is a bug, please create an issue here https://github.com/differencialx/decouplio/issues'
301
+ end
302
+ elsif options.size.positive?
303
+ if Decouplio::Const::Flows::PASS_FLOW.include?(last_step.class)
304
+ Decouplio::Steps::ResqWithMappingPass.new(
305
+ last_step.name,
306
+ Decouplio::Utils::PrepareResqMappings.call(options)
307
+ )
308
+ elsif Decouplio::Const::Flows::FAIL_FLOW.include?(last_step.class)
309
+ Decouplio::Steps::ResqWithMappingFail.new(
310
+ last_step.name,
311
+ Decouplio::Utils::PrepareResqMappings.call(options)
312
+ )
313
+ else
314
+ raise StandardError, 'Most likely it is a bug, please create an issue here https://github.com/differencialx/decouplio/issues'
315
+ end
316
+ else
317
+ raise Decouplio::Errors::InvalidOptionsForResqStep.new(
318
+ errored_option: "resq -->#{name}<--, -->#{options}<--"
319
+ )
320
+ end
321
+ if last_step.is_a?(Decouplio::Steps::BaseOcto)
322
+ last_step._add_resq(resq_step)
323
+ @steps << last_step
324
+ else
325
+ resq_step._add_step_to_resq(last_step)
326
+ @steps << resq_step
327
+ end
121
328
  end
122
329
 
123
330
  def wrap(name = nil, **options, &block)
124
331
  raise Decouplio::Errors::WrapBlockIsNotDefinedError unless block_given?
125
332
 
126
- @steps << options.merge(
127
- type: Decouplio::Const::Types::WRAP_TYPE,
128
- name: name,
129
- wrap_flow: block
130
- )
131
- end
333
+ wrap_class = options.delete(:klass)
334
+ wrap_method = options.delete(:method)
335
+ if_condition = options.delete(:if)
336
+ unless_condition = options.delete(:unless)
337
+ finish_him = options.delete(:finish_him)
338
+ on_success = options.delete(:on_success)
339
+ on_failure = options.delete(:on_failure)
340
+ on_error = options.delete(:on_error)
132
341
 
133
- def doby(doby_class, **options)
134
- warn(
135
- 'DEPRECATION WARNING: "doby" step type will be deprecated at alpha8 version. Use "step" or "pass" instead.'
136
- )
137
- step_options = {}
138
- options.each_key do |key|
139
- step_options[key] = options.delete(key) if Decouplio::Const::DobyAideOptions::ALLOWED.include?(key)
140
- end
141
- doby_options = options
142
-
143
- @steps << {
144
- type: Decouplio::Const::Types::DOBY_TYPE,
145
- name: doby_class.name.to_sym,
146
- doby_class: doby_class,
147
- doby_options: doby_options,
148
- **step_options
149
- }
150
- end
342
+ raise Decouplio::Errors::InvalidWrapNameError unless name
151
343
 
152
- def aide(aide_class, **options)
153
- warn('DEPRECATION WARNING: "aide" step type will be deprecated at alpha8 version. Use "fail" instead.')
154
- raise Decouplio::Errors::AideCanNotBeFirstStepError if @steps.empty?
344
+ if if_condition && unless_condition
345
+ raise Decouplio::Errors::WrapControversialKeysError.new(
346
+ errored_option: { if: if_condition, unless: unless_condition },
347
+ details: %i[if unless]
348
+ )
349
+ end
155
350
 
156
- step_options = {}
157
- options.each_key do |key|
158
- step_options[key] = options.delete(key) if Decouplio::Const::DobyAideOptions::ALLOWED.include?(key)
351
+ if if_condition
352
+ @steps << Decouplio::Steps::IfConditionPass.new(
353
+ if_condition
354
+ )
355
+ end
356
+ if unless_condition
357
+ @steps << Decouplio::Steps::UnlessConditionPass.new(
358
+ unless_condition
359
+ )
159
360
  end
160
- aide_options = options
161
361
 
162
- @steps << {
163
- type: Decouplio::Const::Types::AIDE_TYPE,
164
- name: aide_class.name.to_sym,
165
- aide_class: aide_class,
166
- aide_options: aide_options,
167
- **step_options
168
- }
362
+ wrap_block = block
363
+
364
+ if wrap_class && wrap_method
365
+ @steps << Decouplio::Steps::WrapWithClassMethod.new(
366
+ name,
367
+ wrap_block,
368
+ wrap_class,
369
+ wrap_method,
370
+ on_success,
371
+ on_failure,
372
+ on_error,
373
+ finish_him
374
+ )
375
+ elsif wrap_class
376
+ @steps << Decouplio::Steps::WrapWithClass.new(
377
+ name,
378
+ wrap_block,
379
+ wrap_class,
380
+ on_success,
381
+ on_failure,
382
+ on_error,
383
+ finish_him
384
+ )
385
+ elsif wrap_method
386
+ raise Decouplio::Errors::WrapKlassMethodError.new(
387
+ errored_option: { method: wrap_method }
388
+ )
389
+ else
390
+ @steps << Decouplio::Steps::Wrap.new(
391
+ name,
392
+ wrap_block,
393
+ on_success,
394
+ on_failure,
395
+ on_error,
396
+ finish_him
397
+ )
398
+ end
169
399
  end
170
400
  end
171
401
  end