smart_initializer 0.1.0.alpha3 → 0.1.0.alpha4

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: 483a56f55f7fb7b8e67eb20b1779df0b59f33935544d19cd6c5cd0e018e9b3b1
4
- data.tar.gz: 9b1fc252e8821e68b22d38fe06e0418e5792860bc6e583caafd4ff5f786f509a
3
+ metadata.gz: 045121a7aff669e936532780b634d3212d6063c051534bb465efc3a81fdcfb8c
4
+ data.tar.gz: f3aee4d1ada5fbb1dea05a39b7b81beb34096a75b41e641a15ddee7ea04e049a
5
5
  SHA512:
6
- metadata.gz: d77018f9b4be1a8f0c7befa771313d01debf97144e2bdc0d10248f357347eedeb6c0734997e6946fa0a35b810a6d7a1b59c395c8855f9e708a48021f0a94c9e7
7
- data.tar.gz: 9cf8e06b7d6c89951330beff5698cca00502183ed625b06c3e620a6e6df0d654db4b55788d26a68b9da390217d9eb42966b609a773ebd5baa3e71bfa6d838f17
6
+ metadata.gz: ede12d393005f5c9c60fb33f063bbc8cd5ae12ecdb831f7b1219538b6e66a0adb8002fe9f0608e03fbc9831ac653d0a3c9e038c65d4a26cf7b1724608b105169
7
+ data.tar.gz: e4b976324cdbe52f4e2a9546ff621987c9536f1faf08468b68a2bc2e25cb2b98e2560a2d46f0dd76ec5559e60f577018993a3ffb35c5f742987fd3e88a79c125
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_initializer (0.1.0.alpha2)
4
+ smart_initializer (0.1.0.alpha3)
5
5
  smart_engine (~> 0.5)
6
6
  smart_types (~> 0.1.0.alpha6)
7
7
 
data/README.md CHANGED
@@ -20,8 +20,22 @@ require 'smart_core/types'
20
20
 
21
21
  ---
22
22
 
