smart_core 0.4.0 → 0.5.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.
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
@@ -23,6 +23,17 @@ class SmartCore::Operation::Success < SmartCore::Operation::Result
23
23
  true.tap { yield(self) if block_given? }
24
24
  end
25
25
 
26
+ # Support for operations like `result.success? { |**result| ...result-as-a-hash... }`
27
+ #
28
+ # @return [Hash]
29
+ #
30
+ # @api public
31
+ # @since 0.5.0
32
+ def to_h
33
+ __result_options__.dup
34
+ end
35
+ alias_method :to_hash, :to_h
36
+
26
37
  private
27
38
 
28
39
  # @param result_options [Hash<Symbol,Any>]
@@ -4,18 +4,22 @@
4
4
  # @since 0.2.0
5
5
  class SmartCore::Operation
6
6
  require_relative 'operation/exceptions'
7
- require_relative 'operation/attribute'
8
- require_relative 'operation/attribute_set'
7
+ require_relative 'operation/state'
8
+ require_relative 'operation/step'
9
+ require_relative 'operation/step_set'
9
10
  require_relative 'operation/result'
10
11
  require_relative 'operation/success'
11
12
  require_relative 'operation/failure'
12
13
  require_relative 'operation/fatal'
13
14
  require_relative 'operation/instance_builder'
14
- require_relative 'operation/attribute_definer'
15
- require_relative 'operation/initialization_dsl'
16
15
 
17
- # @since 0.2.0
18
- include InitializationDSL
16
+ # @since 0.5.0
17
+ include SmartCore::Initializer
18
+
19
+ # @since 0.5.0
20
+ extend_initialization_flow do |operation|
21
+ SmartCore::Operation::InstanceBuilder.call(operation)
22
+ end
19
23
 
20
24
  class << self
21
25
  # @param arguments [Any]
@@ -32,12 +36,6 @@ class SmartCore::Operation
32
36
  end
33
37
  end
34
38
 
35
- # @return [void]
36
- #
37
- # @api private
38
- # @since 0.2.0
39
- def initialize(*, **); end
40
-
41
39
  # @return [SmartCore::Operation::Success]
42
40
  # @return [SmartCore::Operation::Failure]
43
41
  # @return [SmartCore::Operation::Fatal]
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.5.0
5
+ class SmartCore::Schema
6
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # @api private
4
+ # @since 0.1.0
3
5
  module SmartCore::Validator::Commands
4
6
  require_relative 'commands/base'
5
7
  require_relative 'commands/work_with_nesteds_mixin'
@@ -3,7 +3,7 @@
3
3
  class SmartCore::Validator
4
4
  # @api public
5
5
  # @since 0.1.0
6
- Error = Class.new(StandardError)
6
+ Error = Class.new(SmartCore::Error)
7
7
 
8
8
  # @api public
9
9
  # @since 0.1.0
@@ -5,5 +5,5 @@ module SmartCore
5
5
  #
6
6
  # @api public
7
7
  # @since 0.1.0
8
- VERSION = '0.4.0'
8
+ VERSION = '0.5.0'
9
9
  end
data/lib/smart_core.rb CHANGED
@@ -4,6 +4,11 @@
4
4
  # @since 0.1.0
5
5
  module SmartCore
6
6
  require_relative 'smart_core/version'
7
+ require_relative 'smart_core/exceptions'
8
+ require_relative 'smart_core/initializer'
9
+ require_relative 'smart_core/container'
10
+ require_relative 'smart_core/injector'
7
11
  require_relative 'smart_core/validator'
8
12
  require_relative 'smart_core/operation'
13
+ require_relative 'smart_core/schema'
9
14
  end
data/smart_core.gemspec CHANGED
@@ -7,27 +7,27 @@ require 'smart_core/version'
7
7
  Gem::Specification.new do |spec|
8
8
  spec.required_ruby_version = '>= 2.3.8'
9
9
 
