decouplio 1.0.0alpha2 → 1.0.0alpha5

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +11 -1
  3. data/.rubocop.yml +6 -0
  4. data/.ruby-version +1 -1
  5. data/README.md +2 -17
  6. data/benchmarks/multi_step_benchmark.rb +11 -10
  7. data/benchmarks/single_step_benchmark.rb +1 -1
  8. data/decouplio.gemspec +4 -4
  9. data/lib/decouplio/action.rb +12 -0
  10. data/lib/decouplio/composer.rb +47 -24
  11. data/lib/decouplio/const/doby_aide_options.rb +16 -0
  12. data/lib/decouplio/const/error_messages.rb +9 -0
  13. data/lib/decouplio/const/types.rb +14 -6
  14. data/lib/decouplio/const/validations/aide.rb +38 -0
  15. data/lib/decouplio/const/validations/doby.rb +36 -0
  16. data/lib/decouplio/const/validations/fail.rb +4 -0
  17. data/lib/decouplio/const/validations/octo.rb +2 -1
  18. data/lib/decouplio/errors/{deny_can_not_be_first_step_error.rb → aide_can_not_be_first_step_error.rb} +3 -3
  19. data/lib/decouplio/errors/aide_controversial_keys_error.rb +26 -0
  20. data/lib/decouplio/errors/aide_finish_him_error.rb +26 -0
  21. data/lib/decouplio/errors/doby_controversial_keys_error.rb +26 -0
  22. data/lib/decouplio/errors/doby_finish_him_error.rb +26 -0
  23. data/lib/decouplio/errors/execution_error.rb +20 -0
  24. data/lib/decouplio/errors/step_is_not_defined_for_aide_error.rb +26 -0
  25. data/lib/decouplio/errors/step_is_not_defined_for_doby_error.rb +27 -0
  26. data/lib/decouplio/errors/step_is_not_defined_for_pass_error.rb +27 -0
  27. data/lib/decouplio/logic_dsl.rb +23 -8
  28. data/lib/decouplio/options_validator.rb +157 -13
  29. data/lib/decouplio/steps/aide.rb +37 -0
  30. data/lib/decouplio/steps/base_resq.rb +13 -3
  31. data/lib/decouplio/steps/doby.rb +9 -8
  32. data/lib/decouplio/steps/octo.rb +7 -2
  33. data/lib/decouplio/validators/condition.rb +10 -0
  34. data/lib/decouplio/version.rb +1 -1
  35. metadata +24 -42
  36. data/docs/_config.yml +0 -1
  37. data/docs/benchmarks.md +0 -1
  38. data/docs/context.md +0 -74
  39. data/docs/context.rb +0 -62
  40. data/docs/deny.rb +0 -59
  41. data/docs/doby.rb +0 -38
  42. data/docs/doby_deny.md +0 -171
  43. data/docs/error_store.md +0 -347
  44. data/docs/error_store.rb +0 -202
  45. data/docs/fail.md +0 -1159
  46. data/docs/fail.rb +0 -859
  47. data/docs/index.md +0 -25
  48. data/docs/inner_action.md +0 -63
  49. data/docs/inner_action.rb +0 -43
  50. data/docs/logic_block.md +0 -25
  51. data/docs/octo.md +0 -269
  52. data/docs/octo.rb +0 -164
  53. data/docs/pass.md +0 -309
  54. data/docs/pass.rb +0 -213
  55. data/docs/quick_start.md +0 -71
  56. data/docs/quick_start.rb +0 -38
  57. data/docs/resq.md +0 -263
  58. data/docs/resq.rb +0 -176
  59. data/docs/step.md +0 -885
  60. data/docs/step.rb +0 -627
  61. data/docs/step_as_a_service.md +0 -123
  62. data/docs/step_as_a_service.rb +0 -77
  63. data/docs/wrap.md +0 -240
  64. data/docs/wrap.rb +0 -137
  65. data/lib/decouplio/const/validations/deny.rb +0 -11
  66. data/lib/decouplio/steps/deny.rb +0 -31
