kind 3.0.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.tool-versions +1 -0
- data/.travis.sh +37 -12
- data/.travis.yml +6 -5
- data/CHANGELOG.md +1295 -0
- data/Gemfile +10 -2
- data/README.md +985 -490
- data/lib/kind.rb +35 -287
- data/lib/kind/active_model/kind_validator.rb +20 -13
- data/lib/kind/core.rb +8 -0
- data/lib/kind/core/kind.rb +61 -0
- data/lib/kind/core/undefined.rb +7 -0
- data/lib/kind/dig.rb +40 -0
- data/lib/kind/empty.rb +4 -12
- data/lib/kind/empty/constant.rb +7 -0
- data/lib/kind/error.rb +2 -6
- data/lib/kind/maybe.rb +14 -153
- data/lib/kind/maybe/none.rb +57 -0
- data/lib/kind/maybe/result.rb +51 -0
- data/lib/kind/maybe/some.rb +90 -0
- data/lib/kind/maybe/typed.rb +29 -0
- data/lib/kind/maybe/wrappable.rb +33 -0
- data/lib/kind/presence.rb +33 -0
- data/lib/kind/try.rb +34 -0
- data/lib/kind/type_checker.rb +87 -0
- data/lib/kind/type_checkers.rb +30 -0
- data/lib/kind/type_checkers/core/array.rb +17 -0
- data/lib/kind/type_checkers/core/class.rb +13 -0
- data/lib/kind/type_checkers/core/comparable.rb +13 -0
- data/lib/kind/type_checkers/core/enumerable.rb +13 -0
- data/lib/kind/type_checkers/core/enumerator.rb +13 -0
- data/lib/kind/type_checkers/core/file.rb +13 -0
- data/lib/kind/type_checkers/core/float.rb +13 -0
- data/lib/kind/type_checkers/core/hash.rb +17 -0
- data/lib/kind/type_checkers/core/integer.rb +13 -0
- data/lib/kind/type_checkers/core/io.rb +13 -0
- data/lib/kind/type_checkers/core/method.rb +13 -0
- data/lib/kind/type_checkers/core/module.rb +17 -0
- data/lib/kind/type_checkers/core/numeric.rb +13 -0
- data/lib/kind/type_checkers/core/proc.rb +13 -0
- data/lib/kind/type_checkers/core/queue.rb +14 -0
- data/lib/kind/type_checkers/core/range.rb +13 -0
- data/lib/kind/type_checkers/core/regexp.rb +13 -0
- data/lib/kind/type_checkers/core/string.rb +17 -0
- data/lib/kind/type_checkers/core/struct.rb +13 -0
- data/lib/kind/type_checkers/core/symbol.rb +13 -0
- data/lib/kind/type_checkers/core/time.rb +13 -0
- data/lib/kind/type_checkers/custom/boolean.rb +19 -0
- data/lib/kind/type_checkers/custom/callable.rb +19 -0
- data/lib/kind/type_checkers/custom/lambda.rb +19 -0
- data/lib/kind/type_checkers/stdlib/open_struct.rb +13 -0
- data/lib/kind/type_checkers/stdlib/set.rb +17 -0
- data/lib/kind/undefined.rb +4 -2
- data/lib/kind/validator.rb +1 -1
- data/lib/kind/version.rb +1 -1
- data/test.sh +4 -4
- metadata +45 -9
- data/lib/kind/checker.rb +0 -15
- data/lib/kind/checker/factory.rb +0 -35
- data/lib/kind/checker/protocol.rb +0 -73
- data/lib/kind/is.rb +0 -19
- data/lib/kind/of.rb +0 -11
- data/lib/kind/types.rb +0 -115
data/lib/kind/is.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Kind
|
4
|
-
module Is
|
5
|
-
def self.call(expected, object)
|
6
|
-
__call__(Kind::Of.Module(expected), object)
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.__call__(expected_kind, object)
|
10
|
-
kind = Kind::Of.Module(object)
|
11
|
-
|
12
|
-
if kind.is_a?(Class)
|
13
|
-
kind <= expected_kind || false
|
14
|
-
else
|
15
|
-
kind == expected_kind || kind.is_a?(expected_kind)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/kind/of.rb
DELETED
data/lib/kind/types.rb
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Kind
|
4
|
-
module Types
|
5
|
-
extend self
|
6
|
-
|
7
|
-
COLONS = '::'.freeze
|
8
|
-
|
9
|
-
KIND_OF = <<-RUBY
|
10
|
-
def self.%{method_name}(object = Undefined, options = Empty::HASH)
|
11
|
-
default = options[:or]
|
12
|
-
|
13
|
-
return Kind::Of::%{kind_name} if Undefined == object && default.nil?
|
14
|
-
|
15
|
-
is_instance = Kind::Of::%{kind_name}.__is_instance__(object)
|
16
|
-
|
17
|
-
return object if is_instance
|
18
|
-
|
19
|
-
Kind::Of.(::%{kind_name_to_check}, object && default ? default : object || default)
|
20
|
-
end
|
21
|
-
RUBY
|
22
|
-
|
23
|
-
KIND_OF_IS = <<-RUBY
|
24
|
-
def self.%{method_name}?(*args)
|
25
|
-
Kind::Of::%{kind_name}.instance?(*args)
|
26
|
-
end
|
27
|
-
RUBY
|
28
|
-
|
29
|
-
KIND_IS = <<-RUBY
|
30
|
-
def self.%{method_name}(value = Undefined)
|
31
|
-
return Kind::Is::%{kind_name} if Undefined == value
|
32
|
-
|
33
|
-
Kind::Is.__call__(::%{kind_name_to_check}, value)
|
34
|
-
end
|
35
|
-
RUBY
|
36
|
-
|
37
|
-
private_constant :KIND_OF, :KIND_IS, :COLONS
|
38
|
-
|
39
|
-
def add(kind, name: nil)
|
40
|
-
kind_name = Kind.of.Module(kind).name
|
41
|
-
checker = name ? Kind::Of.(String, name) : kind_name
|
42
|
-
|
43
|
-
if checker.include?(COLONS)
|
44
|
-
add_kind_with_namespace(checker, method_name: name)
|
45
|
-
else
|
46
|
-
add_root(checker, kind_name, method_name: name,
|
47
|
-
kind_name_to_check: kind_name,
|
48
|
-
create_kind_is_mod: false)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def add_root(checker, kind_name, method_name:, create_kind_is_mod:, kind_name_to_check: nil)
|
55
|
-
root_kind_name = method_name ? method_name : kind_name
|
56
|
-
|
57
|
-
params = {
|
58
|
-
method_name: method_name ? method_name : checker,
|
59
|
-
kind_name: method_name ? method_name : kind_name,
|
60
|
-
kind_name_to_check: kind_name_to_check || root_kind_name
|
61
|
-
}
|
62
|
-
|
63
|
-
add_kind(params, Kind::Of, Kind::Is, create_kind_is_mod)
|
64
|
-
end
|
65
|
-
|
66
|
-
def add_kind_with_namespace(checker, method_name:)
|
67
|
-
raise NotImplementedError if method_name
|
68
|
-
|
69
|
-
const_names = checker.split(COLONS)
|
70
|
-
const_names.each_with_index do |const_name, index|
|
71
|
-
if index == 0
|
72
|
-
add_root(const_name, const_name, method_name: nil, create_kind_is_mod: true)
|
73
|
-
else
|
74
|
-
add_node(const_names, index)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def add_node(const_names, index)
|
80
|
-
namespace = const_names[0..(index-1)]
|
81
|
-
namespace_name = namespace.join(COLONS)
|
82
|
-
|
83
|
-
kind_of_mod = Kind::Of.const_get(namespace_name)
|
84
|
-
kind_is_mod = Kind::Is.const_get(namespace_name)
|
85
|
-
|
86
|
-
checker = const_names[index]
|
87
|
-
kind_name = const_names[0..index].join(COLONS)
|
88
|
-
|
89
|
-
params = { method_name: checker, kind_name: kind_name }
|
90
|
-
|
91
|
-
add_kind(params, kind_of_mod, kind_is_mod, true)
|
92
|
-
end
|
93
|
-
|
94
|
-
def add_kind(params, kind_of_mod, kind_is_mod, create_kind_is_mod)
|
95
|
-
method_name = params[:method_name]
|
96
|
-
|
97
|
-
unless kind_of_mod.respond_to?(method_name)
|
98
|
-
kind_name = params[:kind_name]
|
99
|
-
params[:kind_name_to_check] ||= kind_name
|
100
|
-
|
101
|
-
kind_checker = ::Module.new { extend Checker::Protocol }
|
102
|
-
kind_checker.module_eval("def self.__kind; #{params[:kind_name_to_check]}; end")
|
103
|
-
|
104
|
-
kind_of_mod.instance_eval(KIND_OF % params)
|
105
|
-
kind_of_mod.const_set(method_name, kind_checker)
|
106
|
-
kind_of_mod.instance_eval(KIND_OF_IS % params)
|
107
|
-
end
|
108
|
-
|
109
|
-
unless kind_is_mod.respond_to?(method_name)
|
110
|
-
kind_is_mod.instance_eval(KIND_IS % params)
|
111
|
-
kind_is_mod.const_set(method_name, Module.new) if create_kind_is_mod
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|