smart_core 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -2
  3. data/.travis.yml +3 -3
  4. data/CHANGELOG.md +3 -0
  5. data/Gemfile +0 -3
  6. data/README.md +5 -33
  7. data/Rakefile +2 -0
  8. data/lib/smart_core/container/command_definer.rb +117 -0
  9. data/lib/smart_core/container/command_set.rb +82 -0
  10. data/lib/smart_core/container/commands/base.rb +12 -0
  11. data/lib/smart_core/container/commands/namespace.rb +53 -0
  12. data/lib/smart_core/container/commands/register.rb +63 -0
  13. data/lib/smart_core/container/commands.rb +9 -0
  14. data/lib/smart_core/container/definition_dsl.rb +66 -0
  15. data/lib/smart_core/container/dependency.rb +44 -0
  16. data/lib/smart_core/container/dependency_builder.rb +48 -0
  17. data/lib/smart_core/container/dependency_compatability/abstract.rb +59 -0
  18. data/lib/smart_core/container/dependency_compatability/command_set.rb +35 -0
  19. data/lib/smart_core/container/dependency_compatability/registry.rb +37 -0
  20. data/lib/smart_core/container/dependency_compatability.rb +9 -0
  21. data/lib/smart_core/container/dependency_resolver.rb +16 -0
  22. data/lib/smart_core/container/entity.rb +26 -0
  23. data/lib/smart_core/container/exceptions.rb +31 -0
  24. data/lib/smart_core/container/key_guard.rb +31 -0
  25. data/lib/smart_core/container/memoized_dependency.rb +28 -0
  26. data/lib/smart_core/container/mixin.rb +82 -0
  27. data/lib/smart_core/container/namespace.rb +51 -0
  28. data/lib/smart_core/container/registry.rb +227 -0
  29. data/lib/smart_core/container/registry_builder.rb +18 -0
  30. data/lib/smart_core/container.rb +123 -0
  31. data/lib/smart_core/exceptions.rb +23 -0
  32. data/lib/smart_core/initializer/attribute/builder.rb +99 -0
  33. data/lib/smart_core/initializer/attribute/value_finalizer/lambda.rb +32 -0
  34. data/lib/smart_core/initializer/attribute/value_finalizer/method.rb +32 -0
  35. data/lib/smart_core/initializer/attribute/value_finalizer.rb +24 -0
  36. data/lib/smart_core/initializer/attribute.rb +123 -0
  37. data/lib/smart_core/initializer/attribute_definer.rb +162 -0
  38. data/lib/smart_core/{operation → initializer}/attribute_set.rb +17 -17
  39. data/lib/smart_core/initializer/exceptions.rb +47 -0
  40. data/lib/smart_core/initializer/extension.rb +39 -0
  41. data/lib/smart_core/initializer/extension_definer.rb +62 -0
  42. data/lib/smart_core/initializer/extension_set.rb +75 -0
  43. data/lib/smart_core/{operation → initializer}/initialization_dsl.rb +82 -42
  44. data/lib/smart_core/initializer/instance_attribute_accessing.rb +49 -0
  45. data/lib/smart_core/initializer/instance_builder.rb +164 -0
  46. data/lib/smart_core/initializer/type.rb +49 -0
  47. data/lib/smart_core/initializer/type_set.rb +52 -0
  48. data/lib/smart_core/initializer.rb +89 -0
  49. data/lib/smart_core/injector.rb +6 -0
  50. data/lib/smart_core/operation/exceptions.rb +4 -20
  51. data/lib/smart_core/operation/instance_builder.rb +16 -124
  52. data/lib/smart_core/operation/state.rb +7 -0
  53. data/lib/smart_core/operation/step.rb +43 -0
  54. data/lib/smart_core/operation/step_set.rb +73 -0
  55. data/lib/smart_core/operation/success.rb +11 -0
  56. data/lib/smart_core/operation.rb +10 -12
  57. data/lib/smart_core/schema.rb +6 -0
  58. data/lib/smart_core/validator/commands.rb +2 -0
  59. data/lib/smart_core/validator/exceptions.rb +1 -1
  60. data/lib/smart_core/version.rb +1 -1
  61. data/lib/smart_core.rb +5 -0
  62. data/smart_core.gemspec +14 -14
  63. metadata +57 -15
  64. data/lib/smart_core/operation/attribute.rb +0 -66
  65. data/lib/smart_core/operation/attribute_definer.rb +0 -160
