dry-transaction 0.7.0 → 0.8.0

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
  SHA1:
3
- metadata.gz: f3f3bd19cd953f553e0e0ab62bd1858d7c95be46
4
- data.tar.gz: badf643490370178f22c9bd35dc23c9213cb7433
3
+ metadata.gz: 469bb10618cdbe431bbeace9d17e4865551af4ea
4
+ data.tar.gz: 876b92d26de8ddf5c97aedb1e01f1228c4faa435
5
5
  SHA512:
6
- metadata.gz: 67cab2a4aec90b84bf79d5ae14fff6e82244bf1d2c743adfcfde3c9e328934f72131178fcee49c70c4bdc674600dfe60092d67a57dceeba5759a66caf10341f3
7
- data.tar.gz: c11ccbbca9e9adcc36a6b918490122f875b0d7fa97a3eebabcf5d8223d0166364b6ed0be2daa2b7574139c75560cd1978328c5190e4b7fb61aa5b8bdd6e7bd30
6
+ metadata.gz: c63eb2b015d1c503e72deeca01b7a7fd4af28ad6b22d38c523d2c6d85babdb076001935ced8a69ecc68ee1d48a590bb3e9b4a28776e1b7fb14c983c6e4826193
7
+ data.tar.gz: eba9fba94389262aac0b0a342fc3a36203c84160b54bd664f8952660be4772a58f83f32e1f66cf07d393ac15d6b1a1dcd7631e0ad973d2eb0c62b866acf586e7
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dry-transaction (0.7.0)
4
+ dry-transaction (0.8.0)
5
5
  dry-container (>= 0.2.8)
6
- dry-monads (~> 0.0.1)
6
+ dry-matcher (>= 0.5.0)
7
+ dry-monads (>= 0.0.1)
7
8
  wisper (>= 1.6.0)
8
9
 
9
10
  GEM
@@ -21,7 +22,8 @@ GEM
21
22
  dry-container (0.3.1)
22
23
  concurrent-ruby (~> 1.0)
23
24
  dry-configurable (~> 0.1, >= 0.1.3)
24
- dry-monads (0.0.1)
25
+ dry-matcher (0.5.0)
26
+ dry-monads (0.0.2)
25
27
  json (1.8.3)
26
28
  method_source (0.8.2)
27
29
  pry (0.10.3)
@@ -44,8 +44,10 @@ module Dry
44
44
  #
45
45
  # @param options [Hash] the options hash
46
46
  # @option options [#[]] :container the operations container
47
+ # @option options [#[]] :step_adapters (Dry::Transaction::StepAdapters) a custom container of step adapters
48
+ # @option options [Dry::Matcher] :matcher (Dry::Transaction::ResultMatcher) a custom matcher object for result matching block API
47
49
  #
48
- # @return [Dry::Transaction::Steps] the transaction object
50
+ # @return [Dry::Transaction::Sequence] the transaction object
49
51
  #
50
52
  # @api public
51
53
  def self.Transaction(options = {}, &block)
@@ -1,3 +1,4 @@
1
+ require "dry/transaction/result_matcher"
1
2
  require "dry/transaction/step"
2
3
  require "dry/transaction/step_adapters"
3
4
  require "dry/transaction/sequence"
@@ -9,11 +10,13 @@ module Dry
9
10
  attr_reader :container
10
11
  attr_reader :step_adapters
11
12
  attr_reader :steps
13
+ attr_reader :matcher
12
14
 
13
15
  def initialize(options, &block)
14
16
  @container = options.fetch(:container)
15
- @step_adapters = options.fetch(:step_adapters, StepAdapters)
17
+ @step_adapters = options.fetch(:step_adapters) { StepAdapters }
16
18
  @steps = []
19
+ @matcher = options.fetch(:matcher) { ResultMatcher }
17
20
 
18
21
  instance_eval(&block)
19
22
  end
@@ -35,7 +38,7 @@ module Dry
35
38
  end
