trailblazer-operation 0.6.6 → 0.7.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bf82f1aa3080dfea1c9165859fdd6de207c9333cc3af7fb8c2e52fff55811ba2
4
- data.tar.gz: c53369fe71b53e3ac3be42746d438c648b312a4d03956f483abd2d1e7e39cebb
3
+ metadata.gz: 5a184243cc5650f8905e96a29d4abd248f463dcf8e2c5ec28d3a68de6391ae4e
4
+ data.tar.gz: 8c8eeb9c36d0065096e1c9be60872254c0776ecd6dd617d439aa55c3896f020e
5
5
  SHA512:
6
- metadata.gz: 98b29781915fdb5b40921dfd621a59dc580ce708e7ddaaf44b3123ee5a838ffde6a96cbe9b2d0cb24b15b60db3d2f5e166339253612786b96ebf5c5073e28fe6
7
- data.tar.gz: 1481d504865240aeeee2bd254cfbc927156da7d465a408e42fc8936579984a95a80926356e6b5757d67ce8d814879f6aa22fc1678cd869345ac7be38b40d2e68
6
+ metadata.gz: c1abb34f87e18425f77c6189ded96dd0f02c39f9e2ce178b1d2bfff3d2b2e8c2c4dd4d37e88a770ffc8b8457613dbc4e334b8e2e7924395c07bd4a59c6bd3376
7
+ data.tar.gz: 68fb2740d396b174c7eaa62e0145049755ff593fbf7bdba66825b79caa7908b35b954b8508528b6a6f93883fee3f372e2043a860f968bf5699cb2bceea1c3f17
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
- before_install:
3
- - gem install bundler -v 1.17.3
4
2
  rvm:
5
3
  - ruby-head
4
+ - 3.0
6
5
  - 2.7
7
6
  - 2.6
8
7
  - 2.5
@@ -10,4 +9,3 @@ rvm:
10
9
  jobs:
11
10
  allow_failures:
12
11
  - rvm: ruby-head
13
- - rvm: 2.7
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.7.0
2
+
3
+ * Compatible with Ruby 2.4-3.0.
4
+ * Add `Operation.wtf?`.
5
+ * Add `Operation.call_with_flow_options` to allow using explicit aliasing in Ruby < 3.0.
6
+
1
7
  ## 0.6.6
2
8
 
3
9
  * Rename `Operation.flow_options` to `Operation.flow_options_for_public_call`.
data/Gemfile CHANGED
@@ -10,8 +10,9 @@ gem "dry-auto_inject"
10
10
  gem "benchmark-ips"
11
11
  gem "minitest-line"
12
12
 
13
- # gem "trailblazer-developer", path: "../developer"
13
+ # gem "trailblazer-developer", path: "../trailblazer-developer"
14
14
  # gem "trailblazer-developer", git: "https://github.com/trailblazer/trailblazer-developer"
15
15
  # gem "trailblazer-activity", path: "../trailblazer-activity"
16
+ # gem "trailblazer-context", path: "../trailblazer-context"
16
17
  # gem "trailblazer-activity-dsl-linear", path: "../trailblazer-activity-dsl-linear"
17
18
  # gem "trailblazer-activity", github: "trailblazer/trailblazer-activity"
data/Rakefile CHANGED
@@ -4,18 +4,7 @@ require "rake/testtask"
4
4
  Rake::TestTask.new(:test) do |test|
5
5
  test.libs << "test"
6
6
  test.verbose = true
7
-
8
- test_files = FileList["test/**/*_test.rb"]
9
-
10
- if RUBY_VERSION == "2.0.0"
11
- # test_files = test_files - %w{test/dry_container_test.rb test/2.1.0-pipetree_test.rb}
12
- test_files = test_files - %w{test/step_test.rb} + %w{test/ruby-2.0.0/step_test.rb}
13
- test_files = test_files - %w{test/operation_test.rb} + %w{test/ruby-2.0.0/operation_test.rb}
14
- else
15
- test_files -= FileList["test/ruby-2.0.0/*"]
16
- end
17
-
18
- test.test_files = test_files
7
+ test.test_files = FileList["test/**/*_test.rb"]
19
8
  end
