smart_initializer 0.1.0.alpha3 → 0.3.1

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 +1 -1
  3. data/.travis.yml +36 -5
  4. data/CHANGELOG.md +19 -0
  5. data/Gemfile.lock +63 -43
  6. data/README.md +227 -11
  7. data/Rakefile +1 -1
  8. data/bin/rspec +54 -0
  9. data/gemfiles/with_external_deps.gemfile +7 -0
  10. data/gemfiles/with_external_deps.gemfile.lock +102 -0
  11. data/gemfiles/without_external_deps.gemfile +5 -0
  12. data/gemfiles/without_external_deps.gemfile.lock +100 -0
  13. data/lib/smart_core/initializer.rb +44 -34
  14. data/lib/smart_core/initializer/attribute.rb +12 -5
  15. data/lib/smart_core/initializer/attribute/factory.rb +47 -27
  16. data/lib/smart_core/initializer/attribute/parameters.rb +12 -4
  17. data/lib/smart_core/initializer/configuration.rb +33 -0
  18. data/lib/smart_core/initializer/constructor.rb +35 -8
  19. data/lib/smart_core/initializer/{attribute → constructor}/definer.rb +64 -12
  20. data/lib/smart_core/initializer/dsl.rb +49 -10
  21. data/lib/smart_core/initializer/dsl/inheritance.rb +1 -0
  22. data/lib/smart_core/initializer/errors.rb +44 -0
  23. data/lib/smart_core/initializer/extensions.rb +9 -0
  24. data/lib/smart_core/initializer/extensions/abstract.rb +8 -0
  25. data/lib/smart_core/initializer/extensions/ext_init.rb +31 -0
  26. data/lib/smart_core/initializer/extensions/list.rb +74 -0
  27. data/lib/smart_core/initializer/functionality.rb +36 -0
  28. data/lib/smart_core/initializer/instance_attribute_accessing.rb +51 -0
  29. data/lib/smart_core/initializer/plugins.rb +17 -0
  30. data/lib/smart_core/initializer/plugins/abstract.rb +55 -0
  31. data/lib/smart_core/initializer/plugins/access_mixin.rb +47 -0
  32. data/lib/smart_core/initializer/plugins/registry.rb +166 -0
  33. data/lib/smart_core/initializer/plugins/registry_interface.rb +77 -0
  34. data/lib/smart_core/initializer/plugins/thy_types.rb +30 -0
  35. data/lib/smart_core/initializer/plugins/thy_types/errors.rb +11 -0
  36. data/lib/smart_core/initializer/plugins/thy_types/thy_types.rb +23 -0
  37. data/lib/smart_core/initializer/plugins/thy_types/thy_types/abstract_factory.rb +78 -0
  38. data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation.rb +12 -0
  39. data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/base.rb +9 -0
  40. data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/cast.rb +21 -0
  41. data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/valid.rb +16 -0
  42. data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/validate.rb +19 -0
  43. data/lib/smart_core/initializer/settings.rb +49 -0
  44. data/lib/smart_core/initializer/settings/duplicator.rb +20 -0
  45. data/lib/smart_core/initializer/settings/type_system.rb +69 -0
  46. data/lib/smart_core/initializer/type_system.rb +16 -0
  47. data/lib/smart_core/initializer/type_system/interop.rb +103 -0
  48. data/lib/smart_core/initializer/type_system/interop/abstract_factory.rb +70 -0
  49. data/lib/smart_core/initializer/type_system/interop/aliasing.rb +72 -0
  50. data/lib/smart_core/initializer/type_system/interop/aliasing/alias_list.rb +141 -0
  51. data/lib/smart_core/initializer/type_system/interop/operation.rb +30 -0
  52. data/lib/smart_core/initializer/type_system/registry.rb +174 -0
  53. data/lib/smart_core/initializer/type_system/registry_interface.rb +102 -0
  54. data/lib/smart_core/initializer/type_system/smart_types.rb +48 -0
  55. data/lib/smart_core/initializer/type_system/smart_types/abstract_factory.rb +72 -0
  56. data/lib/smart_core/initializer/type_system/smart_types/operation.rb +13 -0
  57. data/lib/smart_core/initializer/type_system/smart_types/operation/base.rb +8 -0
  58. data/lib/smart_core/initializer/type_system/smart_types/operation/cast.rb +16 -0
  59. data/lib/smart_core/initializer/type_system/smart_types/operation/valid.rb +16 -0
  60. data/lib/smart_core/initializer/type_system/smart_types/operation/validate.rb +16 -0
  61. data/lib/smart_core/initializer/version.rb +2 -1
  62. data/smart_initializer.gemspec +13 -9
  63. metadata +73 -17
  64. data/lib/smart_core/initializer/type_aliasing.rb +0 -50
  65. data/lib/smart_core/initializer/type_aliasing/alias_list.rb +0 -101
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 483a56f55f7fb7b8e67eb20b1779df0b59f33935544d19cd6c5cd0e018e9b3b1
4
- data.tar.gz: 9b1fc252e8821e68b22d38fe06e0418e5792860bc6e583caafd4ff5f786f509a
3
+ metadata.gz: fd0eb76f680e74b4b2eb404eb72df5181d13135bcba2c4eb105a7ae663d068f9
4
+ data.tar.gz: 0a532548173e17b18135d2b3a2748430330b0e28467fc483f434e463f6f6f862
5
5
  SHA512:
