u-case 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5a9b11b39c8c90670c4308c91e4e887871eb8f98a1fb739c4be71885a14d0b8
4
- data.tar.gz: d4ce16229a9afd7dd4d1a1cf8e5b11067a11a6317c6857264ba46b324b220994
3
+ metadata.gz: e43c3e14dcb10002feb94f83f7d9289b49164e5908f3e8b58fa64e62d69796db
4
+ data.tar.gz: 9f3a37d02e5e1c1369f74e8cdf14cc3038fad55df5db08bd1a330dd7004e5ba1
5
5
  SHA512:
6
- metadata.gz: '078f264aa7ca294bcbc12e97b4ef210a11a46151adc94d7954846e81f6e6f1647896969ee8fcf40b1bf715145b7adf029f7d22d26f226c7071d29ea477ca56b7'
7
- data.tar.gz: e5a24e5095cb1178e92919d3f953bfbc6d690242dffafb9b8cdc4ce7c00e943c9921d4013e76b3e062d4269d32b4e4f7bb133951cc0e395416090b36cbf91b36
6
+ metadata.gz: 744d7c78a228a3ae9197762f9e259dd72ab2f1b8c20af968fca4cbe46931c703abd9aa051c4aa0669b61f51b14d42a990834dc4fc34dc2f60a9f20d68867fbab
7
+ data.tar.gz: 7da45bc3752296dd000bf016ef35ff7c993d0ea5c2218e43e6f1d492ec7d41f457e7048cf8b281d0ecb6f40efe05df19d07809d69db3a7a41df02f10028a7e68
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  </p>
7
7
 
8
8
  <p align="center">
9
- <img src="https://img.shields.io/badge/ruby-2.2+-ruby.svg?colorA=99004d&colorB=cc0066" alt="Ruby">
9
+ <img src="https://img.shields.io/badge/ruby->%3D%202.2.0-ruby.svg?colorA=99004d&colorB=cc0066" alt="Ruby">
10
10
 
11
11
  <a href="https://rubygems.org/gems/u-case">
12
12
  <img alt="Gem" src="https://img.shields.io/gem/v/u-case.svg?style=flat-square">
@@ -38,7 +38,8 @@ The main project goals are:
38
38
 
39
39
  Version | Documentation
40
40
  --------- | -------------
41
- 4.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.1.0 | https://github.com/serradura/u-case/blob/v4.x/README.md
42
43
  3.1.0 | https://github.com/serradura/u-case/blob/v3.x/README.md
43
44
  2.6.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
44
45
  1.1.0 | https://github.com/serradura/u-case/blob/v1.x/README.md
@@ -100,7 +101,8 @@ Version | Documentation
100
101
 
101
102
  | u-case | branch | ruby | activemodel | u-attributes |
102
103
  | -------------- | ------- | -------- | ------------- | ------------ |
103
- | 4.0.0 | main | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
104
+ | unreleased | main | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
105
+ | 4.1.0 | v4.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
104
106
  | 3.1.0 | v3.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
105
107
  | 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
106
108
  | 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
@@ -124,7 +126,7 @@ Version | Documentation
124
126
  Add this line to your application's Gemfile:
125
127
 
126
128
  ```ruby
127
- gem 'u-case', '~> 3.1.0'
129
+ gem 'u-case', '~> 4.1.0'
128
130
  ```
129
131
 
130
132
  And then execute:
@@ -38,7 +38,8 @@ Principais objetivos deste projeto:
38
38
 
39
39
  Versão | Documentação
40
40
  --------- | -------------
41
- 4.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.1.0 | https://github.com/serradura/u-case/blob/v4.x/README.md
42
43
  3.1.0 | https://github.com/serradura/u-case/blob/v3.x/README.md
43
44
  2.6.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
44
45
  1.1.0 | https://github.com/serradura/u-case/blob/v1.x/README.md
@@ -99,7 +100,7 @@ Versão | Documentação
99
100
 
100
101
  | u-case | branch | ruby | activemodel | u-attributes |
