trailblazer-operation 0.6.1 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 569ffef484d0783c9f16d35ce6848f8506687140e3fede28f15ab506d832ad5c
4
- data.tar.gz: e646b0c9b05dbaba40c136d8345c896727b30cfeba1ee62b5f180e87ff6c05b8
3
+ metadata.gz: bf82f1aa3080dfea1c9165859fdd6de207c9333cc3af7fb8c2e52fff55811ba2
4
+ data.tar.gz: c53369fe71b53e3ac3be42746d438c648b312a4d03956f483abd2d1e7e39cebb
5
5
  SHA512:
6
- metadata.gz: 4d1f804fb97272a858374a5204b033e4ef3ee0a8fe29e29a36e6c3c9f0314b1059b4731b32e9aaf35a9e921b3158cfed53302e6b58fa3070bd3b89b239e49365
7
- data.tar.gz: 03353eadeaa413e25ba9deb4847ddedf07827f8b71d16f943a5bf980c499eed231fa8158e60e4492bf449bdbc341c711c109c4fbbb77ade2c858e816a7aff0c9
6
+ metadata.gz: 98b29781915fdb5b40921dfd621a59dc580ce708e7ddaaf44b3123ee5a838ffde6a96cbe9b2d0cb24b15b60db3d2f5e166339253612786b96ebf5c5073e28fe6
7
+ data.tar.gz: 1481d504865240aeeee2bd254cfbc927156da7d465a408e42fc8936579984a95a80926356e6b5757d67ce8d814879f6aa22fc1678cd869345ac7be38b40d2e68
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ test/tmp
15
15
  test/version_tmp
16
16
  tmp
17
17
  /**/*.log
18
+ .rubocop-*yml
@@ -1,16 +1,13 @@
1
1
  language: ruby
2
2
  before_install:
3
3
  - gem install bundler -v 1.17.3
4
- matrix:
5
- include:
6
- # - rvm: 2.1.0
7
- # gemfile: Gemfile
8
- - rvm: 2.2.4
9
- gemfile: Gemfile
10
- - rvm: 2.3.3
11
- gemfile: Gemfile
12
- - rvm: 2.4.0
13
- gemfile: Gemfile
14
- - rvm: 2.5.0
15
- gemfile: Gemfile
16
- script: bundle exec rake test
4
+ rvm:
5
+ - ruby-head
6
+ - 2.7
7
+ - 2.6
8
+ - 2.5
9
+ - 2.4
10
+ jobs:
11
+ allow_failures:
12
+ - rvm: ruby-head
13
+ - rvm: 2.7
data/CHANGES.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## 0.6.6
2
+
3
+ * Rename `Operation.flow_options` to `Operation.flow_options_for_public_call`.
4
+ * Operations can also accept `flow_options` at run-time now :beers:, giving them precedence over `Operation.flow_options_for_public_call`.
5
+
6
+ ## 0.6.5
7
+
8
+ * Upgrade `trailblazer-activity` & `trailblazer-activity-dsl-linear` versions to utilise new `trailblazer-context` :drum:
9
+
10
+ ## 0.6.4
11
+
12
+ * Remove container support. Containers should be part of `ctx` itself
13
+
14
+ ## 0.6.3
15
+
16
+ * Require forwardable module from standard lib.
17
+
18
+ ## 0.6.2
19
+
20
+ * Fix Trace so it works with Ruby <= 2.4
21
+
1
22
  ## 0.6.1
2
23
 
3
24
  * Reintroduce `ClassDependencies` by leveraging `State.fields`.
data/README.md CHANGED
@@ -15,6 +15,6 @@ An operation can be used exaclty like an activity, including nesting, tracing, e
15
15
 
16
16
  ## Copyright
17
17
 
18
- Copyright (c) 2016 Nick Sutterer <apotonick@gmail.com>
18
+ Copyright (c) 2016-2020 Nick Sutterer <apotonick@gmail.com>
19
19
 
