smart_core 0.6.0 → 0.7.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/.rspec +1 -1
- data/.rubocop.yml +1 -1
- data/.travis.yml +5 -8
- data/CHANGELOG.md +5 -0
- data/README.md +14 -4
- data/lib/smart_core.rb +2 -2
- data/lib/smart_core/container.rb +49 -56
- data/lib/smart_core/container/arbitary_lock.rb +22 -0
- data/lib/smart_core/container/definition_dsl.rb +105 -55
- data/lib/smart_core/container/{command_set.rb → definition_dsl/command_set.rb} +20 -26
- data/lib/smart_core/container/definition_dsl/commands.rb +12 -0
- data/lib/smart_core/container/{commands → definition_dsl/commands}/base.rb +3 -3
- data/lib/smart_core/container/definition_dsl/commands/definition/compose.rb +46 -0
- data/lib/smart_core/container/definition_dsl/commands/definition/namespace.rb +51 -0
- data/lib/smart_core/container/{commands → definition_dsl/commands/definition}/register.rb +13 -25
- data/lib/smart_core/container/definition_dsl/commands/instantiation/compose.rb +50 -0
- data/lib/smart_core/container/definition_dsl/commands/instantiation/freeze_state.rb +24 -0
- data/lib/smart_core/container/dependency_compatability.rb +3 -3
- data/lib/smart_core/container/dependency_compatability/definition.rb +42 -0
- data/lib/smart_core/container/dependency_compatability/general.rb +61 -0
- data/lib/smart_core/container/dependency_compatability/registry.rb +28 -29
- data/lib/smart_core/container/dependency_resolver.rb +9 -4
- data/lib/smart_core/container/entities.rb +11 -0
- data/lib/smart_core/container/{entity.rb → entities/base.rb} +7 -7
- data/lib/smart_core/container/entities/dependency.rb +38 -0
- data/lib/smart_core/container/entities/dependency_builder.rb +50 -0
- data/lib/smart_core/container/entities/namespace.rb +73 -0
- data/lib/smart_core/container/entities/namespace_builder.rb +41 -0
- data/lib/smart_core/container/errors.rb +43 -0
- data/lib/smart_core/container/key_guard.rb +5 -5
- data/lib/smart_core/container/mixin.rb +20 -16
- data/lib/smart_core/container/registry.rb +224 -201
- data/lib/smart_core/container/registry_builder.rb +38 -5
- data/lib/smart_core/{exceptions.rb → errors.rb} +0 -0
- data/lib/smart_core/operation.rb +3 -1
- data/lib/smart_core/operation/{custom.rb → callback.rb} +7 -7
- data/lib/smart_core/operation/result.rb +1 -1
- data/lib/smart_core/operation/result_interface.rb +3 -3
- data/lib/smart_core/version.rb +1 -1
- data/smart_core.gemspec +6 -5
- metadata +28 -38
- data/lib/smart_core/container/command_definer.rb +0 -117
- data/lib/smart_core/container/commands.rb +0 -9
- data/lib/smart_core/container/commands/namespace.rb +0 -53
- data/lib/smart_core/container/dependency.rb +0 -44
- data/lib/smart_core/container/dependency_builder.rb +0 -48
- data/lib/smart_core/container/dependency_compatability/abstract.rb +0 -59
- data/lib/smart_core/container/dependency_compatability/command_set.rb +0 -35
- data/lib/smart_core/container/exceptions.rb +0 -31
- data/lib/smart_core/container/memoized_dependency.rb +0 -28
- data/lib/smart_core/container/namespace.rb +0 -51
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.5.0
|
5
|
-
class SmartCore::Container::Dependency < SmartCore::Container::Entity
|
6
|
-
# @param dependency_definition [Proc]
|
7
|
-
# @param options [Hash<Symbol,Any>]
|
8
|
-
# @return [void]
|
9
|
-
#
|
10
|
-
# @todo option list
|
11
|
-
#
|
12
|
-
# @api private
|
13
|
-
# @since 0.5.0
|
14
|
-
def initialize(external_name, dependency_definition, **options)
|
15
|
-
@dependency_definition = dependency_definition
|
16
|
-
@access_lock = Mutex.new
|
17
|
-
super(external_name)
|
18
|
-
end
|
19
|
-
|
20
|
-
# @return [Any]
|
21
|
-
#
|
22
|
-
# @api private
|
23
|
-
# @since 0.5.0
|
24
|
-
def call
|
25
|
-
thread_safe { dependency_definition.call }
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
# @return [Proc]
|
31
|
-
#
|
32
|
-
# @api private
|
33
|
-
# @since 0.5.0
|
34
|
-
attr_reader :dependency_definition
|
35
|
-
|
36
|
-
# @param block [Proc]
|
37
|
-
# @return [Any]
|
38
|
-
#
|
39
|
-
# @api private
|
40
|
-
# @since 0.5.0
|
41
|
-
def thread_safe(&block)
|
42
|
-
@access_lock.synchronize(&block)
|
43
|
-
end
|
44
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.5.0
|
5
|
-
module SmartCore::Container::DependencyBuilder
|
6
|
-
class << self
|
7
|
-
# @param external_name [String]
|
8
|
-
# @param dependency_definition [Proc]
|
9
|
-
# @option memoize [Boolean]
|
10
|
-
# @return [SmartCore::Container::Dependency, SmartCore::Container::MemoizedDependency]
|
11
|
-
#
|
12
|
-
# @api private
|
13
|
-
# @since 0.5.0
|
14
|
-
def build(external_name, dependency_definition, memoize: false, **options)
|
15
|
-
# @todo: raise an error if memoize is not a boolean
|
16
|
-
|
17
|
-
if memoize
|
18
|
-
build_memoized_dependency(external_name, dependency_definition, **options)
|
19
|
-
else
|
20
|
-
build_dependency(external_name, dependency_definition, **options)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
# @param external_name [String]
|
27
|
-
# @param dependency_definition [Proc]
|
28
|
-
# @param options [Hash<Symbol,Any>]
|
29
|
-
# @return [SmartCore::Container::MemoizedDependency]
|
30
|
-
#
|
31
|
-
# @api private
|
32
|
-
# @since 0.5.0
|
33
|
-
def build_memoized_dependency(external_name, dependency_definition, **options)
|
34
|
-
SmartCore::Container::MemoizedDependency.new(external_name, dependency_definition, **options)
|
35
|
-
end
|
36
|
-
|
37
|
-
# @param external_name [String]
|
38
|
-
# @param dependency_definition [Proc]
|
39
|
-
# @param options [Hash<Symbol,Any>]
|
40
|
-
# @return [SmartCore::Container::Dependency]
|
41
|
-
#
|
42
|
-
# @api private
|
43
|
-
# @since 0.5.0
|
44
|
-
def build_dependency(external_name, dependency_definition, **options)
|
45
|
-
SmartCore::Container::Dependency.new(external_name, dependency_definition, **options)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.5.0
|
5
|
-
class SmartCore::Container::DependencyCompatability::Abstract
|
6
|
-
class << self
|
7
|
-
# @param dependency_root [Any]
|
8
|
-
# @param dependency_name [String]
|
9
|
-
# @return [void]
|
10
|
-
#
|
11
|
-
# @raise [SmartCore::Container::NamespaceOverlapError]
|
12
|
-
#
|
13
|
-
# @api private
|
14
|
-
# @since 0.5.0
|
15
|
-
def prevent_namespace_overlap!(dependency_root, dependency_name)
|
16
|
-
raise(
|
17
|
-
SmartCore::Container::NamespaceOverlapError,
|
18
|
-
"Trying to overlap already registered :#{dependency_name} " \
|
19
|
-
"namespace with :#{dependency_name} dependency!"
|
20
|
-
) if potential_namespace_overlap?(dependency_root, dependency_name)
|
21
|
-
end
|
22
|
-
|
23
|
-
# @param dependency_root [Any]
|
24
|
-
# @param namespace_name [String]
|
25
|
-
# @return [void]
|
26
|
-
#
|
27
|
-
# @raise [SmartCore::Container::DependencyOverlapError]
|
28
|
-
#
|
29
|
-
# @api private
|
30
|
-
# @since 0.5.0
|
31
|
-
def prevent_dependency_overlap!(dependency_root, namespace_name)
|
32
|
-
raise(
|
33
|
-
SmartCore::Container::DependencyOverlapError,
|
34
|
-
"Trying to overlap already registered :#{namespace_name} " \
|
35
|
-
"dependency with :#{namespace_name} namespace!"
|
36
|
-
) if potential_dependency_overlap?(dependency_root, namespace_name)
|
37
|
-
end
|
38
|
-
|
39
|
-
# @param dependency_root [Any]
|
40
|
-
# @param dependency [Any]
|
41
|
-
# @return [Boolean]
|
42
|
-
#
|
43
|
-
# @api private
|
44
|
-
# @since 0.5.0
|
45
|
-
def potential_namespace_overlap?(dependency_root, dependency)
|
46
|
-
raise NoMethodError
|
47
|
-
end
|
48
|
-
|
49
|
-
# @param dependency_root [Any]
|
50
|
-
# @param namespace [Any]
|
51
|
-
# @return [Boolean]
|
52
|
-
#
|
53
|
-
# @api private
|
54
|
-
# @since 0.5.0
|
55
|
-
def potential_dependency_overlap?(dependency_root, namespace)
|
56
|
-
raise NoMethodError
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SmartCore::Container::DependencyCompatability
|
4
|
-
# @api private
|
5
|
-
# @since 0.5.0
|
6
|
-
class CommandSet < Abstract
|
7
|
-
class << self
|
8
|
-
# @param command_set [SmartCore::Container::CommandSet]
|
9
|
-
# @param dependency_name [String]
|
10
|
-
# @return [Boolean]
|
11
|
-
#
|
12
|
-
# @api private
|
13
|
-
# @since 0.5.0
|
14
|
-
def potential_namespace_overlap?(command_set, dependency_name)
|
15
|
-
command_set.any? do |command|
|
16
|
-
next unless command.is_a?(SmartCore::Container::Commands::Namespace)
|
17
|
-
command.namespace_name == dependency_name
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# @param command_set [SmartCore::Container::CommandSet]
|
22
|
-
# @param namespace_name [String]
|
23
|
-
# @return [Boolean]
|
24
|
-
#
|
25
|
-
# @api private
|
26
|
-
# @since 0.5.0
|
27
|
-
def potential_dependency_overlap?(command_set, namespace_name)
|
28
|
-
command_set.any? do |command|
|
29
|
-
next unless command.is_a?(SmartCore::Container::Commands::Register)
|
30
|
-
command.dependency_name == namespace_name
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class SmartCore::Container
|
4
|
-
# @api public
|
5
|
-
# @since 0.5.0
|
6
|
-
Error = Class.new(SmartCore::Error)
|
7
|
-
|
8
|
-
# @api public
|
9
|
-
# @since 0.5.0
|
10
|
-
ArgumentError = Class.new(SmartCore::ArgumentError)
|
11
|
-
|
12
|
-
# @api public
|
13
|
-
# @since 0.5.0
|
14
|
-
NamespaceOverlapError = Class.new(Error)
|
15
|
-
|
16
|
-
# @api public
|
17
|
-
# @since 0.5.0
|
18
|
-
DependencyOverlapError = Class.new(Error)
|
19
|
-
|
20
|
-
# @api public
|
21
|
-
# @since 0.5.0
|
22
|
-
UnexistentDependencyError = Class.new(Error)
|
23
|
-
|
24
|
-
# @api public
|
25
|
-
# @since 0.5.0
|
26
|
-
FrozenRegistryError = Class.new(SmartCore::FrozenError)
|
27
|
-
|
28
|
-
# @api private
|
29
|
-
# @since 0.5.0
|
30
|
-
IncompatibleDependencyTree = Class.new(Error)
|
31
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.5.0
|
5
|
-
class SmartCore::Container::MemoizedDependency < SmartCore::Container::Dependency
|
6
|
-
# @param external_name [String]
|
7
|
-
# @param dependency_definition [Proc]
|
8
|
-
# @param options [Hash<Symbol,Any>]
|
9
|
-
# @return [void]
|
10
|
-
#
|
11
|
-
# @todo option list
|
12
|
-
# @see [SmartCore::Container::Dependency]
|
13
|
-
#
|
14
|
-
# @api private
|
15
|
-
# @since 0.5.0
|
16
|
-
def initialize(external_name, dependency_definition, **options)
|
17
|
-
@memoized_call = nil
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
# @return [Any]
|
22
|
-
#
|
23
|
-
# @api private
|
24
|
-
# @since 0.5.0
|
25
|
-
def call
|
26
|
-
thread_safe { @memoized_call ||= dependency_definition.call }
|
27
|
-
end
|
28
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.5.0
|
5
|
-
class SmartCore::Container::Namespace < SmartCore::Container::Entity
|
6
|
-
# @param external_name [String]
|
7
|
-
# @return [void]
|
8
|
-
#
|
9
|
-
# @api private
|
10
|
-
# @since 0.5.0
|
11
|
-
def initialize(external_name)
|
12
|
-
@container = Class.new(SmartCore::Container)
|
13
|
-
@container_instance = nil
|
14
|
-
@access_lock = Mutex.new
|
15
|
-
super(external_name)
|
16
|
-
end
|
17
|
-
|
18
|
-
# @param dependency_definitions [Proc]
|
19
|
-
# @return [void]
|
20
|
-
#
|
21
|
-
# @api private
|
22
|
-
# @since 0.5.0
|
23
|
-
def append_definitions(dependency_definitions)
|
24
|
-
container.instance_eval(&dependency_definitions)
|
25
|
-
end
|
26
|
-
|
27
|
-
# @return [SmartCore::Container]
|
28
|
-
#
|
29
|
-
# @api private
|
30
|
-
# @since 0.5.0
|
31
|
-
def call
|
32
|
-
thread_safe { @container_instance ||= container.new }
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
# @return [Class<SmartCore::Container>]
|
38
|
-
#
|
39
|
-
# @api private
|
40
|
-
# @since 0.5.0
|
41
|
-
attr_reader :container
|
42
|
-
|
43
|
-
# @param block [Proc]
|
44
|
-
# @return [Any]
|
45
|
-
#
|
46
|
-
# @api private
|
47
|
-
# @since 0.5.0
|
48
|
-
def thread_safe(&block)
|
49
|
-
@access_lock.synchronize(&block)
|
50
|
-
end
|
51
|
-
end
|