6
- metadata.gz: d77018f9b4be1a8f0c7befa771313d01debf97144e2bdc0d10248f357347eedeb6c0734997e6946fa0a35b810a6d7a1b59c395c8855f9e708a48021f0a94c9e7
7
- data.tar.gz: 9cf8e06b7d6c89951330beff5698cca00502183ed625b06c3e620a6e6df0d654db4b55788d26a68b9da390217d9eb42966b609a773ebd5baa3e71bfa6d838f17
6
+ metadata.gz: fc77143a0cfd9e90553059444eb38bb527aae5afc2f543eafb0a9525171ca45c2506d0826170e14f2a9a284c05ec43d6f9f024d14ea288f664b4ea962219f9f4
7
+ data.tar.gz: 1b889ee6f9d801cede43a624a6f800bf3b2341f874395870426522025ee5fd8bbbbd40a01940cf087e40f696cb2b87282739ebe72ddd34b9845b37c01c7c207b
@@ -5,7 +5,7 @@ inherit_gem:
5
5
  - lib/rubocop.rspec.yml
6
6
 
7
7
  AllCops:
8
- TargetRubyVersion: 2.4.9
8
+ TargetRubyVersion: 2.7.1
9
9
  Include:
10
10
  - lib/**/*.rb
11
11
  - spec/**/*.rb
@@ -2,19 +2,50 @@
2
2
  language: ruby
3
3
  cache: bundler
4
4
  os: linux
5
- before_install: gem install bundler -v 2.1.2
5
+ dist: xenial
6
+ before_install: gem install bundler
6
7
  script:
7
8
  - bundle exec rake rubocop
8
9
  - bundle exec rake rspec
9
10
  jobs:
10
11
  fast_finish: true
11
12
  include:
12
- - rvm: 2.4.9
13
- - rvm: 2.5.7
14
- - rvm: 2.6.5
15
- - rvm: 2.7.0
13
+ - rvm: 2.4.10
14
+ gemfile: gemfiles/with_external_deps.gemfile
15
+ env: TEST_PLUGINS=true FULL_TEST_COVERAGE_CHECK=true
16
+ - rvm: 2.5.8
17
+ gemfile: gemfiles/with_external_deps.gemfile
18
+ env: TEST_PLUGINS=true FULL_TEST_COVERAGE_CHECK=true
19
+ - rvm: 2.6.6
20
+ gemfile: gemfiles/with_external_deps.gemfile
21
+ env: TEST_PLUGINS=true FULL_TEST_COVERAGE_CHECK=true
22
+ - rvm: 2.7.1
23
+ gemfile: gemfiles/with_external_deps.gemfile
24
+ env: TEST_PLUGINS=true FULL_TEST_COVERAGE_CHECK=true
16
25
  - rvm: ruby-head
