dry-transaction 0.8.0 → 0.9.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
  SHA1:
3
- metadata.gz: 469bb10618cdbe431bbeace9d17e4865551af4ea
4
- data.tar.gz: 876b92d26de8ddf5c97aedb1e01f1228c4faa435
3
+ metadata.gz: 19a5598d0c611fa9cd909c25cd76fccee443f925
4
+ data.tar.gz: f7dd7277b815393f51b7eb8cac00db2d8011ab83
5
5
  SHA512:
6
- metadata.gz: c63eb2b015d1c503e72deeca01b7a7fd4af28ad6b22d38c523d2c6d85babdb076001935ced8a69ecc68ee1d48a590bb3e9b4a28776e1b7fb14c983c6e4826193
7
- data.tar.gz: eba9fba94389262aac0b0a342fc3a36203c84160b54bd664f8952660be4772a58f83f32e1f66cf07d393ac15d6b1a1dcd7631e0ad973d2eb0c62b866acf586e7
6
+ metadata.gz: 3310c5583f9fc9c3d84dad54db9b71908227309e4325adc9f38d3a26aca64a699a66e75d0a3d05173beaf002d246fea7ed434300793ad1308bd6638fbb404505
7
+ data.tar.gz: 6dea0341d58c8da07a06bb1ec2fbb82ca793a47969f6f4acacf29dd445996910fdbcc9f096f0d286b4aabcef6343a946262f3b98197155059010294e3f9eb448
data/Gemfile CHANGED
@@ -3,11 +3,12 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  group :test do
6
- gem "codeclimate-test-reporter", require: nil
6
+ gem "simplecov"
7
+ gem "codeclimate-test-reporter"
7
8
  gem "byebug", platform: :mri
8
9
  end
9
10
 
10
11
  group :tools do
11
12
  gem "pry"
12
- gem "dry-container"
13
+ gem "rubocop"
13
14
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dry-transaction (0.8.0)
4
+ dry-transaction (0.9.0)
5
5
  dry-container (>= 0.2.8)
6
6
  dry-matcher (>= 0.5.0)
7
7
  dry-monads (>= 0.0.1)
@@ -10,27 +10,34 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
+ ast (2.3.0)
13
14
  byebug (8.2.2)
14
15
  codeclimate-test-reporter (0.5.0)
15
16
  simplecov (>= 0.7.1, < 1.0.0)
16
17
  coderay (1.1.1)
17
- concurrent-ruby (1.0.1)
18
+ concurrent-ruby (1.0.2)
18
19
  diff-lcs (1.2.5)
19
20
  docile (1.1.5)
20
- dry-configurable (0.1.4)
21
+ dry-configurable (0.4.0)
21
22
  concurrent-ruby (~> 1.0)
22
- dry-container (0.3.1)
23
+ dry-container (0.6.0)
23
24
  concurrent-ruby (~> 1.0)
24
25
  dry-configurable (~> 0.1, >= 0.1.3)
25
- dry-matcher (0.5.0)
26
- dry-monads (0.0.2)
26
+ dry-equalizer (0.2.0)
27
+ dry-matcher (0.6.0)
28
+ dry-monads (0.2.0)
29
+ dry-equalizer
27
30
  json (1.8.3)
28
31
  method_source (0.8.2)
32
+ parser (2.3.1.4)
33
+ ast (~> 2.2)
34
+ powerpack (0.1.1)
29
35
  pry (0.10.3)
30
36
  coderay (~> 1.1.0)
31
37
  method_source (~> 0.8.1)
32
38
  slop (~> 3.4)
33
- rake (10.4.2)
39
+ rainbow (2.1.0)
40
+ rake (11.2.2)
34
41
  rspec (3.3.0)
35
42
  rspec-core (~> 3.3.0)
36
43
  rspec-expectations (~> 3.3.0)
@@ -44,12 +51,20 @@ GEM
44
51
  diff-lcs (>= 1.2.0, < 2.0)
45
52
  rspec-support (~> 3.3.0)
46
53
  rspec-support (3.3.0)
54
+ rubocop (0.43.0)
55
+ parser (>= 2.3.1.1, < 3.0)
56
+ powerpack (~> 0.1)
57
+ rainbow (>= 1.99.1, < 3.0)
58
+ ruby-progressbar (~> 1.7)
59
+ unicode-display_width (~> 1.0, >= 1.0.1)
60
+ ruby-progressbar (1.8.1)
47
61
  simplecov (0.10.0)
48
62
  docile (~> 1.1.0)
49
63
  json (~> 1.8)
50
64
  simplecov-html (~> 0.10.0)
51
65
  simplecov-html (0.10.0)
52
66
  slop (3.6.0)
67
+ unicode-display_width (1.1.1)
53
68
  wisper (1.6.1)
54
69
  yard (0.8.7.6)
55
70
 
@@ -57,16 +72,16 @@ PLATFORMS
57
72
  ruby
58
73
 
59
74
  DEPENDENCIES
60
- bundler (~> 1.12.2)
75
+ bundler (~> 1.13.1)
61
76
  byebug
62
77
  codeclimate-test-reporter
63
- dry-container
64
78
  dry-transaction!
65
79
  pry
66
- rake (~> 10.4.2)
80
+ rake (~> 11.2.2)
67
81
  rspec (~> 3.3.0)
68
- simplecov (~> 0.10.0)
82
+ rubocop
83
+ simplecov
69
84
  yard
70
85
 
71
86
  BUNDLED WITH
72
- 1.12.3
87
+ 1.13.2
data/README.md CHANGED
@@ -13,11 +13,41 @@
13
13
 