36
39
 
37
40
  def call
38
- Sequence.new(steps)
41
+ Sequence.new(steps, matcher)
39
42
  end
40
43
  end
41
44
  end
@@ -1,30 +1,22 @@
1
+ require "dry-matcher"
2
+
1
3
  module Dry
2
4
  module Transaction
3
- class ResultMatcher
4
- attr_reader :result
5
- attr_reader :output
6
-
7
- def initialize(result)
8
- if result.respond_to?(:to_either)
9
- @result = result.to_either
10
- else
11
- @result = result
12
- end
13
- end
14
-
15
- def success(&block)
16
- return output unless result.right?
17
-
18
- @output = block.call(result.value)
19
- end
20
-
21
- def failure(step_name = nil, &block)
22
- return output unless result.left?
23
-
24
- if step_name.nil? || step_name == result.value.__step_name
25
- @output = block.call(result.value)
26
- end
27
- end
28
- end
5
+ ResultMatcher = Dry::Matcher.new(
6
+ success: Dry::Matcher::Case.new(
7
+ match: -> result { result.right? },
8
+ resolve: -> result { result.value },
9
+ ),
10
+ failure: Dry::Matcher::Case.new(
11
+ match: -> result, step_name = nil {
12
+ if step_name
13
+ result.left? && result.value.step_name == step_name
14
+ else
15
+ result.left?
16
+ end
17
+ },
18
+ resolve: -> result { result.value.value },
19
+ )
20
+ )
29
21
  end
30
22
  end
@@ -1,4 +1,5 @@
1
- require "dry/transaction/result_matcher"
1
+ require "dry/monads/either"
2
+ require "dry/transaction/dsl"
2
3
 
3
4
  module Dry
4
5
  module Transaction
@@ -9,8 +10,12 @@ module Dry
9
10
  attr_reader :steps
10
11
 
11
12
  # @api private
12
- def initialize(steps)
13
+ attr_reader :matcher
14
+
15
+ # @api private
16
+ def initialize(steps, matcher)
13
17
  @steps = steps
18
+ @matcher = matcher
14
19
  end
15
20
 
16
21
  # Run the transaction.
@@ -50,9 +55,12 @@ module Dry
50
55
  result = steps.inject(Right(input), :bind)
51
56
 
52
57
  if block
53
- block.call(ResultMatcher.new(result))
58
+ matcher.(result, &block)
54
59
  else
55
- result
60
+ result.or { |step_failure|
61
+ # Unwrap the value from the StepFailure and return it directly
62
+ Left(step_failure.value)
63
+ }
56
64
  end
57
65
  end
58
66
  alias_method :[], :call
@@ -136,7 +144,7 @@ module Dry
136
144
  def prepend(other = nil, **options, &block)
137
145
  other = accept_or_build_transaction(other, **options, &block)
138
146
 
139
- self.class.new(other.steps + steps)
147
+ self.class.new(other.steps + steps, matcher)
140
148
  end
141
149
 
142
150
  # Return a transaction with the steps from the provided transaction
@@ -177,7 +185,7 @@ module Dry
177
185
  def append(other = nil, **options, &block)
178
186
  other = accept_or_build_transaction(other, **options, &block)
179
187
 
180
- self.class.new(steps + other.steps)
188
+ self.class.new(steps + other.steps, matcher)
181
189
  end
182
190
 
183
191
  # Return a transaction with the steps from the provided transaction
@@ -230,7 +238,7 @@ module Dry
230
238
  other = accept_or_build_transaction(other, **options, &block)
231
239
  index = steps.index { |step| step.step_name == insertion_step } + (!!after ? 1 : 0)
232
240
 
233
- self.class.new(steps.dup.insert(index, *other.steps))
241
+ self.class.new(steps.dup.insert(index, *other.steps), matcher)
234
242
  end
235
243
 
236
244
  # @overload remove(step, ...)