23
+ ## Table of contents
24
+
25
+ - [Synopsis](#synopsis)
26
+ - [Type Aliasing](#type-aliasing)
27
+ - [Initialization extension](#initialization-extension)
28
+
29
+ ---
30
+
23
31
  ## Synopsis
24
32
 
33
+ **Initialization flow**:
34
+
35
+ 1. Parameter + Option definitioning;
36
+ 2. Original #initialize invokation;
37
+ 3. Initialization extensions invokation;
38
+
25
39
  **Constructor definition**:
26
40
 
27
41
  - `param` - defines name-like attribute:
@@ -78,6 +92,8 @@ User.new(1, 'John', 'test123', role: :admin, metadata: {}, enabled: false)
78
92
 
79
93
  ## Type aliasing
80
94
 
95
+ - Usage:
96
+
81
97
  ```ruby
82
98
  # define your own type alias
83
99
  SmartCore::Initializer.type_alias(:hash, SmartCore::Types::Value::Hash)
@@ -90,6 +106,48 @@ class User
90
106
  end
91
107
  ```
92
108
 
109
+ - Predefined aliases:
110
+ - `:nil` => `SmartCore::Types::Value::Nil`
111
+ - `:string` => `SmartCore::Types::Value::String`
112
+ - `:symbol` => `SmartCore::Types::Value::Symbol`
113
+ - `:text` => `SmartCore::Types::Value::Text`
114
+ - `:integer` => `SmartCore::Types::Value::Integer`
115
+ - `:float` => `SmartCore::Types::Value::Float`
116
+ - `:numeric` => `SmartCore::Types::Value::Numeric`
117
+ - `:boolean` => `SmartCore::Types::Value::Boolean`
118
+ - `:array` => `SmartCore::Types::Value::Array`
119
+ - `:hash` => `SmartCore::Types::Value::Hash`
120
+ - `:proc` => `SmartCore::Types::Value::Proc`
121
+ - `:class` => `SmartCore::Types::Value::Class`
122
+ - `:module` => `SmartCore::Types::Value::Module`
123
+ - `:any` => `SmartCore::Types::Value::Any`
124
+
125
+ ---
126
+
127
+ ## Initialization extension
128
+
129
+ - `ext_init(&block)`:
130
+ - you can define as many extensions as you want;
131
+ - extensions are invoked in the order they are defined;
132
+
133
+ ```ruby
134
+ class User
135
+ include SmartCore::Initializer
136
+
137
+ option :name, :name
138
+ option :age, :integer
139
+
140
+ ext_init { |instance| instance.define_singleton_method(:extra) { :ext1 } }
141
+ ext_init { |instance| instance.define_singleton_method(:extra2) { :ext2 } }
142
+ end
143
+
144
+ user = User.new(name: 'keka', age: 123)
145
+ user.name # => 'keka'
146
+ user.age # => 123
147
+ user.extra # => :ext1
148
+ user.extra2 # => :ext2
149
+ ```
150
+
93
151
  ---
94
152
 
95
153
  ## Contributing
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SmartCore::Initializer::Attribute::InitExtention
4
+ end
@@ -6,7 +6,6 @@ class SmartCore::Initializer::Attribute
6
6
  require_relative 'attribute/parameters'
7
7
  require_relative 'attribute/list'
8
8
  require_relative 'attribute/finalizer'
9
- require_relative 'attribute/definer'
10
9
  require_relative 'attribute/factory'
11
10
 
12
11
  # @since 0.1.0
@@ -2,7 +2,7 @@
2
2
 
3
3
  # @api private
4
4
  # @since 0.1.0
5
- class SmartCore::Initializer::Attribute::Definer
5
+ class SmartCore::Initializer::Constructor::Definer
6
6
  # @param klass [Class]
7
7
  # @return [void]
8
8
  #
@@ -13,6 +13,17 @@ class SmartCore::Initializer::Attribute::Definer
13
13
  @lock = SmartCore::Engine::Lock.new
14
14
  end
15
15
 
16
+ # @param block [Proc]
17
+ # @return [void]
18
+ #
19
+ # @api private
20
+ # @since 0.1.0
21
+ def define_init_extension(block)
22
+ thread_safe do
23
+ add_init_extension(build_init_extension(block))
24
+ end
25
+ end
26
+
16
27
  # @param name [String, Symbol]
17
28
  # @param type [String, Symbol, SmartCore::Types::Primitive]
18
29
  # @param privacy [String, Symbol]
@@ -121,6 +132,15 @@ class SmartCore::Initializer::Attribute::Definer
121
132
  )
122
133
  end
123
134
 
135
+ # @param block [Proc]
136
+ # @return [SmartCore::Initializer::Extensions::ExtInit]
137
+ #
138
+ # @api private
139
+ # @since 0.1.0
140
+ def build_init_extension(block)
141
+ SmartCore::Initializer::Extensions::ExtInit.new(block)
142
+ end
143
+
124
144
  # @param parameter [SmartCore::Initializer::Attribute]
125
145
  # @return [void]
126
146
  #
@@ -143,6 +163,15 @@ class SmartCore::Initializer::Attribute::Definer
143
163
  klass.send(option.privacy, option.name)
144
164
  end
145
165
 
166
+ # @param extension [SmartCore::Initializer::Extensions::ExtInit]
167
+ # @return [void]
168
+ #
169
+ # @api private
170
+ # @since 0.1.0
171
+ def add_init_extension(extension)
172
+ klass.__init_extensions__ << extension
173
+ end
174
+
146
175
  # @param parameter [SmartCore::Initializer::Attribute]
147
176
  # @return [void]
148
177
  #
@@ -3,6 +3,8 @@
3
3
  # @api private
4
4
  # @since 0.1.0
5
5
  class SmartCore::Initializer::Constructor
6
+ require_relative 'constructor/definer'
7
+
6
8
  # @param klass [Class<SmartCore::Initializer>]
7
9
  # @param arguments [Array<Any>]
8
10
  # @param block [Proc, NilClass]
@@ -27,6 +29,7 @@ class SmartCore::Initializer::Constructor
27
29
  initialize_parameters(instance)
28
30
  initialize_options(instance)
29
31
  process_original_initializer(instance)
32
+ process_init_extensions(instance)
30
33
  end
31
34
  end
32
35
 
@@ -143,6 +146,17 @@ class SmartCore::Initializer::Constructor
143
146
  instance.send(:initialize, *arguments, &block)
144
147
  end
145
148
 
149
+ # @param instance [Any]
150
+ # @return [void]
151
+ #
152
+ # @api private
153
+ # @since 0.1.0
154
+ def process_init_extensions(instance)
155
+ klass.__init_extensions__.each do |extension|
156
+ extension.call(instance)
157
+ end
158
+ end
159
+
146
160
  # @param arguments [Array<Any>]
147
161
  # @return [Array<Array<Any>,Hash<Symbol,Any>>]
148
162
  #
@@ -13,6 +13,7 @@ module SmartCore::Initializer::DSL::Inheritance
13
13
  def inherit(base:, child:)
14
14
  child.__params__.concat(base.__params__)
15
15
  child.__options__.concat(base.__options__)
16
+ child.__init_extensions__.concat(base.__init_extensions__)
16
17
  end
17
18
  end
18
19
  end
@@ -13,9 +13,10 @@ module SmartCore::Initializer::DSL
13
13
  # @since 0.1.0
14
14
  def extended(base_klass)
15
15
  base_klass.instance_eval do
16
- instance_variable_set(:@__params__, SmartCore::Initializer::Attribute::List.new)
16
+ instance_variable_set(:@__params__, SmartCore::Initializer::Attribute::List.new)
17
17
  instance_variable_set(:@__options__, SmartCore::Initializer::Attribute::List.new)
18
- instance_variable_set(:@__definer__, SmartCore::Initializer::Attribute::Definer.new(self))
18
+ instance_variable_set(:@__init_extensions__, SmartCore::Initializer::Extensions::List.new)
19
+ instance_variable_set(:@__definer__, SmartCore::Initializer::Constructor::Definer.new(self))
19
20
  instance_variable_set(:@__deflock__, SmartCore::Engine::Lock.new)
20
21
  end
21
22
  base_klass.extend(ClassMethods)
@@ -33,9 +34,10 @@ module SmartCore::Initializer::DSL
33
34
  # @since 0.1.0
34
35
  def inherited(child_klass)
35
36
  child_klass.instance_eval do
36
- instance_variable_set(:@__params__, SmartCore::Initializer::Attribute::List.new)
37
+ instance_variable_set(:@__params__, SmartCore::Initializer::Attribute::List.new)
37
38
  instance_variable_set(:@__options__, SmartCore::Initializer::Attribute::List.new)
38
- instance_variable_set(:@__definer__, SmartCore::Initializer::Attribute::Definer.new(self))
39
+ instance_variable_set(:@__init_extensions__, SmartCore::Initializer::Extensions::List.new)
40
+ instance_variable_set(:@__definer__, SmartCore::Initializer::Constructor::Definer.new(self))
39
41
  instance_variable_set(:@__deflock__, SmartCore::Engine::Lock.new)
40
42
  end
41
43
  child_klass.extend(ClassMethods)
@@ -63,6 +65,14 @@ module SmartCore::Initializer::DSL
63
65
  @__options__
64
66
  end
65
67
 
68
+ # @return [SmartCore::Initializer::Extentions::List]
69
+ #
70
+ # @api private
71
+ # @since 0.1.0
72
+ def __init_extensions__
73
+ @__init_extensions__
74
+ end
75
+
66
76
  # @return [SmartCore::Initializer::Attribute::Definer]
67
77
  #
68
78
  # @api private
@@ -140,5 +150,14 @@ module SmartCore::Initializer::DSL
140
150
  def options(*names)
141
151
  __definer__.define_options(*names)
142
152
  end
153
+
154
+ # @param block [Block]
155
+ # @return [void]
156
+ #
157
+ # @api public
158
+ # @since 0.1.0
159
+ def ext_init(&block)
160
+ __definer__.define_init_extension(block)
161
+ end
143
162
  end
144
163
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ class SmartCore::Initializer::Extensions::Abstract
6
+ # @!method dup
7
+ # @return [SmartCore::Initializer::Extensions::Abstract]
8
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ class SmartCore::Initializer::Extensions::ExtInit < SmartCore::Initializer::Extensions::Abstract
6
+ # @param extender [Proc]
7
+ # @return [void]
8
+ #
9
+ # @api private
10
+ # @since 0.1.0
11
+ def initialize(extender)
12
+ @extender = extender
13
+ end
14
+
15
+ # @param instance [Any]
16
+ # @return [void]
17
+ #
18
+ # @api private
19
+ # @since 0.1.0
20
+ def call(instance)
21
+ extender.call(instance)
22
+ end
23
+
24
+ private
25
+
26
+ # @return [Proc]
27
+ #
28
+ # @api private
29
+ # @since0 0.1.0
30
+ attr_reader :extender
31
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ class SmartCore::Initializer::Extensions::List
6
+ # @since 0.1.0
7
+ include Enumerable
8
+
9
+ # @return [void]
10
+ #
11
+ # @api private
12
+ # @since 0.1.0
13
+ def initialize
14
+ @extensions = []
15
+ @lock = SmartCore::Engine::Lock.new
16
+ end
17
+
18
+ # @param extension [SmartCore::Initializer::Extensions::Abstract]
19
+ # @return [void]
20
+ #
21
+ # @api private
22
+ # @since 0.1.0
23
+ def add(extension)
24
+ thread_safe { extensions << extension }
25
+ end
26
+ alias_method :<<, :add
27
+
28
+ # @param list [SmartCore::Initializer::Extensions::List]
29
+ # @return [void]
30
+ #
31
+ # @api private
32
+ # @since 0.1.0
33
+ def concat(list)
34
+ thread_safe do
35
+ list.each { |extension| add(extension.dup) }
36
+ end
37
+ end
38
+
39
+ # @param block [Block]
40
+ # @return [Enumerable]
41
+ #
42
+ # @api private
43
+ # @since 0.1.0
44
+ def each(&block)
45
+ thread_safe do
46
+ block_given? ? extensions.each(&block) : extensions.each
47
+ end
48
+ end
49
+
50
+ # @return [Integer]
51
+ #
52
+ # @api private
53
+ # @since 0.1.0
54
+ def size
55
+ thread_safe { extensions.size }
56
+ end
57
+
58
+ private
59
+
60
+ # @return [Array<SmartCore::Initializer::Extensions::Abstract>]
61
+ #
62
+ # @api private
63
+ # @since 0.1.0
64
+ attr_reader :extensions
65
+
66
+ # @param block [Block]
67
+ # @return [Any]
68
+ #
69
+ # @api private
70
+ # @since 0.1.0
71
+ def thread_safe(&block)
72
+ @lock.synchronize(&block)
73
+ end
74
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ module SmartCore::Initializer::Extensions
6
+ require_relative 'extensions/abstract'
7
+ require_relative 'extensions/ext_init'
8
+ require_relative 'extensions/list'
9
+ end
@@ -6,6 +6,6 @@ module SmartCore
6
6
  #
7
7
  # @api public
8
8
  # @since 0.1.0
9
- VERSION = '0.1.0.alpha3'
9
+ VERSION = '0.1.0.alpha4'
10
10
  end
11
11
  end
@@ -10,6 +10,7 @@ module SmartCore::Initializer
10
10
  require_relative 'initializer/version'
11
11
  require_relative 'initializer/errors'
12
12
  require_relative 'initializer/attribute'
13
+ require_relative 'initializer/extensions'
13
14
  require_relative 'initializer/constructor'
14
15
  require_relative 'initializer/dsl'
15
16
  require_relative 'initializer/type_aliasing'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_initializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha3
4
+ version: 0.1.0.alpha4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-01 00:00:00.000000000 Z
11
+ date: 2020-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: smart_engine
@@ -130,18 +130,23 @@ files:
130
130
  - bin/setup
131
131
  - lib/smart_core/initializer.rb
132
132
  - lib/smart_core/initializer/attribute.rb
133
- - lib/smart_core/initializer/attribute/definer.rb
134
133
  - lib/smart_core/initializer/attribute/factory.rb
135
134
  - lib/smart_core/initializer/attribute/finalizer.rb
136
135
  - lib/smart_core/initializer/attribute/finalizer/abstract.rb
137
136
  - lib/smart_core/initializer/attribute/finalizer/anonymous_block.rb
138
137
  - lib/smart_core/initializer/attribute/finalizer/instance_method.rb
138
+ - lib/smart_core/initializer/attribute/init_extension.rb
139
139
  - lib/smart_core/initializer/attribute/list.rb
140
140
  - lib/smart_core/initializer/attribute/parameters.rb
141
141
  - lib/smart_core/initializer/constructor.rb
142
+ - lib/smart_core/initializer/constructor/definer.rb
142
143
  - lib/smart_core/initializer/dsl.rb
143
144
  - lib/smart_core/initializer/dsl/inheritance.rb
144
145
  - lib/smart_core/initializer/errors.rb
146
+ - lib/smart_core/initializer/extensions.rb
147
+ - lib/smart_core/initializer/extensions/abstract.rb
148
+ - lib/smart_core/initializer/extensions/ext_init.rb
149
+ - lib/smart_core/initializer/extensions/list.rb
145
150
  - lib/smart_core/initializer/type_aliasing.rb
146
151
  - lib/smart_core/initializer/type_aliasing/alias_list.rb
147
152
  - lib/smart_core/initializer/version.rb