smart_types 0.0.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 +7 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +15 -0
- data/.travis.yml +20 -0
- data/CHANGELOG.md +2 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +77 -0
- data/LICENSE.txt +21 -0
- data/README.md +85 -0
- data/Rakefile +21 -0
- data/bin/console +8 -0
- data/bin/setup +8 -0
- data/lib/smart_core/types.rb +13 -0
- data/lib/smart_core/types/errors.rb +27 -0
- data/lib/smart_core/types/primitive.rb +76 -0
- data/lib/smart_core/types/primitive/caster.rb +31 -0
- data/lib/smart_core/types/primitive/checker.rb +31 -0
- data/lib/smart_core/types/primitive/factory.rb +96 -0
- data/lib/smart_core/types/primitive/factory/definition_context.rb +46 -0
- data/lib/smart_core/types/primitive/mult_checker.rb +31 -0
- data/lib/smart_core/types/primitive/mult_factory.rb +69 -0
- data/lib/smart_core/types/primitive/mult_factory/definition_context.rb +29 -0
- data/lib/smart_core/types/primitive/sum_checker.rb +31 -0
- data/lib/smart_core/types/primitive/sum_factory.rb +69 -0
- data/lib/smart_core/types/primitive/sum_factory/definition_context.rb +29 -0
- data/lib/smart_core/types/primitive/undefined_caster.rb +19 -0
- data/lib/smart_core/types/system.rb +7 -0
- data/lib/smart_core/types/system/producer_dsl.rb +30 -0
- data/lib/smart_core/types/value.rb +19 -0
- data/lib/smart_core/types/value/any.rb +14 -0
- data/lib/smart_core/types/value/array.rb +17 -0
- data/lib/smart_core/types/value/boolean.rb +9 -0
- data/lib/smart_core/types/value/class.rb +9 -0
- data/lib/smart_core/types/value/float.rb +17 -0
- data/lib/smart_core/types/value/hash.rb +17 -0
- data/lib/smart_core/types/value/integer.rb +17 -0
- data/lib/smart_core/types/value/module.rb +9 -0
- data/lib/smart_core/types/value/numeric.rb +17 -0
- data/lib/smart_core/types/value/proc.rb +11 -0
- data/lib/smart_core/types/value/string.rb +11 -0
- data/lib/smart_core/types/value/symbol.rb +11 -0
- data/lib/smart_core/types/value/text.rb +11 -0
- data/lib/smart_core/types/version.rb +11 -0
- data/smart_types.gemspec +42 -0
- metadata +178 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::Caster
|
6
|
+
# @param expression [Proc]
|
7
|
+
# @return [void]
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
# @since 0.1.0
|
11
|
+
def initialize(expression)
|
12
|
+
@expression = expression
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param value [Any]
|
16
|
+
# @return [Any]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
# @since 0.1.0
|
20
|
+
def call(value)
|
21
|
+
expression.call(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# @return [Proc]
|
27
|
+
#
|
28
|
+
# @api private
|
29
|
+
# @since 0.1.0
|
30
|
+
attr_reader :expression
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::Checker
|
6
|
+
# @param expression [Proc]
|
7
|
+
# @return [void]
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
# @since 0.1.0
|
11
|
+
def initialize(expression)
|
12
|
+
@expression = expression
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param value [Any]
|
16
|
+
# @return [Boolean]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
# @since 0.1.0
|
20
|
+
def call(value)
|
21
|
+
!!expression.call(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# @return [Proc]
|
27
|
+
#
|
28
|
+
# @api private
|
29
|
+
# @since 0.1.0
|
30
|
+
attr_reader :expression
|
31
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::Factory
|
6
|
+
require_relative 'factory/definition_context'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
# @param type_category [Class<SmartCore::Types::Primitive>]
|
10
|
+
# @param type_name [String, Symbol]
|
11
|
+
# @param type_definition [Proc]
|
12
|
+
# @return [SmartCore::Types::Primitive]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
# @since 0.1.0
|
16
|
+
def create_type(type_category, type_name, type_definition)
|
17
|
+
type_definitions = build_type_definitions(type_definition)
|
18
|
+
type_checker = build_type_checker(type_definitions)
|
19
|
+
type_caster = build_type_caster(type_definitions)
|
20
|
+
type = build_type(type_category, type_checker, type_caster)
|
21
|
+
type.tap { register_new_type(type_category, type_name, type) }
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# @param type_definition [Proc]
|
27
|
+
# @return [SmartCore::Types::Primitive::Factory::DefinitionContext]
|
28
|
+
#
|
29
|
+
# @raise [SmartCore::Types::NoCheckerDefinitionError]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
# @since 0.1.0
|
33
|
+
def build_type_definitions(type_definition)
|
34
|
+
raise 'Type definition is not provied' unless type_definition.is_a?(Proc)
|
35
|
+
SmartCore::Types::Primitive::Factory::DefinitionContext.new.tap do |context|
|
36
|
+
context.instance_eval(&type_definition)
|
37
|
+
end.tap do |context|
|
38
|
+
raise(
|
39
|
+
SmartCore::Types::NoCheckerDefinitionError,
|
40
|
+
'Type checker is not provided (use .define_checker for it)'
|
41
|
+
) if context.type_checker.nil?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param type_definitions [SmartCore::Types::Primitive::Factory::DefinitionContext]
|
46
|
+
# @return [SmartCore::Types::Primitive::Checker]
|
47
|
+
#
|
48
|
+
# @api private
|
49
|
+
# @since 0.1.0
|
50
|
+
def build_type_checker(type_definitions)
|
51
|
+
SmartCore::Types::Primitive::Checker.new(type_definitions.type_checker)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param type_definitions [SmartCore::Types::Primitive::Factory::DefinitionContext]
|
55
|
+
# @return [SmartCore::Types::Primitive::Caster]
|
56
|
+
#
|
57
|
+
# @api private
|
58
|
+
# @since 0.1.0
|
59
|
+
def build_type_caster(type_definitions)
|
60
|
+
if type_definitions.type_caster.nil?
|
61
|
+
SmartCore::Types::Primitive::UndefinedCaster.new
|
62
|
+
else
|
63
|
+
SmartCore::Types::Primitive::Caster.new(type_definitions.type_caster)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# @param type_klass [Class<SmartCore::Types::Primitive>]
|
68
|
+
# @param type_checker [SmartCore::Types::Primitive::Checker]
|
69
|
+
# @param type_caster [SmartCore::Types::Primitive::Caster]
|
70
|
+
# @return [SmartCore::Types::Primitive]
|
71
|
+
#
|
72
|
+
# @api private
|
73
|
+
# @since 0.1.0
|
74
|
+
def build_type(type_category, type_checker, type_caster)
|
75
|
+
Class.new(type_category).new(type_checker, type_caster)
|
76
|
+
end
|
77
|
+
|
78
|
+
# @param type_category [Class<SmartCore::Types::Primitive>]
|
79
|
+
# @param type_name [String, Symbol]
|
80
|
+
# @param type [SmartCore::Types::Primitive]
|
81
|
+
# @return [void]
|
82
|
+
#
|
83
|
+
# @raise [SmartCore::Types::IncorrectTypeNameError]
|
84
|
+
#
|
85
|
+
# @api private
|
86
|
+
# @since 0.1.0
|
87
|
+
def register_new_type(type_category, type_name, type)
|
88
|
+
type_category.const_set(type_name, type)
|
89
|
+
rescue ::NameError
|
90
|
+
raise(
|
91
|
+
SmartCore::Types::IncorrectTypeNameError,
|
92
|
+
"Incorrect constant name for new type (#{type_name})"
|
93
|
+
)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::Factory::DefinitionContext
|
6
|
+
# @return [Proc]
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
# @since 0.1.0
|
10
|
+
attr_reader :type_checker
|
11
|
+
|
12
|
+
# @return [Proc]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
# @since 0.1.0
|
16
|
+
attr_reader :type_caster
|
17
|
+
|
18
|
+
# @return [void]
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
# @since 0.1.0
|
22
|
+
def initialize
|
23
|
+
@type_checker = nil
|
24
|
+
@type_caster = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param checker [Block]
|
28
|
+
# @return [void]
|
29
|
+
#
|
30
|
+
# @api public
|
31
|
+
# @since 0.1.0
|
32
|
+
def define_checker(&checker)
|
33
|
+
raise 'No checker definition block' unless block_given?
|
34
|
+
@type_checker = checker
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param caster [Block]
|
38
|
+
# @return [void]
|
39
|
+
#
|
40
|
+
# @api public
|
41
|
+
# @since 0.1.0
|
42
|
+
def define_caster(&caster)
|
43
|
+
raise 'No caster definition block' unless block_given?
|
44
|
+
@type_caster = caster
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::MultChecker
|
6
|
+
# @param [Array<SmartCore::Types::Primitive::Checker>]
|
7
|
+
# @return [void]
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
# @since 0.1.0
|
11
|
+
def initialize(*checkers)
|
12
|
+
@checkers = checkers
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param value [Any]
|
16
|
+
# @return [Boolean]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
# @since 0.1.0
|
20
|
+
def call(value)
|
21
|
+
checkers.all? { |checker| checker.call(value) }
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# @return [Array<SmartCore::Types::Primitive::Checker>]
|
27
|
+
#
|
28
|
+
# @api private
|
29
|
+
# @since 0.1.0
|
30
|
+
attr_reader :checkers
|
31
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
module SmartCore::Types::Primitive::MultFactory
|
6
|
+
require_relative 'mult_factory/definition_context'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
# @param types [Array<SmartCore::Types::Primtive>]
|
10
|
+
# @param type_definition [NilClass, Proc]
|
11
|
+
# @return [SmartCore::Types::Primitive]
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
# @since 0.1.0
|
15
|
+
def create_type(types, type_definition)
|
16
|
+
type_definitions = build_type_definitions(type_definition)
|
17
|
+
type_checker = build_type_checker(types, type_definitions)
|
18
|
+
type_caster = build_type_caster(types, type_definitions)
|
19
|
+
build_type(type_checker, type_caster)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
# @param type_definition [NilClass, Proc]
|
25
|
+
# @return [SmartCore::Types::Primitive::MultFactory::DefinitionContext]
|
26
|
+
#
|
27
|
+
# @pai private
|
28
|
+
# @since 0.1.0
|
29
|
+
def build_type_definitions(type_definition)
|
30
|
+
SmatCore::Types::Primitive::MultFactory::DefinitionContext.new.tap do |context|
|
31
|
+
context.instance_eval(&type_definition) if type_definition
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param types [Array<SmartCore::Types::Primtive>]
|
36
|
+
# @param type_definitions [SmartCore::Types::Primitive::MultFactory::DefinitionContext]
|
37
|
+
# @return [SmartCore::Types::Primitive::MultChecker]
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
# @since 0.1.0
|
41
|
+
def build_type_checker(types, type_definitions)
|
42
|
+
SmartCore::Types::Primitive::MultChecker.new(*types.map(&:checker))
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param types [Array<SmartCore::Types::Primtive>]
|
46
|
+
# @param type_definition [SmartCore::Types::Primitive::MultFactory::DefinitionContext]
|
47
|
+
# @return [SmartCore::Types::Primitive::Caster]
|
48
|
+
#
|
49
|
+
# @api private
|
50
|
+
# @since 0.1.0
|
51
|
+
def build_type_caster(types, type_definitions)
|
52
|
+
if type_definitions.type_caster.nil?
|
53
|
+
SmartCore::Types::Primitive::UndefinedCaster.new
|
54
|
+
else
|
55
|
+
SmartCore::Types::Primitive::Caster.new(type_definitions.type_caster)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param type_checker [SmartCore::Types::Primitive::MultChecker]
|
60
|
+
# @param type_caster [SmartCore::Types::Primitive::Caster]
|
61
|
+
# @return [SmartCore::Types::Primitive]
|
62
|
+
#
|
63
|
+
# @api private
|
64
|
+
# @since 0.1.0
|
65
|
+
def build_type(type_checker, type_caster)
|
66
|
+
SmartCore::Types::Primitive.new(type_checker, type_caster)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::Factory::DefinitionContext
|
6
|
+
# @return [Proc]
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
# @since 0.1.0
|
10
|
+
attr_reader :type_caster
|
11
|
+
|
12
|
+
# @return [void]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
# @since 0.1.0
|
16
|
+
def initialize
|
17
|
+
@type_caster = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param caster [Block]
|
21
|
+
# @return [void]
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
# @since 0.1.0
|
25
|
+
def define_caster(&caster)
|
26
|
+
raise 'No caster definition block' unless block_given?
|
27
|
+
@type_caster = caster
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::SumChecker
|
6
|
+
# @param [Array<SmartCore::Types::Primitive::Checker>]
|
7
|
+
# @return [void]
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
# @since 0.1.0
|
11
|
+
def initialize(*checkers)
|
12
|
+
@checkers = checkers
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param value [Any]
|
16
|
+
# @return [Boolean]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
# @since 0.1.0
|
20
|
+
def call(value)
|
21
|
+
checkers.any? { |checker| checker.call(value) }
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# @return [Array<SmartCore::Types::Primitive::Checker>]
|
27
|
+
#
|
28
|
+
# @api private
|
29
|
+
# @since 0.1.0
|
30
|
+
attr_reader :checkers
|
31
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
module SmartCore::Types::Primitive::SumFactory
|
6
|
+
require_relative 'sum_factory/definition_context'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
# @param types [Array<SmartCore::Types::Primtive>]
|
10
|
+
# @param type_definition [NilClass, Proc]
|
11
|
+
# @return [SmartCore::Types::Primitive]
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
# @since 0.1.0
|
15
|
+
def create_type(types, type_definition)
|
16
|
+
type_definitions = build_type_definitions(type_definition)
|
17
|
+
type_checker = build_type_checker(types, type_definitions)
|
18
|
+
type_caster = build_type_caster(types, type_definitions)
|
19
|
+
build_type(type_checker, type_caster)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
# @param type_definition [NilClass, Proc]
|
25
|
+
# @return [SmartCore::Types::Primitive::SumFactory::DefinitionContext]
|
26
|
+
#
|
27
|
+
# @pai private
|
28
|
+
# @since 0.1.0
|
29
|
+
def build_type_definitions(type_definition)
|
30
|
+
SmatCore::Types::Primitive::SumFactory::DefinitionContext.new.tap do |context|
|
31
|
+
context.instance_eval(&type_definition) if type_definition
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param types [Array<SmartCore::Types::Primtive>]
|
36
|
+
# @param type_definitions [SmartCore::Types::Primitive::SumFactory::DefinitionContext]
|
37
|
+
# @return [SmartCore::Types::Primitive::SumChecker]
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
# @since 0.1.0
|
41
|
+
def build_type_checker(types, type_definitions)
|
42
|
+
SmartCore::Types::Primitive::SumChecker.new(*types.map(&:checker))
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param types [Array<SmartCore::Types::Primtive>]
|
46
|
+
# @param type_definition [SmartCore::Types::Primitive::SumFactory::DefinitionContext]
|
47
|
+
# @return [SmartCore::Types::Primitive::Caster]
|
48
|
+
#
|
49
|
+
# @api private
|
50
|
+
# @since 0.1.0
|
51
|
+
def build_type_caster(types, type_definitions)
|
52
|
+
if type_definitions.type_caster.nil?
|
53
|
+
SmartCore::Types::Primitive::UndefinedCaster.new
|
54
|
+
else
|
55
|
+
SmartCore::Types::Primitive::Caster.new(type_definitions.type_caster)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param type_checker [SmartCore::Types::Primitive::SumChecker]
|
60
|
+
# @param type_caster [SmartCore::Types::Primitive::Caster]
|
61
|
+
# @return [SmartCore::Types::Primitive]
|
62
|
+
#
|
63
|
+
# @api private
|
64
|
+
# @since 0.1.0
|
65
|
+
def build_type(type_checker, type_caster)
|
66
|
+
SmartCore::Types::Primitive.new(type_checker, type_caster)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Types::Primitive::SumFactory::DefinitionContext
|
6
|
+
# @return [Proc]
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
# @since 0.1.0
|
10
|
+
attr_reader :type_caster
|
11
|
+
|
12
|
+
# @return [void]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
# @since 0.1.0
|
16
|
+
def initialize
|
17
|
+
@type_caster = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param caster [Block]
|
21
|
+
# @return [void]
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
# @since 0.1.0
|
25
|
+
def define_caster(&caster)
|
26
|
+
raise 'No caster definition block' unless block_given?
|
27
|
+
@type_caster = caster
|
28
|
+
end
|
29
|
+
end
|