10
- spec.name = 'smart_core'
11
- spec.version = SmartCore::VERSION
12
- spec.authors = ['Rustam Ibragimov']
13
- spec.email = ['iamdaiver@icloud.com']
14
- spec.summary = '(in active development) A set of common abstractions'
15
- spec.description = '(in active development) A set of common abstractions'
16
- spec.homepage = 'https://github.com/0exp/smart_core'
17
- spec.license = 'MIT'
10
+ spec.name = 'smart_core'
11
+ spec.version = SmartCore::VERSION
12
+ spec.authors = ['Rustam Ibragimov']
13
+ spec.email = ['iamdaiver@icloud.com']
14
+ spec.summary = '(in active development) A set of common abstractions'
15
+ spec.description = '(in active development) A set of common abstractions'
16
+ spec.homepage = 'https://github.com/0exp/smart_core'
17
+ spec.license = 'MIT'
18
18
 
19
- spec.bindir = 'bin'
20
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.bindir = 'bin'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
22
 
23
23
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
24
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|features)/}) }
25
25
  end
26
26
 
27
- spec.add_development_dependency 'coveralls', '~> 0.8.22'
28
- spec.add_development_dependency 'simplecov', '~> 0.16.1'
29
- spec.add_development_dependency 'armitage-rubocop', '~> 0.18.0'
30
- spec.add_development_dependency 'rspec', '~> 3.8.0'
27
+ spec.add_development_dependency 'coveralls', '~> 0.8'
28
+ spec.add_development_dependency 'simplecov', '~> 0.16'
29
+ spec.add_development_dependency 'armitage-rubocop', '~> 0.70'
30
+ spec.add_development_dependency 'rspec', '~> 3.8'
31
31
 
32
32
  spec.add_development_dependency 'bundler'
33
33
  spec.add_development_dependency 'rake'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-26 00:00:00.000000000 Z
11
+ date: 2019-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coveralls
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.8.22
19
+ version: '0.8'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.8.22
26
+ version: '0.8'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: simplecov
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.16.1
33
+ version: '0.16'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.16.1
40
+ version: '0.16'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: armitage-rubocop
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.18.0
47
+ version: '0.70'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.18.0
54
+ version: '0.70'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.8.0
61
+ version: '3.8'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 3.8.0
68
+ version: '3.8'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -128,17 +128,59 @@ files:
128
128
  - bin/console
129
129
  - bin/setup
130
130
  - lib/smart_core.rb
131
+ - lib/smart_core/container.rb
132
+ - lib/smart_core/container/command_definer.rb
133
+ - lib/smart_core/container/command_set.rb
134
+ - lib/smart_core/container/commands.rb
135
+ - lib/smart_core/container/commands/base.rb
136
+ - lib/smart_core/container/commands/namespace.rb
137
+ - lib/smart_core/container/commands/register.rb
138
+ - lib/smart_core/container/definition_dsl.rb
139
+ - lib/smart_core/container/dependency.rb
140
+ - lib/smart_core/container/dependency_builder.rb
141
+ - lib/smart_core/container/dependency_compatability.rb
142
+ - lib/smart_core/container/dependency_compatability/abstract.rb
143
+ - lib/smart_core/container/dependency_compatability/command_set.rb
144
+ - lib/smart_core/container/dependency_compatability/registry.rb
145
+ - lib/smart_core/container/dependency_resolver.rb
146
+ - lib/smart_core/container/entity.rb
147
+ - lib/smart_core/container/exceptions.rb
148
+ - lib/smart_core/container/key_guard.rb
149
+ - lib/smart_core/container/memoized_dependency.rb
150
+ - lib/smart_core/container/mixin.rb
151
+ - lib/smart_core/container/namespace.rb
152
+ - lib/smart_core/container/registry.rb
153
+ - lib/smart_core/container/registry_builder.rb
154
+ - lib/smart_core/exceptions.rb
155
+ - lib/smart_core/initializer.rb
156
+ - lib/smart_core/initializer/attribute.rb
157
+ - lib/smart_core/initializer/attribute/builder.rb
158
+ - lib/smart_core/initializer/attribute/value_finalizer.rb
159
+ - lib/smart_core/initializer/attribute/value_finalizer/lambda.rb
160
+ - lib/smart_core/initializer/attribute/value_finalizer/method.rb
161
+ - lib/smart_core/initializer/attribute_definer.rb
162
+ - lib/smart_core/initializer/attribute_set.rb
163
+ - lib/smart_core/initializer/exceptions.rb
164
+ - lib/smart_core/initializer/extension.rb
165
+ - lib/smart_core/initializer/extension_definer.rb
166
+ - lib/smart_core/initializer/extension_set.rb
167
+ - lib/smart_core/initializer/initialization_dsl.rb
168
+ - lib/smart_core/initializer/instance_attribute_accessing.rb
169
+ - lib/smart_core/initializer/instance_builder.rb
170
+ - lib/smart_core/initializer/type.rb
171
+ - lib/smart_core/initializer/type_set.rb
172
+ - lib/smart_core/injector.rb
131
173
  - lib/smart_core/operation.rb
