trailblazer 2.0.7 → 2.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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