u-case 4.2.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b6e79d90ba9b66b09c320bcd68465f9db2289086b4530123ccf01db2376f752
4
- data.tar.gz: 4b6138b6384302eeb45bf17bd653d4918e0076d2c22c4fbdbcc54588d069c2d2
3
+ metadata.gz: '0698f0ab43f3865d2ead4f23980f541290c07dc64bd524495417ea93d995d5fd'
4
+ data.tar.gz: 0ca02bcf975055a3514931f28a55769f42f63f30f84b61b740193ebdf9a1a5fa
5
5
  SHA512:
6
- metadata.gz: f5c4ea89afe401408e10484875588a63242319a87d0a1e4e95299dc87f08fa02787e571218be57fb581c8b09288cf34925738ad7fc534ef741ea52b2720be091
7
- data.tar.gz: c7eefe6ecc11d20f46495a52052c31a6ab2884bd79dd79a068d5babc26a3bd3c0800cb4ff6337a3f5c8e6739b9111a59de07c5811b2fe804975e9f598824e926
6
+ metadata.gz: 1e8113cc4e997f014cb9797593079c56bad0c90364fa72a201902d02136172236a44bfce5efb55ecd6e6337787590dd90ea7c5be3cf274e56f518302e9a3cea9
7
+ data.tar.gz: 9bf33db4748dbe41539a59859943e016c79ee71391748ff51723ea752b8286cab156f7c2a226d1064ec7ea8c1c70adce1460dbc34ebabd93032c9f63d3c36254
data/.travis.sh CHANGED
@@ -1,38 +1,46 @@
1
1
  #!/bin/bash
2
2
 
3
- ruby_v=$(ruby -v)
4
-
5
- ACTIVERECORD_VERSION='3.2' bundle update
6
- ACTIVERECORD_VERSION='3.2' ENABLE_TRANSITIONS='false' bundle exec rake test
7
- ACTIVERECORD_VERSION='3.2' ENABLE_TRANSITIONS='true' bundle exec rake test
8
-
9
- ACTIVERECORD_VERSION='4.0' bundle update
10
- ACTIVERECORD_VERSION='4.0' bundle exec rake test
11
-
12
- ACTIVERECORD_VERSION='4.1' bundle update
13
- ACTIVERECORD_VERSION='4.1' bundle exec rake test
14
-
15
- ACTIVERECORD_VERSION='4.2' bundle update
16
- ACTIVERECORD_VERSION='4.2' bundle exec rake test
17
-
18
- ACTIVERECORD_VERSION='5.0' bundle update
19
- ACTIVERECORD_VERSION='5.0' bundle exec rake test
3
+ RUBY_V=$(ruby -v)
4
+
5
+ function run_with_bundler {
6
+ rm Gemfile.lock
7
+
8
+ if [ ! -z "$1" ]; then
9
+ bundle_cmd="bundle _$1_"
10
+ else
11
+ bundle_cmd="bundle"
12
+ fi
13
+
14
+ eval "$2 $bundle_cmd update"
15
+ eval "$2 ENABLE_TRANSITIONS=true $bundle_cmd exec rake test"
16
+ eval "$2 ENABLE_TRANSITIONS=false $bundle_cmd exec rake test"
17
+ }
18
+
19
+ function run_with_ar_version_and_bundler {
20
+ run_with_bundler "$2" "ACTIVERECORD_VERSION=$1"
21
+ }
22
+
23
+ RUBY_2_2345="ruby 2.[2345]."
24
+
25
+ if [[ $RUBY_V =~ $RUBY_2_2345 ]]; then
26
+ run_with_bundler "$BUNDLER_V1"
27
+
28
+ run_with_ar_version_and_bundler "3.2" "$BUNDLER_V1"
29
+ run_with_ar_version_and_bundler "4.0" "$BUNDLER_V1"
30
+ run_with_ar_version_and_bundler "4.1" "$BUNDLER_V1"
31
+ run_with_ar_version_and_bundler "4.2" "$BUNDLER_V1"
32
+ run_with_ar_version_and_bundler "5.0" "$BUNDLER_V1"
33
+ run_with_ar_version_and_bundler "5.1" "$BUNDLER_V1"
34
+ run_with_ar_version_and_bundler "5.2" "$BUNDLER_V1"
35
+ fi
20
36
 
