dry-mutations 1.3.6 → 1.5.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: cf6bbd4522768259ef715c8355d1df37d7a1b462
4
- data.tar.gz: 799202ecb31b42566979e4580fda145824b4e338
3
+ metadata.gz: 6ef61504d19fddc6238d0ecfc61a8a61da070075
4
+ data.tar.gz: d1edf21a714efcb004083cbd3e8e19e834517c05
5
5
  SHA512:
6
- metadata.gz: c7c4add8813f45de0fa29a66e81b880bc2c4d7718a631b4f49c50ddb355b9a99d5b57a45bf211d9312b92e0128ede6bd1b3018b4739361da44b6bb45cc581b4e
7
- data.tar.gz: 82648f98e4ac959de064884cfc26e84cacf6491f67ff1a7d40f64cc401b9be0c8d2ed40bd8f4f41a08933121643dbddbe1eba0df80d3f3e4a537a532b4ced6eb
6
+ metadata.gz: e75bc3759db8394d410bf62d0afee3c64f9061bdb81ef4a9ca90190ff2830ba7d7bb98ec98c39db85ee43719fbb62cd6a2a10b3d58e52600b2791273cb0bd5a4
7
+ data.tar.gz: e0ff36117ec61ff21a1c26fd247188325b93ecbf2fe0781dec2d8fd39591bbd7d2c1d094609b8b0175bb7dd24a16fe290be4f0802fda9c02d85b6805718189d5
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dry-mutations (1.3.6)
4
+ dry-mutations (1.5.0)
5
5
  activesupport (>= 3.2, < 5)
6
6
  dry-transaction (~> 0.9, < 0.10)
7
7
  dry-validation (~> 0.10)
@@ -8,12 +8,20 @@ module Dry
8
8
  fail ArgumentError, "Can not prepend #{self.class} to #{base.class}: base class must be a ::Mutations::Command descendant." unless base < ::Mutations::Command
9
9
  base.extend(DSL::Module) unless base.ancestors.include?(DSL::Module)
10
10
  base.extend(Module.new do
11
+ def exceptions_as_errors(value)
12
+ @exceptions_as_errors = value
13
+ end
14
+
15
+ def finalizers(outcome: nil, errors: nil)
16
+ @finalizers = { outcome: outcome, errors: errors }
17
+ end
18
+
11
19
  def call(*args)
12
- new(*args).call
20
+ new(*args).()
13
21
  end
14
22
 
15
23
  def to_proc
16
- ->(*args) { new(*args).call }
24
+ ->(*args) { new(*args) }
17
25
  end
18
26
 
19
27
  if base.name && !::Kernel.methods.include?(base_name = base.name.split('::').last.to_sym)
@@ -27,7 +35,7 @@ module Dry
27
35
 
28
36
  base.singleton_class.prepend(Module.new do
29
37
  def respond_to_missing?(method_name, include_private = false)
30
- %i|call to_proc|.include?(method_name) || super
38
+ %i|exceptions_as_errors finalizers call to_proc|.include?(method_name) || super
31
39
  end
32
40
  end)
33
41
  end
@@ -56,6 +64,8 @@ module Dry
56
64
 
57
65
  # Run a custom validation method if supplied:
58
66
  validate unless has_errors?
67
+
68
+ finalizer(:errors, @errors) if has_errors?
59
69
  end
60
70
 
61
71
  ########################################################################
@@ -96,10 +106,11 @@ module Dry
96
106
  end
97
107
 
98
108
  def execute
99
- super
109
+ super.tap { |outcome| finalizer(:outcome, outcome) }
100
110
  rescue => e
101
- add_error(:♻, :runtime_exception, e.message)
102
- raise e
111
+ add_error(:♻, :runtime_exception, "#{e.class.name}: #{e.message}")
112
+ finalizer(:errors, @errors)
113
+ raise e unless exceptions_as_errors?
103
114
  end
104
115
 
105
116
  def add_error(key, kind, message = nil, dry_message = nil)
@@ -123,20 +134,21 @@ module Dry
123
134
  end
124
135
 
125
136
  def messages
126
- @messages ||= yield_messages.uniq
137
+ @messages ||= yield_messages
127
138
  end
128
139
 
129
140
  private
130
141
 
131
- def yield_messages(flat = [], errors = @errors)
142
+ def yield_messages(flat = {}, errors = @errors)
132
143
  return flat unless errors
133
- errors = errors.values if errors.is_a?(Hash)
134
- errors.each_with_object(flat) do |error, acc|
135
- case error
136
- when Enumerable then yield_messages(acc, error)
137
- when ::Dry::Mutations::Errors::ErrorAtom then acc << error.dry_message
138
- when ::Mutations::ErrorAtom then acc << error.message
139
- end
144
+
145
+ errors.each_with_object([]) do |(key, msg), acc|
146
+ acc << [key, case msg
147
+ when Hash then yield_messages({}, msg)
148
+ when Array then msg.map(&:dry_message).join(', ')
149
+ when ::Dry::Mutations::Errors::ErrorAtom then msg.dry_message
150
+ when ::Mutations::ErrorAtom then msg.message
151
+ end].join(': ')
140
152
  end
141
153
  end
142
154
 
@@ -182,6 +194,21 @@ module Dry
182
194
  )
183
195
  end
184
196
 
197
+ def exceptions_as_errors?
198
+ eae = self.class.instance_variable_get :@exceptions_as_errors
199
+ eae.respond_to?(:call) ? eae.() : eae
200
+ end
201
+
202
+ def finalizer(type, outcome)
203
+ fin = self.class.instance_variable_get :@finalizers
204
+ # rubocop:disable Lint/AssignmentInCondition
205
+ return nil unless fin.is_a?(Hash) && finalizer = fin[type]
206
+ # rubocop:enable Lint/AssignmentInCondition
207
+ finalizer = method(finalizer) if finalizer.is_a?(Symbol)
208
+ return nil unless finalizer.respond_to?(:call)
209
+ finalizer.(outcome)
210
+ end
211
+
185
212
  def fix_accessors!
186
213
  schema.rules.keys.each do |method|
187
214
  next if respond_to?(name = method)
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Mutations
3
- VERSION = '1.3.6'.freeze
3
+ VERSION = '1.5.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-mutations
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.6
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksei Matiushkin