101
102
  | -------------- | ------- | -------- | ------------- | ------------ |
102
- | 4.0.0 | main | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
103
+ | 4.1.0 | main | >= 2.2.0 | >= 3.2, < 6.1 | ~> 2.0 |
103
104
  | 3.1.0 | v3.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
104
105
  | 2.6.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
105
106
  | 1.1.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 | ~> 1.1 |
@@ -123,7 +124,7 @@ Versão | Documentação
123
124
  Adicione essa linha ao Gemfile da sua aplicação:
124
125
 
125
126
  ```ruby
126
- gem 'u-case', '~> 3.1.0'
127
+ gem 'u-case', '~> 4.1.0'
127
128
  ```
128
129
 
129
130
  E então execute:
@@ -7,6 +7,7 @@ require 'micro/case/version'
7
7
 
8
8
  module Micro
9
9
  class Case
10
+ require 'micro/cases/utils'
10
11
  require 'micro/case/utils'
11
12
  require 'micro/case/error'
12
13
  require 'micro/case/result'
@@ -16,10 +17,14 @@ module Micro
16
17
 
17
18
  require 'micro/cases'
18
19
 
19
- include Micro::Attributes.with(:initialize, :diff)
20
+ include Micro::Attributes
20
21
 
21
- def self.call(options = Kind::Empty::HASH)
22
- new(options).__call__
22
+ def self.call(input = Kind::Empty::HASH)
23
+ result = __new__(Result.new, input).__call__
24
+
25
+ return result unless block_given?
26
+
27
+ yield Result::Wrapper.new(result)
23
28
  end
24
29
 
25
30
  INVALID_INVOCATION_OF_THE_THEN_METHOD =
@@ -47,7 +52,7 @@ module Micro
47
52
  end
48
53
 
49
54
  def self.flow(*args)
50
- @__flow_use_cases = args
55
+ @__flow_use_cases = Cases::Utils.map_use_cases(args)
51
56
  end
52
57
 
53
58
  class << self
@@ -81,6 +86,8 @@ module Micro
81
86
  new(input).__set_result__(result)
82
87
  end
83
88
 
89
+ private_class_method :new
90
+
84
91
  def self.__flow_builder__
85
92
  Cases::Flow
86
93
  end
@@ -122,6 +129,14 @@ module Micro
122
129
  __flow_set(__flow_use_cases_get) if !__flow_get__ && __flow_use_cases
123
130
  end
124
131
 
132
+ def self.inspect
133
+ if __flow_use_cases
134
+ '<%s (%s) use_cases=%s>' % [self, __flow_builder__, @__flow_use_cases]
135
+ else
136
+ '<%s (%s) attributes=%s>' % [self, self.superclass, attributes]
137
+ end
138
+ end
139
+
125
140
  def initialize(input)
126
141
  __setup_use_case(input)
127
142
  end
@@ -131,7 +146,7 @@ module Micro
131
146
  end
132
147
 
133
148
  def __call__
134
- call
149
+ __call_the_use_case_or_its_flow
135
150
  end
136
151
 
137
152
  def __set_result__(result)
@@ -145,12 +160,21 @@ module Micro
145
160
 
146
161
  private
147
162
 
163
+ def call(use_case, defaults = Kind::Empty::HASH)
164
+ raise Error::InvalidUseCase unless ::Micro.case_or_flow?(use_case)
165
+
166
+ input =
167
+ defaults.empty? ? attributes : attributes.merge(Utils::Hashes.stringify_keys(defaults))
168
+
169
+ use_case.__new__(@__result, input).__call__
170
+ end
171
+
148
172
  def apply(name)
149
173
  method(name)
150
174
  end
151
175
 
152
- def call
153
- return __call_use_case_flow if __call_use_case_flow?
176
+ def __call_the_use_case_or_its_flow
177
+ return __call_the_use_case_flow if __call_the_use_case_flow?
154
178
 
155
179
  __call_use_case
156
180
  end