14
14
  dry-transaction is a business transaction DSL. It provides a simple way to define a complex business transaction that includes processing by many different objects.
15
15
 
16
+ ## Installation
17
+
18
+ Add this line to your application's Gemfile:
19
+
20
+ ```ruby
21
+ gem 'dry-transaction'
22
+ ```
23
+
24
+ And then execute:
25
+
26
+ ```sh
27
+ $ bundle
28
+ ```
29
+
30
+ Or install it yourself as:
31
+
32
+ ```sh
33
+ $ gem install dry-transaction
34
+ ```
35
+
16
36
  ## Links
17
37
 
18
38
  * [Documentation](http://dry-rb.org/gems/dry-transaction)
19
39
  * [API documentation](http://www.rubydoc.info/github/dry-rb/dry-transaction)
20
40
 
41
+ ## Development
42
+
43
+ After checking out the repo, run `bundle install` to install dependencies. Then, run
44
+ `rake spec` to run the tests. You can also run `bin/console` for an interactive
45
+ prompt that will allow you to experiment.
46
+
47
+ ## Contributing
48
+
49
+ Bug reports and pull requests are welcome on GitHub at <https://github.com/dry-rb/dry-transaction>.
50
+
21
51
  ## License
22
52
 
23
53
  Copyright © 2015-2016 [Icelab](http://icelab.com.au/). dry-transaction is free software, and may be redistributed under the terms specified in the [license](LICENSE.md).
@@ -1,6 +1,7 @@
1
1
  require "dry/monads/either"
2
2
  require "dry/transaction/version"
3
3
  require "dry/transaction/dsl"
4
+ require "dry/transaction/api"
4
5
 
5
6
  module Dry
6
7
  # Define a business transaction.
@@ -10,10 +11,10 @@ module Dry
10
11
  #
11
12
  # The operations should be addressable via `#[]` in a container object that
12
13
  # you pass when creating the transaction. The operations must respond to
13
- # `#call(*args, input)`.
14
+ # `#call(input, *args)`.
14
15
  #
15
16
  # Each operation will be called in the order it was specified in your
16
- # transaction, with its output is passed as the input to the next operation.
17
+ # transaction, with its output passed as the input to the next operation.
17
18
  # Operations will only be called if the previous step was a success.
18
19
  #
19
20
  # A step is successful when it returns a [dry-monads](dry-monads) `Right` object
@@ -47,10 +48,32 @@ module Dry
47
48
  # @option options [#[]] :step_adapters (Dry::Transaction::StepAdapters) a custom container of step adapters
48
49
  # @option options [Dry::Matcher] :matcher (Dry::Transaction::ResultMatcher) a custom matcher object for result matching block API
49
50
  #
50
- # @return [Dry::Transaction::Sequence] the transaction object
51
+ # @return [Dry::Transaction] the transaction object
51
52
  #
52
53
  # @api public
53
54
  def self.Transaction(options = {}, &block)
54
55
  Transaction::DSL.new(options, &block).call
55
56
  end
57
+
58
+ # This is the class that actually stores the transaction.
59
+ # To be precise, it stores a series of steps that make up a transaction and
60
+ # a matcher for handling the result of the transaction.
61
+ #
62
+ # Never instantiate this class directly, it is intended to be created through
63
+ # the provided DSL.
64
+ class Transaction
65
+ include API
66
+
67
+ # @api private
68
+ attr_reader :steps
69
+
70
+ # @api private
71
+ attr_reader :matcher
72
+
73
+ # @api private
74
+ def initialize(steps, matcher)
75
+ @steps = steps
76
+ @matcher = matcher
77
+ end
78
+ end
56
79
  end
@@ -1,23 +1,8 @@
1
1
  require "dry/monads/either"
2
- require "dry/transaction/dsl"
3
2
 
4
3
  module Dry
5
- module Transaction
6
- class Sequence
7
- include Dry::Monads::Either::Mixin
8
-
9
- # @api private
10
- attr_reader :steps
11
-
12
- # @api private
13
- attr_reader :matcher
14
-
15
- # @api private
16
- def initialize(steps, matcher)
17
- @steps = steps
18
- @matcher = matcher
19
- end
20
-
4
+ class Transaction
5
+ module API
21
6
  # Run the transaction.
22
7
  #
23
8
  # Each operation will be called in the order it was specified, with its
@@ -52,14 +37,14 @@ module Dry
52
37
  assert_options_satisfy_step_arity(options)
53
38
 
54
39
  steps = steps_with_options_applied(options)
55
- result = steps.inject(Right(input), :bind)
40
+ result = steps.inject(Dry::Monads.Right(input), :bind)
56
41
 
57
42
  if block
58
43
  matcher.(result, &block)
59
44
  else
60
45
  result.or { |step_failure|
61
46
  # Unwrap the value from the StepFailure and return it directly
62
- Left(step_failure.value)
47
+ Dry::Monads.Left(step_failure.value)
63
48
  }
64
49
  end
65
50
  end
@@ -131,14 +116,14 @@ module Dry
131
116
  # step :another
132
117
  # end
133
118
  #
134
- # @param other [Dry::Transaction::Sequence] the transaction to prepend.
119
+ # @param other [Dry::Transaction] the transaction to prepend.
135
120
  # Optional if you will define a transaction inline via a block.
136
121
  # @param options [Hash] the options hash for defining a transaction inline
137
122
  # via a block. Optional if the transaction is passed directly as
138
123
  # `other`.
139
124
  # @option options [#[]] :container the operations container
140
125
  #
141
- # @return [Dry::Transaction::Sequence] the modified transaction object
126
+ # @return [Dry::Transaction] the modified transaction object
142
127
  #
143
128
  # @api public
144
129
  def prepend(other = nil, **options, &block)
@@ -172,14 +157,14 @@ module Dry
172
157
  # step :another
173
158
  # end
174
159
  #
175
- # @param other [Dry::Transaction::Sequence] the transaction to append.
160
+ # @param other [Dry::Transaction] the transaction to append.
176
161
  # Optional if you will define a transaction inline via a block.
177
162
  # @param options [Hash] the options hash for defining a transaction inline
178
163
  # via a block. Optional if the transaction is passed directly as
179
164
  # `other`.
180
165
  # @option options [#[]] :container the operations container
181
166
  #
182
- # @return [Dry::Transaction::Sequence] the modified transaction object
167
+ # @return [Dry::Transaction] the modified transaction object
183
168
  #
184
169
  # @api public
185
170
  def append(other = nil, **options, &block)
@@ -215,7 +200,7 @@ module Dry
215
200
  # step :another
216
201
  # end
217
202
  #
218
- # @param other [Dry::Transaction::Sequence] the transaction to append.
203
+ # @param other [Dry::Transaction] the transaction to append.
219
204
  # Optional if you will define a transaction inline via a block.
220
205
  # @param before [Symbol] the name of the step before which the
221
206
  # transaction should be inserted (provide either this or `after`)
@@ -226,17 +211,19 @@ module Dry
226
211
  # as `other`.
227
212
  # @option options [#[]] :container the operations container
228
213
  #
229
- # @return [Dry::Transaction::Sequence] the modified transaction object
214
+ # @return [Dry::Transaction] the modified transaction object
230
215
  #
231
216
  # @api public
232
217
  def insert(other = nil, before: nil, after: nil, **options, &block)
233
218
  insertion_step = before || after
234
- unless steps.map(&:step_name).include?(insertion_step)
219
+ match_insertion_step = proc { |step| step.step_name == insertion_step }
220
+
221
+ unless steps.any?(&match_insertion_step)
235
222
  raise ArgumentError, "+#{insertion_step}+ is not a valid step name"
236
223
  end
237
224
 
238
225
  other = accept_or_build_transaction(other, **options, &block)
239
- index = steps.index { |step| step.step_name == insertion_step } + (!!after ? 1 : 0)
226
+ index = steps.index(&match_insertion_step) + (after ? 1 : 0)
240
227
 
241
228
  self.class.new(steps.dup.insert(index, *other.steps), matcher)
242
229
  end
@@ -256,7 +243,7 @@ module Dry
256
243
  # @param step [Symbol] the names of a step to remove
257
244
  # @param ... [Symbol] more names of steps to remove
258
245
  #
259
- # @return [Dry::Transaction::Sequence] the modified transaction object
246
+ # @return [Dry::Transaction] the modified transaction object
260
247
  #
261
248
  # @api public
262
249
  def remove(*steps_to_remove)
@@ -265,14 +252,16 @@ module Dry
265
252
 
266
253
  private
267
254
 
255
+ # @param options [Hash] step arguments keyed by step name
268
256
  def assert_valid_options(options)
269
257
  options.each_key do |step_name|
270
- unless steps.map(&:step_name).include?(step_name)
258
+ unless steps.any? { |step| step.step_name == step_name }
271
259
  raise ArgumentError, "+#{step_name}+ is not a valid step name"
272
260
  end
273
261
  end
274
262
  end
275
263
 
264
+ # @param options [Hash] step arguments keyed by step name
276
265
  def assert_options_satisfy_step_arity(options)
277
266
  steps.each do |step|
278
267
  args_required = step.arity >= 0 ? step.arity : ~step.arity
@@ -284,6 +273,7 @@ module Dry
284
273
  end
285
274
  end
286
275
 
276
+ # @param options [Hash] step arguments keyed by step name
287
277
  def steps_with_options_applied(options)
288
278
  steps.map { |step|
289
279
  if (args = options[step.step_name])
@@ -299,7 +289,12 @@ module Dry
299
289
  raise ArgumentError, "a transaction must be provided or defined in a block"
300
290
  end
301
291
 
302
- other_transaction || DSL.new(**options, &block).call
292
+ if other_transaction
293
+ other_transaction
294
+ else
295
+ require "dry/transaction/dsl"
296
+ DSL.new(**options, &block).call
297
+ end
303
298
  end
304
299
  end
305
300
  end
@@ -1,10 +1,10 @@
1
1
  require "dry/transaction/result_matcher"
2
2
  require "dry/transaction/step"
3
3
  require "dry/transaction/step_adapters"
4
- require "dry/transaction/sequence"
4
+ require "dry/transaction/step_definition"
5
5
 
6
6
  module Dry
7
- module Transaction
7
+ class Transaction
8
8
  # @api private
9
9
  class DSL < BasicObject
10
10
  attr_reader :container
@@ -25,20 +25,27 @@ module Dry
25
25
  step_adapters.key?(method_name)
26
26
  end
27
27
 
28
- def method_missing(method_name, *args)
28
+ def method_missing(method_name, *args, &block)
29
29
  return super unless step_adapters.key?(method_name)
30
30
 
31
31
  step_adapter = step_adapters[method_name]
32
32
  step_name = args.first
33
33
  options = args.last.is_a?(::Hash) ? args.last : {}
34
- operation_name = options.delete(:with) || step_name
35
- operation = container[operation_name]
34
+ with = options.delete(:with)
36
35
 
37
- steps << Step.new(step_adapter, step_name, operation_name, operation, options)
36
+ if with.respond_to?(:call)
37
+ operation_name = step_name
38
+ operation = StepDefinition.new(container, &with)
39
+ else
40
+ operation_name = with || step_name
41
+ operation = container[operation_name]
42
+ end
43
+
44
+ steps << Step.new(step_adapter, step_name, operation_name, operation, options, &block)
38
45
  end
39
46
 
40
47
  def call
41
- Sequence.new(steps, matcher)
48
+ Transaction.new(steps, matcher)
42
49
  end
43
50
  end
44
51
  end
@@ -1,21 +1,21 @@
1
1
  require "dry-matcher"
2
2
 
3
3
  module Dry
4
- module Transaction
4
+ class Transaction
5
5
  ResultMatcher = Dry::Matcher.new(
6
6
  success: Dry::Matcher::Case.new(
7
7
  match: -> result { result.right? },
8
- resolve: -> result { result.value },
8
+ resolve: -> result { result.value }
9
9
  ),
10
10
  failure: Dry::Matcher::Case.new(
11
11
  match: -> result, step_name = nil {
12
12
  if step_name
13
- result.left? && result.value.step_name == step_name
13
+ result.left? && result.value.step.step_name == step_name
14
14
  else
15
15
  result.left?
16
16
  end
17
17
  },
18
- resolve: -> result { result.value.value },
18
+ resolve: -> result { result.value.value }
19
19
  )
20
20
  )
21
21
  end
@@ -1,8 +1,9 @@
1
+ require "dry/monads/either"
1
2
  require "wisper"
2
3
  require "dry/transaction/step_failure"
3
4
 
4
5
  module Dry
5
- module Transaction
6
+ class Transaction
6
7
  # @api private
7
8
  class Step
8
9
  include Wisper::Publisher
@@ -13,31 +14,33 @@ module Dry
13
14
  attr_reader :operation_name
14
15
  attr_reader :operation
15
16
  attr_reader :options
17
+ attr_reader :block
16
18
  attr_reader :call_args
17
19
 
18
- def initialize(step_adapter, step_name, operation_name, operation, options, call_args = [])
20
+ def initialize(step_adapter, step_name, operation_name, operation, options, call_args = [], &block)
19
21
  @step_adapter = step_adapter
20
22
  @step_name = step_name
21
23
  @operation_name = operation_name
22
24
  @operation = operation
23
25
  @options = options
26
+ @block = block
24
27
  @call_args = call_args
25
28
  end
26
29
 
27
30
  def with_call_args(*call_args)
28
- self.class.new(step_adapter, step_name, operation_name, operation, options, call_args)
31
+ self.class.new(step_adapter, step_name, operation_name, operation, options, call_args, &block)
29
32
  end
30
33
 
31
34
  def call(input)
32
- args = call_args + [input]
33
- result = step_adapter.call(self, *args)
35
+ args = [input] + call_args
36
+ result = step_adapter.call(self, *args, &block)
34
37
 
35
38
  result.fmap { |value|
36
39
  broadcast :"#{step_name}_success", value
37
40
  value
38
41
  }.or { |value|
39
42
  broadcast :"#{step_name}_failure", *args, value
40
- Left(StepFailure.new(step_name, value))
43
+ Left(StepFailure.new(self, value))
41
44
  }
42
45
  end
43
46
 
@@ -1,7 +1,7 @@
1
1
  require "dry-container"
2
2
 
3
3
  module Dry
4
- module Transaction
4
+ class Transaction
5
5
  class StepAdapters
6
6
  extend Dry::Container::Mixin
7
7
  end
@@ -1,12 +1,12 @@
1
1
  module Dry
2
- module Transaction
2
+ class Transaction
3
3
  class StepAdapters
4
4
  # @api private
5
5
  class Map
6
6
  include Dry::Monads::Either::Mixin
7
7
 
8
- def call(step, *args, input)
9
- Right(step.operation.call(*args, input))
8
+ def call(step, input, *args)
9
+ Right(step.operation.call(input, *args))
10
10
  end
11
11
  end
12
12
 
@@ -1,14 +1,14 @@
1
1
  require "dry/monads/either"
2
2
 
3
3
  module Dry
4
- module Transaction
4
+ class Transaction
5
5
  class StepAdapters
6
6
  # @api private
7
7
  class Raw
8
8
  include Dry::Monads::Either::Mixin
9
9
 
10
- def call(step, *args, input)
11
- result = step.operation.call(*args, input)
10
+ def call(step, input, *args)
11
+ result = step.operation.call(input, *args)
12
12
 
13
13
  unless result.is_a?(Dry::Monads::Either)
14
14
  raise ArgumentError, "step +#{step.step_name}+ must return an Either object"
@@ -1,12 +1,12 @@
1
1
  module Dry
2
- module Transaction
2
+ class Transaction
3
3
  class StepAdapters
4
4
  # @api private
5
5
  class Tee
6
6
  include Dry::Monads::Either::Mixin
7
7
 
8
- def call(step, *args, input)
9
- step.operation.call(*args, input)
8
+ def call(step, input, *args)
9
+ step.operation.call(input, *args)
10
10
  Right(input)
11
11
  end
12
12
  end
@@ -1,16 +1,16 @@
1
1
  module Dry
2
- module Transaction
2
+ class Transaction
3
3
  class StepAdapters
4
4
  # @api private
5
5
  class Try
6
6
  include Dry::Monads::Either::Mixin
7
7
 
8
- def call(step, *args, input)
8
+ def call(step, input, *args)
9
9
  unless step.options[:catch]
10
10
  raise ArgumentError, "+try+ steps require one or more exception classes provided via +catch:+"
11
11
  end
12
12
 
13
- Right(step.operation.call(*args, input))
13
+ Right(step.operation.call(input, *args))
14
14
  rescue *Array(step.options[:catch]) => e
15
15
  e = step.options[:raise].new(e.message) if step.options[:raise]
16
16
  Left(e)
@@ -0,0 +1,23 @@
1
+ module Dry
2
+ class Transaction
3
+ # @api private
4
+ class StepDefinition
5
+ include Dry::Monads::Either::Mixin
6
+
7
+ def initialize(container, &block)
8
+ @container = container
9
+ @block = block
10
+ freeze
11
+ end
12
+
13
+ def call(*args)
14
+ instance_exec(*args, &block)
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :block
20
+ attr_reader :container
21
+ end
22
+ end
23
+ end
@@ -1,11 +1,15 @@
1
1
  module Dry
2
- module Transaction
2
+ class Transaction
3
+ # A wrapper for storing together the step that failed
4
+ # and value describing the failure.
3
5
  class StepFailure
4
- attr_reader :step_name
6
+ attr_reader :step
5
7
  attr_reader :value
6
8
 
7
- def initialize(step_name, value)
8
- @step_name = step_name
9
+ # @param step [Step]
10
+ # @param value [Object]
11
+ def initialize(step, value)
12
+ @step = step
9
13
  @value = value
10
14
  end
11
15
  end
@@ -1,6 +1,6 @@
1
1
  module Dry
2
2
  # Business transaction DSL.
3
- module Transaction
4
- VERSION = "0.8.0".freeze
3
+ class Transaction
4
+ VERSION = "0.9.0".freeze
5
5
  end
6
6
  end
data/spec/examples.txt CHANGED
@@ -1,64 +1,77 @@
1
1
  example_id | status | run_time |
2
2
  -------------------------------------------------------- | ------ | --------------- |
3
- ./spec/integration/custom_matcher_spec.rb[1:1] | passed | 0.00028 seconds |
4
- ./spec/integration/custom_step_adapters_spec.rb[1:1] | passed | 0.00027 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 |
32
- ./spec/unit/sequence_spec.rb[1:1:4] | passed | 0.00015 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 |
38
- ./spec/unit/sequence_spec.rb[1:3: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 |
3
+ ./spec/integration/custom_matcher_spec.rb[1:1] | passed | 0.00027 seconds |
4
+ ./spec/integration/custom_step_adapters_spec.rb[1:1] | passed | 0.00042 seconds |
5
+ ./spec/integration/passing_step_arguments_spec.rb[1:1:1] | passed | 0.00105 seconds |
6
+ ./spec/integration/passing_step_arguments_spec.rb[1:2:1] | passed | 0.00122 seconds |
7
+ ./spec/integration/passing_step_arguments_spec.rb[1:3:1] | passed | 0.00018 seconds |
8
+ ./spec/integration/publishing_step_events_spec.rb[1:1:1] | passed | 0.00049 seconds |
9
+ ./spec/integration/publishing_step_events_spec.rb[1:1:2] | passed | 0.00135 seconds |
10
+ ./spec/integration/publishing_step_events_spec.rb[1:2:1] | passed | 0.0007 seconds |
11
+ ./spec/integration/publishing_step_events_spec.rb[1:2:2] | passed | 0.00051 seconds |
12
+ ./spec/integration/transaction_spec.rb[1:1:1] | passed | 0.00105 seconds |
13
+ ./spec/integration/transaction_spec.rb[1:1:2] | passed | 0.00022 seconds |
14
+ ./spec/integration/transaction_spec.rb[1:1:3] | passed | 0.00025 seconds |
15
+ ./spec/integration/transaction_spec.rb[1:1:4] | passed | 0.00034 seconds |
16
+ ./spec/integration/transaction_spec.rb[1:1:5] | passed | 0.00025 seconds |
17
+ ./spec/integration/transaction_spec.rb[1:2:1] | passed | 0.00023 seconds |
18
+ ./spec/integration/transaction_spec.rb[1:2:2] | passed | 0.00023 seconds |
19
+ ./spec/integration/transaction_spec.rb[1:2:3] | passed | 0.00023 seconds |
20
+ ./spec/integration/transaction_spec.rb[1:2:4] | passed | 0.00022 seconds |
21
+ ./spec/integration/transaction_spec.rb[1:2:5] | passed | 0.00028 seconds |
22
+ ./spec/integration/transaction_spec.rb[1:2:6] | passed | 0.00025 seconds |
23
+ ./spec/integration/transaction_spec.rb[1:3:1] | passed | 0.00021 seconds |
24
+ ./spec/integration/transaction_spec.rb[1:3:2] | passed | 0.00025 seconds |
25
+ ./spec/integration/transaction_spec.rb[1:3:3] | passed | 0.00021 seconds |
26
+ ./spec/integration/transaction_spec.rb[1:3:4] | passed | 0.00019 seconds |
27
+ ./spec/integration/transaction_spec.rb[1:3:5] | passed | 0.00023 seconds |
28
+ ./spec/integration/transaction_spec.rb[1:4:1] | passed | 0.00028 seconds |
29
+ ./spec/unit/step_adapters/map_spec.rb[1:1:1] | passed | 0.00009 seconds |
48
30
  ./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 |
31
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:1:1] | passed | 0.00015 seconds |
32
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:2:1] | passed | 0.00012 seconds |
33
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:2:2] | passed | 0.0001 seconds |
34
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:3:1] | passed | 0.00011 seconds |
35
+ ./spec/unit/step_adapters/raw_spec.rb[1:1:3:2] | passed | 0.0006 seconds |
36
+ ./spec/unit/step_adapters/tee_spec.rb[1:1:1] | passed | 0.00016 seconds |
37
+ ./spec/unit/step_adapters/tee_spec.rb[1:1:2] | passed | 0.00011 seconds |
38
+ ./spec/unit/step_adapters/try_spec.rb[1:1:1:1] | passed | 0.00018 seconds |
39
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:1:1] | passed | 0.00014 seconds |
58
40
  ./spec/unit/step_adapters/try_spec.rb[1:1:2:1:2] | passed | 0.00016 seconds |