20
20
  `trailblazer-operation` is released under the [MIT License](http://www.opensource.org/licenses/MIT).
@@ -1,10 +1,10 @@
1
+ require 'forwardable'
2
+ require 'trailblazer/operation/version'
1
3
  require "trailblazer/option"
2
4
  require "trailblazer/context"
3
- require "trailblazer/container_chain"
4
5
 
5
6
  require "trailblazer/activity/dsl/linear"
6
7
 
7
-
8
8
  module Trailblazer
9
9
  # DISCUSS: I don't know where else to put this. It's not part of the {Activity} concept
10
10
  class Activity
@@ -51,13 +51,6 @@ module Trailblazer
51
51
 
52
52
  require "trailblazer/operation/trace"
53
53
  extend Trace # ::trace
54
-
55
- module Railway
56
- def self.fail! ; Activity::Left end
57
- def self.pass! ; Activity::Right end
58
- def self.fail_fast!; Activity::FastTrack::FailFast end
59
- def self.pass_fast!; Activity::FastTrack::PassFast end
60
- end
61
54
  end
62
55
  end
63
56
 
@@ -67,9 +60,4 @@ require "trailblazer/operation/deprecated_macro" # TODO: remove in 2.2.
67
60
  require "trailblazer/operation/result"
68
61
  require "trailblazer/operation/railway"
69
62
 
70
- require "trailblazer/developer"
71
- require "trailblazer/operation/trace"
72
-
73
63
  require "trailblazer/operation/railway/macaroni"
74
-
75
- require "trailblazer/operation/container"
@@ -12,21 +12,21 @@ class Trailblazer::Operation
12
12
  @state.update_options(options)
13
13
  end
14
14
 
15
- def options_for_public_call(options, *)
15
+ def options_for_public_call(options, **flow_options)
16
16
  ctx = super
17
- context_for_fields(class_fields, ctx)
17
+ context_for_fields(class_fields, [ctx, flow_options], {})
18
18
  end
19
19
 
20
20
  private def class_fields
21
21
  @state.to_h[:fields]
22
22
  end
23
23
 
24
- private def context_for_fields(fields, ctx)
25
- ctx_with_fields = Trailblazer::Context.implementation.build(fields, ctx, [ctx, {}], {}) # TODO: redundant to otions_for_public_call. how to inject aliasing etc?
24
+ private def context_for_fields(fields, (ctx, flow_options), **)
25
+ ctx_with_fields = Trailblazer::Context(fields, ctx, flow_options[:context_options]) # TODO: redundant to otions_for_public_call.
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)
29
+ ctx_with_fields = context_for_fields(class_fields, [ctx, flow_options], circuit_options)
30
30
 
31
31
  super([ctx_with_fields, flow_options], circuit_options) # FIXME: should we unwrap here?
32
32
  end
@@ -19,15 +19,23 @@ module Trailblazer
19
19
  call_with_public_interface(options, *args)
20
20
  end
21
21
 
22
- def call_with_public_interface(*args)
23
- ctx = options_for_public_call(*args, flow_options())
22
+ # Default {@activity} call interface which doesn't accept {circuit_options}
23
+ #
24
+ # @param [Array] args => [ctx, flow_options]
25
+ #
26
+ # @return [Operation::Railway::Result]
27
+ #
28
+ # @private
29
+ def call_with_public_interface(options, flow_options = {})
30
+ flow_options = flow_options_for_public_call(flow_options)
31
+ ctx = options_for_public_call(options, flow_options)
24
32
 
25
33
  # call the activity.
26
34
  # This will result in invoking {::call_with_circuit_interface}.
27
35
  # last_signal, (options, flow_options) = Activity::TaskWrap.invoke(self, [ctx, {}], {})
28
36
  signal, (ctx, flow_options) = Activity::TaskWrap.invoke(
29
37
  @activity,
30
- [ctx, flow_options()],
38
+ [ctx, flow_options],
31
39
  exec_context: new
32
40
  )
33
41
 
@@ -36,6 +44,13 @@ module Trailblazer
36
44
  end
37
45
 
38
46
  # This interface is used for all nested OPs (and the outer-most, too).
