u-service 0.13.1 → 0.14.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: b93d4099f9d4f7646b94241bb5b66190635dff1a56781c7aa152fb458acce958
4
- data.tar.gz: bf4a7a017a8fbc891904a74ffa80b8aaaadc577cfcfd178e062ed42410dfec9a
3
+ metadata.gz: a511f12c5bc76025f0156c65d934988065f1c51c0d540b67a2cf2f4dcde48f22
4
+ data.tar.gz: 12489e03b009e02bef85329051952f50866c06f0d585812e55146569b4d535ad
5
5
  SHA512:
6
- metadata.gz: 7d69adaf4e77a2707904a31a29ffd51abc866a27cdd210039b24c5def4ce9fbbbb0dec88e0b39bbfe6e855692d2a186c0931de6225d0269de6b972f048de936e
7
- data.tar.gz: eb3812b5a44fa8742560eee26e49fd987f6bb4a5fb30e35aafa6a0b6d870c4a96b62a9a1af5b5387c7a58b8e97d45e739b64b4768d95bdd53c3784fa4df879f2
6
+ metadata.gz: '0811b8d7893d0cb810345a582b3bb2c2a1dd2c0a21753e512212b9445e6f42bcab601e55ee1b683f2477ec72fa6ee690b741d23f105ffe63d1758dffa66fed50'
7
+ data.tar.gz: 950935aee3330a885206a85333894c2d27886bb1373ac7151efc95dbb9cdacc1ebe489967dafb1cca0351473460f0122e3d2cbbcea9ca52ea6836995a85de241
data/README.md CHANGED
@@ -183,9 +183,9 @@ module Steps
183
183
  end
184
184
  end
185
185
 
186
- #=================================================#
186
+ #-------------------------------------------------#
187
187
  # Creating a pipeline using the collection syntax #
188
- #=================================================#
188
+ #-------------------------------------------------#
189
189
 
