u-service 0.11.0 → 0.12.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: e760358632fb06d0fb235f3b01723b1de144c21be568f7db9bca62b7e9b1910b
4
- data.tar.gz: 7601fde72507d36673a6868a29b2ce382c8e1ce910514530c275ffb8bb6ec1b5
3
+ metadata.gz: 020c6ab3c508004af1b58aa443ed52b67ec587fbc23ce11c4c410dd2806af3cc
4
+ data.tar.gz: 4b528fe880ce14dadf398a1491cd9ae7b36a6a08a1d4a8cf0e8d9de48f6a0bf8
5
5
  SHA512:
6
- metadata.gz: bd4ea2da734b495a14fcfdf2c42513eb80d5cd677910c8b84eb0e093effaee151c124393f25a08bc2e41c249d50aa0022b15a734e55aa6fccd24755d9b4be236
7
- data.tar.gz: 81981c5a33bb3558f40a233cc0e5112cda17c2b2938ee3106cda1ec2dce7b98eddd384b58dbd2e6a4ae29e9c2e86ac4fb23c2d3b61b64cf485669ac6d0779845
6
+ metadata.gz: 1ece16f4c64119f8485ebbf1dbfe23f82c3a7cda4bd4e60da2f92fb0992d192ecf59383a5d8624f8d0fd125dd4c7e88f37ffebab51182c366bc29fac6e85f40f
7
+ data.tar.gz: 16abd91aa04f7db43b9ff21e2f0ed8d2cb6fdeb6605d6356cd24cadc4feba78090f7236533b5572923e2ae5b186827216f496bdeda7353edc68554aed4bae82a
data/README.md CHANGED
@@ -23,6 +23,8 @@ The main goals of this project are:
23
23
  - [What is a strict Service Object?](#what-is-a-strict-service-object)
24
24
  - [How to validate Service Object attributes?](#how-to-validate-service-object-attributes)
25
25
  - [It's possible to compose pipelines with other pipelines?](#its-possible-to-compose-pipelines-with-other-pipelines)
26
+ - [Comparisons](#comparisons)
27
+ - [Benchmarks](#benchmarks)
26
28
  - [Development](#development)
27
29
  - [Contributing](#contributing)
28
30
  - [License](#license)
@@ -345,6 +347,20 @@ SquareAllNumbersAndDoubleThem
345
347
 
346
348
  Note: You can blend any of the [syntaxes/approaches to create the pipelines](#how-to-create-a-pipeline-of-service-objects)) - [examples](https://github.com/serradura/u-service/blob/master/test/micro/service/pipeline/blend_test.rb#L7-L34).
347
349
 
350
+ ## Comparisons
351
+
352
+ Check it out implementations of the same use case with different libs (abstractions).
353
+
354
+ * [interactor](https://github.com/serradura/u-service/blob/master/comparisons/interactor.rb)
355
+ * [u-service](https://github.com/serradura/u-service/blob/master/comparisons/u-service.rb)
356
+
357
+ ## Benchmarks
358
+
359
+ **[interactor](https://github.com/collectiveidea/interactor)** VS **[u-service](https://github.com/serradura/u-service)**
360
+
361
+ https://github.com/serradura/u-service/tree/master/benchmarks/interactor
362
+
363
+
348
364
  ## Development
349
365
 
350
366
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `./test.sh` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,134 @@
1
+ require 'bundler/inline'
2
+
3
+ gemfile do
4
+ source 'https://rubygems.org'
5
+
6
+ gem 'benchmark-ips', '~> 2.7', '>= 2.7.2'
7
+ gem 'interactor', '~> 3.1', '>= 3.1.1'
8
+ gem 'u-service', '~> 0.11.0'
9
+ end
10
+
11
+ require 'benchmark/ips'
12
+
13
+ module MSB
14
+ class ConvertToNumbers < Micro::Service::Base
15
+ attribute :numbers
16
+
17
+ def call!
18
+ if numbers.all? { |value| String(value) =~ /\d+/ }
19
+ Success(numbers: numbers.map(&:to_i))
20
+ else
21
+ Failure(numbers: 'must contain only numeric types')
22
+ end
23
+ end
24
+ end
25
+
26
+ class Add2 < Micro::Service::Base
27
+ attribute :numbers
28
+
29
+ def call!
30
+ Success(numbers: numbers.map { |number| number + 2 })
31
+ end
32
+ end
33
+
34
+ Add2ToAllNumbers = ConvertToNumbers >> Add2
35
+ end
36
+
37
+ module MSS
38
+ class ConvertToNumbers < Micro::Service::Strict
39
+ attribute :numbers
40
+
41
+ def call!
42
+ if numbers.all? { |value| String(value) =~ /\d+/ }
43
+ Success(numbers: numbers.map(&:to_i))
44
+ else
45
+ Failure(numbers: 'must contain only numeric types')
46
+ end
47
+ end
48
+ end
49
+
50
+ class Add2 < Micro::Service::Strict
51
+ attribute :numbers
52
+
53
+ def call!
54
+ Success(numbers: numbers.map { |number| number + 2 })
55
+ end
56
+ end
57
+
58
+ Add2ToAllNumbers = ConvertToNumbers >> Add2
59
+ end
60
+
61
+ module IT
62
+ class ConvertToNumbers
63
+ include Interactor
64
+
65
+ def call
66
+ numbers = context.numbers
67
+
68
+ if numbers.all? { |value| String(value) =~ /\d+/ }
69
+ context.numbers = numbers.map(&:to_i)
70
+ else
71
+ context.fail! numbers: 'must contain only numeric types'
72
+ end
73
+ end
74
+ end
75
+
76
+ class Add2
77
+ include Interactor
78
+
79
+ def call
80
+ numbers = context.numbers
81
+
82
+ context.numbers = numbers.map { |number| number + 2 }
83
+ end
84
+ end
85
+
86
+ class Add2ToAllNumbers
87
+ include Interactor::Organizer
88
+
89
+ organize ConvertToNumbers, Add2
90
+ end
91
+ end
92
+
93
+ NUMBERS = {numbers: %w[1 1 2 2 c 4]}
94
+
95
+ Benchmark.ips do |x|
96
+ x.config(:time => 5, :warmup => 2)
97
+
98
+ x.time = 5
99
+ x.warmup = 2
100
+
101
+ x.report('Pipeline of Micro::Service::Base') do
102
+ MSB::Add2ToAllNumbers.call(NUMBERS)
103
+ end
104
+
105
+ x.report('Pipeline of Micro::Service::Strict') do
106
+ MSS::Add2ToAllNumbers.call(NUMBERS)
107
+ end
108
+
109
+ x.report('Interactor::Organizer') do
110
+ IT::Add2ToAllNumbers.call(NUMBERS)
111
+ end
112
+
113
+ x.compare!
114
+ end
115
+
116
+ # Warming up --------------------------------------
117
+ # Pipeline of Micro::Service::Base
118
+ # 5.437k i/100ms
119
+ # Pipeline of Micro::Service::Strict
120
+ # 5.192k i/100ms
121
+ # Interactor::Organizer
122
+ # 2.236k i/100ms
123
+ # Calculating -------------------------------------
124
+ # Pipeline of Micro::Service::Base
125
+ # 56.665k (± 1.9%) i/s - 288.161k in 5.087185s
126
+ # Pipeline of Micro::Service::Strict
127
+ # 52.914k (± 2.0%) i/s - 264.792k in 5.006157s
128
+ # Interactor::Organizer
129
+ # 22.940k (± 2.9%) i/s - 116.272k in 5.072931s
130
+
131
+ # Comparison:
132
+ # Pipeline of Micro::Service::Base: 56665.3 i/s
133
+ # Pipeline of Micro::Service::Strict: 52914.3 i/s - 1.07x slower
134
+ # Interactor::Organizer: 22940.3 i/s - 2.47x slower
@@ -0,0 +1,134 @@
1
+ require 'bundler/inline'
2
+
3
+ gemfile do
4
+ source 'https://rubygems.org'
5
+
6
+ gem 'benchmark-ips', '~> 2.7', '>= 2.7.2'
7
+ gem 'interactor', '~> 3.1', '>= 3.1.1'
8
+ gem 'u-service', '~> 0.11.0'
9
+ end
10
+
11
+ require 'benchmark/ips'
12
+
13
+ module MSB
14
+ class ConvertToNumbers < Micro::Service::Base
15
+ attribute :numbers
16
+
17
+ def call!
18
+ if numbers.all? { |value| String(value) =~ /\d+/ }
19
+ Success(numbers: numbers.map(&:to_i))
20
+ else
21
+ Failure(numbers: 'must contain only numeric types')
22
+ end
23
+ end
24
+ end
25
+
26
+ class Add2 < Micro::Service::Base
27
+ attribute :numbers
28
+
29
+ def call!
30
+ Success(numbers: numbers.map { |number| number + 2 })
31
+ end
32
+ end
33
+
34
+ Add2ToAllNumbers = ConvertToNumbers >> Add2
35
+ end
36
+
37
+ module MSS
38
+ class ConvertToNumbers < Micro::Service::Strict
39
+ attribute :numbers
40
+
41
+ def call!
42
+ if numbers.all? { |value| String(value) =~ /\d+/ }
43
+ Success(numbers: numbers.map(&:to_i))
44
+ else
45
+ Failure(numbers: 'must contain only numeric types')
46
+ end
47
+ end
48
+ end
49
+
50
+ class Add2 < Micro::Service::Strict
51
+ attribute :numbers
52
+
53
+ def call!
54
+ Success(numbers: numbers.map { |number| number + 2 })
55
+ end
56
+ end
57
+
58
+ Add2ToAllNumbers = ConvertToNumbers >> Add2
59
+ end
60
+
61
+ module IT
62
+ class ConvertToNumbers
63
+ include Interactor
64
+
65
+ def call
66
+ numbers = context.numbers
67
+
68
+ if numbers.all? { |value| String(value) =~ /\d+/ }
69
+ context.numbers = numbers.map(&:to_i)
70
+ else
71
+ context.fail! numbers: 'must contain only numeric types'
72
+ end
73
+ end
74
+ end
75
+
76
+ class Add2
77
+ include Interactor
78
+
79
+ def call
80
+ numbers = context.numbers
81
+
82
+ context.numbers = numbers.map { |number| number + 2 }
83
+ end
84
+ end
85
+
86
+ class Add2ToAllNumbers
87
+ include Interactor::Organizer
88
+
89
+ organize ConvertToNumbers, Add2
90
+ end
91
+ end
92
+
93
+ NUMBERS = {numbers: %w[1 1 2 2 3 4]}
94
+
95
+ Benchmark.ips do |x|
96
+ x.config(:time => 5, :warmup => 2)
97
+
98
+ x.time = 5
99
+ x.warmup = 2
100
+
101
+ x.report('Pipeline of Micro::Service::Base') do
102
+ MSB::Add2ToAllNumbers.call(NUMBERS)
103
+ end
104
+
105
+ x.report('Pipeline of Micro::Service::Strict') do
106
+ MSS::Add2ToAllNumbers.call(NUMBERS)
107
+ end
108
+
109
+ x.report('Interactor::Organizer') do
110
+ IT::Add2ToAllNumbers.call(NUMBERS)
111
+ end
112
+
113
+ x.compare!
114
+ end
115
+
116
+ # Warming up --------------------------------------
117
+ # Pipeline of Micro::Service::Base
118
+ # 3.578k i/100ms
119
+ # Pipeline of Micro::Service::Strict
120
+ # 3.177k i/100ms
121
+ # Interactor::Organizer
122
+ # 4.695k i/100ms
123
+ # Calculating -------------------------------------
124
+ # Pipeline of Micro::Service::Base
125
+ # 36.087k (± 6.9%) i/s - 182.478k in 5.084835s
126
+ # Pipeline of Micro::Service::Strict
127
+ # 31.329k (± 6.7%) i/s - 158.850k in 5.094012s
128
+ # Interactor::Organizer
129
+ # 46.294k (± 6.6%) i/s - 234.750k in 5.093117s
130
+
131
+ # Comparison:
132
+ # Interactor::Organizer: 46293.6 i/s
133
+ # Pipeline of Micro::Service::Base: 36086.5 i/s - 1.28x slower
134
+ # Pipeline of Micro::Service::Strict: 31328.5 i/s - 1.48x slower
@@ -0,0 +1,93 @@
1
+ require 'bundler/inline'
2
+
3
+ gemfile do
4
+ source 'https://rubygems.org'
5
+
6
+ gem 'benchmark-ips', '~> 2.7', '>= 2.7.2'
7
+ gem 'interactor', '~> 3.1', '>= 3.1.1'
8
+ gem 'u-service', '~> 0.11.0'
9
+ end
10
+
11
+ require 'benchmark/ips'
12
+
13
+ class MSB_Multiply < Micro::Service::Base
14
+ attributes :a, :b
15
+
16
+ def call!
17
+ if a.is_a?(Numeric) && b.is_a?(Numeric)
18
+ Success(a * b)
19
+ else
20
+ Failure(:invalid_data)
21
+ end
22
+ end
23
+ end
24
+
25
+ class MSS_Multiply < Micro::Service::Strict
26
+ attributes :a, :b
27
+
28
+ def call!
29
+ if a.is_a?(Numeric) && b.is_a?(Numeric)
30
+ Success(a * b)
31
+ else
32
+ Failure(:invalid_data)
33
+ end
34
+ end
35
+ end
36
+
37
+ class IT_Multiply
38
+ include Interactor
39
+
40
+ def call
41
+ a = context.a
42
+ b = context.b
43
+
44
+ if a.is_a?(Numeric) && b.is_a?(Numeric)
45
+ context.number = a * b
46
+ else
47
+ context.fail!(type: :invalid_data)
48
+ end
49
+ end
50
+ end
51
+
52
+ SYMBOL_KEYS = { a: nil, b: 2 }
53
+ STRING_KEYS = { 'a' => 1, 'b' => '' }
54
+
55
+ Benchmark.ips do |x|
56
+ x.config(:time => 5, :warmup => 2)
57
+
58
+ x.time = 5
59
+ x.warmup = 2
60
+
61
+ x.report('Micro::Service::Base') do
62
+ MSB_Multiply.call(SYMBOL_KEYS)
63
+ MSB_Multiply.call(STRING_KEYS)
64
+ end
65
+
66
+ x.report('Micro::Service::Strict') do
67
+ MSS_Multiply.call(SYMBOL_KEYS)
68
+ MSS_Multiply.call(STRING_KEYS)
69
+ end
70
+
71
+ x.report('Interactor') do
72
+ IT_Multiply.call(SYMBOL_KEYS)
73
+ IT_Multiply.call(STRING_KEYS)
74
+ end
75
+
76
+ x.compare!
77
+ end
78
+
79
+ # Warming up --------------------------------------
80
+ # Micro::Service::Base 5.304k i/100ms
81
+ # Micro::Service::Strict
82
+ # 4.516k i/100ms
83
+ # Interactor 1.507k i/100ms
84
+ # Calculating -------------------------------------
85
+ # Micro::Service::Base 54.444k (± 2.8%) i/s - 275.808k in 5.070215s
86
+ # Micro::Service::Strict
87
+ # 45.996k (± 1.8%) i/s - 230.316k in 5.008931s
88
+ # Interactor 15.363k (± 2.2%) i/s - 76.857k in 5.005209s
89
+
90
+ # Comparison:
91
+ # Micro::Service::Base: 54444.5 i/s
92
+ # Micro::Service::Strict: 45995.8 i/s - 1.18x slower
93
+ # Interactor: 15363.0 i/s - 3.54x slower
@@ -0,0 +1,93 @@
1
+ require 'bundler/inline'
2
+
3
+ gemfile do
4
+ source 'https://rubygems.org'
5
+
6
+ gem 'benchmark-ips', '~> 2.7', '>= 2.7.2'
7
+ gem 'interactor', '~> 3.1', '>= 3.1.1'
8
+ gem 'u-service', '~> 0.11.0'
9
+ end
10
+
11
+ require 'benchmark/ips'
12
+
13
+ class MSB_Multiply < Micro::Service::Base
14
+ attributes :a, :b
15
+
16
+ def call!
17
+ if a.is_a?(Numeric) && b.is_a?(Numeric)
18
+ Success(a * b)
19
+ else
20
+ Failure(:invalid_data)
21
+ end
22
+ end
23
+ end
24
+
25
+ class MSS_Multiply < Micro::Service::Strict
26
+ attributes :a, :b
27
+
28
+ def call!
29
+ if a.is_a?(Numeric) && b.is_a?(Numeric)
30
+ Success(a * b)
31
+ else
32
+ Failure(:invalid_data)
33
+ end
34
+ end
35
+ end
36
+
37
+ class IT_Multiply
38
+ include Interactor
39
+
40
+ def call
41
+ a = context.a
42
+ b = context.b
43
+
44
+ if a.is_a?(Numeric) && b.is_a?(Numeric)
45
+ context.number = a * b
46
+ else
47
+ context.fail!(:invalid_data)
48
+ end
49
+ end
50
+ end
51
+
52
+ SYMBOL_KEYS = { a: 2, b: 2 }
53
+ STRING_KEYS = { 'a' => 1, 'b' => 1 }
54
+
55
+ Benchmark.ips do |x|
56
+ x.config(:time => 5, :warmup => 2)
57
+
58
+ x.time = 5
59
+ x.warmup = 2
60
+
61
+ x.report('Micro::Service::Base') do
62
+ MSB_Multiply.call(SYMBOL_KEYS)
63
+ MSB_Multiply.call(STRING_KEYS)
64
+ end
65
+
66
+ x.report('Micro::Service::Strict') do
67
+ MSS_Multiply.call(SYMBOL_KEYS)
68
+ MSS_Multiply.call(STRING_KEYS)
69
+ end
70
+
71
+ x.report('Interactor') do
72
+ IT_Multiply.call(SYMBOL_KEYS)
73
+ IT_Multiply.call(STRING_KEYS)
74
+ end
75
+
76
+ x.compare!
77
+ end
78
+
79
+ # Warming up --------------------------------------
80
+ # Micro::Service::Base 5.365k i/100ms
81
+ # Micro::Service::Strict
82
+ # 4.535k i/100ms
83
+ # Interactor 2.620k i/100ms
84
+ # Calculating -------------------------------------
85
+ # Micro::Service::Base 51.795k (± 4.7%) i/s - 262.885k in 5.086671s
86
+ # Micro::Service::Strict
87
+ # 46.253k (± 1.6%) i/s - 231.285k in 5.001748s
88
+ # Interactor 29.561k (± 3.3%) i/s - 149.340k in 5.057720s
89
+
90
+ # Comparison:
91
+ # Micro::Service::Base: 51794.5 i/s
92
+ # Micro::Service::Strict: 46253.0 i/s - 1.12x slower
93
+ # Interactor: 29561.5 i/s - 1.75x slower
data/lib/micro/service.rb CHANGED
@@ -5,10 +5,6 @@ require 'micro/attributes'
5
5
  require 'micro/service/version'
6
6
 
7
7
  require 'micro/service/result'
8
- require 'micro/service/result/success'
9
- require 'micro/service/result/failure'
10
- require 'micro/service/result/helpers'
11
-
12
8
  require 'micro/service/base'
13
9
  require 'micro/service/strict'
14
10
  require 'micro/service/pipeline'
@@ -4,10 +4,13 @@ module Micro
4
4
  module Service
5
5
  class Base
6
6
  include Micro::Attributes.without(:strict_initialize)
7
- include Result::Helpers
8
7
 
9
8
  INVALID_RESULT = '#call! must return a Micro::Service::Result instance'.freeze
10
9
 
10
+ ResultIsAlreadyDefined = ArgumentError.new('result is already defined'.freeze)
11
+
12
+ private_constant :INVALID_RESULT, :ResultIsAlreadyDefined
13
+
11
14
  def self.>>(service)
12
15
  Micro::Service::Pipeline[self, service]
13
16
  end
@@ -16,6 +19,13 @@ module Micro
16
19
  new(options).call
17
20
  end
18
21
 
22
+ def self.__new__(result, arg)
23
+ instance = allocate
24
+ instance.__set_result__(result)
25
+ instance.send(:initialize, arg)
26
+ instance
27
+ end
28
+
19
29
  def call!
20
30
  raise NotImplementedError
21
31
  end
@@ -25,6 +35,27 @@ module Micro
25
35
  return result if result.is_a?(Service::Result)
26
36
  raise TypeError, self.class.name + INVALID_RESULT
27
37
  end
38
+
39
+ def __set_result__(result)
40
+ raise ResultIsAlreadyDefined if @__result
41
+ @__result = result
42
+ end
43
+
44
+ private
45
+
46
+ def __get_result__
47
+ @__result ||= Result.new
48
+ end
49
+
50
+ def Success(arg=nil)
51
+ value, type = block_given? ? [yield, arg] : [arg, nil]
52
+ __get_result__.__set__(true, value, type)
53
+ end
54
+
55
+ def Failure(arg=nil)
56
+ value, type = block_given? ? [yield, arg] : [arg, nil]
57
+ __get_result__.__set__(false, value, type)
58
+ end
28
59
  end
29
60
  end
30
61
  end
@@ -6,8 +6,9 @@ module Micro
6
6
  class Reducer
7
7
  attr_reader :services
8
8
 
9
- INVALID_SERVICES =
10
- 'argument must be a collection of `Micro::Service::Base` classes'.freeze
9
+ InvalidServices = ArgumentError.new('argument must be a collection of `Micro::Service::Base` classes'.freeze)
10
+
11
+ private_constant :InvalidServices
11
12
 
12
13
  def self.map_services(arg)
13
14
  return arg.services if arg.is_a?(Reducer)
@@ -18,7 +19,7 @@ module Micro
18
19
  def self.build(args)
19
20
  services = Array(args).flat_map { |arg| map_services(arg) }
20
21
 
21
- raise ArgumentError, INVALID_SERVICES if services.any? { |klass| !(klass < ::Micro::Service::Base) }
22
+ raise InvalidServices if services.any? { |klass| !(klass < ::Micro::Service::Base) }
22
23
 
23
24
  new(services)
24
25
  end
@@ -30,7 +31,7 @@ module Micro
30
31
  def call(arg={})
31
32
  @services.reduce(initial_result(arg)) do |result, service|
32
33
  break result if result.failure?
33
- service.call(result.value)
34
+ service.__new__(result, result.value).call
34
35
  end
35
36
  end
36
37
 
@@ -43,8 +44,8 @@ module Micro
43
44
  def initial_result(arg)
44
45
  return arg.call if arg_to_call?(arg)
45
46
  return arg if arg.is_a?(Micro::Service::Result)
46
-
47
- Micro::Service::Result::Success[value: arg]
47
+ result = Micro::Service::Result.new
48
+ result.__set__(true, arg, nil)
48
49
  end
49
50
 
50
51
  def arg_to_call?(arg)
@@ -74,9 +75,9 @@ module Micro
74
75
  Reducer.build(args)
75
76
  end
76
77
 
77
- UNDEFINED_PIPELINE = "This class hasn't declared its pipeline. Please, use the `pipeline()` macro to define one.".freeze
78
+ UndefinedPipeline = ArgumentError.new("This class hasn't declared its pipeline. Please, use the `pipeline()` macro to define one.".freeze)
78
79
 
79
- private_constant :UNDEFINED_PIPELINE
80
+ private_constant :UndefinedPipeline
80
81
 
81
82
  def self.included(base)
82
83
  base.extend(ClassMethods)
@@ -84,7 +85,7 @@ module Micro
84
85
  def initialize(options)
85
86
  @options = options
86
87
  pipeline = self.class.__pipeline__
87
- raise ArgumentError, UNDEFINED_PIPELINE unless pipeline
88
+ raise UndefinedPipeline unless pipeline
88
89
  end
89
90
  RUBY
90
91
  end
@@ -3,27 +3,20 @@
3
3
  module Micro
4
4
  module Service
5
5
  class Result
6
- module Type
7
- INVALID = 'type must be nil or a symbol'.freeze
6
+ InvalidType = TypeError.new('type must be nil or a symbol'.freeze)
8
7
 
9
- def self.[](arg)
10
- return arg if arg.nil? || arg.is_a?(Symbol)
11
- raise TypeError, INVALID
12
- end
13
- end
8
+ attr_reader :value, :type
14
9
 
15
- private_constant :Type
10
+ def __set__(is_success, value, type)
11
+ raise InvalidType unless type.nil? || type.is_a?(Symbol)
16
12
 
17
- include Micro::Attributes.with(:strict_initialize)
13
+ @success, @value, @type = is_success, value, type
18
14
 
19
- def self.[](value:, type: nil)
20
- new(value: value, type: Type[type])
15
+ self
21
16
  end
22
17
 
23
- attributes :type, :value
24
-
25
18
  def success?
26
- raise NotImplementedError
19
+ @success
27
20
  end
28
21
 
29
22
  def failure?
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Micro
4
4
  module Service
5
- VERSION = '0.11.0'.freeze
5
+ VERSION = '0.12.0'.freeze
6
6
  end
7
7
  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.11.0
4
+ version: 0.12.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-13 00:00:00.000000000 Z
11
+ date: 2019-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: u-attributes
@@ -68,6 +68,10 @@ files:
68
68
  - LICENSE.txt
69
69
  - README.md
70
70
  - Rakefile
71
+ - benchmarks/interactor/pipeline_failure.rb
72
+ - benchmarks/interactor/pipeline_success.rb
73
+ - benchmarks/interactor/service_failure.rb
74
+ - benchmarks/interactor/service_success.rb
71
75
  - bin/console
72
76
  - bin/setup
73
77
  - comparisons/interactor.rb
@@ -76,9 +80,6 @@ files:
76
80
  - lib/micro/service/base.rb
77
81
  - lib/micro/service/pipeline.rb
78
82
  - lib/micro/service/result.rb
79
- - lib/micro/service/result/failure.rb
80
- - lib/micro/service/result/helpers.rb
81
- - lib/micro/service/result/success.rb
82
83
  - lib/micro/service/strict.rb
83
84
  - lib/micro/service/version.rb
84
85
  - lib/micro/service/with_validation.rb
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Micro
4
- module Service
5
- class Result
6
- class Failure < Micro::Service::Result
7
- def success?; false; end
8
- end
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Micro
4
- module Service
5
- class Result
6
- module Helpers
7
- private def Success(arg=nil)
8
- value, type = block_given? ? [yield, arg] : [arg, nil]
9
- Result::Success[value: value, type: type]
10
- end
11
-
12
- private def Failure(arg=nil)
13
- value, type = block_given? ? [yield, arg] : [arg, nil]
14
- Result::Failure[value: value, type: type]
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Micro
4
- module Service
5
- class Result
6
- class Success < Micro::Service::Result
7
- def success?; true; end
8
- end
9
- end
10
- end
11
- end