smart_types 0.1.0 → 0.2.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 +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
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
|
-
class SmartCore::Types::Primitive::
|
5
|
+
class SmartCore::Types::Primitive::MultFactory::DefinitionContext
|
6
6
|
# @return [Proc, NilClass]
|
7
7
|
#
|
8
8
|
# @api private
|
@@ -23,7 +23,9 @@ class SmartCore::Types::Primitive::Factory::DefinitionContext
|
|
23
23
|
# @api public
|
24
24
|
# @since 0.1.0
|
25
25
|
def define_caster(&caster)
|
26
|
-
raise(SmartCore::ArgumentError, 'No caster definition block') unless block_given?
|
26
|
+
raise(SmartCore::Types::ArgumentError, 'No caster definition block') unless block_given?
|
27
27
|
@type_caster = caster
|
28
28
|
end
|
29
|
+
|
30
|
+
# TODO (0.x.0): invariant API
|
29
31
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.2.0
|
5
|
+
class SmartCore::Types::Primitive::MultValidator < SmartCore::Types::Primitive::SumValidator
|
6
|
+
require_relative 'mult_validator/result'
|
7
|
+
|
8
|
+
# @overload validate(value)
|
9
|
+
# @param value [Any]
|
10
|
+
# @return [SmartCore::Types::Primitive::MultValidator::Result]
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
# @since 0.2.0
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# @param validation [Block]
|
18
|
+
# @yieldparam [void]
|
19
|
+
# @yieldreturn [SmartCore::Engine::Atom]
|
20
|
+
# @return [SmartCore::Types::Primitive::MultValidator::Result]
|
21
|
+
#
|
22
|
+
# @api private
|
23
|
+
# @since 0.2.0
|
24
|
+
def compile_validation_result(&validation)
|
25
|
+
# NOTE: at this moment type sum does not support invariant checking
|
26
|
+
# TODO (0.x.0):
|
27
|
+
# @yieldreturn [SmartCore::Types::Primitive::Validator::Result]
|
28
|
+
# => and:
|
29
|
+
# SmartCore::Types::Primitive::MultValidator::Result.new(
|
30
|
+
# type, final_result.value, final_result.value.invariant_errors
|
31
|
+
# )
|
32
|
+
SmartCore::Types::Primitive::MultValidator::Result.new(type, yield.value)
|
33
|
+
end
|
34
|
+
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
|
+
# @version 0.2.0
|
5
6
|
module SmartCore::Types::Primitive::NilableFactory
|
6
7
|
class << self
|
7
8
|
# @param type [SmartCore::Types::Primitive]
|
@@ -9,21 +10,24 @@ module SmartCore::Types::Primitive::NilableFactory
|
|
9
10
|
#
|
10
11
|
# @api private
|
11
12
|
# @since 0.1.0
|
13
|
+
# @version 0.2.0
|
12
14
|
def create_type(type)
|
13
|
-
|
15
|
+
type_validator = build_type_validator(type)
|
14
16
|
type_caster = build_type_caster(type)
|
15
|
-
build_type(type,
|
17
|
+
build_type(type, type_validator, type_caster).tap do |new_type|
|
18
|
+
assign_type_validator(new_type, type_validator)
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
private
|
19
23
|
|
20
24
|
# @param type [SmartCore::Types::Primitive]
|
21
|
-
# @return [SmartCore::Types::Primitive::
|
25
|
+
# @return [SmartCore::Types::Primitive::NilableValidator]
|
22
26
|
#
|
23
27
|
# @api private
|
24
|
-
# @since 0.
|
25
|
-
def
|
26
|
-
SmartCore::Types::Primitive::
|
28
|
+
# @since 0.2.0
|
29
|
+
def build_type_validator(type)
|
30
|
+
SmartCore::Types::Primitive::NilableValidator.new(type.validator)
|
27
31
|
end
|
28
32
|
|
29
33
|
# @param type [SmartCore::Types::Primitive]
|
@@ -36,14 +40,25 @@ module SmartCore::Types::Primitive::NilableFactory
|
|
36
40
|
end
|
37
41
|
|
38
42
|
# @param type [SmartCore::Types::Primitive]
|
39
|
-
# @param
|
43
|
+
# @param type_validator [SmartCore::Types::Primitive::NilableValidator]
|
44
|
+
# @return [void]
|
45
|
+
#
|
46
|
+
# @api private
|
47
|
+
# @since 0.2.0
|
48
|
+
def assign_type_validator(type, type_validator)
|
49
|
+
type_validator.___assign_type___(type)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param type [SmartCore::Types::Primitive]
|
53
|
+
# @param type_validator [SmartCore::Types::Primitive::NilableValidator]
|
40
54
|
# @param type_caster [SmartCore::Types::Caster]
|
41
55
|
# @return [SmartCore::Type::Primitive]
|
42
56
|
#
|
43
57
|
# @api private
|
44
58
|
# @since 0.1.0
|
45
|
-
|
46
|
-
|
59
|
+
# @version 0.2.0
|
60
|
+
def build_type(type, type_validator, type_caster)
|
61
|
+
Class.new(type.class).new(type.name, type_validator, type_caster)
|
47
62
|
end
|
48
63
|
end
|
49
64
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.2.0
|
5
|
+
class SmartCore::Types::Primitive::NilableValidator
|
6
|
+
require_relative 'nilable_validator/result'
|
7
|
+
|
8
|
+
# @param validator [
|
9
|
+
# SmartCore::Types::Primitive::Validator,
|
10
|
+
# SmartCore::Types::Primitive::SumValidator,
|
11
|
+
# SmartCore::Types::Primitive::MultValidator,
|
12
|
+
# SmartCore::Types::Primitive::NilableValidator
|
13
|
+
# ]
|
14
|
+
# @return [void]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
# @since 0.2.0
|
18
|
+
def initialize(validator)
|
19
|
+
@type = nil
|
20
|
+
@validator = validator
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param type [SmartCore::Types::Primitive]
|
24
|
+
# @return [void]
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
# @since 0.2.0
|
28
|
+
def ___assign_type___(type)
|
29
|
+
@type = type
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Boolean]
|
33
|
+
#
|
34
|
+
# @api private
|
35
|
+
# @since 0.2.0
|
36
|
+
def valid?(value)
|
37
|
+
value == nil ? true : validator.valid?(value)
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param value [Any]
|
41
|
+
# @return [SmartCore::Types::Primitive::Validator::Result]
|
42
|
+
# @return [SmartCore::Types::Primitive::SumValidator::Result]
|
43
|
+
# @return [SmartCore::Types::Primitive::MultValidator::Result]
|
44
|
+
# @return [SmartCore::Types::Primitive::NilableValidator::Result]
|
45
|
+
#
|
46
|
+
# @api private
|
47
|
+
# @since 0.2.0
|
48
|
+
def validate(value)
|
49
|
+
return Result.new(type, value) if value == nil
|
50
|
+
validator.validate(value)
|
51
|
+
end
|
52
|
+
|
53
|
+
# @param value [Any]
|
54
|
+
# @return [void]
|
55
|
+
#
|
56
|
+
# @raise [SmartCore::Types::TypeError]
|
57
|
+
#
|
58
|
+
# @api private
|
59
|
+
# @since 0.2.0
|
60
|
+
def validate!(value)
|
61
|
+
return if valid?(value)
|
62
|
+
raise(SmartCore::Types::TypeError, 'Invalid type')
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
# @return [SmartCore::Types::Primitive]
|
68
|
+
#
|
69
|
+
# @api private
|
70
|
+
# @since 0.2.0
|
71
|
+
attr_reader :type
|
72
|
+
|
73
|
+
# @return [
|
74
|
+
# SmartCore::Types::Primitive::Validator,
|
75
|
+
# SmartCore::Types::Primitive::SumValidator,
|
76
|
+
# SmartCore::Types::Primitive::MultValidator,
|
77
|
+
# SmartCore::Types::Primitive::NilableValidator
|
78
|
+
# ]
|
79
|
+
#
|
80
|
+
# @api private
|
81
|
+
# @since 0.2.0
|
82
|
+
attr_reader :validator
|
83
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.2.0
|
5
|
+
class SmartCore::Types::Primitive::NilableValidator::Result
|
6
|
+
# @return [Array]
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
# @since 0.2.0
|
10
|
+
NO_INVARIANT_ERRORS = [].freeze
|
11
|
+
|
12
|
+
# @return [SmartCore::Types::Primitive]
|
13
|
+
#
|
14
|
+
# @api public
|
15
|
+
# @since 0.2.0
|
16
|
+
attr_reader :type
|
17
|
+
|
18
|
+
# @return [Any]
|
19
|
+
#
|
20
|
+
# @api public
|
21
|
+
# @since 0.2.0
|
22
|
+
attr_reader :checked_value
|
23
|
+
alias_method :value, :checked_value
|
24
|
+
|
25
|
+
# @param type [SmartCore::Types::Primitive]
|
26
|
+
# @param checked_value [Any]
|
27
|
+
# @return [void]
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
# @since 0.2.0
|
31
|
+
def initialize(type, checked_value)
|
32
|
+
@type = type
|
33
|
+
@checked_value = checked_value
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Boolean]
|
37
|
+
#
|
38
|
+
# @api public
|
39
|
+
# @since 0.2.0
|
40
|
+
def is_valid_check
|
41
|
+
true
|
42
|
+
end
|
43
|
+
alias_method :valid_check?, :is_valid_check
|
44
|
+
|
45
|
+
# @return [Array]
|
46
|
+
#
|
47
|
+
# @api public
|
48
|
+
# @since 0.2.0
|
49
|
+
def invariant_errors
|
50
|
+
NO_INVARIANT_ERRORS
|
51
|
+
end
|
52
|
+
alias_method :errors, :invariant_errors
|
53
|
+
alias_method :error_codes, :invariant_errors
|
54
|
+
|
55
|
+
# @return [Boolean]
|
56
|
+
#
|
57
|
+
# @api public
|
58
|
+
# @since 0.2.0
|
59
|
+
def valid_invariants?
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Boolean]
|
64
|
+
#
|
65
|
+
# @api public
|
66
|
+
# @since 0.2.0
|
67
|
+
def success?
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
# @return [Boolean]
|
72
|
+
#
|
73
|
+
# @api public
|
74
|
+
# @since 0.2.0
|
75
|
+
def failure?
|
76
|
+
false
|
77
|
+
end
|
78
|
+
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
|
+
# @version 0.2.0
|
5
6
|
module SmartCore::Types::Primitive::SumFactory
|
6
7
|
require_relative 'sum_factory/definition_context'
|
7
8
|
|
@@ -12,11 +13,14 @@ module SmartCore::Types::Primitive::SumFactory
|
|
12
13
|
#
|
13
14
|
# @api private
|
14
15
|
# @since 0.1.0
|
16
|
+
# @version 0.2.0
|
15
17
|
def create_type(types, type_definition)
|
16
18
|
type_definitions = build_type_definitions(type_definition)
|
17
|
-
|
19
|
+
type_validator = build_type_validator(types, type_definitions)
|
18
20
|
type_caster = build_type_caster(types, type_definitions)
|
19
|
-
build_type(
|
21
|
+
build_type(type_validator, type_caster).tap do |type|
|
22
|
+
assign_type_validator(type, type_validator)
|
23
|
+
end
|
20
24
|
end
|
21
25
|
|
22
26
|
private
|
@@ -34,12 +38,12 @@ module SmartCore::Types::Primitive::SumFactory
|
|
34
38
|
|
35
39
|
# @param types [Array<SmartCore::Types::Primtive>]
|
36
40
|
# @param type_definitions [SmartCore::Types::Primitive::SumFactory::DefinitionContext]
|
37
|
-
# @return [SmartCore::Types::Primitive::
|
41
|
+
# @return [SmartCore::Types::Primitive::SumValidator]
|
38
42
|
#
|
39
43
|
# @api private
|
40
|
-
# @since 0.
|
41
|
-
def
|
42
|
-
SmartCore::Types::Primitive::
|
44
|
+
# @since 0.2.0
|
45
|
+
def build_type_validator(types, type_definitions)
|
46
|
+
SmartCore::Types::Primitive::SumValidator.new(*types.map(&:validator))
|
43
47
|
end
|
44
48
|
|
45
49
|
# @param types [Array<SmartCore::Types::Primtive>]
|
@@ -49,21 +53,32 @@ module SmartCore::Types::Primitive::SumFactory
|
|
49
53
|
# @api private
|
50
54
|
# @since 0.1.0
|
51
55
|
def build_type_caster(types, type_definitions)
|
52
|
-
if type_definitions.type_caster
|
56
|
+
if type_definitions.type_caster == nil
|
53
57
|
SmartCore::Types::Primitive::UndefinedCaster.new
|
54
58
|
else
|
55
59
|
SmartCore::Types::Primitive::Caster.new(type_definitions.type_caster)
|
56
60
|
end
|
57
61
|
end
|
58
62
|
|
59
|
-
# @param
|
63
|
+
# @param type [SmartCore::Types::Primitive]
|
64
|
+
# @param type_validator [SmartCore::Types::Primitive::SumValidator]
|
65
|
+
# @return [void]
|
66
|
+
#
|
67
|
+
# @api private
|
68
|
+
# @since 0.2.0
|
69
|
+
def assign_type_validator(type, type_validator)
|
70
|
+
type_validator.___assign_type___(type)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @param type_validator [SmartCore::Types::Primitive::SumValidator)]
|
60
74
|
# @param type_caster [SmartCore::Types::Primitive::Caster]
|
61
75
|
# @return [SmartCore::Types::Primitive]
|
62
76
|
#
|
63
77
|
# @api private
|
64
78
|
# @since 0.1.0
|
65
|
-
|
66
|
-
|
79
|
+
# @version 0.2.0
|
80
|
+
def build_type(type_validator, type_caster)
|
81
|
+
SmartCore::Types::Primitive.new(nil, type_validator, type_caster)
|
67
82
|
end
|
68
83
|
end
|
69
84
|
end
|
@@ -23,7 +23,9 @@ class SmartCore::Types::Primitive::SumFactory::DefinitionContext
|
|
23
23
|
# @api public
|
24
24
|
# @since 0.1.0
|
25
25
|
def define_caster(&caster)
|
26
|
-
raise(SmartCore::ArgumentError, 'No caster definition block') unless block_given?
|
26
|
+
raise(SmartCore::Types::ArgumentError, 'No caster definition block') unless block_given?
|
27
27
|
@type_caster = caster
|
28
28
|
end
|
29
|
+
|
30
|
+
# TODO (0.x.0): invariant API
|
29
31
|
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.2.0
|
5
|
+
class SmartCore::Types::Primitive::SumValidator
|
6
|
+
require_relative 'sum_validator/result'
|
7
|
+
|
8
|
+
# @param validators [Array<SmartCore::Types::Primitive::Validator>]
|
9
|
+
# @return [void]
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
# @since 0.2.0
|
13
|
+
def initialize(*validators)
|
14
|
+
@type = nil
|
15
|
+
@validators = validators
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param type [SmartCore::Types::Primitive]
|
19
|
+
# @return [void]
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
# @since 0.2.0
|
23
|
+
def ___assign_type___(type)
|
24
|
+
@type = type
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Boolean]
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
# @since 0.2.0
|
31
|
+
def valid?(value)
|
32
|
+
# NOTE: at this moment type sum does not support invariant checking
|
33
|
+
# TODO (0.x.0):
|
34
|
+
# validators.any? { |validator| validator.valid?(value) }
|
35
|
+
validators.any? { |validator| validator.type_checker.call(value) }
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param value [Any]
|
39
|
+
# @return [SmartCore::Types::Primitive::SumValidator::Result]
|
40
|
+
#
|
41
|
+
# @api private
|
42
|
+
# @since 0.2.0
|
43
|
+
def validate(value)
|
44
|
+
compile_validation_result do
|
45
|
+
SmartCore::Engine::Atom.new.tap do |result|
|
46
|
+
validators.each do |validator|
|
47
|
+
# NOTE: at this moment type sum does not support invariant checking
|
48
|
+
# TODO (0.x.0):
|
49
|
+
# result.swap { validator.validate(value) }
|
50
|
+
# break if result.value.success?
|
51
|
+
result.swap { validator.type_checker.call(value) }
|
52
|
+
break if result.value # => boolean
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @param value [Any]
|
59
|
+
# @return [void]
|
60
|
+
#
|
61
|
+
# @raise [SmartCore::Types::TypeError]
|
62
|
+
#
|
63
|
+
# @api private
|
64
|
+
# @since 0.2.0
|
65
|
+
def validate!(value)
|
66
|
+
return if valid?(value)
|
67
|
+
raise(SmartCore::Types::TypeError, 'Invalid type')
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
# @return [SmartCore::Types::Primitive]
|
73
|
+
#
|
74
|
+
# @api private
|
75
|
+
# @since 0.2.0
|
76
|
+
attr_reader :type
|
77
|
+
|
78
|
+
# @return [Array<SmartCore::Types::Primitive::Validator>]
|
79
|
+
#
|
80
|
+
# @api private
|
81
|
+
# @since 0.2.0
|
82
|
+
attr_reader :validators
|
83
|
+
|
84
|
+
# @param validation [Block]
|
85
|
+
# @yieldparam [void]
|
86
|
+
# @yieldreturn [SmartCore::Engine::Atom]
|
87
|
+
# @return [SmartCore::Types::Primitive::SumValidator::Result]
|
88
|
+
#
|
89
|
+
# @api private
|
90
|
+
# @since 0.2.0
|
91
|
+
def compile_validation_result(&validation)
|
92
|
+
# NOTE: at this moment type sum does not support invariant checking
|
93
|
+
# TODO (0.x.0):
|
94
|
+
# @yieldreturn [SmartCore::Types::Primitive::Validator::Result]
|
95
|
+
# => and:
|
96
|
+
# SmartCore::Types::Primitive::SumValidator::Result.new(
|
97
|
+
# type, final_result.value, final_result.value.invariant_errors
|
98
|
+
# )
|
99
|
+
SmartCore::Types::Primitive::SumValidator::Result.new(type, yield.value)
|
100
|
+
end
|
101
|
+
end
|