59
41
  ./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 |
42
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:1:3:2] | passed | 0.00016 seconds |
43
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:1] | passed | 0.00013 seconds |
44
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:2] | passed | 0.00015 seconds |
45
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:3:1] | passed | 0.00014 seconds |
46
+ ./spec/unit/step_adapters/try_spec.rb[1:1:2:2:3:2] | passed | 0.00014 seconds |
47
+ ./spec/unit/step_definition_spec.rb[1:1] | passed | 0.00015 seconds |
48
+ ./spec/unit/step_definition_spec.rb[1:2:1] | passed | 0.00013 seconds |
49
+ ./spec/unit/step_definition_spec.rb[1:3:1] | passed | 0.00013 seconds |
50
+ ./spec/unit/step_definition_spec.rb[1:3:2] | passed | 0.00013 seconds |
51
+ ./spec/unit/step_spec.rb[1:1:1:1] | passed | 0.00017 seconds |
52
+ ./spec/unit/step_spec.rb[1:1:1:2] | passed | 0.00042 seconds |
53
+ ./spec/unit/step_spec.rb[1:1:2:1] | passed | 0.00144 seconds |
54
+ ./spec/unit/step_spec.rb[1:1:2:2] | passed | 0.00153 seconds |
55
+ ./spec/unit/step_spec.rb[1:1:2:3] | passed | 0.00641 seconds |
56
+ ./spec/unit/step_spec.rb[1:2:1:1] | passed | 0.00016 seconds |
57
+ ./spec/unit/step_spec.rb[1:2:2:1] | passed | 0.00013 seconds |
58
+ ./spec/unit/transaction_spec.rb[1:1:1] | passed | 0.00024 seconds |
59
+ ./spec/unit/transaction_spec.rb[1:1:2] | passed | 0.00019 seconds |
60
+ ./spec/unit/transaction_spec.rb[1:1:3] | passed | 0.00016 seconds |
61
+ ./spec/unit/transaction_spec.rb[1:1:4] | passed | 0.00019 seconds |
62
+ ./spec/unit/transaction_spec.rb[1:2:1] | passed | 0.00016 seconds |
63
+ ./spec/unit/transaction_spec.rb[1:2:2] | passed | 0.00018 seconds |
64
+ ./spec/unit/transaction_spec.rb[1:2:3] | passed | 0.00015 seconds |
65
+ ./spec/unit/transaction_spec.rb[1:2:4] | passed | 0.00016 seconds |
66
+ ./spec/unit/transaction_spec.rb[1:3:1] | passed | 0.00015 seconds |
67
+ ./spec/unit/transaction_spec.rb[1:3:2] | passed | 0.0002 seconds |
68
+ ./spec/unit/transaction_spec.rb[1:4:1] | passed | 0.00028 seconds |
69
+ ./spec/unit/transaction_spec.rb[1:4:2] | passed | 0.00019 seconds |
70
+ ./spec/unit/transaction_spec.rb[1:4:3] | passed | 0.00013 seconds |
71
+ ./spec/unit/transaction_spec.rb[1:4:4] | passed | 0.00014 seconds |
72
+ ./spec/unit/transaction_spec.rb[1:4:5:1] | passed | 0.00023 seconds |
73
+ ./spec/unit/transaction_spec.rb[1:4:5:2] | passed | 0.00018 seconds |
74
+ ./spec/unit/transaction_spec.rb[1:4:6:1] | passed | 0.0002 seconds |
75
+ ./spec/unit/transaction_spec.rb[1:4:6:2] | passed | 0.00022 seconds |
76
+ ./spec/unit/transaction_spec.rb[1:4:7:1] | passed | 0.00019 seconds |
77
+ ./spec/unit/transaction_spec.rb[1:4:7:2] | passed | 0.0002 seconds |
@@ -5,7 +5,7 @@ RSpec.describe "Custom matcher" do
5
5
  let(:transaction) {
6
6
  Dry.Transaction(container: container, matcher: Test::CustomMatcher) do
7
7
  step :process
8
- step :validate
8
+ step :validate, failure: :bad_value
9
9
  step :persist
10
10
  end
11
11
  }
