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 +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)
|