21
- ACTIVERECORD_VERSION='5.1' bundle update
22
- ACTIVERECORD_VERSION='5.1' bundle exec rake test
37
+ RUBY_2_567="ruby 2.[567]."
38
+ RUBY_3_x_x="ruby 3.0."
23
39
 
24
- if [[ ! $ruby_v =~ '2.2.0' ]]; then
25
- ACTIVERECORD_VERSION='5.2' bundle update
26
- ACTIVERECORD_VERSION='5.2' ENABLE_TRANSITIONS='false' bundle exec rake test
27
- ACTIVERECORD_VERSION='5.2' ENABLE_TRANSITIONS='true' bundle exec rake test
28
- fi
40
+ if [[ $RUBY_V =~ $RUBY_2_567 ]] || [[ $RUBY_V =~ $RUBY_3_x_x ]]; then
41
+ gem install bundler -v ">= 2" --no-doc
29
42
 
30
- if [[ $ruby_v =~ '2.5.' ]] || [[ $ruby_v =~ '2.6.' ]] || [[ $ruby_v =~ '2.7.' ]]; then
31
- ACTIVERECORD_VERSION='6.0' bundle update
32
- ACTIVERECORD_VERSION='6.0' ENABLE_TRANSITIONS='false' bundle exec rake test
33
- ACTIVERECORD_VERSION='6.0' ENABLE_TRANSITIONS='true' bundle exec rake test
43
+ run_with_bundler
44
+ run_with_ar_version_and_bundler "6.0"
45
+ run_with_ar_version_and_bundler "6.1"
34
46
  fi
35
-
36
- bundle update
37
- ENABLE_TRANSITIONS='false' bundle exec rake test
38
- ENABLE_TRANSITIONS='true' bundle exec rake test
data/.travis.yml CHANGED
@@ -1,21 +1,24 @@
1
-
2
1
  language: ruby
3
2
 
4
- sudo: false
3
+ cache:
4
+ bundler: true
5
+ directories:
6
+ - /home/travis/.rvm/
5
7
 
6
8
  rvm:
7
- - 2.2.0
9
+ - 2.2.2
8
10
  - 2.3.0
9
11
  - 2.4.0
10
12
  - 2.5.0
11
13
  - 2.6.0
12
14
  - 2.7.0
15
+ - 3.0.0
13
16
 
14
- cache: bundler
17
+ env:
18
+ - BUNDLER_V1="1.17.3"
15
19
 
16
20
  before_install:
17
- - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
18
- - gem install bundler -v '< 2'
21
+ - gem install bundler -v "$BUNDLER_V1"
19
22
 
20
23
  install: bundle install --jobs=3 --retry=3
21
24
 
data/Gemfile CHANGED
@@ -2,7 +2,7 @@ source "https://rubygems.org"
2
2
 
3
3
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
- activerecord_version = ENV.fetch('ACTIVERECORD_VERSION', '6.1')
5
+ activerecord_version = ENV.fetch('ACTIVERECORD_VERSION', '7')
6
6
 
7
7
  activerecord = case activerecord_version
8
8
  when '3.2' then '3.2.22'
@@ -11,8 +11,9 @@ activerecord = case activerecord_version
11
11
  when '4.2' then '4.2.11'
12
12
  when '5.0' then '5.0.7'
13
13
  when '5.1' then '5.1.7'
14
- when '5.2' then '5.2.3'
15
- when '6.0' then '6.0.3'
14
+ when '5.2' then '5.2.4'
15
+ when '6.0' then '6.0.3.4'
16
+ when '6.1' then '6.1.2'
16
17
  end
17
18
 
18
19
  simplecov_version =
