u-case 3.0.0.rc6 → 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.
@@ -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.rc5 | 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,8 +50,8 @@ 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)
37
- - [É possíve definir um tipo sem definit os dados do resultado?](#é-possíve-definir-um-tipo-sem-definit-os-dados-do-resultado)
53
+ - [Como definir tipos customizados de resultados?](#como-definir-tipos-customizados-de-resultados)
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)
40
57
  - [Usando decomposição para acessar os dados e tipo do resultado](#usando-decomposição-para-acessar-os-dados-e-tipo-do-resultado)
@@ -59,15 +76,15 @@ 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
- - [1️⃣ Rails App (API)](#1️⃣-rails-app-api)
69
- - [2️⃣ CLI calculator](#2️⃣-cli-calculator)
70
- - [3️⃣ Criação de usuários](#3️⃣-criação-de-usuários)
85
+ - [1️⃣ Criação de usuários](#1️⃣-criação-de-usuários)
86
+ - [2️⃣ Rails App (API)](#2️⃣-rails-app-api)
87
+ - [3️⃣ CLI calculator](#3️⃣-cli-calculator)
71
88
  - [4️⃣ Interceptando exceções dentro dos casos de uso](#4️⃣-interceptando-exceções-dentro-dos-casos-de-uso)
72
89
  - [Desenvolvimento](#desenvolvimento)
73
90
  - [Contribuindo](#contribuindo)
@@ -78,7 +95,7 @@ Versão | Documentação
78
95
 
79
96
  | u-case | branch | ruby | activemodel |
80
97
  | -------------- | ------- | -------- | ------------- |
81
- | 3.0.0.rc5 | 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.rc5'
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
@@ -276,7 +293,7 @@ bad_result.failure? # true
276
293
 
277
294
  [⬆️ Voltar para o índice](#índice-)
278
295
 
279
- #### É possíve definir um tipo sem definit os dados do resultado?
296
+ #### É possível definir um tipo sem definir os dados do resultado?
280
297
 
281
298
  Resposta: Sim, é possível. Mas isso terá um comportamento especial por conta dos dados do resultado ser um hash com o tipo definido como chave e `true` como o valor.
282
299
 
@@ -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|
@@ -1064,7 +1081,7 @@ class Multiply < Micro::Case
1064
1081
  validates :a, :b, presence: true, numericality: true
1065
1082
 
1066
1083
  def call!
1067
- return Failure :validation_error, result: { errors: self.errors } if invalid?
1084
+ return Failure :invalid_attributes, result: { errors: self.errors } if invalid?
1068
1085
 
1069
1086
  Success result: { number: a * b }
1070
1087
  end
@@ -1174,48 +1191,48 @@ 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
 
1181
1198
  | Gem / Abstração | Iterações por segundo | Comparação |
1182
1199
  | ----------------- | --------------------: | ----------------: |
1183
- | Dry::Monads | 139037.7 | _**O mais rápido**_ |
1184
- | **Micro::Case** | 101497.3 | 1.37x slower |
1185
- | Interactor | 30694.2 | 4.53x slower |
1186
- | Trailblazer::Operation | 14580.8 | 9.54x slower |
1187
- | Dry::Transaction | 5728.0 | 24.27x slower |
1200
+ | Dry::Monads | 141730.1 | _**O mais rápido**_ |
1201
+ | **Micro::Case** | 103541.3 | 1.37x slower |
1202
+ | Interactor | 29100.8 | 4.87x slower |
1203
+ | Trailblazer::Operation | 15031.4 | 9.43x slower |
1204
+ | Dry::Transaction | 5674.0 | 24.98x slower |
1188
1205
 
1189
1206
  <details>
1190
1207
  <summary>Show the full <a href="https://github.com/evanphx/benchmark-ips">benchmark/ips</a> results.</summary>
1191
1208
 
1192
1209
  ```ruby
1193
1210
  # Warming up --------------------------------------
1194
- # Interactor 3.056k i/100ms
1195
- # Trailblazer::Operation 1.480k i/100ms
1196
- # Dry::Monads 14.316k i/100ms
1197
- # Dry::Transaction 576.000 i/100ms
1198
- # Micro::Case 10.388k i/100ms
1199
- # Micro::Case::Strict 8.223k i/100ms
1200
- # Micro::Case::Safe 10.057k i/100ms
1211
+ # Interactor 2.915k i/100ms
1212
+ # Trailblazer::Operation 1.543k i/100ms
1213
+ # Dry::Monads 14.288k i/100ms
1214
+ # Dry::Transaction 571.000 i/100ms
1215
+ # Micro::Case 10.418k i/100ms
1216
+ # Micro::Case::Strict 8.296k i/100ms
1217
+ # Micro::Case::Safe 10.254k i/100ms
1201
1218
 
1202
1219
  # Calculating -------------------------------------
1203
- # Interactor 30.694k (± 2.3%) i/s - 155.856k in 5.080475s
1204
- # Trailblazer::Operation 14.581k3.9%) i/s - 74.000k in 5.083091s
1205
- # Dry::Monads 139.038k (± 3.0%) i/s - 701.484k in 5.049921s
1206
- # Dry::Transaction 5.728k3.6%) i/s - 28.800k in 5.034599s
1207
- # Micro::Case 100.712k3.4%) i/s - 509.012k in 5.060139s
1208
- # Micro::Case::Strict 81.513k3.4%) i/s - 411.150k in 5.049962s
1209
- # Micro::Case::Safe 101.497k3.1%) i/s - 512.907k in 5.058463s
1220
+ # Interactor 29.101k (± 2.1%) i/s - 145.750k in 5.010660s
1221
+ # Trailblazer::Operation 15.031k2.0%) i/s - 75.607k in 5.032071s
1222
+ # Dry::Monads 141.730k (± 3.1%) i/s - 714.400k in 5.045546s
1223
+ # Dry::Transaction 5.674k1.9%) i/s - 28.550k in 5.033564s
1224
+ # Micro::Case 103.541k1.6%) i/s - 520.900k in 5.032077s
1225
+ # Micro::Case::Strict 83.045k2.4%) i/s - 423.096k in 5.098031s
1226
+ # Micro::Case::Safe 101.662k1.5%) i/s - 512.700k in 5.044386s
1210
1227
 
1211
1228
  # Comparison:
1212
- # Dry::Monads: 139037.7 i/s
1213
- # Micro::Case::Safe: 101497.3 i/s - 1.37x (± 0.00) slower
1214
- # Micro::Case: 100711.6 i/s - 1.38x (± 0.00) slower
1215
- # Micro::Case::Strict: 81512.9 i/s - 1.71x (± 0.00) slower
1216
- # Interactor: 30694.2 i/s - 4.53x (± 0.00) slower
1217
- # Trailblazer::Operation: 14580.8 i/s - 9.54x (± 0.00) slower
1218
- # Dry::Transaction: 5728.0 i/s - 24.27x (± 0.00) slower
1229
+ # Dry::Monads: 141730.1 i/s
1230
+ # Micro::Case: 103541.3 i/s - 1.37x (± 0.00) slower
1231
+ # Micro::Case::Safe: 101662.2 i/s - 1.39x (± 0.00) slower
1232
+ # Micro::Case::Strict: 83044.6 i/s - 1.71x (± 0.00) slower
1233
+ # Interactor: 29100.8 i/s - 4.87x (± 0.00) slower
1234
+ # Trailblazer::Operation: 15031.4 i/s - 9.43x (± 0.00) slower
1235
+ # Dry::Transaction: 5674.0 i/s - 24.98x (± 0.00) slower
1219
1236
  ```
1220
1237
  </details>
1221
1238
 
@@ -1225,42 +1242,42 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_success_r
1225
1242
 
1226
1243
  | Gem / Abstração | Iterações por segundo | Comparação |
1227
1244
  | ----------------- | --------------------: | ----------------: |
1228
- | **Micro::Case** | 94619.6 | _**O mais rápido**_ |
1229
- | Dry::Monads | 70250.6 | 1.35x slower |
1230
- | Trailblazer::Operation | 14786.1 | 6.40x slower |
1231
- | Interactor | 13770.0 | 6.87x slower |
1232
- | Dry::Transaction | 4994.4 | 18.95x slower |
1245
+ | **Micro::Case** | 98820.8 | _**O mais rápido**_ |
1246
+ | Dry::Monads | 71329.7 | 1.39x slower |
1247
+ | Trailblazer::Operation | 15034.9 | 6.57x slower |
1248
+ | Interactor | 13958.7 | 7.08x slower |
1249
+ | Dry::Transaction | 5067.5 | 19.50x slower |
1233
1250
 
1234
1251
  <details>
1235
1252
  <summary>Mostrar o resultado completo do <a href="https://github.com/evanphx/benchmark-ips">benchmark/ips</a>.</summary>
1236
1253
 
1237
1254
  ```ruby
1238
1255
  # Warming up --------------------------------------
1239
- # Interactor 1.408k i/100ms
1240
- # Trailblazer::Operation 1.492k i/100ms
1241
- # Dry::Monads 7.224k i/100ms
1242
- # Dry::Transaction 501.000 i/100ms
1243
- # Micro::Case 9.664k i/100ms
1244
- # Micro::Case::Strict 7.823k i/100ms
1245
- # Micro::Case::Safe 9.464k i/100ms
1256
+ # Interactor 1.324k i/100ms
1257
+ # Trailblazer::Operation 1.525k i/100ms
1258
+ # Dry::Monads 7.126k i/100ms
1259
+ # Dry::Transaction 499.000 i/100ms
1260
+ # Micro::Case 9.919k i/100ms
1261
+ # Micro::Case::Strict 7.837k i/100ms
1262
+ # Micro::Case::Safe 9.762k i/100ms
1246
1263
 
1247
1264
  # Calculating -------------------------------------
1248
- # Interactor 13.770k4.3%) i/s - 68.992k in 5.020330s
1249
- # Trailblazer::Operation 14.786k5.3%) i/s - 74.600k in 5.064700s
1250
- # Dry::Monads 70.251k6.7%) i/s - 353.976k in 5.063010s
1251
- # Dry::Transaction 4.994k4.0%) i/s - 25.050k in 5.023997s
1252
- # Micro::Case 94.620k3.8%) i/s - 473.536k in 5.012483s
1253
- # Micro::Case::Strict 76.059k (± 3.0%) i/s - 383.327k in 5.044482s
1254
- # Micro::Case::Safe 91.719k5.6%) i/s - 463.736k in 5.072552s
1265
+ # Interactor 13.959k2.5%) i/s - 70.172k in 5.030240s
1266
+ # Trailblazer::Operation 15.035k2.2%) i/s - 76.250k in 5.074108s
1267
+ # Dry::Monads 71.330k2.4%) i/s - 363.426k in 5.097993s
1268
+ # Dry::Transaction 5.068k1.9%) i/s - 25.449k in 5.023922s
1269
+ # Micro::Case 98.821k2.9%) i/s - 495.950k in 5.023421s
1270
+ # Micro::Case::Strict 79.936k (± 3.1%) i/s - 399.687k in 5.005435s
1271
+ # Micro::Case::Safe 98.695k1.9%) i/s - 497.862k in 5.046246s
1255
1272
 
1256
1273
  # Comparison:
1257
- # Micro::Case: 94619.6 i/s
1258
- # Micro::Case::Safe: 91719.4 i/s - same-ish: difference falls within error
1259
- # Micro::Case::Strict: 76058.7 i/s - 1.24x (± 0.00) slower
1260
- # Dry::Monads: 70250.6 i/s - 1.35x (± 0.00) slower
1261
- # Trailblazer::Operation: 14786.1 i/s - 6.40x (± 0.00) slower
1262
- # Interactor: 13770.0 i/s - 6.87x (± 0.00) slower
1263
- # Dry::Transaction: 4994.4 i/s - 18.95x (± 0.00) slower
1274
+ # Micro::Case: 98820.8 i/s
1275
+ # Micro::Case::Safe: 98695.0 i/s - same-ish: difference falls within error
1276
+ # Micro::Case::Strict: 79935.9 i/s - 1.24x (± 0.00) slower
1277
+ # Dry::Monads: 71329.7 i/s - 1.39x (± 0.00) slower
1278
+ # Trailblazer::Operation: 15034.9 i/s - 6.57x (± 0.00) slower
1279
+ # Interactor: 13958.7 i/s - 7.08x (± 0.00) slower
1280
+ # Dry::Transaction: 5067.5 i/s - 19.50x (± 0.00) slower
1264
1281
  ```
1265
1282
  </details>
1266
1283
 
@@ -1268,15 +1285,16 @@ 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
  | ------------------------------------------- | ----------------: | ----------------: |
1275
1292
  | Micro::Case internal flow (private methods) | _**O mais rápido**_ | _**O mais rápido**_ |
1276
- | Micro::Case `then` method | 1.48x slower | 0x slower |
1277
- | Micro::Cases.flow | 1.62x slower | 1.16x slower |
1278
- | Micro::Cases.safe_flow | 1.64x slower | 1.16x slower |
1279
- | Interactor::Organizer | 1.95x slower | 6.17x slower |
1293
+ | Micro::Case internal flow (through lambdas) | 1.03x slower | 1.04x slower |
1294
+ | Micro::Case `then` method | 1.49x slower | 0x slower |
1295
+ | Micro::Cases.flow | 1.53x slower | 1.04x slower |
1296
+ | Micro::Cases.safe_flow | 1.54x slower | 1.04x slower |
1297
+ | Interactor::Organizer | 2.05x slower | 6.27x slower |
1280
1298
 
1281
1299
  \* As gems `Dry::Monads`, `Dry::Transaction`, `Trailblazer::Operation` estão fora desta análise por não terem esse tipo de funcionalidade.
1282
1300
 
@@ -1285,25 +1303,40 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
1285
1303
 
1286
1304
  ```ruby
1287
1305
  # Warming up --------------------------------------
1288
- # Interactor::Organizer 5.219k i/100ms
1289
- # Micro::Cases.flow([]) 6.451k i/100ms
1290
- # Micro::Cases::safe_flow([]) 6.421k i/100ms
1291
- # Micro::Case flow using `then` method 7.139k i/100ms
1292
- # Micro::Case flow using private methods 10.355k i/100ms
1306
+ # Interactor::Organizer
1307
+ # 4.837k i/100ms
1308
+ # Micro::Cases.flow([])
1309
+ # 6.755k i/100ms
1310
+ # Micro::Cases::safe_flow([])
1311
+ # 6.809k i/100ms
1312
+ # Micro::Case flow using `then` method
1313
+ # 6.968k i/100ms
1314
+ # Micro::Case flow using private methods
1315
+ # 10.362k i/100ms
1316
+ # Micro::Case flow using private methods through lambdas
1317
+ # 10.258k i/100ms
1293
1318
 
1294
1319
  # Calculating -------------------------------------
1295
- # Interactor::Organizer 52.959k (± 1.7%) i/s - 266.169k in 5.027332s
1296
- # Micro::Cases.flow([]) 63.947k (± 1.7%) i/s - 322.550k in 5.045597s
1297
- # Micro::Cases::safe_flow([]) 63.047k (± 3.1%) i/s - 321.050k in 5.097228s
1298
- # Micro::Case flow using `then` method 69.644k4.0%) i/s - 349.811k in 5.031120s
1299
- # Micro::Case flow using private methods 103.297k (± 1.4%) i/s - 517.750k in 5.013254s
1320
+ # Interactor::Organizer
1321
+ # 50.731k (± 1.6%) i/s - 256.361k in 5.054694s
1322
+ # Micro::Cases.flow([])
1323
+ # 67.757k1.6%) i/s - 344.505k in 5.085681s
1324
+ # Micro::Cases::safe_flow([])
1325
+ # 67.613k (± 1.6%) i/s - 340.450k in 5.036562s
1326
+ # Micro::Case flow using `then` method
1327
+ # 69.483k (± 1.5%) i/s - 348.400k in 5.015351s
1328
+ # Micro::Case flow using private methods
1329
+ # 103.788k (± 1.0%) i/s - 528.462k in 5.092240s
1330
+ # Micro::Case flow using private methods through lambdas
1331
+ # 101.081k (± 1.2%) i/s - 512.900k in 5.074904s
1300
1332
 
1301
1333
  # Comparison:
1302
- # Micro::Case flow using private methods: 103297.4 i/s
1303
- # Micro::Case flow using `then` method: 69644.0 i/s - 1.48x (± 0.00) slower
1304
- # Micro::Cases.flow([]): 63946.7 i/s - 1.62x (± 0.00) slower
1305
- # Micro::Cases::safe_flow([]): 63047.2 i/s - 1.64x (± 0.00) slower
1306
- # Interactor::Organizer: 52958.9 i/s - 1.95x (± 0.00) slower
1334
+ # Micro::Case flow using private methods: 103787.5 i/s
1335
+ # Micro::Case flow using private methods through lambdas: 101080.6 i/s - 1.03x (± 0.00) slower
1336
+ # Micro::Case flow using `then` method: 69483.3 i/s - 1.49x (± 0.00) slower
1337
+ # Micro::Cases.flow([]): 67757.2 i/s - 1.53x (± 0.00) slower
1338
+ # Micro::Cases::safe_flow([]): 67613.3 i/s - 1.54x (± 0.00) slower
1339
+ # Interactor::Organizer: 50730.8 i/s - 2.05x (± 0.00) slower
1307
1340
  ```
1308
1341
  </details>
1309
1342
 
@@ -1312,25 +1345,39 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
1312
1345
 
1313
1346
  ```ruby
1314
1347
  # Warming up --------------------------------------
1315
- # Interactor::Organizer 2.381k i/100ms
1316
- # Micro::Cases.flow([]) 12.003k i/100ms
1317
- # Micro::Cases::safe_flow([]) 12.771k i/100ms
1318
- # Micro::Case flow using `then` method 15.085k i/100ms
1319
- # Micro::Case flow using private methods 14.254k i/100ms
1320
-
1348
+ # Interactor::Organizer
1349
+ # 2.299k i/100ms
1350
+ # Micro::Cases.flow([])
1351
+ # 14.187k i/100ms
1352
+ # Micro::Cases::safe_flow([])
1353
+ # 13.609k i/100ms
1354
+ # Micro::Case flow using `then` method
1355
+ # 14.578k i/100ms
1356
+ # Micro::Case flow using private methods
1357
+ # 14.101k i/100ms
1358
+ # Micro::Case flow using private methods through lambdas
1359
+ # 13.670k i/100ms
1321
1360
  # Calculating -------------------------------------
1322
- # Interactor::Organizer 23.579k (± 3.2%) i/s - 119.050k in 5.054410s
1323
- # Micro::Cases.flow([]) 124.072k3.4%) i/s - 624.156k in 5.036618s
1324
- # Micro::Cases::safe_flow([]) 124.894k (± 3.6%) i/s - 625.779k in 5.017494s
1325
- # Micro::Case flow using `then` method 145.370k4.8%) i/s - 739.165k in 5.096972s
1326
- # Micro::Case flow using private methods 139.753k (± 5.6%) i/s - 698.446k in 5.015207s
1361
+ # Interactor::Organizer
1362
+ # 23.306k2.1%) i/s - 117.249k in 5.033171s
1363
+ # Micro::Cases.flow([])
1364
+ # 140.111k1.6%) i/s - 709.350k in 5.064041s
1365
+ # Micro::Cases::safe_flow([])
1366
+ # 139.927k (± 1.7%) i/s - 707.668k in 5.058971s
1367
+ # Micro::Case flow using `then` method
1368
+ # 146.073k (± 2.0%) i/s - 743.478k in 5.091741s
1369
+ # Micro::Case flow using private methods
1370
+ # 142.092k (± 1.5%) i/s - 719.151k in 5.062298s
1371
+ # Micro::Case flow using private methods through lambdas
1372
+ # 140.791k (± 1.2%) i/s - 710.840k in 5.049584s
1327
1373
 
1328
1374
  # Comparison:
1329
- # Micro::Case flow using `then` method: 145369.7 i/s
1330
- # Micro::Case flow using private methods: 139753.4 i/s - same-ish: difference falls within error
1331
- # Micro::Cases::safe_flow([]): 124893.7 i/s - 1.16x (± 0.00) slower
1332
- # Micro::Cases.flow([]): 124071.8 i/s - 1.17x (± 0.00) slower
1333
- # Interactor::Organizer: 23578.7 i/s - 6.17x (± 0.00) slower
1375
+ # Micro::Case flow using `then` method: 146073.0 i/s
1376
+ # Micro::Case flow using private methods: 142091.7 i/s - same-ish: difference falls within error
1377
+ # Micro::Case flow using private methods through lambdas: 140791.1 i/s - 1.04x (± 0.00) slower
1378
+ # Micro::Cases.flow([]): 140110.8 i/s - 1.04x (± 0.00) slower
1379
+ # Micro::Cases::safe_flow([]): 139926.6 i/s - 1.04x (± 0.00) slower
1380
+ # Interactor::Organizer: 23305.9 i/s - 6.27x (± 0.00) slower
1334
1381
  ```
1335
1382
  </details>
1336
1383
 
@@ -1347,24 +1394,24 @@ Confira as implementações do mesmo caso de uso com diferentes gems/abstraçõe
1347
1394
 
1348
1395
  ## Exemplos
1349
1396
 
1350
- ### 1️⃣ Rails App (API)
1397
+ ### 1️⃣ Criação de usuários
1398
+
1399
+ > Um exemplo de fluxo que define etapas para higienizar, validar e persistir seus dados de entrada. Ele tem todas as abordagens possíveis para representar casos de uso com a gem `u-case`.
1400
+ >
1401
+ > Link: https://github.com/serradura/u-case/blob/main/examples/users_creation
1402
+
1403
+ ### 2️⃣ Rails App (API)
1351
1404
 
1352
1405
  > Este projeto mostra diferentes tipos de arquitetura (uma por commit), e na última, como usar a gem `Micro::Case` para lidar com a lógica de negócios da aplicação.
1353
1406
  >
1354
1407
  > Link: https://github.com/serradura/from-fat-controllers-to-use-cases
1355
1408
 
1356
- ### 2️⃣ CLI calculator
1409
+ ### 3️⃣ CLI calculator
1357
1410
 
1358
1411
  > Rake tasks para demonstrar como lidar com os dados do usuário e como usar diferentes tipos de falha para controlar o fluxo do programa.
1359
1412
  >
1360
1413
  > Link: https://github.com/serradura/u-case/tree/main/examples/calculator
1361
1414
 
1362
- ### 3️⃣ Criação de usuários
1363
-
1364
- > Um exemplo de fluxo de caso de uso que define etapas para higienizar, validar e persistir seus dados de entrada.
1365
- >
1366
- > Link: https://github.com/serradura/u-case/blob/main/examples/users_creation.rb
1367
-
1368
1415
  ### 4️⃣ Interceptando exceções dentro dos casos de uso
1369
1416
 
1370
1417
  > Link: https://github.com/serradura/u-case/blob/main/examples/rescuing_exceptions.rb