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
@@ -3,46 +3,33 @@ require "test_helper"
3
3
  #--
4
4
  # with proc
5
5
  class DocsGuardProcTest < Minitest::Spec
6
- # test without KWs, only options.
7
- class Update < Trailblazer::Operation
8
- step Policy::Guard( ->(options) { options["params"][:pass] } )
9
- step ->(options, *) { options["x"] = true }
10
- end
11
-
12
- it { Update.(pass: false)["x"].must_equal nil }
13
- it { Update.(pass: true)["x"].must_equal true }
14
- # TODO: test excp when current_user not available
15
-
16
6
  #:proc
17
7
  class Create < Trailblazer::Operation
18
- step Policy::Guard( ->(options, params:, **) { params[:pass] } )
8
+ step Policy::Guard( ->(options, pass:, **) { pass } )
19
9
  #~pipeonly
20
10
  step :process
21
11
 
22
- def process(*)
23
- self["x"] = true
12
+ def process(options, **)
13
+ options["x"] = true
24
14
  end
25
15
  #~pipeonly end
26
16
  end
27
17
  #:proc end
28
18
 
29
- it { Create.(pass: false)["x"].must_equal nil }
19
+ it { Create.(pass: false)["x"].must_be_nil }
30
20
  it { Create.(pass: true)["x"].must_equal true }
31
21
 
32
22
  #- result object, guard
33
23
  it { Create.(pass: true)["result.policy.default"].success?.must_equal true }
34
24
  it { Create.(pass: false)["result.policy.default"].success?.must_equal false }
35
25
 
36
-
37
-
38
-
39
- #---
26
+ #---
40
27
  #- Guard inheritance
41
28
  class New < Create
42
29
  step Policy::Guard( ->(options, current_user:, **) { current_user } ), override: true
43
30
  end
44
31
 
45
- it { New["pipetree"].inspect.must_equal %{[>operation.new,>policy.default.eval,>process]} }
32
+ it { Trailblazer::Operation::Inspect.(New).must_equal %{[>policy.default.eval,>process]} }
46
33
  end
47
34
 
48
35
  #---
@@ -52,8 +39,8 @@ class DocsGuardTest < Minitest::Spec
52
39
  class MyGuard
53
40
  include Uber::Callable
54
41
 
55
- def call(options, params:, **)
56
- params[:pass]
42
+ def call(options, pass:, **)
43
+ pass
57
44
  end
58
45
  end
59
46
  #:callable end
@@ -63,12 +50,15 @@ class DocsGuardTest < Minitest::Spec
63
50
  step Policy::Guard( MyGuard.new )
64
51
  #~pipe-only
65
52
  step :process
66
- def process(*); self[:x] = true; end
53
+
54
+ def process(options, **)
55
+ options[:x] = true
56
+ end
67
57
  #~pipe-only end
68
58
  end
69
59
  #:callable-op end
70
60
 
71
- it { Create.(pass: false)[:x].must_equal nil }
61
+ it { Create.(pass: false)[:x].must_be_nil }
72
62
  it { Create.(pass: true)[:x].must_equal true }
73
63
  end
74
64
 
@@ -79,12 +69,15 @@ class DocsGuardMethodTest < Minitest::Spec
79
69
  class Create < Trailblazer::Operation
80
70
  step Policy::Guard( :pass? )
81
71
 
82
- def pass?(options, params:, **)
83
- params[:pass]
72
+ def pass?(options, pass:, **)
73
+ pass
84
74
  end
85
75
  #~pipe-onlyy
86
76
  step :process
87
- def process(*); self["x"] = true; end
77
+
78
+ def process(options, **)
79
+ options["x"] = true
80
+ end
88
81
  #~pipe-onlyy end
89
82
  end
90
83
  #:method end
@@ -103,12 +96,12 @@ class DocsGuardNamedTest < Minitest::Spec
103
96
  end
104
97
  #:name end
105
98
 
106
- it { Create.({}, "current_user" => nil )["result.policy.user"].success?.must_equal false }
107
- it { Create.({}, "current_user" => Module)["result.policy.user"].success?.must_equal true }
99
+ it { Create.(:current_user => nil )["result.policy.user"].success?.must_equal false }
100
+ it { Create.(:current_user => Module)["result.policy.user"].success?.must_equal true }
108
101
 