@@ -252,7 +260,7 @@ module Dry
252
260
  #
253
261
  # @api public
254
262
  def remove(*steps_to_remove)
255
- self.class.new(steps.reject { |step| steps_to_remove.include?(step.step_name) })
263
+ self.class.new(steps.reject { |step| steps_to_remove.include?(step.step_name) }, matcher)
256
264
  end
257
265
 
258
266
  private
@@ -1,23 +1,12 @@
1
1
  module Dry
2
2
  module Transaction
3
- class StepFailure < BasicObject
4
- attr_reader :__step_name
3
+ class StepFailure
4
+ attr_reader :step_name
5
+ attr_reader :value
5
6
 
6
- def initialize(step_name, object)
7
- @__step_name = step_name
8
- @__object = object
9
- end
10
-
11
- def method_missing(name, *args, &block)
12
- @__object.public_send(name, *args, &block)
13
- end
14
-
15
- def respond_to_missing?(name, include_private = false)
16
- @__object.respond_to?(name, include_private)
17
- end
18
-
19
- def ==(other)
20
- @__object == other
7
+ def initialize(step_name, value)
8
+ @step_name = step_name
9
+ @value = value
21
10
  end
22
11
  end
23
12
  end
@@ -1,6 +1,6 @@
1
1
  module Dry
2
2
  # Business transaction DSL.
3
3
  module Transaction
4
- VERSION = "0.7.0".freeze
4
+ VERSION = "0.8.0".freeze
5
5
  end
6
6
  end
data/spec/examples.txt CHANGED
@@ -1,45 +1,64 @@
1
1
  example_id | status | run_time |
2
2
  -------------------------------------------------------- | ------ | --------------- |
3
+ ./spec/integration/custom_matcher_spec.rb[1:1] | passed | 0.00028 seconds |
3
4
  ./spec/integration/custom_step_adapters_spec.rb[1:1] | passed | 0.00027 seconds |