@@ -30,7 +31,7 @@ group :test do
30
31
  if activerecord
31
32
  sqlite3 =
32
33
  case activerecord
33
- when /\A6\.0/, nil then '~> 1.4.0'
34
+ when /\A6\.(0|1)/, nil then '~> 1.4.0'
34
35
  else '~> 1.3.0'
35
36
  end
36
37
 
data/README.md CHANGED
@@ -39,7 +39,7 @@ The main project goals are:
39
39
  Version | Documentation
40
40
  --------- | -------------
41
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
42
+ 4.5.0 | https://github.com/serradura/u-case/blob/v4.x/README.md
43
43
  3.1.0 | https://github.com/serradura/u-case/blob/v3.x/README.md
44
44
  2.6.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
45
45
  1.1.0 | https://github.com/serradura/u-case/blob/v1.x/README.md
@@ -99,13 +99,13 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
99
99
 
100
100
  ## Compatibility
101
101
 
102
- | u-case | branch | ruby | activemodel | u-attributes |
103
- | -------------- | ------- | -------- | ------------- | ------------ |
104
- | unreleased | main | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
105
- | 4.2.0 | v4.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
106
- | 3.1.0 | v3.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
107
- | 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
108
- | 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
102
+ | u-case | branch | ruby | activemodel | u-attributes |
103
+ | -------------- | ------- | -------- | ------------- | ------------- |
104
+ | unreleased | main | >= 2.2.0 | >= 3.2, < 7.0 | >= 2.7, < 3.0 |
105
+ | 4.5.0 | v4.x | >= 2.2.0 | >= 3.2, < 7.0 | >= 2.7, < 3.0 |
106
+ | 3.1.0 | v3.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
107
+ | 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
108
+ | 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
109
109
 
