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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/dry/mutations/extensions/command.rb +42 -15
- data/lib/dry/mutations/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ef61504d19fddc6238d0ecfc61a8a61da070075
|
4
|
+
data.tar.gz: d1edf21a714efcb004083cbd3e8e19e834517c05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e75bc3759db8394d410bf62d0afee3c64f9061bdb81ef4a9ca90190ff2830ba7d7bb98ec98c39db85ee43719fbb62cd6a2a10b3d58e52600b2791273cb0bd5a4
|
7
|
+
data.tar.gz: e0ff36117ec61ff21a1c26fd247188325b93ecbf2fe0781dec2d8fd39591bbd7d2c1d094609b8b0175bb7dd24a16fe290be4f0802fda9c02d85b6805718189d5
|
data/Gemfile.lock
CHANGED
@@ -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).
|
20
|
+
new(*args).()
|
13
21
|
end
|
14
22
|
|
15
23
|
def to_proc
|
16
|
-
->(*args) { new(*args)
|
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
|
-
|
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
|
137
|
+
@messages ||= yield_messages
|
127
138
|
end
|
128
139
|
|
129
140
|
private
|
130
141
|
|
131
|
-
def yield_messages(flat =
|
142
|
+
def yield_messages(flat = {}, errors = @errors)
|
132
143
|
return flat unless errors
|
133
|
-
|
134
|
-
errors.each_with_object(
|
135
|
-
case
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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)
|