u-case 5.1.0 → 5.2.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
  SHA256:
3
- metadata.gz: a1270d6bb85374361d86582de966908d7e876a108ebb91bad69bd27f451c6885
4
- data.tar.gz: b947c931285820d04082e97a41936d65a8f3c4a50da49d54afc304b23dae67ba
3
+ metadata.gz: 2c0d84e916ac431f822d767a3485ce0a6ec9db47bba8b9b6cbc914ec72ec18da
4
+ data.tar.gz: b272186504907f0f2e88fe3fd19c241a7135bfa191a621a55ae912c95f680b57
5
5
  SHA512:
6
- metadata.gz: bc81c0fb34d2f300768b010aeb0357e8007ced4aac12a4443878179c4f68d333cb8d0c0ccbcac04e9f1101d318569c913880f5f11fb2e3ff48f9b9362d73aebf
7
- data.tar.gz: 9fa4f08d80d2f89f0622ef76553d148a6ea5a2aebdf29019db4e92932ad986d17a6098533c30e5089cd8b3dc6b703118a9a08e507a15b8a24e67cc06c699e524
6
+ metadata.gz: ee96e3cc845c753481a94e394b496b8a923c0a15d220713c610dbb77046d4f79f434291f31cc5b8e88fa16d55dba12db11953d1553b0a8aa284277aa4558512a
7
+ data.tar.gz: 4edb2ce9cb98319bab947ebfb9166518eaeca467d68198e5b3ac4a258ac907b16e1eb8c44ffd991140dddf863e4a821a146c29ef007139ad8c2e666732630fce
data/Gemfile CHANGED
@@ -9,6 +9,8 @@ gem "rake", "~> 13.0"
9
9
 
10
10
  group :test do
11
11
  gem "simplecov", "~> 0.22.0", require: false
12
+ gem "minitest", (RUBY_VERSION >= "4.0") ? "~> 6.0" : "~> 5.27" if RUBY_VERSION >= "3.1"
13
+ gem "ostruct", "~> 0.6.3" if RUBY_VERSION >= "3.5"
12
14
  end
13
15
 
14
16
  group :development, :test do
data/README.md CHANGED
@@ -27,7 +27,7 @@ The main project goals are:
27
27
  Version | Documentation
28
28
  --------- | -------------
29
29
  unreleased| https://github.com/serradura/u-case/blob/main/README.md
30
- 5.1.0 | https://github.com/serradura/u-case/blob/v5.x/README.md
30
+ 5.2.0 | https://github.com/serradura/u-case/blob/v5.x/README.md
31
31
  4.5.1 | https://github.com/serradura/u-case/blob/v4.x/README.md
32
32
 
