kind 3.0.0 → 5.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 +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
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kind
|
4
|
+
module String
|
5
|
+
extend self, TypeChecker
|
6
|
+
|
7
|
+
def kind; ::String; end
|
8
|
+
|
9
|
+
def value_or_empty(arg)
|
10
|
+
KIND.value(self, arg, Empty::STRING)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.String?(*values)
|
15
|
+
KIND.of?(::String, values)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kind
|
4
|
+
module Boolean
|
5
|
+
extend self, TypeChecker
|
6
|
+
|
7
|
+
def kind; [TrueClass, FalseClass].freeze; end
|
8
|
+
|
9
|
+
def name; 'Boolean'; end
|
10
|
+
|
11
|
+
def ===(value)
|
12
|
+
::TrueClass === value || ::FalseClass === value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.Boolean?(*values)
|
17
|
+
KIND.of?(Boolean, values)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kind
|
4
|
+
module Callable
|
5
|
+
extend self, TypeChecker
|
6
|
+
|
7
|
+
def kind; raise NotImplementedError; end
|
8
|
+
|
9
|
+
def name; 'Callable'; end
|
10
|
+
|
11
|
+
def ===(value)
|
12
|
+
value.respond_to?(:call)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.Callable?(*values)
|
17
|
+
KIND.of?(Callable, values)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kind
|
4
|
+
module Lambda
|
5
|
+
extend self, TypeChecker
|
6
|
+
|
7
|
+
def kind; ::Proc; end
|
8
|
+
|
9
|
+
def name; 'Lambda'; end
|
10
|
+
|
11
|
+
def ===(value)
|
12
|
+
value.kind_of?(::Proc) && value.lambda?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.Lambda?(*values)
|
17
|
+
KIND.of?(Lambda, values)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kind
|
4
|
+
module Set
|
5
|
+
extend self, TypeChecker
|
6
|
+
|
7
|
+
def kind; ::Set; end
|
8
|
+
|
9
|
+
def value_or_empty(arg)
|
10
|
+
KIND.value(self, arg, Empty::SET)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.Set?(*values)
|
15
|
+
KIND.of?(::Set, values)
|
16
|
+
end
|
17
|
+
end
|
data/lib/kind/undefined.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
2
|
module Kind
|
4
3
|
Undefined = Object.new.tap do |undefined|
|
5
4
|
def undefined.inspect
|
@@ -19,9 +18,12 @@ module Kind
|
|
19
18
|
end
|
20
19
|
|
21
20
|
def undefined.default(value, default)
|
22
|
-
return
|
21
|
+
return value if self != value
|
23
22
|
|
24
23
|
default.respond_to?(:call) ? default.call : default
|
25
24
|
end
|
25
|
+
|
26
|
+
undefined.inspect
|
27
|
+
undefined.freeze
|
26
28
|
end
|
27
29
|
end
|
data/lib/kind/validator.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Kind
|
4
4
|
module Validator
|
5
|
-
DEFAULT_STRATEGIES = Set.new(%w[instance_of kind_of]).freeze
|
5
|
+
DEFAULT_STRATEGIES = ::Set.new(%w[instance_of kind_of]).freeze
|
6
6
|
|
7
7
|
class InvalidDefinition < ArgumentError
|
8
8
|
OPTIONS = 'Options to define one: :of, :is, :respond_to, :instance_of, :array_of or :array_with'.freeze
|
data/lib/kind/version.rb
CHANGED
data/test.sh
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Serradura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple type system (at runtime) for Ruby - free of dependencies.
|
14
14
|
email:
|
@@ -18,8 +18,10 @@ extensions: []
|
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
20
|
- ".gitignore"
|
21
|
+
- ".tool-versions"
|
21
22
|
- ".travis.sh"
|
22
23
|
- ".travis.yml"
|
24
|
+
- CHANGELOG.md
|
23
25
|
- CODE_OF_CONDUCT.md
|
24
26
|
- Gemfile
|
25
27
|
- LICENSE.txt
|
@@ -31,15 +33,49 @@ files:
|
|
31
33
|
- lib/kind.rb
|
32
34
|
- lib/kind/active_model/kind_validator.rb
|
33
35
|
- lib/kind/active_model/validation.rb
|
34
|
-
- lib/kind/
|
35
|
-
- lib/kind/
|
36
|
-
- lib/kind/
|
36
|
+
- lib/kind/core.rb
|
37
|
+
- lib/kind/core/kind.rb
|
38
|
+
- lib/kind/core/undefined.rb
|
39
|
+
- lib/kind/dig.rb
|
37
40
|
- lib/kind/empty.rb
|
41
|
+
- lib/kind/empty/constant.rb
|
38
42
|
- lib/kind/error.rb
|
39
|
-
- lib/kind/is.rb
|
40
43
|
- lib/kind/maybe.rb
|
41
|
-
- lib/kind/
|
42
|
-
- lib/kind/
|
44
|
+
- lib/kind/maybe/none.rb
|
45
|
+
- lib/kind/maybe/result.rb
|
46
|
+
- lib/kind/maybe/some.rb
|
47
|
+
- lib/kind/maybe/typed.rb
|
48
|
+
- lib/kind/maybe/wrappable.rb
|
49
|
+
- lib/kind/presence.rb
|
50
|
+
- lib/kind/try.rb
|
51
|
+
- lib/kind/type_checker.rb
|
52
|
+
- lib/kind/type_checkers.rb
|
53
|
+
- lib/kind/type_checkers/core/array.rb
|
54
|
+
- lib/kind/type_checkers/core/class.rb
|
55
|
+
- lib/kind/type_checkers/core/comparable.rb
|
56
|
+
- lib/kind/type_checkers/core/enumerable.rb
|
57
|
+
- lib/kind/type_checkers/core/enumerator.rb
|
58
|
+
- lib/kind/type_checkers/core/file.rb
|
59
|
+
- lib/kind/type_checkers/core/float.rb
|
60
|
+
- lib/kind/type_checkers/core/hash.rb
|
61
|
+
- lib/kind/type_checkers/core/integer.rb
|
62
|
+
- lib/kind/type_checkers/core/io.rb
|
63
|
+
- lib/kind/type_checkers/core/method.rb
|
64
|
+
- lib/kind/type_checkers/core/module.rb
|
65
|
+
- lib/kind/type_checkers/core/numeric.rb
|
66
|
+
- lib/kind/type_checkers/core/proc.rb
|
67
|
+
- lib/kind/type_checkers/core/queue.rb
|
68
|
+
- lib/kind/type_checkers/core/range.rb
|
69
|
+
- lib/kind/type_checkers/core/regexp.rb
|
70
|
+
- lib/kind/type_checkers/core/string.rb
|
71
|
+
- lib/kind/type_checkers/core/struct.rb
|
72
|
+
- lib/kind/type_checkers/core/symbol.rb
|
73
|
+
- lib/kind/type_checkers/core/time.rb
|
74
|
+
- lib/kind/type_checkers/custom/boolean.rb
|
75
|
+
- lib/kind/type_checkers/custom/callable.rb
|
76
|
+
- lib/kind/type_checkers/custom/lambda.rb
|
77
|
+
- lib/kind/type_checkers/stdlib/open_struct.rb
|
78
|
+
- lib/kind/type_checkers/stdlib/set.rb
|
43
79
|
- lib/kind/undefined.rb
|
44
80
|
- lib/kind/validator.rb
|
45
81
|
- lib/kind/version.rb
|
@@ -65,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
101
|
- !ruby/object:Gem::Version
|
66
102
|
version: '0'
|
67
103
|
requirements: []
|
68
|
-
rubygems_version: 3.
|
104
|
+
rubygems_version: 3.1.4
|
69
105
|
signing_key:
|
70
106
|
specification_version: 4
|
71
107
|
summary: A simple type system (at runtime) for Ruby.
|
data/lib/kind/checker.rb
DELETED
data/lib/kind/checker/factory.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'singleton'
|
4
|
-
|
5
|
-
module Kind
|
6
|
-
class Checker
|
7
|
-
class Factory
|
8
|
-
include Singleton
|
9
|
-
|
10
|
-
def self.create(kind)
|
11
|
-
instance.create(kind)
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize
|
15
|
-
@__checkers__ = {}
|
16
|
-
end
|
17
|
-
|
18
|
-
MODULE_OR_CLASS = 'Module/Class'.freeze
|
19
|
-
|
20
|
-
private_constant :MODULE_OR_CLASS
|
21
|
-
|
22
|
-
def create(kind)
|
23
|
-
@__checkers__[kind] ||= begin
|
24
|
-
kind_name = kind.name
|
25
|
-
|
26
|
-
if Kind::Of.const_defined?(kind_name, false)
|
27
|
-
Kind::Of.const_get(kind_name)
|
28
|
-
else
|
29
|
-
Kind::Checker.new(Kind::Of.(Module, kind, MODULE_OR_CLASS))
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Kind
|
4
|
-
class Checker
|
5
|
-
module Protocol
|
6
|
-
def class?(value)
|
7
|
-
Kind::Is.__call__(__kind, value)
|
8
|
-
end
|
9
|
-
|
10
|
-
def instance(value, options = Empty::HASH)
|
11
|
-
default = options[:or]
|
12
|
-
|
13
|
-
return Kind::Of.(__kind, value) if ::Kind::Maybe::Value.none?(default)
|
14
|
-
|
15
|
-
Kind::Undefined != value && instance?(value) ? value : Kind::Of.(__kind, default)
|
16
|
-
end
|
17
|
-
|
18
|
-
def [](value, options = options = Empty::HASH)
|
19
|
-
instance(value, options)
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_proc
|
23
|
-
@to_proc ||=
|
24
|
-
-> checker { -> value { checker.instance(value) } }.call(self)
|
25
|
-
end
|
26
|
-
|
27
|
-
def __is_instance__(value)
|
28
|
-
value.kind_of?(__kind)
|
29
|
-
end
|
30
|
-
|
31
|
-
def is_instance_to_proc
|
32
|
-
@is_instance_to_proc ||=
|
33
|
-
-> checker { -> value { checker.__is_instance__(value) } }.call(self)
|
34
|
-
end
|
35
|
-
|
36
|
-
def instance?(*args)
|
37
|
-
return is_instance_to_proc if args.empty?
|
38
|
-
|
39
|
-
return args.all? { |object| __is_instance__(object) } if args.size > 1
|
40
|
-
|
41
|
-
arg = args[0]
|
42
|
-
Kind::Undefined == arg ? is_instance_to_proc : __is_instance__(arg)
|
43
|
-
end
|
44
|
-
|
45
|
-
def or_nil(value)
|
46
|
-
return value if instance?(value)
|
47
|
-
end
|
48
|
-
|
49
|
-
def or_undefined(value)
|
50
|
-
or_nil(value) || Kind::Undefined
|
51
|
-
end
|
52
|
-
|
53
|
-
def __as_maybe__(value)
|
54
|
-
Kind::Maybe.new(or_nil(value))
|
55
|
-
end
|
56
|
-
|
57
|
-
def as_maybe_to_proc
|
58
|
-
@as_maybe_to_proc ||=
|
59
|
-
-> checker { -> value { checker.__as_maybe__(value) } }.call(self)
|
60
|
-
end
|
61
|
-
|
62
|
-
def as_maybe(value = Kind::Undefined)
|
63
|
-
return __as_maybe__(value) if Kind::Undefined != value
|
64
|
-
|
65
|
-
as_maybe_to_proc
|
66
|
-
end
|
67
|
-
|
68
|
-
def as_optional(value = Kind::Undefined)
|
69
|
-
as_maybe(value)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|