trailblazer-operation 0.10.1 → 0.11.0

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +2 -2
  3. data/CHANGES.md +10 -0
  4. data/lib/trailblazer/operation/class_dependencies.rb +1 -1
  5. data/lib/trailblazer/operation/public_call.rb +24 -14
  6. data/lib/trailblazer/operation/railway.rb +13 -7
  7. data/lib/trailblazer/operation/version.rb +1 -1
  8. data/lib/trailblazer/operation/wtf.rb +11 -0
  9. data/lib/trailblazer/operation.rb +2 -2
  10. data/test/call_test.rb +32 -10
  11. data/test/class_dependencies_test.rb +8 -4
  12. data/test/docs/autogenerated/activity_basics_test.rb +72 -0
  13. data/test/docs/autogenerated/composable_variable_mapping_test.rb +880 -0
  14. data/test/docs/autogenerated/fast_track_layout_test.rb +76 -0
  15. data/test/docs/autogenerated/mechanics_test.rb +382 -0
  16. data/test/docs/autogenerated/sequence_options_test.rb +202 -0
  17. data/test/docs/autogenerated/subprocess_test.rb +257 -0
  18. data/test/docs/autogenerated/wiring_api_test.rb +435 -0
  19. data/test/docs/developer_test.rb +27 -0
  20. data/test/docs/public_call_monkeypatching_test.rb +96 -0
  21. data/test/docs/result_test.rb +38 -0
  22. data/test/docs/step_dsl_test.rb +93 -0
  23. data/test/operation_test.rb +53 -13
  24. data/test/result_test.rb +1 -1
  25. data/test/test_helper.rb +17 -5
  26. data/test/trace_test.rb +3 -43
  27. data/trailblazer-operation.gemspec +2 -1
  28. metadata +42 -23
  29. data/lib/trailblazer/operation/trace.rb +0 -67
  30. data/test/callable_test.rb +0 -147
  31. data/test/docs/doormat_test.rb +0 -190
  32. data/test/docs/macaroni_test.rb +0 -31
  33. data/test/skill_test.rb +0 -66
  34. data/test/wire_test.rb +0 -113
  35. data/test/wiring/defaults_test.rb +0 -193
  36. data/test/wiring/subprocess_test.rb +0 -70