@@ -1,58 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # @api private
4
- # @since 0.2.0
5
- class SmartCore::Operation::AttributeSet
6
- # @since 0.2.0
4
+ # @since 0.5.0
5
+ class SmartCore::Initializer::AttributeSet
6
+ # @since 0.5.0
7
7
  include Enumerable
8
8
 
9
- # @return [Hash<Symbol, SmartCore::Operation::Attribute>]
9
+ # @return [Hash<Symbol, SmartCore::Initializer::Attribute>]
10
10
  #
11
11
  # @api private
12
- # @since 0.2.0
12
+ # @since 0.5.0
13
13
  attr_reader :attributes
14
14
 
15
15
  # @return [void]
16
16
  #
17
17
  # @api private
18
- # @since 0.2.0
18
+ # @since 0.5.0
19
19
  def initialize
20
20
  @attributes = {}
21
21
  @access_lock = Mutex.new
22
22
  end
23
23
 
24
- # @param attribute [SmartCore::Operation::Attribute]
24
+ # @param attribute [SmartCore::Initializer::Attribute]
25
25
  # @return [void]
26
26
  #
27
27
  # @api private
28
- # @since 0.2.0
28
+ # @since 0.5.0
29
29
  def add_attribute(attribute)
30
30
  thread_safe { attributes[attribute.name] = attribute }
31
31
  end
32
32
  alias_method :<<, :add_attribute
33
33
 
34
- # @param attribute_set [SmartCore::Operation::AttributeSet]
34
+ # @param attribute_set [SmartCore::Initializer::AttributeSet]
35
35
  # @return [void]
36
36
  #
37
37
  # @api private
38
- # @sinec 0.2.0
38
+ # @sinec 0.5.0
39
39
  def concat(attribute_set)
40
40
  thread_safe { attributes.merge!(attribute_set.dup.attributes) }
41
41
  end
42
42
 
43
- # @param attribute [SmartCore::Operation::Attribute]
43
+ # @param attribute [SmartCore::Initializer::Attribute]
44
44
  # @return [Boolean]
45
45
  #
46
46
  # @api private
47
- # @since 0.2.0
47
+ # @since 0.5.0
48
48
  def conflicts_with?(attribute)
49
49
  thread_safe { attributes.key?(attribute.name) }
50
50
  end
51
51
 
52
- # @return [SmartCore::Operation::AttributeSet]
52
+ # @return [SmartCore::Initializer::AttributeSet]
53
53
  #
54
54
  # @api private
55
- # @since 0.2.0
55
+ # @since 0.5.0
56
56
  def dup
57
57
  thread_safe do
58
58
  self.class.new.tap do |duplicate|
@@ -66,7 +66,7 @@ class SmartCore::Operation::AttributeSet
66
66
  # @return [Integer]
67
67
  #
68
68
  # @api private
69
- # @since 0.2.0
69
+ # @since 0.5.0
70
70
  def size
71
71
  thread_safe { attributes.size }
72
72
  end
@@ -74,7 +74,7 @@ class SmartCore::Operation::AttributeSet
74
74
  # @return [Enumerable]
75
75
  #
76
76
  # @api private
77
- # @since 0.2.0
77
+ # @since 0.5.0
78
78
  def each(&block)
79
79
  thread_safe { block_given? ? attributes.each_value(&block) : attributes.each_value }
80
80
  end
@@ -85,7 +85,7 @@ class SmartCore::Operation::AttributeSet
85
85
  # @return [Any]
86
86
  #
87
87
  # @api private
88
- # @since 0.2.0
88
+ # @since 0.5.0
89
89
  def thread_safe(&block)
90
90
  @access_lock.synchronize(&block)
