smart_initializer 0.8.0 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e16ae20c546597ce7c44382a790934260b44b1ebff59a51c7c7eb366205d969f
4
- data.tar.gz: 14af5a449ae56ecf8b38d22c3ea0957f4896070556fec3c280a4b265e78f63de
3
+ metadata.gz: 9ef704918e8e3d81bfb2dd551b96f4e68f2a0f2cefacfdbced95ae9cce1a6b0b
4
+ data.tar.gz: 3960c509958efb9a0886d959ff3a55b6965bb916f80bd32bf04e0977d58b7560
5
5
  SHA512:
6
- metadata.gz: cecc3bc1e93570d2c8cb0cc11c1b409c24d6b401a9a8225de4676a10915c7e08a1bf869315650f9ddf66c7b5dc4602e96d2a0717a83289b6fec79cb795d5dde9
7
- data.tar.gz: 6ed53102d9c016fbdad65a3f4ad2b2aec6ad567596ec3e255f33a55f979eab5180138ae496f1ff5eafae3ae71019229ea8840d9fc1608ddcbb821a6f2aeffae5
6
+ metadata.gz: 329ebcfc66cab98ab6e35b392c425df04eb5d03260b3bcefceb6c9cffa8863bad1fafce5d3b822c4fd0d39e0caab36a502b38a8ed15ecba1f0157908a6bbbc0d
7
+ data.tar.gz: 31f8259c26367c56961dc70cd086dcae7e96f3eafa206b3395b2f4afc0cb25afc3bba6d55a94251d1495bb13fd27c3c590ca67ace17bba1af226b48ceacfb7a9
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## [0.9.0] - 2021-12-19
5
+ ### Changed
6
+ - `:finalize` block is not invoked on the `option` with `optional: true` flag;
7
+
4
8
  ## [0.8.0] - 2021-12-04
5
9
  ### Added
6
10
  - New options for option and param attributes:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_initializer (0.8.0)
4
+ smart_initializer (0.9.0)
5
5
  qonfig (~> 0.24)
6
6
  smart_engine (~> 0.11)
7
7
  smart_types (~> 0.4)
@@ -84,7 +84,7 @@ GEM
84
84
  simplecov_json_formatter (~> 0.1)
85
85
  simplecov-html (0.12.3)
86
86
  simplecov_json_formatter (0.1.3)
87
- smart_engine (0.11.0)
87
+ smart_engine (0.12.0)
88
88
  smart_types (0.7.0)
89
89
  smart_engine (~> 0.11)
90
90
  tzinfo (2.0.4)
@@ -107,4 +107,4 @@ DEPENDENCIES
107
107
  smart_initializer!
108
108
 
109
109
  BUNDLED WITH