190
190
  Add2ToAllNumbers = Micro::Service::Pipeline[
191
191
  Steps::ConvertToNumbers,
@@ -197,9 +197,9 @@ result = Add2ToAllNumbers.call(numbers: %w[1 1 2 2 3 4])
197
197
  p result.success? # true
198
198
  p result.value # {:numbers => [3, 3, 4, 4, 5, 6]}
199
199
 
200
- #=======================================================#
200
+ #-------------------------------------------------------#
201
201
  # An alternative way to create a pipeline using classes #
202
- #=======================================================#
202
+ #-------------------------------------------------------#
203
203
 
204
204
  class DoubleAllNumbers
205
205
  include Micro::Service::Pipeline
@@ -211,9 +211,9 @@ DoubleAllNumbers
211
211
  .call(numbers: %w[1 1 b 2 3 4])
212
212
  .on_failure { |message| p message } # "numbers must contain only numeric types"
213
213
 
214
- #=================================================================#
214
+ #-----------------------------------------------------------------#
215
215
  # Another way to create a pipeline using the composition operator #
216
- #=================================================================#
216
+ #-----------------------------------------------------------------#
217
217
 
218
218
  SquareAllNumbers =
219
219
  Steps::ConvertToNumbers >> Steps::Square
@@ -221,6 +221,21 @@ SquareAllNumbers =
221
221
  SquareAllNumbers
222
222
  .call(numbers: %w[1 1 2 2 3 4])
223
223
  .on_success { |value| p value[:numbers] } # [1, 1, 4, 4, 9, 16]
224
+
225
+ #=================================================================#
226
+ # Attention: #
227
+ # When happening a failure, the service object responsible for it #
228
+ # will be accessible in the result #
229
+ #=================================================================#
230
+
231
+ result = SquareAllNumbers.call(numbers: %w[1 1 b 2 3 4])
232
+
233
+ result.failure? # true
234
+ result.service.is_a?(Steps::ConvertToNumbers) # true
235
+
236
+ result.on_failure do |_message, service|
237
+ puts "#{service.class.name} was the service responsible by the failure" } # Steps::ConvertToNumbers was the service responsible by the failure
238
+ end
224
239
  ```
225
240
 
226
241
  ### What is a strict Service Object?
@@ -5,7 +5,7 @@ module Micro
5
5
  class Base
6
6
  include Micro::Attributes.without(:strict_initialize)
7
7
 
8
- UNEXPECTED_RESULT = '#call! must return a Micro::Service::Result instance'.freeze
8
+ UNEXPECTED_RESULT = '#call! must return an instance of Micro::Service::Result'.freeze
9
9
  InvalidResultInstance = ArgumentError.new('argument must be an instance of Micro::Service::Result'.freeze)
10
10
  ResultIsAlreadyDefined = ArgumentError.new('result is already defined'.freeze)
11
11
 
@@ -53,13 +53,13 @@ module Micro
53
53
  end
54
54
 
55
55
  def Success(arg = :ok)
56
- block_given? ? (value, type = yield, arg) : (value, type = arg, :ok)
57
- __get_result__.__set__(true, value, type)
56
+ value, type = block_given? ? [yield, arg] : [arg, :ok]
57
+ __get_result__.__set__(true, value, type, nil)
58
58
  end
59
59
 
60
60
  def Failure(arg = :error)
61
- block_given? ? (value, type = yield, arg) : (value, type = arg, :error)
62
- __get_result__.__set__(false, value, type)
61
+ value, type = block_given? ? [yield, arg] : [arg, :error]
62
+ __get_result__.__set__(false, value, type, self)
63
63
  end
64
64
  end
65
65
  end
@@ -45,7 +45,7 @@ module Micro
45
45
  return arg.call if arg_to_call?(arg)
46
46
  return arg if arg.is_a?(Micro::Service::Result)
47
47
  result = Micro::Service::Result.new
48
- result.__set__(true, arg, :ok)
48
+ result.__set__(true, arg, :ok, nil)
49
49
  end
50
50
 
51
51
  def arg_to_call?(arg)
@@ -3,14 +3,22 @@
3
3
  module Micro
4
4
  module Service
5
5
  class Result
6
- InvalidType = TypeError.new('type must be a symbol'.freeze)
6
+ InvalidType = TypeError.new('type must be a Symbol'.freeze)
7
+ InvalidService = TypeError.new('service must be a kind or an instance of Micro::Service::Base'.freeze)
8
+
9
+ class InvalidAccessToTheServiceObject < StandardError
10
+ MSG = 'only a failure result can access its service object'.freeze
11
+
12
+ def initialize(message = MSG); super; end
13
+ end
7
14
 
8
15
  attr_reader :value, :type
9
16
 
10
- def __set__(is_success, value, type)
17
+ def __set__(is_success, value, type, service)
11
18
  raise InvalidType unless type.is_a?(Symbol)
19
+ raise InvalidService if !is_success && !is_a_service?(service)
12
20
 
13
- @success, @value, @type = is_success, value, type
21
+ @success, @value, @type, @service = is_success, value, type, service
14
22
 
15
23
  self
16
24
  end
@@ -23,12 +31,18 @@ module Micro
23
31
  !success?
24
32
  end
25
33
 
34
+ def service
35
+ return @service if failure?
36
+
37
+ raise InvalidAccessToTheServiceObject
38
+ end
39
+
26
40
  def on_success(arg = :ok)
27
41
  self.tap { yield(value) if success_type?(arg) }
28
42
  end
29
43
 
30
44
  def on_failure(arg = :error)
31
- self.tap{ yield(value) if failure_type?(arg) }
45
+ self.tap{ yield(value, @service) if failure_type?(arg) }
32
46
  end
33
47
 
34
48
  private
@@ -40,6 +54,10 @@ module Micro
40
54
  def failure_type?(arg)
41
55
  failure? && (arg == :error || arg == type)
42
56
  end
57
+
58
+ def is_a_service?(arg)
59
+ (arg.is_a?(Class) && arg < Service::Base) || arg.is_a?(Service::Base)
60
+ end
43
61
  end
44
62
  end
45
63
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Micro
4
4
  module Service
5
- VERSION = '0.13.1'.freeze
5
+ VERSION = '0.14.0'.freeze
6
6
  end
7
7
  end
@@ -8,7 +8,7 @@ module Micro
8
8
  include Micro::Attributes::Features::ActiveModelValidations
9
9
 
10
10
  def call
11
- return Failure(:validation_error) { {errors: self.errors, service: self} } unless valid?
11
+ return Failure(:validation_error) { self.errors } unless valid?
12
12
 
13
13
  __call
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: u-service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.14.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: 2019-08-19 00:00:00.000000000 Z
11
+ date: 2019-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: u-attributes