109
102
  it {
110
103
  #:name-result
111
- result = Create.({}, "current_user" => true)
104
+ result = Create.(:current_user => true)
112
105
  result["result.policy.user"].success? #=> true
113
106
  #:name-result end
114
107
  }
@@ -123,13 +116,13 @@ class DocsGuardInjectionTest < Minitest::Spec
123
116
  end
124
117
  #:di-op end
125
118
 
126
- it { Create.({}, "current_user" => Module).inspect("").must_equal %{<Result:true [nil] >} }
119
+ it { Create.(:current_user => Module).inspect("").must_equal %{<Result:true [nil] >} }
127
120
  it {
128
121
  result =
129
122
  #:di-call
130
123
  Create.({},
131
- "current_user" => Module,
132
- "policy.default.eval" => Trailblazer::Operation::Policy::Guard.build(->(options) { false })
124
+ :current_user => Module,
125
+ "policy.default.eval" => Trailblazer::Operation::Policy::Guard.build(->(options, **) { false })
133
126
  )
134
127
  #:di-call end
135
128
  result.inspect("").must_equal %{<Result:false [nil] >} }
@@ -143,7 +136,7 @@ class DocsGuardMissingKeywordTest < Minitest::Spec
143
136
  end
144
137
 
145
138
  it { assert_raises(ArgumentError) { Create.() } }
146
- it { Create.({}, "current_user" => Module).success?.must_equal true }
139
+ it { Create.(:current_user => Module).success?.must_equal true }
147
140
  end
148
141
 
149
142
  #---
@@ -157,10 +150,10 @@ class DocsGuardPositionTest < Minitest::Spec
157
150
  end
158
151
  #:before end
159
152
 
160
- it { Create["pipetree"].inspect.must_equal %{[>operation.new,>policy.default.eval,>model!]} }
153
+ it { Trailblazer::Operation::Inspect.(Create).must_equal %{[>policy.default.eval,>model!]} }
161
154
  it do
162
155
  #:before-pipe
163
- puts Create["pipetree"].inspect(style: :rows) #=>
156
+ Trailblazer::Operation::Inspect.(Create, style: :rows) #=>
164
157
  # 0 ========================>operation.new
165
158
  # 1 ==================>policy.default.eval
166
159
  # 2 ===============================>model!
@@ -28,7 +28,7 @@ class DocsMacroTest < Minitest::Spec
28
28
  end
29
29
  =end
30
30
 
31
- it { Create["pipetree"].inspect.must_equal %{[>operation.new,>my_policy.manager]} }
31
+ it { Operation::Inspect.(Create).must_equal %{[>my_policy.manager]} }
32
32
  end
33
33
 
34
34
  # injectable option
@@ -20,11 +20,11 @@ class DocsModelTest < Minitest::Spec
20
20
 
21
21
  it do
22
22
  #:create
23
- result = Create.({})
24
- result["model"] #=> #<struct Song id=nil, title=nil>
23
+ result = Create.(params: {})
24
+ result[:model] #=> #<struct Song id=nil, title=nil>
25
25
  #:create end
26
26
 