@@ -29,7 +29,13 @@ RSpec.describe "Custom matcher" do
29
29
  resolve: -> result { result.value }
30
30
  ),
31
31
  nup: Dry::Matcher::Case.new(
32
- match: -> result { result.left? },
32
+ match: -> result, failure = nil {
33
+ if failure
34
+ result.left? && result.value.step.options[:failure] == failure
35
+ else
36
+ result.left?
37
+ end
38
+ },
33
39
  resolve: -> result { result.value.value }
34
40
  )
35
41
  )
@@ -39,7 +45,7 @@ RSpec.describe "Custom matcher" do
39
45
  it "supports a custom matcher" do
40
46
  matches = -> m {
41
47
  m.yep { |v| "Yep! #{v[:email]}" }
42
- m.nup { |v| "Nup. #{v.to_s}" }
48
+ m.nup(:bad_value) { |v| "Nup. #{v.to_s}" }
43
49
  }
44
50
 
45
51
  input = {"name" => "Jane", "email" => "jane@doe.com"}
@@ -23,8 +23,8 @@ RSpec.describe "Custom step adapters" do
23
23
  class CustomStepAdapters < Dry::Transaction::StepAdapters
24
24
  extend Dry::Monads::Either::Mixin
25
25
 
26
- register :enqueue, -> step, *args, input {
27
- Test::QUEUE << step.operation.call(*args, input)
26
+ register :enqueue, -> step, input, *args {
27
+ Test::QUEUE << step.operation.call(input, *args)
28
28
  Right(input)
29
29
  }
30
30
  end
@@ -12,7 +12,7 @@ RSpec.describe "Passing additional arguments to step operations" do
12
12
  let(:container) {
13
13
  {
14
14
  process: -> input { {name: input["name"], email: input["email"]} },
15
- validate: -> allowed, input { !input[:email].include?(allowed) ? raise(Test::NotValidError, "email not allowed") : input },
15
+ validate: -> input, allowed { !input[:email].include?(allowed) ? raise(Test::NotValidError, "email not allowed") : input },
16
16
  persist: -> input { Test::DB << input and true }
17
17
  }
18
18
  }
@@ -3,7 +3,13 @@ RSpec.describe "Transactions" do
3
3
  Dry.Transaction(container: container) do
4
4
  map :process
5
5
  step :verify
6
- try :validate, catch: Test::NotValidError
6
+ try :validate, with: -> input {
7
+ if input[:email].nil?
8
+ raise(container[:invalid_error], "email required")
9
+ else
10
+ input
11
+ end
12
+ }, catch: Test::NotValidError
7
13
  tee :persist
8
14
  end
9
15
  }