26
+ gemfile: gemfiles/with_external_deps.gemfile
27
+ env: TEST_PLUGINS=true FULL_TEST_COVERAGE_CHECK=true
17
28
  - rvm: jruby-head
29
+ gemfile: gemfiles/with_external_deps.gemfile
30
+ env: TEST_PLUGINS=true FULL_TEST_COVERAGE_CHECK=true
31
+ - rvm: truffleruby
32
+ gemfile: gemfiles/with_external_deps.gemfile
33
+ env: TEST_PLUGINS=true FULL_TEST_COVERAGE_CHECK=true
34
+ - rvm: 2.4.10
35
+ gemfile: gemfiles/without_external_deps.gemfile
36
+ - rvm: 2.5.8
37
+ gemfile: gemfiles/without_external_deps.gemfile
38
+ - rvm: 2.6.6
39
+ gemfile: gemfiles/without_external_deps.gemfile
40
+ - rvm: 2.7.1
41
+ gemfile: gemfiles/without_external_deps.gemfile
42
+ - rvm: ruby-head
43
+ gemfile: gemfiles/without_external_deps.gemfile
44
+ - rvm: jruby-head
45
+ gemfile: gemfiles/without_external_deps.gemfile
46
+ - rvm: truffleruby
47
+ gemfile: gemfiles/without_external_deps.gemfile
18
48
  allow_failures:
19
49
  - rvm: ruby-head
20
50
  - rvm: jruby-head
51
+ - rvm: truffleruby
@@ -1,2 +1,21 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
+
4
+ ## [0.3.1] - 2020-07-12
5
+ ### Fixed
6
+ - Deeply inherited entities lose class attribute definers;
7
+
8
+ ## [0.3.0] - 2020-07-11
9
+ ### Added
10
+ - `extend_initialization_flow` alias method for `SmartCore::Initializer.ext_init`;
11
+ - Access methods to the instance attribute lists (`#__params`, `#__options__`, `#__attributes__`);
12
+
13
+ ### Changed
14
+ - Updated development dependencies;
15
+
16
+ ## [0.2.0] - 2020-05-16
17
+ ### Changed
18
+ - **Constructor**: disallow unknown option attributes;
19
+
20
+ ## [0.1.0] - 2020-05-10
21
+ - Release :)
@@ -1,80 +1,100 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_initializer (0.1.0.alpha2)
5
- smart_engine (~> 0.5)
6
- smart_types (~> 0.1.0.alpha6)
4
+ smart_initializer (0.3.0)
5
+ qonfig (~> 0.24)
6
+ smart_engine (~> 0.7)
7
+ smart_types (~> 0.1.0)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
11
- armitage-rubocop (0.79.0)
12
- rubocop (= 0.79.0)
13
- rubocop-performance (= 1.5.2)
14
- rubocop-rails (= 2.4.1)
15
- rubocop-rake (= 0.5.0)
16
- rubocop-rspec (= 1.37.1)
17
- ast (2.4.0)
18
- diff-lcs (1.3)
12
+ activesupport (6.0.3.2)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (>= 0.7, < 2)
15
+ minitest (~> 5.1)
16
+ tzinfo (~> 1.1)
17
+ zeitwerk (~> 2.2, >= 2.2.2)
18
+ armitage-rubocop (0.87.1.2)
19
+ rubocop (= 0.87.1)
20
+ rubocop-performance (= 1.7.0)
21
+ rubocop-rails (= 2.6.0)
22
+ rubocop-rake (= 0.5.1)
23
+ rubocop-rspec (= 1.42.0)
24
+ ast (2.4.1)
25
+ concurrent-ruby (1.1.6)
26
+ diff-lcs (1.4.4)
19
27
  docile (1.3.2)
