decouplio 1.0.0alpha8 → 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 (130) 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 +24 -40
  5. data/lib/decouplio/action_state_printer.rb +2 -5
  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 +0 -144
  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 +2 -4
  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 +340 -79
  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 -35
  71. data/lib/decouplio/steps/inner_action_pass.rb +9 -29
  72. data/lib/decouplio/steps/inner_action_step.rb +1 -35
  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 +30 -42
  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 -108
  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 -615
  112. data/lib/decouplio/const/colors.rb +0 -25
  113. data/lib/decouplio/const/results.rb +0 -15
  114. data/lib/decouplio/const/step_options.rb +0 -16
  115. data/lib/decouplio/errors/extra_key_for_fail_error.rb +0 -26
  116. data/lib/decouplio/errors/extra_key_for_octo_error.rb +0 -26
  117. data/lib/decouplio/errors/extra_key_for_resq_error.rb +0 -29
  118. data/lib/decouplio/errors/extra_key_for_step_error.rb +0 -23
  119. data/lib/decouplio/errors/extra_key_for_wrap_error.rb +0 -23
  120. data/lib/decouplio/errors/palp_is_not_defined_error.rb +0 -26
  121. data/lib/decouplio/flow.rb +0 -17
  122. data/lib/decouplio/options_validator.rb +0 -606
  123. data/lib/decouplio/processor.rb +0 -20
  124. data/lib/decouplio/steps/octo.rb +0 -27
  125. data/lib/decouplio/steps/service_fail.rb +0 -41
  126. data/lib/decouplio/steps/service_pass.rb +0 -41
  127. data/lib/decouplio/steps/service_step.rb +0 -41
  128. data/lib/decouplio/steps/shared/fail_resolver.rb +0 -40
  129. data/lib/decouplio/steps/shared/step_resolver.rb +0 -43
  130. data/lib/decouplio/validators/condition.rb +0 -49
@@ -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,23 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'flow'
4
- require_relative 'const/types'
5
- require_relative 'const/step_options'
6
- require_relative 'octo_hash_case'
7
- require_relative 'errors/options_validation_error'
8
- require_relative 'errors/palp_validation_error'
9
- require_relative 'errors/resq_definition_error'
10
- require_relative 'errors/wrap_block_is_not_defined_error'
11
- require_relative 'errors/palp_block_is_not_defined_error'
12
- require_relative 'errors/fail_can_not_be_first_step_error'
13
- require_relative 'errors/octo_block_is_not_defined_error'
14
-
15
3
  module Decouplio
16
4
  class LogicDsl
17
- DEFAULT_WRAP_NAME = 'wrap'
18
-
19
5
  class << self
20
- attr_reader :steps, :palps
6
+ attr_reader :steps
21
7
 
22
8
  def inherited(subclass)
23
9
  subclass.init_steps
@@ -25,64 +11,199 @@ module Decouplio
25
11
 
26
12
  def init_steps
27
13
  @steps = []
28
- @palps = {}
29
14
  end
30
15
 
31
16
  def step(stp, **options)
32
- if stp.is_a?(Class) && !(stp < Decouplio::Action)
33
- step_options = {}
17
+ if_condition = options.delete(:if)
18
+ unless_condition = options.delete(:unless)
34
19
 
35
- options.each_key do |key|
36
- step_options[key] = options.delete(key) if Decouplio::Const::StepOptions::ALLOWED.include?(key)
37
- 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
26
+
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
38
37
 
39
- @steps << {
40
- type: Decouplio::Const::Types::STEP_TYPE,
41
- name: stp,
42
- _args: options,
43
- **step_options
44
- }
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
45
64
  else
46
- @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
+ )
47
72
  end
48
73
  end
49
74
 
50
75
  def fail(stp, **options)
51
76
  raise Decouplio::Errors::FailCanNotBeFirstStepError if @steps.empty?
52
77
 
53
- if stp.is_a?(Class) && !(stp < Decouplio::Action)
54
- step_options = {}
55
- options.each_key do |key|
56
- step_options[key] = options.delete(key) if Decouplio::Const::StepOptions::ALLOWED.include?(key)
57
- 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
87
+
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
58
98
 
59
- @steps << {
60
- type: Decouplio::Const::Types::FAIL_TYPE,
61
- name: stp,
62
- _args: options,
63
- **step_options
64
- }
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
65
125
  else
66
- @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
+ )
67
133
  end
68
134
  end
69
135
 
70
136
  def pass(stp, **options)
71
- if stp.is_a?(Class) && !(stp < Decouplio::Action)
72
- step_options = {}
137
+ on_success = options.delete(:on_success)
138
+ on_failure = options.delete(:on_failure)
73
139
 
74
- options.each_key do |key|
75
- step_options[key] = options.delete(key) if Decouplio::Const::StepOptions::ALLOWED.include?(key)
76
- 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)
77
154
 
78
- @steps << {
79
- type: Decouplio::Const::Types::PASS_TYPE,
80
- name: stp,
81
- _args: options,
82
- **step_options
83
- }
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
172
+
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
84
199
  else
85
- @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
+ )
86
207
  end
87
208
  end
88
209
 
@@ -93,48 +214,188 @@ module Decouplio
93
214
 
94
215
  raise Decouplio::Errors::OctoBlockIsNotDefinedError if hash_case.empty?
95
216
 
96
- options[:hash_case] = hash_case
97
- @steps << options.merge(type: Decouplio::Const::Types::OCTO_TYPE, name: octo_name)
98
- end
217
+ if_condition = options.delete(:if)
218
+ unless_condition = options.delete(:unless)
219
+
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
226
+
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
99
237
 
100
- def palp(palp_name, **options, &block)
101
- raise Decouplio::Errors::PalpBlockIsNotDefinedError unless block_given?
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)
102
244
 
103
- options.empty? || raise(Decouplio::Errors::PalpValidationError)
245
+ raise Decouplio::Errors::OctoFinishHimIsNotAllowedError if finish_him
104
246
 
105
- @palps[palp_name] = Class.new(self, &block)
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
106
279
  end
107
280
 
108
- def resq(name = :resq, **options)
109
- 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)
110
283
  raise Decouplio::Errors::ResqDefinitionError
111
284
  end
112
285
 
113
- @steps << {
114
- name: name,
115
- type: Decouplio::Const::Types::RESQ_TYPE,
116
- step_to_resq: @steps.delete(@steps.last),
117
- handler_hash: options
118
- }
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
119
328
  end
120
329
 
121
330
  def wrap(name = nil, **options, &block)
122
331
  raise Decouplio::Errors::WrapBlockIsNotDefinedError unless block_given?
123
332
 
124
- @steps << options.merge(
125
- type: Decouplio::Const::Types::WRAP_TYPE,
126
- name: name,
127
- wrap_flow: block
128
- )
129
- 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)
130
341
 
131
- def doby(_doby_class, **_options)
132
- raise '"doby" step is deprecated. Please use "step" or "pass" instead. ' \
133
- 'Just simply replace "doby " with "step " or "pass "'
134
- end
342
+ raise Decouplio::Errors::InvalidWrapNameError unless name
135
343
 
136
- def aide(_aide_class, **_options)
137
- raise '"aide" step is deprecated. Please use "fail". Just simply replace "aide " with "fail "'
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
350
+
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
+ )
360
+ end
361
+
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
138
399
  end
139
400
  end
140
401
  end