91
91
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SmartCore::Initializer
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
+ IncompatibleFinalizerTypeError = Class.new(ArgumentError)
15
+
16
+ # @api public
17
+ # @since 0.5.0
18
+ ParameterError = Class.new(ArgumentError)
19
+
20
+ # @api public
21
+ # @since 0.5.0
22
+ ParamOverlapError = Class.new(ParameterError)
23
+
24
+ # @api public
25
+ # @since 0.5.0
26
+ OptionError = Class.new(ArgumentError)
27
+
28
+ # @api public
29
+ # @since 0.5.0
30
+ OptionOverlapError = Class.new(OptionError)
31
+
32
+ # @api public
33
+ # @since 0.5.0
34
+ IncorrectAttributeNameError = Class.new(Error)
35
+
36
+ # @api public
37
+ # @since 0.5.0
38
+ UnregisteredTypeError = Class.new(Error)
39
+
40
+ # @api public
41
+ # @since 0.5.0
42
+ UnsupportedAttributePrivacyError = Class.new(Error)
43
+
44
+ # @api public
45
+ # @since 0.5.0
46
+ TypeError = Class.new(ArgumentError)
47
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.5.0
5
+ class SmartCore::Initializer::Extension
6
+ # @param additional_initialization_flow [Proc]
7
+ # @return [void]
8
+ #
9
+ # @api private
10
+ # @since 0.5.0
11
+ def initialize(additional_initialization_flow)
12
+ @additional_initialization_flow = additional_initialization_flow
13
+ end
14
+
15
+ # @param instance [Object]
16
+ # @return [void]
17
+ #
18
+ # @api private
19
+ # @since 0.5.0
20
+ def call(instance)
21
+ additional_initialization_flow.call(instance)
22
+ end
23
+
24
+ # @return [void]
25
+ #
26
+ # @api private
27
+ # @since 0.5.0
28
+ def dup
29
+ self.class.new(additional_initialization_flow)
30
+ end
31
+
32
+ private
33
+
34
+ # @return [Proc]
35
+ #
36
+ # @api private
37
+ # @since 0.5.0
38
+ attr_reader :additional_initialization_flow
39
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.5.0
5
+ class SmartCore::Initializer::ExtensionDefiner
6
+ # @param processed_klass [Class]
7
+ # @return [void]
8
+ #
9
+ # @api private
10
+ # @since 0.5.0
11
+ def initialize(processed_klass)
12
+ @processed_klass = processed_klass
13
+ @definition_lock = Mutex.new
14
+ end
15
+
16
+ # @param raw_extension [Proc]
17
+ # @return [void]
18
+ #
19
+ # @api private
20
+ # @since 0.5.0
21
+ def append_extension(raw_extension)
22
+ thread_safe do
23
+ extension = build_extension(raw_extension)
24
+ extend_initialization_flow(extension)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ # @return [Class]
31
+ #
32
+ # @api private
33
+ # @since 0.5.0
34
+ attr_reader :processed_klass
35
+
36
+ # @param raw_extension [Proc]
37
+ # @return [SmartCore::Initializar::Extension]
38
+ #
39
+ # @api private
40
+ # @since 0.5.0
41
+ def build_extension(raw_extension)
42
+ SmartCore::Initializer::Extension.new(raw_extension)
43
+ end
44
+
45
+ # @param extension [SmartCore::Initializer::Extension]
46
+ # @return [void]
47
+ #
48
+ # @api private
49
+ # @since 0.5.0
50
+ def extend_initialization_flow(extension)
51
+ processed_klass.__initialization_extensions__ << extension
52
+ end
53
+
54
+ # @param block [Proc]
55
+ # @return [void]
56
+ #
57
+ # @api private
58
+ # @since 0.5.0
59
+ def thread_safe(&block)
60
+ @definition_lock.synchronize(&block)
61
+ end
62
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.5.0
5
+ class SmartCore::Initializer::ExtensionSet
6
+ # @since 0.5.0
7
+ include Enumerable
8
+
9
+ # @return [Array<SmartCore::Initializer::InitializationExtension>]
10
+ #
11
+ # @api private
12
+ # @since 0.5.0
13
+ attr_reader :extensions
14
+
15
+ # @return [void]
16
+ #
17
+ # @api private
18
+ # @since 0.5.0
19
+ def initialize
20
+ @extensions = []
21
+ @access_lock = Mutex.new
22
+ end
23
+
24
+ # @param extension [SmartCore::Initializer::InitializationExtension]
25
+ # @return [void]
26
+ #
27
+ # @api private
28
+ # @since 0.5.0
29
+ def add_extension(extension)
30
+ thread_safe { extensions << extension }
31
+ end
32
+ alias_method :<<, :add_extension
33
+
34
+ # @return [SmartCore::Initializer::ExtensionSet]
35
+ #
36
+ # @api private
37
+ # @since 0.5.0
38
+ def dup
39
+ thread_safe do
40
+ self.class.new.tap do |duplicate|
41
+ extensions.each do |extension|
42
+ duplicate.add_extension(extension.dup)
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ # @return [Enumerable]
49
+ #
50
+ # @api private
51
+ # @since 0.5.0
52
+ def each(&block)
53
+ thread_safe { block_given? ? extensions.each(&block) : extensions.each }
54
+ end
55
+
56
+ # @param extension_set [SmartCore::Initializer::ExtensionSet]
57
+ # @return [void]
58
+ #
59
+ # @api private
60
+ # @since 0.5.0
61
+ def concat(extension_set)
62
+ thread_safe { extensions.concat(extension_set.dup.extensions) }
63
+ end
64
+
65
+ private
66
+
67
+ # @param block [Proc]
68
+ # @return [Any]
69
+ #
70
+ # @api private
71
+ # @since 0.5.0
72
+ def thread_safe(&block)
73
+ @access_lock.synchronize(&block)
74
+ end
75
+ end
@@ -1,36 +1,46 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class SmartCore::Operation
3
+ module SmartCore::Initializer
4
4
  # @api private
