trailblazer 2.1.0.beta1 → 2.1.0.beta2
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +18 -0
- data/.rubocop_todo.yml +825 -0
- data/CHANGES.md +4 -0
- data/Gemfile +5 -2
- data/Rakefile +3 -0
- data/lib/trailblazer.rb +1 -0
- data/lib/trailblazer/operation/contract.rb +57 -52
- data/lib/trailblazer/operation/input_output.rb +28 -0
- data/lib/trailblazer/operation/model.rb +5 -5
- data/lib/trailblazer/operation/nested.rb +40 -34
- data/lib/trailblazer/operation/persist.rb +9 -7
- data/lib/trailblazer/operation/policy.rb +4 -4
- data/lib/trailblazer/operation/validate.rb +57 -58
- data/lib/trailblazer/operation/wrap.rb +4 -5
- data/lib/trailblazer/task.rb +19 -19
- data/lib/trailblazer/version.rb +1 -1
- data/test/docs/nested_test.rb +49 -15
- data/test/test_helper.rb +1 -0
- data/trailblazer.gemspec +1 -1
- metadata +9 -6
@@ -3,7 +3,7 @@ class Trailblazer::Operation
|
|
3
3
|
# false is automatically connected to End.failure.
|
4
4
|
|
5
5
|
def self.Wrap(user_wrap, id: "Wrap/#{rand(100)}", &block)
|
6
|
-
operation_class = Wrap.
|
6
|
+
operation_class = Wrap.create_operation(block)
|
7
7
|
wrapped = Wrap::Wrapped.new(operation_class, user_wrap)
|
8
8
|
|
9
9
|
# connect `false` as an end event, when an exception stopped the wrap, for example.
|
@@ -13,7 +13,7 @@ class Trailblazer::Operation
|
|
13
13
|
end
|
14
14
|
|
15
15
|
module Wrap
|
16
|
-
def self.
|
16
|
+
def self.create_operation(block)
|
17
17
|
Class.new( Nested.operation_class, &block ) # Usually resolves to Trailblazer::Operation.
|
18
18
|
end
|
19
19
|
|
@@ -28,10 +28,9 @@ class Trailblazer::Operation
|
|
28
28
|
|
29
29
|
def call( (options, flow_options), **circuit_options )
|
30
30
|
block_calling_wrapped = -> {
|
31
|
-
|
31
|
+
activity = @operation.decompose[:activity]
|
32
32
|
|
33
|
-
|
34
|
-
@operation.instance_variable_get(:@process).( args, **circuit_options.merge(circuit_options_with_wrap_static) ) # FIXME: arguments_for_call don't return the full circuit_options, :exec_context gets lost.
|
33
|
+
activity.( [options, flow_options], **circuit_options )
|
35
34
|
}
|
36
35
|
|
37
36
|
# call the user's Wrap {} block in the operation.
|
data/lib/trailblazer/task.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
module Trailblazer
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# module Trailblazer
|
2
|
+
# class Activity
|
3
|
+
# module Task
|
4
|
+
# # Convenience functions for tasks. Totally optional.
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
6
|
+
# # Task::Binary aka "step"
|
7
|
+
# # Step is binary task: true=> Right, false=>Left.
|
8
|
+
# # Step call proc.(options, flow_options)
|
9
|
+
# # Step is supposed to run Option::KW, so `step` should be Option::KW.
|
10
|
+
# #
|
11
|
+
# # Returns task to call the proc with (options, flow_options), omitting `direction`.
|
12
|
+
# # When called, the task always returns a direction signal.
|
13
|
+
# def self.Binary(step, on_true=Activity::Right, on_false=Activity::Left)
|
14
|
+
# ->(*args) do # Activity/Task interface.
|
15
|
+
# [ step.(*args) ? on_true : on_false, *args ] # <=> Activity/Task interface
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
# end
|
data/lib/trailblazer/version.rb
CHANGED
data/test/docs/nested_test.rb
CHANGED
@@ -49,11 +49,6 @@ class DocsNestedOperationTest < Minitest::Spec
|
|
49
49
|
result["contract.default"].model.must_equal result[:model]
|
50
50
|
end
|
51
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"}]
|
55
|
-
end
|
56
|
-
|
57
52
|
#- test Edit circuit-level.
|
58
53
|
it do
|
59
54
|
signal, (result, _) = Edit.__call__( [Trailblazer::Context( params: {id: 1} ), {}] )
|
@@ -145,10 +140,10 @@ class NestedOutput < Minitest::Spec
|
|
145
140
|
|
146
141
|
#:output
|
147
142
|
class Update < Trailblazer::Operation
|
148
|
-
step Nested( Edit, output: ->(
|
143
|
+
step Nested( Edit, output: ->( ctx, ** ) do
|
149
144
|
{
|
150
|
-
"contract.my" =>
|
151
|
-
model:
|
145
|
+
"contract.my" => ctx["contract.default"],
|
146
|
+
model: ctx[:model]
|
152
147
|
}
|
153
148
|
end )
|
154
149
|
step Contract::Validate( name: "my" )
|
@@ -171,11 +166,9 @@ end
|
|
171
166
|
class NestedWithCallableTest < Minitest::Spec
|
172
167
|
Song = Struct.new(:id, :title)
|
173
168
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
property :title
|
178
|
-
end
|
169
|
+
module Song::Contract
|
170
|
+
class Create < Reform::Form
|
171
|
+
property :title
|
179
172
|
end
|
180
173
|
end
|
181
174
|
|
@@ -229,8 +222,6 @@ class NestedWithCallableTest < Minitest::Spec
|
|
229
222
|
#---
|
230
223
|
#:callable-builder
|
231
224
|
class MyBuilder
|
232
|
-
extend Uber::Callable
|
233
|
-
|
234
225
|
def self.call(options, current_user:nil, **)
|
235
226
|
current_user.admin? ? Create::Admin : Create::NeedsModeration
|
236
227
|
end
|
@@ -248,6 +239,49 @@ class NestedWithCallableTest < Minitest::Spec
|
|
248
239
|
it { Delete.(params: {}, current_user: admin) .inspect("x").must_equal %{<Result:true [nil] >} }
|
249
240
|
end
|
250
241
|
|
242
|
+
class NestedWithCallableAndInputTest < Minitest::Spec
|
243
|
+
Memo = Struct.new(:title, :text, :created_by)
|
244
|
+
|
245
|
+
class Memo::Upsert < Trailblazer::Operation
|
246
|
+
step Nested( :operation_class, input: :input_for_create )
|
247
|
+
|
248
|
+
def operation_class( ctx, ** )
|
249
|
+
ctx[:id] ? Update : Create
|
250
|
+
end
|
251
|
+
|
252
|
+
# only let :title pass through.
|
253
|
+
def input_for_create( ctx )
|
254
|
+
{ title: ctx[:title] }
|
255
|
+
end
|
256
|
+
|
257
|
+
class Create < Trailblazer::Operation
|
258
|
+
step :create_memo
|
259
|
+
|
260
|
+
def create_memo( ctx, ** )
|
261
|
+
ctx[:model] = Memo.new(ctx[:title], ctx[:text], :create)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
class Update < Trailblazer::Operation
|
266
|
+
step :find_by_title
|
267
|
+
|
268
|
+
def find_by_title( ctx, ** )
|
269
|
+
ctx[:model] = Memo.new(ctx[:title], ctx[:text], :update)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
it "runs Create without :id" do
|
275
|
+
Memo::Upsert.( title: "Yay!" ).inspect(:model).
|
276
|
+
must_equal %{<Result:true [#<struct NestedWithCallableAndInputTest::Memo title=\"Yay!\", text=nil, created_by=:create>] >}
|
277
|
+
end
|
278
|
+
|
279
|
+
it "runs Update without :id" do
|
280
|
+
Memo::Upsert.( id: 1, title: "Yay!" ).inspect(:model).
|
281
|
+
must_equal %{<Result:true [#<struct NestedWithCallableAndInputTest::Memo title=\"Yay!\", text=nil, created_by=:update>] >}
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
251
285
|
# builder: Nested + deviate to left if nil / skip_track if true
|
252
286
|
|
253
287
|
#---
|
data/test/test_helper.rb
CHANGED
data/trailblazer.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency "trailblazer-operation", ">= 0.
|
20
|
+
spec.add_dependency "trailblazer-operation", ">= 0.2.0", "< 0.3.0"
|
21
21
|
spec.add_dependency "reform", ">= 2.2.0", "< 3.0.0"
|
22
22
|
spec.add_dependency "declarative"
|
23
23
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trailblazer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.0.
|
4
|
+
version: 2.1.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trailblazer-operation
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.2.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.
|
22
|
+
version: 0.3.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.
|
29
|
+
version: 0.2.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.
|
32
|
+
version: 0.3.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: reform
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,6 +157,8 @@ extensions: []
|
|
157
157
|
extra_rdoc_files: []
|
158
158
|
files:
|
159
159
|
- ".gitignore"
|
160
|
+
- ".rubocop.yml"
|
161
|
+
- ".rubocop_todo.yml"
|
160
162
|
- ".travis.yml"
|
161
163
|
- CHANGES.md
|
162
164
|
- COMM-LICENSE
|
@@ -176,6 +178,7 @@ files:
|
|
176
178
|
- lib/trailblazer/operation/contract.rb
|
177
179
|
- lib/trailblazer/operation/deprecations.rb
|
178
180
|
- lib/trailblazer/operation/guard.rb
|
181
|
+
- lib/trailblazer/operation/input_output.rb
|
179
182
|
- lib/trailblazer/operation/model.rb
|
180
183
|
- lib/trailblazer/operation/module.rb
|
181
184
|
- lib/trailblazer/operation/nested.rb
|