u-case 3.0.0 → 3.1.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/.travis.sh +4 -4
- data/Gemfile +9 -1
- data/README.md +31 -14
- data/README.pt-BR.md +50 -33
- data/lib/micro/case.rb +10 -4
- data/lib/micro/case/config.rb +1 -1
- data/lib/micro/case/error.rb +1 -1
- data/lib/micro/case/result.rb +34 -34
- data/lib/micro/case/result/transitions.rb +20 -0
- data/lib/micro/case/safe.rb +1 -1
- data/lib/micro/case/utils.rb +1 -0
- data/lib/micro/case/version.rb +1 -1
- data/lib/micro/cases/flow.rb +7 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3472991bd5b3d6198cb7455044ac8144445b61c860ce76ca191eba1f6e09aac
|
4
|
+
data.tar.gz: eebefecaa4a27d98f3a558aa17a1731de6639a69cc5011fc6acdf430a7e1f52b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8cc6cc9994b30bc71b3a5485123dcd41a5583c195bba9969da41e85efb6ebb964f4ee5e39d02f86e324a2cbea24b420f1a9fa67d1dca410c8a60539873d80b9
|
7
|
+
data.tar.gz: 48b7f05a0473dba7885d1907d794b503c44030de29b53e0fd757f71597e37c8d0248db980b071ae8f2492e207bfddb0616b25dd9acbefd219318114f72b73339
|
data/.travis.sh
CHANGED
@@ -3,21 +3,21 @@
|
|
3
3
|
ruby_v=$(ruby -v)
|
4
4
|
|
5
5
|
ACTIVEMODEL_VERSION='3.2' bundle update
|
6
|
-
ACTIVEMODEL_VERSION='3.2' ENABLE_TRANSITIONS='true' bundle exec rake test
|
7
6
|
ACTIVEMODEL_VERSION='3.2' ENABLE_TRANSITIONS='false' bundle exec rake test
|
7
|
+
ACTIVEMODEL_VERSION='3.2' ENABLE_TRANSITIONS='true' bundle exec rake test
|
8
8
|
|
9
9
|
if [[ ! $ruby_v =~ '2.2.0' ]]; then
|
10
10
|
ACTIVEMODEL_VERSION='5.2' bundle update
|
11
|
-
ACTIVEMODEL_VERSION='5.2' ENABLE_TRANSITIONS='true' bundle exec rake test
|
12
11
|
ACTIVEMODEL_VERSION='5.2' ENABLE_TRANSITIONS='false' bundle exec rake test
|
12
|
+
ACTIVEMODEL_VERSION='5.2' ENABLE_TRANSITIONS='true' bundle exec rake test
|
13
13
|
fi
|
14
14
|
|
15
15
|
if [[ $ruby_v =~ '2.5.' ]] || [[ $ruby_v =~ '2.6.' ]] || [[ $ruby_v =~ '2.7.' ]]; then
|
16
16
|
ACTIVEMODEL_VERSION='6.0' bundle update
|
17
|
-
ACTIVEMODEL_VERSION='6.0' ENABLE_TRANSITIONS='true' bundle exec rake test
|
18
17
|
ACTIVEMODEL_VERSION='6.0' ENABLE_TRANSITIONS='false' bundle exec rake test
|
18
|
+
ACTIVEMODEL_VERSION='6.0' ENABLE_TRANSITIONS='true' bundle exec rake test
|
19
19
|
fi
|
20
20
|
|
21
21
|
bundle update
|
22
|
-
ENABLE_TRANSITIONS='true' bundle exec rake test
|
23
22
|
ENABLE_TRANSITIONS='false' bundle exec rake test
|
23
|
+
ENABLE_TRANSITIONS='true' bundle exec rake test
|
data/Gemfile
CHANGED
@@ -15,9 +15,17 @@ if activemodel_version < '6.1.0'
|
|
15
15
|
gem 'activesupport', activemodel, require: false
|
16
16
|
end
|
17
17
|
|
18
|
+
simplecov_version =
|
19
|
+
case RUBY_VERSION
|
20
|
+
when /\A2.[23]/ then '~> 0.17.1'
|
21
|
+
when /\A2.4/ then '~> 0.18.5'
|
22
|
+
else '~> 0.19'
|
23
|
+
end
|
24
|
+
|
18
25
|
group :test do
|
19
26
|
gem 'minitest', activemodel_version < '4.1' ? '~> 4.2' : '~> 5.0'
|
20
|
-
|
27
|
+
|
28
|
+
gem 'simplecov', simplecov_version, require: false
|
21
29
|
end
|
22
30
|
|
23
31
|
pry_byebug_version =
|
data/README.md
CHANGED
@@ -1,12 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
[](https://travis-ci.com/serradura/u-case)
|
4
|
-
[](https://codeclimate.com/github/serradura/u-case/maintainability)
|
5
|
-
[](https://codeclimate.com/github/serradura/u-case/test_coverage)
|
1
|
+
<p align="center">
|
2
|
+
<img src="./assets/ucase_logo_v1.png" alt="u-case - Create simple and powerful use cases as Ruby objects.">
|
6
3
|
|
7
|
-
<
|
4
|
+
<p align="center"><i>Create simple and powerful use cases as Ruby objects.</i></p>
|
5
|
+
<br>
|
6
|
+
</p>
|
8
7
|
|
9
|
-
|
8
|
+
<p align="center">
|
9
|
+
<img src="https://img.shields.io/badge/ruby-2.2+-ruby.svg?colorA=99004d&colorB=cc0066" alt="Ruby">
|
10
|
+
|
11
|
+
<a href="https://rubygems.org/gems/u-case">
|
12
|
+
<img alt="Gem" src="https://img.shields.io/gem/v/u-case.svg?style=flat-square">
|
13
|
+
</a>
|
14
|
+
|
15
|
+
<a href="https://travis-ci.com/serradura/u-case">
|
16
|
+
<img alt="Build Status" src="https://travis-ci.com/serradura/u-case.svg?branch=main">
|
17
|
+
</a>
|
18
|
+
|
19
|
+
<a href="https://codeclimate.com/github/serradura/u-case/maintainability">
|
20
|
+
<img alt="Maintainability" src="https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/maintainability">
|
21
|
+
</a>
|
22
|
+
|
23
|
+
<a href="https://codeclimate.com/github/serradura/u-case/test_coverage">
|
24
|
+
<img alt="Test Coverage" src="https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/test_coverage">
|
25
|
+
</a>
|
26
|
+
</p>
|
10
27
|
|
11
28
|
The main project goals are:
|
12
29
|
1. Easy to use and easy to learn (input **>>** process **>>** output).
|
@@ -21,7 +38,7 @@ The main project goals are:
|
|
21
38
|
|
22
39
|
Version | Documentation
|
23
40
|
--------- | -------------
|
24
|
-
3.
|
41
|
+
3.1.0 | https://github.com/serradura/u-case/blob/main/README.md
|
25
42
|
2.6.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
|
26
43
|
1.1.0 | https://github.com/serradura/u-case/blob/v1.x/README.md
|
27
44
|
|
@@ -60,10 +77,10 @@ Version | Documentation
|
|
60
77
|
- [`Kind::Validator`](#kindvalidator)
|
61
78
|
- [`Micro::Case.config`](#microcaseconfig)
|
62
79
|
- [Benchmarks](#benchmarks)
|
63
|
-
- [`Micro::Case`
|
80
|
+
- [`Micro::Case`](#microcase)
|
64
81
|
- [Success results](#success-results)
|
65
82
|
- [Failure results](#failure-results)
|
66
|
-
- [`Micro::Cases::Flow`
|
83
|
+
- [`Micro::Cases::Flow`](#microcasesflow)
|
67
84
|
- [Comparisons](#comparisons)
|
68
85
|
- [Examples](#examples)
|
69
86
|
- [1️⃣ Users creation](#1️⃣-users-creation)
|
@@ -79,7 +96,7 @@ Version | Documentation
|
|
79
96
|
|
80
97
|
| u-case | branch | ruby | activemodel |
|
81
98
|
| -------------- | ------- | -------- | ------------- |
|
82
|
-
| 3.
|
99
|
+
| 3.1.0 | main | >= 2.2.0 | >= 3.2, < 6.1 |
|
83
100
|
| 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
84
101
|
| 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
85
102
|
|
@@ -102,7 +119,7 @@ Version | Documentation
|
|
102
119
|
Add this line to your application's Gemfile:
|
103
120
|
|
104
121
|
```ruby
|
105
|
-
gem 'u-case', '~> 3.
|
122
|
+
gem 'u-case', '~> 3.1.0'
|
106
123
|
```
|
107
124
|
|
108
125
|
And then execute:
|
@@ -1170,7 +1187,7 @@ end
|
|
1170
1187
|
|
1171
1188
|
## Benchmarks
|
1172
1189
|
|
1173
|
-
### `Micro::Case`
|
1190
|
+
### `Micro::Case`
|
1174
1191
|
|
1175
1192
|
#### Success results
|
1176
1193
|
|
@@ -1264,7 +1281,7 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
|
|
1264
1281
|
|
1265
1282
|
---
|
1266
1283
|
|
1267
|
-
### `Micro::Cases::Flow`
|
1284
|
+
### `Micro::Cases::Flow`
|
1268
1285
|
|
1269
1286
|
| Gems / Abstraction | [Success results](https://github.com/serradura/u-case/blob/main/benchmarks/flow/with_success_result.rb#L40) | [Failure results](https://github.com/serradura/u-case/blob/main/benchmarks/flow/with_failure_result.rb#L40) |
|
1270
1287
|
| ------------------------------------------- | ----------------: | ----------------: |
|
data/README.pt-BR.md
CHANGED
@@ -1,12 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
[](https://travis-ci.com/serradura/u-case)
|
4
|
-
[](https://codeclimate.com/github/serradura/u-case/maintainability)
|
5
|
-
[](https://codeclimate.com/github/serradura/u-case/test_coverage)
|
1
|
+
<p align="center">
|
2
|
+
<img src="./assets/ucase_logo_v1.png" alt="u-case - Create simple and powerful use cases as Ruby objects.">
|
6
3
|
|
7
|
-
<
|
4
|
+
<p align="center"><i>Crie simples e poderosos casos de uso como objetos em Ruby.</i></p>
|
5
|
+
<br>
|
6
|
+
</p>
|
8
7
|
|
9
|
-
|
8
|
+
<p align="center">
|
9
|
+
<img src="https://img.shields.io/badge/ruby-2.2+-ruby.svg?colorA=99004d&colorB=cc0066" alt="Ruby">
|
10
|
+
|
11
|
+
<a href="https://rubygems.org/gems/u-case">
|
12
|
+
<img alt="Gem" src="https://img.shields.io/gem/v/u-case.svg?style=flat-square">
|
13
|
+
</a>
|
14
|
+
|
15
|
+
<a href="https://travis-ci.com/serradura/u-case">
|
16
|
+
<img alt="Build Status" src="https://travis-ci.com/serradura/u-case.svg?branch=main">
|
17
|
+
</a>
|
18
|
+
|
19
|
+
<a href="https://codeclimate.com/github/serradura/u-case/maintainability">
|
20
|
+
<img alt="Maintainability" src="https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/maintainability">
|
21
|
+
</a>
|
22
|
+
|
23
|
+
<a href="https://codeclimate.com/github/serradura/u-case/test_coverage">
|
24
|
+
<img alt="Test Coverage" src="https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/test_coverage">
|
25
|
+
</a>
|
26
|
+
</p>
|
10
27
|
|
11
28
|
Principais objetivos deste projeto:
|
12
29
|
1. Fácil de usar e aprender ( entrada **>>** processamento **>>** saída ).
|
@@ -15,13 +32,13 @@ Principais objetivos deste projeto:
|
|
15
32
|
4. Resolver regras de negócio complexas, ao permitir uma composição de casos de uso (criação de fluxos).
|
16
33
|
5. Ser rápido e otimizado (verifique a [seção de benchmarks](#benchmarks)).
|
17
34
|
|
18
|
-
> **Nota:** Verifique o repo https://github.com/serradura/from-fat-controllers-to-use-cases para ver uma aplicação Ruby on Rails que utiliza
|
35
|
+
> **Nota:** Verifique o repo https://github.com/serradura/from-fat-controllers-to-use-cases para ver uma aplicação Ruby on Rails que utiliza esta gem para resolver as regras de negócio.
|
19
36
|
|
20
37
|
## Documentação <!-- omit in toc -->
|
21
38
|
|
22
39
|
Versão | Documentação
|
23
40
|
--------- | -------------
|
24
|
-
3.
|
41
|
+
3.1.0 | https://github.com/serradura/u-case/blob/main/README.md
|
25
42
|
2.6.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
|
26
43
|
1.1.0 | https://github.com/serradura/u-case/blob/v1.x/README.md
|
27
44
|
|
@@ -33,7 +50,7 @@ Versão | Documentação
|
|
33
50
|
- [`Micro::Case` - Como definir um caso de uso?](#microcase---como-definir-um-caso-de-uso)
|
34
51
|
- [`Micro::Case::Result` - O que é o resultado de um caso de uso?](#microcaseresult---o-que-é-o-resultado-de-um-caso-de-uso)
|
35
52
|
- [O que são os tipos de resultados?](#o-que-são-os-tipos-de-resultados)
|
36
|
-
- [Como
|
53
|
+
- [Como definir tipos customizados de resultados?](#como-definir-tipos-customizados-de-resultados)
|
37
54
|
- [É possível definir um tipo sem definir os dados do resultado?](#é-possível-definir-um-tipo-sem-definir-os-dados-do-resultado)
|
38
55
|
- [Como utilizar os hooks dos resultados?](#como-utilizar-os-hooks-dos-resultados)
|
39
56
|
- [Por que o hook sem um tipo definido expõe o próprio resultado?](#por-que-o-hook-sem-um-tipo-definido-expõe-o-próprio-resultado)
|
@@ -59,10 +76,10 @@ Versão | Documentação
|
|
59
76
|
- [`Kind::Validator`](#kindvalidator)
|
60
77
|
- [`Micro::Case.config`](#microcaseconfig)
|
61
78
|
- [Benchmarks](#benchmarks)
|
62
|
-
- [`Micro::Case`
|
79
|
+
- [`Micro::Case`](#microcase)
|
63
80
|
- [Success results](#success-results)
|
64
81
|
- [Failure results](#failure-results)
|
65
|
-
- [`Micro::Cases::Flow`
|
82
|
+
- [`Micro::Cases::Flow`](#microcasesflow)
|
66
83
|
- [Comparações](#comparações)
|
67
84
|
- [Exemplos](#exemplos)
|
68
85
|
- [1️⃣ Criação de usuários](#1️⃣-criação-de-usuários)
|
@@ -78,7 +95,7 @@ Versão | Documentação
|
|
78
95
|
|
79
96
|
| u-case | branch | ruby | activemodel |
|
80
97
|
| -------------- | ------- | -------- | ------------- |
|
81
|
-
| 3.
|
98
|
+
| 3.1.0 | main | >= 2.2.0 | >= 3.2, < 6.1 |
|
82
99
|
| 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
83
100
|
| 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
84
101
|
|
@@ -101,7 +118,7 @@ Versão | Documentação
|
|
101
118
|
Adicione essa linha ao Gemfile da sua aplicação:
|
102
119
|
|
103
120
|
```ruby
|
104
|
-
gem 'u-case', '~> 3.
|
121
|
+
gem 'u-case', '~> 3.1.0'
|
105
122
|
```
|
106
123
|
|
107
124
|
E então execute:
|
@@ -161,18 +178,18 @@ bad_result.data # { message: "`a` and `b` attributes must be numeric" }
|
|
161
178
|
### `Micro::Case::Result` - O que é o resultado de um caso de uso?
|
162
179
|
|
163
180
|
Um `Micro::Case::Result` armazena os dados de output de um caso de uso. Esses são seus métodos:
|
164
|
-
- `#success?` retorna true se for um resultado de sucesso.
|
165
|
-
- `#failure?` retorna true se for um resultado de falha.
|
166
|
-
- `#use_case` retorna o caso de uso
|
181
|
+
- `#success?` retorna `true` se for um resultado de sucesso.
|
182
|
+
- `#failure?` retorna `true` se for um resultado de falha.
|
183
|
+
- `#use_case` retorna o caso de uso responsável pelo resultado. Essa funcionalidade é útil para lidar com falhas em flows (esse tópico será abordado mais a frente).
|
167
184
|
- `#type` retorna um Symbol que dá significado ao resultado, isso é útil para declarar diferentes tipos de falha e sucesso.
|
168
|
-
- `#data` os dados do resultado (um Hash).
|
185
|
+
- `#data` os dados do resultado (um `Hash`).
|
169
186
|
- `#[]` e `#values_at` são atalhos para acessar as propriedades do `#data`.
|
170
187
|
- `#key?` retorna `true` se a chave estiver present no `#data`.
|
171
188
|
- `#value?` retorna `true` se o valor estiver present no `#data`.
|
172
|
-
- `#slice` retorna um novo
|
189
|
+
- `#slice` retorna um novo `Hash` que inclui apenas as chaves fornecidas. Se as chaves fornecidas não existirem, um `Hash` vazio será retornado.
|
173
190
|
- `#on_success` or `#on_failure` são métodos de hooks que te auxiliam a definir o fluxo da aplicação.
|
174
|
-
- `#then` este método permite aplicar novos casos de uso ao resultado atual se ele for sucesso. A
|
175
|
-
- `#transitions` retorna um array com
|
191
|
+
- `#then` este método permite aplicar novos casos de uso ao resultado atual se ele for sucesso. A ideia dessa feature é a criação de fluxos dinâmicos.
|
192
|
+
- `#transitions` retorna um array com todas as transformações que um resultado [teve durante um flow](#como-entender-o-que-aconteceu-durante-a-execução-de-um-flow).
|
176
193
|
|
177
194
|
> **Nota:** por conta de retrocompatibilidade, você pode usar o método `#value` como um alias para o método `#data`.
|
178
195
|
|
@@ -180,9 +197,9 @@ Um `Micro::Case::Result` armazena os dados de output de um caso de uso. Esses s
|
|
180
197
|
|
181
198
|
#### O que são os tipos de resultados?
|
182
199
|
|
183
|
-
Todo resultado tem um tipo (type), e
|
184
|
-
- `:ok`
|
185
|
-
- `:error`
|
200
|
+
Todo resultado tem um tipo (`#type`), e estes são os valores padrões:
|
201
|
+
- `:ok` em casos de sucesso;
|
202
|
+
- `:error` ou `:exception` em casos de falhas.
|
186
203
|
|
187
204
|
```ruby
|
188
205
|
class Divide < Micro::Case
|
@@ -238,9 +255,9 @@ err_result.use_case # #<Divide:0x0000 @__attributes={"a"=>2, "b"=>0}, @a=2, @b=0
|
|
238
255
|
|
239
256
|
[⬆️ Voltar para o índice](#índice-)
|
240
257
|
|
241
|
-
#### Como
|
258
|
+
#### Como definir tipos customizados de resultados?
|
242
259
|
|
243
|
-
Resposta: Use um Symbol com argumento dos métodos `Success()`, `Failure()` e declare o `result:` keyword para definir os dados do resultado.
|
260
|
+
Resposta: Use um `Symbol` com argumento dos métodos `Success()`, `Failure()` e declare o `result:` keyword para definir os dados do resultado.
|
244
261
|
|
245
262
|
```ruby
|
246
263
|
class Multiply < Micro::Case
|
@@ -310,10 +327,10 @@ result.use_case.attributes # {"a"=>2, "b"=>"2"}
|
|
310
327
|
|
311
328
|
#### Como utilizar os hooks dos resultados?
|
312
329
|
|
313
|
-
Como [mencionando anteriormente](#microcaseresult---o-que-é-o-resultado-de-um-caso-de-uso), o `Micro::Case::Result` tem dois
|
330
|
+
Como [mencionando anteriormente](#microcaseresult---o-que-é-o-resultado-de-um-caso-de-uso), o `Micro::Case::Result` tem dois métodos para melhorar o controle do fluxo da aplicação. São eles:
|
314
331
|
`#on_success`, `on_failure`.
|
315
332
|
|
316
|
-
Os exemplos abaixo demonstram
|
333
|
+
Os exemplos abaixo os demonstram em uso:
|
317
334
|
|
318
335
|
```ruby
|
319
336
|
class Double < Micro::Case
|
@@ -457,7 +474,7 @@ result[:number] * 4 == accum # true
|
|
457
474
|
|
458
475
|
#### Como usar o método `Micro::Case::Result#then`?
|
459
476
|
|
460
|
-
Este método permite você criar fluxos dinâmicos
|
477
|
+
Este método permite você criar fluxos dinâmicos. Com ele, você pode adicionar novos casos de uso ou fluxos para continuar a transformação de um resultado. Exemplo:
|
461
478
|
|
462
479
|
```ruby
|
463
480
|
class ForbidNegativeNumber < Micro::Case
|
@@ -715,7 +732,7 @@ DoubleAllNumbersAndSquareAndAdd2
|
|
715
732
|
|
716
733
|
#### É possível que um fluxo acumule sua entrada e mescle cada resultado de sucesso para usar como argumento dos próximos casos de uso?
|
717
734
|
|
718
|
-
Resposta: Sim, é possível! Veja o exemplo abaixo para entender como funciona o
|
735
|
+
Resposta: Sim, é possível! Veja o exemplo abaixo para entender como funciona o acúmulo de dados dentro da execução de um fluxo.
|
719
736
|
|
720
737
|
```ruby
|
721
738
|
module Users
|
@@ -955,7 +972,7 @@ end
|
|
955
972
|
|
956
973
|
#### `Micro::Case::Result#on_exception`
|
957
974
|
|
958
|
-
Se você precisar lidar com um erro específico, recomendo o uso de uma instrução case.
|
975
|
+
Se você precisar lidar com um erro específico, recomendo o uso de uma instrução case. Exemplo:
|
959
976
|
|
960
977
|
```ruby
|
961
978
|
result.on_failure(:exception) do |data, use_case|
|
@@ -1174,7 +1191,7 @@ end
|
|
1174
1191
|
|
1175
1192
|
## Benchmarks
|
1176
1193
|
|
1177
|
-
### `Micro::Case`
|
1194
|
+
### `Micro::Case`
|
1178
1195
|
|
1179
1196
|
#### Success results
|
1180
1197
|
|
@@ -1268,7 +1285,7 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
|
|
1268
1285
|
|
1269
1286
|
---
|
1270
1287
|
|
1271
|
-
### `Micro::Cases::Flow`
|
1288
|
+
### `Micro::Cases::Flow`
|
1272
1289
|
|
1273
1290
|
| Gem / Abstração | [Resultados de sucesso](https://github.com/serradura/u-case/blob/main/benchmarks/flow/with_success_result.rb#L40) | [Resultados de falha](https://github.com/serradura/u-case/blob/main/benchmarks/flow/with_failure_result.rb#L40) |
|
1274
1291
|
| ------------------------------------------- | ----------------: | ----------------: |
|
data/lib/micro/case.rb
CHANGED
@@ -22,20 +22,22 @@ module Micro
|
|
22
22
|
new(options).__call__
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
Error::InvalidInvocationOfTheThenMethod.new(self.name)
|
25
|
+
INVALID_INVOCATION_OF_THE_THEN_METHOD =
|
26
|
+
Error::InvalidInvocationOfTheThenMethod.new("#{self.name}.")
|
27
27
|
|
28
28
|
def self.then(use_case = nil, &block)
|
29
29
|
can_yield_self = respond_to?(:yield_self)
|
30
30
|
|
31
31
|
if block
|
32
|
-
raise
|
32
|
+
raise INVALID_INVOCATION_OF_THE_THEN_METHOD if use_case
|
33
33
|
raise NotImplementedError if !can_yield_self
|
34
34
|
|
35
35
|
yield_self(&block)
|
36
36
|
else
|
37
37
|
return yield_self if !use_case && can_yield_self
|
38
38
|
|
39
|
+
raise INVALID_INVOCATION_OF_THE_THEN_METHOD unless ::Micro.case_or_flow?(use_case)
|
40
|
+
|
39
41
|
self.call.then(use_case)
|
40
42
|
end
|
41
43
|
end
|
@@ -142,6 +144,10 @@ module Micro
|
|
142
144
|
|
143
145
|
private
|
144
146
|
|
147
|
+
def apply(name)
|
148
|
+
method(name)
|
149
|
+
end
|
150
|
+
|
145
151
|
def call
|
146
152
|
return __call_use_case_flow if __call_use_case_flow?
|
147
153
|
|
@@ -202,7 +208,7 @@ module Micro
|
|
202
208
|
__result.__set__(is_success, value, type, self)
|
203
209
|
end
|
204
210
|
|
205
|
-
|
211
|
+
private_constant :MapFailureType, :INVALID_INVOCATION_OF_THE_THEN_METHOD
|
206
212
|
end
|
207
213
|
|
208
214
|
def self.case_or_flow?(arg)
|
data/lib/micro/case/config.rb
CHANGED
@@ -26,7 +26,7 @@ module Micro
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def activemodel_validation_errors_failure
|
29
|
-
@activemodel_validation_errors_failure if defined?(@activemodel_validation_errors_failure)
|
29
|
+
return @activemodel_validation_errors_failure if defined?(@activemodel_validation_errors_failure)
|
30
30
|
|
31
31
|
@activemodel_validation_errors_failure = :invalid_attributes
|
32
32
|
end
|
data/lib/micro/case/error.rb
CHANGED
data/lib/micro/case/result.rb
CHANGED
@@ -5,10 +5,12 @@ require 'set'
|
|
5
5
|
module Micro
|
6
6
|
class Case
|
7
7
|
class Result
|
8
|
+
require 'micro/case/result/transitions'
|
9
|
+
|
8
10
|
Kind::Types.add(self)
|
9
11
|
|
10
|
-
|
11
|
-
Error::InvalidInvocationOfTheThenMethod.new(self.name)
|
12
|
+
INVALID_INVOCATION_OF_THE_THEN_METHOD =
|
13
|
+
Error::InvalidInvocationOfTheThenMethod.new("#{self.name}#")
|
12
14
|
|
13
15
|
@@transitions_enabled = true
|
14
16
|
|
@@ -20,10 +22,14 @@ module Micro
|
|
20
22
|
|
21
23
|
alias value data
|
22
24
|
|
23
|
-
def initialize
|
24
|
-
@__transitions = @@transitions_enabled ? [] : Kind::Empty::ARRAY
|
25
|
+
def initialize(transitions_mapper = nil)
|
25
26
|
@__accumulated_data = {}
|
26
27
|
@__accessible_attributes = {}
|
28
|
+
|
29
|
+
enable_transitions = @@transitions_enabled
|
30
|
+
|
31
|
+
@__transitions = enable_transitions ? [] : Kind::Empty::ARRAY
|
32
|
+
@__transitions_mapper = transitions_mapper || Transitions::MapEverything if enable_transitions
|
27
33
|
end
|
28
34
|
|
29
35
|
def to_ary
|
@@ -51,13 +57,17 @@ module Micro
|
|
51
57
|
end
|
52
58
|
|
53
59
|
def success?
|
54
|
-
@
|
60
|
+
@__success
|
55
61
|
end
|
56
62
|
|
57
63
|
def failure?
|
58
64
|
!success?
|
59
65
|
end
|
60
66
|
|
67
|
+
def accessible_attributes
|
68
|
+
@__accessible_attributes.keys
|
69
|
+
end
|
70
|
+
|
61
71
|
def on_success(expected_type = nil)
|
62
72
|
return self unless __success_type?(expected_type)
|
63
73
|
|
@@ -92,7 +102,7 @@ module Micro
|
|
92
102
|
can_yield_self = respond_to?(:yield_self)
|
93
103
|
|
94
104
|
if block
|
95
|
-
raise
|
105
|
+
raise INVALID_INVOCATION_OF_THE_THEN_METHOD if use_case
|
96
106
|
raise NotImplementedError if !can_yield_self
|
97
107
|
|
98
108
|
yield_self(&block)
|
@@ -101,7 +111,7 @@ module Micro
|
|
101
111
|
return failure? ? self : __call_proc(use_case, 'then(-> {})'.freeze) if use_case.is_a?(Proc)
|
102
112
|
return failure? ? self : __call_method(use_case, attributes) if use_case.is_a?(Method)
|
103
113
|
|
104
|
-
raise
|
114
|
+
raise INVALID_INVOCATION_OF_THE_THEN_METHOD unless ::Micro.case_or_flow?(use_case)
|
105
115
|
|
106
116
|
return self if failure?
|
107
117
|
|
@@ -121,13 +131,13 @@ module Micro
|
|
121
131
|
return __call_proc(arg, '| -> {}'.freeze) if arg.is_a?(Proc)
|
122
132
|
return __call_method(arg) if arg.is_a?(Method)
|
123
133
|
|
124
|
-
raise
|
134
|
+
raise INVALID_INVOCATION_OF_THE_THEN_METHOD unless ::Micro.case_or_flow?(arg)
|
125
135
|
|
126
136
|
failure? ? self : arg.__new__(self, data).__call__
|
127
137
|
end
|
128
138
|
|
129
139
|
def transitions
|
130
|
-
@__transitions.
|
140
|
+
@__transitions.dup
|
131
141
|
end
|
132
142
|
|
133
143
|
FetchData = -> (data) do
|
@@ -141,9 +151,9 @@ module Micro
|
|
141
151
|
raise Error::InvalidResultType unless type.is_a?(Symbol)
|
142
152
|
raise Error::InvalidUseCase unless use_case.is_a?(::Micro::Case)
|
143
153
|
|
144
|
-
@
|
154
|
+
@__success, @type, @use_case = is_success, type, use_case
|
145
155
|
|
146
|
-
@data = FetchData.call(data)
|
156
|
+
@data = FetchData.call(data).freeze
|
147
157
|
|
148
158
|
raise Micro::Case::Error::InvalidResult.new(is_success, type, use_case) unless @data
|
149
159
|
|
@@ -164,20 +174,23 @@ module Micro
|
|
164
174
|
attributes = Utils.symbolize_hash_keys(arg)
|
165
175
|
|
166
176
|
__update_accessible_attributes(attributes)
|
177
|
+
__fetch_accessible_attributes
|
167
178
|
end
|
168
179
|
|
169
180
|
private
|
170
181
|
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
|
182
|
+
def __update_accessible_attributes(attributes)
|
183
|
+
@__accessible_attributes.merge!(attributes)
|
184
|
+
end
|
185
|
+
|
186
|
+
def __fetch_accessible_attributes
|
187
|
+
@__accessible_attributes.dup
|
175
188
|
end
|
176
189
|
|
177
190
|
def __call_proc(fn, expected)
|
178
|
-
|
191
|
+
__update_accessible_attributes(@__accumulated_data)
|
179
192
|
|
180
|
-
result = fn.arity.zero? ? fn.call : fn.call(
|
193
|
+
result = fn.arity.zero? ? fn.call : fn.call(__fetch_accessible_attributes)
|
181
194
|
|
182
195
|
return self if result === self
|
183
196
|
|
@@ -185,9 +198,9 @@ module Micro
|
|
185
198
|
end
|
186
199
|
|
187
200
|
def __call_method(methd, attributes = nil)
|
188
|
-
|
201
|
+
__update_accessible_attributes(attributes ? attributes.merge(@__accumulated_data) : @__accumulated_data)
|
189
202
|
|
190
|
-
result = methd.arity.zero? ? methd.call : methd.call(**
|
203
|
+
result = methd.arity.zero? ? methd.call : methd.call(**__fetch_accessible_attributes)
|
191
204
|
|
192
205
|
return self if result === self
|
193
206
|
|
@@ -202,24 +215,11 @@ module Micro
|
|
202
215
|
failure? && (expected_type.nil? || expected_type == type)
|
203
216
|
end
|
204
217
|
|
205
|
-
def __update_accessible_attributes(attributes)
|
206
|
-
@__accessible_attributes.merge!(attributes)
|
207
|
-
@__accessible_attributes.dup
|
208
|
-
end
|
209
|
-
|
210
218
|
def __set_transition(use_case_attributes)
|
211
|
-
|
212
|
-
|
213
|
-
result = @success ? :success : :failure
|
214
|
-
|
215
|
-
@__transitions << {
|
216
|
-
use_case: { class: use_case_class, attributes: use_case_attributes },
|
217
|
-
result => { type: @type, result: data },
|
218
|
-
accessible_attributes: @__accessible_attributes.keys
|
219
|
-
}
|
219
|
+
@__transitions << @__transitions_mapper.call(self, use_case_attributes)
|
220
220
|
end
|
221
221
|
|
222
|
-
|
222
|
+
private_constant :FetchData, :INVALID_INVOCATION_OF_THE_THEN_METHOD
|
223
223
|
end
|
224
224
|
end
|
225
225
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Micro
|
4
|
+
class Case
|
5
|
+
class Result
|
6
|
+
class Transitions
|
7
|
+
MapEverything = -> (result, use_case_attributes) do
|
8
|
+
result_track = result.success? ? :success : :failure
|
9
|
+
|
10
|
+
{
|
11
|
+
use_case: { class: result.use_case.class, attributes: use_case_attributes },
|
12
|
+
result_track => { type: result.type, result: result.data },
|
13
|
+
accessible_attributes: result.accessible_attributes
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
data/lib/micro/case/safe.rb
CHANGED
data/lib/micro/case/utils.rb
CHANGED
data/lib/micro/case/version.rb
CHANGED
data/lib/micro/cases/flow.rb
CHANGED
@@ -49,19 +49,25 @@ module Micro
|
|
49
49
|
can_yield_self = respond_to?(:yield_self)
|
50
50
|
|
51
51
|
if block
|
52
|
-
|
52
|
+
raise_invalid_invocation_of_the_then_method if use_case
|
53
53
|
raise NotImplementedError if !can_yield_self
|
54
54
|
|
55
55
|
yield_self(&block)
|
56
56
|
else
|
57
57
|
return yield_self if !use_case && can_yield_self
|
58
58
|
|
59
|
+
raise_invalid_invocation_of_the_then_method unless ::Micro.case_or_flow?(use_case)
|
60
|
+
|
59
61
|
self.call.then(use_case)
|
60
62
|
end
|
61
63
|
end
|
62
64
|
|
63
65
|
private
|
64
66
|
|
67
|
+
def raise_invalid_invocation_of_the_then_method
|
68
|
+
raise Case::Error::InvalidInvocationOfTheThenMethod.new("#{self.class.name}#")
|
69
|
+
end
|
70
|
+
|
65
71
|
def __case_use_case(use_case, result, input)
|
66
72
|
use_case.__new__(result, input).__call__
|
67
73
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: u-case
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Serradura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kind
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- lib/micro/case/config.rb
|
96
96
|
- lib/micro/case/error.rb
|
97
97
|
- lib/micro/case/result.rb
|
98
|
+
- lib/micro/case/result/transitions.rb
|
98
99
|
- lib/micro/case/safe.rb
|
99
100
|
- lib/micro/case/strict.rb
|
100
101
|
- lib/micro/case/utils.rb
|