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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fe9a88c0c01e52d2f89ba28578c4b67c8cd1d6e303a49ff1ce2d11e5e543159
4
- data.tar.gz: a105e4f13e760d03e201a6d6246a0b39e96e0452465953ca0d1767e93d927711
3
+ metadata.gz: d3472991bd5b3d6198cb7455044ac8144445b61c860ce76ca191eba1f6e09aac
4
+ data.tar.gz: eebefecaa4a27d98f3a558aa17a1731de6639a69cc5011fc6acdf430a7e1f52b
5
5
  SHA512:
6
- metadata.gz: cfed6efdf05b4960bb63c43926cfb2aa6a35b394f665c9a1e472f2ebf05568d418bd04e4c075bea2c990e896131ba57281455ab9fc153d4d4ee4196773798ff4
7
- data.tar.gz: 6573ad028e83794fa6851f15a27e3b96a1368d84345e1a8aede633c6f1962bde2ff20e0222bdad9c833dabbe22e90a190ea1c092ef8cab4258d443c9bf91f652
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
- gem 'simplecov', require: false
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
- ![Ruby](https://img.shields.io/badge/ruby-2.2+-ruby.svg?colorA=99004d&colorB=cc0066)
2
- [![Gem](https://img.shields.io/gem/v/u-case.svg?style=flat-square)](https://rubygems.org/gems/u-case)
3
- [![Build Status](https://travis-ci.com/serradura/u-case.svg?branch=main)](https://travis-ci.com/serradura/u-case)
4
- [![Maintainability](https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/maintainability)](https://codeclimate.com/github/serradura/u-case/maintainability)
5
- [![Test Coverage](https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/test_coverage)](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
- <img src="./assets/ucase_logo_v1.png" alt="u-case - Create simple and powerful use cases as Ruby objects.">
4
+ <p align="center"><i>Create simple and powerful use cases as Ruby objects.</i></p>
5
+ <br>
6
+ </p>
8
7
 
9
- Create simple and powerful use cases as Ruby objects.
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.0.0 | https://github.com/serradura/u-case/blob/main/README.md
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` (v3.0.0)](#microcase-v300)
80
+ - [`Micro::Case`](#microcase)
64
81
  - [Success results](#success-results)
65
82
  - [Failure results](#failure-results)
66
- - [`Micro::Cases::Flow` (v3.0.0)](#microcasesflow-v300)
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.0.0 | main | >= 2.2.0 | >= 3.2, < 6.1 |
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.0.0'
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` (v3.0.0)
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` (v3.0.0)
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
  | ------------------------------------------- | ----------------: | ----------------: |
@@ -1,12 +1,29 @@
1
- ![Ruby](https://img.shields.io/badge/ruby-2.2+-ruby.svg?colorA=99004d&colorB=cc0066)
2
- [![Gem](https://img.shields.io/gem/v/u-case.svg?style=flat-square)](https://rubygems.org/gems/u-case)
3
- [![Build Status](https://travis-ci.com/serradura/u-case.svg?branch=main)](https://travis-ci.com/serradura/u-case)
4
- [![Maintainability](https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/maintainability)](https://codeclimate.com/github/serradura/u-case/maintainability)
5
- [![Test Coverage](https://api.codeclimate.com/v1/badges/5c3c8ad1b0b943f88efd/test_coverage)](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
- <img src="./assets/ucase_logo_v1.png" alt="u-case - Crie simples e poderosos casos de uso como objetos em Ruby.">
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
- Crie simples e poderosos casos de uso como objetos em Ruby.
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 está gem para resolver as regras de negócio.
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.0.0 | https://github.com/serradura/u-case/blob/main/README.md
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 difinir tipos customizados de resultados?](#como-difinir-tipos-customizados-de-resultados)
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` (v3.0.0)](#microcase-v300)
79
+ - [`Micro::Case`](#microcase)
63
80
  - [Success results](#success-results)
64
81
  - [Failure results](#failure-results)
65
- - [`Micro::Cases::Flow` (v3.0.0)](#microcasesflow-v300)
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.0.0 | main | >= 2.2.0 | >= 3.2, < 6.1 |
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.0.0'
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 reponsável pelo resultado. Essa funcionalidade é útil para lidar com falhas em flows (esse tópico será abordado mais a frente).
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 hash que inclui apenas as chaves fornecidas. Se as chaves fornecidas não existirem, um hash vazio será retornado.
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 idia dessa feature é a criação de fluxos dinâmicos.
175
- - `#transitions` retorna um array com todoas as transformações que um resultado [teve durante um flow](#como-entender-o-que-aconteceu-durante-a-execução-de-um-flow).
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 estão são os valores padrões:
184
- - `:ok` quando sucesso
185
- - `:error` or `:exception` quando falhas
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 difinir tipos customizados de resultados?
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 métodoso para melhorar o controle do fluxo da aplicação. São eles:
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 eles em uso:
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, então, com ele, você pode adicionar novos casos de uso ou fluxos para continuar a transformação de um resultado. por exemplo:
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 acumulp de dados dentro da execução de um fluxo.
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. por exemplo:
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` (v3.0.0)
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` (v3.0.0)
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
  | ------------------------------------------- | ----------------: | ----------------: |
@@ -22,20 +22,22 @@ module Micro
22
22
  new(options).__call__
23
23
  end
24
24
 
25
- INVALID_INVOCATION_OF_THE_THE_METHOD =
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 INVALID_INVOCATION_OF_THE_THE_METHOD if use_case
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
- private_constant :MapFailureType
211
+ private_constant :MapFailureType, :INVALID_INVOCATION_OF_THE_THEN_METHOD
206
212
  end
207
213
 
208
214
  def self.case_or_flow?(arg)
@@ -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
@@ -47,7 +47,7 @@ module Micro
47
47
 
48
48
  class InvalidInvocationOfTheThenMethod < StandardError
49
49
  def initialize(class_name)
50
- super("Invalid invocation of the #{class_name}#then method")
50
+ super("Invalid invocation of the #{class_name}then method")
51
51
  end
52
52
  end
53
53
 
@@ -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
- INVALID_INVOCATION_OF_THE_THE_METHOD =
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
- @success
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 INVALID_INVOCATION_OF_THE_THE_METHOD if use_case
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 INVALID_INVOCATION_OF_THE_THE_METHOD unless ::Micro.case_or_flow?(use_case)
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 INVALID_INVOCATION_OF_THE_THE_METHOD unless ::Micro.case_or_flow?(arg)
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.clone
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
- @success, @type, @use_case = is_success, type, use_case
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 __fetch_accumulated_data(opt = nil)
172
- __update_accessible_attributes(
173
- opt ? opt.merge(@__accumulated_data) : @__accumulated_data
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
- input = __fetch_accumulated_data
191
+ __update_accessible_attributes(@__accumulated_data)
179
192
 
180
- result = fn.arity.zero? ? fn.call : fn.call(input)
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
- input = __fetch_accumulated_data(attributes)
201
+ __update_accessible_attributes(attributes ? attributes.merge(@__accumulated_data) : @__accumulated_data)
189
202
 
190
- result = methd.arity.zero? ? methd.call : methd.call(**input)
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
- use_case_class = @use_case.class
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
- private_constant :FetchData, :INVALID_INVOCATION_OF_THE_THE_METHOD
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
+
@@ -3,7 +3,7 @@
3
3
  module Micro
4
4
  class Case
5
5
  class Safe < ::Micro::Case
6
- def self.__flow_builder
6
+ def self.__flow_builder__
7
7
  Cases::Safe::Flow
8
8
  end
9
9
 
@@ -14,6 +14,7 @@ module Micro
14
14
  end
15
15
  end
16
16
  end
17
+
17
18
  def self.slice_hash(hash, keys)
18
19
  if Kind::Of::Hash(hash).respond_to?(:slice)
19
20
  hash.slice(*keys)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Micro
4
4
  class Case
5
- VERSION = '3.0.0'.freeze
5
+ VERSION = '3.1.0'.freeze
6
6
  end
7
7
  end
@@ -49,19 +49,25 @@ module Micro
49
49
  can_yield_self = respond_to?(:yield_self)
50
50
 
51
51
  if block
52
- raise Error::InvalidInvocationOfTheThenMethod.new(self.class.name) if use_case
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.0.0
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-15 00:00:00.000000000 Z
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