@@ -171,11 +195,11 @@ module Micro
171
195
  raise Error::UnexpectedResult.new("#{self.class.name}#call!")
172
196
  end
173
197
 
174
- def __call_use_case_flow?
198
+ def __call_the_use_case_flow?
175
199
  self.class.__flow_get__
176
200
  end
177
201
 
178
- def __call_use_case_flow
202
+ def __call_the_use_case_flow
179
203
  self.class.__flow_get__.call(@__input)
180
204
  end
181
205
 
@@ -201,18 +225,18 @@ module Micro
201
225
  __get_result(false, value, type)
202
226
  end
203
227
 
204
- def __result
205
- @__result ||= Result.new
206
- end
207
-
208
228
  def __get_result(is_success, value, type)
209
- __result.__set__(is_success, value, type, self)
229
+ @__result.__set__(is_success, value, type, self)
210
230
  end
211
231
 
212
232
  private_constant :MapFailureType, :INVALID_INVOCATION_OF_THE_THEN_METHOD
213
233
  end
214
234
 
235
+ def self.case?(arg)
236
+ arg.is_a?(Class) && arg < Case
237
+ end
238
+
215
239
  def self.case_or_flow?(arg)
216
- (arg.is_a?(Class) && arg < Case) || arg.is_a?(Cases::Flow)
240
+ case?(arg) || arg.is_a?(Cases::Flow)
217
241
  end
218
242
  end
@@ -5,6 +5,7 @@ require 'set'
5
5
  module Micro
6
6
  class Case
7
7
  class Result
8
+ require 'micro/case/result/wrapper'
8
9
  require 'micro/case/result/transitions'
9
10
 
10
11
  Kind::Types.add(self)
@@ -23,15 +24,26 @@ module Micro
23
24
  alias value data
24
25
 
25
26
  def initialize(transitions_mapper = Transitions::MapEverything)
27
+ enable_transitions = @@transitions_enabled
28
+
29
+ @__is_unknown = true
26
30
  @__accumulated_data = {}
31
+ @__tracked_use_cases = Set.new
27
32
  @__accessible_attributes = {}
28
33
 
29
- enable_transitions = @@transitions_enabled
30
-
31
34
  @__transitions = enable_transitions ? [] : Kind::Empty::ARRAY
32
35
  @__transitions_mapper = transitions_mapper if enable_transitions
33
36
  end
34
37
 
38
+ def inspect
39
+ pretty_type = @__success ? 'Success' : 'Failure'
40
+
41
+ instance_info = '%s (%s) type=:%s data=%s' % [pretty_type, self.class, @type, data]
42
+ transitions_info = ' transitions=%d' % [@__transitions.size] if Micro::Case::Result.transitions_enabled?
43
+
44
+ "<#{instance_info}#{transitions_info}>"
45
+ end
46
+
35
47
  def to_ary
36
48
  [data, type]
37
49
  end
@@ -57,7 +69,7 @@ module Micro
57
69
  end
58
70
 
59
71
  def slice(*keys)
60
- Utils.slice_hash(data, keys)
72
+ Utils::Hashes.slice(data, keys)
61
73
  end
62
74
 
63
75
  def success?
@@ -68,6 +80,10 @@ module Micro
68
80
  !success?
69
81
  end
70
82
 
83
+ def unknown?
84
+ @__is_unknown
85
+ end
86
+
71
87
  def accessible_attributes
72
88
  @__accessible_attributes.keys
73
89
  end
@@ -75,6 +91,7 @@ module Micro
75
91
  def on_success(expected_type = nil)
76
92
  return self unless __success_type?(expected_type)
77
93
 
94
+ @__is_unknown = false
78
95
  hook_data = expected_type.nil? ? self : data
79
96
 
80
97
  yield(hook_data, @use_case)
@@ -85,6 +102,7 @@ module Micro
85
102
  def on_failure(expected_type = nil)
86
103
  return self unless __failure_type?(expected_type)
87
104
 
105
+ @__is_unknown = false
88
106
  hook_data = expected_type.nil? ? self : data
