smart_initializer 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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