5
- # @since 0.2.0
5
+ # @since 0.5.0
6
6
  module InitializationDSL
7
7
  class << self
8
8
  # @param base_klass [Class]
9
9
  # @return [void]
10
10
  #
11
11
  # @api private
12
- # @since 0.2.0
12
+ # @since 0.5.0
13
13
  def included(base_klass) # rubocop:disable Metrics/AbcSize
14
- base_klass.extend(DSLMethods)
15
- base_klass.singleton_class.prepend(InitializationMethods)
16
-
14
+ # rubocop:disable Metrics/LineLength
15
+ base_klass.instance_variable_set(:@__initialization_extension_definer__, ExtensionDefiner.new(base_klass))
16
+ base_klass.instance_variable_set(:@__initialization_extensions__, ExtensionSet.new)
17
17
  base_klass.instance_variable_set(:@__attr_definer__, AttributeDefiner.new(base_klass))
18
18
  base_klass.instance_variable_set(:@__params__, AttributeSet.new)
19
19
  base_klass.instance_variable_set(:@__options__, AttributeSet.new)
20
+ # rubocop:enable Metrics/LineLength
21
+
22
+ base_klass.extend(ClassMethods)
23
+ base_klass.extend(DSLMethods)
24
+ base_klass.singleton_class.prepend(InitializationMethods)
20
25
 
