trailblazer 2.0.7 → 2.1.0.beta1

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +35 -1
  3. data/Gemfile +6 -12
  4. data/README.md +3 -1
  5. data/Rakefile +6 -17
  6. data/lib/trailblazer.rb +7 -4
  7. data/lib/trailblazer/deprecation/call.rb +46 -0
  8. data/lib/trailblazer/deprecation/context.rb +43 -0
  9. data/lib/trailblazer/operation/contract.rb +40 -9
  10. data/lib/trailblazer/operation/deprecations.rb +21 -0
  11. data/lib/trailblazer/operation/guard.rb +5 -5
  12. data/lib/trailblazer/operation/model.rb +15 -10
  13. data/lib/trailblazer/operation/nested.rb +56 -85
  14. data/lib/trailblazer/operation/persist.rb +4 -2
  15. data/lib/trailblazer/operation/policy.rb +16 -7
  16. data/lib/trailblazer/operation/pundit.rb +3 -3
  17. data/lib/trailblazer/operation/representer.rb +5 -0
  18. data/lib/trailblazer/operation/rescue.rb +12 -9
  19. data/lib/trailblazer/operation/validate.rb +36 -29
  20. data/lib/trailblazer/operation/wrap.rb +49 -11
  21. data/lib/trailblazer/task.rb +20 -0
  22. data/lib/trailblazer/version.rb +1 -1
  23. data/test/benchmark.rb +63 -0
  24. data/test/deprecation/call_test.rb +42 -0
  25. data/test/deprecation/context_test.rb +19 -0
  26. data/test/docs/contract_test.rb +73 -53
  27. data/test/docs/dry_test.rb +2 -2
  28. data/test/docs/fast_test.rb +133 -13
  29. data/test/docs/guard_test.rb +28 -35
  30. data/test/docs/macro_test.rb +1 -1
  31. data/test/docs/model_test.rb +13 -13
  32. data/test/docs/nested_test.rb +54 -122
  33. data/test/docs/operation_test.rb +42 -43
  34. data/test/docs/pundit_test.rb +16 -16
  35. data/test/docs/representer_test.rb +18 -18
  36. data/test/docs/rescue_test.rb +29 -29
  37. data/test/docs/trace_test.rb +82 -0
  38. data/test/docs/wrap_test.rb +59 -26
  39. data/test/module_test.rb +75 -75
  40. data/test/nested_test.rb +293 -0
  41. data/test/operation/contract_test.rb +23 -153
  42. data/test/operation/dsl/contract_test.rb +9 -9
  43. data/test/operation/dsl/representer_test.rb +169 -169
  44. data/test/operation/model_test.rb +15 -21
  45. data/test/operation/persist_test.rb +18 -11
  46. data/test/operation/pundit_test.rb +25 -23
  47. data/test/operation/representer_test.rb +254 -254
  48. data/test/test_helper.rb +5 -2
  49. data/test/variables_test.rb +158 -0
  50. data/trailblazer.gemspec +1 -1
  51. data/untitled +33 -0
  52. metadata +25 -27
  53. data/lib/trailblazer/operation/callback.rb +0 -35
  54. data/lib/trailblazer/operation/procedural/contract.rb +0 -15
  55. data/lib/trailblazer/operation/procedural/validate.rb +0 -22
  56. data/test/operation/callback_test.rb +0 -70
  57. data/test/operation/dsl/callback_test.rb +0 -106
  58. data/test/operation/params_test.rb +0 -36
  59. data/test/operation/pipedream_test.rb +0 -59
  60. data/test/operation/pipetree_test.rb +0 -104
  61. data/test/operation/present_test.rb +0 -24
  62. data/test/operation/resolver_test.rb +0 -47
  63. data/test/operation_test.rb +0 -143
@@ -11,8 +11,8 @@ class DocsOperationExampleTest < Minitest::Spec
11
11
  step Model( Song, :new )
12
12
  step :assign_current_user!
13
13
  # ..
14
- def assign_current_user!(options)
15
- options["model"].created_by = options["current_user"]
14
+ def assign_current_user!(options, **)
15
+ options[:model].created_by = options[:current_user]
16
16
  end
17
17
  end
18
18
  #:invocation-dep end
@@ -20,46 +20,44 @@ class DocsOperationExampleTest < Minitest::Spec
20
20
  it do
21
21
  current_user = User.new("Ema")
22
22
  #:invocation-dep-call
23
- result = Create.( { title: "Roxanne" }, "current_user" => current_user )
23
+ result = Create.( params: { title: "Roxanne" }, :current_user => current_user )
24
24
  #:invocation-dep-call end