20
- jaro_winkler (1.5.4)
21
- json (2.3.0)
22
- parallel (1.19.1)
23
- parser (2.7.0.2)
24
- ast (~> 2.4.0)
25
- rack (2.1.1)
28
+ i18n (1.8.3)
29
+ concurrent-ruby (~> 1.0)
30
+ minitest (5.14.1)
31
+ parallel (1.19.2)
32
+ parser (2.7.1.4)
33
+ ast (~> 2.4.1)
34
+ qonfig (0.24.1)
35
+ rack (2.2.3)
26
36
  rainbow (3.0.0)
27
37
  rake (13.0.1)
38
+ regexp_parser (1.7.1)
39
+ rexml (3.2.4)
28
40
  rspec (3.9.0)
29
41
  rspec-core (~> 3.9.0)
30
42
  rspec-expectations (~> 3.9.0)
31
43
  rspec-mocks (~> 3.9.0)
32
- rspec-core (3.9.1)
33
- rspec-support (~> 3.9.1)
34
- rspec-expectations (3.9.0)
44
+ rspec-core (3.9.2)
45
+ rspec-support (~> 3.9.3)
46
+ rspec-expectations (3.9.2)
35
47
  diff-lcs (>= 1.2.0, < 2.0)
36
48
  rspec-support (~> 3.9.0)
37
49
  rspec-mocks (3.9.1)
38
50
  diff-lcs (>= 1.2.0, < 2.0)
39
51
  rspec-support (~> 3.9.0)
40
- rspec-support (3.9.2)
41
- rubocop (0.79.0)
42
- jaro_winkler (~> 1.5.1)
52
+ rspec-support (3.9.3)
53
+ rubocop (0.87.1)
43
54
  parallel (~> 1.10)
44
- parser (>= 2.7.0.1)
55
+ parser (>= 2.7.1.1)
45
56
  rainbow (>= 2.2.2, < 4.0)
57
+ regexp_parser (>= 1.7)
58
+ rexml
59
+ rubocop-ast (>= 0.1.0, < 1.0)
46
60
  ruby-progressbar (~> 1.7)
47
- unicode-display_width (>= 1.4.0, < 1.7)
48
- rubocop-performance (1.5.2)
49
- rubocop (>= 0.71.0)
50
- rubocop-rails (2.4.1)
61
+ unicode-display_width (>= 1.4.0, < 2.0)
62
+ rubocop-ast (0.1.0)
63
+ parser (>= 2.7.0.1)
64
+ rubocop-performance (1.7.0)
65
+ rubocop (>= 0.82.0)
66
+ rubocop-rails (2.6.0)
67
+ activesupport (>= 4.2.0)
51
68
  rack (>= 1.1)
52
- rubocop (>= 0.72.0)
53
- rubocop-rake (0.5.0)
69
+ rubocop (>= 0.82.0)
70
+ rubocop-rake (0.5.1)
54
71
  rubocop
55
- rubocop-rspec (1.37.1)
56
- rubocop (>= 0.68.1)
72
+ rubocop-rspec (1.42.0)
73
+ rubocop (>= 0.87.0)
57
74
  ruby-progressbar (1.10.1)
58
- simplecov (0.17.1)
75
+ simplecov (0.18.5)
59
76
  docile (~> 1.1)
60
- json (>= 1.8, < 3)
61
- simplecov-html (~> 0.10.0)
62
- simplecov-html (0.10.2)
63
- smart_engine (0.5.0)
64
- smart_types (0.1.0.alpha6)
65
- smart_engine (~> 0.5)
66
- unicode-display_width (1.6.1)
77
+ simplecov-html (~> 0.11)
78
+ simplecov-html (0.12.2)
79
+ smart_engine (0.7.0)
80
+ smart_types (0.1.0)
81
+ smart_engine (~> 0.6)
82
+ thread_safe (0.3.6)
83
+ tzinfo (1.2.7)
84
+ thread_safe (~> 0.1)
85
+ unicode-display_width (1.7.0)
86
+ zeitwerk (2.3.1)
67
87
 