@@ -12,8 +18,8 @@ RSpec.describe "Transactions" do
12
18
  {
13
19
  process: -> input { {name: input["name"], email: input["email"]} },
14
20
  verify: -> input { Right(input) },
15
- validate: -> input { input[:email].nil? ? raise(Test::NotValidError, "email required") : input },
16
- persist: -> input { Test::DB << input and true }
21
+ persist: -> input { Test::DB << input and true },
22
+ invalid_error: Test::NotValidError
17
23
  }
18
24
  }
19
25
 
@@ -53,6 +59,8 @@ RSpec.describe "Transactions" do
53
59
  m.success do |value|
54
60
  results << "success for #{value[:email]}"
55
61
  end
62
+
63
+ m.failure { }
56
64
  end
57
65
 
58
66
  expect(results.first).to eq "success for jane@doe.com"
@@ -79,6 +87,8 @@ RSpec.describe "Transactions" do
79
87
  results = []
80
88
 
81
89
  transaction.call(input) do |m|
90
+ m.success { }
91
+
82
92
  m.failure do |value|
83
93
  results << "Failed: #{value}"
84
94
  end
@@ -91,6 +101,8 @@ RSpec.describe "Transactions" do
91
101
  results = []
92
102
 
93
103
  transaction.call(input) do |m|