89
107
 
90
108
  yield(hook_data, @use_case)
@@ -102,6 +120,14 @@ module Micro
102
120
  self
103
121
  end
104
122
 
123
+ def on_unknown
124
+ return self unless unknown?
125
+
126
+ yield(self, @use_case)
127
+
128
+ self
129
+ end
130
+
105
131
  def then(use_case = nil, attributes = nil, &block)
106
132
  can_yield_self = respond_to?(:yield_self)
107
133
 
@@ -163,9 +189,13 @@ module Micro
163
189
 
164
190
  @__accumulated_data.merge!(@data)
165
191
 
166
- use_case_attributes = Utils.symbolize_hash_keys(@use_case.attributes)
192
+ use_case_attributes = Utils::Hashes.symbolize_keys(@use_case.attributes)
167
193
 
168
- __update_accessible_attributes(use_case_attributes)
194
+ unless @__tracked_use_cases.member?(use_case_class = @use_case.class)
195
+ @__tracked_use_cases.add(use_case_class)
196
+
197
+ __update_accessible_attributes(use_case_attributes)
198
+ end
169
199
 
170
200
  __set_transition(use_case_attributes) unless @__transitions.frozen?
171
201
 
@@ -175,7 +205,7 @@ module Micro
175
205
  def __set_accessible_attributes__(arg)
176
206
  return arg unless arg.is_a?(Hash)
177
207
 
178
- attributes = Utils.symbolize_hash_keys(arg)
208
+ attributes = Utils::Hashes.symbolize_keys(arg)
179
209
 
180
210
  __update_accessible_attributes(attributes)
181
211
  __fetch_accessible_attributes
@@ -15,4 +15,3 @@ module Micro
15
15
  end
16
16
  end
17
17
  end
18
-
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Micro
4
+ class Case
5
+ class Result
6
+ class Wrapper
7
+ def initialize(result)
8
+ @__is_unknown = true
9
+
10
+ @result = result
11
+ end
12
+
13
+ def failure(type = nil)
14
+ return if @result.success?
15
+
16
+ if result_type?(type)
17
+ @__is_unknown = false
18
+
19
+ yield(@result)
20
+ end
21
+ end
22
+
23
+ def success(type = nil)
24
+ return if @result.failure?
25
+
26
+ if result_type?(type)
27
+ @__is_unknown = false
28
+
29
+ yield(@result)
30
+ end
31
+ end
32
+
33
+ def unknown
34
+ return yield(@result) if @__is_unknown
35
+ end
36
+
37
+ private
38
+
39
+ def result_type?(type)
40
+ type.nil? || @result.type == type
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -8,7 +8,7 @@ module Micro
8
8
  end
9
9
 
10
10
  def __call__
11
- call
11
+ __call_the_use_case_or_its_flow
12
12
  rescue => exception
13
13
  raise exception if Error.by_wrong_usage?(exception)
14
14
 
@@ -3,25 +3,34 @@
3
3
  module Micro
4
4
  class Case
5
5
  module Utils
6
- def self.symbolize_hash_keys(hash)
7
- if Kind::Of::Hash(hash).respond_to?(:transform_keys)
8
- hash.transform_keys { |key| key.to_sym rescue key }
9
- else
6
+
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)
14
+
10
15
  hash.each_with_object({}) do |(k, v), memo|
11
16
  key = k.to_sym rescue k
12
-
13
17
  memo[key] = v
14
18
  end
15
19
  end
16
- end
17
20
 
18
- def self.slice_hash(hash, keys)
19
- if Kind::Of::Hash(hash).respond_to?(:slice)
20
- hash.slice(*keys)
21
- else
21
+ def self.stringify_keys(hash)
22
+ return hash.transform_keys(&:to_s) if respond_to?(hash, :transform_keys)
23
+
24
+ hash.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v }
25
+ end
26
+
27
+ def self.slice(hash, keys)
28
+ return hash.slice(*keys) if respond_to?(hash, :slice)
29
+
22
30
  hash.select { |key, _value| keys.include?(key) }