47
+ #
48
+ # @param [Array] args - Contains [ctx, flow_options]
49
+ # @param [Hash] circuit_options - Options to configure activity circuit
50
+ #
51
+ # @return [signal, [ctx, flow_options]]
52
+ #
53
+ # @private
39
54
  def call_with_circuit_interface(args, circuit_options)
40
55
  strategy_call(args, circuit_options) # FastTrack#call
41
56
  end
@@ -46,13 +61,13 @@ module Trailblazer
46
61
 
47
62
  # Compile a Context object to be passed into the Activity::call.
48
63
  # @private
49
- def self.options_for_public_call(options, **flow_options)
50
- Trailblazer::Context.for_circuit(options, {}, [options, flow_options], {})
64
+ def self.options_for_public_call(options, flow_options = {})
65
+ Trailblazer::Context(options, {}, flow_options[:context_options])
51
66
  end
52
67
 
53
68
  # @semi=public
54
- def flow_options
55
- {context_alias: {}}
69
+ def flow_options_for_public_call(options = {})
70
+ options
56
71
  end
57
72
  end
58
73
  end
@@ -5,6 +5,10 @@ module Trailblazer
5
5
  class Operation
6
6
  # End event: All subclasses of End:::Success are interpreted as "success".
7
7
  module Railway
8
+ def self.fail! ; Activity::Left end
9
+ def self.pass! ; Activity::Right end
10
+ def self.fail_fast!; Activity::FastTrack::FailFast end
11
+ def self.pass_fast!; Activity::FastTrack::PassFast end
8
12
  # @param options Context
9
13
  # @param end_event The last emitted signal in a circuit is usually the end event.
10
14
  def self.Result(end_event, options, *)
@@ -1,3 +1,6 @@
1
+ require 'delegate'
2
+ require "trailblazer/developer"
3
+
1
4
  module Trailblazer
2
5
  class Operation
3
6
  module Trace
@@ -31,7 +34,7 @@ module Trailblazer
31
34
  end
32
35
 
33
36
  def wtf
34
- Trailblazer::Developer::Trace::Present.(@stack)
37
+ Developer::Trace::Present.(@stack)
35
38
  end
36
39
 
37
40
  def wtf?
@@ -1,7 +1,7 @@
1
1
  module Trailblazer
2
2
  module Version
3
3
  module Operation
4
- VERSION = "0.6.1"
4
+ VERSION = "0.6.6"
5
5
  end
6
6
  end
7
7
  end