4
- ./spec/integration/passing_step_arguments_spec.rb[1:1:1] | passed | 0.00022 seconds |
5
- ./spec/integration/passing_step_arguments_spec.rb[1:2:1] | passed | 0.00017 seconds |
6
- ./spec/integration/passing_step_arguments_spec.rb[1:3:1] | passed | 0.00021 seconds |
7
- ./spec/integration/publishing_step_events_spec.rb[1:1:1] | passed | 0.00084 seconds |
8
- ./spec/integration/publishing_step_events_spec.rb[1:1:2] | passed | 0.00356 seconds |
9
- ./spec/integration/publishing_step_events_spec.rb[1:2:1] | passed | 0.00057 seconds |
10
- ./spec/integration/publishing_step_events_spec.rb[1:2:2] | passed | 0.0007 seconds |
11
- ./spec/integration/transaction_spec.rb[1:1:1] | passed | 0.00435 seconds |
12
- ./spec/integration/transaction_spec.rb[1:1:2] | passed | 0.00039 seconds |
13
- ./spec/integration/transaction_spec.rb[1:1:3] | passed | 0.0002 seconds |
14
- ./spec/integration/transaction_spec.rb[1:1:4] | passed | 0.00036 seconds |
15
- ./spec/integration/transaction_spec.rb[1:1:5] | passed | 0.00034 seconds |
16
- ./spec/integration/transaction_spec.rb[1:2:1] | passed | 0.00022 seconds |
17
- ./spec/integration/transaction_spec.rb[1:2:2] | passed | 0.00021 seconds |
18
- ./spec/integration/transaction_spec.rb[1:2:3] | passed | 0.0002 seconds |
19
- ./spec/integration/transaction_spec.rb[1:2:4] | passed | 0.0002 seconds |
20
- ./spec/integration/transaction_spec.rb[1:2:5] | passed | 0.00024 seconds |
21
- ./spec/integration/transaction_spec.rb[1:2:6] | passed | 0.00021 seconds |
22
- ./spec/integration/transaction_spec.rb[1:3:1] | passed | 0.00295 seconds |
23
- ./spec/integration/transaction_spec.rb[1:3:2] | passed | 0.00111 seconds |
24
- ./spec/integration/transaction_spec.rb[1:3:3] | passed | 0.00032 seconds |
25
- ./spec/integration/transaction_spec.rb[1:3:4] | passed | 0.00166 seconds |
26
- ./spec/integration/transaction_spec.rb[1:3:5] | passed | 0.00049 seconds |
27
- ./spec/integration/transaction_spec.rb[1:4:1] | passed | 0.00293 seconds |
28
- ./spec/unit/sequence_spec.rb[1:1:1] | passed | 0.00018 seconds |
29
- ./spec/unit/sequence_spec.rb[1:1:2] | passed | 0.0002 seconds |
30
- ./spec/unit/sequence_spec.rb[1:1:3] | passed | 0.00012 seconds |
5
+ ./spec/integration/passing_step_arguments_spec.rb[1:1:1] | passed | 0.00021 seconds |
6
+ ./spec/integration/passing_step_arguments_spec.rb[1:2:1] | passed | 0.0002 seconds |
7
+ ./spec/integration/passing_step_arguments_spec.rb[1:3:1] | passed | 0.00017 seconds |
8
+ ./spec/integration/publishing_step_events_spec.rb[1:1:1] | passed | 0.00046 seconds |
9
+ ./spec/integration/publishing_step_events_spec.rb[1:1:2] | passed | 0.00043 seconds |
10
+ ./spec/integration/publishing_step_events_spec.rb[1:2:1] | passed | 0.00043 seconds |
11
+ ./spec/integration/publishing_step_events_spec.rb[1:2:2] | passed | 0.00178 seconds |
12
+ ./spec/integration/transaction_spec.rb[1:1:1] | passed | 0.00152 seconds |
13
+ ./spec/integration/transaction_spec.rb[1:1:2] | passed | 0.00023 seconds |
14
+ ./spec/integration/transaction_spec.rb[1:1:3] | passed | 0.00022 seconds |
15
+ ./spec/integration/transaction_spec.rb[1:1:4] | passed | 0.0003 seconds |
16
+ ./spec/integration/transaction_spec.rb[1:1:5] | passed | 0.00021 seconds |
17
+ ./spec/integration/transaction_spec.rb[1:2:1] | passed | 0.00258 seconds |
18
+ ./spec/integration/transaction_spec.rb[1:2:2] | passed | 0.00033 seconds |
19
+ ./spec/integration/transaction_spec.rb[1:2:3] | passed | 0.00043 seconds |
20
+ ./spec/integration/transaction_spec.rb[1:2:4] | passed | 0.00026 seconds |
21
+ ./spec/integration/transaction_spec.rb[1:2:5] | passed | 0.00114 seconds |
22
+ ./spec/integration/transaction_spec.rb[1:2:6] | passed | 0.00028 seconds |
23
+ ./spec/integration/transaction_spec.rb[1:3:1] | passed | 0.00185 seconds |
24
+ ./spec/integration/transaction_spec.rb[1:3:2] | passed | 0.00028 seconds |
25
+ ./spec/integration/transaction_spec.rb[1:3:3] | passed | 0.00019 seconds |
26
+ ./spec/integration/transaction_spec.rb[1:3:4] | passed | 0.00038 seconds |
27
+ ./spec/integration/transaction_spec.rb[1:3:5] | passed | 0.00025 seconds |
28
+ ./spec/integration/transaction_spec.rb[1:4:1] | passed | 0.00026 seconds |
29
+ ./spec/unit/sequence_spec.rb[1:1:1] | passed | 0.00019 seconds |
30
+ ./spec/unit/sequence_spec.rb[1:1:2] | passed | 0.00016 seconds |
31
+ ./spec/unit/sequence_spec.rb[1:1:3] | passed | 0.00013 seconds |
31
32
  ./spec/unit/sequence_spec.rb[1:1:4] | passed | 0.00015 seconds |