104
+ m.success { }
105
+
94
106
  m.failure :validate do |value|
95
107
  results << "Validation failure: #{value}"
96
108
  end
@@ -103,6 +115,8 @@ RSpec.describe "Transactions" do
103
115
  results = []
104
116
 
105
117
  transaction.call(input) do |m|
118
+ m.success { }
119
+
106
120
  m.failure :some_other_step do |value|
107
121
  results << "Some other step failure"
108
122
  end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,6 @@
1
- if RUBY_ENGINE == "ruby"
2
- require "codeclimate-test-reporter"
3
- CodeClimate::TestReporter.start
4
-
1
+ if RUBY_ENGINE == "ruby" && RUBY_VERSION >= "2.3"
5
2
  require "simplecov"
6
- SimpleCov.start do
7
- add_filter "/spec/"
8
- end
3
+ SimpleCov.start
9
4
  end
10
5
 
11
6
  begin
@@ -0,0 +1,32 @@
1
+ RSpec.describe Dry::Transaction::StepDefinition do
2
+ let(:container) do
3
+ { test: -> input { "This is a test with input: #{input.inspect}" } }
4
+ end
5
+
6
+ let(:step_definition) do
7
+ Dry::Transaction::StepDefinition.new(container) do |input|
8
+ Right(container[:test].call(input))
9
+ end
10
+ end
11
+
12
+ it { expect(step_definition).to be_kind_of(Dry::Monads::Either::Mixin) }
13
+
14
+ describe '#initialize' do
15
+ subject! { step_definition }
16
+
17
+ it { is_expected.to be_frozen }
18
+ end
19
+
20
+ describe '#call' do
21
+ let(:input) { { test: 'test' } }
22
+
23
+ subject!(:result) { step_definition.call(input) }
24
+
25
+ it do
26
+ expect(result.value).to eq(
27
+ "This is a test with input: {:test=>\"test\"}"
28
+ )
29
+ end
30
+ it { is_expected.to be_a(Dry::Monads::Either::Right) }
31
+ end
32
+ end
@@ -0,0 +1,71 @@
1
+ RSpec.describe Dry::Transaction::Step do
2
+ let(:step_adapter) { ->(step, input, *args) { step.operation.call(input, *args) } }
3
+ let(:step_name) { :test }
4
+ let(:operation_name) { step_name }
5
+
6
+ subject(:step) { described_class.new(step_adapter, step_name, operation_name, operation, {}) }
7
+
8
+ describe "#call" do
9
+ let(:listener) do
10
+ Class.new do
11
+ def test_success(*args); end
12
+ alias_method :test_failure, :test_success
13
+ end.new
14
+ end
15
+
16
+ let(:input) { "input" }
17
+ subject { step.call(input) }
18
+
19
+ context "when operation succeeds" do
20
+ let(:operation) { proc { |input| Dry::Monads::Either::Right.new(input) } }
21
+
22
+ it { is_expected.to be_right }
23
+
24
+ it "publishes success" do
25
+ expect(listener).to receive(:test_success).with(input)
26
+ step.subscribe(listener)
27
+ subject
28
+ end
29
+ end
30
+
31
+ context "when operation fails" do
32
+ let(:operation) { proc { |input| Dry::Monads::Either::Left.new("error") } }
33
+
34
+ it { is_expected.to be_left }
35
+
36
+ it "wraps value in StepFailure" do
37
+ aggregate_failures do
38
+ expect(subject.value).to be_a Dry::Transaction::StepFailure
39
+ expect(subject.value.value).to eq "error"
40
+ end
41
+ end
42
+
43
+ it "publishes failure" do
44
+ expect(listener).to receive(:test_failure).with(input, "error")
45
+ step.subscribe(listener)
46
+ subject
47
+ end
48
+ end
49
+ end
50
+
51
+ describe "#arity" do
52
+ subject { step.arity }
53
+
54
+ context "when operation is a proc" do
55
+ let(:operation) { proc { |a, b| a + b } }
56
+ it { is_expected.to eq 2 }
57
+ end
58
+
59
+ context "when operation is an object with call method" do
60
+ let(:operation) do
61
+ Class.new do
62
+ def call(a, b, c)
63
+ a + b + c
64
+ end
65
+ end.new
66
+ end
67
+
68
+ it { is_expected.to eq 3 }
69
+ end
70
+ end
71
+ end
@@ -1,4 +1,4 @@
1
- RSpec.describe Dry::Transaction::Sequence do
1
+ RSpec.describe Dry::Transaction do
2
2
  subject(:container) {
3
3
  {
4
4
  upcase: -> input { input.upcase },
@@ -169,5 +169,41 @@ RSpec.describe Dry::Transaction::Sequence do
169
169
  expect(initial_transaction.call("hello world").right).to eq "DLROW OLLEH"
170
170
  end
171
171
  end
172
+
173
+ context "with code block explicitly passed to step" do
174
+ class WithBlockStepAdapters < ::Dry::Transaction::StepAdapters # :nodoc:
175
+ class WithBlock
176
+ include Dry::Monads::Either::Mixin
177
+ def call(step, input, *args, &cb)
178
+ Right(step.operation.((block_given? ? yield(input) : input), *args))
179
+ end
180
+ end
181
+ register :with_block, WithBlock.new
182
+ end
183
+ let!(:with_block_container) {
184
+ { exclaim_all: -> input { input.split(" ").map { |str| "#{str}!" }.join(" ") } }
185
+ }
186
+
187
+ let!(:no_block_transaction) {
188
+ Dry.Transaction(container: with_block_container, step_adapters: WithBlockStepAdapters) do
189
+ with_block :exclaim_all
190
+ end
191
+ }
192
+ let!(:with_block_transaction) {
193
+ Dry.Transaction(container: with_block_container, step_adapters: WithBlockStepAdapters) do
194
+ with_block :exclaim_all do |input|
195
+ input.gsub(/(?<=\s|\A)/, '¡')
196
+ end
197
+ end
198
+ }
199
+
200
+ it "inserts normal bangs without block given" do
201
+ expect(no_block_transaction.call("hello world").right).to eq "hello! world!"
202
+ end
203
+
204
+ it "inserts spanish bangs with block given" do
205
+ expect(with_block_transaction.call("hello world").right).to eq "¡hello! ¡world!"
206
+ end
207
+ end
172
208
  end
173
209
  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.8.0
4
+ version: 0.9.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-07-06 00:00:00.000000000 Z
11
+ date: 2016-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-container
@@ -72,28 +72,28 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 1.12.2
75
+ version: 1.13.1
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 1.12.2
82
+ version: 1.13.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 10.4.2
89
+ version: 11.2.2
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 10.4.2
96
+ version: 11.2.2
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rspec
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -150,15 +150,16 @@ files:
150
150
  - Rakefile
151
151
  - lib/dry-transaction.rb
152
152
  - lib/dry/transaction.rb
153
+ - lib/dry/transaction/api.rb
153
154
  - lib/dry/transaction/dsl.rb
154
155
  - lib/dry/transaction/result_matcher.rb
155
- - lib/dry/transaction/sequence.rb
156
156
  - lib/dry/transaction/step.rb
157
157
  - lib/dry/transaction/step_adapters.rb
158
158
  - lib/dry/transaction/step_adapters/map.rb
159
159
  - lib/dry/transaction/step_adapters/raw.rb
160
160
  - lib/dry/transaction/step_adapters/tee.rb
161
161
  - lib/dry/transaction/step_adapters/try.rb
162
+ - lib/dry/transaction/step_definition.rb
162
163
  - lib/dry/transaction/step_failure.rb
163
164
  - lib/dry/transaction/version.rb
164
165
  - spec/examples.txt
@@ -170,11 +171,13 @@ files:
170
171
  - spec/spec_helper.rb
171
172
  - spec/support/either_mixin.rb
172
173
  - spec/support/test_module_constants.rb
173
- - spec/unit/sequence_spec.rb
174
174
  - spec/unit/step_adapters/map_spec.rb
175
175
  - spec/unit/step_adapters/raw_spec.rb
176
176
  - spec/unit/step_adapters/tee_spec.rb
177
177
  - spec/unit/step_adapters/try_spec.rb
178
+ - spec/unit/step_definition_spec.rb
179
+ - spec/unit/step_spec.rb
180
+ - spec/unit/transaction_spec.rb
178
181
  homepage: https://github.com/dry-rb/dry-transaction
179
182
  licenses:
180
183
  - MIT