trailblazer 2.0.0.beta3 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +4 -0
- data/lib/trailblazer/version.rb +1 -1
- data/test/docs/contract_test.rb +1 -1
- data/test/docs/guard_test.rb +1 -1
- data/test/docs/operation_test.rb +89 -5
- data/test/docs/rescue_test.rb +4 -3
- data/test/docs/wrap_test.rb +11 -3
- data/test/operation/builder_test.rb +1 -1
- data/test/operation/pundit_test.rb +1 -1
- data/test/operation/resolver_test.rb +1 -1
- data/trailblazer.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb0eb777dc5afb25cb6200169ca06bf75a18db94
|
4
|
+
data.tar.gz: 8ca6d1c9b0a5491ea9fa282cf5766552fcf8462a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 939adb355c6875cf922f6dda5056ee2d13664c386149c3afd7d62c5f0a0b77b51d1c487e62ac4ea1c5af39aa481e9d1b7bef891bca55a0dc6af92fb5d764786a
|
7
|
+
data.tar.gz: 5e1f1f2de36e85c4f6a0c84e655c329e22073027130c079e6f3b776de84c1046867056a8fb40aa915919ac83a6ec74300428d45c24a1b65eb06031c8d20d3296
|
data/CHANGES.md
CHANGED
@@ -102,6 +102,10 @@ You can now inject the following objects via `::call`:
|
|
102
102
|
|
103
103
|
* You can't call `Create.().contract` anymore. The contract instance(s) are available through the `Result` object.
|
104
104
|
|
105
|
+
# 2.0.0.rc1
|
106
|
+
|
107
|
+
* `consider` got removed since `step` now evaluates the step's result and deviates (or not).
|
108
|
+
|
105
109
|
# 2.0.0.beta3
|
106
110
|
|
107
111
|
* New, very slick keyword arguments for steps.
|
data/lib/trailblazer/version.rb
CHANGED
data/test/docs/contract_test.rb
CHANGED
@@ -166,7 +166,7 @@ class DocsContractSeparateKeyTest < Minitest::Spec
|
|
166
166
|
|
167
167
|
step Model( Song, :new )
|
168
168
|
step Contract::Build()
|
169
|
-
|
169
|
+
step :extract_params!
|
170
170
|
step Contract::Validate( skip_extract: true )
|
171
171
|
step Contract::Persist( method: :sync )
|
172
172
|
|
data/test/docs/guard_test.rb
CHANGED
@@ -32,7 +32,7 @@ class DocsGuardProcTest < Minitest::Spec
|
|
32
32
|
override Policy::Guard( ->(options) { options["current_user"] } )
|
33
33
|
end
|
34
34
|
|
35
|
-
it { New["pipetree"].inspect.must_equal %{[>>operation.new,&policy.default.eval
|
35
|
+
it { New["pipetree"].inspect.must_equal %{[>>operation.new,&policy.default.eval,&process]} }
|
36
36
|
end
|
37
37
|
|
38
38
|
#---
|
data/test/docs/operation_test.rb
CHANGED
@@ -4,8 +4,8 @@ class DocsOperationExampleTest < Minitest::Spec
|
|
4
4
|
Song = Struct.new(:id, :title, :created_by) do
|
5
5
|
def save; true; end
|
6
6
|
end
|
7
|
-
#:op
|
8
7
|
|
8
|
+
#:op
|
9
9
|
class Song::Create < Trailblazer::Operation
|
10
10
|
extend Contract::DSL
|
11
11
|
|
@@ -15,7 +15,7 @@ class DocsOperationExampleTest < Minitest::Spec
|
|
15
15
|
end
|
16
16
|
|
17
17
|
step Model( Song, :new )
|
18
|
-
|
18
|
+
step :assign_current_user!
|
19
19
|
step Contract::Build()
|
20
20
|
step Contract::Validate( )
|
21
21
|
failure :log_error!
|
@@ -38,9 +38,9 @@ end
|
|
38
38
|
|
39
39
|
class DndTest < Minitest::Spec
|
40
40
|
class Create < Trailblazer::Operation
|
41
|
-
|
41
|
+
step :authorize!
|
42
42
|
failure :auth_err!
|
43
|
-
|
43
|
+
step :save!
|
44
44
|
self.< Wrap
|
45
45
|
end
|
46
46
|
end
|
@@ -54,7 +54,7 @@ class DocsResultTest < Minitest::Spec
|
|
54
54
|
class Song::Create < Trailblazer::Operation
|
55
55
|
step :model!
|
56
56
|
step :assign!
|
57
|
-
|
57
|
+
step :validate!
|
58
58
|
|
59
59
|
def model!(options, current_user:, **)
|
60
60
|
options["model"] = Song.new
|
@@ -98,3 +98,87 @@ class DocsResultTest < Minitest::Spec
|
|
98
98
|
#:step-inspect end
|
99
99
|
end
|
100
100
|
end
|
101
|
+
|
102
|
+
class DocsDependencyTest < Minitest::Spec
|
103
|
+
Song = Struct.new(:id, :title, :created_by) do
|
104
|
+
def save; true; end
|
105
|
+
end
|
106
|
+
Hit = Struct.new(:id)
|
107
|
+
|
108
|
+
#:dep-op
|
109
|
+
class Song::Create < Trailblazer::Operation
|
110
|
+
self["my.model.class"] = Song
|
111
|
+
|
112
|
+
#~dep-pipe
|
113
|
+
step :model!
|
114
|
+
|
115
|
+
def model!(options, **)
|
116
|
+
options["my.model"] = # setting runtime data.
|
117
|
+
options["my.model.class"].new # reading class data at runtime.
|
118
|
+
end
|
119
|
+
#~dep-pipe end
|
120
|
+
end
|
121
|
+
#:dep-op end
|
122
|
+
|
123
|
+
it do
|
124
|
+
#:dep-op-class
|
125
|
+
Song::Create["my.model.class"] #=> Song
|
126
|
+
#:dep-op-class end
|
127
|
+
|
128
|
+
#:dep-op-res
|
129
|
+
result = Song::Create.({})
|
130
|
+
|
131
|
+
result["my.model.class"] #=> Song
|
132
|
+
result["my.model"] #=> #<Song title=nil>
|
133
|
+
#:dep-op-res end
|
134
|
+
|
135
|
+
Song::Create["my.model.class"].must_equal Song
|
136
|
+
result["my.model.class"].must_equal Song
|
137
|
+
result["my.model"].inspect.must_equal %{#<struct DocsDependencyTest::Song id=nil, title=nil, created_by=nil>}
|
138
|
+
end
|
139
|
+
|
140
|
+
it do
|
141
|
+
#:dep-di
|
142
|
+
result = Song::Create.({}, "my.model.class" => Hit)
|
143
|
+
|
144
|
+
result["my.model"] #=> #<Hit id=nil>
|
145
|
+
#:dep-di end
|
146
|
+
result["my.model"].inspect.must_equal %{#<struct DocsDependencyTest::Hit id=nil>}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
class DocsOperationAPIExampleTest < Minitest::Spec
|
153
|
+
Song = Struct.new(:id, :title, :created_by) do
|
154
|
+
def save; true; end
|
155
|
+
end
|
156
|
+
|
157
|
+
class MyContract < Reform::Form
|
158
|
+
property :title
|
159
|
+
validates :title, presence: true
|
160
|
+
end
|
161
|
+
|
162
|
+
#:op-api
|
163
|
+
class Song::Create < Trailblazer::Operation
|
164
|
+
step Model( Song, :new )
|
165
|
+
step :assign_current_user!
|
166
|
+
step Contract::Build( constant: MyContract )
|
167
|
+
step Contract::Validate()
|
168
|
+
failure :log_error!
|
169
|
+
step Contract::Persist()
|
170
|
+
|
171
|
+
def log_error!(options)
|
172
|
+
# ..
|
173
|
+
end
|
174
|
+
|
175
|
+
def assign_current_user!(options)
|
176
|
+
options["model"].created_by =
|
177
|
+
options["current_user"]
|
178
|
+
end
|
179
|
+
end
|
180
|
+
#:op-api end
|
181
|
+
|
182
|
+
it { Song::Create.({ }).inspect("model").must_equal %{<Result:false [#<struct DocsOperationAPIExampleTest::Song id=nil, title=nil, created_by=nil>] >} }
|
183
|
+
it { Song::Create.({ title: "Nothin'" }, "current_user"=>Module).inspect("model").must_equal %{<Result:true [#<struct DocsOperationAPIExampleTest::Song id=nil, title="Nothin'", created_by=Module>] >} }
|
184
|
+
end
|
data/test/docs/rescue_test.rb
CHANGED
@@ -11,11 +11,11 @@ class NestedRescueTest < Minitest::Spec
|
|
11
11
|
step ->(options) { options["a"] = true }
|
12
12
|
step Rescue {
|
13
13
|
step ->(options) { options["y"] = true }
|
14
|
-
|
14
|
+
success ->(options) { raise Y if options["raise-y"] }
|
15
15
|
step ->(options) { options["z"] = true }
|
16
16
|
}
|
17
17
|
step ->(options) { options["b"] = true }
|
18
|
-
|
18
|
+
success ->(options) { raise A if options["raise-a"] }
|
19
19
|
step ->(options) { options["c"] = true }
|
20
20
|
self.< ->(options) { options["inner-err"] = true }
|
21
21
|
}
|
@@ -23,7 +23,7 @@ class NestedRescueTest < Minitest::Spec
|
|
23
23
|
failure ->(options) { options["outer-err"] = true }
|
24
24
|
end
|
25
25
|
|
26
|
-
it { NestedInsanity["pipetree"].inspect.must_equal %{[>>operation.new,&Rescue:10
|
26
|
+
it { NestedInsanity["pipetree"].inspect.must_equal %{[>>operation.new,&Rescue:10,&:22,<NestedRescueTest::NestedInsanity:23]} }
|
27
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
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
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] >} }
|
@@ -47,6 +47,7 @@ class RescueTest < Minitest::Spec
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def lock!
|
50
|
+
true
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
data/test/docs/wrap_test.rb
CHANGED
@@ -35,7 +35,7 @@ class WrapTest < Minitest::Spec
|
|
35
35
|
class Create < Trailblazer::Operation
|
36
36
|
step Wrap ->(options, *, &block) { options["yield?"] ? block.call : false } {
|
37
37
|
step ->(options) { options["x"] = true }
|
38
|
-
|
38
|
+
success :noop!
|
39
39
|
# ...
|
40
40
|
}
|
41
41
|
|
@@ -87,6 +87,10 @@ class WrapTest < Minitest::Spec
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
module MyNotifier
|
91
|
+
def self.mail; true; end
|
92
|
+
end
|
93
|
+
|
90
94
|
#:sequel-transaction
|
91
95
|
class Create < Trailblazer::Operation
|
92
96
|
#~wrap-only
|
@@ -112,7 +116,7 @@ class WrapTest < Minitest::Spec
|
|
112
116
|
end
|
113
117
|
|
114
118
|
def notify!(options)
|
115
|
-
|
119
|
+
MyNotifier.mail
|
116
120
|
end
|
117
121
|
#~wrap-only end
|
118
122
|
end
|
@@ -128,6 +132,10 @@ class WrapTest < Minitest::Spec
|
|
128
132
|
end
|
129
133
|
end
|
130
134
|
|
135
|
+
module MyNotifier
|
136
|
+
def self.mail; true; end
|
137
|
+
end
|
138
|
+
|
131
139
|
#:callable-t
|
132
140
|
class MyTransaction
|
133
141
|
extend Uber::Callable
|
@@ -162,7 +170,7 @@ class WrapTest < Minitest::Spec
|
|
162
170
|
end
|
163
171
|
|
164
172
|
def notify!(options)
|
165
|
-
# send emails, because success...
|
173
|
+
MyNotifier.mail # send emails, because success...
|
166
174
|
end
|
167
175
|
#~wrap-onlyy end
|
168
176
|
end
|
@@ -53,7 +53,7 @@ class PolicyTest < Minitest::Spec
|
|
53
53
|
self.| Model( Song, :new ), before: "policy.default.eval"
|
54
54
|
end
|
55
55
|
|
56
|
-
it { Show["pipetree"].inspect.must_equal %{[>>operation.new,&model.build,&policy.default.eval
|
56
|
+
it { Show["pipetree"].inspect.must_equal %{[>>operation.new,&model.build,&policy.default.eval,&process]} }
|
57
57
|
|
58
58
|
# invalid because user AND model.
|
59
59
|
it do
|
@@ -35,7 +35,7 @@ class ResolverTest < Minitest::Spec
|
|
35
35
|
def process(*); self["x"] = self.class end
|
36
36
|
end
|
37
37
|
|
38
|
-
it { A["pipetree"].inspect.must_equal %{[&model.build,&policy.default.eval,>>builder.call,>>operation.new
|
38
|
+
it { A["pipetree"].inspect.must_equal %{[&model.build,&policy.default.eval,>>builder.call,>>operation.new,&process]} }
|
39
39
|
|
40
40
|
it { r=A.({ some: "params", id: 1 }, { "current_user" => Module })
|
41
41
|
puts r.inspect
|
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"
|
20
|
+
spec.add_dependency "trailblazer-operation", ">= 0.0.9"
|
21
21
|
spec.add_dependency "uber", ">= 0.1.0", "< 0.2.0"
|
22
22
|
spec.add_dependency "reform", ">= 2.2.0", "< 3.0.0"
|
23
23
|
spec.add_dependency "declarative"
|
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.0.0.
|
4
|
+
version: 2.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trailblazer-operation
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.0.9
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.0.9
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: uber
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|