68
88
  PLATFORMS
69
89
  ruby
70
90
 
71
91
  DEPENDENCIES
72
- armitage-rubocop (~> 0.78)
92
+ armitage-rubocop (~> 0.87)
73
93
  bundler (~> 2.1)
74
94
  rake (~> 13.0)
75
95
  rspec (~> 3.9)
76
- simplecov (~> 0.17)
96
+ simplecov (~> 0.18)
77
97
  smart_initializer!
78
98
 
79
99
  BUNDLED WITH
80
- 2.1.2
100
+ 2.1.4
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # SmartCore::Initializer &middot; [![Gem Version](https://badge.fury.io/rb/smart_initializer.svg)](https://badge.fury.io/rb/smart_initializer) [![Build Status](https://travis-ci.org/smart-rb/smart_initializer.svg?branch=master)](https://travis-ci.org/smart-rb/smart_initializer)
2
2
 
3
- A simple and convenient way to declare complex constructors (**in active development**).
3
+ A simple and convenient way to declare complex constructors with a support for various commonly used type systems.
4
+ (**in active development**).
4
5
 
5
6
  ## Installation
6
7
 
@@ -11,42 +12,86 @@ gem 'smart_initializer'
11
12
  ```shell
12
13
  bundle install
13
14
  # --- or ---
14
- gem install smart_types
15
+ gem install smart_initializer
15
16
  ```
16
17
 
17
18
  ```ruby
18
- require 'smart_core/types'
19
+ require 'smart_core/initializer'
19
20
  ```
20
21
 
21
22
  ---
22
23
 