23
31
  end
24
32
  end
33
+
25
34
  end
26
35
  end
27
36
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Micro
4
4
  class Case
5
- VERSION = '4.0.0'.freeze
5
+ VERSION = '4.1.0'.freeze
6
6
  end
7
7
  end
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'micro/cases/utils'
4
+ require 'micro/cases/error'
3
5
  require 'micro/cases/flow'
4
6
  require 'micro/cases/safe/flow'
7
+ require 'micro/cases/map'
5
8
 
6
9
  module Micro
7
10
  module Cases
@@ -12,5 +15,9 @@ module Micro
12
15
  def self.safe_flow(args)
13
16
  Safe::Flow.build(args)
14
17
  end
18
+
19
+ def self.map(args)
20
+ Map.build(args)
21
+ end
15
22
  end
16
23
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Micro
4
+ module Cases
5
+
6
+ module Error
7
+ class InvalidUseCases < ArgumentError
8
+ def initialize; super('argument must be a collection of `Micro::Case` classes'.freeze); end
9
+ end
10
+ end
11
+
12
+ end
13
+ end
@@ -3,20 +3,15 @@
3
3
  module Micro
4
4
  module Cases
5
5
  class Flow
6
- class InvalidUseCases < ArgumentError
7
- def initialize; super('argument must be a collection of `Micro::Case` classes'.freeze); end
8
- end
6
+ IsAUseCaseWithDefaults = -> arg { arg.is_a?(Array) && Micro.case?(arg[0]) && arg[1].is_a?(Hash) }
7
+ IsAValidUseCase = -> use_case { Micro.case?(use_case) || IsAUseCaseWithDefaults[use_case] }
9
8
 
10
9
  attr_reader :use_cases
11
10
 
12
- def self.map_use_cases(arg)
13
- arg.is_a?(Flow) ? arg.use_cases : Array(arg)
14
- end
15
-
16
11
  def self.build(args)
17
- use_cases = Array(args).flat_map { |arg| map_use_cases(arg) }
12
+ use_cases = Utils.map_use_cases(args)
18
13
 
19
- raise InvalidUseCases if use_cases.any? { |klass| !(klass < ::Micro::Case) }
14
+ raise Error::InvalidUseCases if use_cases.none?(&IsAValidUseCase)
20
15
 
21
16
  new(use_cases)
22
17
  end
@@ -27,8 +22,12 @@ module Micro
27
22
  @first = @next_ones.shift
28
23
  end
29
24
 
25
+ def inspect
26
+ '<(%s) use_cases=%s>' % [self.class, @use_cases]
27
+ end
28
+
30
29
  def call!(input:, result:)
31
- first_result = __case_use_case(@first, result, input)
30
+ first_result = __call_use_case(@first, result, input)
32
31
 
33
32
  return first_result if @next_ones.empty?
34
33
 
@@ -36,7 +35,11 @@ module Micro
36
35
  end
37
36
 
38
37
  def call(input = Kind::Empty::HASH)
39
- call!(input: input, result: Case::Result.new)
38
+ result = call!(input: input, result: Case::Result.new)
39
+
40
+ return result unless block_given?
41
+
42
+ yield ::Micro::Case::Result::Wrapper.new(result)
40
43
  end
41
44
 
42
45
  alias __call__ call
@@ -68,17 +71,23 @@ module Micro
68
71
  raise Case::Error::InvalidInvocationOfTheThenMethod.new("#{self.class.name}#")
69
72
  end
70
73
 
71
- def __case_use_case(use_case, result, input)
72
- use_case.__new__(result, input).__call__
74
+ def __call_use_case(use_case, result, input)
75
+ __build_use_case(use_case, result, input).__call__
73
76
  end
74
77
 
75
78
  def __call_next_use_cases(first_result)
76
79
  @next_ones.reduce(first_result) do |result, use_case|
77
80
  break result if result.failure?
78
81
 