20
9
 
21
10
  task :default => %i[test]
@@ -12,9 +12,9 @@ class Trailblazer::Operation
12
12
  @state.update_options(options)
13
13
  end
14
14
 
15
- def options_for_public_call(options, **flow_options)
15
+ def options_for_public_call(options, flow_options)
16
16
  ctx = super
17
- context_for_fields(class_fields, [ctx, flow_options], {})
17
+ context_for_fields(class_fields, [ctx, flow_options])
18
18
  end
19
19
 
20
20
  private def class_fields
@@ -26,9 +26,9 @@ class Trailblazer::Operation
26
26
  end
27
27
 
28
28
  def call_with_circuit_interface((ctx, flow_options), **circuit_options)
29
- ctx_with_fields = context_for_fields(class_fields, [ctx, flow_options], circuit_options)
29
+ ctx_with_fields = context_for_fields(class_fields, [ctx, flow_options], **circuit_options)
30
30
 
31
- super([ctx_with_fields, flow_options], circuit_options) # FIXME: should we unwrap here?
31
+ super([ctx_with_fields, flow_options], **circuit_options) # FIXME: should we unwrap here?
32
32
  end
33
33
  end
34
34
  end
@@ -13,10 +13,10 @@ module Trailblazer
13
13
  #
14
14
  # @note Do not override this method as it will be removed in future versions. Also, you will break tracing.
15
15
  # @return Operation::Railway::Result binary result object
16
- def call(options = {}, *args)
17
- return call_with_circuit_interface(options, *args) if options.is_a?(Array) # This is kind of a hack that could be well hidden if Ruby had method overloading. Goal is to simplify the call/__call__ thing as we're fading out Operation::call anyway.
16
+ def call(options = {}, flow_options = {}, **circuit_options)
17
+ return call_with_circuit_interface(options, **circuit_options) if options.is_a?(Array) # This is kind of a hack that could be well hidden if Ruby had method overloading. Goal is to simplify the call/__call__ thing as we're fading out Operation::call anyway.
18
18
 
19
- call_with_public_interface(options, *args)
19
+ call_with_public_interface(options, flow_options, **circuit_options)
20
20
  end
21
21
 
22
22
  # Default {@activity} call interface which doesn't accept {circuit_options}
@@ -26,14 +26,17 @@ module Trailblazer
26
26
  # @return [Operation::Railway::Result]
27
27
  #
28
28
  # @private
29
- def call_with_public_interface(options, flow_options = {})
29
+ def call_with_public_interface(options, flow_options, invoke_class: Activity::TaskWrap, **circuit_options)
30
30
  flow_options = flow_options_for_public_call(flow_options)
31
+
32
+ options = circuit_options.any? ? circuit_options : options # This is needed in Ruby 3 for {Create.(params: {})} calls.
33
+
34
+
31
35
  ctx = options_for_public_call(options, flow_options)
32
36
 
33
37
  # call the activity.
34
38
  # This will result in invoking {::call_with_circuit_interface}.