110
- 2.2.31
110
+ 2.2.32
data/README.md CHANGED
@@ -32,19 +32,19 @@ require 'smart_core/initializer'
32
32
  - [Synopsis](#synopsis)
33
33
  - [Initialization flow](#initialization-flow)
34
34
  - [Attribute value definition flow](#attribute-value-definition-flow-during-object-allocation-and-construction)
35
- - [Constructor definition](#constructor-definition)
35
+ - [Constructor definition DSL](#constructor-definition-dsl)
36
36
  - [param](#param)
37
37
  - [option](#option)
38
38
  - [params](#params)
39
39
  - [options](#options)
40
- - [param and params signature](#param-and-params-signature)
40
+ - [param and params signature](#param-and-params-signautre)
41
41
  - [option and options signature](#option-and-options-signature)
42
42
  - [Initializer integration](#initializer-integration)
43
43
  - [Basic Example](#basic-example)
44
44
  - [Access to the instance attributes](#access-to-the-instance-attributes)
45
45
  - [Configuration](#configuration)
46
46
  - [Type aliasing](#type-aliasing)
47
- - [Type auto-casting](#type-auto-casting)
47
+ - [Type casting](#type-casting)
48
48
  - [Initialization extension](#initialization-extension)
49
49
  - [Plugins](#plugins)
50
50
  - [thy-types](#plugin-thy-types)
@@ -57,11 +57,11 @@ require 'smart_core/initializer'
57
57
 
58
58
  #### Initialization flow
59
59
 
60
- 1. Parameter + Option definitioning and initialization;
60
+ 1. Parameter + Option definitioning and initialization (custom object allocator and constructor);
61
61
  2. Original **#initialize** invokation;
62
62
  3. Initialization extensions invokation;
63
63
 
64
- **NOTE!**: original constructor is called after **SmarteCore::Initializer**'s constructor
64
+ **NOTE!**: **SmarteCore::Initializer**'s constructor is invoked first
65
65
  in order to guarantee the validity of the SmartCore::Initializer's functionality
66
66
  (such as `attribute overlap chek`, `instant type checking`, `value post-processing by finalize`, etc)
67
67
 
@@ -71,7 +71,30 @@ in order to guarantee the validity of the SmartCore::Initializer's functionality
71
71
  2. *(if defined)*: `default value` (default value is used when `original value` is not defined)
72
72
  3. *(if defined)*: `finalize`;
73
73
 
74
- ---
74
+ **NOTE**: `:finalize` block are not invoked on omitted `optional: true` attributes
75
+ which has no `:default` definition bock and which are not passed to the constructor. Example:
76
+
77
+ ```ruby
78
+ # without :default
79
+
80
+ class User
81
+ include SmartCore::Initializer
82
+ option :age, :string, optional: true, finalize: -> (val) { "#{val}_years" }
83
+ end
84
+
85
+ User.new.age # => nil
86
+ ```
87
+
88
+ ```ruby
89
+ # with :default
90
+
91
+ class User
92
+ include SmartCore::Initializer
93
+ option :age, :string, optional: true, default: '0', finalize: -> (val) { "#{val}_years" }
94
+ end
95
+
96
+ User.new.age # => '0_years'
97
+ ```
75
98
 
76
99
  ### Constructor definition DSL
77
100
 
@@ -90,7 +113,7 @@ in order to guarantee the validity of the SmartCore::Initializer's functionality
90
113
 
91
114
  #### option
92
115
 
93
- - `option` - defined kwarg-like attribute:
116
+ - `option` - defines kwarg-like attribute:
94
117
  - `cast` (optional) - type-cast received value if value has invalid type;
95
118
  - `privacy` (optional) - reader incapsulation level;
96
119
  - `as` (optional) - attribute alias (be careful with naming aliases that overlap the names of other attributes);
@@ -106,13 +129,13 @@ in order to guarantee the validity of the SmartCore::Initializer's functionality
106
129
 
107
130
  #### params
108
131
 
109
- - `params` - define a series of parameters;
132
+ - `params` - defines a series of parameters;
110
133
  - `:mutable` (optional) - (`false` by default);
111
134
  - `:privacy` (optional) - (`:public` by default);
112
135
 
113
136
  #### options
114
137
 
115
- - `options` - define a series of options;
138
+ - `options` - defines a series of options;
116
139
  - `:mutable` (optional) - (`false` by default);
117
140
  - `:privacy` (optional) - (`:public` by default);
118
141
 
@@ -499,7 +522,10 @@ User.new(123, 'test', { admin: true, age: 22 })
499
522
 
500
523
  ## Roadmap
501
524
 
502
- - (**thinking** / **discussing**) Finalize should be invoked on `mutable` attributes after mutation too;
525
+ - More semantic attribute declaration errors (more domain-related attribute error objects);
526
+ - incorrect `:finalize` argument type: `ArgumentError` => `FinalizeArgumentError`;
527
+ - incorrect `:as` argument type: `ArguemntError` => `AsArgumentError`;
528
+ - etc;
503
529
  - Support for `RSpec` doubles and instance_doubles inside the type system integration;
504
530
  - Specs restructuring;
505
531
  - Migrate from `TravisCI` to `GitHub Actions`;
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- smart_initializer (0.5.0)
4
+ smart_initializer (0.8.0)
5
5
  qonfig (~> 0.24)
6
6
  smart_engine (~> 0.11)
7
7
  smart_types (~> 0.4)
@@ -9,39 +9,38 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- activesupport (6.1.1)
12
+ activesupport (7.0.0)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
14
  i18n (>= 1.6, < 2)
15
15
  minitest (>= 5.1)
16
16
  tzinfo (~> 2.0)
17
- zeitwerk (~> 2.3)
18
- armitage-rubocop (1.7.0.1)
19
- rubocop (= 1.7.0)
20
- rubocop-performance (= 1.9.1)
21
- rubocop-rails (= 2.9.1)
22
- rubocop-rake (= 0.5.1)
23
- rubocop-rspec (= 2.1.0)
24
- ast (2.4.1)
17
+ armitage-rubocop (1.23.0.1)
18
+ rubocop (= 1.23.0)
19
+ rubocop-performance (= 1.12.0)
20
+ rubocop-rails (= 2.12.4)
21
+ rubocop-rake (= 0.6.0)
22
+ rubocop-rspec (= 2.6.0)
23
+ ast (2.4.2)
25
24
  coderay (1.1.3)
26
- concurrent-ruby (1.1.7)
25
+ concurrent-ruby (1.1.9)
27
26
  diff-lcs (1.4.4)
28
27
  docile (1.3.5)
29
- i18n (1.8.7)
28
+ i18n (1.8.11)
30
29
  concurrent-ruby (~> 1.0)
31
30
  method_source (1.0.0)
32
- minitest (5.14.3)
33
- parallel (1.20.1)
34
- parser (3.0.0.0)
31
+ minitest (5.15.0)
32
+ parallel (1.21.0)
33
+ parser (3.0.3.2)
35
34
  ast (~> 2.4.1)
36
- pry (0.13.1)
35
+ pry (0.14.1)
37
36
  coderay (~> 1.1)
38
37
  method_source (~> 1.0)
39
- qonfig (0.25.0)
38
+ qonfig (0.26.0)
40
39
  rack (2.2.3)
41
40
  rainbow (3.0.0)
42
41
  rake (13.0.3)
43
- regexp_parser (2.0.3)
44
- rexml (3.2.4)
42
+ regexp_parser (2.2.0)
43
+ rexml (3.2.5)
45
44
  rspec (3.10.0)
46
45
  rspec-core (~> 3.10.0)
47
46
  rspec-expectations (~> 3.10.0)
@@ -55,29 +54,28 @@ GEM
55
54
  diff-lcs (>= 1.2.0, < 2.0)
56
55
  rspec-support (~> 3.10.0)
57
56
  rspec-support (3.10.1)
58
- rubocop (1.7.0)
57
+ rubocop (1.23.0)
59
58
  parallel (~> 1.10)
60
- parser (>= 2.7.1.5)
59
+ parser (>= 3.0.0.0)
61
60
  rainbow (>= 2.2.2, < 4.0)
62
61
  regexp_parser (>= 1.8, < 3.0)
63
62
  rexml
64
- rubocop-ast (>= 1.2.0, < 2.0)
63
+ rubocop-ast (>= 1.12.0, < 2.0)
65
64
  ruby-progressbar (~> 1.7)
66
- unicode-display_width (>= 1.4.0, < 2.0)
67
- rubocop-ast (1.4.0)
68
- parser (>= 2.7.1.5)
69
- rubocop-performance (1.9.1)
70
- rubocop (>= 0.90.0, < 2.0)
65
+ unicode-display_width (>= 1.4.0, < 3.0)
66
+ rubocop-ast (1.15.0)
67
+ parser (>= 3.0.1.1)
68
+ rubocop-performance (1.12.0)
69
+ rubocop (>= 1.7.0, < 2.0)
71
70
  rubocop-ast (>= 0.4.0)
72
- rubocop-rails (2.9.1)
71
+ rubocop-rails (2.12.4)
73
72
  activesupport (>= 4.2.0)
74
73
  rack (>= 1.1)
75
- rubocop (>= 0.90.0, < 2.0)
76
- rubocop-rake (0.5.1)
77
- rubocop
78
- rubocop-rspec (2.1.0)
74
+ rubocop (>= 1.7.0, < 2.0)
75
+ rubocop-rake (0.6.0)
79
76
  rubocop (~> 1.0)
80
- rubocop-ast (>= 1.1.0)
77
+ rubocop-rspec (2.6.0)
78
+ rubocop (~> 1.19)
81
79
  ruby-progressbar (1.11.0)
82
80
  simplecov (0.21.2)
83
81
  docile (~> 1.1)
@@ -85,25 +83,25 @@ GEM
85
83
  simplecov_json_formatter (~> 0.1)
86
84
  simplecov-html (0.12.3)
87
85
  simplecov_json_formatter (0.1.2)
88
- smart_engine (0.11.0)
89
- smart_types (0.4.0)
86
+ smart_engine (0.12.0)
87
+ smart_types (0.7.0)
90
88
  smart_engine (~> 0.11)
91
89
  tzinfo (2.0.4)
92
90
  concurrent-ruby (~> 1.0)
93
- unicode-display_width (1.7.0)
94
- zeitwerk (2.4.2)
91
+ unicode-display_width (2.1.0)
95
92
 
96
93
  PLATFORMS
97
94
  x86_64-darwin-20
95
+ x86_64-darwin-21
98
96
 
99
97
  DEPENDENCIES
100
- armitage-rubocop (~> 1.7)
98
+ armitage-rubocop (~> 1.23)
101
99
  bundler (~> 2.2)
102
- pry (~> 0.13)
100
+ pry (~> 0.14)
103
101
  rake (~> 13.0)
104
102
  rspec (~> 3.10)
105
103
  simplecov (~> 0.21)
106
104
  smart_initializer!
107
105
 
108
106
  BUNDLED WITH
109
- 2.2.3
107
+ 2.2.32
@@ -145,26 +145,22 @@ class SmartCore::Initializer::Constructor
145
145
  attribute.has_default? ? attribute.default : nil
146
146
  end
147
147
 
148
+ # NOTE: (if-block: what if `if` receives `false`?):
149
+ # For other case passed `attribute` is optional and
150
+ # should not be type-checked/type-casted/etc.
151
+ # But optional attributes with defined `default` setting should be
152
+ # type-checked and type-casted.
148
153
  if options.key?(attribute.name) || attribute.has_default?
149
154
  if !attribute.type.valid?(option_value) && attribute.cast?
150
155
  option_value = attribute.type.cast(option_value)
151
156
  end
152
157
 
153
158
  attribute.validate!(option_value)
159
+ option_value = attribute.finalizer.call(option_value, instance)
160
+ attribute.validate!(option_value)
154
161
  end
155
- # NOTE: (if-block: what if `if` receives `false`?):
156
- # For other case passed `attribute` is optional and
157
- # should not be type-checked/type-casted/etc.
158
- # But optional attributes with defined `default` setting should be
159
- # type-checked and type-casted.
160
- #
161
- # TODO: it should be covered by tests
162
-
163
- final_value = attribute.finalizer.call(option_value, instance)
164
- # NOTE: validae `final_value` if only the `option` is provided (passed to constructor)
165
- attribute.validate!(final_value) if options.key?(attribute.name)
166
162
 
167
- instance.instance_variable_set("@#{attribute.name}", final_value)
163
+ instance.instance_variable_set("@#{attribute.name}", option_value)
168
164
  end
169
165
  end
170
166
  # rubocop:enable Metrics/AbcSize
@@ -6,7 +6,7 @@ module SmartCore
6
6
  #
7
7
  # @api public
8
8
  # @since 0.1.0
9
- # @version 0.8.0
10
- VERSION = '0.8.0'
9
+ # @version 0.9.0
10
+ VERSION = '0.9.0'
11
11
  end
12
12
  end
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.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-04 00:00:00.000000000 Z
11
+ date: 2021-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: smart_engine
@@ -246,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
246
246
  - !ruby/object:Gem::Version
247
247
  version: '0'
248
248
  requirements: []
249
- rubygems_version: 3.2.22
249
+ rubygems_version: 3.2.32
250
250
  signing_key:
251
251
  specification_version: 4
252
252
  summary: Initializer DSL