smart_types 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -1
- data/CHANGELOG.md +17 -0
- data/Gemfile.lock +59 -48
- data/README.md +178 -31
- data/Rakefile +0 -1
- data/bin/console +2 -2
- data/lib/smart_core/types/primitive.rb +54 -15
- data/lib/smart_core/types/primitive/factory.rb +46 -7
- data/lib/smart_core/types/primitive/factory/definition_context.rb +114 -4
- data/lib/smart_core/types/primitive/invariant_control.rb +64 -0
- data/lib/smart_core/types/primitive/invariant_control/chain.rb +58 -0
- data/lib/smart_core/types/primitive/invariant_control/chain/result.rb +64 -0
- data/lib/smart_core/types/primitive/invariant_control/factory.rb +54 -0
- data/lib/smart_core/types/primitive/invariant_control/factory/chain_definition_context.rb +39 -0
- data/lib/smart_core/types/primitive/invariant_control/result.rb +104 -0
- data/lib/smart_core/types/primitive/invariant_control/single.rb +54 -0
- data/lib/smart_core/types/primitive/invariant_control/single/result.rb +63 -0
- data/lib/smart_core/types/primitive/mult_factory.rb +25 -10
- data/lib/smart_core/types/primitive/mult_factory/definition_context.rb +4 -2
- data/lib/smart_core/types/primitive/mult_validator.rb +34 -0
- data/lib/smart_core/types/primitive/mult_validator/result.rb +8 -0
- data/lib/smart_core/types/primitive/nilable_factory.rb +24 -9
- data/lib/smart_core/types/primitive/nilable_validator.rb +83 -0
- data/lib/smart_core/types/primitive/nilable_validator/result.rb +78 -0
- data/lib/smart_core/types/primitive/sum_factory.rb +25 -10
- data/lib/smart_core/types/primitive/sum_factory/definition_context.rb +3 -1
- data/lib/smart_core/types/primitive/sum_validator.rb +101 -0
- data/lib/smart_core/types/primitive/sum_validator/result.rb +100 -0
- data/lib/smart_core/types/primitive/validator.rb +84 -0
- data/lib/smart_core/types/primitive/validator/result.rb +78 -0
- data/lib/smart_core/types/value.rb +9 -0
- data/lib/smart_core/types/value/enumerator.rb +13 -0
- data/lib/smart_core/types/value/enumerator_chain.rb +13 -0
- data/lib/smart_core/types/value/io.rb +13 -0
- data/lib/smart_core/types/value/method.rb +9 -0
- data/lib/smart_core/types/value/nil.rb +0 -2
- data/lib/smart_core/types/value/range.rb +9 -0
- data/lib/smart_core/types/value/rational.rb +13 -0
- data/lib/smart_core/types/value/set.rb +13 -0
- data/lib/smart_core/types/value/string_io.rb +13 -0
- data/lib/smart_core/types/value/unbound_method.rb +9 -0
- data/lib/smart_core/types/version.rb +2 -1
- data/smart_types.gemspec +5 -4
- metadata +53 -17
- data/lib/smart_core/types/primitive/mult_checker.rb +0 -31
- data/lib/smart_core/types/primitive/nilable_checker.rb +0 -37
- data/lib/smart_core/types/primitive/sum_checker.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5f0c7f2b54ceaa7fe20e85d7d280b64b8310eb5f4fa802d11052074e6b10f96
|
4
|
+
data.tar.gz: 021c3c6194fb4f54246f4a44a7c548ce9da0790a66b95e0a060547e73efeaf3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e2fc86bcea2292570d2c51e9b95ead6ecc30f8251db75a61fda088c1a84bdb15cea65fdc478728869fb5e5e56b7cddb774938cae38c60e4dee70197e6c1c7f3
|
7
|
+
data.tar.gz: c7b27e2f70f3f8eac851f63365b3287a2c7aeb8f7f999679daa715d5ff7de93b32bd6204ea67f6af2c2ea1e5ccd569027051674c9266c62ff7d425c55692619a
|
data/.rubocop.yml
CHANGED
@@ -5,7 +5,8 @@ inherit_gem:
|
|
5
5
|
- lib/rubocop.rspec.yml
|
6
6
|
|
7
7
|
AllCops:
|
8
|
-
TargetRubyVersion: 2.7.
|
8
|
+
TargetRubyVersion: 2.7.2
|
9
|
+
NewCops: enable
|
9
10
|
Include:
|
10
11
|
- lib/**/*.rb
|
11
12
|
- spec/**/*.rb
|
@@ -17,3 +18,7 @@ AllCops:
|
|
17
18
|
# NOTE: support for old ruby versions
|
18
19
|
Style/RedundantBegin:
|
19
20
|
Enabled: false
|
21
|
+
|
22
|
+
# NOTE: used only in specs and it is ok in specs
|
23
|
+
Lint/EmptyBlock:
|
24
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,2 +1,19 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
## [0.2.0] - 2020-11-21
|
5
|
+
### Added
|
6
|
+
- Brand new **Type invariant API**:
|
7
|
+
- globally refactored validation logic (with backward compatability for `#valid?(value)` method);
|
8
|
+
- new type definition DSL: `.invariant(name)` and `.invariant_chain(name)`;
|
9
|
+
- chained invariants will be invoked according to the definition order (second invokation
|
10
|
+
depends on previous successful invariant check);
|
11
|
+
- new validation API: `validate(value)` (with `#errors` support based on invariant names);
|
12
|
+
- at this moment Invariant API is supported only by primitive types (type sum and type multiplication support coming soon);
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
|
16
|
+
- Updated `smart_engine` dependency (to `~> 0.7`) (need `SmartCore::Engine::Atom`);
|
17
|
+
|
18
|
+
## [0.1.0] - 2020-05-05
|
19
|
+
- Release :)
|
data/Gemfile.lock
CHANGED
@@ -1,91 +1,102 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
smart_types (0.
|
5
|
-
smart_engine (~> 0.
|
4
|
+
smart_types (0.2.0)
|
5
|
+
smart_engine (~> 0.7)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activesupport (6.0.
|
10
|
+
activesupport (6.0.3.4)
|
11
11
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
12
|
i18n (>= 0.7, < 2)
|
13
13
|
minitest (~> 5.1)
|
14
14
|
tzinfo (~> 1.1)
|
15
|
-
zeitwerk (~> 2.2)
|
16
|
-
armitage-rubocop (
|
17
|
-
rubocop (=
|
18
|
-
rubocop-performance (= 1.
|
19
|
-
rubocop-rails (= 2.
|
15
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
16
|
+
armitage-rubocop (1.3.1.1)
|
17
|
+
rubocop (= 1.3.1)
|
18
|
+
rubocop-performance (= 1.9.0)
|
19
|
+
rubocop-rails (= 2.8.1)
|
20
20
|
rubocop-rake (= 0.5.1)
|
21
|
-
rubocop-rspec (=
|
22
|
-
ast (2.4.
|
23
|
-
|
24
|
-
|
21
|
+
rubocop-rspec (= 2.0.0)
|
22
|
+
ast (2.4.1)
|
23
|
+
coderay (1.1.3)
|
24
|
+
concurrent-ruby (1.1.7)
|
25
|
+
diff-lcs (1.4.4)
|
25
26
|
docile (1.3.2)
|
26
|
-
i18n (1.8.
|
27
|
+
i18n (1.8.5)
|
27
28
|
concurrent-ruby (~> 1.0)
|
28
|
-
|
29
|
-
minitest (5.14.
|
30
|
-
parallel (1.
|
31
|
-
parser (2.7.
|
32
|
-
ast (~> 2.4.
|
33
|
-
|
29
|
+
method_source (1.0.0)
|
30
|
+
minitest (5.14.2)
|
31
|
+
parallel (1.20.0)
|
32
|
+
parser (2.7.2.0)
|
33
|
+
ast (~> 2.4.1)
|
34
|
+
pry (0.13.1)
|
35
|
+
coderay (~> 1.1)
|
36
|
+
method_source (~> 1.0)
|
37
|
+
rack (2.2.3)
|
34
38
|
rainbow (3.0.0)
|
35
39
|
rake (13.0.1)
|
40
|
+
regexp_parser (1.8.2)
|
36
41
|
rexml (3.2.4)
|
37
|
-
rspec (3.
|
38
|
-
rspec-core (~> 3.
|
39
|
-
rspec-expectations (~> 3.
|
40
|
-
rspec-mocks (~> 3.
|
41
|
-
rspec-core (3.
|
42
|
-
rspec-support (~> 3.
|
43
|
-
rspec-expectations (3.
|
42
|
+
rspec (3.10.0)
|
43
|
+
rspec-core (~> 3.10.0)
|
44
|
+
rspec-expectations (~> 3.10.0)
|
45
|
+
rspec-mocks (~> 3.10.0)
|
46
|
+
rspec-core (3.10.0)
|
47
|
+
rspec-support (~> 3.10.0)
|
48
|
+
rspec-expectations (3.10.0)
|
44
49
|
diff-lcs (>= 1.2.0, < 2.0)
|
45
|
-
rspec-support (~> 3.
|
46
|
-
rspec-mocks (3.
|
50
|
+
rspec-support (~> 3.10.0)
|
51
|
+
rspec-mocks (3.10.0)
|
47
52
|
diff-lcs (>= 1.2.0, < 2.0)
|
48
|
-
rspec-support (~> 3.
|
49
|
-
rspec-support (3.
|
50
|
-
rubocop (
|
51
|
-
jaro_winkler (~> 1.5.1)
|
53
|
+
rspec-support (~> 3.10.0)
|
54
|
+
rspec-support (3.10.0)
|
55
|
+
rubocop (1.3.1)
|
52
56
|
parallel (~> 1.10)
|
53
|
-
parser (>= 2.7.
|
57
|
+
parser (>= 2.7.1.5)
|
54
58
|
rainbow (>= 2.2.2, < 4.0)
|
59
|
+
regexp_parser (>= 1.8)
|
55
60
|
rexml
|
61
|
+
rubocop-ast (>= 1.1.1)
|
56
62
|
ruby-progressbar (~> 1.7)
|
57
63
|
unicode-display_width (>= 1.4.0, < 2.0)
|
58
|
-
rubocop-
|
59
|
-
|
60
|
-
rubocop-
|
61
|
-
|
64
|
+
rubocop-ast (1.1.1)
|
65
|
+
parser (>= 2.7.1.5)
|
66
|
+
rubocop-performance (1.9.0)
|
67
|
+
rubocop (>= 0.90.0, < 2.0)
|
68
|
+
rubocop-ast (>= 0.4.0)
|
69
|
+
rubocop-rails (2.8.1)
|
70
|
+
activesupport (>= 4.2.0)
|
62
71
|
rack (>= 1.1)
|
63
|
-
rubocop (>= 0.
|
72
|
+
rubocop (>= 0.87.0)
|
64
73
|
rubocop-rake (0.5.1)
|
65
74
|
rubocop
|
66
|
-
rubocop-rspec (
|
67
|
-
rubocop (
|
75
|
+
rubocop-rspec (2.0.0)
|
76
|
+
rubocop (~> 1.0)
|
77
|
+
rubocop-ast (>= 1.1.0)
|
68
78
|
ruby-progressbar (1.10.1)
|
69
|
-
simplecov (0.
|
79
|
+
simplecov (0.19.1)
|
70
80
|
docile (~> 1.1)
|
71
81
|
simplecov-html (~> 0.11)
|
72
|
-
simplecov-html (0.12.
|
73
|
-
smart_engine (0.
|
82
|
+
simplecov-html (0.12.3)
|
83
|
+
smart_engine (0.8.0)
|
74
84
|
thread_safe (0.3.6)
|
75
|
-
tzinfo (1.2.
|
85
|
+
tzinfo (1.2.8)
|
76
86
|
thread_safe (~> 0.1)
|
77
87
|
unicode-display_width (1.7.0)
|
78
|
-
zeitwerk (2.
|
88
|
+
zeitwerk (2.4.1)
|
79
89
|
|
80
90
|
PLATFORMS
|
81
91
|
ruby
|
82
92
|
|
83
93
|
DEPENDENCIES
|
84
|
-
armitage-rubocop (~>
|
94
|
+
armitage-rubocop (~> 1.3)
|
85
95
|
bundler (~> 2.1)
|
96
|
+
pry (~> 0.13)
|
86
97
|
rake (~> 13.0)
|
87
|
-
rspec (~> 3.
|
88
|
-
simplecov (~> 0.
|
98
|
+
rspec (~> 3.10)
|
99
|
+
simplecov (~> 0.19)
|
89
100
|
smart_types!
|
90
101
|
|
91
102
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -39,7 +39,7 @@ type4 = type1 & type2
|
|
39
39
|
|
40
40
|
## Supported types
|
41
41
|
|
42
|
-
-
|
42
|
+
- Primitives
|
43
43
|
|
44
44
|
```ruby
|
45
45
|
SmartCore::Types::Value::Any
|
@@ -67,45 +67,40 @@ SmartCore::Types::Value::TimeBased
|
|
67
67
|
|
68
68
|
## Nilable types
|
69
69
|
|
70
|
+
- invoke `.nilable` on any type object:
|
71
|
+
|
70
72
|
```ruby
|
71
|
-
SmartCore::Types::Value::Any.nilable
|
72
|
-
SmartCore::Types::Value::Nil.nilable
|
73
73
|
SmartCore::Types::Value::String.nilable
|
74
|
-
|
75
|
-
SmartCore::Types::Value::
|
76
|
-
|
77
|
-
SmartCore::Types::Value::Float.nilable
|
78
|
-
SmartCore::Types::Value::Numeric.nilable
|
79
|
-
SmartCore::Types::Value::BigDecimal.nilable
|
80
|
-
SmartCore::Types::Value::Boolean.nilable
|
81
|
-
SmartCore::Types::Value::Array.nilable
|
82
|
-
SmartCore::Types::Value::Hash.nilable
|
83
|
-
SmartCore::Types::Value::Proc.nilable
|
84
|
-
SmartCore::Types::Value::Class.nilable
|
85
|
-
SmartCore::Types::Value::Module.nilable
|
86
|
-
SmartCore::Types::Value::Time.nilable.nilable
|
87
|
-
SmartCore::Types::Value::DateTime.nilable
|
88
|
-
SmartCore::Types::Value::Date.nilable
|
89
|
-
SmartCore::Types::Value::TimeBased
|
74
|
+
# -- or --
|
75
|
+
SmartCore::Types::Value::Time.nilable
|
76
|
+
# and etc.
|
90
77
|
```
|
91
78
|
|
92
79
|
---
|
93
80
|
|
94
|
-
##
|
81
|
+
## Custom type definition
|
95
82
|
|
96
|
-
|
97
|
-
# documentation is coming
|
83
|
+
Type definition is a composition of:
|
98
84
|
|
99
|
-
|
100
|
-
|
85
|
+
- type checker (required);
|
86
|
+
- type caster (optional);
|
87
|
+
- type invariants (optional);
|
88
|
+
- type invariant chains (optional);
|
101
89
|
|
102
|
-
|
103
|
-
SmartCore::Types::Value::Float.cast('55') # => 55.0
|
104
|
-
```
|
90
|
+
Invariant is a custom validation block that will work as a logical value checker. You can have as much invariants as you want.
|
105
91
|
|
106
|
-
|
92
|
+
Type invariants does not depends on each other (invariant defined out from chain does not depends on other invariants);
|
107
93
|
|
108
|
-
|
94
|
+
Invariants inside invariant chains will be invoked in order they was defined and each internal invariant depends on the valid previous invairant check.
|
95
|
+
|
96
|
+
**!IMPORTANT!** Type sum and type multiplication does not support invariant checking and custom invariant definitioning at this moment.
|
97
|
+
Type sum and type mult ignores type invariants in their validation logic (currently this functionality in development yet).
|
98
|
+
|
99
|
+
Invariant checking is a special validation layer (see [#type validation](#type-validation) readme section). Invariant error code pattern:
|
100
|
+
- for invariant chains: `TypeName.invariant_chain_name.invariant_name`;
|
101
|
+
- for single invariant: `TypeName.invariant_name`;
|
102
|
+
|
103
|
+
#### Primitive type definition
|
109
104
|
|
110
105
|
```ruby
|
111
106
|
# documentation is coming
|
@@ -122,12 +117,140 @@ SmartCore::Types::Value.define_type(:String) do |type|
|
|
122
117
|
end
|
123
118
|
```
|
124
119
|
|
120
|
+
#### With type invariants
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
SmartCore::Types::Value.define_type(:String) do |type|
|
124
|
+
type.define_checker do |value|
|
125
|
+
value.is_a?(::String)
|
126
|
+
end
|
127
|
+
|
128
|
+
type.define_caster do |value|
|
129
|
+
value.to_s
|
130
|
+
end
|
131
|
+
|
132
|
+
# NOTE:
|
133
|
+
# invariant defined out from chain does not depends on other invariants
|
134
|
+
type.invariant(:uncensored_content) do |value|
|
135
|
+
!value.include?('uncensored_word')
|
136
|
+
end
|
137
|
+
|
138
|
+
type.invariant(:filled) do |value|
|
139
|
+
value != ''
|
140
|
+
end
|
141
|
+
|
142
|
+
type.invariant_chain(:password) do
|
143
|
+
invariant(:should_present) { |value| value != '' }
|
144
|
+
invariant(:should_have_numbers) { |value| v.match?(/[0-9]+/) }
|
145
|
+
# NOTE:
|
146
|
+
# inside a chain each next invariant invokation
|
147
|
+
# depends on previous successful invariant check
|
148
|
+
end
|
149
|
+
end
|
150
|
+
```
|
151
|
+
|
152
|
+
---
|
153
|
+
|
154
|
+
## Type validation
|
155
|
+
|
156
|
+
Type validation reflects on two APIs:
|
157
|
+
|
158
|
+
- type checker ([how to define type checkers](#custom-type-definition));
|
159
|
+
- type invariants (invariants and invariant chains) ([how to define type invariants](#custom-type-definition));
|
160
|
+
|
161
|
+
Type invariants does not depends on each other (invariant defined out from the chain does not depends on other invariants);
|
162
|
+
|
163
|
+
Invariants inside invariant chains will be invoked in order they was defined and each internal invariant depends on the valid previous invairant check.
|
164
|
+
|
165
|
+
**!IMPORTANT!** Type sum and type multiplication does not support invariant checking and custom invariant definitioning at this moment.
|
166
|
+
Type sum and type mult ignores type invariants in their validation logic (currently this functionality in development yet).
|
167
|
+
|
168
|
+
Invariant checking is a special validation layer (see [#type validation](#type-validation) readme section) and represents a set of error codes in result object;
|
169
|
+
|
170
|
+
Type valdiation interface:
|
171
|
+
|
172
|
+
- `valid?(value)` - validates value and returns `true` or `false`;
|
173
|
+
- returns `ture` only if the type checker returns `true` and all invariants are valid;
|
174
|
+
- `validate(value)` - validates value and returns the monadic result object:
|
175
|
+
- `SmartCore::Types::Primitive::Validator::Result` for primitive types;
|
176
|
+
- `SmartCore::Types::Primitive::SumValidator::Result` for sum-based types;
|
177
|
+
- `SmartCore::Types::Primitive::MultValidator::Result` for mult-based types;
|
178
|
+
- `SmartCore::Types::Primitive::NilableValidator::Result` for nilable types;
|
179
|
+
- `validate!(value)` - validates value and returns nothing (for successful validation) or
|
180
|
+
raises an exception (`SmartCore::Types::TypeError`) (for unsuccessful validation);
|
181
|
+
|
182
|
+
Validation result object interface:
|
183
|
+
|
184
|
+
- `#success?` / `#failure?` (`#success?` is a combination of `valid_check? && valid_invariants?`; `#failure?` - is an opposite of `#success?`);
|
185
|
+
- `#valid_check?` (valid type checker or not);
|
186
|
+
- `#valid_invariants?` (`false` if at least one invariant is invalid);
|
187
|
+
- `#errors` (the same as `#invariant_errors` and the same as `#error_codes`) - an array of failed invariant names;
|
188
|
+
- error code patterns:
|
189
|
+
- for invariant chains: `TypeName.invariant_chain_name.invariant_name`;
|
190
|
+
- for single invariant: `TypeName.invariant_name`;
|
191
|
+
- `#checked_value` (the same as `#value`) - checked value :)
|
192
|
+
|
193
|
+
|
194
|
+
```ruby
|
195
|
+
SmartCore::Types::Value::String.valid?('test123') # => true
|
196
|
+
SmartCore::Types::Value::String.valid?(123.45) # => false
|
197
|
+
```
|
198
|
+
|
199
|
+
```ruby
|
200
|
+
result = SmartCore::Types::Value::String.validate('test')
|
201
|
+
|
202
|
+
result.checked_value # => 'test'
|
203
|
+
# --- same as: ---
|
204
|
+
result.value
|
205
|
+
|
206
|
+
result.success? # => false (valid_check? && valid_invariants?)
|
207
|
+
result.failure? # => true
|
208
|
+
|
209
|
+
result.valid_check? # => true
|
210
|
+
result.valid_invariants? # => false
|
211
|
+
|
212
|
+
# invariant errors:
|
213
|
+
result.errors # => ['String.password.should_have_numbers']
|
214
|
+
# -- same as: ---
|
215
|
+
result.invariant_errors
|
216
|
+
# -- same as: ---
|
217
|
+
result.error_codes
|
218
|
+
```
|
219
|
+
|
220
|
+
```ruby
|
221
|
+
result = SmartCore::Types::Value::String.validate('test1234')
|
222
|
+
result.success? # => true
|
223
|
+
result.errors # => []
|
224
|
+
```
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
SmartCore::Types::Value::String.validate!('test') # => SmartCore::Types::TypeError
|
228
|
+
```
|
229
|
+
|
230
|
+
---
|
231
|
+
|
232
|
+
## Type casting
|
233
|
+
|
234
|
+
```
|
235
|
+
SmartCore::Types::Value::String.cast(123) # => "123"
|
236
|
+
SmartCore::Types::Value::Float.cast('55') # => 55.0
|
237
|
+
```
|
238
|
+
|
125
239
|
---
|
126
240
|
|
127
241
|
## Basic type algebra
|
128
242
|
|
243
|
+
> (type sum and type multiplication does not support invariants at this moment (in development yet));
|
244
|
+
|
129
245
|
```ruby
|
130
246
|
# documentation is coming
|
247
|
+
|
248
|
+
# how to define primitive type sum:
|
249
|
+
SmartCore::Types::Value::Text = SmartCore::Types::Value::String | SmartCore::Types::Value::Symbol
|
250
|
+
SmartCore::Types::Value::Numeric = SmartCore::Types::Value::Float | SmartCore::Types::Value::Integer
|
251
|
+
|
252
|
+
# how to define primitive type multiplication:
|
253
|
+
SmartCore::Types::Value::CryptoString = SmartCore::Types::Value::NumberdString & SmartCore::Types::Value::SymbolicString
|
131
254
|
```
|
132
255
|
|
133
256
|
---
|
@@ -195,6 +318,9 @@ end
|
|
195
318
|
SmartCore::Types::Value::Time.refine_caster do |value, original_caster|
|
196
319
|
# new type caster
|
197
320
|
end
|
321
|
+
|
322
|
+
# .refine_invariant
|
323
|
+
# .refine_invariant_chain
|
198
324
|
```
|
199
325
|
|
200
326
|
- options for type casters:
|
@@ -218,7 +344,16 @@ SmartCore::Types::Value::Method
|
|
218
344
|
SmartCore::Types::Value::UnboundMethod
|
219
345
|
SmartCore::Types::Value::Enumerable
|
220
346
|
SmartCore::Types::Value::Comparable
|
347
|
+
SmartCore::Types::Value::Enumerator
|
348
|
+
SmartCore::Types::Value::EnumeratorChain
|
349
|
+
SmartCore::Types::Value::Range
|
350
|
+
SmartCore::Types::Value::Rational
|
351
|
+
SmartCore::Types::Value::Set
|
352
|
+
SmartCore::Types::Value::SortedSet
|
353
|
+
SmartCore::Types::Value::IO
|
354
|
+
SmartCore::Types::Value::StringIO
|
221
355
|
SmartCore::Types::Struct::Schema
|
356
|
+
SmartCore::Types::Struct::JSONSchema
|
222
357
|
SmartCore::Types::Struct::StrictArray
|
223
358
|
SmartCore::Types::Struct::StrictHash
|
224
359
|
SmartCore::Types::Struct::Map
|
@@ -230,11 +365,23 @@ SmartCore::Types::Protocol::Ancestors
|
|
230
365
|
SmartCore::Types::Protocol::Enumerable
|
231
366
|
SmartCore::Types::Protocol::Comparable
|
232
367
|
SmartCore::Types::Protocol::Forwardable
|
368
|
+
SmartCore::Types::Protocol::Callable
|
233
369
|
```
|
234
370
|
|
371
|
+
- support for type of empty non-defined type (`SmartCore::Types::Primitive::Undefined`);
|
235
372
|
- constrained types;
|
236
|
-
|
237
|
-
-
|
373
|
+
- moudle-based type system integration;
|
374
|
+
- constructor implementation and support;
|
375
|
+
- support for invariant checking (and custom definitioning) in sum-types;
|
376
|
+
- to provide a type comparability and compatability between all passed types
|
377
|
+
you should provide `type.reconcilable { |value, *types| .... }` setting;
|
378
|
+
- `type.reconcilable` should be accesible for type sum and type mult definitions;
|
379
|
+
- (**preliminarily**) invariants of the concrete passed type should be valid for sucessful invariant check;
|
380
|
+
- support for invariant checking (and definitioning) in mult-types;
|
381
|
+
- to provide a type comparability and compatability between all passed types
|
382
|
+
you should provide `type.reconcilable { |value, *types| .... }` setting;
|
383
|
+
- `type.reconcilable` should be accesible for type sum and type mult definitions;
|
384
|
+
- (**preliminarily**) all invariants of all types should be valid for sucessful invariant check;
|
238
385
|
|
239
386
|
## Contributing
|
240
387
|
|