110
110
  > Note: The activemodel is an optional dependency, this module [can be enabled](#u-casewith_activemodel_validation---how-to-validate-use-case-attributes) to validate the use cases' attributes.
111
111
 
@@ -115,7 +115,7 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
115
115
 
116
116
  A simple type system (at runtime) for Ruby.
117
117
 
118
- It is used to validate some internal u-case's methods input. This gem also exposes an [`ActiveModel validator`](https://github.com/serradura/kind#kindvalidator-activemodelvalidations) when requiring the [`u-case/with_activemodel_validation`](#u-casewith_activemodel_validation---how-to-validate-use-case-attributes) module, or when the [`Micro::Case.config`](#microcaseconfig) was used to enable it. Lastly, two type checkers are available through it: [`Kind::Of::Micro::Case`, `Kind::Of::Micro::Case::Result`](https://github.com/serradura/kind#registering-new-custom-type-checker).
118
+ It is used to validate some internal u-case's methods input. This gem also exposes an [`ActiveModel validator`](https://github.com/serradura/kind#kindvalidator-activemodelvalidations) when requiring the [`u-case/with_activemodel_validation`](#u-casewith_activemodel_validation---how-to-validate-use-case-attributes) module, or when the [`Micro::Case.config`](#microcaseconfig) was used to enable it.
119
119
  2. [`u-attributes`](https://github.com/serradura/u-attributes) gem.
120
120
 
121
121
  This gem allows defining read-only attributes, that is, your objects will have only getters to access their attributes data.
@@ -126,7 +126,7 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
126
126
  Add this line to your application's Gemfile:
127
127
 
128
128
  ```ruby
129
- gem 'u-case', '~> 4.1.0'
129
+ gem 'u-case', '~> 4.5.0'
130
130
  ```
131
131
 
132
132
  And then execute:
@@ -1052,8 +1052,8 @@ Divide
1052
1052
  # Can't divide a number by 0
1053
1053
  # Oh no, something went wrong!
1054
1054
 
1055
- Divide.
1056
- .call(a: 2, b: '2').
1055
+ Divide
1056
+ .call(a: 2, b: '2')
1057
1057
  .on_success { |result| puts result[:division] }
1058
1058
  .on_exception(TypeError) { puts 'Please, use only numeric attributes.' }
1059
1059
  .on_exception(ZeroDivisionError) { |_error| puts "Can't divide a number by 0." }
data/README.pt-BR.md CHANGED
@@ -39,7 +39,7 @@ Principais objetivos deste projeto:
39
39
  Versão | Documentação
40
40
  --------- | -------------
41
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
42
+ 4.5.0 | https://github.com/serradura/u-case/blob/v4.x/README.md
43
43
  3.1.0 | https://github.com/serradura/u-case/blob/v3.x/README.md
44
44
  2.6.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
45
45
  1.1.0 | https://github.com/serradura/u-case/blob/v1.x/README.md
@@ -70,9 +70,8 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
70
70
  - [É possível declarar um fluxo que inclui o próprio caso de uso?](#é-possível-declarar-um-fluxo-que-inclui-o-próprio-caso-de-uso)
71
71
  - [`Micro::Case::Strict` - O que é um caso de uso estrito?](#microcasestrict---o-que-é-um-caso-de-uso-estrito)
72
72
  - [`Micro::Case::Safe` - Existe algum recurso para lidar automaticamente com exceções dentro de um caso de uso ou fluxo?](#microcasesafe---existe-algum-recurso-para-lidar-automaticamente-com-exceções-dentro-de-um-caso-de-uso-ou-fluxo)
73
- - [`Micro::Case::Result#on_exception`](#microcaseresulton_exception)
74
73
  - [`Micro::Cases::Safe::Flow`](#microcasessafeflow)
75
- - [`Micro::Case::Result#on_exception`](#microcaseresulton_exception-1)
74
+ - [`Micro::Case::Result#on_exception`](#microcaseresulton_exception)
76
75
  - [`u-case/with_activemodel_validation` - Como validar os atributos do caso de uso?](#u-casewith_activemodel_validation---como-validar-os-atributos-do-caso-de-uso)
77
76
  - [Se eu habilitei a validação automática, é possível desabilitá-la apenas em casos de uso específicos?](#se-eu-habilitei-a-validação-automática-é-possível-desabilitá-la-apenas-em-casos-de-uso-específicos)
78
77
  - [`Kind::Validator`](#kindvalidator)
@@ -98,12 +97,13 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
98
97
 
99
98
  ## Compatibilidade
100
99
 
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 |
100
+ | u-case | branch | ruby | activemodel | u-attributes- |
101
+ | -------------- | ------- | -------- | ------------- | ------------- |
102
+ | unreleased | main | >= 2.2.0 | >= 3.2, < 7.0 | >= 2.7, < 3.0 |
103
+ | 4.5.0 | v4.x | >= 2.2.0 | >= 3.2, < 7.0 | >= 2.7, < 3.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 |
107
107
 
108
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.
109
109
 
@@ -113,7 +113,7 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
113
113
 
114
114
  Sistema de tipos simples (em runtime) para Ruby.
115
115
 
116
- É usado para validar os inputs de alguns métodos do u-case, além de expor um validador de tipos através do [`activemodel validation`](https://github.com/serradura/kind#kindvalidator-activemodelvalidations) ([veja como habilitar]((#u-casewith_activemodel_validation---how-to-validate-use-case-attributes))). Por fim, ele também expõe dois verificadores de tipo: [`Kind::Of::Micro::Case`, `Kind::Of::Micro::Case::Result`](https://github.com/serradura/kind#registering-new-custom-type-checker).
116
+ É usado para validar os inputs de alguns métodos do u-case, além de expor um validador de tipos através do [`activemodel validation`](https://github.com/serradura/kind#kindvalidator-activemodelvalidations) ([veja como habilitar]((#u-casewith_activemodel_validation---how-to-validate-use-case-attributes))).
117
117
  2. [`u-attributes`](https://github.com/serradura/u-attributes) gem.
118
118
 
119
119
  Essa gem permite definir atributos de leitura (read-only), ou seja, os seus objetos só terão getters para acessar os dados dos seus atributos.
@@ -124,7 +124,7 @@ unreleased| https://github.com/serradura/u-case/blob/main/README.md
124
124
  Adicione essa linha ao Gemfile da sua aplicação:
125
125
 
126
126
  ```ruby
127
- gem 'u-case', '~> 4.1.0'
127
+ gem 'u-case', '~> 4.5.0'
128
128
  ```
129
129
 
130
130
  E então execute:
@@ -976,8 +976,6 @@ result.on_failure(:exception) do |result|
976
976
  end
977
977
  ```
978
978
 
979
- #### `Micro::Case::Result#on_exception`
980
-
981
979
  Se você precisar lidar com um erro específico, recomendo o uso de uma instrução case. Exemplo:
982
980
 
983
981
  ```ruby
@@ -1055,8 +1053,8 @@ Divide
1055
1053
  # Can't divide a number by 0
1056
1054
  # Oh no, something went wrong!
1057
1055
 
1058
- Divide.
1059
- .call(a: 2, b: '2').
1056
+ Divide
1057
+ .call(a: 2, b: '2')
1060
1058
  .on_success { |result| puts result[:division] }
1061
1059
  .on_exception(TypeError) { puts 'Please, use only numeric attributes.' }
1062
1060
  .on_exception(ZeroDivisionError) { |_error| puts "Can't divide a number by 0." }
data/lib/micro/case.rb CHANGED
@@ -24,7 +24,11 @@ module Micro
24
24
 
25
25
  return result unless block_given?
26
26
 
27
- yield Result::Wrapper.new(result)
27
+ result_wrapper = Result::Wrapper.new(result)
28
+
29
+ yield(result_wrapper)
30
+
31
+ result_wrapper.output
28
32
  end
29
33
 
30
34
  INVALID_INVOCATION_OF_THE_THEN_METHOD =
@@ -135,7 +139,7 @@ module Micro
135
139
  ids = (Thread.current[InspectKey] ||= [])
136
140
 
137
141
  if ids.include?(object_id)
138
- return sprintf('#<%s: {...}>', self)
142
+ return sprintf('#<%s: ...>', self)
139
143
  end
140
144
 
141
145
  begin
@@ -239,6 +243,21 @@ module Micro
239
243
  __get_result(false, value, type)
240
244
  end
241
245
 
246
+
247
+ def Check(type = nil, result: nil, on: Kind::Empty::HASH)
248
+ result_key = type || :check
249
+
250
+ if value
251
+ result = on[:success] || { result_key => true }
252
+
253
+ Success(type || :ok, result: result)
254
+ else
255
+ result = on[:failure] || { result_key => false }
256
+
257
+ Failure(type || :error, result: result)
258
+ end
259
+ end
260
+
242
261
  def __get_result(is_success, value, type)
243
262
  @__result.__set__(is_success, value, type, self)
244
263
  end
@@ -9,12 +9,12 @@ module Micro
9
9
 
10
10
  def enable_transitions=(value)
11
11
  Micro::Case::Result.class_variable_set(
12
- :@@transitions_enabled, Kind::Of::Boolean(value)
12
+ :@@transitions_enabled, Kind::Boolean[value]
13
13
  )
14
14
  end
15
15
 
16
16
  def enable_activemodel_validation=(value)
17
- return unless Kind::Of::Boolean(value)
17
+ return unless Kind::Boolean[value]
18
18
 
19
19
  require 'micro/case/with_activemodel_validation'
20
20
  end
@@ -22,7 +22,7 @@ module Micro
22
22
  def set_activemodel_validation_errors_failure=(value)
23
23
  return unless value
24
24
 
25
- @activemodel_validation_errors_failure = Kind.of(Symbol, value)
25
+ @activemodel_validation_errors_failure = Kind::Symbol[value]
26
26
  end
27
27
 
28
28
  def activemodel_validation_errors_failure
@@ -8,8 +8,6 @@ module Micro
8
8
  require 'micro/case/result/wrapper'
9
9
  require 'micro/case/result/transitions'
10
10
 
11
- Kind::Types.add(self)
12
-
13
11
  INVALID_INVOCATION_OF_THE_THEN_METHOD =
14
12
  Error::InvalidInvocationOfTheThenMethod.new("#{self.name}#")
15
13
 
@@ -41,7 +39,7 @@ module Micro
41
39
  instance_info = '%s (%s) type=:%s data=%s' % [pretty_type, self.class, @type, data]
42
40
  transitions_info = ' transitions=%d' % [@__transitions.size] if Micro::Case::Result.transitions_enabled?
43
41
 
44
- "<#{instance_info}#{transitions_info}>"
42
+ "#<#{instance_info}#{transitions_info}>"
45
43
  end
46
44
 
47
45
  def to_ary
@@ -113,7 +111,7 @@ module Micro
113
111
  def on_exception(expected_exception = nil)
114
112
  return self unless __failure_type?(:exception)
115
113
 
116
- if !expected_exception || (Kind.is(Exception, expected_exception) && data.fetch(:exception).is_a?(expected_exception))
114
+ if !expected_exception || (Kind.is?(Exception, expected_exception) && data.fetch(:exception).is_a?(expected_exception))
117
115
  yield(data, @use_case)
118
116
  end
119
117
 
@@ -138,32 +136,12 @@ module Micro
138
136
  yield_self(&block)
139
137
  else
140
138
  return yield_self if !use_case && can_yield_self
141
- return failure? ? self : __call_proc(use_case, 'then(-> {})'.freeze) if use_case.is_a?(Proc)
142
- return failure? ? self : __call_method(use_case, attributes) if use_case.is_a?(Method)
143
-
144
- raise INVALID_INVOCATION_OF_THE_THEN_METHOD unless ::Micro.case_or_flow?(use_case)
145
-
146
- return self if failure?
147
-
148
- input = attributes.is_a?(Hash) ? self.data.merge(attributes) : self.data
149
-
150
- if use_case.is_a?(::Micro::Cases::Flow)
151
- use_case.call!(input: input, result: self)
152
- else
153
- use_case.__new__(self, input).__call__
154
- end
139
+ return failure? ? self : __call_use_case(use_case, attributes)
155
140
  end
156
141
  end
157
142
 
158
143
  def |(arg)
159
- return self if failure?
160
-
161
- return __call_proc(arg, '| -> {}'.freeze) if arg.is_a?(Proc)
162
- return __call_method(arg) if arg.is_a?(Method)
163
-
164
- raise INVALID_INVOCATION_OF_THE_THEN_METHOD unless ::Micro.case_or_flow?(arg)
165
-
166
- failure? ? self : arg.__new__(self, data).__call__
144
+ failure? ? self : __call_use_case(arg)
167
145
  end
168
146
 
169
147
  def transitions
@@ -221,6 +199,28 @@ module Micro
221
199
  @__accessible_attributes.dup
222
200
  end
223
201
 
202
+ def __call_use_case(use_case, attributes = nil)
203
+ case use_case
204
+ when Proc
205
+ __call_proc(use_case, 'then(-> {})'.freeze)
206
+ when Method
207
+ __call_method(use_case, attributes)
208
+ when String, Symbol
209
+ use_case_method = self.use_case.method(use_case)
210
+ __call_method(use_case_method, attributes)
211
+ else
212
+ raise INVALID_INVOCATION_OF_THE_THEN_METHOD unless ::Micro.case_or_flow?(use_case)
213
+
214
+ input = attributes.is_a?(Hash) ? self.data.merge(attributes) : self.data
215
+
216
+ if use_case.is_a?(::Micro::Cases::Flow)
217
+ use_case.call!(input: input, result: self)
218
+ else
219
+ use_case.__new__(self, input).__call__
220
+ end
221
+ end
222
+ end
223
+
224
224
  def __call_proc(fn, expected)
225
225
  __update_accessible_attributes(@__accumulated_data)
226
226
 
@@ -4,38 +4,43 @@ module Micro
4
4
  class Case
5
5
  class Result
6
6
  class Wrapper
7
- def initialize(result)
8
- @__is_unknown = true
7
+ attr_reader :output
9
8
 
9
+ def initialize(result)
10
10
  @result = result
11
+ @output = ::Kind::Undefined
12
+
13
+ @__is_unknown = true
11
14
  end
12
15
 
13
16
  def failure(type = nil)
14
- return if @result.success?
17
+ return if @result.success? || !undefined_output?
15
18
 
16
- if result_type?(type)
17
- @__is_unknown = false
18
-
19
- yield(@result)
20
- end
19
+ set_output(yield(@result)) if result_type?(type)
21
20
  end
22
21
 
23
22
  def success(type = nil)
24
- return if @result.failure?
23
+ return if @result.failure? || !undefined_output?
25
24
 
26
- if result_type?(type)
27
- @__is_unknown = false
28
-
29
- yield(@result)
30
- end
25
+ set_output(yield(@result)) if result_type?(type)
31
26
  end
32
27
 
33
28
  def unknown
34
- return yield(@result) if @__is_unknown
29
+ @output = yield(@result) if @__is_unknown && undefined_output?
35
30
  end
36
31
 
37
32
  private
38
33
 
34
+ def set_output(value)
35
+ @__is_unknown = false
36
+
37
+ @output = value
38
+ end
39
+
40
+ def undefined_output?
41
+ ::Kind::Undefined == @output
42
+ end
43
+
39
44
  def result_type?(type)
40
45
  type.nil? || @result.type == type
41
46
  end
@@ -1,36 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Micro
4
- class Case
5
- module Utils
3
+ module Micro::Case::Utils
6
4
 
7
- module Hashes
8
- def self.respond_to?(hash, method)
9
- Kind.of(Hash, hash).respond_to?(method)
10
- end
11
-
12
- def self.symbolize_keys(hash)
13
- return hash.transform_keys { |key| key.to_sym rescue key } if respond_to?(hash, :transform_keys)
5
+ module Hashes
6
+ def self.respond_to?(hash, method)
7
+ Kind::Hash[hash].respond_to?(method)
8
+ end
14
9
 
15
- hash.each_with_object({}) do |(k, v), memo|
16
- key = k.to_sym rescue k
17
- memo[key] = v
18
- end
19
- end
10
+ def self.symbolize_keys(hash)
11
+ return hash.transform_keys { |key| key.to_sym rescue key } if respond_to?(hash, :transform_keys)
20
12
 
21
- def self.stringify_keys(hash)
22
- return hash.transform_keys(&:to_s) if respond_to?(hash, :transform_keys)
13
+ hash.each_with_object({}) do |(k, v), memo|
14
+ key = k.to_sym rescue k
15
+ memo[key] = v
16
+ end
17
+ end
23
18
 
24
- hash.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v }
25
- end
19
+ def self.stringify_keys(hash)
20
+ return hash.transform_keys(&:to_s) if respond_to?(hash, :transform_keys)
26
21
 
27
- def self.slice(hash, keys)
28
- return hash.slice(*keys) if respond_to?(hash, :slice)
22
+ hash.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v }
23
+ end
29
24
 
30
- hash.select { |key, _value| keys.include?(key) }
31
- end
32
- end
25
+ def self.slice(hash, keys)
26
+ return hash.slice(*keys) if respond_to?(hash, :slice)
33
27
 
28
+ hash.select { |key, _value| keys.include?(key) }
34
29
  end
35
30
  end
31
+
36
32
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Micro
4
4
  class Case
5
- VERSION = '4.2.0'.freeze
5
+ VERSION = '4.5.0'.freeze
6
6
  end
7
7
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'kind/active_model/validation'
3
+ require 'kind/validator'
4
4
 
5
5
  require 'micro/case'
6
6
 
@@ -16,16 +16,10 @@ module Micro
16
16
  @disable_auto_validation = true
17
17
  end
18
18
 
19
- def initialize(input)
20
- __setup_use_case(input)
21
-
22
- run_validations! if respond_to?(:run_validations!, true)
23
- end
24
-
25
19
  private
26
20
 
27
21
  def __call_use_case
28
- return failure_by_validation_error(self) if !self.class.auto_validation_disabled? && invalid?
22
+ return failure_by_validation_error(self) if !self.class.auto_validation_disabled? && errors.present?
29
23
 
30
24
  result = call!
31
25
 
@@ -23,7 +23,7 @@ module Micro
23
23
  end
24
24
 
25
25
  def inspect
26
- '<(%s) use_cases=%s>' % [self.class, @use_cases]
26
+ '#<(%s) use_cases=%s>' % [self.class, @use_cases]
27
27
  end
28
28
 
29
29
  def call!(input:, result:)
@@ -39,7 +39,11 @@ module Micro
39
39
 
40
40
  return result unless block_given?
41
41
 
42
- yield ::Micro::Case::Result::Wrapper.new(result)
42
+ result_wrapper = ::Micro::Case::Result::Wrapper.new(result)
43
+
44
+ yield(result_wrapper)
45
+
46
+ result_wrapper.output
43
47
  end
44
48
 
45
49
  alias __call__ call
@@ -5,7 +5,7 @@ module Micro
5
5
  class Map
6
6
  IsAUseCaseOrFlowWithDefaults = -> arg { arg.is_a?(Array) && Micro.case_or_flow?(arg[0]) && arg[1].is_a?(Hash) }
7
7
  IsAUseCaseOrFlow = -> arg { Micro.case_or_flow?(arg) || IsAUseCaseOrFlowWithDefaults[arg] }
8
- HasValidArgs = -> (args) { Kind.of(Array, args).all?(&IsAUseCaseOrFlow) }
8
+ HasValidArgs = -> (args) { Kind::Array[args].all?(&IsAUseCaseOrFlow) }
9
9
 
10
10
  attr_reader :use_cases
11
11
 
@@ -28,7 +28,7 @@ module Micro
28
28
  end
29
29
 
30
30
  def call(arg = {})
31
- hash = Kind.of(Hash, arg)
31
+ hash = Kind::Hash[arg]
32
32
 
33
33
  use_cases.map(&GetUseCaseResult[hash])
34
34
  end
data/u-case.gemspec CHANGED
@@ -25,8 +25,8 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.required_ruby_version = '>= 2.2.0'
27
27
 
28
- spec.add_runtime_dependency 'kind', '>= 3.0', '< 5.0'
29
- spec.add_runtime_dependency 'u-attributes', '~> 2.0'
28
+ spec.add_runtime_dependency 'kind', '>= 5.6', '< 6.0'
29
+ spec.add_runtime_dependency 'u-attributes', '>= 2.7', '< 3.0'
30
30
 
31
31
  spec.add_development_dependency 'bundler'
32
32
  spec.add_development_dependency 'rake', '~> 13.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: u-case
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 4.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Serradura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-19 00:00:00.000000000 Z
11
+ date: 2021-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kind
@@ -16,34 +16,40 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '5.6'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.0'
22
+ version: '6.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '3.0'
29
+ version: '5.6'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.0'
32
+ version: '6.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: u-attributes
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.7'
40
+ - - "<"
38
41
  - !ruby/object:Gem::Version
39
- version: '2.0'
42
+ version: '3.0'
40
43
  type: :runtime
41
44
  prerelease: false
42
45
  version_requirements: !ruby/object:Gem::Requirement
43
46
  requirements:
44
- - - "~>"
47
+ - - ">="
45
48
  - !ruby/object:Gem::Version
46
- version: '2.0'
49
+ version: '2.7'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.0'
47
53
  - !ruby/object:Gem::Dependency
48
54
  name: bundler
49
55
  requirement: !ruby/object:Gem::Requirement