corindon 0.5.0 → 0.8.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 +4 -4
- data/corindon.gemspec +2 -0
- data/lib/corindon/dependency_injection/container.rb +87 -36
- data/lib/corindon/dependency_injection/definition.rb +13 -32
- data/lib/corindon/dependency_injection/dsl.rb +19 -11
- data/lib/corindon/dependency_injection/injectable.rb +22 -8
- data/lib/corindon/dependency_injection/injector.rb +2 -0
- data/lib/corindon/dependency_injection/parameter_bag.rb +47 -0
- data/lib/corindon/dependency_injection/ruby_compat.rb +27 -0
- data/lib/corindon/dependency_injection/testing/mock_utils.rb +40 -0
- data/lib/corindon/dependency_injection/token/service_call_token.rb +1 -21
- data/lib/corindon/dependency_injection/token/service_factory_token.rb +24 -0
- data/lib/corindon/{ext/guards.rb → guards/ext.rb} +4 -4
- data/lib/corindon/result/errors/bad_return_type_error.rb +19 -0
- data/lib/corindon/{ext/guards/error.rb → result/errors/result_error.rb} +3 -3
- data/lib/corindon/result/ext.rb +25 -0
- data/lib/corindon/result/failure.rb +27 -0
- data/lib/corindon/result/result.rb +32 -0
- data/lib/corindon/result/success.rb +39 -0
- data/lib/corindon/{ext/something.rb → something/ext.rb} +2 -2
- data/lib/corindon/version.rb +1 -1
- metadata +42 -11
- data/lib/corindon/console/application.rb +0 -15
- data/lib/corindon/console/base_command.rb +0 -13
- data/lib/corindon/console/input.rb +0 -8
- data/lib/corindon/console/output.rb +0 -8
- data/lib/corindon/dependency_injection/id/id_generator.rb +0 -12
- data/lib/corindon/dependency_injection/id/uuid_generator.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dd263e6d3149f438f50e22fe7575fec7fcfc6d5f8755c77cd83877e5e89c0de
|
4
|
+
data.tar.gz: a33cc4b33c681d3027238dac77f1400e7a611b7502f0504aa5e8b6db2d28ac0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13d607a74528b870f3d064a94b6913a4a76ea69ce5d4463ce6f0c41dd65c97c115d9aaeb07c05dc6f874910619dc8354c2670084cf71747e2330b34be46be145
|
7
|
+
data.tar.gz: 1c63ab07e90abbec9c23b04c7c6a097e39dbf23b2faf4f9cecaabb27006f0ee52aec72ee03c477157480931d9cfab95979357890bcc273de62f08bffbb02eaec
|
data/corindon.gemspec
CHANGED
@@ -20,5 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_development_dependency 'bundler'
|
22
22
|
s.add_development_dependency 'minitest', '~> 5.14'
|
23
|
+
s.add_development_dependency 'minitest-reporters', '~> 1.4'
|
23
24
|
s.add_development_dependency 'rake', '~> 13.0'
|
25
|
+
s.add_development_dependency 'rubocop', '1.3.1'
|
24
26
|
end
|
@@ -3,42 +3,69 @@
|
|
3
3
|
module Corindon
|
4
4
|
module DependencyInjection
|
5
5
|
class Container
|
6
|
-
using Ext
|
6
|
+
using Something::Ext
|
7
7
|
|
8
|
-
attr_reader :id_generator
|
9
8
|
attr_reader :injector
|
10
9
|
|
11
|
-
# @param [
|
12
|
-
|
13
|
-
|
10
|
+
# @param [Array<Definition>] definitions
|
11
|
+
# @param [ParameterBag] parameters
|
12
|
+
def initialize(definitions: [], parameters: ParameterBag.new, service_built_listeners: [])
|
14
13
|
@services = {}
|
15
14
|
@definitions = {}
|
16
|
-
@parameters =
|
15
|
+
@parameters = parameters
|
17
16
|
@tags = Hash.new { |hash, key| hash[key] = [] }
|
18
17
|
|
19
18
|
@injector = Injector.new(container: self)
|
19
|
+
|
20
|
+
definitions.each { |d| register_definition(d) }
|
21
|
+
|
22
|
+
@service_built_listeners = service_built_listeners
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Container]
|
26
|
+
def dup
|
27
|
+
Container.new(
|
28
|
+
definitions: definitions.values,
|
29
|
+
parameters: ParameterBag.new(parameters.bag.dup),
|
30
|
+
service_built_listeners: service_built_listeners
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param [Definition, Injectable, Class]
|
35
|
+
# @return [Definition]
|
36
|
+
def as_definition(def_or_injectable)
|
37
|
+
if def_or_injectable.is_a?(Definition)
|
38
|
+
def_or_injectable
|
39
|
+
elsif def_or_injectable.is_a?(Injectable)
|
40
|
+
def_or_injectable.definition
|
41
|
+
elsif def_or_injectable.is_a?(Class)
|
42
|
+
Definition.new(def_or_injectable)
|
43
|
+
else
|
44
|
+
raise StandardError.new("Don't know how to build #{def_or_injectable}")
|
45
|
+
end
|
20
46
|
end
|
21
47
|
|
22
|
-
# @param [Class]
|
48
|
+
# @param [Class, Injectable, Definition] def_or_injectable
|
23
49
|
# @return [String]
|
24
|
-
def add_definition(
|
25
|
-
definition =
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
else
|
30
|
-
Definition.new(klass)
|
31
|
-
end
|
32
|
-
|
33
|
-
# Generate an id if set to anonymous when registering
|
34
|
-
# If a definition is set to be anonymous but an id is provided zhen registering, use this id instead<
|
35
|
-
if anonymous || (definition.anonymous? && id.nil?)
|
36
|
-
id = id_generator.generate
|
50
|
+
def add_definition(def_or_injectable, context: {}, &block)
|
51
|
+
definition = as_definition(def_or_injectable)
|
52
|
+
|
53
|
+
if block.sth?
|
54
|
+
definition = Dsl.from_definition(definition).exec(context: context, &block)
|
37
55
|
end
|
38
56
|
|
39
|
-
id =
|
40
|
-
|
41
|
-
|
57
|
+
id = definition.id || to_id(def_or_injectable)
|
58
|
+
|
59
|
+
register_definition(
|
60
|
+
Definition.new(
|
61
|
+
definition.object_source,
|
62
|
+
id: id,
|
63
|
+
args: definition.args,
|
64
|
+
kwargs: definition.kwargs,
|
65
|
+
calls: definition.calls,
|
66
|
+
tags: definition.tags
|
67
|
+
)
|
68
|
+
)
|
42
69
|
|
43
70
|
id
|
44
71
|
end
|
@@ -79,44 +106,68 @@ module Corindon
|
|
79
106
|
end
|
80
107
|
end
|
81
108
|
|
82
|
-
# @param [Class,
|
109
|
+
# @param [Class, String, Token::ParameterToken] key
|
83
110
|
# @param [Object] value
|
84
|
-
def set_parameter(
|
85
|
-
parameters
|
111
|
+
def set_parameter(key, value)
|
112
|
+
parameters.set(key, value)
|
86
113
|
end
|
87
114
|
|
88
|
-
# @param [Class,
|
115
|
+
# @param [Class, String, Token::ParameterToken] key
|
89
116
|
# @return [Boolean]
|
90
117
|
def parameter?(key)
|
91
|
-
parameters.
|
118
|
+
parameters.has?(key)
|
92
119
|
end
|
93
120
|
|
94
|
-
# @param [Class,
|
121
|
+
# @param [Class, String, Token::ParameterToken] key
|
95
122
|
# @return [Object]
|
96
123
|
def parameter(key)
|
97
|
-
parameters.
|
124
|
+
parameters.get(key)
|
125
|
+
end
|
126
|
+
|
127
|
+
# @param [Proc{Object, Container}] listener
|
128
|
+
def on_service_built(listener)
|
129
|
+
service_built_listeners << listener
|
98
130
|
end
|
99
131
|
|
100
132
|
private
|
101
133
|
|
134
|
+
# @return [Hash{String=>Definition}]
|
102
135
|
attr_reader :definitions
|
136
|
+
# @return [ParameterBag]
|
103
137
|
attr_reader :parameters
|
104
138
|
attr_reader :services
|
105
139
|
attr_reader :tags
|
140
|
+
attr_reader :service_built_listeners
|
141
|
+
|
142
|
+
def register_definition(definition)
|
143
|
+
definitions[definition.id] = definition
|
144
|
+
definition.tags.each { |tag| tags[tag] << definition.id }
|
145
|
+
end
|
106
146
|
|
107
147
|
def build_service(id)
|
108
|
-
definitions.fetch(id)
|
109
|
-
services[id] =
|
148
|
+
service = injector.resolve(definitions.fetch(id)).tap do |svc|
|
149
|
+
services[id] = svc
|
110
150
|
end
|
151
|
+
|
152
|
+
service_built_listeners.each do |listener|
|
153
|
+
listener.call(service, self)
|
154
|
+
end
|
155
|
+
|
156
|
+
service
|
111
157
|
end
|
112
158
|
|
113
|
-
def injectable?(
|
114
|
-
|
159
|
+
def injectable?(object)
|
160
|
+
object.is_a?(Injectable)
|
115
161
|
end
|
116
162
|
|
117
|
-
# @param [Class, #to_s] key
|
163
|
+
# @param [Injectable, Identifiable, Class, Definition, #to_s] key
|
164
|
+
# @return [String]
|
118
165
|
def to_id(key)
|
119
|
-
if key.is_a?(
|
166
|
+
if key.is_a?(Definition)
|
167
|
+
key.id
|
168
|
+
elsif injectable?(key)
|
169
|
+
to_id(key.definition)
|
170
|
+
elsif key.is_a?(Class)
|
120
171
|
key.name
|
121
172
|
else
|
122
173
|
key.to_s
|
@@ -5,59 +5,40 @@ require 'semantic'
|
|
5
5
|
module Corindon
|
6
6
|
module DependencyInjection
|
7
7
|
class Definition
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :object_source
|
9
9
|
attr_reader :args
|
10
10
|
attr_reader :kwargs
|
11
11
|
attr_reader :calls
|
12
12
|
attr_reader :tags
|
13
|
+
# @return [String]
|
13
14
|
attr_reader :id
|
14
15
|
|
15
|
-
def initialize(
|
16
|
-
@
|
16
|
+
def initialize(object_source, args: [], kwargs: {}, calls: [], tags: [], id: nil)
|
17
|
+
@object_source = object_source
|
17
18
|
@args = args
|
18
19
|
@kwargs = kwargs
|
19
20
|
@calls = calls
|
20
21
|
@tags = tags
|
21
22
|
@id = id
|
22
|
-
@anonymous = anonymous
|
23
23
|
end
|
24
24
|
|
25
25
|
# @param [Injector] injector
|
26
|
-
#
|
26
|
+
# @return [Object]
|
27
27
|
def build(injector)
|
28
|
-
|
28
|
+
source = if object_source.is_a?(Class)
|
29
|
+
[object_source, :new]
|
30
|
+
else
|
31
|
+
injector.resolve(object_source)
|
32
|
+
end
|
33
|
+
|
34
|
+
object = RubyCompat.do_call(*source, injector.resolve(args), injector.resolve(kwargs))
|
29
35
|
|
30
36
|
calls.each do |(call, call_args, call_kwargs)|
|
31
|
-
do_call(object, call, injector.resolve(call_args), injector.resolve(call_kwargs))
|
37
|
+
RubyCompat.do_call(object, call, injector.resolve(call_args), injector.resolve(call_kwargs))
|
32
38
|
end
|
33
39
|
|
34
40
|
object
|
35
41
|
end
|
36
|
-
|
37
|
-
# @return [Boolean]
|
38
|
-
def anonymous?
|
39
|
-
@anonymous
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
if ::Semantic::Version.new(RUBY_VERSION).satisfies?(">= 2.7.0")
|
45
|
-
def do_call(obj, method, args, kwargs)
|
46
|
-
obj.send(method, *args, **kwargs)
|
47
|
-
end
|
48
|
-
else
|
49
|
-
def do_call(obj, method, args, kwargs)
|
50
|
-
if args.empty? && kwargs.empty?
|
51
|
-
obj.send(method)
|
52
|
-
elsif args.empty?
|
53
|
-
obj.send(method, **kwargs)
|
54
|
-
elsif kwargs.empty?
|
55
|
-
obj.send(method, *args)
|
56
|
-
else
|
57
|
-
obj.send(method, *args, **kwargs)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
42
|
end
|
62
43
|
end
|
63
44
|
end
|
@@ -3,15 +3,29 @@
|
|
3
3
|
module Corindon
|
4
4
|
module DependencyInjection
|
5
5
|
class Dsl
|
6
|
+
class << self
|
7
|
+
# @param [Definition] definition
|
8
|
+
# @return [Dsl]
|
9
|
+
def from_definition(definition)
|
10
|
+
new(
|
11
|
+
definition.object_source,
|
12
|
+
id: definition.id,
|
13
|
+
args: definition.args,
|
14
|
+
kwargs: definition.kwargs,
|
15
|
+
calls: definition.calls,
|
16
|
+
tags: definition.tags
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
6
21
|
# @param [Class] klass
|
7
|
-
def initialize(klass, args: [], kwargs: {}, id: nil,
|
22
|
+
def initialize(klass, args: [], kwargs: {}, id: nil, calls: [], tags: [])
|
8
23
|
@klass = klass
|
9
24
|
@args = args
|
10
25
|
@kwargs = kwargs
|
11
|
-
@calls =
|
12
|
-
@tags =
|
26
|
+
@calls = calls
|
27
|
+
@tags = tags
|
13
28
|
@id = id
|
14
|
-
@anonymous = anonymous
|
15
29
|
end
|
16
30
|
|
17
31
|
# @param [Hash] context
|
@@ -23,7 +37,7 @@ module Corindon
|
|
23
37
|
|
24
38
|
instance_exec(context, &block)
|
25
39
|
|
26
|
-
Definition.new(@klass, args: @args, kwargs: @kwargs, calls: @calls, tags: @tags, id: @id
|
40
|
+
Definition.new(@klass, args: @args, kwargs: @kwargs, calls: @calls, tags: @tags, id: @id)
|
27
41
|
end
|
28
42
|
|
29
43
|
def args(*arguments, **kv_arguments)
|
@@ -38,15 +52,9 @@ module Corindon
|
|
38
52
|
|
39
53
|
# @param [String] id
|
40
54
|
def id(id)
|
41
|
-
@anonymous = false
|
42
55
|
@id = id
|
43
56
|
end
|
44
57
|
|
45
|
-
def anonymous!
|
46
|
-
@anonymous = true
|
47
|
-
@id = nil
|
48
|
-
end
|
49
|
-
|
50
58
|
# @param [Class, #to_s] key
|
51
59
|
# @return [Token::ParameterToken]
|
52
60
|
def param(key)
|
@@ -3,22 +3,36 @@
|
|
3
3
|
module Corindon
|
4
4
|
module DependencyInjection
|
5
5
|
module Injectable
|
6
|
-
def definition
|
7
|
-
Definition.new(self)
|
8
|
-
end
|
9
|
-
|
10
6
|
refine Class do
|
7
|
+
def factory(service, method)
|
8
|
+
Token::ServiceFactoryToken.new(service, method)
|
9
|
+
end
|
10
|
+
|
11
|
+
def make_parameter(name)
|
12
|
+
Token::ParameterToken.new(key: "#{self.name.downcase.gsub(/::/, '.')}.#{name}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def make_definition(name, source, *args, **kwargs, &block)
|
16
|
+
do_make_definition("#{self.name.downcase.gsub(/::/, '.')}.#{name}", source, args: args, kwargs: kwargs, &block)
|
17
|
+
end
|
18
|
+
|
11
19
|
def injectable(*args, **kwargs, &block)
|
12
|
-
|
20
|
+
extend Injectable
|
13
21
|
|
14
22
|
define_singleton_method :definition do
|
23
|
+
do_make_definition(name, self, args: args, kwargs: kwargs, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def do_make_definition(name, source, args:, kwargs:, &block)
|
15
30
|
if block.nil?
|
16
|
-
Definition.new(
|
31
|
+
Definition.new(source, args: args, kwargs: kwargs, id: name)
|
17
32
|
else
|
18
|
-
Dsl.new(
|
33
|
+
Dsl.new(source, args: args, kwargs: kwargs, id: name).exec(&block)
|
19
34
|
end
|
20
35
|
end
|
21
|
-
end
|
22
36
|
end
|
23
37
|
end
|
24
38
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module DependencyInjection
|
5
|
+
class ParameterBag
|
6
|
+
# @return [Hash{String => Object}]
|
7
|
+
attr_reader :bag
|
8
|
+
|
9
|
+
# @param [Hash{String => Object}] bag
|
10
|
+
def initialize(bag = {})
|
11
|
+
@bag = bag
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param [Class, String, Token::ParameterToken] key
|
15
|
+
# @return [Boolean]
|
16
|
+
def has?(key)
|
17
|
+
@bag.key?(to_key(key))
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param [Class, String, Token::ParameterToken] key
|
21
|
+
# @return [Object]
|
22
|
+
def get(key)
|
23
|
+
@bag.fetch(to_key(key))
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param [Class, String, Token::ParameterToken] key
|
27
|
+
# @param [Object] value
|
28
|
+
def set(key, value)
|
29
|
+
@bag[to_key(key)] = value
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def to_key(keylike)
|
35
|
+
if keylike.is_a?(Class)
|
36
|
+
keylike.name
|
37
|
+
elsif keylike.is_a?(Token::ParameterToken)
|
38
|
+
keylike.key
|
39
|
+
elsif keylike.is_a?(String)
|
40
|
+
keylike
|
41
|
+
else
|
42
|
+
raise StandardError.new("#{keylike} is not a valid key (objects of class #{keylike.class.name} are not handled.")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module DependencyInjection
|
5
|
+
class RubyCompat
|
6
|
+
class << self
|
7
|
+
if ::Semantic::Version.new(RUBY_VERSION).satisfies?('>= 2.7.0')
|
8
|
+
def do_call(obj, method, args, kwargs)
|
9
|
+
obj.send(method, *args, **kwargs)
|
10
|
+
end
|
11
|
+
else
|
12
|
+
def do_call(obj, method, args, kwargs)
|
13
|
+
if args.empty? && kwargs.empty?
|
14
|
+
obj.send(method)
|
15
|
+
elsif args.empty?
|
16
|
+
obj.send(method, **kwargs)
|
17
|
+
elsif kwargs.empty?
|
18
|
+
obj.send(method, *args)
|
19
|
+
else
|
20
|
+
obj.send(method, *args, **kwargs)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module DependencyInjection
|
5
|
+
module Testing
|
6
|
+
# Defines the `mock_definition` on Container allowing to mock services returned by the container for a given Definition
|
7
|
+
module MockUtils
|
8
|
+
refine Container do
|
9
|
+
# Allow to provide a specific value that the definition will resolve to
|
10
|
+
# @param [Definition] definition
|
11
|
+
# @param [Object] value
|
12
|
+
def mock_definition(definition, value)
|
13
|
+
singleton_class.prepend MockUtils unless is_a?(MockUtils)
|
14
|
+
|
15
|
+
add_definition(definition) if !has?(definition)
|
16
|
+
|
17
|
+
id = to_id(definition)
|
18
|
+
mocks[definition] = services[id] = value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
using self
|
23
|
+
|
24
|
+
def mocks
|
25
|
+
@mocks ||= {}
|
26
|
+
end
|
27
|
+
|
28
|
+
def dup
|
29
|
+
new_instance = super
|
30
|
+
|
31
|
+
mocks.each do |definition, value|
|
32
|
+
new_instance.mock_definition(definition, value)
|
33
|
+
end
|
34
|
+
|
35
|
+
new_instance
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -27,33 +27,13 @@ module Corindon
|
|
27
27
|
|
28
28
|
# @param [Injector] injector
|
29
29
|
def resolve(injector:)
|
30
|
-
do_call(
|
30
|
+
RubyCompat.do_call(
|
31
31
|
injector.resolve(service),
|
32
32
|
method,
|
33
33
|
injector.resolve(args),
|
34
34
|
injector.resolve(kwargs)
|
35
35
|
)
|
36
36
|
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
if ::Semantic::Version.new(RUBY_VERSION).satisfies?(">= 2.7.0")
|
41
|
-
def do_call(obj, method, args, kwargs)
|
42
|
-
obj.send(method, *args, **kwargs)
|
43
|
-
end
|
44
|
-
else
|
45
|
-
def do_call(obj, method, args, kwargs)
|
46
|
-
if args.empty? && kwargs.empty?
|
47
|
-
obj.send(method)
|
48
|
-
elsif args.empty?
|
49
|
-
obj.send(method, **kwargs)
|
50
|
-
elsif kwargs.empty?
|
51
|
-
obj.send(method, *args)
|
52
|
-
else
|
53
|
-
obj.send(method, *args, **kwargs)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
37
|
end
|
58
38
|
end
|
59
39
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module DependencyInjection
|
5
|
+
module Token
|
6
|
+
class ServiceFactoryToken < InjectionToken
|
7
|
+
attr_reader :service
|
8
|
+
attr_reader :method
|
9
|
+
|
10
|
+
def initialize(service, method)
|
11
|
+
super()
|
12
|
+
|
13
|
+
@service = service
|
14
|
+
@method = method
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param [Injector] injector
|
18
|
+
def resolve(injector:)
|
19
|
+
[injector.resolve(service), method]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Corindon
|
4
|
-
module
|
5
|
-
module
|
4
|
+
module Guards
|
5
|
+
module Ext
|
6
6
|
refine Object do
|
7
7
|
def unimplemented!(message = nil)
|
8
|
-
raise
|
8
|
+
raise NotImplementedError.new(message || 'This method is not implemented.')
|
9
9
|
end
|
10
10
|
|
11
11
|
def unreachable!(message = nil)
|
12
|
-
raise
|
12
|
+
raise StandardError.new(message || 'Reached unreachable code.')
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module Result
|
5
|
+
module Errors
|
6
|
+
class BadReturnTypeError < ResultError
|
7
|
+
# @return [Object]
|
8
|
+
attr_reader :value
|
9
|
+
|
10
|
+
# @param [Object] value
|
11
|
+
def initialize(value)
|
12
|
+
super("Expected a Result, got #{value}")
|
13
|
+
|
14
|
+
@value = value
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module Result
|
5
|
+
module Ext
|
6
|
+
refine Object do
|
7
|
+
def rescue_failure(&block)
|
8
|
+
block.call
|
9
|
+
rescue StandardError => error
|
10
|
+
Corindon::Result::Failure.new(error)
|
11
|
+
end
|
12
|
+
|
13
|
+
# rubocop:disable Naming/MethodName
|
14
|
+
def Failure(error)
|
15
|
+
Corindon::Result::Failure.new(error)
|
16
|
+
end
|
17
|
+
|
18
|
+
def Success(value)
|
19
|
+
Corindon::Result::Success.new(value)
|
20
|
+
end
|
21
|
+
# rubocop:enable Naming/MethodName
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module Result
|
5
|
+
class Failure < Result
|
6
|
+
# @return [Exception]
|
7
|
+
attr_reader :error
|
8
|
+
|
9
|
+
# @param [Exception] error
|
10
|
+
def initialize(error)
|
11
|
+
super()
|
12
|
+
|
13
|
+
@error = error
|
14
|
+
end
|
15
|
+
|
16
|
+
# @raise [Exception]
|
17
|
+
def unwrap!
|
18
|
+
raise error
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [Boolean]
|
22
|
+
def failure?
|
23
|
+
true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
using Corindon::Guards::Ext
|
4
|
+
|
5
|
+
module Corindon
|
6
|
+
module Result
|
7
|
+
class Result
|
8
|
+
# @return [Boolean]
|
9
|
+
def success?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Boolean]
|
14
|
+
def failure?
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
# @raise [Exception] if called on a Failure
|
19
|
+
# @return [Object]
|
20
|
+
def unwrap!
|
21
|
+
unimplemented!
|
22
|
+
end
|
23
|
+
|
24
|
+
# @yieldparam [Object] value
|
25
|
+
# @yieldreturn [Result]
|
26
|
+
# @return [Result]
|
27
|
+
def and_then(&_block)
|
28
|
+
self
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Corindon
|
4
|
+
module Result
|
5
|
+
class Success < Result
|
6
|
+
# @return [Object]
|
7
|
+
attr_reader :value
|
8
|
+
|
9
|
+
# @param [Object] value
|
10
|
+
def initialize(value)
|
11
|
+
super()
|
12
|
+
|
13
|
+
@value = value
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Boolean]
|
17
|
+
def success?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [Object]
|
22
|
+
def unwrap!
|
23
|
+
value
|
24
|
+
end
|
25
|
+
|
26
|
+
def and_then(&block)
|
27
|
+
retval = block.call(value)
|
28
|
+
|
29
|
+
if retval.is_a?(Result)
|
30
|
+
retval
|
31
|
+
else
|
32
|
+
Failure.new(Errors::BadReturnTypeError.new(retval))
|
33
|
+
end
|
34
|
+
rescue StandardError => error
|
35
|
+
Failure.new(error)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/corindon/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: corindon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rémi Piotaix
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: semantic
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '5.14'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest-reporters
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.4'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.4'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '13.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.3.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.3.1
|
83
111
|
description:
|
84
112
|
email: remi@piotaix.fr
|
85
113
|
executables: []
|
@@ -88,25 +116,28 @@ extra_rdoc_files: []
|
|
88
116
|
files:
|
89
117
|
- corindon.gemspec
|
90
118
|
- lib/corindon.rb
|
91
|
-
- lib/corindon/console/application.rb
|
92
|
-
- lib/corindon/console/base_command.rb
|
93
|
-
- lib/corindon/console/input.rb
|
94
|
-
- lib/corindon/console/output.rb
|
95
119
|
- lib/corindon/dependency_injection/container.rb
|
96
120
|
- lib/corindon/dependency_injection/definition.rb
|
97
121
|
- lib/corindon/dependency_injection/dsl.rb
|
98
|
-
- lib/corindon/dependency_injection/id/id_generator.rb
|
99
|
-
- lib/corindon/dependency_injection/id/uuid_generator.rb
|
100
122
|
- lib/corindon/dependency_injection/injectable.rb
|
101
123
|
- lib/corindon/dependency_injection/injector.rb
|
124
|
+
- lib/corindon/dependency_injection/parameter_bag.rb
|
125
|
+
- lib/corindon/dependency_injection/ruby_compat.rb
|
126
|
+
- lib/corindon/dependency_injection/testing/mock_utils.rb
|
102
127
|
- lib/corindon/dependency_injection/token/injection_token.rb
|
103
128
|
- lib/corindon/dependency_injection/token/parameter_token.rb
|
104
129
|
- lib/corindon/dependency_injection/token/service_call_token.rb
|
130
|
+
- lib/corindon/dependency_injection/token/service_factory_token.rb
|
105
131
|
- lib/corindon/dependency_injection/token/tagged_token.rb
|
106
132
|
- lib/corindon/dependency_injection/token/value_token.rb
|
107
|
-
- lib/corindon/ext
|
108
|
-
- lib/corindon/
|
109
|
-
- lib/corindon/
|
133
|
+
- lib/corindon/guards/ext.rb
|
134
|
+
- lib/corindon/result/errors/bad_return_type_error.rb
|
135
|
+
- lib/corindon/result/errors/result_error.rb
|
136
|
+
- lib/corindon/result/ext.rb
|
137
|
+
- lib/corindon/result/failure.rb
|
138
|
+
- lib/corindon/result/result.rb
|
139
|
+
- lib/corindon/result/success.rb
|
140
|
+
- lib/corindon/something/ext.rb
|
110
141
|
- lib/corindon/version.rb
|
111
142
|
homepage: https://gitlab.com/piotaixr/corindon
|
112
143
|
licenses:
|