32
- ./spec/unit/sequence_spec.rb[1:2:1] | passed | 0.00016 seconds |
33
- ./spec/unit/sequence_spec.rb[1:2:2] | passed | 0.0002 seconds |
34
- ./spec/unit/sequence_spec.rb[1:2:3] | passed | 0.00013 seconds |
35
- ./spec/unit/sequence_spec.rb[1:2:4] | passed | 0.00015 seconds |
36
- ./spec/unit/sequence_spec.rb[1:3:1] | passed | 0.00014 seconds |
33
+ ./spec/unit/sequence_spec.rb[1:2:1] | passed | 0.00018 seconds |
34
+ ./spec/unit/sequence_spec.rb[1:2:2] | passed | 0.00016 seconds |
35
+ ./spec/unit/sequence_spec.rb[1:2:3] | passed | 0.00015 seconds |
36
+ ./spec/unit/sequence_spec.rb[1:2:4] | passed | 0.0002 seconds |
37
+ ./spec/unit/sequence_spec.rb[1:3:1] | passed | 0.00017 seconds |
37
38
  ./spec/unit/sequence_spec.rb[1:3:2] | passed | 0.00017 seconds |
38
- ./spec/unit/sequence_spec.rb[1:4:1] | passed | 0.0002 seconds |
39
- ./spec/unit/sequence_spec.rb[1:4:2] | passed | 0.00021 seconds |
40
- ./spec/unit/sequence_spec.rb[1:4:3] | passed | 0.00015 seconds |
41
- ./spec/unit/sequence_spec.rb[1:4:4] | passed | 0.00013 seconds |
42
- ./spec/unit/sequence_spec.rb[1:4:5:1] | passed | 0.00022 seconds |
43
- ./spec/unit/sequence_spec.rb[1:4:5:2] | passed | 0.00018 seconds |
44
- ./spec/unit/sequence_spec.rb[1:4:6:1] | passed | 0.0002 seconds |
45
- ./spec/unit/sequence_spec.rb[1:4:6:2] | passed | 0.00017 seconds |
39
+ ./spec/unit/sequence_spec.rb[1:4:1] | passed | 0.00022 seconds |
40
+ ./spec/unit/sequence_spec.rb[1:4:2] | passed | 0.00019 seconds |
41
+ ./spec/unit/sequence_spec.rb[1:4:3] | passed | 0.00013 seconds |
42
+ ./spec/unit/sequence_spec.rb[1:4:4] | passed | 0.00014 seconds |
43
+ ./spec/unit/sequence_spec.rb[1:4:5:1] | passed | 0.0002 seconds |
44
+ ./spec/unit/sequence_spec.rb[1:4:5:2] | passed | 0.0002 seconds |
45
+ ./spec/unit/sequence_spec.rb[1:4:6:1] | passed | 0.00022 seconds |
46
+ ./spec/unit/sequence_spec.rb[1:4:6:2] | passed | 0.00018 seconds |
47
+ ./spec/unit/step_adapters/map_spec.rb[1:1:1] | passed | 0.00011 seconds |
48
+ ./spec/unit/step_adapters/map_spec.rb[1:1:2] | passed | 0.0001 seconds |
49
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:1:1] | passed | 0.00153 seconds |
50
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:2:1] | passed | 0.00011 seconds |
51
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:2:2] | passed | 0.00015 seconds |
52
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:3:1] | passed | 0.00096 seconds |
53
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:3:2] | passed | 0.00092 seconds |
54
+ ./spec/unit/step_adapters/tee_spec.rb[1:1:1] | passed | 0.00009 seconds |
55
+ ./spec/unit/step_adapters/tee_spec.rb[1:1:2] | passed | 0.00015 seconds |
56
+ ./spec/unit/step_adapters/try_spec.rb[1:1:1:1] | passed | 0.00015 seconds |
57
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:1:1] | passed | 0.00012 seconds |
58
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:1:2] | passed | 0.00016 seconds |
59
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:1:3:1] | passed | 0.00015 seconds |
60
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:1:3:2] | passed | 0.00014 seconds |
61
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:1] | passed | 0.00012 seconds |
62
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:2] | passed | 0.00011 seconds |
63
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:3:1] | passed | 0.00012 seconds |
64
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:3:2] | passed | 0.00012 seconds |
@@ -0,0 +1,53 @@
1
+ require "dry-matcher"
2
+ require "dry-monads"
3
+
4
+ RSpec.describe "Custom matcher" do
5
+ let(:transaction) {
6
+ Dry.Transaction(container: container, matcher: Test::CustomMatcher) do
7
+ step :process
8
+ step :validate
9
+ step :persist
10
+ end
11
+ }
12
+
13
+ let(:container) {
14
+ {
15
+ process: -> input { Dry::Monads.Right(name: input["name"], email: input["email"]) },
16
+ validate: -> input { input[:email].nil? ? Dry::Monads.Left(:email_required) : Dry::Monads.Right(input) },
17
+ persist: -> input { Test::DB << input and Dry::Monads.Right(input) }
18
+ }
19
+ }
20
+
21
+ before do
22
+ Test::DB = []
23
+ Test::QUEUE = []
24
+
25
+ module Test
26
+ CustomMatcher = Dry::Matcher.new(
27
+ yep: Dry::Matcher::Case.new(
28
+ match: -> result { result.right? },
29
+ resolve: -> result { result.value }
30
+ ),
31
+ nup: Dry::Matcher::Case.new(
32
+ match: -> result { result.left? },
33
+ resolve: -> result { result.value.value }
34
+ )
35
+ )
36
+ end
37
+ end
38
+
39
+ it "supports a custom matcher" do
40
+ matches = -> m {
41
+ m.yep { |v| "Yep! #{v[:email]}" }
42
+ m.nup { |v| "Nup. #{v.to_s}" }
43
+ }
44
+
45
+ input = {"name" => "Jane", "email" => "jane@doe.com"}
46
+ result = transaction.(input, &matches)
47
+ expect(result).to eq "Yep! jane@doe.com"
48
+
49
+ input = {"name" => "Jane"}
50
+ result = transaction.(input, &matches)
51
+ expect(result).to eq "Nup. email_required"
52
+ end
53
+ end
data/spec/spec_helper.rb CHANGED
@@ -8,6 +8,10 @@ if RUBY_ENGINE == "ruby"
8
8
  end