25
25
 
26
26
  #:invocation-dep-res
27
- result["current_user"] #=> #<User name="Ema">
28
- result["model"] #=> #<Song id=nil, title=nil, created_by=#<User name="Ema">>
27
+ result[:current_user] #=> #<User name="Ema">
28
+ result[:model] #=> #<Song id=nil, title=nil, created_by=#<User name="Ema">>
29
29
  #:invocation-dep-res end
30
30
  end
31
31
 
32
- it { Create.({ title: "Roxanne" }, "current_user" => Module).inspect("model").must_equal %{<Result:true [#<struct DocsOperationExampleTest::Song id=nil, title=nil, created_by=Module>] >} }
32
+ it { Create.(params: { title: "Roxanne" }, :current_user => Module).inspect(:model).must_equal %{<Result:true [#<struct DocsOperationExampleTest::Song id=nil, title=nil, created_by=Module>] >} }
33
33
 
34
34
  #:op
35
35
  class Song::Create < Trailblazer::Operation
36
- extend Contract::DSL
37
-
38
- contract do
36
+ class Form < Reform::Form
39
37
  property :title
40
38
  validates :title, presence: true
41
39
  end
42
40
 
43
41
  step Model( Song, :new )
44
42
  step :assign_current_user!
45
- step Contract::Build()
43
+ step Contract::Build( constant: Form )
46
44
  step Contract::Validate( )
47
45
  failure :log_error!
48
46
  step Contract::Persist( )
49
47
 
50
- def log_error!(options)
48
+ def log_error!(options, **)
51
49
  # ..
52
50
  end
53
51
 
54
- def assign_current_user!(options)
55
- options["model"].created_by =
56
- options["current_user"]
52
+ def assign_current_user!(options, **)
53
+ options[:model].created_by =
54
+ options[:current_user]
57
55
  end
58
56
  end
59
57
  #:op end
60
58
 
61
- it { Song::Create.({ }).inspect("model").must_equal %{<Result:false [#<struct DocsOperationExampleTest::Song id=nil, title=nil, created_by=nil>] >} }
62
- it { Song::Create.({ title: "Nothin'" }, "current_user"=>Module).inspect("model").must_equal %{<Result:true [#<struct DocsOperationExampleTest::Song id=nil, title="Nothin'", created_by=Module>] >} }
59
+ it { Song::Create.(params: { }).inspect(:model).must_equal %{<Result:false [#<struct DocsOperationExampleTest::Song id=nil, title=nil, created_by=nil>] >} }
60
+ it { Song::Create.(params: { title: "Nothin'" }, :current_user=>Module).inspect(:model).must_equal %{<Result:true [#<struct DocsOperationExampleTest::Song id=nil, title="Nothin'", created_by=Module>] >} }
63
61
  end
64
62
 
65
63
  class DndTest < Minitest::Spec
@@ -83,8 +81,8 @@ class DocsResultTest < Minitest::Spec
83
81
  step :validate!
84
82
 
85
83
  def model!(options, current_user:, **)
86
- options["model"] = Song.new
87
- options["model"].created_by = current_user
84
+ options[:model] = Song.new
85
+ options[:model].created_by = current_user
88
86
  end
89
87
 
90
88
  def assign!(*, params:, model:, **)
@@ -102,13 +100,13 @@ class DocsResultTest < Minitest::Spec
102
100
  it do
103
101
  current_user = Struct.new(:email).new("nick@trailblazer.to")
104
102
  #:step-res
105
- result = Song::Create.({ title: "Roxanne" }, "current_user" => current_user)
103
+ result = Song::Create.(params: { title: "Roxanne" }, :current_user => current_user)
106
104
 
107
- result["model"] #=> #<Song title="Roxanne", "created_by"=<User ...>
105
+ result[:model] #=> #<Song title="Roxanne", "created_by"=<User ...>
108
106
  result["result.validate"] #=> true
109
107
  #:step-res end
110
108
 
111
- result.inspect("current_user", "model").must_equal %{<Result:true [#<struct email=\"nick@trailblazer.to\">, #<struct DocsResultTest::Song id=nil, title="Roxanne", created_by=#<struct email=\"nick@trailblazer.to\">>] >}
109
+ result.inspect(:current_user, :model).must_equal %{<Result:true [#<struct email=\"nick@trailblazer.to\">, #<struct DocsResultTest::Song id=nil, title="Roxanne", created_by=#<struct email=\"nick@trailblazer.to\">>] >}
112
110
 
113
111
  #:step-binary
114
112
  result.success? #=> true
@@ -116,11 +114,11 @@ class DocsResultTest < Minitest::Spec
116
114
  #:step-binary end
117
115
 
118
116
  #:step-dep
119
- result["current_user"] #=> <User ...>
117
+ result[:current_user] #=> <User ...>
120
118
  #:step-dep end
121
119
 
122
120
  #:step-inspect
123
- result.inspect("current_user", "model") #=> "<Result:true [#<User email=\"nick@tra... "
121
+ result.inspect(:current_user, :model) #=> "<Result:true [#<User email=\"nick@tra... "
124
122
  #:step-inspect end
125
123
  end
126
124
  end
@@ -133,6 +131,7 @@ class DocsDependencyTest < Minitest::Spec
133
131
 
134
132
  #:dep-op
135
133
  class Song::Create < Trailblazer::Operation
134
+ extend ClassDependencies
136
135
  self["my.model.class"] = Song
137
136
 
138
137
  #~dep-pipe
@@ -194,19 +193,19 @@ class DocsOperationAPIExampleTest < Minitest::Spec
194
193
  failure :log_error!
195
194
  step Contract::Persist()
196
195
 
197
- def log_error!(options)
196
+ def log_error!(options, **)
198
197
  # ..
199
198
  end
200
199
 
201
- def assign_current_user!(options)
202
- options["model"].created_by =
203
- options["current_user"]
200
+ def assign_current_user!(options, **)
201
+ options[:model].created_by =
202
+ options[:current_user]
204
203
  end
205
204
  end
206
205
  #:op-api end
207
206
 
208
- it { Song::Create.({ }).inspect("model").must_equal %{<Result:false [#<struct DocsOperationAPIExampleTest::Song id=nil, title=nil, created_by=nil>] >} }
209
- it { Song::Create.({ title: "Nothin'" }, "current_user"=>Module).inspect("model").must_equal %{<Result:true [#<struct DocsOperationAPIExampleTest::Song id=nil, title="Nothin'", created_by=Module>] >} }
207
+ it { Song::Create.(params: {}).inspect(:model).must_equal %{<Result:false [#<struct DocsOperationAPIExampleTest::Song id=nil, title=nil, created_by=nil>] >} }
208
+ it { Song::Create.(params: { title: "Nothin'" }, :current_user=>Module).inspect(:model).must_equal %{<Result:true [#<struct DocsOperationAPIExampleTest::Song id=nil, title="Nothin'", created_by=Module>] >} }
210
209
  end
211
210
 
212
211
 
@@ -227,7 +226,7 @@ class DocsOperationInheritanceTest < Minitest::Spec
227
226
  end
228
227
  #:inh-new end
229
228
 
230
- puts New["pipetree"].inspect(style: :row)
229
+ puts Trailblazer::Operation::Inspect.(New, style: :row)
231
230
  =begin
232
231
  #:inh-new-pipe
233
232
  0 =======================>>operation.new
@@ -243,7 +242,7 @@ class DocsOperationInheritanceTest < Minitest::Spec
243
242
  end
244
243
  #:inh-create end
245
244
 
246
- puts Create["pipetree"].inspect(style: :row)
245
+ puts Trailblazer::Operation::Inspect.(Create, style: :row)
247
246
  =begin
248
247
  #:inh-create-pipe
249
248
  0 =======================>>operation.new
@@ -279,7 +278,7 @@ class DocsOperationInheritanceTest < Minitest::Spec
279
278
  end
280
279
  #:override-new end
281
280
 
282
- puts Song::New["pipetree"].inspect(style: :row)
281
+ puts Trailblazer::Operation::Inspect.(Song::New, style: :row)
283
282
  =begin
284
283
  #:override-pipe
285
284
  Song::New["pipetree"].inspect(style: :row)
@@ -290,8 +289,8 @@ class DocsOperationInheritanceTest < Minitest::Spec
290
289
  =end
291
290
 
292
291
  it do
293
- Song::New["pipetree"].inspect.must_equal %{[>operation.new,>model.build,>contract.build]}
294
- Song::New.().inspect("model").must_equal %{<Result:true [#<struct DocsOperationInheritanceTest::Song id=nil, title=nil, created_by=nil>] >}
292
+ Trailblazer::Operation::Inspect.(Song::New).must_equal %{[>model.build,>contract.build]}
293
+ Song::New.(params: {}).inspect(:model).must_equal %{<Result:true [#<struct DocsOperationInheritanceTest::Song id=nil, title=nil, created_by=nil>] >}
295
294
  end
296
295
  end
297
296
 
@@ -309,7 +308,7 @@ class DocsOperationStepOptionsTest < Minitest::Spec
309
308
  end
310
309
  #:name-auto end
311
310
 
312
- puts New["pipetree"].inspect(style: :row)
311
+ puts Trailblazer::Operation::Inspect.(New, style: :row)
313
312
  =begin
314
313
  #:name-auto-pipe
315
314
  0 =======================>>operation.new
@@ -323,7 +322,7 @@ class DocsOperationStepOptionsTest < Minitest::Spec
323
322
  end
324
323
  #:replace-inh end
325
324
 
326
- puts Update["pipetree"].inspect(style: :row)
325
+ puts Trailblazer::Operation::Inspect.(Update, style: :row)
327
326
  =begin
328
327
  #:replace-inh-pipe
329
328
  0 =======================>>operation.new
@@ -331,7 +330,7 @@ class DocsOperationStepOptionsTest < Minitest::Spec
331
330
  #:replace-inh-pipe end
332
331
  =end
333
332
 
334
- it { Update.({}).inspect("model").must_equal %{<Result:false [nil] >} }
333
+ it { Update.(params: {}).inspect(:model).must_equal %{<Result:false [nil] >} }
335
334
 
336
335
 
337
336
  # #:delete-inh
@@ -349,19 +348,19 @@ class DocsOperationStepOptionsTest < Minitest::Spec
349
348
  # #:delete-inh-pipe end
350
349
  # =end
351
350
 
352
- # it { Noop.({}).inspect("model").must_equal %{<Result:false [nil] >} }
351
+ # it { Noop.({}).inspect(:model).must_equal %{<Result:false [nil] >} }
353
352
  end
354
353
 
355
354
  class ManualNameTest < Minitest::Spec
356
355
  #:name-manu
357
356
  class New < Trailblazer::Operation
358
- step Model( Song, :new ), name: "build.song.model"
357
+ step(Model( Song, :new ), {name: "build.song.model"})
359
358
  step :validate_params!, name: "my.params.validate"
360
359
  # ..
361
360
  end
362
361
  #:name-manu end
363
362
 
364
- puts New["pipetree"].inspect(style: :row)
363
+ puts Trailblazer::Operation::Inspect.(New, style: :row)
365
364
  =begin
366
365
  #:name-manu-pipe
367
366
  0 =======================>>operation.new
@@ -380,7 +379,7 @@ class DocsOperationStepOptionsTest < Minitest::Spec
380
379
  end
381
380
  #:pos-before end
382
381
 
383
- puts New["pipetree"].inspect(style: :row)
382
+ puts Trailblazer::Operation::Inspect.(New, style: :row)
384
383
  =begin
385
384
  #:pos-before-pipe
386
385
  0 =======================>>operation.new
@@ -391,11 +390,11 @@ class DocsOperationStepOptionsTest < Minitest::Spec
391
390
 
392
391
  #:pos-inh
393
392
  class Create < New
394
- step :policy!, after: "operation.new"
393
+ step :policy!, before: "model.build"
395
394
  end
396
395
  #:pos-inh end
397
396
 
398
- puts Create["pipetree"].inspect(style: :row)
397
+ puts Trailblazer::Operation::Inspect.(Create, style: :row)
399
398
  =begin
400
399
  #:pos-inh-pipe
401
400
  0 =======================>>operation.new
@@ -29,13 +29,13 @@ class DocsPunditProcTest < Minitest::Spec
29
29
  end
30
30
  #:pundit end
31
31
 
32
- it { Create["pipetree"].inspect.must_equal %{[>operation.new,>model.build,>policy.default.eval]} }
33
- it { Create.({}, "current_user" => Module).inspect("model").must_equal %{<Result:true [#<struct DocsPunditProcTest::Song id=nil>] >} }
34
- it { Create.({} ).inspect("model").must_equal %{<Result:false [#<struct DocsPunditProcTest::Song id=nil>] >} }
32
+ it { Trailblazer::Operation::Inspect.(Create).must_equal %{[>model.build,>policy.default.eval]} }
33
+ it { Create.(params: {}, current_user: Module).inspect(:model).must_equal %{<Result:true [#<struct DocsPunditProcTest::Song id=nil>] >} }
34
+ it { Create.(params: {} ).inspect(:model).must_equal %{<Result:false [#<struct DocsPunditProcTest::Song id=nil>] >} }
35
35
 
36
36
  it do
37
37
  #:pundit-result
38
- result = Create.({}, "current_user" => Module)
38
+ result = Create.(params: {}, current_user: Module)
39
39
  result["result.policy.default"].success? #=> true
40
40
  result["result.policy.default"]["policy"] #=> #<MyPolicy ...>
41
41
  #:pundit-result end
@@ -49,9 +49,9 @@ class DocsPunditProcTest < Minitest::Spec
49
49
  step Policy::Pundit( MyPolicy, :new? ), override: true
50
50
  end
51
51
 
52
- it { New["pipetree"].inspect.must_equal %{[>operation.new,>model.build,>policy.default.eval]} }
53
- it { New.({}, "current_user" => Class ).inspect("model").must_equal %{<Result:true [#<struct DocsPunditProcTest::Song id=nil>] >} }
54
- it { New.({}, "current_user" => nil ).inspect("model").must_equal %{<Result:false [#<struct DocsPunditProcTest::Song id=nil>] >} }
52
+ it { Trailblazer::Operation::Inspect.(New).must_equal %{[>model.build,>policy.default.eval]} }
53
+ it { New.(params: {}, current_user: Class ).inspect(:model).must_equal %{<Result:true [#<struct DocsPunditProcTest::Song id=nil>] >} }
54
+ it { New.(params: {}, current_user: nil ).inspect(:model).must_equal %{<Result:false [#<struct DocsPunditProcTest::Song id=nil>] >} }
55
55
 
56
56
  #---
57
57
  #- override with :name
@@ -64,10 +64,10 @@ class DocsPunditProcTest < Minitest::Spec
64
64
  step Policy::Pundit( MyPolicy, :new?, name: "first" ), override: true
65
65
  end
66
66
 
67
- it { Edit["pipetree"].inspect.must_equal %{[>operation.new,>policy.first.eval,>policy.second.eval]} }
68
- it { Edit.({}, "current_user" => Class).inspect("model").must_equal %{<Result:false [nil] >} }
69
- it { Update["pipetree"].inspect.must_equal %{[>operation.new,>policy.first.eval,>policy.second.eval]} }
70
- it { Update.({}, "current_user" => Class).inspect("model").must_equal %{<Result:true [nil] >} }
67
+ it { Trailblazer::Operation::Inspect.(Edit).must_equal %{[>policy.first.eval,>policy.second.eval]} }
68
+ it { Edit.(params: {}, current_user: Class).inspect(:model).must_equal %{<Result:false [nil] >} }
69
+ it { Trailblazer::Operation::Inspect.(Update).must_equal %{[>policy.first.eval,>policy.second.eval]} }
70
+ it { Update.(params: {}, current_user: Class).inspect(:model).must_equal %{<Result:true [nil] >} }
71
71
 
72
72
  #---
73
73
  # dependency injection
@@ -80,8 +80,8 @@ class DocsPunditProcTest < Minitest::Spec
80
80
  it {
81
81
  result =
82
82
  #:di-call
83
- Create.({},
84
- "current_user" => Module,
83
+ Create.(params: {},
84
+ current_user: Module,
85
85
  "policy.default.eval" => Trailblazer::Operation::Policy::Pundit.build(AnotherPolicy, :create?)
86
86
  )
87
87
  #:di-call end
@@ -103,7 +103,7 @@ class PunditWithNameTest < Minitest::Spec
103
103
 
104
104
  it {
105
105
  #:name-call
106
- result = Create.({}, "current_user" => Module)
106
+ result = Create.(params: {}, current_user: Module)
107
107
  result["result.policy.after_model"].success? #=> true
108
108
  #:name-call end
109
109
  result["result.policy.after_model"].success?.must_equal true }
@@ -123,8 +123,8 @@ end
123
123
  # #:class-level end
124
124
 
125
125
  # it { Create.(); Create["result.policy"].must_equal nil }
126
- # it { Create.({}, "current_user" => Module)["x"].must_equal true }
127
- # it { Create.({} )["x"].must_equal nil }
126
+ # it { Create.(params: {}, current_user: Module)["x"].must_equal true }
127
+ # it { Create.(params: {} )["x"].must_equal nil }
128
128
  # end
129
129
 
130
130
 
@@ -20,7 +20,7 @@ class DocsRepresenterInferTest < Minitest::Spec
20
20
  #:infer end
21
21
 
22
22
  let (:json) { MultiJson.dump(id: 1) }
23
- it { Create.({}, "document" => json).inspect("model").must_equal %{<Result:true [#<struct DocsRepresenterInferTest::Song id=1, title=nil>] >} }
23
+ it { Create.( params: {}, document: json ).inspect(:model).must_equal %{<Result:true [#<struct DocsRepresenterInferTest::Song id=1, title=nil>] >} }
24
24
  end
25
25
 
26
26
  #---
@@ -49,18 +49,18 @@ class DocsRepresenterExplicitTest < Minitest::Spec
49
49
  #:explicit-op end
50
50
 
51
51
  let (:json) { MultiJson.dump(id: 1) }
52
- it { Create.({}, "document" => json).inspect("model").must_equal %{<Result:true [#<struct DocsRepresenterExplicitTest::Song id=1, title=nil>] >} }
52
+ it { Create.(params: {}, document: json).inspect(:model).must_equal %{<Result:true [#<struct DocsRepresenterExplicitTest::Song id=1, title=nil>] >} }
53
53
  it do
54
54
  #:explicit-call
55
- Create.({}, "document" => '{"id": 1}')
55
+ Create.(params: {}, document: '{"id": 1}')
56
56
  #:explicit-call end
57
57
  end
58
58
 
59
59
  #- render
60
60
  it do
61
61
  #:render
62
- result = Create.({}, "document" => '{"id": 1}')
63
- json = result["representer.default.class"].new(result["model"]).to_json
62
+ result = Create.( params: {}, document: '{"id": 1}' )
63
+ json = result["representer.default.class"].new(result[:model]).to_json
64
64
  json #=> '{"id":1}'
65
65
  #:render end
66
66
  json.must_equal '{"id":1}'
@@ -81,12 +81,12 @@ class DocsRepresenterExplicitTest < Minitest::Spec
81
81
  let (:xml) { %{<body><id>1</id></body>} }
82
82
  it do
83
83
  #:di-call
84
- result = Create.({},
85
- "document" => '<body><id>1</id></body>',
84
+ result = Create.(params: {},
85
+ document: '<body><id>1</id></body>',
86
86
  "representer.default.class" => MyXMLRepresenter # injection
87
87
  )
88
88
  #:di-call end
89
- result.inspect("model").must_equal %{<Result:true [#<struct DocsRepresenterExplicitTest::Song id="1", title=nil>] >}
89
+ result.inspect(:model).must_equal %{<Result:true [#<struct DocsRepresenterExplicitTest::Song id="1", title=nil>] >}
90
90
  end
91
91
  end
92
92
 
@@ -112,8 +112,8 @@ class DocsRepresenterDITest < Minitest::Spec
112
112
  end
113
113
 
114
114
  let (:json) { MultiJson.dump(id: 1) }
115
- it { Create.({}, "document" => json,
116
- "representer.default.class" => MyRepresenter).inspect("model").must_equal %{<Result:true [#<struct DocsRepresenterDITest::Song id=1, title=nil>] >} }
115
+ it { Create.(params: {}, document: json,
116
+ "representer.default.class" => MyRepresenter).inspect(:model).must_equal %{<Result:true [#<struct DocsRepresenterDITest::Song id=1, title=nil>] >} }
117
117
  end
118
118
 
119
119
  #---
@@ -141,7 +141,7 @@ class DocsRepresenterInlineTest < Minitest::Spec
141
141
  #:inline end
142
142
 
143
143
  let (:json) { MultiJson.dump(id: 1) }
144
- it { Create.({}, "document" => json).inspect("model").must_equal %{<Result:true [#<struct DocsRepresenterInlineTest::Song id=1, title=nil>] >} }
144
+ it { Create.(params: {}, document: json).inspect(:model).must_equal %{<Result:true [#<struct DocsRepresenterInlineTest::Song id=1, title=nil>] >} }
145
145
  end
146
146
 
147
147
  #---
@@ -163,8 +163,8 @@ class DocsRepresenterManualRenderTest < Minitest::Spec
163
163
  end
164
164
 
165
165
  it do
166
- result =Show.({ id: 1 })
167
- json = result["representer.default.class"].new(result["model"]).to_json
166
+ result =Show.(params: { id: 1 })
167
+ json = result["representer.default.class"].new(result[:model]).to_json
168
168
  json.must_equal %{{"id":1}}
169
169
  end
170
170
  end
@@ -236,19 +236,19 @@ class DocsRepresenterFullExampleTest < Minitest::Spec
236
236
  #:full end
237
237
 
238
238
  it do
239
- result =Create.({}, "document" => '{"title": "Tested"}')
239
+ result =Create.(params: {}, document: '{"title": "Tested"}')
240
240
 
241
- json = result["representer.render.class"].new(result["model"]).to_json
241
+ json = result["representer.render.class"].new(result[:model]).to_json
242
242
 
243
243
  json.must_equal %{{"id":1,"title":"Tested","_links":{"self":{"href":"/songs/1"}}}}
244
244
 
245
245
 
246
246
  #:full-call
247
247
  def create
248
- result = Create.(params, "document" => request.body.read)
248
+ result = Create.(params, document: request.body.read)
249
249
 
250
250
  if result.success?
251
- result["representer.render.class"].new(result["model"]).to_json
251
+ result["representer.render.class"].new(result[:model]).to_json
252
252
  else
253
253
  result["representer.errors.class"].new(result["result.contract.default"]).to_json
254
254
  end
@@ -257,7 +257,7 @@ class DocsRepresenterFullExampleTest < Minitest::Spec
257
257
  end
258
258
 
259
259
  it do
260
- result =Create.({}, "document" => '{"title": ""}')
260
+ result =Create.(params: {}, document: '{"title": ""}')
261
261
 
262
262
  if result.failure?
263
263
  json = result["representer.errors.class"].new(result["result.contract.default"]).to_json
@@ -8,33 +8,33 @@ class NestedRescueTest < Minitest::Spec
8
8
 
9
9
  class NestedInsanity < Trailblazer::Operation
10
10
  step Rescue {
11
- step ->(options) { options["a"] = true }
11
+ step ->(options, **) { options["a"] = true }
12
12
  step Rescue {
13
- step ->(options) { options["y"] = true }
14
- success ->(options) { raise Y if options["raise-y"] }
15
- step ->(options) { options["z"] = true }
13
+ step ->(options, **) { options["y"] = true }
14
+ success ->(options, **) { raise Y if options["raise-y"] }
15
+ step ->(options, **) { options["z"] = true }
16
16
  }
17
- step ->(options) { options["b"] = true }
18
- success ->(options) { raise A if options["raise-a"] }
19
- step ->(options) { options["c"] = true }
20
- failure ->(options) { options["inner-err"] = true }
17
+ step ->(options, **) { options["b"] = true }
18
+ success ->(options, **) { raise A if options["raise-a"] }
19
+ step ->(options, **) { options["c"] = true }
20
+ failure ->(options, **) { options["inner-err"] = true }
21
21
  }
22
- step ->(options) { options["e"] = true }
23
- failure ->(options) { options["outer-err"] = true }
22
+ step ->(options, **) { options["e"] = true }, name: "nested/e"
23
+ failure ->(options, **) { options["outer-err"] = true }, name: "nested/failure"
24
24
  end
25
25
 
26
- it { NestedInsanity["pipetree"].inspect.must_equal %{[>operation.new,>Rescue:10,>rescue_test.rb:22,<rescue_test.rb:23]} }
27
- it { NestedInsanity.({}).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:true [true, true, true, true, true, true, nil, nil] >} }
28
- it { NestedInsanity.({}, "raise-y" => true).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:false [true, true, nil, nil, nil, nil, true, true] >} }
29
- it { NestedInsanity.({}, "raise-a" => true).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:false [true, true, true, true, nil, nil, nil, true] >} }
26
+ it { Trailblazer::Operation::Inspect.(NestedInsanity).must_match /\[>Rescue\(\d+\),>nested/ } # FIXME: better introspect tests for all id-generating macros.
27
+ it { NestedInsanity.().inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:true [true, true, true, true, true, true, nil, nil] >} }
28
+ it { NestedInsanity.( "raise-y" => true).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:false [true, true, nil, nil, nil, nil, true, true] >} }
29
+ it { NestedInsanity.( "raise-a" => true).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:false [true, true, true, true, nil, nil, nil, true] >} }
30
30
 
31
31
  #-
32
32
  # inheritance
33
33
  class UbernestedInsanity < NestedInsanity
34
34
  end
35
35
 
36
- it { UbernestedInsanity.({}).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:true [true, true, true, true, true, true, nil, nil] >} }
37
- it { UbernestedInsanity.({}, "raise-a" => true).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:false [true, true, true, true, nil, nil, nil, true] >} }
36
+ it { UbernestedInsanity.().inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:true [true, true, true, true, true, true, nil, nil] >} }
37
+ it { UbernestedInsanity.( "raise-a" => true).inspect("a", "y", "z", "b", "c", "e", "inner-err", "outer-err").must_equal %{<Result:false [true, true, true, true, nil, nil, nil, true] >} }
38
38
  end
39
39
 
40
40
  class RescueTest < Minitest::Spec
@@ -66,8 +66,8 @@ class RescueTest < Minitest::Spec
66
66
  end
67
67
  #:simple end
68
68
 
69
- it { Create.( id: 1, title: "Prodigal Son" )["contract.default"].model.inspect.must_equal %{#<struct RescueTest::Song id=1, title="Prodigal Son">} }
70
- it { Create.( id: nil ).inspect("model").must_equal %{<Result:false [nil] >} }
69
+ it { Create.( params: {id: 1, title: "Prodigal Son"} )["contract.default"].model.inspect.must_equal %{#<struct RescueTest::Song id=1, title="Prodigal Son">} }
70
+ it { Create.( params: {id: nil} ).inspect(:model).must_equal %{<Result:false [nil] >} }
71
71
 
72
72
  #-
73
73
  # Rescue ExceptionClass, handler: ->(*) { }
@@ -91,10 +91,10 @@ class RescueTest < Minitest::Spec
91
91
  end
92
92
  #:name end
93
93
 
94
- it { Create.( id: 1, title: "Prodigal Son" )["contract.default"].model.inspect.must_equal %{#<struct RescueTest::Song id=1, title="Prodigal Son">} }
95
- it { Create.( id: 1, title: "Prodigal Son" ).inspect("x").must_equal %{<Result:true [nil] >} }
96
- it { Create.( id: nil ).inspect("model", "x").must_equal %{<Result:false [nil, RescueTest::RecordNotFound] >} }
97
- it { assert_raises(RuntimeError) { Create.( id: "RuntimeError!" ) } }
94
+ it { Create.( params: {id: 1, title: "Prodigal Son"} )["contract.default"].model.inspect.must_equal %{#<struct RescueTest::Song id=1, title="Prodigal Son">} }
95
+ it { Create.( params: {id: 1, title: "Prodigal Son"} ).inspect("x").must_equal %{<Result:true [nil] >} }
96
+ it { Create.( params: {id: nil} ).inspect(:model, "x").must_equal %{<Result:false [nil, RescueTest::RecordNotFound] >} }
97
+ it { assert_raises(RuntimeError) { Create.( params: {id: "RuntimeError!"} ) } }
98
98
  end
99
99
 
100
100
 
@@ -120,7 +120,7 @@ class RescueTest < Minitest::Spec
120
120
  step Rescue( RecordNotFound, handler: :rollback! ) {
121
121
  step Wrap ->(*, &block) { Sequel.transaction do block.call end } {
122
122
  step Model( Song, :find )
123
- step ->(options) { options["model"].lock! } # lock the model.
123
+ step ->(options, *) { options[:model].lock! } # lock the model.
124
124
  step Contract::Build( constant: MyContract )
125
125
  step Contract::Validate( )
126
126
  step Contract::Persist( method: :sync )
@@ -134,7 +134,7 @@ class RescueTest < Minitest::Spec
134
134
  #~ex end
135
135
  end
136
136
 
137
- def error!(options)
137
+ def error!(options, *)
138
138
  #~ex
139
139
  options["err"] = true
140
140
  #~ex end
@@ -142,13 +142,13 @@ class RescueTest < Minitest::Spec
142
142
  end
143
143
  #:example end
144
144
 
145
- it { Create.( id: 1, title: "Pie" ).inspect("model", "x", "err").must_equal %{<Result:true [#<struct RescueTest::Song id=1, title=\"Pie\">, nil, nil] >} }
145
+ it { Create.( params: {id: 1, title: "Pie"} ).inspect(:model, "x", "err").must_equal %{<Result:true [#<struct RescueTest::Song id=1, title=\"Pie\">, nil, nil] >} }
146
146
  # raise exceptions in Model:
147
- it { Create.( id: nil ).inspect("model", "x").must_equal %{<Result:false [nil, RescueTest::RecordNotFound] >} }
148
- it { assert_raises(RuntimeError) { Create.( id: "RuntimeError!" ) } }
147
+ it { Create.( params: {id: nil} ).inspect(:model, "x").must_equal %{<Result:false [nil, RescueTest::RecordNotFound] >} }
148
+ it { assert_raises(RuntimeError) { Create.( params: {id: "RuntimeError!"} ) } }
149
149
  it do
150
- Create.( id: 1, title: "Pie" )
151
- Sequel.result.first.must_equal Pipetree::Railway::Right
150
+ Create.( params: {id: 1, title: "Pie"} )
151
+ Sequel.result.first.must_be_kind_of Trailblazer::Operation::Railway::End::Success
152
152
  end
153
153
  end
154
154
  end