79
- __case_use_case(use_case, result, result.data)
82
+ __call_use_case(use_case, result, result.data)
80
83
  end
81
84
  end
85
+
86
+ def __build_use_case(use_case, result, input)
87
+ return use_case.__new__(result, input) unless use_case.is_a?(Array)
88
+
89
+ use_case[0].__new__(result, input.merge(use_case[1]))
90
+ end
82
91
  end
83
92
  end
84
93
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Micro
4
+ module Cases
5
+ class Map
6
+ IsAUseCaseOrFlowWithDefaults = -> arg { arg.is_a?(Array) && Micro.case_or_flow?(arg[0]) && arg[1].is_a?(Hash) }
7
+ IsAUseCaseOrFlow = -> arg { Micro.case_or_flow?(arg) || IsAUseCaseOrFlowWithDefaults[arg] }
8
+ HasValidArgs = -> (args) { Kind.of(Array, args).all?(&IsAUseCaseOrFlow) }
9
+
10
+ attr_reader :use_cases
11
+
12
+ def self.build(args)
13
+ raise Error::InvalidUseCases unless HasValidArgs[args]
14
+
15
+ new(args)
16
+ end
17
+
18
+ def initialize(use_cases)
19
+ @use_cases = use_cases
20
+ end
21
+
22
+ GetUseCaseResult = -> (hash) do
23
+ -> (use_case) do
24
+ return use_case.call(hash) unless use_case.is_a?(Array)
25
+
26
+ use_case[0].call(hash.merge(use_case[1]))
27
+ end
28
+ end
29
+
30
+ def call(arg = {})
31
+ hash = Kind.of(Hash, arg)
32
+
33
+ use_cases.map(&GetUseCaseResult[hash])
34
+ end
35
+
36
+ private_constant :HasValidArgs, :IsAUseCaseOrFlow, :IsAUseCaseOrFlowWithDefaults, :GetUseCaseResult
37
+ end
38
+ end
39
+ end
@@ -4,8 +4,8 @@ module Micro
4
4
  module Cases
5
5
  module Safe
6
6
  class Flow < Cases::Flow
7
- private def __case_use_case(use_case, result, input)
8
- instance = use_case.__new__(result, input)
7
+ private def __call_use_case(use_case, result, input)
8
+ instance = __build_use_case(use_case, result, input)
9
9
  instance.__call__
10
10
  rescue => exception
11
11
  raise exception if Case::Error.by_wrong_usage?(exception)
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Micro
4
+ module Cases
5
+
6
+ module Utils
7
+ def self.map_use_cases(args)
8
+ collection = args.is_a?(Array) && args.size == 1 ? args[0] : args
9
+
10
+ Array(collection).each_with_object([]) do |arg, memo|
11
+ if arg.is_a?(Flow)
12
+ arg.use_cases.each { |use_case| memo << use_case }
13
+ else
14
+ memo << arg
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ end
21
+ end
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.0.0
4
+ version: 4.1.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-08-21 00:00:00.000000000 Z
11
+ date: 2020-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kind
@@ -97,14 +97,18 @@ files:
97
97
  - lib/micro/case/error.rb
98
98
  - lib/micro/case/result.rb
99
99
  - lib/micro/case/result/transitions.rb
100
+ - lib/micro/case/result/wrapper.rb
100
101
  - lib/micro/case/safe.rb
101
102
  - lib/micro/case/strict.rb
102
103
  - lib/micro/case/utils.rb
103
104
  - lib/micro/case/version.rb
104
105
  - lib/micro/case/with_activemodel_validation.rb
105
106
  - lib/micro/cases.rb
107
+ - lib/micro/cases/error.rb
106
108
  - lib/micro/cases/flow.rb
109
+ - lib/micro/cases/map.rb
107
110
  - lib/micro/cases/safe/flow.rb
111
+ - lib/micro/cases/utils.rb
108
112
  - lib/u-case.rb
109
113
  - lib/u-case/with_activemodel_validation.rb
110
114
  - test.sh