@@ -24,7 +24,6 @@ class DocsActivityTest < Minitest::Spec
24
24
  signal.inspect.must_equal %{#<Trailblazer::Activity::Railway::End::Success semantic=:success>}
25
25
  end
26
26
 
27
- #:describe
28
27
  describe Memo::Create do
29
28
  it "creates a sane Memo instance" do
30
29
  #:call-public
@@ -39,8 +38,64 @@ class DocsActivityTest < Minitest::Spec
39
38
  result.success?.must_equal true
40
39
  result[:model].text.must_equal "Enjoy an IPA"
41
40
  end
41
+
42
+ it "allows indifferent access for ctx keys" do
43
+ #:ctx-indifferent-access
44
+ result = Memo::Create.(params: { text: "Enjoy an IPA" })
45
+
46
+ result[:params] # => { text: "Enjoy an IPA" }
47
+ result['params'] # => { text: "Enjoy an IPA" }
48
+ #:ctx-indifferent-access end
49
+
50
+ result.success?.must_equal true
51
+ result[:params].must_equal({ text: "Enjoy an IPA" })
52
+ result['params'].must_equal({ text: "Enjoy an IPA" })
53
+ end
54
+
55
+ it "allows defining aliases for ctx keys" do
56
+ module AliasesExample
57
+ Memo = Struct.new(:text)
58
+
59
+ module Memo::Contract
60
+ Create = Struct.new(:sync)
61
+ end
62
+
63
+ #:ctx-aliases-step
64
+ class Memo::Create < Trailblazer::Operation
65
+ #~flow
66
+ step ->(ctx, **) { ctx[:'contract.default'] = Memo::Contract::Create.new }
67
+ #~flow end
68
+
69
+ pass :sync
70
+
71
+ def sync(ctx, contract:, **)
72
+ # ctx['contract.default'] == ctx[:contract]
73
+ contract.sync
74
+ end
75
+ end
76
+ #:ctx-aliases-step end
77
+ end
78
+
79
+ #:ctx-aliases
80
+ options = { params: { text: "Enjoy an IPA" } }
81
+ flow_options = {
82
+ context_options: {
83
+ aliases: { 'contract.default': :contract, 'policy.default': :policy },
84
+ container_class: Trailblazer::Context::Container::WithAliases,
85
+ }
86
+ }
87
+
88
+ result = AliasesExample::Memo::Create.(options, flow_options)
89
+
90
+ result['contract.default'] # => Memo::Contract::Create
91
+ result[:contract] # => Memo::Contract::Create
92
+ #:ctx-aliases end
93
+
94
+ result.success?.must_equal true
95
+ _(result[:contract].class).must_equal AliasesExample::Memo::Contract::Create
96
+ _(result['contract.default']).must_equal result[:contract]
97
+ end
42
98
  end
43
- #:describe end
44
99
 
45
100
  it do
46
101
  module J
@@ -245,9 +245,8 @@ describe all options :pass_fast, :fast_track and emiting signals directly, like
245
245
  end
246
246
 
247
247
  it "runs #create_model, only" do
248
- Memo = FastTrack::Memo
249
248
  #:ft-call
250
- result = Memo::Create.(create_empty_model: true)
249
+ result = FastTrack::Memo::Create.(create_empty_model: true)
251
250
  puts result.success? #=> true
252
251
  puts result[:model].inspect #=> #<Memo text=nil>
253
252
  #:ft-call end
@@ -257,9 +256,8 @@ describe all options :pass_fast, :fast_track and emiting signals directly, like
257
256
  end
258
257
 
259
258
  it "fast-tracks in #assign_errors" do
260
- Memo = FastTrack::Memo
261
259
  #:ft-call-err
262
- result = Memo::Create.({})
260
+ result = FastTrack::Memo::Create.({})
263
261
  puts result.success? #=> false
264
262
  puts result[:model].inspect #=> #<Memo text=nil>
265
263
  puts result[:errors].inspect #=> "Something went wrong!"
@@ -271,16 +269,15 @@ describe all options :pass_fast, :fast_track and emiting signals directly, like
271
269
  end
272
270
 
273
271
  it "goes till #save by emitting signals directly" do
274
- Memo = FastTrack::Memo
275
- result = Memo::Create.(params: {text: "Punk is not dead!"})
272
+ result = FastTrack::Memo::Create.(params: {text: "Punk is not dead!"})
276
273
  result.success?.must_equal true
277
274
  result[:model].id.must_equal 1
278
275
  result[:errors].must_be_nil
279
276
  end
280
277
 
278
+
281
279
  it "goes till #save by using signal helper" do
282
- Memo = FastTrack::Memo
283
- result = Memo::Create2.(params: {text: "Punk is not dead!"})
280
+ result = FastTrack::Memo::Create2.(params: {text: "Punk is not dead!"})
284
281
  result.success?.must_equal true
285
282
  result[:model].id.must_equal 1
286
283
  result[:errors].must_be_nil
@@ -79,8 +79,51 @@ class DeclarativeApiTest < Minitest::Spec
79
79
  step ->(options, **) { options["e"] = 2 }
80
80
  end
81
81
 
82
+ class Aliases < Update
83
+ def self.flow_options_for_public_call(*)
84
+ {
85
+ context_options: {
86
+ aliases: { 'b' => :settle },
87
+ container_class: Trailblazer::Context::Container::WithAliases,
88
+ }
89
+ }
90
+ end
91
+ end
92
+
82
93
  it "allows to inherit" do
83
94
  Upsert.("params" => {decide: true}).inspect("a", "b", "c", "d", "e").must_equal %{<Result:true [false, true, nil, 1, nil] >}
84
95
  Unset. ("params" => {decide: true}).inspect("a", "b", "c", "d", "e").must_equal %{<Result:true [false, true, nil, 1, 2] >}
85
96
  end
97
+
98
+ #---
99
+ #- ctx container
100
+ it do
101
+ options = { "params" => {decide: true} }
102
+
103
+ # Default call
104
+ result = Update.(options)
105
+ result.inspect("a", "b", "c").must_equal %{<Result:true [false, true, nil] >}
106
+
107
+ # Circuit interface call
108
+ signal, (ctx, _) = Update.([Update.options_for_public_call(options), {}], {})
109
+
110
+ signal.inspect.must_equal %{#<Trailblazer::Activity::Railway::End::Success semantic=:success>}
111
+ ctx.inspect.must_equal %{#<Trailblazer::Context::Container wrapped_options={\"params\"=>{:decide=>true}} mutable_options={\"a\"=>false, \"b\"=>true}>}
112
+
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,
120
+ }
121
+ }
122
+ )
123
+ result[:settle].must_equal true
124
+
125
+ # Set aliases by overriding `flow_options` at the compile time.
126
+ result = Aliases.(options)
127
+ result[:settle].must_equal true
128
+ end
86
129
  end
