axn 0.1.0.pre.alpha.2.2 → 0.1.0.pre.alpha.2.3

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
  SHA256:
3
- metadata.gz: dcfb310e364c4fb2c7159a6bdc1ff6766c0025b3b0741a62316d3e18cb5f3bf7
4
- data.tar.gz: 7af1c3d88a69c0d109983c85fb6dc1b5ddf162568ee1e1aa516f15bf1d12a1d2
3
+ metadata.gz: ac3f240b093cdf14fef16b5eb6993dbb8f6d49ba58c837245128a0efb3558f11
4
+ data.tar.gz: 40b631f49349b51811ebb0bbc60cbc7962a3f7d633bab1134b7b234b4f681123
5
5
  SHA512:
6
- metadata.gz: 13868e68f4a7b9a45bebbcf793bba1855ec2fa524ccd6f24fdaf1364bb143fcd4cfd862f0906d6455d10e61492b723ffbdc2c836a887052b030d509bf18171b0
7
- data.tar.gz: 53014437d7a3972ec584195b2c20955ff9f2c1138dba3eeb35df2e82db8d62ec3b3561ec6b1d870472fc7fcea79dd1c2abe759cf341c46e024ae143d266bfa64
6
+ metadata.gz: c8ac8be69e70d72d04b0c5be89e4ec198223c4a1771a15d254b82b0a204543c627a80321b3de95d69fa97a244fc56c9c39ca59262600c6b991c363603e0a7beb
7
+ data.tar.gz: 4eba5152626d0417ff3be725da9512034276d4b034898f8ad331890499196c1851a1d3dcd1cde880955c42f425090ab6c5fe30cac1496835013c7bd6cda52cdb
data/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Changelog
2
2
 
3
3
  ## UNRELEASED
4
+ * N/A
5
+
6
+ ## 0.1.0-alpha.2.3
7
+ * `expects` / `exposes`: Add `type: :uuid` special case validation
8
+ * [BUGFIX] Allow `hoist_errors` to pass the result through on success (allow access to subactions' exposures)
9
+ * [`Axn::Factory`] Support error_from + rescues
10
+ * `Action::Result.error` spec helper -- creation should NOT trigger global exception handler
11
+ * [CHANGE] `expects` / `exposes`: The `default` key, if a callable, should be evaluated in the _instance_'s context
4
12
 
5
13
  ## 0.1.0-alpha.2.2
6
14
  * Expands `Action::Result.ok` and `Action::Result.error` to better support mocking in specs
@@ -25,6 +25,7 @@ While we _support_ complex interface validations, in practice you usually just w
25
25
  In addition to the [standard ActiveModel validations](https://guides.rubyonrails.org/active_record_validations.html), we also support two additional custom validators:
26
26
  * `type: Foo` - fails unless the provided value `.is_a?(Foo)`
27
27
  * Edge case: use `type: :boolean` to handle a boolean field (since ruby doesn't have a Boolean class to pass in directly)
28
+ * Edge case: use `type: :uuid` to handle a confirming given string is a UUID (with or without `-` chars)
28
29
  * `validate: [callable]` - Support custom validations (fails if any string is returned OR if it raises an exception)
29
30
  * Example:
30
31
  ```ruby
@@ -103,7 +103,7 @@ module Action
103
103
  end
104
104
 
105
105
  def error(msg = nil, **exposures, &block)
106
- Axn::Factory.build(exposes: exposures.keys, messages: { error: msg }) do
106
+ Axn::Factory.build(exposes: exposures.keys, rescues: [-> { true }, msg]) do
107
107
  exposures.each do |key, value|
108
108
  expose(key, value)
109
109
  end
@@ -163,11 +163,12 @@ module Action
163
163
  hash[config.field] = config.default
164
164
  end.compact
165
165
 
166
- defaults_mapping.each do |field, default_value|
167
- unless @context.public_send(field)
168
- @context.public_send("#{field}=",
169
- default_value.respond_to?(:call) ? default_value.call : default_value)
170
- end
166
+ defaults_mapping.each do |field, default_value_getter|
167
+ next if @context.public_send(field).present?
168
+
169
+ default_value = default_value_getter.respond_to?(:call) ? instance_exec(&default_value_getter) : default_value_getter
170
+
171
+ @context.public_send("#{field}=", default_value)
171
172
  end
172
173
  end
173
174
 
@@ -54,6 +54,8 @@ module Action
54
54
  record.errors.add attribute, (options[:message] || msg) unless types.any? do |type|
55
55
  if type == :boolean
56
56
  [true, false].include?(value)
57
+ elsif type == :uuid
58
+ value.is_a?(String) && value.match?(/\A[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}\z/i)
57
59
  else
58
60
  value.is_a?(type)
59
61
  end
@@ -36,7 +36,9 @@ module Action
36
36
  "#hoist_errors is expected to wrap an Action call, but it returned a #{result.class.name} instead"
37
37
  end
38
38
 
39
- _handle_hoisted_errors(result, prefix:) unless result.ok?
39
+ return result if result.ok?
40
+
41
+ _handle_hoisted_errors(result, prefix:)
40
42
  end
41
43
 
42
44
  # Separate method to allow overriding in subclasses
data/lib/axn/factory.rb CHANGED
@@ -14,6 +14,10 @@ module Axn
14
14
  exposes: [],
15
15
  expects: [],
16
16
  messages: {},
17
+ error_from: {},
18
+ rescues: {},
19
+
20
+ # Hooks
17
21
  before: nil,
18
22
  after: nil,
19
23
  around: nil,
@@ -73,6 +77,9 @@ module Axn
73
77
 
74
78
  axn.messages(**messages) if messages.present? && messages.values.any?(&:present?)
75
79
 
80
+ axn.error_from(**_array_to_hash(error_from)) if error_from.present?
81
+ axn.rescues(**_array_to_hash(rescues)) if rescues.present?
82
+
76
83
  # Hooks
77
84
  axn.before(before) if before.present?
78
85
  axn.after(after) if after.present?
@@ -98,6 +105,12 @@ module Axn
98
105
 
99
106
  def _hash_with_default_array = Hash.new { |h, k| h[k] = [] }
100
107
 
108
+ def _array_to_hash(given)
109
+ return given if given.is_a?(Hash)
110
+
111
+ [given].to_h
112
+ end
113
+
101
114
  def _hydrate_hash(given)
102
115
  return given if given.is_a?(Hash)
103
116
 
data/lib/axn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Axn
4
- VERSION = "0.1.0-alpha.2.2"
4
+ VERSION = "0.1.0-alpha.2.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: axn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.alpha.2.2
4
+ version: 0.1.0.pre.alpha.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kali Donovan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-05-21 00:00:00.000000000 Z
11
+ date: 2025-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel