dry-mutations 1.3.6 → 1.5.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: 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