9
9
  end
10
10
 
11
+ begin
12
+ require "byebug"
13
+ rescue LoadError; end
14
+
11
15
  require "dry-transaction"
12
16
 
13
17
  # Requires supporting ruby files with custom matchers and macros, etc, in
@@ -0,0 +1,23 @@
1
+ RSpec.describe Dry::Transaction::StepAdapters::Map do
2
+
3
+ subject { described_class.new }
4
+
5
+ let(:operation) {
6
+ -> (input) { input.upcase }
7
+ }
8
+
9
+ let(:step) {
10
+ Dry::Transaction::Step.new(subject, :step, :step, operation, {})
11
+ }
12
+
13
+ describe "#call" do
14
+
15
+ it "return a Right Monad" do
16
+ expect(subject.call(step, 'input')).to be_a Dry::Monads::Either::Right
17
+ end
18
+
19
+ it "return the result of the operation as output" do
20
+ expect(subject.call(step, 'input').value).to eql 'INPUT'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,52 @@
1
+ RSpec.describe Dry::Transaction::StepAdapters::Raw do
2
+
3
+ subject { described_class.new }
4
+
5
+ let(:operation) {
6
+ -> (input) { input.upcase }
7
+ }
8
+
9
+ let(:step) {
10
+ Dry::Transaction::Step.new(subject, :step, :step, operation, {})
11
+ }
12
+
13
+ describe "#call" do
14
+
15
+ context "when the result of the operation is NOT a Dry::Monads::Either" do
16
+
17
+ it "raises an ArgumentError" do
18
+ expect do
19
+ subject.call(step, 'input')
20
+ end.to raise_error(ArgumentError)
21
+ end
22
+ end
23
+
24
+ context "when the result of the operation is a Left Monad" do
25
+ let(:operation) {
26
+ -> (input) { Left(input.upcase) }
27
+ }
28
+
29
+ it "return a Left Monad" do
30
+ expect(subject.call(step, 'input')).to be_a Dry::Monads::Either::Left
31
+ end
32
+
33
+ it "return the result of the operation as output" do
34
+ expect(subject.call(step, 'input').value).to eql 'INPUT'
35
+ end
36
+ end
37
+
38
+ context "when the result of the operation is a Right Monad" do
39
+ let(:operation) {
40
+ -> (input) { Right(input.upcase) }
41
+ }
42
+
43
+ it "return a Right Monad" do
44
+ expect(subject.call(step, 'input')).to be_a Dry::Monads::Either::Right
45
+ end
46
+
47
+ it "return the result of the operation as output" do
48
+ expect(subject.call(step, 'input').value).to eql 'INPUT'
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,23 @@
1
+ RSpec.describe Dry::Transaction::StepAdapters::Tee do
2
+
3
+ subject { described_class.new }
4
+
5
+ let(:operation) {
6
+ -> (input) { input.upcase }
7
+ }
8
+
9
+ let(:step) {
10
+ Dry::Transaction::Step.new(subject, :step, :step, operation, {})
11
+ }
12
+
13
+ describe "#call" do
14
+
15
+ it "return a Right Monad" do
16
+ expect(subject.call(step, 'input')).to be_a Dry::Monads::Either::Right
17
+ end
18
+
19
+ it "return the original input as output" do
20
+ expect(subject.call(step, 'input').value).to eql 'input'
21
+ end
22
+ end
23
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-transaction
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Riley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-05 00:00:00.000000000 Z
11
+ date: 2016-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-container
@@ -24,18 +24,32 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.8
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-matcher
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.5.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.5.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: dry-monads
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - "~>"
45
+ - - ">="
32
46
  - !ruby/object:Gem::Version