21
26
  base_klass.singleton_class.prepend(Module.new do
22
27
  # @param child_klass [Class]
23
28
  # @return [void]
24
29
  #
25
30
  # @api private
26
- # @since 0.2.0
27
- def inherited(child_klass)
28
- child_klass.singleton_class.prepend(InitializationMethods)
29
-
31
+ # @since 0.5.0
32
+ def inherited(child_klass) # rubocop:disable Metrics/AbcSize
33
+ # rubocop:disable Metrics/LineLength
34
+ child_klass.instance_variable_set(:@__initialization_extension_definer__, ExtensionDefiner.new(child_klass))
35
+ child_klass.instance_variable_set(:@__initialization_extensions__, ExtensionSet.new)
30
36
  child_klass.instance_variable_set(:@__attr_definer__, AttributeDefiner.new(child_klass))
31
37
  child_klass.instance_variable_set(:@__params__, AttributeSet.new)
32
38
  child_klass.instance_variable_set(:@__options__, AttributeSet.new)
39
+ # rubocop:enable Metrics/LineLength
40
+
41
+ child_klass.singleton_class.prepend(InitializationMethods)
33
42
 
43
+ child_klass.__initialization_extensions__.concat(__initialization_extensions__)
34
44
  child_klass.__params__.concat(__params__)
35
45
  child_klass.__options__.concat(__options__)
36
46
 
@@ -41,14 +51,14 @@ class SmartCore::Operation
41
51
  end
42
52
 
43
53
  # @api private
44
- # @since 0.2.0
54
+ # @since 0.5.0
45
55
  module InitializationMethods
46
56
  # @param parameters [Any]
47
57
  # @param options [Hash<Symbol,Any>]
48
58
  # @return [Any]
49
59
  #
50
60
  # @api public
51
- # @since 0.2.0
61
+ # @since 0.5.0
52
62
  def new(*parameters, **options)
53
63
  allocate.tap do |object|
54
64
  InstanceBuilder.call(object, self, parameters, options)
@@ -57,22 +67,67 @@ class SmartCore::Operation
57
67
  end
58
68
 
59
69
  # @api private
60
- # @since 0.2.0
70
+ # @since 0.5.0
71
+ module ClassMethods
72
+ # @return [SmartCore::Initializer::AttributeSet]
73
+ #
74
+ # @api private
75
+ # @since 0.5.0
76
+ def __params__
77
+ @__params__
78
+ end
79
+
80
+ # @return [SmartCore::Initializer::AttributeSet]
81
+ #
82
+ # @api private
83
+ # @since 0.5.0
84
+ def __options__
85
+ @__options__
86
+ end
87
+
88
+ # @return [SmartCore::Initializer::AttributeDefiner]
89
+ #
90
+ # @api private
91
+ # @since 0.5.0
92
+ def __attr_definer__
93
+ @__attr_definer__
94
+ end
95
+
96
+ # @return [SmartCore::Initializer::ExtensionSet]
97
+ #
98
+ # @api private
99
+ # @since 0.5.0
100
+ def __initialization_extensions__
101
+ @__initialization_extensions__
102
+ end
103
+
104
+ # @return [SmartCore::Initializer::ExtensionDefiner]
105
+ #
106
+ # @api private
107
+ # @since 0.5.0
108
+ def __initialization_extension_definer__
109
+ @__initialization_extension_definer__
110
+ end
111
+ end
112
+
113
+ # @api private
114
+ # @since 0.5.0
61
115
  module DSLMethods
62
116
  # @param param_name [String, Symbol]
117
+ # @param options [Hash<Symbol,Any>]
63
118
  # @return [void]
64
119
  #
65
120
  # @api public
66
- # @since 0.2.0
67
- def param(param_name)
68
- __attr_definer__.define_param(param_name)
121
+ # @since 0.5.0
122
+ def param(param_name, type = :__any__, **options)
123
+ __attr_definer__.define_param(param_name, type, **options)
69
124
  end
70
125
 
71
126
  # @param param_names [Array<String, Symbol>]
72
127
  # @return [void]
73
128
  #
74
129
  # @api public
75
- # @since 0.2.0
130
+ # @since 0.5.0
76
131
  def params(*param_names)
77
132
  __attr_definer__.define_params(*param_names)
78
133
  end
@@ -82,42 +137,27 @@ class SmartCore::Operation
82
137
  # @return [void]
83
138
  #
84
139
  # @api public
85
- # @since 0.2.0
86
- def option(option_name, **options)
87
- __attr_definer__.define_option(option_name, **options)
140
+ # @since 0.5.0
141
+ def option(option_name, type = :__any__, **options)
142
+ __attr_definer__.define_option(option_name, type, **options)
88
143
  end
89
144
 
90
145
  # @param option_names [Array<String, Symbol>]
91
146
  # @return [void]
92
147
  #
93
148
  # @api public
94
- # @since 0.2.0
149
+ # @since 0.5.0
95
150
  def options(*option_names)
96
151
  __attr_definer__.define_options(*option_names)
97
152
  end
98
153
 
99
- # @return [SmartCore::Operation::AttributeSet]
100
- #
101
- # @api private
102
- # @since 0.2.0
103
- def __params__
104
- @__params__
105
- end
106
-
107
- # @return [SmartCore::Operation::AttributeSet]
108
- #
109
- # @api private
110
- # @since 0.2.0
111
- def __options__
112
- @__options__
113
- end
114
-
115
- # @return [SmartCore::Operation::AttributeDefiner]
154
+ # @param block [Proc]
155
+ # @return [void]
116
156
  #
117
- # @api private
118
- # @since 0.2.0
119
- def __attr_definer__
120
- @__attr_definer__
157
+ # @api public
158
+ # @since 0.5.0
159
+ def extend_initialization_flow(&block)
160
+ __initialization_extension_definer__.append_extension(block)
121
161
  end
122
162
  end
123
163
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.5.0
5
+ module SmartCore::Initializer::InstanceAttributeAccessing
6
+ # @return [Hash<Symbol,Any>]
7
+ #
8
+ # @api public
9
+ # @since 0.5.0
10
+ def params
11
+ __collect_params__
12
+ end
13
+
14
+ # @return [Hash<Symbol,Any>]
15
+ #
16
+ # @api public
17
+ # @since 0.5.0
18
+ def options
19
+ __collect_options__
20
+ end
21
+
22
+ # @return [Hash<Symbol,Any>]
23
+ #
24
+ # @api public
25
+ # @since 0.5.0
26
+ def attributes
27
+ __collect_params__.merge(__collect_options__)
28
+ end
29
+
30
+ # @return [Hash<Symbol,Any>]
31
+ #
32
+ # @api private
33
+ # @since 0.5.0
34
+ def __collect_params__
35
+ self.class.__params__.each_with_object({}) do |param, memo|
36
+ memo[param.name] = instance_variable_get("@#{param.name}")
37
+ end
38
+ end
39
+
40
+ # @return [Hash<Symbol,Any>]
41
+ #
42
+ # @api private
43
+ # @since 0.5.0
44
+ def __collect_options__
45
+ self.class.__options__.each_with_object({}) do |option, memo|
46
+ memo[option.name] = instance_variable_get("@#{option.name}")
47
+ end
48
+ end
49
+ end