type_validator 0.8.0 → 0.9.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/lib/type_validator.rb +54 -16
- data/lib/type_validator/version.rb +1 -1
- metadata +2 -7
- data/lib/type_validator/by_array_of.rb +0 -15
- data/lib/type_validator/by_array_with.rb +0 -17
- data/lib/type_validator/by_kind_of.rb +0 -15
- data/lib/type_validator/by_klass.rb +0 -22
- data/lib/type_validator/by_respond_to.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98d8d425b5e4434e03c1f6bbe6dc6e2c5597faa6fd9479a28bfcf689c4e4797e
|
4
|
+
data.tar.gz: 7131ce004a821ad619a524cb13076c8f5011e5939b9990261a7eb6b617b62f69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7cd464b044de2061659dea89ee3f2b832842908e08505d7335038f7a124e3393dca4cb4c3175df9d694ff6337e1ca25704c0937a3d5df8baadb3fa47d569c4c
|
7
|
+
data.tar.gz: 97e84add9774959d8dea83eb9156d5f62c8a64d3b053709cae35315f40832b2f5713fe59255ed51c1f3191f0e85be6d101cdc57fd5c3633093581b07db9eee86
|
data/lib/type_validator.rb
CHANGED
@@ -4,12 +4,9 @@ require 'active_model'
|
|
4
4
|
|
5
5
|
class TypeValidator < ActiveModel::EachValidator
|
6
6
|
def validate_each(record, attribute, value)
|
7
|
-
strategy = fetch_strategy(options)
|
8
|
-
|
9
|
-
raise Error::InvalidDefinition.new(attribute) unless strategy
|
10
|
-
|
11
7
|
return if options[:allow_nil] && value.nil?
|
12
|
-
|
8
|
+
|
9
|
+
return unless error = validate_type_of(attribute, value)
|
13
10
|
|
14
11
|
raise TypeError, "#{attribute} #{error}" if options[:strict]
|
15
12
|
|
@@ -18,19 +15,60 @@ class TypeValidator < ActiveModel::EachValidator
|
|
18
15
|
|
19
16
|
private
|
20
17
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
def validate_type_of(attribute, value)
|
19
|
+
if expected = options[:is_a] ; return validate_kind_of(value, expected) ; end
|
20
|
+
if expected = options[:kind_of] ; return validate_kind_of(value, expected) ; end
|
21
|
+
if expected = options[:respond_to]; return validate_respond_to(value, expected); end
|
22
|
+
if expected = options[:klass] ; return validate_klass(value, expected) ; end
|
23
|
+
if expected = options[:array_of] ; return validate_array_of(value, expected) ; end
|
24
|
+
if expected = options[:array_with]; return validate_array_with(value, expected); end
|
25
|
+
|
26
|
+
raise Error::InvalidDefinition.new(attribute)
|
27
|
+
end
|
28
|
+
|
29
|
+
def validate_kind_of(value, expected)
|
30
|
+
types = Array(expected)
|
31
|
+
|
32
|
+
return if types.any? { |type| value.is_a?(type) }
|
33
|
+
|
34
|
+
"must be a kind of: #{types.map { |klass| klass.name }.join(', ')}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def validate_respond_to(value, method_name)
|
38
|
+
return if value.respond_to?(method_name)
|
39
|
+
|
40
|
+
"must respond to the method `#{method_name}`"
|
41
|
+
end
|
42
|
+
|
43
|
+
def validate_klass(value, klass)
|
44
|
+
require_a_class(value)
|
45
|
+
require_a_class(klass)
|
46
|
+
|
47
|
+
return if value == klass || value < klass
|
48
|
+
|
49
|
+
"must be the or a subclass of `#{klass.name}`"
|
50
|
+
end
|
51
|
+
|
52
|
+
def require_a_class(arg)
|
53
|
+
raise ArgumentError, "#{arg} must be a class" unless arg.is_a?(Class)
|
54
|
+
end
|
55
|
+
|
56
|
+
def validate_array_of(value, expected)
|
57
|
+
types = Array(expected)
|
58
|
+
|
59
|
+
return if value.is_a?(Array) && !value.empty? && value.all? { |value| types.any? { |type| value.is_a?(type) } }
|
60
|
+
|
61
|
+
"must be an array of: #{types.map { |klass| klass.name }.join(', ')}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def validate_array_with(value, expected)
|
65
|
+
raise ArgumentError, "#{expected} must be an array" unless expected.is_a?(Array)
|
66
|
+
|
67
|
+
return if value.is_a?(Array) && !value.empty? && (value - expected).empty?
|
68
|
+
|
69
|
+
"must be an array with: #{expected.join(', ')}"
|
27
70
|
end
|
28
71
|
end
|
29
72
|
|
30
73
|
require 'type_validator/version'
|
31
74
|
require 'type_validator/error'
|
32
|
-
require 'type_validator/by_klass'
|
33
|
-
require 'type_validator/by_kind_of'
|
34
|
-
require 'type_validator/by_array_of'
|
35
|
-
require 'type_validator/by_array_with'
|
36
|
-
require 'type_validator/by_respond_to'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: type_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.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: 2019-09-
|
11
|
+
date: 2019-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -85,11 +85,6 @@ files:
|
|
85
85
|
- bin/console
|
86
86
|
- bin/setup
|
87
87
|
- lib/type_validator.rb
|
88
|
-
- lib/type_validator/by_array_of.rb
|
89
|
-
- lib/type_validator/by_array_with.rb
|
90
|
-
- lib/type_validator/by_kind_of.rb
|
91
|
-
- lib/type_validator/by_klass.rb
|
92
|
-
- lib/type_validator/by_respond_to.rb
|
93
88
|
- lib/type_validator/error.rb
|
94
89
|
- lib/type_validator/version.rb
|
95
90
|
- test.sh
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_model'
|
4
|
-
|
5
|
-
class TypeValidator
|
6
|
-
module ByArrayOf
|
7
|
-
def self.invalid?(value, options)
|
8
|
-
types = Array(options[:array_of])
|
9
|
-
|
10
|
-
return if value.is_a?(Array) && !value.empty? && value.all? { |value| types.any? { |type| value.is_a?(type) } }
|
11
|
-
|
12
|
-
"must be an array of: #{types.map { |klass| klass.name }.join(', ')}"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_model'
|
4
|
-
|
5
|
-
class TypeValidator
|
6
|
-
module ByArrayWith
|
7
|
-
def self.invalid?(value, options)
|
8
|
-
expected = options[:array_with]
|
9
|
-
|
10
|
-
raise ArgumentError, "#{expected} must be an array" unless expected.is_a?(Array)
|
11
|
-
|
12
|
-
return if value.is_a?(Array) && !value.empty? && (value - expected).empty?
|
13
|
-
|
14
|
-
"must be an array with: #{expected.join(', ')}"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_model'
|
4
|
-
|
5
|
-
class TypeValidator
|
6
|
-
module ByKindOf
|
7
|
-
def self.invalid?(value, options)
|
8
|
-
types = Array(options[:is_a] || options[:kind_of])
|
9
|
-
|
10
|
-
return if types.any? { |type| value.is_a?(type) }
|
11
|
-
|
12
|
-
"must be a kind of: #{types.map { |klass| klass.name }.join(', ')}"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_model'
|
4
|
-
|
5
|
-
class TypeValidator
|
6
|
-
module ByKlass
|
7
|
-
def self.invalid?(value, options)
|
8
|
-
klass = options[:klass]
|
9
|
-
|
10
|
-
require_a_class(value)
|
11
|
-
require_a_class(klass)
|
12
|
-
|
13
|
-
return if value == klass || value < klass
|
14
|
-
|
15
|
-
"must be the or a subclass of `#{klass.name}`"
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.require_a_class(arg)
|
19
|
-
raise ArgumentError, "#{arg} must be a class" unless arg.is_a?(Class)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_model'
|
4
|
-
|
5
|
-
class TypeValidator
|
6
|
-
module ByRespondTo
|
7
|
-
def self.invalid?(value, options)
|
8
|
-
method_name = options[:respond_to]
|
9
|
-
|
10
|
-
return if value.respond_to?(method_name)
|
11
|
-
|
12
|
-
"must respond to the method `#{method_name}`"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|