smart_types 0.1.0.alpha6 → 0.1.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 +4 -4
- data/.rubocop.yml +5 -1
- data/.travis.yml +6 -5
- data/Gemfile.lock +43 -28
- data/README.md +117 -13
- data/Rakefile +2 -1
- data/lib/smart_core/types/errors.rb +4 -0
- data/lib/smart_core/types/primitive.rb +14 -24
- data/lib/smart_core/types/primitive/factory.rb +1 -1
- data/lib/smart_core/types/primitive/factory/definition_context.rb +4 -4
- data/lib/smart_core/types/primitive/mult_factory/definition_context.rb +2 -2
- data/lib/smart_core/types/primitive/sum_factory/definition_context.rb +2 -2
- data/lib/smart_core/types/primitive/undefined_caster.rb +3 -4
- data/lib/smart_core/types/system.rb +21 -5
- data/lib/smart_core/types/value.rb +7 -0
- data/lib/smart_core/types/value/big_decimal.rb +28 -0
- data/lib/smart_core/types/value/comparable.rb +13 -0
- data/lib/smart_core/types/value/date.rb +21 -0
- data/lib/smart_core/types/value/date_time.rb +21 -0
- data/lib/smart_core/types/value/enumerable.rb +13 -0
- data/lib/smart_core/types/value/float.rb +6 -2
- data/lib/smart_core/types/value/hash.rb +8 -1
- data/lib/smart_core/types/value/integer.rb +10 -3
- data/lib/smart_core/types/value/nil.rb +3 -1
- data/lib/smart_core/types/value/numeric.rb +13 -3
- data/lib/smart_core/types/value/proc.rb +11 -1
- data/lib/smart_core/types/value/string.rb +7 -1
- data/lib/smart_core/types/value/symbol.rb +7 -1
- data/lib/smart_core/types/value/text.rb +18 -2
- data/lib/smart_core/types/value/time.rb +21 -0
- data/lib/smart_core/types/value/time_based.rb +29 -0
- data/lib/smart_core/types/version.rb +1 -2
- data/smart_types.gemspec +4 -4
- metadata +18 -13
- data/lib/smart_core/types/system/definition_dsl.rb +0 -40
- data/lib/smart_core/types/system/producer_dsl.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12c87a28e4cb88c84907c5d811253c4cb70e3e4aad462010c47c1a6d88c21d81
|
4
|
+
data.tar.gz: af0155909d10f02369aa5b60c97de4b0b91fbfad92ba79d1f94b5b3333ede373
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa5eb3001d7909b30e9fe2df27b92bff6ee22d9e92ef27f37dfbe11c18f968ee932cf0e064ecb2db808d8a0913d3c5fe7650d0d7b15af51bbe4591afeef39670
|
7
|
+
data.tar.gz: e0fa90c1783113d8d702414596cf001e0e54b786c6d21248e52f5e2401901eddebb09d182349abccda301998782242fa02d4a94e61eb2a3f301fe982a7d5ceff
|
data/.rubocop.yml
CHANGED
@@ -5,7 +5,7 @@ inherit_gem:
|
|
5
5
|
- lib/rubocop.rspec.yml
|
6
6
|
|
7
7
|
AllCops:
|
8
|
-
TargetRubyVersion: 2.
|
8
|
+
TargetRubyVersion: 2.7.1
|
9
9
|
Include:
|
10
10
|
- lib/**/*.rb
|
11
11
|
- spec/**/*.rb
|
@@ -13,3 +13,7 @@ AllCops:
|
|
13
13
|
- Rakefile
|
14
14
|
- smart_types.gemspec
|
15
15
|
- bin/console
|
16
|
+
|
17
|
+
# NOTE: support for old ruby versions
|
18
|
+
Style/RedundantBegin:
|
19
|
+
Enabled: false
|
data/.travis.yml
CHANGED
@@ -2,17 +2,18 @@
|
|
2
2
|
language: ruby
|
3
3
|
cache: bundler
|
4
4
|
os: linux
|
5
|
-
|
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.
|
13
|
-
- rvm: 2.5.
|
14
|
-
- rvm: 2.6.
|
15
|
-
- rvm: 2.7.
|
13
|
+
- rvm: 2.4.10
|
14
|
+
- rvm: 2.5.8
|
15
|
+
- rvm: 2.6.6
|
16
|
+
- rvm: 2.7.1
|
16
17
|
- rvm: ruby-head
|
17
18
|
- rvm: jruby-head
|
18
19
|
allow_failures:
|
data/Gemfile.lock
CHANGED
@@ -1,77 +1,92 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
smart_types (0.1.0
|
5
|
-
smart_engine (~> 0.
|
4
|
+
smart_types (0.1.0)
|
5
|
+
smart_engine (~> 0.6)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
|
11
|
-
|
10
|
+
activesupport (6.0.2.2)
|
11
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
+
i18n (>= 0.7, < 2)
|
13
|
+
minitest (~> 5.1)
|
14
|
+
tzinfo (~> 1.1)
|
15
|
+
zeitwerk (~> 2.2)
|
16
|
+
armitage-rubocop (0.82.0.2)
|
17
|
+
rubocop (= 0.82.0)
|
12
18
|
rubocop-performance (= 1.5.2)
|
13
|
-
rubocop-rails (= 2.
|
14
|
-
rubocop-rake (= 0.5.
|
15
|
-
rubocop-rspec (= 1.
|
19
|
+
rubocop-rails (= 2.5.2)
|
20
|
+
rubocop-rake (= 0.5.1)
|
21
|
+
rubocop-rspec (= 1.39.0)
|
16
22
|
ast (2.4.0)
|
23
|
+
concurrent-ruby (1.1.6)
|
17
24
|
diff-lcs (1.3)
|
18
25
|
docile (1.3.2)
|
26
|
+
i18n (1.8.2)
|
27
|
+
concurrent-ruby (~> 1.0)
|
19
28
|
jaro_winkler (1.5.4)
|
20
|
-
|
29
|
+
minitest (5.14.0)
|
21
30
|
parallel (1.19.1)
|
22
|
-
parser (2.7.
|
31
|
+
parser (2.7.1.2)
|
23
32
|
ast (~> 2.4.0)
|
24
|
-
rack (2.
|
33
|
+
rack (2.2.2)
|
25
34
|
rainbow (3.0.0)
|
26
35
|
rake (13.0.1)
|
36
|
+
rexml (3.2.4)
|
27
37
|
rspec (3.9.0)
|
28
38
|
rspec-core (~> 3.9.0)
|
29
39
|
rspec-expectations (~> 3.9.0)
|
30
40
|
rspec-mocks (~> 3.9.0)
|
31
|
-
rspec-core (3.9.
|
32
|
-
rspec-support (~> 3.9.
|
33
|
-
rspec-expectations (3.9.
|
41
|
+
rspec-core (3.9.2)
|
42
|
+
rspec-support (~> 3.9.3)
|
43
|
+
rspec-expectations (3.9.1)
|
34
44
|
diff-lcs (>= 1.2.0, < 2.0)
|
35
45
|
rspec-support (~> 3.9.0)
|
36
46
|
rspec-mocks (3.9.1)
|
37
47
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
48
|
rspec-support (~> 3.9.0)
|
39
|
-
rspec-support (3.9.
|
40
|
-
rubocop (0.
|
49
|
+
rspec-support (3.9.3)
|
50
|
+
rubocop (0.82.0)
|
41
51
|
jaro_winkler (~> 1.5.1)
|
42
52
|
parallel (~> 1.10)
|
43
53
|
parser (>= 2.7.0.1)
|
44
54
|
rainbow (>= 2.2.2, < 4.0)
|
55
|
+
rexml
|
45
56
|
ruby-progressbar (~> 1.7)
|
46
|
-
unicode-display_width (>= 1.4.0, <
|
57
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
47
58
|
rubocop-performance (1.5.2)
|
48
59
|
rubocop (>= 0.71.0)
|
49
|
-
rubocop-rails (2.
|
60
|
+
rubocop-rails (2.5.2)
|
61
|
+
activesupport
|
50
62
|
rack (>= 1.1)
|
51
63
|
rubocop (>= 0.72.0)
|
52
|
-
rubocop-rake (0.5.
|
64
|
+
rubocop-rake (0.5.1)
|
53
65
|
rubocop
|
54
|
-
rubocop-rspec (1.
|
66
|
+
rubocop-rspec (1.39.0)
|
55
67
|
rubocop (>= 0.68.1)
|
56
68
|
ruby-progressbar (1.10.1)
|
57
|
-
simplecov (0.
|
69
|
+
simplecov (0.18.5)
|
58
70
|
docile (~> 1.1)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
71
|
+
simplecov-html (~> 0.11)
|
72
|
+
simplecov-html (0.12.2)
|
73
|
+
smart_engine (0.6.0)
|
74
|
+
thread_safe (0.3.6)
|
75
|
+
tzinfo (1.2.7)
|
76
|
+
thread_safe (~> 0.1)
|
77
|
+
unicode-display_width (1.7.0)
|
78
|
+
zeitwerk (2.3.0)
|
64
79
|
|
65
80
|
PLATFORMS
|
66
81
|
ruby
|
67
82
|
|
68
83
|
DEPENDENCIES
|
69
|
-
armitage-rubocop (~> 0.
|
84
|
+
armitage-rubocop (~> 0.82)
|
70
85
|
bundler (~> 2.1)
|
71
86
|
rake (~> 13.0)
|
72
87
|
rspec (~> 3.9)
|
73
|
-
simplecov (~> 0.
|
88
|
+
simplecov (~> 0.18)
|
74
89
|
smart_types!
|
75
90
|
|
76
91
|
BUNDLED WITH
|
77
|
-
2.1.
|
92
|
+
2.1.4
|
data/README.md
CHANGED
@@ -2,12 +2,10 @@
|
|
2
2
|
|
3
3
|
> A set of objects that acts like types (type checking and type casting) with a support for basic type algebra.
|
4
4
|
|
5
|
-
|
5
|
+
Minimalistic type system for any ruby project. Supports custom type definitioning,
|
6
6
|
type validation, type casting and type categorizing. Provides a set of commonly used type
|
7
7
|
categories and general purpose types. Has a flexible and simplest type definition toolchain.
|
8
8
|
|
9
|
-
Just add and use :) Enjoy! :)
|
10
|
-
|
11
9
|
## Installation
|
12
10
|
|
13
11
|
```ruby
|
@@ -45,18 +43,24 @@ type4 = type1 & type2
|
|
45
43
|
|
46
44
|
```ruby
|
47
45
|
SmartCore::Types::Value::Any
|
46
|
+
SmartCore::Types::Value::Nil
|
48
47
|
SmartCore::Types::Value::String
|
49
48
|
SmartCore::Types::Value::Symbol
|
50
49
|
SmartCore::Types::Value::Text
|
51
50
|
SmartCore::Types::Value::Integer
|
52
51
|
SmartCore::Types::Value::Float
|
53
52
|
SmartCore::Types::Value::Numeric
|
53
|
+
SmartCore::Types::Value::BigDecimal
|
54
54
|
SmartCore::Types::Value::Boolean
|
55
55
|
SmartCore::Types::Value::Array
|
56
56
|
SmartCore::Types::Value::Hash
|
57
57
|
SmartCore::Types::Value::Proc
|
58
58
|
SmartCore::Types::Value::Class
|
59
59
|
SmartCore::Types::Value::Module
|
60
|
+
SmartCore::Types::Value::Time
|
61
|
+
SmartCore::Types::Value::DateTime
|
62
|
+
SmartCore::Types::Value::Date
|
63
|
+
SmartCore::Types::Value::TimeBased
|
60
64
|
```
|
61
65
|
|
62
66
|
---
|
@@ -65,34 +69,38 @@ SmartCore::Types::Value::Module
|
|
65
69
|
|
66
70
|
```ruby
|
67
71
|
SmartCore::Types::Value::Any.nilable
|
72
|
+
SmartCore::Types::Value::Nil.nilable
|
68
73
|
SmartCore::Types::Value::String.nilable
|
69
74
|
SmartCore::Types::Value::Symbol.nilable
|
70
75
|
SmartCore::Types::Value::Text.nilable
|
71
76
|
SmartCore::Types::Value::Integer.nilable
|
72
77
|
SmartCore::Types::Value::Float.nilable
|
73
78
|
SmartCore::Types::Value::Numeric.nilable
|
79
|
+
SmartCore::Types::Value::BigDecimal.nilable
|
74
80
|
SmartCore::Types::Value::Boolean.nilable
|
75
81
|
SmartCore::Types::Value::Array.nilable
|
76
82
|
SmartCore::Types::Value::Hash.nilable
|
77
83
|
SmartCore::Types::Value::Proc.nilable
|
78
84
|
SmartCore::Types::Value::Class.nilable
|
79
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
|
80
90
|
```
|
81
91
|
|
82
92
|
---
|
83
93
|
|
84
|
-
##
|
94
|
+
## Type validation and type casting
|
85
95
|
|
86
96
|
```ruby
|
87
97
|
# documentation is coming
|
88
|
-
```
|
89
98
|
|
90
|
-
|
91
|
-
|
92
|
-
## Type validation and type casting
|
99
|
+
SmartCore::Types::Value::String.valid?('test') # => true
|
100
|
+
SmartCore::Types::Value::String.valid?(123.45) # => false
|
93
101
|
|
94
|
-
|
95
|
-
#
|
102
|
+
SmartCore::Types::Value::String.cast(123) # => "123"
|
103
|
+
SmartCore::Types::Value::Float.cast('55') # => 55.0
|
96
104
|
```
|
97
105
|
|
98
106
|
---
|
@@ -124,13 +132,109 @@ end
|
|
124
132
|
|
125
133
|
---
|
126
134
|
|
127
|
-
##
|
135
|
+
## Roadmap
|
136
|
+
|
137
|
+
- type configuration:
|
128
138
|
|
129
139
|
```ruby
|
130
|
-
|
140
|
+
SmartCore::Types::Value.type(:Time) do |type|
|
141
|
+
type.configuration do |config| # config definition
|
142
|
+
setting :iso, :rfc2822
|
143
|
+
# TODO: think about a more convinient DSL
|
144
|
+
end
|
145
|
+
|
146
|
+
type.define_caster do |value, config| # config usage
|
147
|
+
case config.standard
|
148
|
+
when :rfc2822
|
149
|
+
::Time.rfc2822(value)
|
150
|
+
else
|
151
|
+
# ...
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
131
155
|
```
|
132
156
|
|
133
|
-
|
157
|
+
- pipelined type caster definition for the sum-based types:
|
158
|
+
|
159
|
+
```ruby
|
160
|
+
SmartCore::Types::Value::TimeLike = SmartCore::Types::System.type_sum(
|
161
|
+
SmartCore::Types::Time,
|
162
|
+
SmartCore::Types::DateTime,
|
163
|
+
SmartCore::Types::Date,
|
164
|
+
) do |type|
|
165
|
+
type.define_caster(:pipelined) # try Time.cast => try DateTime.cast => try Date.cast
|
166
|
+
end
|
167
|
+
```
|
168
|
+
|
169
|
+
- namespaced type errors:
|
170
|
+
|
171
|
+
```ruby
|
172
|
+
# before:
|
173
|
+
SmartCore::Types::Value::Boolean.validate!(123)
|
174
|
+
# => SmartCore::Types::TypeError
|
175
|
+
SmartCore::Types::Value::Class.cast(123)
|
176
|
+
# => SmartCore::Types::TypeCastingError
|
177
|
+
|
178
|
+
# after:
|
179
|
+
SmartCore::Types::Value::Boolean.validate!(123)
|
180
|
+
# => SmartCore::Types::Value::Boolean::TypeError
|
181
|
+
# (inheritance tree: Types::Value::<Type>::TypeError => Types::Value::TypeError => Types::TypeError)
|
182
|
+
|
183
|
+
SmartCore::Types::Value::Class.cast(123)
|
184
|
+
# => SmartCore::Types::Value::Class::TypeCastingError
|
185
|
+
# (inheritance tree: the same as above)
|
186
|
+
```
|
187
|
+
|
188
|
+
- type refinements:
|
189
|
+
|
190
|
+
```ruby
|
191
|
+
SmartCore::Types::Value::Time.refine_checker do |value, original_checker|
|
192
|
+
# new type checker
|
193
|
+
end
|
194
|
+
|
195
|
+
SmartCore::Types::Value::Time.refine_caster do |value, original_caster|
|
196
|
+
# new type caster
|
197
|
+
end
|
198
|
+
```
|
199
|
+
|
200
|
+
- options for type casters:
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
SmartCore::Types::Value.define_type(:Date) do |type|
|
204
|
+
type.define_caster do |value, options = {}| # options goes here
|
205
|
+
iso = options.fetch(:iso, nil)
|
206
|
+
iso ? ::Date.pasre(value, iso) : ::Date.parse(value)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# usage:
|
211
|
+
SmartCore::Types::Value::Date.cast('2020-01-01', { iso: :rfc3339 })
|
212
|
+
```
|
213
|
+
|
214
|
+
- new types:
|
215
|
+
|
216
|
+
```ruby
|
217
|
+
SmartCore::Types::Value::Method
|
218
|
+
SmartCore::Types::Value::UnboundMethod
|
219
|
+
SmartCore::Types::Value::Enumerable
|
220
|
+
SmartCore::Types::Value::Comparable
|
221
|
+
SmartCore::Types::Struct::Schema
|
222
|
+
SmartCore::Types::Struct::StrictArray
|
223
|
+
SmartCore::Types::Struct::StrictHash
|
224
|
+
SmartCore::Types::Struct::Map
|
225
|
+
SmartCore::Types::Variative::Enum
|
226
|
+
SmartCore::Types::Variative::Variant
|
227
|
+
SmartCore::Types::Protocol::InstanceOf
|
228
|
+
SmartCore::Types::Protocol::Interface
|
229
|
+
SmartCore::Types::Protocol::Ancestors
|
230
|
+
SmartCore::Types::Protocol::Enumerable
|
231
|
+
SmartCore::Types::Protocol::Comparable
|
232
|
+
SmartCore::Types::Protocol::Forwardable
|
233
|
+
```
|
234
|
+
|
235
|
+
- constrained types;
|
236
|
+
|
237
|
+
- module-based integration;
|
134
238
|
|
135
239
|
## Contributing
|
136
240
|
|
data/Rakefile
CHANGED
@@ -4,6 +4,7 @@ require 'bundler/gem_tasks'
|
|
4
4
|
require 'rspec/core/rake_task'
|
5
5
|
require 'rubocop'
|
6
6
|
require 'rubocop/rake_task'
|
7
|
+
require 'rubocop-rails'
|
7
8
|
require 'rubocop-performance'
|
8
9
|
require 'rubocop-rspec'
|
9
10
|
require 'rubocop-rake'
|
@@ -11,8 +12,8 @@ require 'rubocop-rake'
|
|
11
12
|
RuboCop::RakeTask.new(:rubocop) do |t|
|
12
13
|
config_path = File.expand_path(File.join('.rubocop.yml'), __dir__)
|
13
14
|
t.options = ['--config', config_path]
|
14
|
-
t.requires << 'rubocop-performance'
|
15
15
|
t.requires << 'rubocop-rspec'
|
16
|
+
t.requires << 'rubocop-performance'
|
16
17
|
t.requires << 'rubocop-rake'
|
17
18
|
end
|
18
19
|
|
@@ -21,6 +21,10 @@ module SmartCore::Types
|
|
21
21
|
# @since 0.1.0
|
22
22
|
TypeCastingError = Class.new(Error)
|
23
23
|
|
24
|
+
# @api public
|
25
|
+
# @since 0.1.0
|
26
|
+
TypeCastingUnsupportedError = Class.new(TypeCastingError)
|
27
|
+
|
24
28
|
# @api public
|
25
29
|
# @since 0.1.0
|
26
30
|
NoCheckerDefinitionError = Class.new(Error)
|
@@ -14,8 +14,17 @@ class SmartCore::Types::Primitive
|
|
14
14
|
require_relative 'primitive/mult_factory'
|
15
15
|
require_relative 'primitive/nilable_factory'
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
class << self
|
18
|
+
# @param type_name [String, Symbol]
|
19
|
+
# @param type_definition [Block]
|
20
|
+
# @return [SmartCore::Types::Primitive]
|
21
|
+
#
|
22
|
+
# @api public
|
23
|
+
# @since 0.1.0
|
24
|
+
def define_type(type_name, &type_definition)
|
25
|
+
self::Factory.create_type(self, type_name, type_definition)
|
26
|
+
end
|
27
|
+
end
|
19
28
|
|
20
29
|
# @return [SmartCore::Types::Primitive::Checker]
|
21
30
|
#
|
@@ -31,7 +40,6 @@ class SmartCore::Types::Primitive
|
|
31
40
|
|
32
41
|
# @param checker [SmartCore::Types::Primitive::Checker]
|
33
42
|
# @param caster [SmartCore::Types::Primitive::Caster]
|
34
|
-
# @param name [String]
|
35
43
|
# @return [void]
|
36
44
|
#
|
37
45
|
# @api private
|
@@ -43,14 +51,6 @@ class SmartCore::Types::Primitive
|
|
43
51
|
@nilable = nil
|
44
52
|
end
|
45
53
|
|
46
|
-
# @return [String]
|
47
|
-
#
|
48
|
-
# @api public
|
49
|
-
# @since 0.1.0
|
50
|
-
def name
|
51
|
-
self.class.name
|
52
|
-
end
|
53
|
-
|
54
54
|
# @param value [Any]
|
55
55
|
# @return [Boolean]
|
56
56
|
#
|
@@ -60,26 +60,16 @@ class SmartCore::Types::Primitive
|
|
60
60
|
checker.call(value)
|
61
61
|
end
|
62
62
|
|
63
|
+
# @param value [Any]
|
63
64
|
# @return [void]
|
64
65
|
#
|
65
|
-
# @raise [SmartCore::TypeError]
|
66
|
+
# @raise [SmartCore::Types::TypeError]
|
66
67
|
#
|
67
68
|
# @api public
|
68
69
|
# @since 0.1.0
|
69
70
|
def validate!(value)
|
70
71
|
return if valid?(value)
|
71
|
-
|
72
|
-
# rubocop:disable Layout/RescueEnsureAlignment
|
73
|
-
value_type = begin
|
74
|
-
value.class.name
|
75
|
-
rescue NoMethodError
|
76
|
-
(class << value; superclass; end).name
|
77
|
-
end
|
78
|
-
# rubocop:enable Layout/RescueEnsureAlignment
|
79
|
-
|
80
|
-
raise(SmartCore::Types::TypeError, <<~ERROR_MESSAGE)
|
81
|
-
Invalid type (given #{value_type}, expects #{self.class.name}/SmartCore)
|
82
|
-
ERROR_MESSAGE
|
72
|
+
raise(SmartCore::Types::TypeError, 'Invalid type')
|
83
73
|
end
|
84
74
|
|
85
75
|
# @param value [Any]
|
@@ -37,7 +37,7 @@ class SmartCore::Types::Primitive::Factory
|
|
37
37
|
end.tap do |context|
|
38
38
|
raise(
|
39
39
|
SmartCore::Types::NoCheckerDefinitionError,
|
40
|
-
'Type checker is not provided
|
40
|
+
'Type checker is not provided. You should define it via .define_checker(&block)'
|
41
41
|
) if context.type_checker.nil?
|
42
42
|
end
|
43
43
|
end
|
@@ -3,13 +3,13 @@
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
5
|
class SmartCore::Types::Primitive::Factory::DefinitionContext
|
6
|
-
# @return [Proc]
|
6
|
+
# @return [Proc, NilClass]
|
7
7
|
#
|
8
8
|
# @api private
|
9
9
|
# @since 0.1.0
|
10
10
|
attr_reader :type_checker
|
11
11
|
|
12
|
-
# @return [Proc]
|
12
|
+
# @return [Proc, NilClass]
|
13
13
|
#
|
14
14
|
# @api private
|
15
15
|
# @since 0.1.0
|
@@ -30,7 +30,7 @@ class SmartCore::Types::Primitive::Factory::DefinitionContext
|
|
30
30
|
# @api public
|
31
31
|
# @since 0.1.0
|
32
32
|
def define_checker(&checker)
|
33
|
-
raise 'No checker definition block' unless block_given?
|
33
|
+
raise(SmartCore::ArgumentError, 'No checker definition block') unless block_given?
|
34
34
|
@type_checker = checker
|
35
35
|
end
|
36
36
|
|
@@ -40,7 +40,7 @@ class SmartCore::Types::Primitive::Factory::DefinitionContext
|
|
40
40
|
# @api public
|
41
41
|
# @since 0.1.0
|
42
42
|
def define_caster(&caster)
|
43
|
-
raise 'No caster definition block' unless block_given?
|
43
|
+
raise(SmartCore::ArgumentError, 'No caster definition block') unless block_given?
|
44
44
|
@type_caster = caster
|
45
45
|
end
|
46
46
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
5
|
class SmartCore::Types::Primitive::Factory::DefinitionContext
|
6
|
-
# @return [Proc]
|
6
|
+
# @return [Proc, NilClass]
|
7
7
|
#
|
8
8
|
# @api private
|
9
9
|
# @since 0.1.0
|
@@ -23,7 +23,7 @@ class SmartCore::Types::Primitive::Factory::DefinitionContext
|
|
23
23
|
# @api public
|
24
24
|
# @since 0.1.0
|
25
25
|
def define_caster(&caster)
|
26
|
-
raise 'No caster definition block' unless block_given?
|
26
|
+
raise(SmartCore::ArgumentError, 'No caster definition block') unless block_given?
|
27
27
|
@type_caster = caster
|
28
28
|
end
|
29
29
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
5
|
class SmartCore::Types::Primitive::SumFactory::DefinitionContext
|
6
|
-
# @return [Proc]
|
6
|
+
# @return [Proc, NilClass]
|
7
7
|
#
|
8
8
|
# @api private
|
9
9
|
# @since 0.1.0
|
@@ -23,7 +23,7 @@ class SmartCore::Types::Primitive::SumFactory::DefinitionContext
|
|
23
23
|
# @api public
|
24
24
|
# @since 0.1.0
|
25
25
|
def define_caster(&caster)
|
26
|
-
raise 'No caster definition block' unless block_given?
|
26
|
+
raise(SmartCore::ArgumentError, 'No caster definition block') unless block_given?
|
27
27
|
@type_caster = caster
|
28
28
|
end
|
29
29
|
end
|
@@ -15,14 +15,13 @@ class SmartCore::Types::Primitive::UndefinedCaster < SmartCore::Types::Primitive
|
|
15
15
|
# @param value [Any]
|
16
16
|
# @return [void]
|
17
17
|
#
|
18
|
-
# @raise [SmartCore::Types::
|
18
|
+
# @raise [SmartCore::Types::TypeCastingUnsupportedError]
|
19
19
|
#
|
20
20
|
# @pai private
|
21
21
|
# @since 0.1.0
|
22
22
|
def call(value)
|
23
|
-
raise(
|
24
|
-
SmartCore::Types::TypeCastingError,
|
23
|
+
raise(SmartCore::Types::TypeCastingUnsupportedError, <<~ERROR_MESSAGE)
|
25
24
|
'This type has no support for type casting'
|
26
|
-
|
25
|
+
ERROR_MESSAGE
|
27
26
|
end
|
28
27
|
end
|
@@ -1,11 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# @api
|
3
|
+
# @api public
|
4
4
|
# @since 0.1.0
|
5
5
|
module SmartCore::Types::System
|
6
|
-
|
7
|
-
|
6
|
+
class << self
|
7
|
+
# @param types [Array<SmartCore::Types::Pirmitive>]
|
8
|
+
# @param type_definition [Block]
|
9
|
+
# @return [SmartCore::Types::Primitive]
|
10
|
+
#
|
11
|
+
# @api public
|
12
|
+
# @since 0.1.0
|
13
|
+
def type_sum(*types, &type_definition)
|
14
|
+
SmartCore::Types::Primitive::SumFactory.create_type(types, type_definition)
|
15
|
+
end
|
8
16
|
|
9
|
-
|
10
|
-
|
17
|
+
# @param types [Array<SmartCore::Types::Pirmitive>]
|
18
|
+
# @param type_definition [Block]
|
19
|
+
# @return [SmartCore::Types::Primitive]
|
20
|
+
#
|
21
|
+
# @api public
|
22
|
+
# @since 0.1.0
|
23
|
+
def type_mult(*types, &type_definition)
|
24
|
+
SmartCore::Types::Primitive::MultFactory.create_type(types, type_definition)
|
25
|
+
end
|
26
|
+
end
|
11
27
|
end
|
@@ -17,4 +17,11 @@ class SmartCore::Types::Value < SmartCore::Types::Primitive
|
|
17
17
|
require_relative 'value/class'
|
18
18
|
require_relative 'value/module'
|
19
19
|
require_relative 'value/any'
|
20
|
+
require_relative 'value/time'
|
21
|
+
require_relative 'value/date'
|
22
|
+
require_relative 'value/date_time'
|
23
|
+
require_relative 'value/time_based'
|
24
|
+
require_relative 'value/enumerable'
|
25
|
+
require_relative 'value/comparable'
|
26
|
+
require_relative 'value/big_decimal'
|
20
27
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bigdecimal'
|
4
|
+
require 'bigdecimal/util'
|
5
|
+
|
6
|
+
# @api public
|
7
|
+
# @since 0.1.0
|
8
|
+
SmartCore::Types::Value.define_type(:BigDecimal) do |type|
|
9
|
+
type.define_checker do |value|
|
10
|
+
value.is_a?(::BigDecimal)
|
11
|
+
end
|
12
|
+
|
13
|
+
type.define_caster do |value|
|
14
|
+
if SmartCore::Types::Value::Float.valid?(value)
|
15
|
+
value = SmartCore::Types::Value::String.cast(value)
|
16
|
+
end
|
17
|
+
|
18
|
+
begin
|
19
|
+
::Kernel.BigDecimal(value)
|
20
|
+
rescue ::ArgumentError, ::TypeError
|
21
|
+
begin
|
22
|
+
::Kernel.BigDecimal(value.to_d)
|
23
|
+
rescue ::ArgumentError, ::TypeError, ::NoMethodError
|
24
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to BigDecimal')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
# @api public
|
6
|
+
# @since 0.1.0
|
7
|
+
SmartCore::Types::Value.define_type(:Date) do |type|
|
8
|
+
type.define_checker do |value|
|
9
|
+
value.is_a?(::Date) || value == ::Date::Infinity
|
10
|
+
end
|
11
|
+
|
12
|
+
type.define_caster do |value|
|
13
|
+
next value if value.is_a?(::Date) || value == ::Date::Infinity
|
14
|
+
|
15
|
+
begin
|
16
|
+
::Date.parse(value)
|
17
|
+
rescue ::Date::Error, ::TypeError
|
18
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Date')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
# @api public
|
6
|
+
# @since 0.1.0
|
7
|
+
SmartCore::Types::Value.define_type(:DateTime) do |type|
|
8
|
+
type.define_checker do |value|
|
9
|
+
value.is_a?(::DateTime) || value == ::DateTime::Infinity
|
10
|
+
end
|
11
|
+
|
12
|
+
type.define_caster do |value|
|
13
|
+
next value if value.is_a?(::DateTime) || value == ::DateTime::Infinity
|
14
|
+
|
15
|
+
begin
|
16
|
+
::DateTime.parse(value)
|
17
|
+
rescue ::Date::Error, ::TypeError
|
18
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to DateTime')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -9,9 +9,13 @@ SmartCore::Types::Value.define_type(:Float) do |type|
|
|
9
9
|
|
10
10
|
type.define_caster do |value|
|
11
11
|
begin
|
12
|
-
Float(value)
|
12
|
+
::Kernel.Float(value)
|
13
13
|
rescue ::TypeError, ::ArgumentError
|
14
|
-
|
14
|
+
begin
|
15
|
+
::Kernel.Float(value.to_f)
|
16
|
+
rescue ::NoMethodError, ::TypeError, ::ArgumentError
|
17
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Float')
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
@@ -11,7 +11,14 @@ SmartCore::Types::Value.define_type(:Hash) do |type|
|
|
11
11
|
begin
|
12
12
|
::Kernel.Hash(value)
|
13
13
|
rescue ::TypeError
|
14
|
-
|
14
|
+
begin
|
15
|
+
# NOTE:
|
16
|
+
# - ::Kernel.Hash does not invoke `#to_h` under the hood (it invokes `#to_hash`)
|
17
|
+
# - ::Kernel.Hash is used to validate the returned value from `#to_h`
|
18
|
+
::Kernel.Hash(value.to_h)
|
19
|
+
rescue ::TypeError, ::NoMethodError, ::ArgumentError
|
20
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Hash')
|
21
|
+
end
|
15
22
|
end
|
16
23
|
end
|
17
24
|
end
|
@@ -9,9 +9,16 @@ SmartCore::Types::Value.define_type(:Integer) do |type|
|
|
9
9
|
|
10
10
|
type.define_caster do |value|
|
11
11
|
begin
|
12
|
-
Integer(value)
|
13
|
-
rescue ::TypeError, ::ArgumentError
|
14
|
-
|
12
|
+
::Kernel.Integer(value)
|
13
|
+
rescue ::TypeError, ::ArgumentError, ::FloatDomainError
|
14
|
+
begin
|
15
|
+
# NOTE: for cases like this:
|
16
|
+
# => ::Kernel.Integer(nil) # => ::TypeError
|
17
|
+
# => ::Kernel.Integer(nil.to_i) # => 0 (::Kernel.Integer used as validation layer)
|
18
|
+
::Kernel.Integer(value.to_i)
|
19
|
+
rescue ::TypeError, ::NoMethodError, ::ArgumentError, ::FloatDomainError
|
20
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Integer')
|
21
|
+
end
|
15
22
|
end
|
16
23
|
end
|
17
24
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# @api public
|
4
|
+
# @since 0.1.0
|
3
5
|
SmartCore::Types::Value.define_type(:Nil) do |type|
|
4
6
|
type.define_checker do |value|
|
5
7
|
# rubocop:disable Style/NilComparison
|
6
|
-
value == nil # NOTE: #nil? is not used cuz BasicObject
|
8
|
+
value == nil # NOTE: #nil? is not used cuz BasicObject hasn't #nil? method
|
7
9
|
# rubocop:enable Style/NilComparison
|
8
10
|
end
|
9
11
|
end
|
@@ -8,10 +8,20 @@ SmartCore::Types::Value.define_type(:Numeric) do |type|
|
|
8
8
|
end
|
9
9
|
|
10
10
|
type.define_caster do |value|
|
11
|
+
next value if value.is_a?(::Numeric)
|
12
|
+
|
11
13
|
begin
|
12
|
-
Float(value)
|
13
|
-
rescue ::
|
14
|
-
|
14
|
+
SmartCore::Types::Value::Float.cast(value)
|
15
|
+
rescue SmartCore::Types::TypeCastingError
|
16
|
+
begin
|
17
|
+
SmartCore::Types::Value::Integer.cast(value)
|
18
|
+
rescue SmartCore::Types::TypeCastingError
|
19
|
+
begin
|
20
|
+
SmartCore::Types::Value::BigDecimal.cast(value)
|
21
|
+
rescue SmartCore::Types::TypeCastingError
|
22
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Numeric')
|
23
|
+
end
|
24
|
+
end
|
15
25
|
end
|
16
26
|
end
|
17
27
|
end
|
@@ -7,5 +7,15 @@ SmartCore::Types::Value.define_type(:Proc) do |type|
|
|
7
7
|
value.is_a?(::Proc)
|
8
8
|
end
|
9
9
|
|
10
|
-
type.define_caster
|
10
|
+
type.define_caster do |value|
|
11
|
+
begin
|
12
|
+
value.to_proc.tap do |result|
|
13
|
+
unless result.is_a?(::Proc)
|
14
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Proc')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
rescue ::NoMethodError
|
18
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Proc')
|
19
|
+
end
|
20
|
+
end
|
11
21
|
end
|
@@ -7,5 +7,11 @@ SmartCore::Types::Value.define_type(:String) do |type|
|
|
7
7
|
value.is_a?(::String)
|
8
8
|
end
|
9
9
|
|
10
|
-
type.define_caster
|
10
|
+
type.define_caster do |value|
|
11
|
+
begin
|
12
|
+
::Kernel.String(value)
|
13
|
+
rescue ::TypeError, ::ArgumentError
|
14
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to String')
|
15
|
+
end
|
16
|
+
end
|
11
17
|
end
|
@@ -7,5 +7,11 @@ SmartCore::Types::Value.define_type(:Symbol) do |type|
|
|
7
7
|
value.is_a?(::Symbol)
|
8
8
|
end
|
9
9
|
|
10
|
-
type.define_caster
|
10
|
+
type.define_caster do |value|
|
11
|
+
begin
|
12
|
+
value.to_sym
|
13
|
+
rescue ::NoMethodError, ::ArgumentError
|
14
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Symbol')
|
15
|
+
end
|
16
|
+
end
|
11
17
|
end
|
@@ -3,5 +3,21 @@
|
|
3
3
|
# @api public
|
4
4
|
# @since 0.1.0
|
5
5
|
SmartCore::Types::Value::Text = SmartCore::Types::System.type_sum(
|
6
|
-
SmartCore::Types::Value::String,
|
7
|
-
|
6
|
+
SmartCore::Types::Value::String,
|
7
|
+
SmartCore::Types::Value::Symbol
|
8
|
+
) do |type|
|
9
|
+
type.define_caster do |value|
|
10
|
+
next value if SmartCore::Types::Value::String.valid?(value)
|
11
|
+
next value if SmartCore::Types::Value::Symbol.valid?(value)
|
12
|
+
|
13
|
+
begin
|
14
|
+
SmartCore::Types::Value::String.cast(value)
|
15
|
+
rescue SmartCore::Types::TypeCastingError
|
16
|
+
begin
|
17
|
+
SmartCore::Types::Value::Symbol.cast(value)
|
18
|
+
rescue SmartCore::Types::TypeCastingError
|
19
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to text')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
# @api public
|
6
|
+
# @since 0.1.0
|
7
|
+
SmartCore::Types::Value.define_type(:Time) do |type|
|
8
|
+
type.define_checker do |value|
|
9
|
+
value.is_a?(::Time)
|
10
|
+
end
|
11
|
+
|
12
|
+
type.define_caster do |value|
|
13
|
+
next value if value.is_a?(::Time)
|
14
|
+
|
15
|
+
begin
|
16
|
+
SmartCore::Types::Value::Integer.valid?(value) ? ::Time.at(value) : ::Time.parse(value)
|
17
|
+
rescue ::TypeError, ::ArgumentError
|
18
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Time')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
# @since 0.1.0
|
5
|
+
SmartCore::Types::Value::TimeBased = SmartCore::Types::System.type_sum(
|
6
|
+
SmartCore::Types::Value::Time,
|
7
|
+
SmartCore::Types::Value::DateTime,
|
8
|
+
SmartCore::Types::Value::Date
|
9
|
+
) do |type|
|
10
|
+
type.define_caster do |value|
|
11
|
+
next value if SmartCore::Types::Value::Time.valid?(value)
|
12
|
+
next value if SmartCore::Types::Value::DateTime.valid?(value)
|
13
|
+
next value if SmartCore::Types::Value::Date.valid?(value)
|
14
|
+
|
15
|
+
begin
|
16
|
+
SmartCore::Types::Value::Time.cast(value)
|
17
|
+
rescue SmartCore::Types::TypeCastingError
|
18
|
+
begin
|
19
|
+
SmartCore::Types::Value::DateTime.cast(value)
|
20
|
+
rescue SmartCore::Types::TypeCastingError
|
21
|
+
begin
|
22
|
+
SmartCore::Types::Value::Date.cast(value)
|
23
|
+
rescue SmartCore::Types::TypeCastingError
|
24
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to time-based type')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/smart_types.gemspec
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require_relative 'lib/smart_core/types/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.
|
6
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.10')
|
7
7
|
|
8
8
|
spec.name = 'smart_types'
|
9
9
|
spec.version = SmartCore::Types::VERSION
|
@@ -32,11 +32,11 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
33
33
|
spec.require_paths = ['lib']
|
34
34
|
|
35
|
-
spec.add_dependency 'smart_engine', '~> 0.
|
35
|
+
spec.add_dependency 'smart_engine', '~> 0.6'
|
36
36
|
|
37
37
|
spec.add_development_dependency 'bundler', '~> 2.1'
|
38
38
|
spec.add_development_dependency 'rake', '~> 13.0'
|
39
39
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
40
|
-
spec.add_development_dependency 'armitage-rubocop', '~> 0.
|
41
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
40
|
+
spec.add_development_dependency 'armitage-rubocop', '~> 0.82'
|
41
|
+
spec.add_development_dependency 'simplecov', '~> 0.18'
|
42
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_types
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0
|
4
|
+
version: 0.1.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: 2020-
|
11
|
+
date: 2020-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: smart_engine
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.6'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,28 +72,28 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
75
|
+
version: '0.82'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
82
|
+
version: '0.82'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
89
|
+
version: '0.18'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
96
|
+
version: '0.18'
|
97
97
|
description: |
|
98
98
|
Full-featured type system for any ruby project. Supports custom type definitioning,
|
99
99
|
type validation, type casting and type categorizing. Provides a set of commonly used type
|
@@ -135,13 +135,16 @@ files:
|
|
135
135
|
- lib/smart_core/types/primitive/undefined_caster.rb
|
136
136
|
- lib/smart_core/types/struct.rb
|
137
137
|
- lib/smart_core/types/system.rb
|
138
|
-
- lib/smart_core/types/system/definition_dsl.rb
|
139
|
-
- lib/smart_core/types/system/producer_dsl.rb
|
140
138
|
- lib/smart_core/types/value.rb
|
141
139
|
- lib/smart_core/types/value/any.rb
|
142
140
|
- lib/smart_core/types/value/array.rb
|
141
|
+
- lib/smart_core/types/value/big_decimal.rb
|
143
142
|
- lib/smart_core/types/value/boolean.rb
|
144
143
|
- lib/smart_core/types/value/class.rb
|
144
|
+
- lib/smart_core/types/value/comparable.rb
|
145
|
+
- lib/smart_core/types/value/date.rb
|
146
|
+
- lib/smart_core/types/value/date_time.rb
|
147
|
+
- lib/smart_core/types/value/enumerable.rb
|
145
148
|
- lib/smart_core/types/value/float.rb
|
146
149
|
- lib/smart_core/types/value/hash.rb
|
147
150
|
- lib/smart_core/types/value/integer.rb
|
@@ -152,6 +155,8 @@ files:
|
|
152
155
|
- lib/smart_core/types/value/string.rb
|
153
156
|
- lib/smart_core/types/value/symbol.rb
|
154
157
|
- lib/smart_core/types/value/text.rb
|
158
|
+
- lib/smart_core/types/value/time.rb
|
159
|
+
- lib/smart_core/types/value/time_based.rb
|
155
160
|
- lib/smart_core/types/version.rb
|
156
161
|
- smart_types.gemspec
|
157
162
|
homepage: https://github.com/smart-rb/smart_types
|
@@ -169,12 +174,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
174
|
requirements:
|
170
175
|
- - ">="
|
171
176
|
- !ruby/object:Gem::Version
|
172
|
-
version: 2.4.
|
177
|
+
version: 2.4.10
|
173
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
179
|
requirements:
|
175
|
-
- - "
|
180
|
+
- - ">="
|
176
181
|
- !ruby/object:Gem::Version
|
177
|
-
version:
|
182
|
+
version: '0'
|
178
183
|
requirements: []
|
179
184
|
rubygems_version: 3.1.2
|
180
185
|
signing_key:
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.1.0
|
5
|
-
module SmartCore::Types::System::DefinitionDSL
|
6
|
-
class << self
|
7
|
-
# @param base_klass [Class]
|
8
|
-
# @return [void]
|
9
|
-
#
|
10
|
-
# @api private
|
11
|
-
# @since 0.1.0
|
12
|
-
def included(base_klass)
|
13
|
-
base_klass.extend(ClassMethods)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# @api private
|
18
|
-
# @since 0.1.0
|
19
|
-
module ClassMethods
|
20
|
-
# @param types [Array<SmartCore::Types::Pirmitive>]
|
21
|
-
# @param type_definition [Block]
|
22
|
-
# @return [SmartCore::Types::Primitive]
|
23
|
-
#
|
24
|
-
# @api public
|
25
|
-
# @since 0.1.0
|
26
|
-
def type_sum(*types, &type_definition)
|
27
|
-
SmartCore::Types::Primitive::SumFactory.create_type(types, type_definition)
|
28
|
-
end
|
29
|
-
|
30
|
-
# @param types [Array<SmartCore::Types::Pirmitive>]
|
31
|
-
# @param type_definition [Block]
|
32
|
-
# @return [SmartCore::Types::Primitive]
|
33
|
-
#
|
34
|
-
# @api public
|
35
|
-
# @since 0.1.0
|
36
|
-
def type_mult(*types, &type_definition)
|
37
|
-
SmartCore::Types::Primitive::MultFactory.create_type(types, type_definition)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.1.0
|
5
|
-
module SmartCore::Types::System::ProducerDSL
|
6
|
-
class << self
|
7
|
-
# @param base_klass [Class<SmartCore::Types::Primitive>]
|
8
|
-
# @return [void]
|
9
|
-
#
|
10
|
-
# @api private
|
11
|
-
# @since 0.1.0
|
12
|
-
def included(base_klass)
|
13
|
-
base_klass.extend(ClassMethods)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# @api private
|
18
|
-
# @since 0.1.0
|
19
|
-
module ClassMethods
|
20
|
-
# @param type_name [String, Symbol]
|
21
|
-
# @param type_definition [Block]
|
22
|
-
# @return [SmartCore::Types::Primitive]
|
23
|
-
#
|
24
|
-
# @api public
|
25
|
-
# @since 0.1.0
|
26
|
-
def define_type(type_name, &type_definition)
|
27
|
-
self::Factory.create_type(self, type_name, type_definition)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|