data/docs/pass.md DELETED
@@ -1,309 +0,0 @@
1
- # Pass
2
-
3
- `pass` is the step type that always moves to success track `logic` steps
4
-
5
- ## Signature
6
-
7
- ```ruby
8
- pass(step_name, **options)
9
- ```
10
-
11
- ## Behavior
12
-
13
- - when step method(`#pass_one`) returns truthy or falsy value then it goes to success track(`step_two` step)
14
-
15
- <details><summary><b>EXAMPLE (CLICK ME)</b></summary>
16
- <p>
17
-
18
- ```ruby
19
- require 'decouplio'
20
-
21
- class SomeAction < Decouplio::Action
22
- logic do
23
- pass :pass_one
24
- step :step_two
25
- fail :fail_one
26
- end
27
-
28
- def pass_one(param_for_pass:, **)
29
- ctx[:pass_one] = param_for_pass
30
- end
31
-
32
- def step_two(**)
33
- ctx[:step_two] = 'Success'
34
- end
35
-
36
- def fail_one(**)
37
- ctx[:fail_one] = 'Failure'
38
- end
39
- end
40
-
41
- pass_success = SomeAction.call(param_for_pass: true)
42
- pass_failure = SomeAction.call(param_for_pass: false)
43
-
44
- pass_success # =>
45
- # Result: success
46
-
47
- # Railway Flow:
48
- # pass_one -> step_two
49
-
50
- # Context:
51
- # {:param_for_pass=>true, :pass_one=>true, :step_two=>"Success"}
52
-
53
- # Errors:
54
- # {}
55
-
56
- pass_failure # =>
57
- # Result: success
58
-
59
- # Railway Flow:
60
- # pass_one -> step_two
61
-
62
- # Context:
63
- # {:param_for_pass=>false, :pass_one=>false, :step_two=>"Success"}
64
-
65
- # Errors:
66
- # {}
67
- ```
68
-
69
- ```mermaid
70
- flowchart LR
71
- 1(start)-->2(pass_one success);
72
- 1(start)-->3(pass_one failure);
73
- 2(pass_one success)-->|success track|4(step_two);
74
- 3(pass_one failure)-->|success track|4(step_two);
75
- 4(step_two)-->|success track|5(finish_success)
76
- ```
77
-
78
- </p>
79
- </details>
80
-
81
- ***
82
-
83
- ## Options
84
-
85
- ### if: condition method name
86
- Can be used in case if for some reason step shouldn't be executed
87
-
88
- <details><summary><b>EXAMPLE (CLICK ME)</b></summary>
89
- <p>
90
-
91
- ```ruby
92
- require 'decouplio'
93
-
94
- class SomeActionIfCondition < Decouplio::Action
95
- logic do
96
- step :step_one
97
- pass :pass_one, if: :some_condition?
98
- step :step_two
99
- end
100
-
101
- def step_one(**)
102
- ctx[:step_one] = 'Success'
103
- end
104
-
105
- def pass_one(**)
106
- ctx[:pass_one] = 'Success'
107
- end
108
-
109
- def step_two(**)
110
- ctx[:step_two] = 'Success'
111
- end
112
-
113
- def some_condition?(condition_param:, **)
114
- condition_param
115
- end
116
- end
117
-
118
- condition_positive = SomeActionIfCondition.call(condition_param: true)
119
- condition_negative = SomeActionIfCondition.call(condition_param: false)
120
-
121
- condition_positive # =>
122
- # Result: success
123
-
124
- # Railway Flow:
125
- # step_one -> pass_one -> step_two
126
-
127
- # Context:
128
- # {:condition_param=>true, :step_one=>"Success", :pass_one=>"Success", :step_two=>"Success"}
129
-
130
- # Errors:
131
- # {}
132
-
133
-
134
- condition_negative # =>
135
- # Result: success
136
-
137
- # Railway Flow:
138
- # step_one -> step_two
139
-
140
- # Context:
141
- # {:condition_param=>false, :step_one=>"Success", :step_two=>"Success"}
142
-
143
- # Errors:
144
- # {}
145
- ```
146
-
147
- ```mermaid
148
- flowchart LR
149
- 1(start)-->2(step_one);
150
- 2(step_one)-->|condition positive|3(pass_one);
151
- 3(pass_one)-->|success track|4(step_two);
152
- 2(step_one)-->|condition negative|4(step_two);
153
- 4(step_two)-->|success track|5(finish_success);
154
- ```
155
- </p>
156
- </details>
157
-
158
- ***
159
-
160
- ### unless: condition method name
161
- Can be used in case if for some reason step shouldn't be executed
162
-
163
- <details><summary><b>EXAMPLE (CLICK ME)</b></summary>
164
- <p>
165
-
166
- ```ruby
167
- require 'decouplio'
168
-
169
- class SomeActionUnlessCondition < Decouplio::Action
170
- logic do
171
- step :step_one
172
- pass :pass_one, unless: :some_condition?
173
- step :step_two
174
- end
175
-
176
- def step_one(**)
177
- ctx[:step_one] = 'Success'
178
- end
179
-
180
- def pass_one(**)
181
- ctx[:pass_one] = 'Success'
182
- end
183
-
184
- def step_two(**)
185
- ctx[:step_two] = 'Success'
186
- end
187
-
188
- def some_condition?(condition_param:, **)
189
- condition_param
190
- end
191
- end
192
-
193
- condition_positive = SomeActionUnlessCondition.call(condition_param: false)
194
- condition_negative = SomeActionUnlessCondition.call(condition_param: true)
195
-
196
- condition_positive # =>
197
- # Result: success
198
-
199
- # Railway Flow:
200
- # step_one -> pass_one -> step_two
201
-
202
- # Context:
203
- # {:condition_param=>false, :step_one=>"Success", :pass_one=>"Success", :step_two=>"Success"}
204
-
205
- # Errors:
206
- # {}
207
-
208
- condition_negative # =>
209
- # Result: success
210
-
211
- # Railway Flow:
212
- # step_one -> step_two
213
-
214
- # Context:
215
- # {:condition_param=>true, :step_one=>"Success", :step_two=>"Success"}
216
-
217
- # Errors:
218
- # {}
219
- ```
220
-
221
- ```mermaid
222
- flowchart LR
223
- 1(start)-->2(step_one);
224
- 2(step_one)-->|condition positive|3(pass_one);
225
- 3(pass_one)-->|success track|4(step_two);
226
- 2(step_one)-->|condition negative|4(step_two);
227
- 4(step_two)-->|success track|5(finish_success);
228
- ```
229
- </p>
230
- </details>
231
-
232
- ***
233
-
234
- ### finish_him: true
235
-
236
- Can be used in case if for some reason step shouldn't be executed
237
-
238
- <details><summary><b>EXAMPLE (CLICK ME)</b></summary>
239
- <p>
240
-
241
- ```ruby
242
- require 'decouplio'
243
-
244
- class SomeActionFinishHim < Decouplio::Action
245
- logic do
246
- step :step_one, on_success: :step_two, on_failure: :pass_one
247
- pass :pass_one, finish_him: true
248
- step :step_two
249
- step :step_three
250
- end
251
-
252
- def step_one(param_for_step:, **)
253
- ctx[:step_one] = param_for_step
254
- end
255
-
256
- def pass_one(**)
257
- ctx[:pass_one] = 'Success'
258
- end
259
-
260
- def step_two(**)
261
- ctx[:step_two] = 'Success'
262
- end
263
-
264
- def step_three(**)
265
- ctx[:step_three] = 'Success'
266
- end
267
- end
268
-
269
- success_track = SomeActionFinishHim.call(param_for_step: true)
270
- failure_track = SomeActionFinishHim.call(param_for_step: false)
271
-
272
- success_track # =>
273
- # Result: success
274
-
275
- # Railway Flow:
276
- # step_one -> step_two -> step_three
277
-
278
- # Context:
279
- # {:param_for_step=>true, :step_one=>true, :step_two=>"Success", :step_three=>"Success"}
280
-
281
- # Errors:
282
- # {}
283
-
284
- failure_track # =>
285
- # Result: success
286
-
287
- # Railway Flow:
288
- # step_one -> pass_one
289
-
290
- # Context:
291
- # {:param_for_step=>false, :step_one=>false, :pass_one=>"Success"}
292
-
293
- # Errors:
294
- # {}
295
- ```
296
-
297
- ```mermaid
298
- flowchart LR
299
- 1(start)-->2(step_one);
300
- 2(step_one)-->|success track|3(step_two);
301
- 3(step_two)-->|success track|4(step_three);
302
- 2(step_one)-->|failure track|5(pass_one);
303
- 4(step_three)-->|success track|6(finish success);
304
- 5(pass_one)-->|success track|6(finish success);
305
- ```
306
- </p>
307
- </details>
308
-
309
- ***
data/docs/pass.rb DELETED
@@ -1,213 +0,0 @@
1
- require_relative '../lib/decouplio'
2
-
3
- # Behavior
4
- class SomeAction < Decouplio::Action
5
- logic do
6
- pass :pass_one
7
- step :step_two
8
- fail :fail_one
9
- end
10
-
11
- def pass_one(param_for_pass:, **)
12
- ctx[:pass_one] = param_for_pass
13
- end
14
-
15
- def step_two(**)
16
- ctx[:step_two] = 'Success'
17
- end
18
-
19
- def fail_one(**)
20
- ctx[:fail_one] = 'Failure'
21
- end
22
- end
23
-
24
- pass_success = SomeAction.call(param_for_pass: true)
25
- pass_failure = SomeAction.call(param_for_pass: false)
26
-
27
- puts pass_success # =>
28
- # Result: success
29
-
30
- # Railway Flow:
31
- # pass_one -> step_two
32
-
33
- # Context:
34
- # {:param_for_pass=>true, :pass_one=>true, :step_two=>"Success"}
35
-
36
- # Errors:
37
- # {}
38
-
39
- puts pass_failure # =>
40
- # Result: success
41
-
42
- # Railway Flow:
43
- # pass_one -> step_two
44
-
45
- # Context:
46
- # {:param_for_pass=>false, :pass_one=>false, :step_two=>"Success"}
47
-
48
- # Errors:
49
- # {}
50
-
51
-
52
-
53
- # if: condition method name
54
- class SomeActionIfCondition < Decouplio::Action
55
- logic do
56
- step :step_one
57
- pass :pass_one, if: :some_condition?
58
- step :step_two
59
- end
60
-
61
- def step_one(**)
62
- ctx[:step_one] = 'Success'
63
- end
64
-
65
- def pass_one(**)
66
- ctx[:pass_one] = 'Success'
67
- end
68
-
69
- def step_two(**)
70
- ctx[:step_two] = 'Success'
71
- end
72
-
73
- def some_condition?(condition_param:, **)
74
- condition_param
75
- end
76
- end
77
-
78
- condition_positive = SomeActionIfCondition.call(condition_param: true)
79
- condition_negative = SomeActionIfCondition.call(condition_param: false)
80
-
81
- puts condition_positive # =>
82
- # Result: success
83
-
84
- # Railway Flow:
85
- # step_one -> pass_one -> step_two
86
-
87
- # Context:
88
- # {:condition_param=>true, :step_one=>"Success", :pass_one=>"Success", :step_two=>"Success"}
89
-
90
- # Errors:
91
- # {}
92
-
93
-
94
- puts condition_negative # =>
95
- # Result: success
96
-
97
- # Railway Flow:
98
- # step_one -> step_two
99
-
100
- # Context:
101
- # {:condition_param=>false, :step_one=>"Success", :step_two=>"Success"}
102
-
103
- # Errors:
104
- # {}
105
-
106
-
107
-
108
- # unless: condition method name
109
- class SomeActionUnlessCondition < Decouplio::Action
110
- logic do
111
- step :step_one
112
- pass :pass_one, unless: :some_condition?
113
- step :step_two
114
- end
115
-
116
- def step_one(**)
117
- ctx[:step_one] = 'Success'
118
- end
119
-
120
- def pass_one(**)
121
- ctx[:pass_one] = 'Success'
122
- end
123
-
124
- def step_two(**)
125
- ctx[:step_two] = 'Success'
126
- end
127
-
128
- def some_condition?(condition_param:, **)
129
- condition_param
130
- end
131
- end
132
-
133
- condition_positive = SomeActionUnlessCondition.call(condition_param: false)
134
- condition_negative = SomeActionUnlessCondition.call(condition_param: true)
135
-
136
- puts condition_positive # =>
137
- # Result: success
138
-
139
- # Railway Flow:
140
- # step_one -> pass_one -> step_two
141
-
142
- # Context:
143
- # {:condition_param=>false, :step_one=>"Success", :pass_one=>"Success", :step_two=>"Success"}
144
-
145
- # Errors:
146
- # {}
147
-
148
- puts condition_negative # =>
149
- # Result: success
150
-
151
- # Railway Flow:
152
- # step_one -> step_two
153
-
154
- # Context:
155
- # {:condition_param=>true, :step_one=>"Success", :step_two=>"Success"}
156
-
157
- # Errors:
158
- # {}
159
-
160
-
161
-
162
- # finish_him: true
163
- class SomeActionFinishHim < Decouplio::Action
164
- logic do
165
- step :step_one, on_success: :step_two, on_failure: :pass_one
166
- pass :pass_one, finish_him: true
167
- step :step_two
168
- step :step_three
169
- end
170
-
171
- def step_one(param_for_step:, **)
172
- ctx[:step_one] = param_for_step
173
- end
174
-
175
- def pass_one(**)
176
- ctx[:pass_one] = 'Success'
177
- end
178
-
179
- def step_two(**)
180
- ctx[:step_two] = 'Success'
181
- end
182
-
183
- def step_three(**)
184
- ctx[:step_three] = 'Success'
185
- end
186
- end
187
-
188
- success_track = SomeActionFinishHim.call(param_for_step: true)
189
- failure_track = SomeActionFinishHim.call(param_for_step: false)
190
-
191
- puts success_track # =>
192
- # Result: success
193
-
194
- # Railway Flow:
195
- # step_one -> step_two -> step_three
196
-
197
- # Context:
198
- # {:param_for_step=>true, :step_one=>true, :step_two=>"Success", :step_three=>"Success"}
199
-
200
- # Errors:
201
- # {}
202
-
203
- puts failure_track # =>
204
- # Result: success
205
-
206
- # Railway Flow:
207
- # step_one -> pass_one
208
-
209
- # Context:
210
- # {:param_for_step=>false, :step_one=>false, :pass_one=>"Success"}
211
-
212
- # Errors:
213
- # {}
data/docs/quick_start.md DELETED
@@ -1,71 +0,0 @@
1
- ## Quick start
2
-
3
- ### Installation
4
-
5
- Regular installation
6
- ```
7
- gem install decouplio
8
- ```
9
-
10
- Gemfile
11
- ```ruby
12
- gem 'decouplio'
13
- ```
14
-
15
- ### Usage
16
-
17
- All you need to do is to create new class and inherit it from `Decouplio::Action`, define your action logic and implement methods.
18
-
19
- ```ruby
20
- require 'decouplio'
21
-
22
- class ProcessNumber < Decouplio::Action
23
- logic do
24
- step :multiply
25
- step :divide
26
- end
27
-
28
- def multiply(number:, multiplier:, **)
29
- ctx[:result] = number * multiplier
30
- end
31
-
32
- def divide(result:, divider:, **)
33
- ctx[:result] = result / divider
34
- end
35
- end
36
-
37
- action = ProcessNumber.call(number: 5, multiplier: 4, divider: 10) # =>
38
- # Result: success
39
-
40
- # Railway Flow:
41
- # multiply -> divide
42
-
43
- # Context:
44
- # {:number=>5, :multiplier=>4, :divider=>10, :result=>2}
45
-
46
- # Errors:
47
- # {}
48
-
49
- action[:number] # => 5
50
- action[:multiplier] # => 4
51
- action[:divider] # => 10
52
- action[:result] # => 2
53
-
54
- action.success? # => true
55
- action.failure? # => false
56
-
57
- action.railway_flow # => [:multiply, :divide]
58
- ```
59
- Learn more about all features:
60
- - [Logic block](https://github.com/differencialx/decouplio/blob/master/docs/logic_block.md)
61
- - [Context](https://github.com/differencialx/decouplio/blob/master/docs/context.md)
62
- - [Step](https://github.com/differencialx/decouplio/blob/master/docs/step.md)
63
- - [Fail](https://github.com/differencialx/decouplio/blob/master/docs/fail.md)
64
- - [Pass](https://github.com/differencialx/decouplio/blob/master/docs/pass.md)
65
- - [Octo](https://github.com/differencialx/decouplio/blob/master/docs/octo.md)
66
- - [Wrap](https://github.com/differencialx/decouplio/blob/master/docs/wrap.md)
67
- - [Resq](https://github.com/differencialx/decouplio/blob/master/docs/resq.md)
68
- - [Inner action](https://github.com/differencialx/decouplio/blob/master/docs/inner_action.md)
69
- - [Doby](https://github.com/differencialx/decouplio/blob/master/docs/doby.md)
70
- - [Step as a service](https://github.com/differencialx/decouplio/blob/master/docs/step_as_a_service.md)
71
- - [Error store](https://github.com/differencialx/decouplio/blob/master/docs/error_store.md)
data/docs/quick_start.rb DELETED
@@ -1,38 +0,0 @@
1
- require_relative '../lib/decouplio'
2
-
3
- class ProcessNumber < Decouplio::Action
4
- logic do
5
- step :multiply
6
- step :divide
7
- end
8
-
9
- def multiply(number:, multiplier:, **)
10
- ctx[:result] = number * multiplier
11
- end
12
-
13
- def divide(result:, divider:, **)
14
- ctx[:result] = result / divider
15
- end
16
- end
17
-
18
- action = ProcessNumber.call(number: 5, multiplier: 4, divider: 10) # =>
19
- # Result: success
20
-
21
- # Railway Flow:
22
- # multiply -> divide
23
-
24
- # Context:
25
- # {:number=>5, :multiplier=>4, :divider=>10, :result=>2}
26
-
27
- # Errors:
28
- # {}
29
- puts action
30
- puts action[:number]# => 5
31
- puts action[:multiplier]# => 4
32
- puts action[:divider]# => 10
33
- puts action[:result]# => 2
34
-
35
- puts action.success? # => true
36
- puts action.failure? # => false
37
-
38
- puts action.railway_flow.to_s # => [:multiply, :divide]