132
- - lib/smart_core/operation/attribute.rb
133
- - lib/smart_core/operation/attribute_definer.rb
134
- - lib/smart_core/operation/attribute_set.rb
135
174
  - lib/smart_core/operation/exceptions.rb
136
175
  - lib/smart_core/operation/failure.rb
137
176
  - lib/smart_core/operation/fatal.rb
138
- - lib/smart_core/operation/initialization_dsl.rb
139
177
  - lib/smart_core/operation/instance_builder.rb
140
178
  - lib/smart_core/operation/result.rb
179
+ - lib/smart_core/operation/state.rb
180
+ - lib/smart_core/operation/step.rb
181
+ - lib/smart_core/operation/step_set.rb
141
182
  - lib/smart_core/operation/success.rb
183
+ - lib/smart_core/schema.rb
142
184
  - lib/smart_core/validator.rb
143
185
  - lib/smart_core/validator/attribute.rb
144
186
  - lib/smart_core/validator/attribute_set.rb
@@ -175,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
217
  - !ruby/object:Gem::Version
176
218
  version: '0'
177
219
  requirements: []
178
- rubygems_version: 3.0.2
220
+ rubygems_version: 3.0.3
179
221
  signing_key:
180
222
  specification_version: 4
181
223
  summary: "(in active development) A set of common abstractions"
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @api private
4
- # @since 0.2.0
5
- class SmartCore::Operation::Attribute
6
- # @return [Symbol]
7
- #
8
- # @api private
9
- # @since 0.2.0
10
- attr_reader :name
11
-
12
- # @return [Hash<Symbol,Any>]
13
- #
14
- # @api private
15
- # @since 0.2.0
16
- attr_reader :options
17
-
18
- # @param name [String, Symbol]
19
- # @param options [Hash<Symbol,Any>] Supported options:
20
- # - :default (see #default_value) (proc or object)
21
- # @return [void]
22
- #
23
- # @api private
24
- # @since 0.2.0
25
- def initialize(name, **options)
26
- unless name.is_a?(Symbol) || name.is_a?(String)
27
- raise(
28
- SmartCore::Operation::IncorrectAttributeNameError,
29
- 'Attribute name should be a symbol or a string'
30
- )
31
- end
32
-
33
- @name = name
34
- @options = options # TODO: check for unsupported options (and fail if found)
35
- end
36
-
37
- # @return [Boolean]
38
- #
39
- # @api private
40
- # @since 0.2.0
41
- def has_default_value?
42
- options.key?(:default)
43
- end
44
-
45
- # @return [Any]
46
- #
47
- # @raise [SmartCore::Operation::ArgumentError]
48
- #
49
- # @api private
50
- # @since 0.2.0
51
- def default_value
52
- default_value = options.fetch(:default) do
53
- raise(SmartCore::Operation::ArgumentError, 'Default value is not provided.')
54
- end
55
-
56
- default_value.is_a?(Proc) ? default_value.call : default_value
57
- end
58
-
59
- # @return [SmartCore::Operation::Attribute]
60
- #
61
- # @api private
62
- # @since 0.2.0
63
- def dup
64
- self.class.new(name, **options)
65
- end
66
- end
@@ -1,160 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @api private
4
- # @since 0.2.0
5
- class SmartCore::Operation::AttributeDefiner
6
- # @param operation_klass [Class<SmartCore::Operation>]
7
- # @return [void]
8
- #
9
- # @api private
10
- # @since 0.2.0
11
- def initialize(operation_klass)
12
- @operation_klass = operation_klass
13
- @definition_lock = Mutex.new
14
- end
15
-
16
- # @param param_name [Symbol, String]
17
- # @return [void]
18
- #
19
- # @api private
20
- # @since 0.2.0
21
- def define_param(param_name)
22
- thread_safe do
23
- parameter = build_attribute(param_name)
24
- prevent_intersection_with_already_defined_option(parameter)
25
- append_parameter(parameter)
26
- end
27
- end
28
-
29
- # @param param_names [Array<String, Symbol>]
30
- # @return [void]
31
- #
32
- # @api private
33
- # @since 0.2.0
34
- def define_params(*param_names)
35
- thread_safe do
36
- parameters = param_names.map do |param_name|
37
- build_attribute(param_name).tap do |parameter|
38
- prevent_intersection_with_already_defined_option(parameter)
39
- end
40
- end
41
-
42
- parameters.each { |parameter| append_parameter(parameter) }
43
- end
44
- end
45
-
46
- # @param option_name [Symbol, String]
47
- # @return [void]
48
- #
49
- # @api private
50
- # @since 0.2.0
51
- def define_option(option_name, **options)
52
- thread_safe do
53
- option = build_attribute(option_name, **options)
54
- prevent_intersection_with_already_defined_param(option)
55
- append_option(option)
56
- end
57
- end
58
-
59
- # @param option_names [Array<String, Symbol>]
60
- # @return [void]
61
- #
62
- # @api private
63
- # @since 0.2.0
64
- def define_options(*option_names)
65
- thread_safe do
66
- options = option_names.map do |option_name|
67
- build_attribute(option_name).tap do |option|
68
- prevent_intersection_with_already_defined_param(option)
69
- end
70
- end
71
-
72
- options.each { |option| append_option(option) }
73
- end
74
- end
75
-
76
- private
77
-
78
- # @return [Class<SmartCore::Operation>]
79
- #
80
- # @api private
81
- # @since 0.2.0
82
- attr_reader :operation_klass
83
-
84
- # @return [Mutex]
85
- #
86
- # @api private
87
- # @since 0.2.0
88
- attr_reader :definition_lock
89
-
90
- # @param attribute_name [Symbol, String]
91
- # @param attribute_options [Hash<Symbol,Any>]
92
- # @return [SmartCore::Operation::Attribute]
93
- #
94
- # @api private
95
- # @since 0.2.0
96
- def build_attribute(attribute_name, **attribute_options)
97
- SmartCore::Operation::Attribute.new(attribute_name, **attribute_options)
98
- end
99
-
100
- # @param parameter [SmartCore::Operation::Attribute]
101
- # @return [void]
102
- #
103
- # @api private
104
- # @since 0.2.0
105
- def append_parameter(parameter)
106
- operation_klass.__params__ << parameter
107
- operation_klass.send(:attr_reader, parameter.name)
108
- end
109
-
110
- # @param option [SmartCore::Operation::Attribute]
111
- # @return [void]
112
- #
113
- # @api private
114
- # @since 0.2.0
115
- def append_option(option)
116
- operation_klass.__options__ << option
117
- operation_klass.send(:attr_reader, option.name)
118
- end
119
-
120
- # @param parameter [SmartCore::Operation::Attribute]
121
- # @return [void]
122
- #
123
- # @raise [SmartCore::Operation::OptionOverlapError]
124
- #
125
- # @api private
126
- # @since 0.2.0
127
- def prevent_intersection_with_already_defined_option(parameter)
128
- if operation_klass.__options__.conflicts_with?(parameter)
129
- raise(
130
- SmartCore::Operation::OptionOverlapError,
131
- "You have already defined option with :#{parameter.name} name"
132
- )
133
- end
134
- end
135
-
136
- # @param option [SmartCore::Operation::Attribute]
137
- # @return [void]
138
- #
139
- # @raise [SmartCore::Operation::ParamOverlapError]
140
- #
141
- # @api private
142
- # @since 0.2.0
143
- def prevent_intersection_with_already_defined_param(option)
144
- if operation_klass.__params__.conflicts_with?(option)
145
- raise(
146
- SmartCore::Operation::ParamOverlapError,
147
- "You have already defined param with :#{option.name} name"
148
- )
149
- end
150
- end
151
-
152
- # @param block [Proc]
153
- # @return [Any]
154
- #
155
- # @api private
156
- # @since 0.2.0
157
- def thread_safe(&block)
158
- definition_lock.synchronize(&block)
159
- end
160
- end