smart_types 0.1.0.alpha5 → 0.4.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 +10 -1
- data/CHANGELOG.md +46 -0
- data/Gemfile.lock +80 -52
- data/README.md +437 -27
- data/Rakefile +1 -1
- data/bin/console +2 -2
- data/lib/smart_core/types.rb +2 -0
- data/lib/smart_core/types/errors.rb +16 -0
- data/lib/smart_core/types/primitive.rb +109 -24
- data/lib/smart_core/types/primitive/caster.rb +5 -2
- data/lib/smart_core/types/primitive/checker.rb +5 -2
- data/lib/smart_core/types/primitive/factory.rb +105 -8
- data/lib/smart_core/types/primitive/factory/definition_context.rb +142 -6
- data/lib/smart_core/types/primitive/factory/runtime_type_builder.rb +53 -0
- data/lib/smart_core/types/primitive/invariant_control.rb +67 -0
- data/lib/smart_core/types/primitive/invariant_control/chain.rb +61 -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 +57 -0
- data/lib/smart_core/types/primitive/invariant_control/single/result.rb +63 -0
- data/lib/smart_core/types/primitive/mult_factory.rb +59 -10
- data/lib/smart_core/types/primitive/mult_factory/definition_context.rb +27 -3
- data/lib/smart_core/types/primitive/mult_validator.rb +42 -0
- data/lib/smart_core/types/primitive/mult_validator/result.rb +8 -0
- data/lib/smart_core/types/primitive/nilable_factory.rb +31 -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/runtime_attributes_checker.rb +77 -0
- data/lib/smart_core/types/primitive/sum_factory.rb +59 -10
- data/lib/smart_core/types/primitive/sum_factory/definition_context.rb +26 -2
- data/lib/smart_core/types/primitive/sum_validator.rb +117 -0
- data/lib/smart_core/types/primitive/sum_validator/result.rb +100 -0
- data/lib/smart_core/types/primitive/undefined_caster.rb +7 -5
- data/lib/smart_core/types/primitive/validator.rb +93 -0
- data/lib/smart_core/types/primitive/validator/result.rb +78 -0
- data/lib/smart_core/types/protocol.rb +7 -0
- data/lib/smart_core/types/protocol/instance_of.rb +19 -0
- data/lib/smart_core/types/system.rb +21 -5
- data/lib/smart_core/types/value.rb +16 -0
- data/lib/smart_core/types/value/array.rb +3 -0
- data/lib/smart_core/types/value/big_decimal.rb +31 -0
- data/lib/smart_core/types/value/boolean.rb +3 -0
- data/lib/smart_core/types/value/class.rb +3 -0
- data/lib/smart_core/types/value/comparable.rb +13 -0
- data/lib/smart_core/types/value/date.rb +24 -0
- data/lib/smart_core/types/value/date_time.rb +24 -0
- data/lib/smart_core/types/value/enumerable.rb +13 -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/float.rb +9 -2
- data/lib/smart_core/types/value/hash.rb +11 -1
- data/lib/smart_core/types/value/integer.rb +13 -3
- 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/module.rb +3 -0
- data/lib/smart_core/types/value/nil.rb +3 -3
- data/lib/smart_core/types/value/numeric.rb +16 -3
- data/lib/smart_core/types/value/proc.rb +14 -1
- 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 +21 -0
- data/lib/smart_core/types/value/string.rb +10 -1
- data/lib/smart_core/types/value/string_io.rb +15 -0
- data/lib/smart_core/types/value/symbol.rb +10 -1
- data/lib/smart_core/types/value/text.rb +21 -4
- data/lib/smart_core/types/value/time.rb +24 -0
- data/lib/smart_core/types/value/time_based.rb +32 -0
- data/lib/smart_core/types/value/unbound_method.rb +9 -0
- data/lib/smart_core/types/variadic.rb +7 -0
- data/lib/smart_core/types/variadic/tuple.rb +23 -0
- data/lib/smart_core/types/version.rb +2 -2
- data/smart_types.gemspec +6 -5
- metadata +69 -23
- data/.travis.yml +0 -20
- 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
- data/lib/smart_core/types/system/definition_dsl.rb +0 -40
- data/lib/smart_core/types/system/producer_dsl.rb +0 -30
@@ -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
|
@@ -5,6 +5,7 @@
|
|
5
5
|
class SmartCore::Types::Value < SmartCore::Types::Primitive
|
6
6
|
require_relative 'value/nil'
|
7
7
|
require_relative 'value/string'
|
8
|
+
require_relative 'value/string_io'
|
8
9
|
require_relative 'value/symbol'
|
9
10
|
require_relative 'value/text'
|
10
11
|
require_relative 'value/integer'
|
@@ -13,8 +14,23 @@ class SmartCore::Types::Value < SmartCore::Types::Primitive
|
|
13
14
|
require_relative 'value/boolean'
|
14
15
|
require_relative 'value/array'
|
15
16
|
require_relative 'value/hash'
|
17
|
+
require_relative 'value/io'
|
16
18
|
require_relative 'value/proc'
|
17
19
|
require_relative 'value/class'
|
18
20
|
require_relative 'value/module'
|
19
21
|
require_relative 'value/any'
|
22
|
+
require_relative 'value/time'
|
23
|
+
require_relative 'value/date'
|
24
|
+
require_relative 'value/date_time'
|
25
|
+
require_relative 'value/time_based'
|
26
|
+
require_relative 'value/enumerable'
|
27
|
+
require_relative 'value/enumerator'
|
28
|
+
require_relative 'value/enumerator_chain'
|
29
|
+
require_relative 'value/comparable'
|
30
|
+
require_relative 'value/big_decimal'
|
31
|
+
require_relative 'value/range'
|
32
|
+
require_relative 'value/method'
|
33
|
+
require_relative 'value/unbound_method'
|
34
|
+
require_relative 'value/set'
|
35
|
+
require_relative 'value/rational'
|
20
36
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bigdecimal'
|
4
|
+
require 'bigdecimal/util'
|
5
|
+
|
6
|
+
using SmartCore::Ext::BasicObjectAsObject
|
7
|
+
|
8
|
+
# @api public
|
9
|
+
# @since 0.1.0
|
10
|
+
# @version 0.3.0
|
11
|
+
SmartCore::Types::Value.define_type(:BigDecimal) do |type|
|
12
|
+
type.define_checker do |value|
|
13
|
+
value.is_a?(::BigDecimal)
|
14
|
+
end
|
15
|
+
|
16
|
+
type.define_caster do |value|
|
17
|
+
if SmartCore::Types::Value::Numeric.valid?(value)
|
18
|
+
value = SmartCore::Types::Value::String.cast(value)
|
19
|
+
end
|
20
|
+
|
21
|
+
begin
|
22
|
+
::Kernel.BigDecimal(value)
|
23
|
+
rescue ::ArgumentError, ::TypeError
|
24
|
+
begin
|
25
|
+
::Kernel.BigDecimal(value.to_d)
|
26
|
+
rescue ::ArgumentError, ::TypeError, ::NoMethodError
|
27
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to BigDecimal')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
using SmartCore::Ext::BasicObjectAsObject
|
4
|
+
|
3
5
|
# @api public
|
4
6
|
# @since 0.1.0
|
7
|
+
# @version 0.3.0
|
5
8
|
SmartCore::Types::Value.define_type(:Boolean) do |type|
|
6
9
|
type.define_checker do |value|
|
7
10
|
value.is_a?(::TrueClass) || value.is_a?(::FalseClass)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
using SmartCore::Ext::BasicObjectAsObject
|
6
|
+
|
7
|
+
# @api public
|
8
|
+
# @since 0.1.0
|
9
|
+
# @version 0.3.0
|
10
|
+
SmartCore::Types::Value.define_type(:Date) do |type|
|
11
|
+
type.define_checker do |value|
|
12
|
+
value.is_a?(::Date) || value == ::Date::Infinity
|
13
|
+
end
|
14
|
+
|
15
|
+
type.define_caster do |value|
|
16
|
+
next value if value.is_a?(::Date) || value == ::Date::Infinity
|
17
|
+
|
18
|
+
begin
|
19
|
+
::Date.parse(value)
|
20
|
+
rescue ::Date::Error, ::TypeError
|
21
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Date')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
using SmartCore::Ext::BasicObjectAsObject
|
6
|
+
|
7
|
+
# @api public
|
8
|
+
# @since 0.1.0
|
9
|
+
# @version 0.3.0
|
10
|
+
SmartCore::Types::Value.define_type(:DateTime) do |type|
|
11
|
+
type.define_checker do |value|
|
12
|
+
value.is_a?(::DateTime) || value == ::DateTime::Infinity
|
13
|
+
end
|
14
|
+
|
15
|
+
type.define_caster do |value|
|
16
|
+
next value if value.is_a?(::DateTime) || value == ::DateTime::Infinity
|
17
|
+
|
18
|
+
begin
|
19
|
+
::DateTime.parse(value)
|
20
|
+
rescue ::Date::Error, ::TypeError
|
21
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to DateTime')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
# @since 0.x.0
|
5
|
+
SmartCore::Types::Value.define_type(:EnumeratorChain) do |type|
|
6
|
+
type.define_checker do |value|
|
7
|
+
# TODO: realize
|
8
|
+
end
|
9
|
+
|
10
|
+
type.define_caster do |value|
|
11
|
+
# TODO: realize
|
12
|
+
end
|
13
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
using SmartCore::Ext::BasicObjectAsObject
|
4
|
+
|
3
5
|
# @api public
|
4
6
|
# @since 0.1.0
|
7
|
+
# @version 0.3.0
|
5
8
|
SmartCore::Types::Value.define_type(:Float) do |type|
|
6
9
|
type.define_checker do |value|
|
7
10
|
value.is_a?(::Float)
|
@@ -9,9 +12,13 @@ SmartCore::Types::Value.define_type(:Float) do |type|
|
|
9
12
|
|
10
13
|
type.define_caster do |value|
|
11
14
|
begin
|
12
|
-
Float(value)
|
15
|
+
::Kernel.Float(value)
|
13
16
|
rescue ::TypeError, ::ArgumentError
|
14
|
-
|
17
|
+
begin
|
18
|
+
::Kernel.Float(value.to_f)
|
19
|
+
rescue ::NoMethodError, ::TypeError, ::ArgumentError
|
20
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Float')
|
21
|
+
end
|
15
22
|
end
|
16
23
|
end
|
17
24
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
using SmartCore::Ext::BasicObjectAsObject
|
4
|
+
|
3
5
|
# @api public
|
4
6
|
# @since 0.1.0
|
7
|
+
# @version 0.3.0
|
5
8
|
SmartCore::Types::Value.define_type(:Hash) do |type|
|
6
9
|
type.define_checker do |value|
|
7
10
|
value.is_a?(::Hash)
|
@@ -11,7 +14,14 @@ SmartCore::Types::Value.define_type(:Hash) do |type|
|
|
11
14
|
begin
|
12
15
|
::Kernel.Hash(value)
|
13
16
|
rescue ::TypeError
|
14
|
-
|
17
|
+
begin
|
18
|
+
# NOTE:
|
19
|
+
# - ::Kernel.Hash does not invoke `#to_h` under the hood (it invokes `#to_hash`)
|
20
|
+
# - ::Kernel.Hash is used to validate the returned value from `#to_h`
|
21
|
+
::Kernel.Hash(value.to_h)
|
22
|
+
rescue ::TypeError, ::NoMethodError, ::ArgumentError
|
23
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Hash')
|
24
|
+
end
|
15
25
|
end
|
16
26
|
end
|
17
27
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
using SmartCore::Ext::BasicObjectAsObject
|
4
|
+
|
3
5
|
# @api public
|
4
6
|
# @since 0.1.0
|
7
|
+
# @version 0.3.0
|
5
8
|
SmartCore::Types::Value.define_type(:Integer) do |type|
|
6
9
|
type.define_checker do |value|
|
7
10
|
value.is_a?(::Integer)
|
@@ -9,9 +12,16 @@ SmartCore::Types::Value.define_type(:Integer) do |type|
|
|
9
12
|
|
10
13
|
type.define_caster do |value|
|
11
14
|
begin
|
12
|
-
Integer(value)
|
13
|
-
rescue ::TypeError, ::ArgumentError
|
14
|
-
|
15
|
+
::Kernel.Integer(value)
|
16
|
+
rescue ::TypeError, ::ArgumentError, ::FloatDomainError
|
17
|
+
begin
|
18
|
+
# NOTE: for cases like this:
|
19
|
+
# => ::Kernel.Integer(nil) # => ::TypeError
|
20
|
+
# => ::Kernel.Integer(nil.to_i) # => 0 (::Kernel.Integer used as validation layer)
|
21
|
+
::Kernel.Integer(value.to_i)
|
22
|
+
rescue ::TypeError, ::NoMethodError, ::ArgumentError, ::FloatDomainError
|
23
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Integer')
|
24
|
+
end
|
15
25
|
end
|
16
26
|
end
|
17
27
|
end
|
@@ -1,9 +1,9 @@
|
|
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
|
-
#
|
6
|
-
value == nil # NOTE: #nil? is not used cuz BasicObject has no #nil? method
|
7
|
-
# rubocop:enable Style/NilComparison
|
7
|
+
value == nil # NOTE: #nil? is not used cuz BasicObject hasn't #nil? method
|
8
8
|
end
|
9
9
|
end
|
@@ -1,17 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
using SmartCore::Ext::BasicObjectAsObject
|
4
|
+
|
3
5
|
# @api public
|
4
6
|
# @since 0.1.0
|
7
|
+
# @version 0.3.0
|
5
8
|
SmartCore::Types::Value.define_type(:Numeric) do |type|
|
6
9
|
type.define_checker do |value|
|
7
10
|
value.is_a?(::Numeric)
|
8
11
|
end
|
9
12
|
|
10
13
|
type.define_caster do |value|
|
14
|
+
next value if value.is_a?(::Numeric)
|
15
|
+
|
11
16
|
begin
|
12
|
-
Float(value)
|
13
|
-
rescue ::
|
14
|
-
|
17
|
+
SmartCore::Types::Value::Float.cast(value)
|
18
|
+
rescue SmartCore::Types::TypeCastingError
|
19
|
+
begin
|
20
|
+
SmartCore::Types::Value::Integer.cast(value)
|
21
|
+
rescue SmartCore::Types::TypeCastingError
|
22
|
+
begin
|
23
|
+
SmartCore::Types::Value::BigDecimal.cast(value)
|
24
|
+
rescue SmartCore::Types::TypeCastingError
|
25
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Numeric')
|
26
|
+
end
|
27
|
+
end
|
15
28
|
end
|
16
29
|
end
|
17
30
|
end
|
@@ -1,11 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
using SmartCore::Ext::BasicObjectAsObject
|
4
|
+
|
3
5
|
# @api public
|
4
6
|
# @since 0.1.0
|
7
|
+
# @version 0.3.0
|
5
8
|
SmartCore::Types::Value.define_type(:Proc) do |type|
|
6
9
|
type.define_checker do |value|
|
7
10
|
value.is_a?(::Proc)
|
8
11
|
end
|
9
12
|
|
10
|
-
type.define_caster
|
13
|
+
type.define_caster do |value|
|
14
|
+
begin
|
15
|
+
value.to_proc.tap do |result|
|
16
|
+
unless result.is_a?(::Proc)
|
17
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Proc')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
rescue ::NoMethodError
|
21
|
+
raise(SmartCore::Types::TypeCastingError, 'Non-castable to Proc')
|
22
|
+
end
|
23
|
+
end
|
11
24
|
end
|