kind 4.1.0 → 5.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/.tool-versions +1 -1
- data/.travis.sh +39 -7
- data/.travis.yml +1 -2
- data/CHANGELOG.md +524 -29
- data/Gemfile +13 -6
- data/README.md +57 -43
- data/kind.gemspec +3 -3
- data/lib/kind.rb +2 -84
- data/lib/kind/__lib__/action_steps.rb +57 -0
- data/lib/kind/__lib__/attributes.rb +66 -0
- data/lib/kind/__lib__/kind.rb +51 -0
- data/lib/kind/__lib__/of.rb +17 -0
- data/lib/kind/__lib__/strict.rb +49 -0
- data/lib/kind/__lib__/undefined.rb +14 -0
- data/lib/kind/action.rb +127 -0
- data/lib/kind/active_model/validation.rb +3 -4
- data/lib/kind/basic.rb +79 -0
- data/lib/kind/basic/error.rb +29 -0
- data/lib/kind/{undefined.rb → basic/undefined.rb} +6 -1
- data/lib/kind/dig.rb +21 -5
- data/lib/kind/either.rb +30 -0
- data/lib/kind/either/left.rb +29 -0
- data/lib/kind/either/methods.rb +17 -0
- data/lib/kind/either/monad.rb +65 -0
- data/lib/kind/either/monad/wrapper.rb +19 -0
- data/lib/kind/either/right.rb +38 -0
- data/lib/kind/empty.rb +2 -2
- data/lib/kind/empty/constant.rb +7 -0
- data/lib/kind/enum.rb +63 -0
- data/lib/kind/enum/item.rb +40 -0
- data/lib/kind/enum/methods.rb +72 -0
- data/lib/kind/function.rb +45 -0
- data/lib/kind/functional.rb +89 -0
- data/lib/kind/functional/action.rb +87 -0
- data/lib/kind/functional/steps.rb +22 -0
- data/lib/kind/immutable_attributes.rb +34 -0
- data/lib/kind/immutable_attributes/initializer.rb +70 -0
- data/lib/kind/immutable_attributes/reader.rb +38 -0
- data/lib/kind/maybe.rb +37 -12
- data/lib/kind/maybe/methods.rb +21 -0
- data/lib/kind/maybe/monad.rb +82 -0
- data/lib/kind/maybe/monad/wrapper.rb +19 -0
- data/lib/kind/maybe/none.rb +12 -19
- data/lib/kind/maybe/some.rb +68 -26
- data/lib/kind/maybe/typed.rb +11 -5
- data/lib/kind/maybe/{wrappable.rb → wrapper.rb} +8 -4
- data/lib/kind/monad.rb +22 -0
- data/lib/kind/monads.rb +5 -0
- data/lib/kind/objects.rb +17 -0
- data/lib/kind/objects/basic_object.rb +43 -0
- data/lib/kind/objects/modules.rb +32 -0
- data/lib/kind/{type_checkers → objects/modules}/core/array.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/core/class.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/comparable.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/enumerable.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/enumerator.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/file.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/float.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/hash.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/core/integer.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/io.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/method.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/module.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/numeric.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/proc.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/queue.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/range.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/regexp.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/string.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/core/struct.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/symbol.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/time.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/custom/boolean.rb +2 -2
- data/lib/kind/{type_checkers → objects/modules}/custom/callable.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/custom/lambda.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/stdlib/open_struct.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/stdlib/set.rb +3 -1
- data/lib/kind/objects/nil.rb +17 -0
- data/lib/kind/objects/not_nil.rb +9 -0
- data/lib/kind/objects/object.rb +56 -0
- data/lib/kind/objects/respond_to.rb +30 -0
- data/lib/kind/objects/union_type.rb +44 -0
- data/lib/kind/presence.rb +4 -2
- data/lib/kind/result.rb +31 -0
- data/lib/kind/result/abstract.rb +53 -0
- data/lib/kind/result/failure.rb +33 -0
- data/lib/kind/result/methods.rb +17 -0
- data/lib/kind/result/monad.rb +74 -0
- data/lib/kind/result/monad/wrapper.rb +19 -0
- data/lib/kind/result/success.rb +53 -0
- data/lib/kind/strict/disabled.rb +34 -0
- data/lib/kind/try.rb +22 -10
- data/lib/kind/validator.rb +111 -0
- data/lib/kind/version.rb +1 -1
- metadata +84 -51
- data/lib/kind/active_model/kind_validator.rb +0 -103
- data/lib/kind/core.rb +0 -10
- data/lib/kind/core/deprecation.rb +0 -29
- data/lib/kind/core/kind.rb +0 -61
- data/lib/kind/core/undefined.rb +0 -7
- data/lib/kind/core/wrong_number_of_args.rb +0 -9
- data/lib/kind/deprecations/built_in_type_checkers.rb +0 -23
- data/lib/kind/deprecations/checker.rb +0 -16
- data/lib/kind/deprecations/checker/factory.rb +0 -31
- data/lib/kind/deprecations/checker/protocol.rb +0 -73
- data/lib/kind/deprecations/is.rb +0 -35
- data/lib/kind/deprecations/of.rb +0 -258
- data/lib/kind/deprecations/types.rb +0 -121
- data/lib/kind/error.rb +0 -15
- data/lib/kind/maybe/result.rb +0 -51
- data/lib/kind/type_checker.rb +0 -87
- data/lib/kind/type_checkers.rb +0 -30
data/lib/kind/validator.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'kind/basic'
|
4
|
+
|
3
5
|
module Kind
|
4
6
|
module Validator
|
5
7
|
DEFAULT_STRATEGIES = ::Set.new(%w[instance_of kind_of]).freeze
|
@@ -38,3 +40,112 @@ module Kind
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
43
|
+
|
44
|
+
require 'active_model'
|
45
|
+
require 'active_model/validations'
|
46
|
+
|
47
|
+
class KindValidator < ActiveModel::EachValidator
|
48
|
+
def validate_each(record, attribute, value)
|
49
|
+
return if options[:allow_nil] && value.nil?
|
50
|
+
|
51
|
+
return unless error = call_validation_for(attribute, value)
|
52
|
+
|
53
|
+
raise Kind::Error.new("#{attribute} #{error}") if options[:strict]
|
54
|
+
|
55
|
+
record.errors.add(attribute, error)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def call_validation_for(attribute, value)
|
61
|
+
expected = options[:with] || options[:in]
|
62
|
+
|
63
|
+
return validate_with_default_strategy(expected, value) if expected
|
64
|
+
|
65
|
+
return kind_of(expected, value) if expected = options[:of]
|
66
|
+
return kind_is(expected, value) if expected = options[:is]
|
67
|
+
return respond_to(expected, value) if expected = options[:respond_to]
|
68
|
+
return instance_of(expected, value) if expected = options[:instance_of]
|
69
|
+
return array_with(expected, value) if expected = options[:array_with]
|
70
|
+
return array_of(expected, value) if expected = options[:array_of]
|
71
|
+
|
72
|
+
raise Kind::Validator::InvalidDefinition.new(attribute)
|
73
|
+
end
|
74
|
+
|
75
|
+
def validate_with_default_strategy(expected, value)
|
76
|
+
send(Kind::Validator.default_strategy, expected, value)
|
77
|
+
end
|
78
|
+
|
79
|
+
def kind_of(expected, value)
|
80
|
+
if ::Array === expected
|
81
|
+
return if expected.any? { |type| type === value }
|
82
|
+
|
83
|
+
"must be a kind of #{expected.map { |type| type.name }.join(', ')}"
|
84
|
+
else
|
85
|
+
return if expected === value
|
86
|
+
|
87
|
+
expected.respond_to?(:name) ? "must be a kind of #{expected.name}" : 'invalid kind'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
CLASS_OR_MODULE = 'Class/Module'.freeze
|
92
|
+
|
93
|
+
def kind_is(expected, value)
|
94
|
+
return kind_is_not(expected, value) unless expected.kind_of?(::Array)
|
95
|
+
|
96
|
+
result = expected.map { |kind| kind_is_not(kind, value) }.tap(&:compact!)
|
97
|
+
|
98
|
+
result.empty? || result.size < expected.size ? nil : result.join(', ')
|
99
|
+
end
|
100
|
+
|
101
|
+
def kind_is_not(expected, value)
|
102
|
+
case expected
|
103
|
+
when ::Class
|
104
|
+
return if expected == Kind.of_class(value) || value < expected
|
105
|
+
|
106
|
+
"must be the class or a subclass of `#{expected.name}`"
|
107
|
+
when ::Module
|
108
|
+
return if value.kind_of?(::Class) && value <= expected
|
109
|
+
return if expected == Kind.of_module_or_class(value) || value.kind_of?(expected)
|
110
|
+
|
111
|
+
"must include the `#{expected.name}` module"
|
112
|
+
else
|
113
|
+
raise Kind::Error.new(CLASS_OR_MODULE, expected)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def respond_to(expected, value)
|
118
|
+
method_names = Array(expected)
|
119
|
+
|
120
|
+
expected_methods = method_names.select { |method_name| !value.respond_to?(method_name) }
|
121
|
+
expected_methods.map! { |method_name| "`#{method_name}`" }
|
122
|
+
|
123
|
+
return if expected_methods.empty?
|
124
|
+
|
125
|
+
methods = expected_methods.size == 1 ? 'method' : 'methods'
|
126
|
+
|
127
|
+
"must respond to the #{methods}: #{expected_methods.join(', ')}"
|
128
|
+
end
|
129
|
+
|
130
|
+
def instance_of(expected, value)
|
131
|
+
types = Array(expected)
|
132
|
+
|
133
|
+
return if types.any? { |type| value.instance_of?(type) }
|
134
|
+
|
135
|
+
"must be an instance of #{types.map { |klass| klass.name }.join(', ')}"
|
136
|
+
end
|
137
|
+
|
138
|
+
def array_with(expected, value)
|
139
|
+
return if value.kind_of?(::Array) && !value.empty? && (value - Kind.of!(::Array, expected)).empty?
|
140
|
+
|
141
|
+
"must be an array with #{expected.join(', ')}"
|
142
|
+
end
|
143
|
+
|
144
|
+
def array_of(expected, value)
|
145
|
+
types = Array(expected)
|
146
|
+
|
147
|
+
return if value.kind_of?(::Array) && !value.empty? && value.all? { |val| types.any? { |type| type === val } }
|
148
|
+
|
149
|
+
"must be an array of #{types.map { |klass| klass.name }.join(', ')}"
|
150
|
+
end
|
151
|
+
end
|
data/lib/kind/version.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 5.4.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: 2021-
|
11
|
+
date: 2021-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: A
|
13
|
+
description: A development toolkit for Ruby with several small/cohesive abstractions
|
14
|
+
(monads, enums, business logic, data validation...) to empower your development
|
15
|
+
workflow - It's totally free of dependencies.
|
14
16
|
email:
|
15
17
|
- rodrigo.serradura@gmail.com
|
16
18
|
executables: []
|
@@ -31,60 +33,90 @@ files:
|
|
31
33
|
- bin/setup
|
32
34
|
- kind.gemspec
|
33
35
|
- lib/kind.rb
|
34
|
-
- lib/kind/
|
36
|
+
- lib/kind/__lib__/action_steps.rb
|
37
|
+
- lib/kind/__lib__/attributes.rb
|
38
|
+
- lib/kind/__lib__/kind.rb
|
39
|
+
- lib/kind/__lib__/of.rb
|
40
|
+
- lib/kind/__lib__/strict.rb
|
41
|
+
- lib/kind/__lib__/undefined.rb
|
42
|
+
- lib/kind/action.rb
|
35
43
|
- lib/kind/active_model/validation.rb
|
36
|
-
- lib/kind/
|
37
|
-
- lib/kind/
|
38
|
-
- lib/kind/
|
39
|
-
- lib/kind/core/undefined.rb
|
40
|
-
- lib/kind/core/wrong_number_of_args.rb
|
41
|
-
- lib/kind/deprecations/built_in_type_checkers.rb
|
42
|
-
- lib/kind/deprecations/checker.rb
|
43
|
-
- lib/kind/deprecations/checker/factory.rb
|
44
|
-
- lib/kind/deprecations/checker/protocol.rb
|
45
|
-
- lib/kind/deprecations/is.rb
|
46
|
-
- lib/kind/deprecations/of.rb
|
47
|
-
- lib/kind/deprecations/types.rb
|
44
|
+
- lib/kind/basic.rb
|
45
|
+
- lib/kind/basic/error.rb
|
46
|
+
- lib/kind/basic/undefined.rb
|
48
47
|
- lib/kind/dig.rb
|
48
|
+
- lib/kind/either.rb
|
49
|
+
- lib/kind/either/left.rb
|
50
|
+
- lib/kind/either/methods.rb
|
51
|
+
- lib/kind/either/monad.rb
|
52
|
+
- lib/kind/either/monad/wrapper.rb
|
53
|
+
- lib/kind/either/right.rb
|
49
54
|
- lib/kind/empty.rb
|
50
|
-
- lib/kind/
|
55
|
+
- lib/kind/empty/constant.rb
|
56
|
+
- lib/kind/enum.rb
|
57
|
+
- lib/kind/enum/item.rb
|
58
|
+
- lib/kind/enum/methods.rb
|
59
|
+
- lib/kind/function.rb
|
60
|
+
- lib/kind/functional.rb
|
61
|
+
- lib/kind/functional/action.rb
|
62
|
+
- lib/kind/functional/steps.rb
|
63
|
+
- lib/kind/immutable_attributes.rb
|
64
|
+
- lib/kind/immutable_attributes/initializer.rb
|
65
|
+
- lib/kind/immutable_attributes/reader.rb
|
51
66
|
- lib/kind/maybe.rb
|
67
|
+
- lib/kind/maybe/methods.rb
|
68
|
+
- lib/kind/maybe/monad.rb
|
69
|
+
- lib/kind/maybe/monad/wrapper.rb
|
52
70
|
- lib/kind/maybe/none.rb
|
53
|
-
- lib/kind/maybe/result.rb
|
54
71
|
- lib/kind/maybe/some.rb
|
55
72
|
- lib/kind/maybe/typed.rb
|
56
|
-
- lib/kind/maybe/
|
73
|
+
- lib/kind/maybe/wrapper.rb
|
74
|
+
- lib/kind/monad.rb
|
75
|
+
- lib/kind/monads.rb
|
76
|
+
- lib/kind/objects.rb
|
77
|
+
- lib/kind/objects/basic_object.rb
|
78
|
+
- lib/kind/objects/modules.rb
|
79
|
+
- lib/kind/objects/modules/core/array.rb
|
80
|
+
- lib/kind/objects/modules/core/class.rb
|
81
|
+
- lib/kind/objects/modules/core/comparable.rb
|
82
|
+
- lib/kind/objects/modules/core/enumerable.rb
|
83
|
+
- lib/kind/objects/modules/core/enumerator.rb
|
84
|
+
- lib/kind/objects/modules/core/file.rb
|
85
|
+
- lib/kind/objects/modules/core/float.rb
|
86
|
+
- lib/kind/objects/modules/core/hash.rb
|
87
|
+
- lib/kind/objects/modules/core/integer.rb
|
88
|
+
- lib/kind/objects/modules/core/io.rb
|
89
|
+
- lib/kind/objects/modules/core/method.rb
|
90
|
+
- lib/kind/objects/modules/core/module.rb
|
91
|
+
- lib/kind/objects/modules/core/numeric.rb
|
92
|
+
- lib/kind/objects/modules/core/proc.rb
|
93
|
+
- lib/kind/objects/modules/core/queue.rb
|
94
|
+
- lib/kind/objects/modules/core/range.rb
|
95
|
+
- lib/kind/objects/modules/core/regexp.rb
|
96
|
+
- lib/kind/objects/modules/core/string.rb
|
97
|
+
- lib/kind/objects/modules/core/struct.rb
|
98
|
+
- lib/kind/objects/modules/core/symbol.rb
|
99
|
+
- lib/kind/objects/modules/core/time.rb
|
100
|
+
- lib/kind/objects/modules/custom/boolean.rb
|
101
|
+
- lib/kind/objects/modules/custom/callable.rb
|
102
|
+
- lib/kind/objects/modules/custom/lambda.rb
|
103
|
+
- lib/kind/objects/modules/stdlib/open_struct.rb
|
104
|
+
- lib/kind/objects/modules/stdlib/set.rb
|
105
|
+
- lib/kind/objects/nil.rb
|
106
|
+
- lib/kind/objects/not_nil.rb
|
107
|
+
- lib/kind/objects/object.rb
|
108
|
+
- lib/kind/objects/respond_to.rb
|
109
|
+
- lib/kind/objects/union_type.rb
|
57
110
|
- lib/kind/presence.rb
|
111
|
+
- lib/kind/result.rb
|
112
|
+
- lib/kind/result/abstract.rb
|
113
|
+
- lib/kind/result/failure.rb
|
114
|
+
- lib/kind/result/methods.rb
|
115
|
+
- lib/kind/result/monad.rb
|
116
|
+
- lib/kind/result/monad/wrapper.rb
|
117
|
+
- lib/kind/result/success.rb
|
118
|
+
- lib/kind/strict/disabled.rb
|
58
119
|
- lib/kind/try.rb
|
59
|
-
- lib/kind/type_checker.rb
|
60
|
-
- lib/kind/type_checkers.rb
|
61
|
-
- lib/kind/type_checkers/core/array.rb
|
62
|
-
- lib/kind/type_checkers/core/class.rb
|
63
|
-
- lib/kind/type_checkers/core/comparable.rb
|
64
|
-
- lib/kind/type_checkers/core/enumerable.rb
|
65
|
-
- lib/kind/type_checkers/core/enumerator.rb
|
66
|
-
- lib/kind/type_checkers/core/file.rb
|
67
|
-
- lib/kind/type_checkers/core/float.rb
|
68
|
-
- lib/kind/type_checkers/core/hash.rb
|
69
|
-
- lib/kind/type_checkers/core/integer.rb
|
70
|
-
- lib/kind/type_checkers/core/io.rb
|
71
|
-
- lib/kind/type_checkers/core/method.rb
|
72
|
-
- lib/kind/type_checkers/core/module.rb
|
73
|
-
- lib/kind/type_checkers/core/numeric.rb
|
74
|
-
- lib/kind/type_checkers/core/proc.rb
|
75
|
-
- lib/kind/type_checkers/core/queue.rb
|
76
|
-
- lib/kind/type_checkers/core/range.rb
|
77
|
-
- lib/kind/type_checkers/core/regexp.rb
|
78
|
-
- lib/kind/type_checkers/core/string.rb
|
79
|
-
- lib/kind/type_checkers/core/struct.rb
|
80
|
-
- lib/kind/type_checkers/core/symbol.rb
|
81
|
-
- lib/kind/type_checkers/core/time.rb
|
82
|
-
- lib/kind/type_checkers/custom/boolean.rb
|
83
|
-
- lib/kind/type_checkers/custom/callable.rb
|
84
|
-
- lib/kind/type_checkers/custom/lambda.rb
|
85
|
-
- lib/kind/type_checkers/stdlib/open_struct.rb
|
86
|
-
- lib/kind/type_checkers/stdlib/set.rb
|
87
|
-
- lib/kind/undefined.rb
|
88
120
|
- lib/kind/validator.rb
|
89
121
|
- lib/kind/version.rb
|
90
122
|
- test.sh
|
@@ -102,15 +134,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
134
|
requirements:
|
103
135
|
- - ">="
|
104
136
|
- !ruby/object:Gem::Version
|
105
|
-
version: 2.
|
137
|
+
version: 2.1.0
|
106
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
139
|
requirements:
|
108
140
|
- - ">="
|
109
141
|
- !ruby/object:Gem::Version
|
110
142
|
version: '0'
|
111
143
|
requirements: []
|
112
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.2.11
|
113
145
|
signing_key:
|
114
146
|
specification_version: 4
|
115
|
-
summary: A
|
147
|
+
summary: A development toolkit for Ruby with several small/cohesive abstractions to
|
148
|
+
empower your development workflow.
|
116
149
|
test_files: []
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class KindValidator < ActiveModel::EachValidator
|
4
|
-
def validate_each(record, attribute, value)
|
5
|
-
return if options[:allow_nil] && value.nil?
|
6
|
-
|
7
|
-
return unless error = call_validation_for(attribute, value)
|
8
|
-
|
9
|
-
raise Kind::Error.new("#{attribute} #{error}") if options[:strict]
|
10
|
-
|
11
|
-
record.errors.add(attribute, error)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def call_validation_for(attribute, value)
|
17
|
-
expected = options[:with] || options[:in]
|
18
|
-
|
19
|
-
return validate_with_default_strategy(expected, value) if expected
|
20
|
-
|
21
|
-
return kind_of(expected, value) if expected = options[:of]
|
22
|
-
return kind_is(expected, value) if expected = options[:is]
|
23
|
-
return respond_to(expected, value) if expected = options[:respond_to]
|
24
|
-
return instance_of(expected, value) if expected = options[:instance_of]
|
25
|
-
return array_with(expected, value) if expected = options[:array_with]
|
26
|
-
return array_of(expected, value) if expected = options[:array_of]
|
27
|
-
|
28
|
-
raise Kind::Validator::InvalidDefinition.new(attribute)
|
29
|
-
end
|
30
|
-
|
31
|
-
def validate_with_default_strategy(expected, value)
|
32
|
-
send(Kind::Validator.default_strategy, expected, value)
|
33
|
-
end
|
34
|
-
|
35
|
-
def kind_of(expected, value)
|
36
|
-
types = Array(expected)
|
37
|
-
|
38
|
-
return if types.any? { |type| type === value }
|
39
|
-
|
40
|
-
"must be a kind of: #{types.map { |type| type.name }.join(', ')}"
|
41
|
-
end
|
42
|
-
|
43
|
-
CLASS_OR_MODULE = 'Class/Module'.freeze
|
44
|
-
|
45
|
-
def kind_is(expected, value)
|
46
|
-
return kind_is_not(expected, value) unless expected.kind_of?(::Array)
|
47
|
-
|
48
|
-
result = expected.map { |kind| kind_is_not(kind, value) }.tap(&:compact!)
|
49
|
-
|
50
|
-
result.empty? || result.size < expected.size ? nil : result.join(', ')
|
51
|
-
end
|
52
|
-
|
53
|
-
def kind_is_not(expected, value)
|
54
|
-
case expected
|
55
|
-
when ::Class
|
56
|
-
return if expected == Kind::Class[value] || value < expected
|
57
|
-
|
58
|
-
"must be the class or a subclass of `#{expected.name}`"
|
59
|
-
when ::Module
|
60
|
-
return if value.kind_of?(Class) && value <= expected
|
61
|
-
return if expected == Kind.of_module_or_class(value) || value.kind_of?(expected)
|
62
|
-
|
63
|
-
"must include the `#{expected.name}` module"
|
64
|
-
else
|
65
|
-
raise Kind::Error.new(CLASS_OR_MODULE, expected)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def respond_to(expected, value)
|
70
|
-
method_names = Array(expected)
|
71
|
-
|
72
|
-
expected_methods = method_names.select { |method_name| !value.respond_to?(method_name) }
|
73
|
-
expected_methods.map! { |method_name| "`#{method_name}`" }
|
74
|
-
|
75
|
-
return if expected_methods.empty?
|
76
|
-
|
77
|
-
methods = expected_methods.size == 1 ? 'method' : 'methods'
|
78
|
-
|
79
|
-
"must respond to the #{methods}: #{expected_methods.join(', ')}"
|
80
|
-
end
|
81
|
-
|
82
|
-
def instance_of(expected, value)
|
83
|
-
types = Array(expected)
|
84
|
-
|
85
|
-
return if types.any? { |type| value.instance_of?(type) }
|
86
|
-
|
87
|
-
"must be an instance of: #{types.map { |klass| klass.name }.join(', ')}"
|
88
|
-
end
|
89
|
-
|
90
|
-
def array_with(expected, value)
|
91
|
-
return if value.kind_of?(::Array) && !value.empty? && (value - Kind::Array[expected]).empty?
|
92
|
-
|
93
|
-
"must be an array with: #{expected.join(', ')}"
|
94
|
-
end
|
95
|
-
|
96
|
-
def array_of(expected, value)
|
97
|
-
types = Array(expected)
|
98
|
-
|
99
|
-
return if value.kind_of?(::Array) && !value.empty? && value.all? { |value| types.any? { |type| value.kind_of?(type) } }
|
100
|
-
|
101
|
-
"must be an array of: #{types.map { |klass| klass.name }.join(', ')}"
|
102
|
-
end
|
103
|
-
end
|
data/lib/kind/core.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Kind
|
4
|
-
module DEPRECATION # :nodoc: all
|
5
|
-
WARN_IS_DISABLED = String(ENV['DISABLE_KIND_DEPRECATION']).strip == 't'
|
6
|
-
|
7
|
-
module DevNull
|
8
|
-
def self.warn(_)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
OUTPUT = WARN_IS_DISABLED ? DevNull : ::Kernel
|
13
|
-
|
14
|
-
def self.warn(message)
|
15
|
-
OUTPUT.warn("[DEPRECATION] #{message}" % { version: 'version 5.0' })
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.warn_method_replacement(old_method, new_method)
|
19
|
-
self.warn "`#{old_method}` is deprecated, it will be removed in %{version}. " \
|
20
|
-
"Please use `#{new_method}` instead."
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.warn_removal(name)
|
24
|
-
self.warn "`#{name}` is deprecated, it will be removed in %{version}."
|
25
|
-
end
|
26
|
-
|
27
|
-
private_constant :DevNull, :OUTPUT
|
28
|
-
end
|
29
|
-
end
|