33
47
  version: 0.0.1
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - "~>"
52
+ - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: 0.0.1
41
55
  - !ruby/object:Gem::Dependency
@@ -148,6 +162,7 @@ files:
148
162
  - lib/dry/transaction/step_failure.rb
149
163
  - lib/dry/transaction/version.rb
150
164
  - spec/examples.txt
165
+ - spec/integration/custom_matcher_spec.rb
151
166
  - spec/integration/custom_step_adapters_spec.rb
152
167
  - spec/integration/passing_step_arguments_spec.rb
153
168
  - spec/integration/publishing_step_events_spec.rb
@@ -156,6 +171,9 @@ files:
156
171
  - spec/support/either_mixin.rb
157
172
  - spec/support/test_module_constants.rb
158
173
  - spec/unit/sequence_spec.rb
174
+ - spec/unit/step_adapters/map_spec.rb
175
+ - spec/unit/step_adapters/raw_spec.rb
176
+ - spec/unit/step_adapters/tee_spec.rb
159
177
  - spec/unit/step_adapters/try_spec.rb
160
178
  homepage: https://github.com/dry-rb/dry-transaction
161
179
  licenses:
@@ -169,7 +187,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
169
187
  requirements:
170
188
  - - ">="
171
189
  - !ruby/object:Gem::Version
172
- version: 2.0.0
190
+ version: 2.1.0
173
191
  required_rubygems_version: !ruby/object:Gem::Requirement
174
192
  requirements:
175
193
  - - ">="