u-case 3.0.0 → 4.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.
@@ -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 - Represent use cases in a simple and powerful way while writing modular, expressive and sequentially logical code.">
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> Represente casos de uso de forma simples e poderosa ao escrever código modular, expressivo e sequencialmente lógico.</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,15 @@ 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
+ unreleased| https://github.com/serradura/u-case/blob/main/README.md
42
+ 4.2.0 | https://github.com/serradura/u-case/blob/v4.x/README.md
43
+ 3.1.0 | https://github.com/serradura/u-case/blob/v3.x/README.md
25
44
  2.6.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
26
45
  1.1.0 | https://github.com/serradura/u-case/blob/v1.x/README.md
27
46
 
@@ -33,7 +52,7 @@ Versão | Documentação
33
52
  - [`Micro::Case` - Como definir um caso de uso?](#microcase---como-definir-um-caso-de-uso)
34
53
  - [`Micro::Case::Result` - O que é o resultado de um caso de uso?](#microcaseresult---o-que-é-o-resultado-de-um-caso-de-uso)
35
54
  - [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)
55
+ - [Como definir tipos customizados de resultados?](#como-definir-tipos-customizados-de-resultados)
37
56
  - [É possível definir um tipo sem definir os dados do resultado?](#é-possível-definir-um-tipo-sem-definir-os-dados-do-resultado)
38
57
  - [Como utilizar os hooks dos resultados?](#como-utilizar-os-hooks-dos-resultados)
39
58
  - [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 +78,13 @@ Versão | Documentação
59
78
  - [`Kind::Validator`](#kindvalidator)
60
79
  - [`Micro::Case.config`](#microcaseconfig)
61
80
  - [Benchmarks](#benchmarks)
62
- - [`Micro::Case` (v3.0.0)](#microcase-v300)
81
+ - [`Micro::Case`](#microcase)
63
82
  - [Success results](#success-results)
64
83
  - [Failure results](#failure-results)
65
- - [`Micro::Cases::Flow` (v3.0.0)](#microcasesflow-v300)
84
+ - [`Micro::Cases::Flow`](#microcasesflow)
85
+ - [Execuntando os benchmarks](#execuntando-os-benchmarks)
86
+ - [Performance (Benchmarks IPS)](#performance-benchmarks-ips)
87
+ - [Memory profiling](#memory-profiling)
66
88
  - [Comparações](#comparações)
67
89
  - [Exemplos](#exemplos)
68
90
  - [1️⃣ Criação de usuários](#1️⃣-criação-de-usuários)
@@ -76,11 +98,12 @@ Versão | Documentação
76
98
 
77
99
  ## Compatibilidade
78
100
 
79
- | u-case | branch | ruby | activemodel |
80
- | -------------- | ------- | -------- | ------------- |
81
- | 3.0.0 | main | >= 2.2.0 | >= 3.2, < 6.1 |
82
- | 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 |
83
- | 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 |
101
+ | u-case | branch | ruby | activemodel | u-attributes |
102
+ | -------------- | ------- | -------- | ------------- | ------------ |
103
+ | 4.2.0 | main | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
104
+ | 3.1.0 | v3.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
105
+ | 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
106
+ | 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
84
107
 
85
108
  > Nota: O activemodel é uma dependência opcional, esse módulo que [pode ser habilitado](#u-casewith_activemodel_validation---como-validar-os-atributos-do-caso-de-uso) para validar os atributos dos casos de uso.
86
109
 
@@ -101,7 +124,7 @@ Versão | Documentação
101
124
  Adicione essa linha ao Gemfile da sua aplicação:
102
125
 
103
126
  ```ruby
104
- gem 'u-case', '~> 3.0.0'
127
+ gem 'u-case', '~> 4.1.0'
105
128
  ```
106
129
 
107
130
  E então execute:
@@ -110,7 +133,7 @@ E então execute:
110
133
 
111
134
  Ou instale manualmente:
112
135
 
113
- $ gem install u-case --pre
136
+ $ gem install u-case
114
137
 
115
138
  ## Uso
116
139
 
@@ -161,18 +184,18 @@ bad_result.data # { message: "`a` and `b` attributes must be numeric" }
161
184
  ### `Micro::Case::Result` - O que é o resultado de um caso de uso?
162
185
 
163
186
  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).
187
+ - `#success?` retorna `true` se for um resultado de sucesso.
188
+ - `#failure?` retorna `true` se for um resultado de falha.
189
+ - `#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
190
  - `#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).
191
+ - `#data` os dados do resultado (um `Hash`).
169
192
  - `#[]` e `#values_at` são atalhos para acessar as propriedades do `#data`.
170
193
  - `#key?` retorna `true` se a chave estiver present no `#data`.
171
194
  - `#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.
195
+ - `#slice` retorna um novo `Hash` que inclui apenas as chaves fornecidas. Se as chaves fornecidas não existirem, um `Hash` vazio será retornado.
173
196
  - `#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).
197
+ - `#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.
198
+ - `#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
199
 
177
200
  > **Nota:** por conta de retrocompatibilidade, você pode usar o método `#value` como um alias para o método `#data`.
178
201
 
@@ -180,9 +203,9 @@ Um `Micro::Case::Result` armazena os dados de output de um caso de uso. Esses s
180
203
 
181
204
  #### O que são os tipos de resultados?
182
205
 
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
206
+ Todo resultado tem um tipo (`#type`), e estes são os valores padrões:
207
+ - `:ok` em casos de sucesso;
208
+ - `:error` ou `:exception` em casos de falhas.
186
209
 
187
210
  ```ruby
188
211
  class Divide < Micro::Case
@@ -238,9 +261,9 @@ err_result.use_case # #<Divide:0x0000 @__attributes={"a"=>2, "b"=>0}, @a=2, @b=0
238
261
 
239
262
  [⬆️ Voltar para o índice](#índice-)
240
263
 
241
- #### Como difinir tipos customizados de resultados?
264
+ #### Como definir tipos customizados de resultados?
242
265
 
243
- Resposta: Use um Symbol com argumento dos métodos `Success()`, `Failure()` e declare o `result:` keyword para definir os dados do resultado.
266
+ Resposta: Use um `Symbol` com argumento dos métodos `Success()`, `Failure()` e declare o `result:` keyword para definir os dados do resultado.
244
267
 
245
268
  ```ruby
246
269
  class Multiply < Micro::Case
@@ -310,10 +333,10 @@ result.use_case.attributes # {"a"=>2, "b"=>"2"}
310
333
 
311
334
  #### Como utilizar os hooks dos resultados?
312
335
 
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:
336
+ 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
337
  `#on_success`, `on_failure`.
315
338
 
316
- Os exemplos abaixo demonstram eles em uso:
339
+ Os exemplos abaixo os demonstram em uso:
317
340
 
318
341
  ```ruby
319
342
  class Double < Micro::Case
@@ -457,7 +480,7 @@ result[:number] * 4 == accum # true
457
480
 
458
481
  #### Como usar o método `Micro::Case::Result#then`?
459
482
 
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:
483
+ 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
484
 
462
485
  ```ruby
463
486
  class ForbidNegativeNumber < Micro::Case
@@ -715,7 +738,7 @@ DoubleAllNumbersAndSquareAndAdd2
715
738
 
716
739
  #### É 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
740
 
718
- Resposta: Sim, é possível! Veja o exemplo abaixo para entender como funciona o acumulp de dados dentro da execução de um fluxo.
741
+ 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
742
 
720
743
  ```ruby
721
744
  module Users
@@ -955,7 +978,7 @@ end
955
978
 
956
979
  #### `Micro::Case::Result#on_exception`
957
980
 
958
- Se você precisar lidar com um erro específico, recomendo o uso de uma instrução case. por exemplo:
981
+ Se você precisar lidar com um erro específico, recomendo o uso de uma instrução case. Exemplo:
959
982
 
960
983
  ```ruby
961
984
  result.on_failure(:exception) do |data, use_case|
@@ -1174,110 +1197,112 @@ end
1174
1197
 
1175
1198
  ## Benchmarks
1176
1199
 
1177
- ### `Micro::Case` (v3.0.0)
1200
+ ### `Micro::Case`
1178
1201
 
1179
1202
  #### Success results
1180
1203
 
1181
- | Gem / Abstração | Iterações por segundo | Comparação |
1182
- | ----------------- | --------------------: | ----------------: |
1183
- | Dry::Monads | 141730.1 | _**O mais rápido**_ |
1184
- | **Micro::Case** | 103541.3 | 1.37x slower |
1185
- | Interactor | 29100.8 | 4.87x slower |
1186
- | Trailblazer::Operation | 15031.4 | 9.43x slower |
1187
- | Dry::Transaction | 5674.0 | 24.98x slower |
1204
+ | Gem / Abstração | Iterações por segundo | Comparação |
1205
+ | ----------------- | --------------------: | -------------------: |
1206
+ | Dry::Monads | 315635.1 | _**O mais rápido**_ |
1207
+ | **Micro::Case** | 75837.7 | 4.16x mais lento |
1208
+ | Interactor | 59745.5 | 5.28x mais lento |
1209
+ | Trailblazer::Operation | 28423.9 | 11.10x mais lento |
1210
+ | Dry::Transaction | 10130.9 | 31.16x mais lento |
1188
1211
 
1189
1212
  <details>
1190
1213
  <summary>Show the full <a href="https://github.com/evanphx/benchmark-ips">benchmark/ips</a> results.</summary>
1191
1214
 
1192
1215
  ```ruby
1193
1216
  # Warming up --------------------------------------
1194
- # Interactor 2.915k i/100ms
1195
- # Trailblazer::Operation 1.543k i/100ms
1196
- # Dry::Monads 14.288k i/100ms
1197
- # Dry::Transaction 571.000 i/100ms
1198
- # Micro::Case 10.418k i/100ms
1199
- # Micro::Case::Strict 8.296k i/100ms
1200
- # Micro::Case::Safe 10.254k i/100ms
1217
+ # Interactor 5.711k i/100ms
1218
+ # Trailblazer::Operation
1219
+ # 2.283k i/100ms
1220
+ # Dry::Monads 31.130k i/100ms
1221
+ # Dry::Transaction 994.000 i/100ms
1222
+ # Micro::Case 7.911k i/100ms
1223
+ # Micro::Case::Safe 7.911k i/100ms
1224
+ # Micro::Case::Strict 6.248k i/100ms
1201
1225
 
1202
1226
  # Calculating -------------------------------------
1203
- # Interactor 29.101k 2.1%) i/s - 145.750k in 5.010660s
1204
- # Trailblazer::Operation 15.031k (± 2.0%) i/s - 75.607k in 5.032071s
1205
- # Dry::Monads 141.730k 3.1%) i/s - 714.400k in 5.045546s
1206
- # Dry::Transaction 5.674k (± 1.9%) i/s - 28.550k in 5.033564s
1207
- # Micro::Case 103.541k1.6%) i/s - 520.900k in 5.032077s
1208
- # Micro::Case::Strict 83.045k2.4%) i/s - 423.096k in 5.098031s
1209
- # Micro::Case::Safe 101.662k 1.5%) i/s - 512.700k in 5.044386s
1227
+ # Interactor 59.746k29.9%) i/s - 274.128k in 5.049901s
1228
+ # Trailblazer::Operation
1229
+ # 28.424k15.8%) i/s - 141.546k in 5.087882s
1230
+ # Dry::Monads 315.635k6.1%) i/s - 1.588M in 5.048914s
1231
+ # Dry::Transaction 10.131k6.4%) i/s - 50.694k in 5.025150s
1232
+ # Micro::Case 75.838k9.7%) i/s - 379.728k in 5.052573s
1233
+ # Micro::Case::Safe 75.461k10.1%) i/s - 379.728k in 5.079238s
1234
+ # Micro::Case::Strict 64.235k (± 9.0%) i/s - 324.896k in 5.097028s
1210
1235
 
1211
1236
  # Comparison:
1212
- # Dry::Monads: 141730.1 i/s
1213
- # Micro::Case: 103541.3 i/s - 1.37x (± 0.00) slower
1214
- # Micro::Case::Safe: 101662.2 i/s - 1.39x (± 0.00) slower
1215
- # Micro::Case::Strict: 83044.6 i/s - 1.71x (± 0.00) slower
1216
- # Interactor: 29100.8 i/s - 4.87x (± 0.00) slower
1217
- # Trailblazer::Operation: 15031.4 i/s - 9.43x (± 0.00) slower
1218
- # Dry::Transaction: 5674.0 i/s - 24.98x (± 0.00) slower
1237
+ # Dry::Monads: 315635.1 i/s
1238
+ # Micro::Case: 75837.7 i/s - 4.16x (± 0.00) slower
1239
+ # Micro::Case::Safe: 75461.3 i/s - 4.18x (± 0.00) slower
1240
+ # Micro::Case::Strict: 64234.9 i/s - 4.91x (± 0.00) slower
1241
+ # Interactor: 59745.5 i/s - 5.28x (± 0.00) slower
1242
+ # Trailblazer::Operation: 28423.9 i/s - 11.10x (± 0.00) slower
1243
+ # Dry::Transaction: 10130.9 i/s - 31.16x (± 0.00) slower
1219
1244
  ```
1220
1245
  </details>
1221
1246
 
1222
- https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_success_result.rb
1247
+ https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/use_case/success_results.
1223
1248
 
1224
1249
  #### Failure results
1225
1250
 
1226
- | Gem / Abstração | Iterações por segundo | Comparação |
1227
- | ----------------- | --------------------: | ----------------: |
1228
- | **Micro::Case** | 98820.8 | _**O mais rápido**_ |
1229
- | Dry::Monads | 71329.7 | 1.39x slower |
1230
- | Trailblazer::Operation | 15034.9 | 6.57x slower |
1231
- | Interactor | 13958.7 | 7.08x slower |
1232
- | Dry::Transaction | 5067.5 | 19.50x slower |
1251
+ | Gem / Abstração | Iterações por segundo | Comparação |
1252
+ | ----------------- | --------------------: | -------------------: |
1253
+ | Dry::Monads | 135386.9 | _**O mais rápido**_ |
1254
+ | **Micro::Case** | 73489.3 | 1.85x mais lento |
1255
+ | Trailblazer::Operation | 29016.4 | 4.67x mais lento |
1256
+ | Interactor | 27037.0 | 5.01x mais lento |
1257
+ | Dry::Transaction | 8988.6 | 15.06x mais lento |
1233
1258
 
1234
1259
  <details>
1235
1260
  <summary>Mostrar o resultado completo do <a href="https://github.com/evanphx/benchmark-ips">benchmark/ips</a>.</summary>
1236
1261
 
1237
1262
  ```ruby
1238
1263
  # Warming up --------------------------------------
1239
- # Interactor 1.324k i/100ms
1240
- # Trailblazer::Operation 1.525k i/100ms
1241
- # Dry::Monads 7.126k i/100ms
1242
- # Dry::Transaction 499.000 i/100ms
1243
- # Micro::Case 9.919k i/100ms
1244
- # Micro::Case::Strict 7.837k i/100ms
1245
- # Micro::Case::Safe 9.762k i/100ms
1264
+ # Interactor 2.626k i/100ms
1265
+ # Trailblazer::Operation 2.343k i/100ms
1266
+ # Dry::Monads 13.386k i/100ms
1267
+ # Dry::Transaction 868.000 i/100ms
1268
+ # Micro::Case 7.603k i/100ms
1269
+ # Micro::Case::Safe 7.598k i/100ms
1270
+ # Micro::Case::Strict 6.178k i/100ms
1246
1271
 
1247
1272
  # Calculating -------------------------------------
1248
- # Interactor 13.959k 2.5%) i/s - 70.172k in 5.030240s
1249
- # Trailblazer::Operation 15.035k 2.2%) i/s - 76.250k in 5.074108s
1250
- # Dry::Monads 71.330k 2.4%) i/s - 363.426k in 5.097993s
1251
- # Dry::Transaction 5.068k1.9%) i/s - 25.449k in 5.023922s
1252
- # Micro::Case 98.821k2.9%) i/s - 495.950k in 5.023421s
1253
- # Micro::Case::Strict 79.936k3.1%) i/s - 399.687k in 5.005435s
1254
- # Micro::Case::Safe 98.695k1.9%) i/s - 497.862k in 5.046246s
1273
+ # Interactor 27.037k24.9%) i/s - 128.674k in 5.102133s
1274
+ # Trailblazer::Operation 29.016k12.4%) i/s - 145.266k in 5.074991s
1275
+ # Dry::Monads 135.387k15.1%) i/s - 669.300k in 5.055356s
1276
+ # Dry::Transaction 8.989k9.2%) i/s - 45.136k in 5.084820s
1277
+ # Micro::Case 73.247k9.9%) i/s - 364.944k in 5.030449s
1278
+ # Micro::Case::Safe 73.489k9.6%) i/s - 364.704k in 5.007282s
1279
+ # Micro::Case::Strict 61.980k8.0%) i/s - 308.900k in 5.014821s
1255
1280
 
1256
1281
  # Comparison:
1257
- # Micro::Case: 98820.8 i/s
1258
- # Micro::Case::Safe: 98695.0 i/s - same-ish: difference falls within error
1259
- # Micro::Case::Strict: 79935.9 i/s - 1.24x (± 0.00) slower
1260
- # Dry::Monads: 71329.7 i/s - 1.39x (± 0.00) slower
1261
- # Trailblazer::Operation: 15034.9 i/s - 6.57x (± 0.00) slower
1262
- # Interactor: 13958.7 i/s - 7.08x (± 0.00) slower
1263
- # Dry::Transaction: 5067.5 i/s - 19.50x (± 0.00) slower
1282
+ # Dry::Monads: 135386.9 i/s
1283
+ # Micro::Case::Safe: 73489.3 i/s - 1.84x (± 0.00) slower
1284
+ # Micro::Case: 73246.6 i/s - 1.85x (± 0.00) slower
1285
+ # Micro::Case::Strict: 61979.7 i/s - 2.18x (± 0.00) slower
1286
+ # Trailblazer::Operation: 29016.4 i/s - 4.67x (± 0.00) slower
1287
+ # Interactor: 27037.0 i/s - 5.01x (± 0.00) slower
1288
+ # Dry::Transaction: 8988.6 i/s - 15.06x (± 0.00) slower
1264
1289
  ```
1265
1290
  </details>
1266
1291
 
1267
- https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_result.rb
1292
+ https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/use_case/failure_results.
1268
1293
 
1269
1294
  ---
1270
1295
 
1271
- ### `Micro::Cases::Flow` (v3.0.0)
1296
+ ### `Micro::Cases::Flow`
1272
1297
 
1273
- | 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) |
1298
+ | Gem / Abstração | [Resultados de sucesso](https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/flow/success_results.rb) | [Resultados de falha](https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/flow/failure_results.rb) |
1274
1299
  | ------------------------------------------- | ----------------: | ----------------: |
1275
- | Micro::Case internal flow (private methods) | _**O mais rápido**_ | _**O mais rápido**_ |
1276
- | Micro::Case internal flow (through lambdas) | 1.03x slower | 1.04x slower |
1277
- | Micro::Case `then` method | 1.49x slower | 0x slower |
1278
- | Micro::Cases.flow | 1.53x slower | 1.04x slower |
1279
- | Micro::Cases.safe_flow | 1.54x slower | 1.04x slower |
1280
- | Interactor::Organizer | 2.05x slower | 6.27x slower |
1300
+ | Micro::Case::Result `pipe` method | 80936.2 i/s | 78280.4 i/s |
1301
+ | Micro::Case::Result `then` method | 0x mais lento | 0x mais lento |
1302
+ | Micro::Cases.flow | 0x mais lento | 0x mais lento |
1303
+ | Micro::Case class with an inner flow | 1.72x mais lento | 1.68x mais lento |
1304
+ | Micro::Case class including itself as a step| 1.93x mais lento | 1.87x mais lento |
1305
+ | Interactor::Organizer | 3.33x mais lento | 3.22x mais lento |
1281
1306
 
1282
1307
  \* As gems `Dry::Monads`, `Dry::Transaction`, `Trailblazer::Operation` estão fora desta análise por não terem esse tipo de funcionalidade.
1283
1308
 
@@ -1286,40 +1311,28 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
1286
1311
 
1287
1312
  ```ruby
1288
1313
  # Warming up --------------------------------------
1289
- # Interactor::Organizer
1290
- # 4.837k i/100ms
1291
- # Micro::Cases.flow([])
1292
- # 6.755k i/100ms
1293
- # Micro::Cases::safe_flow([])
1294
- # 6.809k i/100ms
1295
- # Micro::Case flow using `then` method
1296
- # 6.968k i/100ms
1297
- # Micro::Case flow using private methods
1298
- # 10.362k i/100ms
1299
- # Micro::Case flow using private methods through lambdas
1300
- # 10.258k i/100ms
1314
+ # Interactor::Organizer 1.809k i/100ms
1315
+ # Micro::Cases.flow([]) 7.808k i/100ms
1316
+ # Micro::Case flow in a class 4.816k i/100ms
1317
+ # Micro::Case including the class 4.094k i/100ms
1318
+ # Micro::Case::Result#| 7.656k i/100ms
1319
+ # Micro::Case::Result#then 7.138k i/100ms
1301
1320
 
1302
1321
  # Calculating -------------------------------------
1303
- # Interactor::Organizer
1304
- # 50.731k 1.6%) i/s - 256.361k in 5.054694s
1305
- # Micro::Cases.flow([])
1306
- # 67.757k1.6%) i/s - 344.505k in 5.085681s
1307
- # Micro::Cases::safe_flow([])
1308
- # 67.613k1.6%) i/s - 340.450k in 5.036562s
1309
- # Micro::Case flow using `then` method
1310
- # 69.483k (± 1.5%) i/s - 348.400k in 5.015351s
1311
- # Micro::Case flow using private methods
1312
- # 103.788k (± 1.0%) i/s - 528.462k in 5.092240s
1313
- # Micro::Case flow using private methods through lambdas
1314
- # 101.081k (± 1.2%) i/s - 512.900k in 5.074904s
1322
+ # Interactor::Organizer 24.290k (±24.0%) i/s - 113.967k in 5.032825s
1323
+ # Micro::Cases.flow([]) 74.790k11.1%) i/s - 374.784k in 5.071740s
1324
+ # Micro::Case flow in a class 47.043k (± 8.0%) i/s - 235.984k in 5.047477s
1325
+ # Micro::Case including the class 42.030k8.5%) i/s - 208.794k in 5.002138s
1326
+ # Micro::Case::Result#| 80.936k (±15.9%) i/s - 398.112k in 5.052531s
1327
+ # Micro::Case::Result#then 71.459k8.8%) i/s - 356.900k in 5.030526s
1315
1328
 
1316
1329
  # Comparison:
1317
- # Micro::Case flow using private methods: 103787.5 i/s
1318
- # Micro::Case flow using private methods through lambdas: 101080.6 i/s - 1.03x (± 0.00) slower
1319
- # Micro::Case flow using `then` method: 69483.3 i/s - 1.49x (± 0.00) slower
1320
- # Micro::Cases.flow([]): 67757.2 i/s - 1.53x (± 0.00) slower
1321
- # Micro::Cases::safe_flow([]): 67613.3 i/s - 1.54x (± 0.00) slower
1322
- # Interactor::Organizer: 50730.8 i/s - 2.05x (± 0.00) slower
1330
+ # Micro::Case::Result#|: 80936.2 i/s
1331
+ # Micro::Cases.flow([]): 74790.1 i/s - same-ish: difference falls within error
1332
+ # Micro::Case::Result#then: 71459.5 i/s - same-ish: difference falls within error
1333
+ # Micro::Case flow in a class: 47042.6 i/s - 1.72x (± 0.00) slower
1334
+ # Micro::Case including the class: 42030.2 i/s - 1.93x (± 0.00) slower
1335
+ # Interactor::Organizer: 24290.3 i/s - 3.33x (± 0.00) slower
1323
1336
  ```
1324
1337
  </details>
1325
1338
 
@@ -1328,43 +1341,72 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
1328
1341
 
1329
1342
  ```ruby
1330
1343
  # Warming up --------------------------------------
1331
- # Interactor::Organizer
1332
- # 2.299k i/100ms
1333
- # Micro::Cases.flow([])
1334
- # 14.187k i/100ms
1335
- # Micro::Cases::safe_flow([])
1336
- # 13.609k i/100ms
1337
- # Micro::Case flow using `then` method
1338
- # 14.578k i/100ms
1339
- # Micro::Case flow using private methods
1340
- # 14.101k i/100ms
1341
- # Micro::Case flow using private methods through lambdas
1342
- # 13.670k i/100ms
1344
+ # Interactor::Organizer 1.734k i/100ms
1345
+ # Micro::Cases.flow([]) 7.515k i/100ms
1346
+ # Micro::Case flow in a class 4.636k i/100ms
1347
+ # Micro::Case including the class 4.114k i/100ms
1348
+ # Micro::Case::Result#| 7.588k i/100ms
1349
+ # Micro::Case::Result#then 6.681k i/100ms
1350
+
1343
1351
  # Calculating -------------------------------------
1344
- # Interactor::Organizer
1345
- # 23.306k2.1%) i/s - 117.249k in 5.033171s
1346
- # Micro::Cases.flow([])
1347
- # 140.111k1.6%) i/s - 709.350k in 5.064041s
1348
- # Micro::Cases::safe_flow([])
1349
- # 139.927k1.7%) i/s - 707.668k in 5.058971s
1350
- # Micro::Case flow using `then` method
1351
- # 146.073k (± 2.0%) i/s - 743.478k in 5.091741s
1352
- # Micro::Case flow using private methods
1353
- # 142.092k (± 1.5%) i/s - 719.151k in 5.062298s
1354
- # Micro::Case flow using private methods through lambdas
1355
- # 140.791k (± 1.2%) i/s - 710.840k in 5.049584s
1352
+ # Interactor::Organizer 24.280k (±24.5%) i/s - 112.710k in 5.013334s
1353
+ # Micro::Cases.flow([]) 74.999k9.8%) i/s - 375.750k in 5.055777s
1354
+ # Micro::Case flow in a class 46.681k (± 9.3%) i/s - 236.436k in 5.105105s
1355
+ # Micro::Case including the class 41.921k8.9%) i/s - 209.814k in 5.043622s
1356
+ # Micro::Case::Result#| 78.280k (±12.6%) i/s - 386.988k in 5.022146s
1357
+ # Micro::Case::Result#then 68.898k8.8%) i/s - 347.412k in 5.080116s
1356
1358
 
1357
1359
  # Comparison:
1358
- # Micro::Case flow using `then` method: 146073.0 i/s
1359
- # Micro::Case flow using private methods: 142091.7 i/s - same-ish: difference falls within error
1360
- # Micro::Case flow using private methods through lambdas: 140791.1 i/s - 1.04x (± 0.00) slower
1361
- # Micro::Cases.flow([]): 140110.8 i/s - 1.04x (± 0.00) slower
1362
- # Micro::Cases::safe_flow([]): 139926.6 i/s - 1.04x (± 0.00) slower
1363
- # Interactor::Organizer: 23305.9 i/s - 6.27x (± 0.00) slower
1360
+ # Micro::Case::Result#|: 78280.4 i/s
1361
+ # Micro::Cases.flow([]): 74999.4 i/s - same-ish: difference falls within error
1362
+ # Micro::Case::Result#then: 68898.4 i/s - same-ish: difference falls within error
1363
+ # Micro::Case flow in a class: 46681.0 i/s - 1.68x (± 0.00) slower
1364
+ # Micro::Case including the class: 41920.8 i/s - 1.87x (± 0.00) slower
1365
+ # Interactor::Organizer: 24280.0 i/s - 3.22x (± 0.00) slower
1364
1366
  ```
1365
1367
  </details>
1366
1368
 
1367
- https://github.com/serradura/u-case/tree/main/benchmarks/flow
1369
+ https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/flow/
1370
+
1371
+ [⬆️ Voltar para o índice](#índice-)
1372
+
1373
+ ### Execuntando os benchmarks
1374
+
1375
+ #### Performance (Benchmarks IPS)
1376
+
1377
+ Clone este repositório e acesse a sua pasta, então execute os comandos abaixo:
1378
+
1379
+ **Casos de uso**
1380
+
1381
+ ```sh
1382
+ ruby benchmarks/perfomance/use_case/failure_results.rb
1383
+ ruby benchmarks/perfomance/use_case/success_results.rb
1384
+ ```
1385
+
1386
+ **Flows**
1387
+
1388
+ ```sh
1389
+ ruby benchmarks/perfomance/flow/failure_results.rb
1390
+ ruby benchmarks/perfomance/flow/success_results.rb
1391
+ ```
1392
+
1393
+ #### Memory profiling
1394
+
1395
+ **Casos de uso**
1396
+
1397
+ ```sh
1398
+ ./benchmarks/memory/use_case/success/with_transitions/analyze.sh
1399
+ ./benchmarks/memory/use_case/success/without_transitions/analyze.sh
1400
+ ```
1401
+
1402
+ **Flows**
1403
+
1404
+ ```sh
1405
+ ./benchmarks/memory/flow/success/with_transitions/analyze.sh
1406
+ ./benchmarks/memory/flow/success/without_transitions/analyze.sh
1407
+ ```
1408
+
1409
+ [⬆️ Voltar para o índice](#índice-)
1368
1410
 
1369
1411
  ### Comparações
1370
1412