@@ -0,0 +1,76 @@
1
+ # THIS FILE IS AUTOGENERATED FROM trailblazer-activity-dsl-linear/test/docs/fast_track_layout_test.rb
2
+ require "test_helper"
3
+
4
+ class FastTrack_Layout_Passfast_DocTest < Minitest::Spec
5
+ Memo = Class.new
6
+ it do
7
+ #:ft-passfast
8
+ module Memo::Operation
9
+ class Create < Trailblazer::Operation
10
+ step :validate, pass_fast: true
11
+ step :save
12
+ fail :handle_errors
13
+ #~mod
14
+ include T.def_steps(:validate, :handle_errors, :save)
15
+ #~mod end
16
+ end
17
+ end
18
+ #:ft-passfast end
19
+
20
+ assert_invoke Memo::Operation::Create, terminus: :pass_fast, seq: "[:validate]"
21
+ assert_invoke Memo::Operation::Create, validate: false, seq: "[:validate, :handle_errors]", terminus: :failure
22
+ end
23
+ end
24
+
25
+ class FastTrack_Layout_Failfast_DocTest < Minitest::Spec
26
+ Memo = Class.new
27
+ it do
28
+ #:ft-failfast
29
+ module Memo::Operation
30
+ class Create < Trailblazer::Operation
31
+ step :validate, fail_fast: true
32
+ step :save
33
+ fail :handle_errors
34
+ #~mod
35
+ include T.def_steps(:validate, :handle_errors, :save)
36
+ #~mod end
37
+ end
38
+ end
39
+ #:ft-failfast end
40
+
41
+ assert_invoke Memo::Operation::Create, terminus: :fail_fast, seq: "[:validate]", validate: false
42
+ assert_invoke Memo::Operation::Create, seq: "[:validate, :save]"
43
+ assert_invoke Memo::Operation::Create, save: false, seq: "[:validate, :save, :handle_errors]", terminus: :failure
44
+ end
45
+ end
46
+
47
+ class FastTrack_Layout_FastTrack_DocTest < Minitest::Spec
48
+ Memo = Class.new
49
+ it do
50
+ #:ft-fasttrack
51
+ class Create < Trailblazer::Operation
52
+ module Memo::Operation
53
+ class Create < Trailblazer::Operation
54
+ step :validate, fast_track: true
55
+ step :save
56
+ fail :handle_errors
57
+
58
+ def validate(ctx, params:, **)
59
+ return Railway.fail_fast! if params.nil?
60
+
61
+ params.key?(:memo)
62
+ end
63
+ #~mod
64
+ include T.def_steps(:validate, :handle_errors, :save)
65
+ #~mod end
66
+ end
67
+ end
68
+ end
69
+ #:ft-fasttrack end
70
+
71
+
72
+ assert_invoke Memo::Operation::Create, terminus: :fail_fast, seq: "[]", params: nil
73
+ assert_invoke Memo::Operation::Create, seq: "[:save]", params: {memo: nil}
74
+ assert_invoke Memo::Operation::Create, seq: "[:handle_errors]", terminus: :failure, params: {}
75
+ end
76
+ end
@@ -0,0 +1,382 @@
1
+ # THIS FILE IS AUTOGENERATED FROM trailblazer-activity-dsl-linear/test/docs/mechanics_test.rb
2
+ require "test_helper"
3
+
4
+ module Y
5
+ class DocsMechanicsTest < Minitest::Spec
6
+ Memo = Module.new
7
+ it "what" do
8
+ #:instance-method
9
+ module Memo::Operation
10
+ class Create < Trailblazer::Operation
11
+ step :validate
12
+
13
+ #~meths
14
+ def validate(ctx, params:, **)
15
+ params.key?(:memo) ? true : false # return value matters!
16
+ end
17
+ #~meths end
18
+ end
19
+ end
20
+ #:instance-method end
21
+
22
+ #:instance-method-call
23
+ result = Memo::Operation::Create.call(params: {memo: nil})
24
+ #:instance-method-call end
25
+ assert_equal result.success?, true
26
+
27
+ #:instance-method-implicit-call
28
+ result = Memo::Operation::Create.(params: {memo: nil})
29
+ # #:instance-method-implicit-call end
30
+ assert_equal result.success?, true
31
+ end
32
+ end
33
+ end
34
+
35
+ class ReadfromCtx_DocsMechanicsTest < Minitest::Spec
36
+ Memo = Module.new
37
+ it "what" do
38
+ #:ctx-read
39
+ module Memo::Operation
40
+ class Create < Trailblazer::Operation
41
+ step :validate
42
+ #~meths
43
+ step :save
44
+
45
+ def save(*); true; end
46
+ #~meths end
47
+ def validate(ctx, **)
48
+ p ctx[:params] #=> {:memo=>nil}
49
+ end
50
+ end
51
+ end
52
+ #:ctx-read end
53
+
54
+ #:ctx-read-call
55
+ result = Memo::Operation::Create.(params: {memo: nil})
56
+ #:ctx-read-call end
57
+ assert_equal result.success?, true
58
+ end
59
+ end
60
+
61
+ class ReadfromCtxKwargs_DocsMechanicsTest < Minitest::Spec
62
+ Memo = Module.new
63
+ it "what" do
64
+ module Memo::Operation
65
+ class Create < Trailblazer::Operation
66
+ step :validate
67
+ #~meths
68
+ step :save
69
+
70
+ def save(*); true; end
71
+ #~meths end
72
+ #:ctx-read-kwargs
73
+ def validate(ctx, params:, **)
74
+ p params #=> {:memo=>nil}
75
+ end
76
+ #:ctx-read-kwargs end
77
+ end
78
+ end
79
+
80
+ result = Memo::Operation::Create.(params: {memo: nil})
81
+ assert_equal result.success?, true
82
+
83
+ user = Object
84
+ assert_raises ArgumentError do
85
+ #:kwargs-error
86
+ result = Memo::Operation::Create.(current_user: user)
87
+ #=> ArgumentError: missing keyword: :params
88
+ # memo/operation/create.rb:9:in `validate'
89
+ #:kwargs-error end
90
+ end
91
+ end
92
+ end
93
+
94
+ class WriteToCtx_DocsMechanicsTest < Minitest::Spec
95
+ class Memo
96
+ def initialize(*); end
97
+ end
98
+ it "what" do
99
+ #:ctx-write-read
100
+ module Memo::Operation
101
+ class Create < Trailblazer::Operation
102
+ step :validate
103
+ step :save # sets ctx[:model]
104
+ step :notify
105
+ #~body
106
+ #~meths
107
+ def validate(ctx, params:, **)
108
+ true
109
+ end
110
+
111
+ def send_email(*)
112
+ true
113
+ end
114
+ #~meths end
115
+ #:ctx-write
116
+ def save(ctx, params:, **)
117
+ ctx[:model] = Memo.new(params[:memo])
118
+ end
119
+ #~body end
120
+ #:ctx-write end
121
+ def notify(ctx, model:, **)
122
+ send_email(model)
123
+ end
124
+ end
125
+ end
126
+ #:ctx-write-read end
127
+
128
+ #:result-read
129
+ result = Memo::Operation::Create.(params: {memo: {content: "remember that"}})
130
+
131
+ result[:model] #=> #<Memo id: 1, ...>
132
+ #:result-read end
133
+
134
+ #:result-success
135
+ puts result.success? #=> true
136
+ #:result-success end
137
+
138
+ assert_equal result[:model].class, Memo
139
+ assert_equal result.success?, true
140
+
141
+ user = Object
142
+ assert_raises ArgumentError do
143
+ #:kwargs-error
144
+ result = Memo::Operation::Create.(current_user: user)
145
+ #=> ArgumentError: missing keyword: :params
146
+ # memo/operation/create.rb:9:in `validate'
147
+ #:kwargs-error end
148
+ end
149
+ end
150
+ end
151
+
152
+ class ReturnValueSuccess_DocsMechanicsTest < Minitest::Spec
153
+ Memo = Module.new
154
+ it "what" do
155
+ module Memo::Operation
156
+ class Create < Trailblazer::Operation
157
+ step :validate
158
+ #~meths
159
+ step :save
160
+
161
+ def save(*); true; end
162
+ #~meths end
163
+ #:return-success
164
+ def validate(ctx, params:, **)
165
+ params.key?(:memo) # => true/false
166
+ end
167
+ #:return-success end
168
+ end
169
+ end
170
+
171
+ result = Memo::Operation::Create.(params: {memo: nil})
172
+ assert_equal result.success?, true
173
+ end
174
+ end
175
+
176
+ class ReturnValueFailure_DocsMechanicsTest < Minitest::Spec
177
+ Memo = Module.new
178
+ it "what" do
179
+ module Memo::Operation
180
+ class Create < Trailblazer::Operation
181
+ step :validate
182
+ #~meths
183
+ step :save
184
+
185
+ def save(*); true; end
186
+ #~meths end
187
+ #:return-failure
188
+ def validate(ctx, params:, **)
189
+ nil
190
+ end
191
+ #:return-failure end
192
+ end
193
+ end
194
+
195
+ result = Memo::Operation::Create.(params: {memo: nil})
196
+ assert_equal result.success?, false
197
+ end
198
+ end
199
+
200
+ class ReturnSignal_DocsMechanicsTest < Minitest::Spec
201
+ Memo = Module.new
202
+ it "what" do
203
+ #:signal-operation
204
+ module Memo::Operation
205
+ class Create < Trailblazer::Operation
206
+ class NetworkError < Trailblazer::Activity::Signal
207
+ end
208
+ #~meths
209
+ #:signal-steps
210
+ step :validate
211
+ step :save
212
+ left :handle_errors
213
+ step :notify,
214
+ Output(NetworkError, :network_error) => End(:network_error)
215
+ #:signal-steps end
216
+ def save(ctx, **)
217
+ ctx[:model] = Object
218
+ end
219
+ def validate(ctx, params:, **)
220
+ true
221
+ end
222
+ def send_email(model)
223
+ true
224
+ end
225
+ def check_network(params)
226
+ ! params[:network_broken]
227
+ end
228
+
229
+ #:return-signal
230
+ def notify(ctx, model:, params:, **)
231
+ return NetworkError unless check_network(params)
232
+
233
+ send_email(model)
234
+ end
235
+ #:return-signal end
236
+ #~meths end
237
+ end
238
+ end
239
+ #:signal-operation end
240
+
241
+ result = Memo::Operation::Create.(params: {memo: nil, network_broken: false})
242
+ assert_equal result.success?, true
243
+
244
+ #:terminus
245
+ result = Memo::Operation::Create.(params: {memo: nil, network_broken: true})
246
+
247
+ result.terminus.to_h[:semantic] #=> :network_error
248
+ #:terminus end
249
+ assert_equal result.success?, false
250
+ assert_equal result.terminus.to_h[:semantic], :network_error
251
+
252
+ #:terminus-subprocess
253
+ module Endpoint
254
+ class API < Trailblazer::Operation
255
+ step Subprocess(Memo::Operation::Create),
256
+ Output(:network_error) => Track(:failure)
257
+ # ...
258
+ end
259
+ end
260
+ #:terminus-subprocess end
261
+ end
262
+ end
263
+
264
+ class Classmethod_DocsMechanicsTest < Minitest::Spec
265
+ Memo = Module.new
266
+ it "what" do
267
+ #:class-method
268
+ module Memo::Operation
269
+ class Create < Trailblazer::Operation
270
+ #~meths
271
+ # Define {Memo::Operation::Create.validate}
272
+ def self.validate(ctx, params:, **)
273
+ params.key?(:memo) ? true : false # return value matters!
274
+ end
275
+ #~meths end
276
+
277
+ step method(:validate)
278
+ end
279
+ end
280
+ #:class-method end
281
+ end
282
+ end
283
+
284
+ class Module_Classmethod_DocsMechanicsTest < Minitest::Spec
285
+ Memo = Module.new
286
+ it "what" do
287
+ #:module-step
288
+ # Reusable steps in a module.
289
+ module Steps
290
+ def self.validate(ctx, params:, **)
291
+ params.key?(:memo) ? true : false # return value matters!
292
+ end
293
+ end
294
+ #:module-step end
295
+
296
+ #:module-method
297
+ module Memo::Operation
298
+ class Create < Trailblazer::Operation
299
+ step Steps.method(:validate)
300
+ end
301
+ end
302
+ #:module-method end
303
+ end
304
+ end
305
+
306
+ class Callable_DocsMechanicsTest < Minitest::Spec
307
+ Memo = Module.new
308
+ it "what" do
309
+ #:callable-step
310
+ module Validate
311
+ def self.call(ctx, params:, **)
312
+ valid?(params) ? true : false # return value matters!
313
+ end
314
+
315
+ def valid?(params)
316
+ params.key?(:memo)
317
+ end
318
+ end
319
+ #:callable-step end
320
+
321
+ #:callable-method
322
+ module Memo::Operation
323
+ class Create < Trailblazer::Operation
324
+ step Validate
325
+ end
326
+ end
327
+ #:callable-method end
328
+ end
329
+ end
330
+
331
+ class Lambda_DocsMechanicsTest < Minitest::Spec
332
+ Memo = Module.new
333
+ it "what" do
334
+ #:lambda-step
335
+ module Memo::Operation
336
+ class Create < Trailblazer::Operation
337
+ step ->(ctx, params:, **) { p params.inspect }
338
+ end
339
+ end
340
+ #:lambda-step end
341
+ end
342
+ end
343
+
344
+ class Inheritance_DocsMechanicsTest < Minitest::Spec
345
+ Memo = Module.new
346
+ it "what" do
347
+ #:inherit-create
348
+ module Memo::Operation
349
+ class Create < Trailblazer::Operation
350
+ step :create_model
351
+ step :validate
352
+ step :save
353
+ #~meths
354
+ include T.def_steps(:create_model, :validate, :save)
355
+ #~meths end
356
+ end
357
+ end
358
+ #:inherit-create end
359
+
360
+ #:inherit-update-empty
361
+ module Memo::Operation
362
+ class Update < Create
363
+ end
364
+ end
365
+ #:inherit-update-empty end
366
+
367
+ #:inherit-update
368
+ module Memo::Operation
369
+ class Update < Create
370
+ step :find_model, replace: :create_model
371
+ #~meths
372
+ include T.def_steps(:find_model)
373
+ #~meths end
374
+ end
375
+ end
376
+ #:inherit-update end
377
+
378
+ assert_invoke Memo::Operation::Create, seq: "[:create_model, :validate, :save]"
379
+ assert_invoke Memo::Operation::Update, seq: "[:find_model, :validate, :save]"
380
+ end
381
+ end
382
+
@@ -0,0 +1,202 @@
1
+ # THIS FILE IS AUTOGENERATED FROM trailblazer-activity-dsl-linear/test/docs/sequence_options_test.rb
2
+ require "test_helper"
3
+ # require "trailblazer/developer"
4
+
5
+ module A
6
+ class Id_DocSeqOptionsTest < Minitest::Spec
7
+ Memo = Struct.new(:text)
8
+
9
+ #:id
10
+ module Memo::Operation
11
+ class Create < Trailblazer::Operation
12
+ step :validate
13
+ step :save, id: :save_the_world
14
+ step :notify
15
+ #~meths
16
+ include T.def_steps(:validate, :save, :notify)
17
+ #~meths end
18
+ end
19
+ end
20
+ #:id end
21
+
22
+ it ":id shows up in introspect" do
23
+ =begin
24
+ output =
25
+ #:id-inspect
26
+ Trailblazer::Developer.railway(Memo::Operation::Create)
27
+ #=> [>validate,>save_the_world,>notify]
28
+ #:id-inspect end
29
+ =end
30
+
31
+ #~ignore end
32
+
33
+ assert Trailblazer::Activity::Introspect.Nodes(Memo::Operation::Create, id: :save_the_world)
34
+ #:id-introspect
35
+ puts Trailblazer::Activity::Introspect.Nodes(Memo::Operation::Create, id: :save_the_world)
36
+ #=> #<struct Trailblazer::Operation::Schema::Nodes::Attributes id=:save_the_world, ...>
37
+ #:id-introspect end
38
+ end
39
+ end
40
+ end
41
+
42
+ module B
43
+ class Delete_DocsSequenceOptionsTest < Minitest::Spec
44
+ Memo = A::Id_DocSeqOptionsTest::Memo
45
+
46
+ it ":delete removes step" do
47
+ #:delete
48
+ module Memo::Operation
49
+ class Admin < Create
50
+ step nil, delete: :validate
51
+ end
52
+ end
53
+ #:delete end
54
+
55
+ =begin
56
+ output =
57
+ #:delete-inspect
58
+ Trailblazer::Developer.railway(Memo::Operation::Admin)
59
+ #=> [>save_the_world,>notify]
60
+ #:delete-inspect end
61
+ =end
62
+
63
+ #~ignore end
64
+ end
65
+ end
66
+ end
67
+
68
+ module C
69
+ class Before_DocsSequenceOptionsTest < Minitest::Spec
70
+ it ":before" do
71
+ Memo = A::Id_DocSeqOptionsTest::Memo
72
+
73
+ #:before
74
+ module Memo::Operation
75
+ class Authorized < Memo::Operation::Create
76
+ step :policy, before: :validate
77
+ #~meths
78
+ include T.def_steps(:policy)
79
+ #~meths end
80
+ end
81
+ end
82
+ #:before end
83
+
84
+ =begin
85
+ #:before-inspect
86
+ Trailblazer::Developer.railway(Memo::Operation::Authorized)
87
+ #=> [>policy,>validate,>save_the_world,>notify]
88
+ #:before-inspect end
89
+ =end
90
+
91
+ #~ignore end
92
+ end
93
+
94
+ end
95
+ end
96
+
97
+ module D
98
+ class After_DocsSequenceOptionsTest < Minitest::Spec
99
+ it ":after" do
100
+ Memo = Class.new(A::Id_DocSeqOptionsTest::Memo)
101
+ Memo::Operation = Module.new
102
+ Memo::Operation::Create = Class.new(A::Id_DocSeqOptionsTest::Memo::Operation::Create)
103
+
104
+ #:after
105
+ module Memo::Operation
106
+ class Authorized < Memo::Operation::Create
107
+ step :policy, after: :validate
108
+ #~meths
109
+ include T.def_steps(:policy)
110
+ #~meths end
111
+ end
112
+ end
113
+ #:after end
114
+
115
+ =begin
116
+ #:after-inspect
117
+ Trailblazer::Developer.railway(Memo::Operation::Authorized)
118
+ #=> [>validate,>policy,>save_the_world,>notify]
119
+ #:after-inspect end
120
+ =end
121
+
122
+ #~ignore end
123
+ end
124
+ end
125
+ end
126
+
127
+ module E
128
+ class Replace_DocsSequenceOptionsTest < Minitest::Spec
129
+ Memo = Class.new
130
+ module Memo::Operation
131
+ class Create < Trailblazer::Operation
132
+ step :validate
133
+ step :save
134
+ step :notify
135
+ #~meths
136
+ include T.def_steps(:validate, :save, :notify)
137
+ #~meths end
138
+ end
139
+ end
140
+
141
+ it "{:replace} automatically assigns ID" do
142
+ #:replace
143
+ module Memo::Operation
144
+ class Update < Create
145
+ step :update, replace: :save
146
+ #~meths
147
+ include T.def_steps(:update)
148
+ #~meths end
149
+ end
150
+
151
+ end
152
+ #:replace end
153
+
154
+ =begin
155
+ #:replace-inspect
156
+ Trailblazer::Developer.railway(Memo::Operation::Update)
157
+ #=> [>validate,>update,>notify]
158
+ #:replace-inspect end
159
+ =end
160
+ assert Trailblazer::Activity::Introspect.Nodes(Memo::Operation::Update, id: :update)
161
+
162
+ #~ignore end
163
+ end
164
+ end
165
+ end
166
+
167
+ #@ {#replace} with {:id}
168
+ module E_2
169
+ class Replace_With_ID_DocsSequenceOptionsTest < Minitest::Spec
170
+ Memo = Class.new
171
+ module Memo::Operation
172
+ class Create < Trailblazer::Operation
173
+ step :validate
174
+ step :save
175
+ step :notify
176
+ #~meths
177
+ include T.def_steps(:validate, :save, :notify)
178
+ #~meths end
179
+ end
180
+ end
181
+
182
+ it "{:replace} allows explicit ID" do
183
+ #:replace-id
184
+ module Memo::Operation
185
+ class Update < Create
186
+ step :update, replace: :save, id: :update_memo
187
+ #~meths
188
+ include T.def_steps(:update)
189
+ #~meths end
190
+ end
191
+
192
+ end
193
+ #:replace-id end
194
+
195
+ # assert_equal Trailblazer::Developer.railway(Memo::Operation::Update), %([>validate,>update_memo,>notify])
196
+
197
+ Trailblazer::Activity::Introspect.Nodes(Memo::Operation::Update, id: :update_memo)
198
+
199
+ #~ignore end
200
+ end
201
+ end
202
+ end