@@ -173,11 +173,12 @@ class StepTest < Minitest::Spec
173
173
  #-
174
174
  # not existent :name
175
175
  it do
176
- assert_raises Trailblazer::Activity::DSL::Linear::Sequence::IndexError do
176
+ op = assert_raises Trailblazer::Activity::DSL::Linear::Sequence::IndexError do
177
177
  Class.new(Trailblazer::Operation) do
178
178
  step :a, before: "I don't exist!"
179
179
  end
180
- end.inspect.must_equal %{#<Trailblazer::Activity::DSL::Linear::Sequence::IndexError: "I don't exist!">}
180
+ 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
181
182
  end
182
183
 
183
184
  #---
@@ -1,7 +1,9 @@
1
+ $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
2
+ require "trailblazer/operation"
3
+
1
4
  require "pp"
2
5
 
3
6
  require "minitest/autorun"
4
- require "trailblazer/operation"
5
7
  require "trailblazer/activity/testing"
6
8
  require "trailblazer/developer/render/linear"
7
9
 
@@ -14,18 +14,13 @@ class TraceTest < Minitest::Spec
14
14
  end
15
15
  # raise Create["__task_wraps__"].inspect
16
16
 
17
- it "allows using low-level Activity::Trace" do
18
- ->(*args) { puts "@@@@@ #{args.last.inspect}"; Create.__call__(*args) }
19
-
20
- stack, = Trailblazer::Developer::Trace.(
17
+ it "allows using low-level Operation::Trace" do
18
+ result = Trailblazer::Operation::Trace.(
21
19
  Create,
22
- [
23
- {a_return: true, params: {}},
24
- {}
25
- ]
20
+ { a_return: true, params: {} },
26
21
  )
27
22
 
28
- puts output = Trailblazer::Developer::Trace::Present.(stack)
23
+ output = result.wtf
29
24
 
30
25
  output.gsub(/0x\w+/, "").gsub(/@.+_test/, "").must_equal %{`-- TraceTest::Create
31
26
  |-- Start.default
@@ -14,11 +14,11 @@ Gem::Specification.new do |spec|
14
14
 
15
15
  spec.files = `git ls-files`.split($/)
16
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
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.2.6", "< 1.0.0"
21
- spec.add_dependency "trailblazer-activity", ">= 0.10.0", "< 1.0.0"
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
22
  spec.add_dependency "trailblazer-developer", ">= 0.0.8"
23
23
 
24
24
  spec.add_development_dependency "bundler"
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.1
4
+ version: 0.6.6
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: 2020-04-17 00:00:00.000000000 Z
11
+ date: 2021-01-27 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.2.6
19
+ version: 0.3.2
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: 1.0.0
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.2.6
29
+ version: 0.3.2
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.0.0
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 0.10.0
39
+ version: 0.11.2
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
42
  version: 1.0.0
@@ -46,7 +46,7 @@ dependencies:
46
46
  requirements:
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 0.10.0
49
+ version: 0.11.2
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: 1.0.0
@@ -138,7 +138,6 @@ files:
138
138
  - lib/trailblazer/operation.rb
139
139
  - lib/trailblazer/operation/callable.rb
140
140
  - lib/trailblazer/operation/class_dependencies.rb
141
- - lib/trailblazer/operation/container.rb
142
141
  - lib/trailblazer/operation/deprecated_macro.rb
143
142
  - lib/trailblazer/operation/public_call.rb
144
143
  - lib/trailblazer/operation/railway.rb
@@ -155,7 +154,6 @@ files:
155
154
  - test/docs/macaroni_test.rb
156
155
  - test/docs/operation_test.rb
157
156
  - test/docs/wiring_test.rb
158
- - test/dry_container_test.rb
159
157
  - test/fast_track_test.rb
160
158
  - test/gemfiles/Gemfile.ruby-1.9
161
159
  - test/gemfiles/Gemfile.ruby-2.0
@@ -179,7 +177,7 @@ homepage: http://trailblazer.to
179
177
  licenses:
180
178
  - MIT
181
179
  metadata: {}
182
- post_install_message:
180
+ post_install_message:
183
181
  rdoc_options: []
184
182
  require_paths:
185
183
  - lib
@@ -195,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
193
  version: '0'
196
194
  requirements: []
197
195
  rubygems_version: 3.0.8
198
- signing_key:
196
+ signing_key:
199
197
  specification_version: 4
200
198
  summary: Trailblazer's operation object with railway flow and integrated error handling.
201
199
  test_files:
@@ -208,7 +206,6 @@ test_files:
208
206
  - test/docs/macaroni_test.rb
209
207
  - test/docs/operation_test.rb
210
208
  - test/docs/wiring_test.rb
211
- - test/dry_container_test.rb
212
209
  - test/fast_track_test.rb
213
210
  - test/gemfiles/Gemfile.ruby-1.9
214
211
  - test/gemfiles/Gemfile.ruby-2.0
@@ -1,14 +0,0 @@
1
- module Trailblazer
2
- module Operation::Container
3
- def options_for_public_call(options={}, *containers)
4
- # generate the skill hash that embraces runtime options plus potential containers, the so called Runtime options.
5
- # This wrapping is supposed to happen once in the entire system.
6
-
7
- hash_transformer = ->(containers) { containers[0].to_hash } # FIXME: don't transform any containers into kw args.
8
-
9
- immutable_options = Trailblazer::Context::ContainerChain.new([options, *containers], to_hash: hash_transformer)
10
-
11
- Trailblazer::Context(immutable_options)
12
- end
13
- end
14
- end
@@ -1,25 +0,0 @@
1
- require "test_helper"
2
- require "dry/container"
3
-
4
- class DryContainerTest < Minitest::Spec
5
- my_container = Dry::Container.new
6
- my_container.register("user_repository", -> { Object })
7
- my_container.namespace("contract") do
8
- register("create") { Array }
9
- end
10
-
11
- class Create < Trailblazer::Operation
12
- extend Trailblazer::Operation::Container
13
- end
14
-
15
- it "allows 2.2 call style" do
16
- Create.({}, my_container)["user_repository"].must_equal Object
17
- end
18
-
19
- it { Create.({}, {}, my_container)["user_repository"].must_equal Object }
20
- it { Create.({}, {}, my_container)["contract.create"].must_equal Array }
21
- # also allows our own options PLUS containers.
22
- it { Create.({}, {"model" => String}, my_container)["model"].must_equal String }
23
- it { Create.({}, {"model" => String}, my_container)["user_repository"].must_equal Object }
24
- it { Create.({}, {"user_repository" => Integer}, my_container)["user_repository"].must_equal Integer }
25
- end