u-case 3.0.0.rc8 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.sh +4 -4
- data/Gemfile +9 -1
- data/README.md +183 -142
- data/README.pt-BR.md +203 -163
- data/lib/micro/case.rb +56 -26
- data/lib/micro/case/config.rb +16 -4
- data/lib/micro/case/error.rb +7 -2
- data/lib/micro/case/result.rb +80 -44
- 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/case/with_activemodel_validation.rb +3 -1
- data/lib/micro/cases.rb +7 -0
- data/lib/micro/cases/error.rb +13 -0
- data/lib/micro/cases/flow.rb +37 -24
- 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 +15 -8
data/README.pt-BR.md
CHANGED
@@ -1,12 +1,29 @@
|
|
1
|
-
|
2
|
-
|
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
|
-
<
|
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.1.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,8 +52,8 @@ 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
|
37
|
-
- [É
|
55
|
+
- [Como definir tipos customizados de resultados?](#como-definir-tipos-customizados-de-resultados)
|
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)
|
40
59
|
- [Usando decomposição para acessar os dados e tipo do resultado](#usando-decomposição-para-acessar-os-dados-e-tipo-do-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.1.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
|
@@ -276,7 +299,7 @@ bad_result.failure? # true
|
|
276
299
|
|
277
300
|
[⬆️ Voltar para o índice](#índice-)
|
278
301
|
|
279
|
-
#### É
|
302
|
+
#### É possível definir um tipo sem definir os dados do resultado?
|
280
303
|
|
281
304
|
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
305
|
|
@@ -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|
|
@@ -1064,7 +1087,7 @@ class Multiply < Micro::Case
|
|
1064
1087
|
validates :a, :b, presence: true, numericality: true
|
1065
1088
|
|
1066
1089
|
def call!
|
1067
|
-
return Failure :
|
1090
|
+
return Failure :invalid_attributes, result: { errors: self.errors } if invalid?
|
1068
1091
|
|
1069
1092
|
Success result: { number: a * b }
|
1070
1093
|
end
|
@@ -1174,110 +1197,110 @@ end
|
|
1174
1197
|
|
1175
1198
|
## Benchmarks
|
1176
1199
|
|
1177
|
-
### `Micro::Case`
|
1200
|
+
### `Micro::Case`
|
1178
1201
|
|
1179
1202
|
#### Success results
|
1180
1203
|
|
1181
1204
|
| Gem / Abstração | Iterações por segundo | Comparação |
|
1182
1205
|
| ----------------- | --------------------: | ----------------: |
|
1183
|
-
| Dry::Monads |
|
1184
|
-
| **Micro::Case** |
|
1185
|
-
| Interactor |
|
1186
|
-
| Trailblazer::Operation |
|
1187
|
-
| Dry::Transaction |
|
1206
|
+
| Dry::Monads | 281515.4 | _**O mais rápido**_ |
|
1207
|
+
| **Micro::Case** | 151711.3 | 1.86x mais lento |
|
1208
|
+
| Interactor | 53016.2 | 5.31x mais lento |
|
1209
|
+
| Trailblazer::Operation | 38314.2 | 7.35x mais lento |
|
1210
|
+
| Dry::Transaction | 10440.7 | 26.96x 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
|
-
# Dry::Monads
|
1197
|
-
# Dry::Transaction
|
1198
|
-
# Micro::Case
|
1199
|
-
#
|
1200
|
-
#
|
1217
|
+
# Interactor 5.151k i/100ms
|
1218
|
+
# Trailblazer::Operation 3.805k i/100ms
|
1219
|
+
# Dry::Monads 28.153k i/100ms
|
1220
|
+
# Dry::Transaction 1.063k i/100ms
|
1221
|
+
# Micro::Case 15.159k i/100ms
|
1222
|
+
# Micro::Case::Safe 15.172k i/100ms
|
1223
|
+
# Micro::Case::Strict 12.557k i/100ms
|
1201
1224
|
|
1202
1225
|
# Calculating -------------------------------------
|
1203
|
-
# Interactor
|
1204
|
-
# Trailblazer::Operation
|
1205
|
-
# Dry::Monads
|
1206
|
-
# Dry::Transaction
|
1207
|
-
# Micro::Case
|
1208
|
-
#
|
1209
|
-
#
|
1226
|
+
# Interactor 53.016k (± 1.8%) i/s - 267.852k in 5.053967s
|
1227
|
+
# Trailblazer::Operation 38.314k (± 1.7%) i/s - 194.055k in 5.066374s
|
1228
|
+
# Dry::Monads 281.515k (± 2.4%) i/s - 1.408M in 5.003266s
|
1229
|
+
# Dry::Transaction 10.441k (± 2.1%) i/s - 53.150k in 5.092957s
|
1230
|
+
# Micro::Case 151.711k (± 1.7%) i/s - 773.109k in 5.097555s
|
1231
|
+
# Micro::Case::Safe 145.801k (± 6.7%) i/s - 728.256k in 5.022666s
|
1232
|
+
# Micro::Case::Strict 115.636k (± 8.4%) i/s - 577.622k in 5.042079s
|
1210
1233
|
|
1211
1234
|
# Comparison:
|
1212
|
-
# Dry::Monads:
|
1213
|
-
# Micro::Case:
|
1214
|
-
# Micro::Case::Safe:
|
1215
|
-
# Micro::Case::Strict:
|
1216
|
-
# Interactor:
|
1217
|
-
# Trailblazer::Operation:
|
1218
|
-
# Dry::Transaction:
|
1235
|
+
# Dry::Monads: 281515.4 i/s
|
1236
|
+
# Micro::Case: 151711.3 i/s - 1.86x (± 0.00) slower
|
1237
|
+
# Micro::Case::Safe: 145800.8 i/s - 1.93x (± 0.00) slower
|
1238
|
+
# Micro::Case::Strict: 115635.8 i/s - 2.43x (± 0.00) slower
|
1239
|
+
# Interactor: 53016.2 i/s - 5.31x (± 0.00) slower
|
1240
|
+
# Trailblazer::Operation: 38314.2 i/s - 7.35x (± 0.00) slower
|
1241
|
+
# Dry::Transaction: 10440.7 i/s - 26.96x (± 0.00) slower
|
1219
1242
|
```
|
1220
1243
|
</details>
|
1221
1244
|
|
1222
|
-
https://github.com/serradura/u-case/blob/main/benchmarks/use_case/
|
1245
|
+
https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/use_case/success_results.
|
1223
1246
|
|
1224
1247
|
#### Failure results
|
1225
1248
|
|
1226
1249
|
| Gem / Abstração | Iterações por segundo | Comparação |
|
1227
1250
|
| ----------------- | --------------------: | ----------------: |
|
1228
|
-
| **Micro::Case** |
|
1229
|
-
| Dry::Monads |
|
1230
|
-
| Trailblazer::Operation |
|
1231
|
-
| Interactor |
|
1232
|
-
| Dry::Transaction |
|
1251
|
+
| **Micro::Case** | 140794.0 | _**O mais rápido**_ |
|
1252
|
+
| Dry::Monads | 133865.5 | 0x mais devagar |
|
1253
|
+
| Trailblazer::Operation | 39829.9 | 3.53x mais devagar |
|
1254
|
+
| Interactor | 23856.0 | 5.90x mais devagar |
|
1255
|
+
| Dry::Transaction | 7975.0 | 17.65x mais devagar |
|
1233
1256
|
|
1234
1257
|
<details>
|
1235
1258
|
<summary>Mostrar o resultado completo do <a href="https://github.com/evanphx/benchmark-ips">benchmark/ips</a>.</summary>
|
1236
1259
|
|
1237
1260
|
```ruby
|
1238
1261
|
# Warming up --------------------------------------
|
1239
|
-
# Interactor
|
1240
|
-
# Trailblazer::Operation
|
1241
|
-
# Dry::Monads
|
1242
|
-
# Dry::Transaction
|
1243
|
-
# Micro::Case
|
1244
|
-
#
|
1245
|
-
#
|
1262
|
+
# Interactor 2.351k i/100ms
|
1263
|
+
# Trailblazer::Operation 3.941k i/100ms
|
1264
|
+
# Dry::Monads 13.567k i/100ms
|
1265
|
+
# Dry::Transaction 927.000 i/100ms
|
1266
|
+
# Micro::Case 14.959k i/100ms
|
1267
|
+
# Micro::Case::Safe 14.904k i/100ms
|
1268
|
+
# Micro::Case::Strict 12.007k i/100ms
|
1246
1269
|
|
1247
1270
|
# Calculating -------------------------------------
|
1248
|
-
# Interactor
|
1249
|
-
# Trailblazer::Operation
|
1250
|
-
# Dry::Monads
|
1251
|
-
# Dry::Transaction
|
1252
|
-
# Micro::Case
|
1253
|
-
#
|
1254
|
-
#
|
1271
|
+
# Interactor 23.856k (± 1.7%) i/s - 119.901k in 5.027585s
|
1272
|
+
# Trailblazer::Operation 39.830k (± 1.2%) i/s - 200.991k in 5.047032s
|
1273
|
+
# Dry::Monads 133.866k (± 2.5%) i/s - 678.350k in 5.070899s
|
1274
|
+
# Dry::Transaction 7.975k (± 8.6%) i/s - 39.861k in 5.036260s
|
1275
|
+
# Micro::Case 130.534k (±24.4%) i/s - 583.401k in 5.040907s
|
1276
|
+
# Micro::Case::Safe 140.794k (± 8.1%) i/s - 700.488k in 5.020935s
|
1277
|
+
# Micro::Case::Strict 102.641k (±21.3%) i/s - 480.280k in 5.020354s
|
1255
1278
|
|
1256
1279
|
# Comparison:
|
1257
|
-
#
|
1258
|
-
#
|
1259
|
-
#
|
1260
|
-
#
|
1261
|
-
# Trailblazer::Operation:
|
1262
|
-
# Interactor:
|
1263
|
-
# Dry::Transaction:
|
1280
|
+
# Micro::Case::Safe: 140794.0 i/s
|
1281
|
+
# Dry::Monads: 133865.5 i/s - same-ish: difference falls within error
|
1282
|
+
# Micro::Case: 130534.0 i/s - same-ish: difference falls within error
|
1283
|
+
# Micro::Case::Strict: 102640.7 i/s - 1.37x (± 0.00) slower
|
1284
|
+
# Trailblazer::Operation: 39829.9 i/s - 3.53x (± 0.00) slower
|
1285
|
+
# Interactor: 23856.0 i/s - 5.90x (± 0.00) slower
|
1286
|
+
# Dry::Transaction: 7975.0 i/s - 17.65x (± 0.00) slower
|
1264
1287
|
```
|
1265
1288
|
</details>
|
1266
1289
|
|
1267
|
-
https://github.com/serradura/u-case/blob/main/benchmarks/use_case/
|
1290
|
+
https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/use_case/failure_results.
|
1268
1291
|
|
1269
1292
|
---
|
1270
1293
|
|
1271
|
-
### `Micro::Cases::Flow`
|
1294
|
+
### `Micro::Cases::Flow`
|
1272
1295
|
|
1273
|
-
| Gem / Abstração | [Resultados de sucesso](https://github.com/serradura/u-case/blob/main/benchmarks/flow/
|
1296
|
+
| 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
1297
|
| ------------------------------------------- | ----------------: | ----------------: |
|
1275
|
-
| Micro::Case
|
1276
|
-
| Micro::Case
|
1277
|
-
| Micro::
|
1278
|
-
| Micro::
|
1279
|
-
| Micro::
|
1280
|
-
| Interactor::Organizer |
|
1298
|
+
| Micro::Case::Result `pipe` method | 172734.4 i/s | 153745.6 i/s |
|
1299
|
+
| Micro::Case::Result `then` method | 1.24x mais devagar | 1.21x mais devagar |
|
1300
|
+
| Micro::Cases.flow | 1.30x mais devagar | 1.30x mais devagar |
|
1301
|
+
| Micro::Case class with an inner flow | 2.05x mais devagar | 1.98x mais devagar |
|
1302
|
+
| Micro::Case class including itself as a step| 2.14x mais devagar | 2.09x mais devagar |
|
1303
|
+
| Interactor::Organizer | 7.69x mais devagar | 7.03x mais devagar |
|
1281
1304
|
|
1282
1305
|
\* As gems `Dry::Monads`, `Dry::Transaction`, `Trailblazer::Operation` estão fora desta análise por não terem esse tipo de funcionalidade.
|
1283
1306
|
|
@@ -1286,40 +1309,28 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
|
|
1286
1309
|
|
1287
1310
|
```ruby
|
1288
1311
|
# 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
|
1312
|
+
# Interactor::Organizer 2.163k i/100ms
|
1313
|
+
# Micro::Cases.flow([]) 13.158k i/100ms
|
1314
|
+
# Micro::Case flow in a class 8.400k i/100ms
|
1315
|
+
# Micro::Case including the class 8.008k i/100ms
|
1316
|
+
# Micro::Case::Result#| 17.151k i/100ms
|
1317
|
+
# Micro::Case::Result#then 14.121k i/100ms
|
1301
1318
|
|
1302
1319
|
# 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
|
1320
|
+
# Interactor::Organizer 22.467k (± 1.8%) i/s - 112.476k in 5.007787s
|
1321
|
+
# Micro::Cases.flow([]) 133.183k (± 1.5%) i/s - 671.058k in 5.039815s
|
1322
|
+
# Micro::Case flow in a class 84.083k (± 1.8%) i/s - 428.400k in 5.096623s
|
1323
|
+
# Micro::Case including the class 80.574k (± 1.6%) i/s - 408.408k in 5.070029s
|
1324
|
+
# Micro::Case::Result#| 172.734k (± 1.1%) i/s - 874.701k in 5.064429s
|
1325
|
+
# Micro::Case::Result#then 139.799k (± 1.7%) i/s - 706.050k in 5.052035s
|
1315
1326
|
|
1316
1327
|
# Comparison:
|
1317
|
-
# Micro::Case
|
1318
|
-
# Micro::Case
|
1319
|
-
# Micro::
|
1320
|
-
# Micro::
|
1321
|
-
# Micro::
|
1322
|
-
# Interactor::Organizer:
|
1328
|
+
# Micro::Case::Result#|: 172734.4 i/s
|
1329
|
+
# Micro::Case::Result#then: 139799.0 i/s - 1.24x (± 0.00) slower
|
1330
|
+
# Micro::Cases.flow([]): 133182.9 i/s - 1.30x (± 0.00) slower
|
1331
|
+
# Micro::Case flow in a class: 84082.6 i/s - 2.05x (± 0.00) slower
|
1332
|
+
# Micro::Case including the class: 80574.3 i/s - 2.14x (± 0.00) slower
|
1333
|
+
# Interactor::Organizer: 22467.4 i/s - 7.69x (± 0.00) slower
|
1323
1334
|
```
|
1324
1335
|
</details>
|
1325
1336
|
|
@@ -1328,43 +1339,72 @@ https://github.com/serradura/u-case/blob/main/benchmarks/use_case/with_failure_r
|
|
1328
1339
|
|
1329
1340
|
```ruby
|
1330
1341
|
# 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
|
1342
|
+
# Interactor::Organizer 2.167k i/100ms
|
1343
|
+
# Micro::Cases.flow([]) 11.797k i/100ms
|
1344
|
+
# Micro::Case flow in a class 7.783k i/100ms
|
1345
|
+
# Micro::Case including the class 7.097k i/100ms
|
1346
|
+
# Micro::Case::Result#| 14.398k i/100ms
|
1347
|
+
# Micro::Case::Result#then 12.719k i/100ms
|
1348
|
+
|
1343
1349
|
# 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
|
1350
|
+
# Interactor::Organizer 21.863k (± 2.5%) i/s - 110.517k in 5.058420s
|
1351
|
+
# Micro::Cases.flow([]) 118.124k (± 1.8%) i/s - 601.647k in 5.095102s
|
1352
|
+
# Micro::Case flow in a class 77.801k (± 1.5%) i/s - 389.150k in 5.003002s
|
1353
|
+
# Micro::Case including the class 73.533k (± 2.1%) i/s - 369.044k in 5.021076s
|
1354
|
+
# Micro::Case::Result#| 153.746k (± 1.5%) i/s - 777.492k in 5.058177s
|
1355
|
+
# Micro::Case::Result#then 126.897k (± 1.7%) i/s - 635.950k in 5.013059s
|
1356
1356
|
|
1357
1357
|
# Comparison:
|
1358
|
-
# Micro::Case
|
1359
|
-
# Micro::Case
|
1360
|
-
# Micro::
|
1361
|
-
# Micro::
|
1362
|
-
# Micro::
|
1363
|
-
# Interactor::Organizer:
|
1358
|
+
# Micro::Case::Result#|: 153745.6 i/s
|
1359
|
+
# Micro::Case::Result#then: 126896.6 i/s - 1.21x (± 0.00) slower
|
1360
|
+
# Micro::Cases.flow([]): 118123.9 i/s - 1.30x (± 0.00) slower
|
1361
|
+
# Micro::Case flow in a class: 77800.7 i/s - 1.98x (± 0.00) slower
|
1362
|
+
# Micro::Case including the class: 73532.9 i/s - 2.09x (± 0.00) slower
|
1363
|
+
# Interactor::Organizer: 21862.9 i/s - 7.03x (± 0.00) slower
|
1364
1364
|
```
|
1365
1365
|
</details>
|
1366
1366
|
|
1367
|
-
https://github.com/serradura/u-case/
|
1367
|
+
https://github.com/serradura/u-case/blob/main/benchmarks/perfomance/flow/
|
1368
|
+
|
1369
|
+
[⬆️ Voltar para o índice](#índice-)
|
1370
|
+
|
1371
|
+
### Execuntando os benchmarks
|
1372
|
+
|
1373
|
+
#### Performance (Benchmarks IPS)
|
1374
|
+
|
1375
|
+
Clone este repositório e acesse a sua pasta, então execute os comandos abaixo:
|
1376
|
+
|
1377
|
+
**Casos de uso**
|
1378
|
+
|
1379
|
+
```sh
|
1380
|
+
ruby benchmarks/perfomance/use_case/failure_results.rb
|
1381
|
+
ruby benchmarks/perfomance/use_case/success_results.rb
|
1382
|
+
```
|
1383
|
+
|
1384
|
+
**Flows**
|
1385
|
+
|
1386
|
+
```sh
|
1387
|
+
ruby benchmarks/perfomance/flow/failure_results.rb
|
1388
|
+
ruby benchmarks/perfomance/flow/success_results.rb
|
1389
|
+
```
|
1390
|
+
|
1391
|
+
#### Memory profiling
|
1392
|
+
|
1393
|
+
**Casos de uso**
|
1394
|
+
|
1395
|
+
```sh
|
1396
|
+
./benchmarks/memory/use_case/success/with_transitions/analyze.sh
|
1397
|
+
./benchmarks/memory/use_case/success/without_transitions/analyze.sh
|
1398
|
+
```
|
1399
|
+
|
1400
|
+
**Flows**
|
1401
|
+
|
1402
|
+
```sh
|
1403
|
+
./benchmarks/memory/flow/success/with_transitions/analyze.sh
|
1404
|
+
./benchmarks/memory/flow/success/without_transitions/analyze.sh
|
1405
|
+
```
|
1406
|
+
|
1407
|
+
[⬆️ Voltar para o índice](#índice-)
|
1368
1408
|
|
1369
1409
|
### Comparações
|
1370
1410
|
|