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.
- checksums.yaml +4 -4
- data/.travis.sh +25 -10
- data/Gemfile +28 -9
- data/README.md +185 -142
- data/README.pt-BR.md +206 -164
- data/lib/micro/case.rb +78 -19
- data/lib/micro/case/config.rb +1 -1
- data/lib/micro/case/error.rb +5 -2
- data/lib/micro/case/result.rb +72 -38
- data/lib/micro/case/result/transitions.rb +17 -0
- data/lib/micro/case/result/wrapper.rb +45 -0
- data/lib/micro/case/safe.rb +2 -2
- data/lib/micro/case/strict.rb +2 -2
- data/lib/micro/case/utils.rb +20 -10
- data/lib/micro/case/version.rb +1 -1
- data/lib/micro/cases.rb +7 -0
- data/lib/micro/cases/error.rb +13 -0
- data/lib/micro/cases/flow.rb +30 -15
- data/lib/micro/cases/map.rb +39 -0
- data/lib/micro/cases/safe/flow.rb +2 -2
- data/lib/micro/cases/utils.rb +21 -0
- data/u-case.gemspec +3 -3
- metadata +13 -6
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 - Represent use cases in a simple and powerful way while writing modular, expressive and sequentially logical code.">
|
|
6
3
|
|
|
7
|
-
<
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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`
|
|
81
|
+
- [`Micro::Case`](#microcase)
|
|
63
82
|
- [Success results](#success-results)
|
|
64
83
|
- [Failure results](#failure-results)
|
|
65
|
-
- [`Micro::Cases::Flow`
|
|
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
|
-
|
|
|
82
|
-
|
|
|
83
|
-
|
|
|
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', '~>
|
|
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
|
|
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
|
|
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
|
|
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
|
|
175
|
-
- `#transitions` retorna um array com
|
|
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
|
|
184
|
-
- `:ok`
|
|
185
|
-
- `:error`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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`
|
|
1200
|
+
### `Micro::Case`
|
|
1178
1201
|
|
|
1179
1202
|
#### Success results
|
|
1180
1203
|
|
|
1181
|
-
| Gem / Abstração | Iterações por segundo |
|
|
1182
|
-
| ----------------- | --------------------: |
|
|
1183
|
-
| Dry::Monads |
|
|
1184
|
-
| **Micro::Case** |
|
|
1185
|
-
| Interactor |
|
|
1186
|
-
| Trailblazer::Operation |
|
|
1187
|
-
| Dry::Transaction |
|
|
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
|
|
1195
|
-
# Trailblazer::Operation
|
|
1196
|
-
#
|
|
1197
|
-
#
|
|
1198
|
-
#
|
|
1199
|
-
#
|
|
1200
|
-
# Micro::Case::Safe
|
|
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
|
|
1204
|
-
# Trailblazer::Operation
|
|
1205
|
-
#
|
|
1206
|
-
#
|
|
1207
|
-
#
|
|
1208
|
-
#
|
|
1209
|
-
# Micro::Case::Safe
|
|
1227
|
+
# Interactor 59.746k (±29.9%) i/s - 274.128k in 5.049901s
|
|
1228
|
+
# Trailblazer::Operation
|
|
1229
|
+
# 28.424k (±15.8%) i/s - 141.546k in 5.087882s
|
|
1230
|
+
# Dry::Monads 315.635k (± 6.1%) i/s - 1.588M in 5.048914s
|
|
1231
|
+
# Dry::Transaction 10.131k (± 6.4%) i/s - 50.694k in 5.025150s
|
|
1232
|
+
# Micro::Case 75.838k (± 9.7%) i/s - 379.728k in 5.052573s
|
|
1233
|
+
# Micro::Case::Safe 75.461k (±10.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:
|
|
1213
|
-
# Micro::Case:
|
|
1214
|
-
# Micro::Case::Safe:
|
|
1215
|
-
# Micro::Case::Strict:
|
|
1216
|
-
# Interactor:
|
|
1217
|
-
# Trailblazer::Operation:
|
|
1218
|
-
# Dry::Transaction:
|
|
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/
|
|
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 |
|
|
1227
|
-
| ----------------- | --------------------: |
|
|
1228
|
-
|
|
|
1229
|
-
|
|
|
1230
|
-
| Trailblazer::Operation |
|
|
1231
|
-
| Interactor |
|
|
1232
|
-
| Dry::Transaction |
|
|
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
|
|
1240
|
-
# Trailblazer::Operation
|
|
1241
|
-
# Dry::Monads
|
|
1242
|
-
# Dry::Transaction
|
|
1243
|
-
# Micro::Case
|
|
1244
|
-
#
|
|
1245
|
-
#
|
|
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
|
|
1249
|
-
# Trailblazer::Operation
|
|
1250
|
-
# Dry::Monads
|
|
1251
|
-
# Dry::Transaction
|
|
1252
|
-
# Micro::Case
|
|
1253
|
-
#
|
|
1254
|
-
#
|
|
1273
|
+
# Interactor 27.037k (±24.9%) i/s - 128.674k in 5.102133s
|
|
1274
|
+
# Trailblazer::Operation 29.016k (±12.4%) i/s - 145.266k in 5.074991s
|
|
1275
|
+
# Dry::Monads 135.387k (±15.1%) i/s - 669.300k in 5.055356s
|
|
1276
|
+
# Dry::Transaction 8.989k (± 9.2%) i/s - 45.136k in 5.084820s
|
|
1277
|
+
# Micro::Case 73.247k (± 9.9%) i/s - 364.944k in 5.030449s
|
|
1278
|
+
# Micro::Case::Safe 73.489k (± 9.6%) i/s - 364.704k in 5.007282s
|
|
1279
|
+
# Micro::Case::Strict 61.980k (± 8.0%) i/s - 308.900k in 5.014821s
|
|
1255
1280
|
|
|
1256
1281
|
# Comparison:
|
|
1257
|
-
#
|
|
1258
|
-
# Micro::Case::Safe:
|
|
1259
|
-
#
|
|
1260
|
-
#
|
|
1261
|
-
# Trailblazer::Operation:
|
|
1262
|
-
# Interactor:
|
|
1263
|
-
# Dry::Transaction:
|
|
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/
|
|
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`
|
|
1296
|
+
### `Micro::Cases::Flow`
|
|
1272
1297
|
|
|
1273
|
-
| Gem / Abstração | [Resultados de sucesso](https://github.com/serradura/u-case/blob/main/benchmarks/flow/
|
|
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
|
|
1276
|
-
| Micro::Case
|
|
1277
|
-
| Micro::
|
|
1278
|
-
| Micro::
|
|
1279
|
-
| Micro::
|
|
1280
|
-
| Interactor::Organizer |
|
|
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
|
-
#
|
|
1291
|
-
# Micro::
|
|
1292
|
-
#
|
|
1293
|
-
# Micro::
|
|
1294
|
-
#
|
|
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
|
-
#
|
|
1305
|
-
# Micro::
|
|
1306
|
-
#
|
|
1307
|
-
# Micro::
|
|
1308
|
-
#
|
|
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.790k (±11.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.030k (± 8.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.459k (± 8.8%) i/s - 356.900k in 5.030526s
|
|
1315
1328
|
|
|
1316
1329
|
# Comparison:
|
|
1317
|
-
# Micro::Case
|
|
1318
|
-
# Micro::
|
|
1319
|
-
# Micro::Case
|
|
1320
|
-
# Micro::
|
|
1321
|
-
# Micro::
|
|
1322
|
-
# Interactor::Organizer:
|
|
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
|
-
#
|
|
1333
|
-
# Micro::
|
|
1334
|
-
#
|
|
1335
|
-
# Micro::
|
|
1336
|
-
#
|
|
1337
|
-
|
|
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
|
-
#
|
|
1346
|
-
# Micro::
|
|
1347
|
-
#
|
|
1348
|
-
# Micro::
|
|
1349
|
-
#
|
|
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.999k (± 9.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.921k (± 8.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.898k (± 8.8%) i/s - 347.412k in 5.080116s
|
|
1356
1358
|
|
|
1357
1359
|
# Comparison:
|
|
1358
|
-
# Micro::Case
|
|
1359
|
-
# Micro::
|
|
1360
|
-
# Micro::Case
|
|
1361
|
-
# Micro::
|
|
1362
|
-
# Micro::
|
|
1363
|
-
# Interactor::Organizer:
|
|
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/
|
|
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
|
|