27
- result["model"].inspect.must_equal %{#<struct DocsModelTest::Song id=nil, title=nil>}
27
+ result[:model].inspect.must_equal %{#<struct DocsModelTest::Song id=nil, title=nil>}
28
28
  end
29
29
 
30
30
  #:update
@@ -36,21 +36,21 @@ class DocsModelTest < Minitest::Spec
36
36
 
37
37
  it do
38
38
  #:update-ok
39
- result = Update.({ id: 1 })
40
- result["model"] #=> #<struct Song id=1, title="Roxanne">
39
+ result = Update.(params: { id: 1 })
40
+ result[:model] #=> #<struct Song id=1, title="Roxanne">
41
41
  #:update-ok end
42
42
 
43
- result["model"].inspect.must_equal %{#<struct DocsModelTest::Song id=1, title=nil>}
43
+ result[:model].inspect.must_equal %{#<struct DocsModelTest::Song id=1, title=nil>}
44
44
  end
45
45
 
46
46
  it do
47
47
  #:update-fail
48
- result = Update.({})
49
- result["model"] #=> nil
48
+ result = Update.(params: {})
49
+ result[:model] #=> nil
50
50
  result.success? #=> false
51
51
  #:update-fail end
52
52
 
53
- result["model"].must_be_nil
53
+ result[:model].must_be_nil
54
54
  result.success?.must_equal false
55
55
  end
56
56
 
@@ -62,14 +62,14 @@ class DocsModelTest < Minitest::Spec
62
62
  #:show end
63
63
 
64
64
  it do
65
- result = Show.({ id: 1 })
65
+ result = Show.(params: { id: 1 })
66
66
 
67
67
  #:show-ok
68
- result = Show.({ id: 1 })
69
- result["model"] #=> #<struct Song id=1, title="Roxanne">
68
+ result = Show.(params: { id: 1 })
69
+ result[:model] #=> #<struct Song id=1, title="Roxanne">
70
70
  #:show-ok end
71
71
 
72
72
  result.success?.must_equal true
73
- result["model"].inspect.must_equal %{#<struct DocsModelTest::Song id=100, title=nil>}
73
+ result[:model].inspect.must_equal %{#<struct DocsModelTest::Song id=100, title=nil>}
74
74
  end
75
75
  end
@@ -11,6 +11,7 @@ class DocsNestedOperationTest < Minitest::Spec
11
11
  #- nested operations
12
12
  #:edit
13
13
  class Edit < Trailblazer::Operation
14
+ extend ClassDependencies
14
15
  extend Contract::DSL
15
16
 
16
17
  contract do
@@ -26,97 +27,63 @@ class DocsNestedOperationTest < Minitest::Spec
26
27
  #:update
27
28
  class Update < Trailblazer::Operation
28
29
  step Nested( Edit )
30
+ # step ->(options, **) { puts options.keys.inspect }
29
31
  step Contract::Validate()
32
+
30
33
  step Contract::Persist( method: :sync )
31
34
  end
32
35
  #:update end
33
36
 
34
- puts Update["pipetree"].inspect(style: :rows)
37
+ # puts Update["pipetree"].inspect(style: :rows)
35
38
 
36
39
  #-
37
40
  # Edit allows grabbing model and contract
38
41
  it do
39
42
  #:edit-call
40
- result = Edit.(id: 1)
43
+ result = Edit.(params: {id: 1})
41
44
 
42
- result["model"] #=> #<Song id=1, title=\"Bristol\">
45
+ result[:model] #=> #<Song id=1, title=\"Bristol\">
43
46
  result["contract.default"] #=> #<Reform::Form ..>
44
47
  #:edit-call end
45
- result.inspect("model").must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title=\"Bristol\">] >}
46
- result["contract.default"].model.must_equal result["model"]
48
+ result.inspect(:model).must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title=\"Bristol\">] >}
49
+ result["contract.default"].model.must_equal result[:model]
50
+ end
51
+
52
+ it "provides all steps for Introspect" do
53
+ Trailblazer::Activity::Trace.compute_debug( Edit ).values.must_equal [{:id=>"model.build"}, {:id=>"contract.build"}]
54
+ Trailblazer::Activity::Trace.compute_debug( Update ).values.must_equal [{:id=>"Nested(DocsNestedOperationTest::Edit)"}, {:id=>"contract.default.validate"}, {:id=>"persist.save"}, {:id=>"model.build"}, {:id=>"contract.build"}, {:id=>"contract.default.params_extract"}, {:id=>"contract.default.call"}]
47
55
  end
48
56
 
57
+ #- test Edit circuit-level.
58
+ it do
59
+ signal, (result, _) = Edit.__call__( [Trailblazer::Context( params: {id: 1} ), {}] )
60
+ result[:model].inspect.must_equal %{#<struct DocsNestedOperationTest::Song id=1, title=\"Bristol\">}
61
+ end
62
+
49
63
  #-
50
- # Update also allows grabbing model and contract
64
+ # Update also allows grabbing Edit/model and Edit/contract
51
65
  it do
52
66
  #:update-call
53
- result = Update.(id: 1, title: "Call It A Night")
67
+ result = Update.(params: {id: 1, title: "Call It A Night"})
54
68
 
55
- result["model"] #=> #<Song id=1 , title=\"Call It A Night\">
69
+ result[:model] #=> #<Song id=1 , title=\"Call It A Night\">
56
70
  result["contract.default"] #=> #<Reform::Form ..>
57
71
  #:update-call end
58
- result.inspect("model").must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title=\"Call It A Night\">] >}
59
- result["contract.default"].model.must_equal result["model"]
72
+ result.inspect(:model).must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title=\"Call It A Night\">] >}
73
+ result["contract.default"].model.must_equal result[:model]
60
74
  end
61
75
 
62
76
  #-
63
77
  # Edit is successful.
64
78
  it do
65
- result = Update.({ id: 1, title: "Miami" }, "current_user" => Module)
66
- result.inspect("model").must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title="Miami">] >}
79
+ result = Update.(params: { id: 1, title: "Miami" }, current_user: Module)
80
+ result.inspect(:model).must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title="Miami">] >}
67
81
  end
68
82
 
69
83
  # Edit fails
70
84
  it do
71
- Update.(id: 2).inspect("model").must_equal %{<Result:false [nil] >}
72
- end
73
-
74
- #---
75
- #- shared data
76
- class B < Trailblazer::Operation
77
- success ->(options) { options["can.B.see.it?"] = options["this.should.not.be.visible.in.B"] }
78
- success ->(options) { options["can.B.see.current_user?"] = options["current_user"] }
79
- success ->(options) { options["can.B.see.params?"] = options["params"] }
80
- success ->(options) { options["can.B.see.A.class.data?"] = options["A.class.data"] }
81
- end
82
-
83
- class A < Trailblazer::Operation
84
- self["A.class.data"] = true
85
-
86
- success ->(options) { options["this.should.not.be.visible.in.B"] = true }
87
- step Nested( B )
88
- end
89
-
90
- # mutual data from A doesn't bleed into B.
91
- it { A.()["can.B.see.it?"].must_equal nil }
92
- it { A.()["this.should.not.be.visible.in.B"].must_equal true }
93
- # runtime dependencies are visible in B.
94
- it { A.({}, "current_user" => Module)["can.B.see.current_user?"].must_equal Module }
95
- it { A.({ a: 1 })["can.B.see.params?"].must_equal({ a: 1 }) }
96
- # class data from A doesn't bleed into B.
97
- it { A.()["can.B.see.A.class.data?"].must_equal nil }
98
-
99
-
100
- # cr_result = Create.({}, "result" => result)
101
- # puts cr_result["model"]
102
- # puts cr_result["contract.default"]
103
-
104
- #---
105
- #- Nested( .., input: )
106
- class C < Trailblazer::Operation
107
- self["C.class.data"] = true
108
-
109
- success ->(options) { options["this.should.not.be.visible.in.B"] = true }
110
-
111
- step Nested( B, input: ->(options, runtime_data:, mutable_data:, **) {
112
- runtime_data.merge( "this.should.not.be.visible.in.B" => mutable_data["this.should.not.be.visible.in.B"] )
113
- } )
85
+ Update.(params: {id: 2}).inspect(:model).must_equal %{<Result:false [nil] >}
114
86
  end
115
-
116
- it { C.()["can.B.see.it?"].must_equal true }
117
- it { C.()["this.should.not.be.visible.in.B"].must_equal true } # this IS visible since we use :input!
118
- it { C.({}, "current_user" => Module)["can.B.see.current_user?"].must_equal Module }
119
- it { C.()["can.B.see.A.class.data?"].must_equal nil }
120
87
  end
121
88
 
122
89
  class NestedInput < Minitest::Spec
@@ -128,19 +95,20 @@ class NestedInput < Minitest::Spec
128
95
 
129
96
  #:input-pi
130
97
  class MultiplyByPi < Trailblazer::Operation
131
- step ->(options) { options["pi_constant"] = 3.14159 }
132
- step Nested( Multiplier, input: ->(options, mutable_data:, runtime_data:, **) do
133
- { "y" => mutable_data["pi_constant"],
134
- "x" => runtime_data["x"] }
98
+ step ->(options, **) { options["pi_constant"] = 3.14159 }
99
+ step Nested( Multiplier, input: ->(options, **) do
100
+ { "y" => options["pi_constant"],
101
+ "x" => options["x"]
102
+ }
135
103
  end )
136
104
  end
137
105
  #:input-pi end
138
106
 
139
- it { MultiplyByPi.({}, "x" => 9).inspect("product").must_equal %{<Result:true [28.27431] >} }
107
+ it { MultiplyByPi.("x" => 9).inspect("product").must_equal %{<Result:true [28.27431] >} }
140
108
 
141
109
  it do
142
110
  #:input-result
143
- result = MultiplyByPi.({}, "x" => 9)
111
+ result = MultiplyByPi.("x" => 9)
144
112
  result["product"] #=> [28.27431]
145
113
  #:input-result end
146
114
  end
@@ -151,12 +119,10 @@ class NestedInputCallable < Minitest::Spec
151
119
 
152
120
  #:input-callable
153
121
  class MyInput
154
- extend Uber::Callable
155
-
156
- def self.call(options, mutable_data:, runtime_data:, **)
122
+ def self.call(options, **)
157
123
  {
158
- "y" => mutable_data["pi_constant"],
159
- "x" => runtime_data["x"]
124
+ "y" => options["pi_constant"],
125
+ "x" => options["x"]
160
126
  }
161
127
  end
162
128
  end
@@ -164,12 +130,12 @@ class NestedInputCallable < Minitest::Spec
164
130
 
165
131
  #:input-callable-op
166
132
  class MultiplyByPi < Trailblazer::Operation
167
- step ->(options) { options["pi_constant"] = 3.14159 }
133
+ step ->(options, **) { options["pi_constant"] = 3.14159 }
168
134
  step Nested( Multiplier, input: MyInput )
169
135
  end
170
136
  #:input-callable-op end
171
137
 
172
- it { MultiplyByPi.({}, "x" => 9).inspect("product").must_equal %{<Result:true [28.27431] >} }
138
+ it { MultiplyByPi.("x" => 9).inspect("product").must_equal %{<Result:true [28.27431] >} }
173
139
  end
174
140
 
175
141
  #---
@@ -179,10 +145,10 @@ class NestedOutput < Minitest::Spec
179
145
 
180
146
  #:output
181
147
  class Update < Trailblazer::Operation
182
- step Nested( Edit, output: ->(options, mutable_data:, **) do
148
+ step Nested( Edit, output: ->(options, **) do
183
149
  {
184
- "contract.my" => mutable_data["contract.default"],
185
- "model" => mutable_data["model"]
150
+ "contract.my" => options["contract.default"],
151
+ model: options[:model]
186
152
  }
187
153
  end )
188
154
  step Contract::Validate( name: "my" )
@@ -190,55 +156,21 @@ class NestedOutput < Minitest::Spec
190
156
  end
191
157
  #:output end
192
158
 
193
- it { Update.( id: 1, title: "Call It A Night" ).inspect("model", "contract.default").must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title=\"Call It A Night\">, nil] >} }
159
+ it { Update.( params: {id: 1, title: "Call It A Night"} ).inspect(:model, "contract.default").
160
+ must_equal %{<Result:true [#<struct DocsNestedOperationTest::Song id=1, title=\"Call It A Night\">, nil] >} }
194
161
 
195
162
  it do
196
- result = Update.( id: 1, title: "Call It A Night" )
163
+ result = Update.( params: {id: 1, title: "Call It A Night"} )
197
164
 
198
- result["model"] #=> #<Song id=1 , title=\"Call It A Night\">
165
+ result[:model] #=> #<Song id=1 , title=\"Call It A Night\">
199
166
  end
200
167
  end
201
168
 
202
- class NestedClassLevelTest < Minitest::Spec
203
- #:class-level
204
- class New < Trailblazer::Operation
205
- step ->(options) { options["class"] = true }, before: "operation.new"
206
- step ->(options) { options["x"] = true }
207
- end
208
-
209
- class Create < Trailblazer::Operation
210
- step Nested( New )
211
- step ->(options) { options["y"] = true }
212
- end
213
- #:class-level end
214
-
215
- it { Create.().inspect("x", "y").must_equal %{<Result:true [true, true] >} }
216
- it { Create.(); Create["class"].must_equal nil }
217
- end
218
-
219
169
  #---
220
170
  # Nested( ->{} )
221
171
  class NestedWithCallableTest < Minitest::Spec
222
172
  Song = Struct.new(:id, :title)
223
173
 
224
- class X < Trailblazer::Operation
225
- step ->(options, params:, **) { options["params.original"] = params }
226
- step ->(options) { options["x"] = true }
227
- end
228
-
229
- class Y < Trailblazer::Operation
230
- step ->(options) { options["y"] = true }
231
- end
232
-
233
- class A < Trailblazer::Operation
234
- step ->(options) { options["z"] = true }
235
- step Nested( ->(options, *) { options["class"] } )
236
- end
237
-
238
- it { A.({ a: 1 }, "class" => X).inspect("x", "y", "z", "params.original").must_equal "<Result:true [true, nil, true, {:a=>1}] >" }
239
- it { A.({}, "class" => Y).inspect("x", "y", "z").must_equal "<Result:true [nil, true, true] >" }
240
- # it { Create.({}).inspect("x", "y", "z").must_equal "<Result:true [nil, true, true] >" }
241
-
242
174
  class Song
243
175
  module Contract
244
176
  class Create < Reform::Form
@@ -277,8 +209,8 @@ class NestedWithCallableTest < Minitest::Spec
277
209
  let (:admin) { User.new(true) }
278
210
  let (:anonymous) { User.new(false) }
279
211
 
280
- it { Create.({}, "current_user" => anonymous).inspect("x").must_equal %{<Result:true [true] >} }
281
- it { Create.({}, "current_user" => admin) .inspect("x").must_equal %{<Result:true [nil] >} }
212
+ it { Create.(params: {}, current_user: anonymous).inspect("x").must_equal %{<Result:true [true] >} }
213
+ it { Create.(params: {}, current_user: admin) .inspect("x").must_equal %{<Result:true [nil] >} }
282
214
 
283
215
  #---
284
216
  #:method
@@ -286,13 +218,13 @@ class NestedWithCallableTest < Minitest::Spec
286
218
  step Nested( :build! )
287
219
 
288
220
  def build!(options, current_user:nil, **)
289
- current_user.admin? ? Create::Admin : Create::NeedsModeration
221
+ current_user.admin? ? Create::Admin : Create::NeedsModeration
290
222
  end
291
223
  end
292
224
  #:method end
293
225
 
294
- it { Update.({}, "current_user" => anonymous).inspect("x").must_equal %{<Result:true [true] >} }
295
- it { Update.({}, "current_user" => admin) .inspect("x").must_equal %{<Result:true [nil] >} }
226
+ it { Update.(params: {}, current_user: anonymous).inspect("x").must_equal %{<Result:true [true] >} }
227
+ it { Update.(params: {}, current_user: admin) .inspect("x").must_equal %{<Result:true [nil] >} }
296
228
 
297
229
  #---
298
230
  #:callable-builder
@@ -312,8 +244,8 @@ class NestedWithCallableTest < Minitest::Spec
312
244
  end
313
245
  #:callable end
314
246
 
315
- it { Delete.({}, "current_user" => anonymous).inspect("x").must_equal %{<Result:true [true] >} }
316
- it { Delete.({}, "current_user" => admin) .inspect("x").must_equal %{<Result:true [nil] >} }
247
+ it { Delete.(params: {}, current_user: anonymous).inspect("x").must_equal %{<Result:true [true] >} }
248
+ it { Delete.(params: {}, current_user: admin) .inspect("x").must_equal %{<Result:true [nil] >} }
317
249
  end
318
250
 
319
251
  # builder: Nested + deviate to left if nil / skip_track if true
@@ -330,5 +262,5 @@ class NestedNameTest < Minitest::Spec
330
262
  # ...
331
263
  end
332
264
 
333
- it { Create["pipetree"].inspect.must_equal %{[>operation.new,>Nested(NestedNameTest::Create::Present)]} }
265
+ it { Operation::Inspect.(Create).must_equal %{[>>Nested(NestedNameTest::Create::Present)]} }
334
266
  end