24
+ ## Table of contents
25
+
26
+ - [Synopsis](#synopsis)
27
+ - [Access to the instance attributes](#access-to-the-instance-attributes)
28
+ - [Configuration](#configuration)
29
+ - [Type aliasing](#type-aliasing)
30
+ - [Initialization extension](#initialization-extension)
31
+ - [Plugins](#plugins)
32
+ - [thy-types](#plugin-thy-types)
33
+ - [How to run tests](#how-to-run-tests)
34
+
35
+ ---
36
+
23
37
  ## Synopsis
24
38
 
39
+ **Initialization flow**:
40
+
41
+ 1. Parameter + Option definitioning;
42
+ 2. Original #initialize invokation;
43
+ 3. Initialization extensions invokation;
44
+
25
45
  **Constructor definition**:
26
46
 
27
47
  - `param` - defines name-like attribute:
28
48
  - `cast` - type-cast received value if value has invalid type;
29
49
  - `privacy` - reader incapsulation level;
30
50
  - `finalize` - value post-processing (receives method name or proc);
51
+ - `type_system` - differently chosen type system for the current attribute;
31
52
  - (limitation) param has no `:default` option;
32
53
  - `option` - defined kwarg-like attribute:
33
54
  - `cast` - type-cast received value if value has invalid type;
34
55
  - `privacy` - reader incapsulation level;
35
56
  - `finalize` - value post-processing (receives method name or proc);
36
57
  - `default` - defalut value (if an attribute is not provided);
58
+ - `type_system` - differently chosen type system for the current attribute;
37
59
  - last `Hash` argument will be treated as `kwarg`s;
38
60
 
39
- `param` signautre:
61
+ #### initializer integration
62
+
63
+ ```ruby
64
+ # with pre-configured type system (:smart_types, see Configuration doc)
65
+
66
+ class MyStructure
67
+ include SmartCore::Initializer
68
+ end
69
+ ```
70
+
71
+ ```ruby
72
+ # with manually chosen type system
73
+
74
+ class MyStructure
75
+ include SmartCore::Initializer(type_system: :smart_types)
76
+ end
77
+
78
+ class AnotherStructure
79
+ include SmartCore::Initializer(type_system: :thy_types)
80
+ end
81
+ ```
82
+
83
+ #### `param` signautre:
40
84
 
41
85
  ```ruby
42
86
  param <attribute_name>,
43
87
  <type=SmartCore::Types::Value::Any>, # Any by default
44
88
  cast: false, # false by default
45
89
  privacy: :public, # :public by default
46
- finalize: proc { |value| value } # no finalization by default
90
+ finalize: proc { |value| value }, # no finalization by default
91
+ type_system: :smart_types # used by default
47
92
  ```
48
93
 
49
- `option` signature:
94
+ #### `option` signature:
50
95
 
51
96
  ```ruby
52
97
  option <attribute_name>,
@@ -54,7 +99,8 @@ option ,
54
99
  cast: false, # false by default
55
100
  privacy: :public, # :public by default
56
101
  finalize: proc { |value| value }, # no finalization by default
57
- default: 123 # no default value by default
102
+ default: 123, # no default value by default
103
+ type_system: :smart_types # used by default
58
104
  ```
59
105
 
60
106
  Example:
@@ -63,6 +109,8 @@ Example:
63
109
  ```ruby
64
110
  class User
65
111
  include SmartCore::Initializer
112
+ # --- or ---
113
+ include SmartCore::Initializer(type_system: :smart_types)
66
114
 
67
115
  param :user_id, SmartCore::Types::Value::Integer, cast: false, privacy: :public
68
116
  option :role, default: :user, finalize: -> { |value| Role.find(name: value) }
@@ -76,18 +124,186 @@ User.new(1, 'John', 'test123', role: :admin, metadata: {}, enabled: false)
76
124
 
77
125
  ---
78
126
 
127
+ ## Access to the instance attributes
128
+
129
+ - `#__params__` - returns a list of initialized params;
130
+ - `#__options__` - returns a list of initialized options;
131
+ - `#__attributes__` - returns a list of merged params and options;
132
+
133
+ ```ruby
134
+ class User
135
+ include SmartCore::Initializer
136
+
137
+ param :first_name, 'string'
138
+ param :second_name, 'string'
139
+ option :age, 'numeric'
140
+ option :is_admin, 'boolean', default: true
141
+ end
142
+
143
+ user = User.new('Rustam', 'Ibragimov', age: 28)
144
+
145
+ user.__params__ # => { first_name: 'Rustam', second_name: 'Ibragimov' }
146
+ user.__options__ # => { age: 28, is_admin: true }
147
+ user.__attributes__ # => { first_name: 'Rustam', second_name: 'Ibragimov', age: 28, is_admin: true }
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Configuration
153
+
154
+ - based on `Qonfig` gem;
155
+ - you can read config values via `[]` or `.config.settings` or `.config[key]`;
156
+ - setitngs:
157
+ - `default_type_system` - default type system (`smart_types` by default);
158
+
159
+ ```ruby
160
+ # configure:
161
+ SmartCore::Initializer::Configuration.configure do |config|
162
+ config.default_type_system = :smart_types # default setting value
163
+ end
164
+ ```
165
+
166
+ ```ruby
167
+ # read:
168
+ SmartCore::Initializer::Configuration[:default_type_system]
169
+ SmartCore::Initializer::Configuration.config[:default_type_system]
170
+ SmartCore::Initializer::Configuration.config.settings.default_type_system
171
+ ```
172
+
173
+ ---
174
+
79
175
  ## Type aliasing
80
176
 
177
+ - Usage:
178
+
179
+ ```ruby
180
+ # for smart_types:
181
+ SmartCore::Initializer::TypeSystem::SmartTypes.type_alias('hsh', SmartCore::Types::Value::Hash)
182
+
183
+ # for thy:
184
+ SmartCore::Initializer::TypeSystem::ThyTypes.type_alias('int', Thy::Tyhes::Integer)
185
+
186
+ class User
187
+ include SmartCore::Initializer
188
+
189
+ param :data, 'hsh' # use your new defined type alias
190
+ option :metadata, :hsh # use your new defined type alias
191
+
192
+ param :age, 'int', type_system: :thy_types
193
+ end
194
+ ```
195
+
196
+ - Predefined aliases:
197
+
81
198
  ```ruby
82
- # define your own type alias
83
- SmartCore::Initializer.type_alias(:hash, SmartCore::Types::Value::Hash)
199
+ # for smart_types:
200
+ SmartCore::Initializer::TypeSystem::SmartTypes.type_aliases
201
+
202
+ # for thy_types:
203
+ SmartCore::Initializer::TypeSystem::ThyTypes.type_aliases
204
+ ```
205
+
206
+ ---
207
+
208
+ ## Initialization extension
209
+
210
+ - `ext_init(&block)`:
211
+ - you can define as many extensions as you want;
212
+ - extensions are invoked in the order they are defined;
213
+ - alias method: `extend_initialization_flow`;
84
214
 
215
+ ```ruby
85
216
  class User
86
217
  include SmartCore::Initializer
87
218
 
88
- param :data, :hash # use your new defined type alias
89
- option :metadata, :hash # use your new defined type alias
219
+ option :name, :name
220
+ option :age, :integer
221
+
222
+ ext_init { |instance| instance.define_singleton_method(:extra) { :ext1 } }
223
+ ext_init { |instance| instance.define_singleton_method(:extra2) { :ext2 } }
90
224
  end
225
+
226
+ user = User.new(name: 'keka', age: 123)
227
+ user.name # => 'keka'
228
+ user.age # => 123
229
+ user.extra # => :ext1
230
+ user.extra2 # => :ext2
231
+ ```
232
+
233
+ ---
234
+
235
+ ## Plugins
236
+
237
+ - [thy-types](#plugin-thy-types)
238
+
239
+ ---
240
+
241
+ ## Plugin: thy-types
242
+
243
+ Support for `Thy::Types` type system ([gem](https://github.com/akxcv/thy))
244
+
245
+ - install `thy` types (`gem install thy`):
246
+
247
+ ```ruby
248
+ gem 'thy'
249
+ ```
250
+
251
+ ```shell
252
+ bundle install
253
+ ```
254
+
255
+ - enable `thy_types` plugin:
256
+
257
+ ```ruby
258
+ require 'thy'
259
+ SmartCore::Initializer::Configuration.plugin(:thy_types)
260
+ ```
261
+
262
+ - usage:
263
+
264
+ ```ruby
265
+ class User
266
+ include SmartCore::Initializer(type_system: :thy_types)
267
+
268
+ param :nickname, 'string'
269
+ param :email, 'value.text', type_system: :smart_types # mixing with smart_types
270
+ option :admin, Thy::Types::Boolean, default: false
271
+ option :age, (Thy::Type.new { |value| value > 18 }) # custom thy type is supported too
272
+ end
273
+
274
+ # valid case:
275
+ User.new('daiver', 'iamdaiver@gmail.com', { admin: true, age: 19 })
276
+ # => new user object
277
+
278
+ # invalid case (invalid age)
279
+ User.new('daiver', 'iamdaiver@gmail.com', { age: 17 })
280
+ # SmartCore::Initializer::ThyTypeValidationError
281
+
282
+ # invaldi case (invalid nickname)
283
+ User.new(123, 'test', { admin: true, age: 22 })
284
+ # => SmartCore::Initializer::ThyTypeValidationError
285
+ ```
286
+
287
+ ---
288
+
289
+ ## How to run tests
290
+
291
+ - with plugin tests:
292
+
293
+ ```shell
294
+ bin/rspec -w
295
+ ```
296
+
297
+ - without plugin tests:
298
+
299
+ ```shell
300
+ bin/rspec -n
301
+ ```
302
+
303
+ - help message:
304
+
305
+ ```shell
306
+ bin/rspec -h
91
307
  ```
92
308
 
93
309
  ---