33
33
  > **Note:** Você entende português? 🇧🇷 🇵🇹 Verifique o [README traduzido em pt-BR](https://github.com/serradura/u-case/blob/main/README.pt-BR.md).
@@ -60,6 +60,7 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
60
60
  - [`Micro::Case::Safe` - Is there some feature to auto handle exceptions inside of a use case or flow?](#microcasesafe---is-there-some-feature-to-auto-handle-exceptions-inside-of-a-use-case-or-flow)
61
61
  - [`Micro::Cases::Safe::Flow`](#microcasessafeflow)
62
62
  - [`Micro::Case::Result#on_exception`](#microcaseresulton_exception)
63
+ - [Validating attributes with `accept:` / `reject:`](#validating-attributes-with-accept--reject)
63
64
  - [`u-case/with_activemodel_validation` - How to validate the use case attributes?](#u-casewith_activemodel_validation---how-to-validate-the-use-case-attributes)
64
65
  - [If I enabled the auto validation, is it possible to disable it only in specific use cases?](#if-i-enabled-the-auto-validation-is-it-possible-to-disable-it-only-in-specific-use-cases)
65
66
  - [`Kind::Validator`](#kindvalidator)
@@ -87,7 +88,8 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
87
88
 
88
89
  | u-case | branch | ruby | activemodel | u-attributes |
89
90
  | ---------------- | ------ | -------- | -------------- | -------------- |
90
- | unreleased | main | >= 2.7 | >= 6.0 | >= 2.7, < 4.0 |
91
+ | unreleased | main | >= 2.7 | >= 6.0 | >= 2.8, < 4.0 |
92
+ | 5.2.0 | v5.x | >= 2.7 | >= 6.0 | >= 2.8, < 4.0 |
91
93
  | 5.1.0 | v5.x | >= 2.7 | >= 6.0 | >= 2.7, < 4.0 |
92
94
  | 4.5.1 | v4.x | >= 2.2.0 | >= 3.2, <= 8.1 | >= 2.7, < 3.0 |
93
95
 
@@ -1068,6 +1070,43 @@ As you can see, this hook has the same behavior of `result.on_failure(:exception
1068
1070
 
1069
1071
  [⬆️ Back to Top](#table-of-contents-)
1070
1072
 
1073
+ ### Validating attributes with `accept:` / `reject:`
1074
+
1075
+ Since `u-case 5.2.0`, every use case includes the [`accept` extension](https://github.com/serradura/u-attributes#accept-extension) from [`u-attributes`](https://github.com/serradura/u-attributes) (requires `u-attributes >= 2.8`). You can declare type expectations (or any other check) directly on the attribute, and the use case will fail automatically with the `:invalid_attributes` type when any attribute is rejected — no need to validate inside `call!`.
1076
+
1077
+ ```ruby
1078
+ class CreateUser < Micro::Case
1079
+ attribute :name, accept: String
1080
+ attribute :email, accept: ->(value) { value.is_a?(String) && value.include?('@') }
1081
+ attribute :age, accept: Integer, allow_nil: true
1082
+
1083
+ def call!
1084
+ Success result: { user: User.create!(attributes) }
1085
+ end
1086
+ end
1087
+
1088
+ CreateUser.call(name: 'Bob', email: 'bob@example.com')
1089
+ # => #<Success type=:ok ...>
1090
+
1091
+ CreateUser.call(name: 42, email: 'not-an-email')
1092
+ # => #<Failure type=:invalid_attributes data={
1093
+ # errors: {
1094
+ # "name" => "expected to be a kind of String",
1095
+ # "email" => "is invalid"
1096
+ # }
1097
+ # }>
1098
+ ```
1099
+
1100
+ The failure type follows the same setting used by the ActiveModel validation integration — see [`Micro::Case.config`](#microcaseconfig) and `set_activemodel_validation_errors_failure`.
1101
+
1102
+ When combined with [`u-case/with_activemodel_validation`](#u-casewith_activemodel_validation---how-to-validate-the-use-case-attributes), the execution order is:
1103
+
1104
+ 1. `u-attributes` resolves the default value of each attribute.
1105
+ 2. `u-attributes` runs the `accept:` / `reject:` checks.
1106
+ 3. `u-case` runs the `ActiveModel` validations **only if** every attribute was accepted.
1107
+
1108
+ [⬆️ Back to Top](#table-of-contents-)
1109
+
1071
1110
  ### `u-case/with_activemodel_validation` - How to validate the use case attributes?
1072
1111
 
1073
1112
  **Requirement:**
data/README.pt-BR.md CHANGED
@@ -27,7 +27,7 @@ Principais objetivos deste projeto:
27
27
  Versão | Documentação
28
28
  --------- | -------------
29
29
  unreleased| https://github.com/serradura/u-case/blob/main/README.md
30
- 5.1.0 | https://github.com/serradura/u-case/blob/v5.x/README.md
30
+ 5.2.0 | https://github.com/serradura/u-case/blob/v5.x/README.md
31
31
  4.5.1 | https://github.com/serradura/u-case/blob/v4.x/README.md
32
32
 
33
33
  ## Índice <!-- omit in toc -->
@@ -58,6 +58,7 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
58
58
  - [`Micro::Case::Safe` - Existe algum recurso para lidar automaticamente com exceções dentro de um caso de uso ou fluxo?](#microcasesafe---existe-algum-recurso-para-lidar-automaticamente-com-exceções-dentro-de-um-caso-de-uso-ou-fluxo)
59
59
  - [`Micro::Cases::Safe::Flow`](#microcasessafeflow)
60
60
  - [`Micro::Case::Result#on_exception`](#microcaseresulton_exception)
61
+ - [Validando atributos com `accept:` / `reject:`](#validando-atributos-com-accept--reject)
61
62
  - [`u-case/with_activemodel_validation` - Como validar os atributos do caso de uso?](#u-casewith_activemodel_validation---como-validar-os-atributos-do-caso-de-uso)
62
63
  - [Se eu habilitei a validação automática, é possível desabilitá-la apenas em casos de uso específicos?](#se-eu-habilitei-a-validação-automática-é-possível-desabilitá-la-apenas-em-casos-de-uso-específicos)
63
64
  - [`Kind::Validator`](#kindvalidator)
@@ -85,7 +86,8 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
85
86
 
86
87
  | u-case | branch | ruby | activemodel | u-attributes |
87
88
  | ---------------- | ------ | -------- | -------------- | -------------- |
88
- | unreleased | main | >= 2.7 | >= 6.0 | >= 2.7, < 4.0 |
89
+ | unreleased | main | >= 2.7 | >= 6.0 | >= 2.8, < 4.0 |
90
+ | 5.2.0 | v5.x | >= 2.7 | >= 6.0 | >= 2.8, < 4.0 |
89
91
  | 5.1.0 | v5.x | >= 2.7 | >= 6.0 | >= 2.7, < 4.0 |
90
92
  | 4.5.1 | v4.x | >= 2.2.0 | >= 3.2, <= 8.1 | >= 2.7, < 3.0 |
91
93
 
@@ -1069,6 +1071,43 @@ Como você pode ver, este hook tem o mesmo comportamento de `result.on_failure(:
1069
1071
 
1070
1072
  [⬆️ Voltar para o índice](#índice-)
1071
1073
 
1074
+ ### Validando atributos com `accept:` / `reject:`
1075
+
1076
+ Desde a versão `5.2.0` do `u-case`, todo caso de uso já inclui a [extensão `accept`](https://github.com/serradura/u-attributes#accept-extension) do [`u-attributes`](https://github.com/serradura/u-attributes) (requer `u-attributes >= 2.8`). Você pode declarar a expectativa de tipo (ou qualquer outra verificação) diretamente no atributo, e o caso de uso falhará automaticamente com o tipo `:invalid_attributes` quando algum atributo for rejeitado — sem precisar validar dentro do `call!`.
1077
+
1078
+ ```ruby
1079
+ class CreateUser < Micro::Case
1080
+ attribute :name, accept: String
1081
+ attribute :email, accept: ->(value) { value.is_a?(String) && value.include?('@') }
1082
+ attribute :age, accept: Integer, allow_nil: true
1083
+
1084
+ def call!
1085
+ Success result: { user: User.create!(attributes) }
1086
+ end
1087
+ end
1088
+
1089
+ CreateUser.call(name: 'Bob', email: 'bob@example.com')
1090
+ # => #<Success type=:ok ...>
1091
+
1092
+ CreateUser.call(name: 42, email: 'not-an-email')
1093
+ # => #<Failure type=:invalid_attributes data={
1094
+ # errors: {
1095
+ # "name" => "expected to be a kind of String",
1096
+ # "email" => "is invalid"
1097
+ # }
1098
+ # }>
1099
+ ```
1100
+
1101
+ O tipo da falha segue a mesma configuração usada pela integração com `ActiveModel` — veja [`Micro::Case.config`](#microcaseconfig) e `set_activemodel_validation_errors_failure`.
1102
+
1103
+ Quando combinado com [`u-case/with_activemodel_validation`](#u-casewith_activemodel_validation---como-validar-os-atributos-do-caso-de-uso), a ordem de execução é:
1104
+
1105
+ 1. O `u-attributes` resolve o valor padrão de cada atributo.
1106
+ 2. O `u-attributes` executa as verificações de `accept:` / `reject:`.
1107
+ 3. O `u-case` executa as validações do `ActiveModel` **apenas se** todos os atributos forem aceitos.
1108
+
1109
+ [⬆️ Voltar para o índice](#índice-)
1110
+
1072
1111
  ### `u-case/with_activemodel_validation` - Como validar os atributos do caso de uso?
1073
1112
 
1074
1113
  **Requisitos:**
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Micro
4
4
  class Case
5
- VERSION = '5.1.0'.freeze
5
+ VERSION = '5.2.0'.freeze
6
6
  end
7
7
  end
@@ -19,7 +19,10 @@ module Micro
19
19
  private
20
20
 
21
21
  def __call_use_case
22
- return failure_by_validation_error(self) if !self.class.auto_validation_disabled? && errors.present?
22
+ unless self.class.auto_validation_disabled?
23
+ return failure_by_validation_error(self) if errors.present?
24
+ return __failure_from_attributes_errors if __attributes_errors_present?
25
+ end
23
26
 
24
27
  result = call!
25
28
 
data/lib/micro/case.rb CHANGED
@@ -18,6 +18,7 @@ module Micro
18
18
  require 'micro/cases'
19
19
 
20
20
  include Micro::Attributes
21
+ include Micro::Attributes::Features::Accept
21
22
 
22
23
  def self.call(input = Kind::Empty::HASH)
23
24
  result = __new__(Result.new, input).__call__
@@ -206,6 +207,8 @@ module Micro
206
207
  end
207
208
 
208
209
  def __call_use_case
210
+ return __failure_from_attributes_errors if __attributes_errors_present?
211
+
209
212
  result = call!
210
213
 
211
214
  return result if result.is_a?(Result)
@@ -213,6 +216,17 @@ module Micro
213
216
  raise Error::UnexpectedResult.new("#{self.class.name}#call!")
214
217
  end
215
218
 
219
+ def __attributes_errors_present?
220
+ attributes_errors?
221
+ end
222
+
223
+ def __failure_from_attributes_errors
224
+ Failure(
225
+ Config.instance.activemodel_validation_errors_failure,
226
+ result: { errors: attributes_errors }
227
+ )
228
+ end
229
+
216
230
  def __call_the_use_case_flow?
217
231
  self.class.__flow_get__
218
232
  end
data/u-case.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.required_ruby_version = '>= 2.7.0'
27
27
 
28
28
  spec.add_runtime_dependency 'kind', '>= 5.6', '< 7.0'
29
- spec.add_runtime_dependency 'u-attributes', '>= 2.7', '< 4.0'
29
+ spec.add_runtime_dependency 'u-attributes', '>= 2.8', '< 4.0'
30
30
 
31
31
  spec.add_development_dependency 'appraisal', '~> 2.5'
32
32
  spec.add_development_dependency 'bundler'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: u-case
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Serradura
@@ -35,7 +35,7 @@ dependencies:
35
35
  requirements:
36
36
  - - ">="
37
37
  - !ruby/object:Gem::Version
38
- version: '2.7'
38
+ version: '2.8'
39
39
  - - "<"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '4.0'
@@ -45,7 +45,7 @@ dependencies:
45
45
  requirements:
46
46
  - - ">="
47
47
  - !ruby/object:Gem::Version
48
- version: '2.7'
48
+ version: '2.8'
49
49
  - - "<"
50
50
  - !ruby/object:Gem::Version
51
51
  version: '4.0'