35
- # last_signal, (options, flow_options) = Activity::TaskWrap.invoke(self, [ctx, {}], {})
36
- signal, (ctx, flow_options) = Activity::TaskWrap.invoke(
39
+ signal, (ctx, flow_options) = invoke_class.invoke(
37
40
  @activity,
38
41
  [ctx, flow_options],
39
42
  exec_context: new
@@ -51,8 +54,8 @@ module Trailblazer
51
54
  # @return [signal, [ctx, flow_options]]
52
55
  #
53
56
  # @private
54
- def call_with_circuit_interface(args, circuit_options)
55
- strategy_call(args, circuit_options) # FastTrack#call
57
+ def call_with_circuit_interface(args, **circuit_options)
58
+ strategy_call(args, **circuit_options) # FastTrack#call
56
59
  end
57
60
 
58
61
  def options_for_public_call(*args)
@@ -69,5 +72,11 @@ module Trailblazer
69
72
  def flow_options_for_public_call(options = {})
70
73
  options
71
74
  end
75
+
76
+ # TODO: remove when we stop supporting < 3.0.
77
+ def call_with_flow_options(options, flow_options)
78
+ raise "[Trailblazer] `Operation.call_with_flow_options is deprecated in Ruby 3.0. Use `Operation.(options, flow_options)`" if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.0.0")
79
+ call_with_public_interface(options, flow_options, {invoke_class: Activity::TaskWrap})
80
+ end
72
81
  end
73
82
  end
@@ -6,6 +6,7 @@ module Trailblazer
6
6
  module Trace
7
7
  # @note The problem in this method is, we have redundancy with Operation::PublicCall
8
8
  def self.call(operation, options)
9
+ # warn %{Trailblazer: `Operation.trace` is deprecated. Please use `Operation.wtf?`.} # DISCUSS: should this be deprecated?
9
10
  ctx = PublicCall.options_for_public_call(options) # redundant with PublicCall::call.
10
11
 
11
12
  stack, signal, (ctx, _flow_options) = Developer::Trace.(operation, [ctx, {}])
@@ -25,6 +26,10 @@ module Trailblazer
25
26
  Trace.(self, options)
26
27
  end
27
28
 
29
+ def wtf?(options)
30
+ call_with_public_interface(options, {}, invoke_class: Developer::Wtf)
31
+ end
32
+
28
33
  # Presentation of the traced stack via the returned result object.
29
34
  # This object is wrapped around the original result in {Trace.call}.
30
35
  class Result < ::SimpleDelegator
@@ -1,7 +1,7 @@
1
1
  module Trailblazer
2
2
  module Version
3
3
  module Operation
4
- VERSION = "0.6.6"
4
+ VERSION = "0.7.0"
5
5
  end
6
6
  end
7
7
  end
@@ -1,31 +1,31 @@
1
- require "test_helper"
1
+ # require "test_helper"
2
2
 
3
- class MacaroniTaskBuilderTest < Minitest::Spec
4
- Memo = Struct.new(:title) do
5
- def save
6
- self.title = title[:title].reverse
7
- end
8
- end
3
+ # class MacaroniTaskBuilderTest < Minitest::Spec
4
+ # Memo = Struct.new(:title) do
5
+ # def save
6
+ # self.title = title[:title].reverse
7
+ # end
8
+ # end
9
9
 
10
- #:create
11
- class Memo::Create < Trailblazer::Operation(step_interface_builder: Trailblazer::Operation::Railway::KwSignature)
12
- #~ign
13
- step :create_model
14
- step :save
15
- #~ign end
16
- #~methods
17
- def create_model(params:, options:, **)
18
- options[:model] = Memo.new(title: params[:title])
19
- end
10
+ # #:create
11
+ # class Memo::Create < Trailblazer::Operation(step_interface_builder: Trailblazer::Operation::Railway::KwSignature)
12
+ # #~ign
13
+ # step :create_model
14
+ # step :save
15
+ # #~ign end
16
+ # #~methods
17
+ # def create_model(params:, options:, **)
18
+ # options[:model] = Memo.new(title: params[:title])
19
+ # end
20
20
 
21
- def save(model:, **)
22
- model.save
23
- end
24
- #~methods end
25
- end
26
- #:create end
21
+ # def save(model:, **)
22
+ # model.save
23
+ # end
24
+ # #~methods end
25
+ # end
26
+ # #:create end
27
27
 
28
- it "allows optional macaroni call style" do
29
- Memo::Create.(params: {title: "Wow!"}).inspect(:model).must_equal %{<Result:true [#<struct MacaroniTaskBuilderTest::Memo title=\"!woW\">] >}
30
- end
31
- end
28
+ # it "allows optional macaroni call style" do
29
+ # Memo::Create.(params: {title: "Wow!"}).inspect(:model).must_equal %{<Result:true [#<struct MacaroniTaskBuilderTest::Memo title=\"!woW\">] >}
30
+ # end
31
+ # end
@@ -85,7 +85,12 @@ class DocsActivityTest < Minitest::Spec
85
85
  }
86
86
  }
87
87
 
88
- result = AliasesExample::Memo::Create.(options, flow_options)
88
+ # Sorry, this feature is only reliable in Ruby > 2.7
89
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.0.0")
90
+ result = AliasesExample::Memo::Create.(options, flow_options)
91
+ else # Ruby 2.6 etc
92
+ result = AliasesExample::Memo::Create.call_with_flow_options(options, flow_options)
93
+ end
89
94
 
90
95
  result['contract.default'] # => Memo::Contract::Create
91
96
  result[:contract] # => Memo::Contract::Create
@@ -105,23 +105,35 @@ class DeclarativeApiTest < Minitest::Spec
105
105
  result.inspect("a", "b", "c").must_equal %{<Result:true [false, true, nil] >}
106
106
 
107
107
  # Circuit interface call
108
- signal, (ctx, _) = Update.([Update.options_for_public_call(options), {}], {})
108
+ signal, (ctx, _) = Update.([Update.options_for_public_call(options), {}], **{})
109
109
 
110
110
  signal.inspect.must_equal %{#<Trailblazer::Activity::Railway::End::Success semantic=:success>}
111
111
  ctx.inspect.must_equal %{#<Trailblazer::Context::Container wrapped_options={\"params\"=>{:decide=>true}} mutable_options={\"a\"=>false, \"b\"=>true}>}
112
112
 
113
113
  # Call by passing aliases as an argument.
114
- result = Update.(
115
- options,
116
- {
117
- context_options: {
118
- aliases: { 'b' => :settle },
119
- container_class: Trailblazer::Context::Container::WithAliases,
114
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.0.0")
115
+ result = Update.(
116
+ options,
117
+ {
118
+ context_options: {
119
+ aliases: { 'b' => :settle },
120
+ container_class: Trailblazer::Context::Container::WithAliases,
121
+ }
120
122
  }
121
- }
122
- )
123
- result[:settle].must_equal true
123
+ )
124
+ else
125
+ result = Update.call_with_flow_options(
126
+ options,
127
+ {
128
+ context_options: {
129
+ aliases: { 'b' => :settle },
130
+ container_class: Trailblazer::Context::Container::WithAliases,
131
+ }
132
+ },
133
+ )
134
+ end
124
135
 
136
+ result[:settle].must_equal true
125
137
  # Set aliases by overriding `flow_options` at the compile time.
126
138
  result = Aliases.(options)
127
139
  result[:settle].must_equal true
data/test/step_test.rb CHANGED
@@ -40,7 +40,11 @@ class StepTest < Minitest::Spec
40
40
 
41
41
  it { Create.(a: 1, b: 2, c: 3, d: 4, e: 5).inspect("a", "b", "c", "d", "e").must_equal "<Result:true [1, 2, 3, 4, 5] >" }
42
42
 
43
- it { Trailblazer::Developer.railway(Create).gsub(/0x.+?step_test.rb/, "").must_equal %{[>#<Proc::30 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c>,>d,>MyMacro]} }
43
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.7.0")
44
+ it { Trailblazer::Developer.railway(Create).gsub(/0x.+?step_test.rb/, "").gsub(/\)\s.+?step_test.rb/, ") test/step_test.rb").must_equal %{[>#<Proc::30 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c(options, c: ..., **) test/step_test.rb:18>,>d,>MyMacro]} }
45
+ else
46
+ it { Trailblazer::Developer.railway(Create).gsub(/0x.+?step_test.rb/, "").must_equal %{[>#<Proc::30 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c>,>d,>MyMacro]} }
47
+ end
44
48
 
45
49
  #---
46
50
  #- :before, :after, :replace, :delete, :override
@@ -178,7 +182,8 @@ class StepTest < Minitest::Spec
178
182
  step :a, before: "I don't exist!"
179
183
  end
180
184
  end
181
- assert_match /<Trailblazer::Activity::DSL::Linear::Sequence::IndexError: "I don't exist!" is not a valid step ID. Did you mean any of these ?/, op.inspect
185
+ assert_equal Trailblazer::Activity::DSL::Linear::Sequence::IndexError, op.class
186
+ # assert_match /<Trailblazer::Activity::DSL::Linear::Sequence::IndexError: .+ is not a valid step ID. Did you mean any of these ?/, op.inspect
182
187
  end
183
188
 
184
189
  #---
@@ -195,16 +200,16 @@ class StepTest < Minitest::Spec
195
200
 
196
201
  #---
197
202
  #- inheritance
198
- class New < Create
203
+ class New < Index
199
204
  end
200
205
 
201
- it { Trailblazer::Developer.railway(New).gsub(/0x.+?step_test.rb/, "").must_equal %{[>#<Proc::30 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c>,>d,>MyMacro]} }
206
+ it { Trailblazer::Developer.railway(New).must_equal %{[>my validate,>persist!,>I win!,>No, I do!]} }
202
207
 
203
- class Update < Create
204
- step :after_save!
208
+ class Update < Index
209
+ step :after_save
205
210
  end
206
211
 
207
- it { Trailblazer::Developer.railway(Update).gsub(/0x.+?step_test.rb/, "").must_equal %{[>#<Proc::30 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c>,>d,>MyMacro,>after_save!]} }
212
+ it { Trailblazer::Developer.railway(Update).must_equal %{[>my validate,>persist!,>I win!,>No, I do!,>after_save]} }
208
213
  end
209
214
 
210
215
  #---
data/test/trace_test.rb CHANGED
@@ -49,4 +49,28 @@ class TraceTest < Minitest::Spec
49
49
  |-- Create.task.params
50
50
  `-- End.success}
51
51
  end
52
+
53
+ it "Operation.wtf?" do
54
+ result = nil
55
+ output, = capture_io do
56
+ result = Create.wtf?(params: {x: 1}, a_return: true)
57
+ end
58
+
59
+ output.gsub(/0x\w+/, "").gsub(/@.+_test/, "").must_equal %{`-- #<Trailblazer::Activity:>
60
+ |-- \e[32mStart.default\e[0m
61
+ |-- \e[32mCreate.task.a\e[0m
62
+ |-- MyNested
63
+ | |-- \e[32mStart.default\e[0m
64
+ | |-- \e[32mB.task.b\e[0m
65
+ | |-- \e[32mB.task.e\e[0m
66
+ | `-- End.success
67
+ |-- \e[32mCreate.task.c\e[0m
68
+ |-- \e[32mCreate.task.params\e[0m
69
+ `-- End.success
70
+ }
71
+
72
+ result.success?.must_equal true
73
+ result[:a_return].must_equal true
74
+ result[:params].inspect.must_equal %{{:x=>1}}
75
+ end
52
76
  end
@@ -17,14 +17,13 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_dependency "trailblazer-activity-dsl-linear", ">= 0.3.2", "< 1.0.0"
21
- spec.add_dependency "trailblazer-activity", ">= 0.11.2", "< 1.0.0"
22
- spec.add_dependency "trailblazer-developer", ">= 0.0.8"
20
+ spec.add_dependency "trailblazer-activity-dsl-linear", ">= 0.4.0", "< 1.0.0"
23
21
 
24
22
  spec.add_development_dependency "bundler"
25
23
  spec.add_development_dependency "minitest"
26
24
  spec.add_development_dependency "rake"
27
25
  spec.add_development_dependency "rubocop"
26
+ spec.add_development_dependency "trailblazer-developer"
28
27
 
29
28
  spec.required_ruby_version = ">= 2.1.0"
30
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-operation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-27 00:00:00.000000000 Z
11
+ date: 2021-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: trailblazer-activity-dsl-linear
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.2
19
+ version: 0.4.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: 1.0.0
@@ -26,46 +26,26 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.3.2
29
+ version: 0.4.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.0.0
33
33
  - !ruby/object:Gem::Dependency
34
- name: trailblazer-activity
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: 0.11.2
40
- - - "<"
41
- - !ruby/object:Gem::Version
42
- version: 1.0.0
43
- type: :runtime
44
- prerelease: false
45
- version_requirements: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 0.11.2
50
- - - "<"
51
- - !ruby/object:Gem::Version
52
- version: 1.0.0
53
- - !ruby/object:Gem::Dependency
54
- name: trailblazer-developer
34
+ name: bundler
55
35
  requirement: !ruby/object:Gem::Requirement
56
36
  requirements:
57
37
  - - ">="
58
38
  - !ruby/object:Gem::Version
59
- version: 0.0.8
60
- type: :runtime
39
+ version: '0'
40
+ type: :development
61
41
  prerelease: false
62
42
  version_requirements: !ruby/object:Gem::Requirement
63
43
  requirements:
64
44
  - - ">="
65
45
  - !ruby/object:Gem::Version
66
- version: 0.0.8
46
+ version: '0'
67
47
  - !ruby/object:Gem::Dependency
68
- name: bundler
48
+ name: minitest
69
49
  requirement: !ruby/object:Gem::Requirement
70
50
  requirements:
71
51
  - - ">="
@@ -79,7 +59,7 @@ dependencies:
79
59
  - !ruby/object:Gem::Version
80
60
  version: '0'
81
61
  - !ruby/object:Gem::Dependency
82
- name: minitest
62
+ name: rake
83
63
  requirement: !ruby/object:Gem::Requirement
84
64
  requirements:
85
65
  - - ">="
@@ -93,7 +73,7 @@ dependencies:
93
73
  - !ruby/object:Gem::Version
94
74
  version: '0'
95
75
  - !ruby/object:Gem::Dependency
96
- name: rake
76
+ name: rubocop
97
77
  requirement: !ruby/object:Gem::Requirement
98
78
  requirements:
99
79
  - - ">="
@@ -107,7 +87,7 @@ dependencies:
107
87
  - !ruby/object:Gem::Version
108
88
  version: '0'
109
89
  - !ruby/object:Gem::Dependency
110
- name: rubocop
90
+ name: trailblazer-developer
111
91
  requirement: !ruby/object:Gem::Requirement
112
92
  requirements:
113
93
  - - ">="
@@ -163,8 +143,6 @@ files:
163
143
  - test/introspect_test.rb
164
144
  - test/operation_test.rb
165
145
  - test/result_test.rb
166
- - test/ruby-2.0.0/operation_test.rb
167
- - test/ruby-2.0.0/step_test.rb
168
146
  - test/skill_test.rb
169
147
  - test/step_test.rb
170
148
  - test/test_helper.rb
@@ -177,7 +155,7 @@ homepage: http://trailblazer.to
177
155
  licenses:
178
156
  - MIT
179
157
  metadata: {}
180
- post_install_message:
158
+ post_install_message:
181
159
  rdoc_options: []
182
160
  require_paths:
183
161
  - lib
@@ -192,8 +170,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
170
  - !ruby/object:Gem::Version
193
171
  version: '0'
194
172
  requirements: []
195
- rubygems_version: 3.0.8
196
- signing_key:
173
+ rubygems_version: 3.2.3
174
+ signing_key:
197
175
  specification_version: 4
198
176
  summary: Trailblazer's operation object with railway flow and integrated error handling.
199
177
  test_files:
@@ -215,8 +193,6 @@ test_files:
215
193
  - test/introspect_test.rb
216
194
  - test/operation_test.rb
217
195
  - test/result_test.rb
218
- - test/ruby-2.0.0/operation_test.rb
219
- - test/ruby-2.0.0/step_test.rb
220
196
  - test/skill_test.rb
221
197
  - test/step_test.rb
222
198
  - test/test_helper.rb
@@ -1,61 +0,0 @@
1
- require "test_helper"
2
-
3
- class DeclarativeApiTest < Minitest::Spec
4
- #---
5
- #- step, pass, fail
6
-
7
- # Test: step/pass/fail
8
- # * do they deviate properly?
9
- class Create < Trailblazer::Operation
10
- step :decide!
11
- success :wasnt_ok!
12
- success :was_ok!
13
- failure :return_true!
14
- failure :return_false!
15
-
16
- def decide!(options, decide: raise, **_o)
17
- options["a"] = true
18
- decide
19
- end
20
-
21
- def wasnt_ok!(options, **_o)
22
- options["y"] = false
23
- end
24
-
25
- def was_ok!(options, **_o)
26
- options["x"] = true
27
- end
28
-
29
- def return_true!(options, **_o); options["b"] = true end
30
-
31
- def return_false!(options, **_o); options["c"] = false end
32
- end
33
-
34
- it { Create.({}, decide: true).inspect("a", "x", "y", "b", "c").must_equal %{<Result:true [true, true, false, nil, nil] >} }
35
- it { Create.({}, decide: false).inspect("a", "x", "y", "b", "c").must_equal %{<Result:false [true, nil, nil, true, false] >} }
36
-
37
- #---
38
- #- trace
39
-
40
- it do
41
- end
42
-
43
- #---
44
- #- empty class
45
- class Noop < Trailblazer::Operation
46
- end
47
-
48
- it { Noop.().inspect("params").must_equal %{<Result:true [{}] >} }
49
-
50
- #---
51
- #- pass
52
- #- fail
53
- class Update < Trailblazer::Operation
54
- pass ->(options, **_o) { options["a"] = false }
55
- step ->(options, params: raise, **_o) { options["b"] = params[:decide] }
56
- fail ->(options, **_o) { options["c"] = true }
57
- end
58
-
59
- it { Update.(decide: true).inspect("a", "b", "c").must_equal %{<Result:true [false, true, nil] >} }
60
- it { Update.(decide: false).inspect("a", "b", "c").must_equal %{<Result:false [false, false, true] >} }
61
- end
@@ -1,137 +0,0 @@
1
- require "test_helper"
2
-
3
- # Tests
4
- # --- step ->(*o) { snippet }
5
- # --- step Callable
6
- # --- step :method
7
- # --- step MyMacro
8
- class StepTest < Minitest::Spec
9
- class Callable
10
- def self.call(options, b: nil, **_o)
11
- options["b"] = b
12
- end
13
- end
14
-
15
- module Implementation
16
- module_function
17
-
18
- def c(options, c: nil, **_o)
19
- options["c"] = c
20
- end
21
- end
22
-
23
- MyMacro = ->(direction, options, flow_options) do
24
- options["e"] = options[:e]
25
-
26
- [direction, options, flow_options]
27
- end
28
-
29
- class Create < Trailblazer::Operation
30
- step ->(options, a: nil, **_o) { options["a"] = a }
31
- step Callable
32
- step Implementation.method(:c)
33
- step :d
34
- step [MyMacro, {}] # doesn't provide runner_options.
35
-
36
- def d(options, d: nil, **_o)
37
- options["d"] = d
38
- end
39
- end
40
-
41
- it { Create.({}, a: 1, b: 2, c: 3, d: 4, e: 5).inspect("a", "b", "c", "d", "e").must_equal "<Result:true [1, 2, 3, 4, 5] >" }
42
-
43
- it { Trailblazer::Operation::Inspect.(Create).gsub(/0x.+?step_test.rb/, "").must_equal %{[>#<Proc::29 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c>,>d,>[#<Proc::22 (lambda)>, {}]]} }
44
- # poor test to make sure we pass debug information to Activity.
45
- it { Create["__activity__"].graph.find_all(:d).first[:id].must_equal :d }
46
-
47
- #---
48
- #- :before, :after, :replace, :delete, :override
49
- class A < Trailblazer::Operation
50
- step :a!
51
- def a!(options, **_o); options["a"] = 1; end
52
- def a!(options, **_o); options["a"] = 1; end if RUBY_VERSION == "2.0.0"
53
- end
54
-
55
- class B < A
56
- step :b!, before: :a!
57
- step :c!, before: :a!
58
- step :d!, after: :b!
59
- end
60
-
61
- it { Trailblazer::Operation::Inspect.(B).must_equal %{[>b!,>d!,>c!,>a!]} }
62
-
63
- class C < B
64
- step :e!, replace: :c!
65
- step nil, delete: :d!
66
- end
67
-
68
- it { Trailblazer::Operation::Inspect.(C).must_equal %{[>b!,>e!,>a!]} }
69
-
70
- class D < Trailblazer::Operation
71
- step :a!
72
- step :b!
73
- step :b!, override: true
74
- end
75
-
76
- it { Trailblazer::Operation::Inspect.(D).must_equal %{[>a!,>b!]} }
77
-
78
- # not existent :name
79
- it do
80
- err = assert_raises Trailblazer::Operation::Railway::Sequence::IndexError do
81
- class E < Trailblazer::Operation
82
- step :a, before: "I don't exist!"
83
- end
84
- end
85
-
86
- err.inspect.must_equal "#<Trailblazer::Operation::Railway::Sequence::IndexError: I don't exist!>"
87
- end
88
-
89
- #---
90
- #- :name
91
- #- step :whatever, name: :validate
92
- class Index < Trailblazer::Operation
93
- step :validate!, name: "my validate"
94
- step :persist!
95
- step [MyMacro, name: "I win!"]
96
- step [MyMacro, name: "I win!"], name: "No, I do!"
97
- end
98
-
99
- it { Trailblazer::Operation::Inspect.(Index).must_equal %{[>my validate,>persist!,>I win!,>No, I do!]} }
100
-
101
- #---
102
- #- inheritance
103
- class New < Create
104
- end
105
-
106
- it { Trailblazer::Operation::Inspect.(New).gsub(/0x.+?step_test.rb/, "").must_equal %{[>#<Proc::29 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c>,>d,>[#<Proc::22 (lambda)>, {}]]} }
107
-
108
- class Update < Create
109
- step :after_save!
110
- end
111
-
112
- it { Trailblazer::Operation::Inspect.(Update).gsub(/0x.+?step_test.rb/, "").must_equal %{[>#<Proc::29 (lambda)>,>StepTest::Callable,>#<Method: StepTest::Implementation.c>,>d,>[#<Proc::22 (lambda)>, {}],>after_save!]} }
113
- end
114
-
115
- #---
116
- #- Macros with the old `input` arg.
117
- # step [ ->(input, options) { } ]
118
- # TODO: remove me in 2.2.
119
- class StepWithDeprecatedMacroTest < Minitest::Spec
120
- class Create < Trailblazer::Operation
121
- MyOutdatedMacro = ->(input, options) {
122
- options["x"] = input.class
123
- }
124
-
125
- class AnotherOldMacro
126
- def self.call(input, options)
127
- options["y"] = input.class
128
- end
129
- end
130
-
131
- step [MyOutdatedMacro, name: :outdated]
132
- step [AnotherOldMacro, name: :oldie]
133
- end
134
-
135
- it { Trailblazer::Operation::Inspect.(Create).gsub(/0x.+?step_test.rb/, "").must_equal %{[>outdated,>oldie]} }
136
- it { Create.().inspect("x", "y").must_equal %{<Result:true [StepWithDeprecatedMacroTest::Create, StepWithDeprecatedMacroTest::Create] >} }
137
- end