Commit d585139 1 parent f83fcb0 commit d585139 Copy full SHA for d585139
File tree 4 files changed +97
-1
lines changed
4 files changed +97
-1
lines changed Original file line number Diff line number Diff line change @@ -101,6 +101,29 @@ sig name: T.RangeOf(Integer)
101
101
def create (name: 1 ...2 ); end
102
102
` ` `
103
103
104
+ #### ` ArrayOf `
105
+
106
+ Value **MUST** be an Array of the given type
107
+
108
+ ` ` ` ruby
109
+ sig names: T .ArrayOf (String )
110
+ def create (names: [' Joel' , ' Ash' ]); end
111
+ ` ` `
112
+
113
+ #### ` Enumerable `
114
+
115
+ Value **MUST** be an Enumerable of the optional given type
116
+
117
+ ` ` ` ruby
118
+ sig users: T .Enumerable
119
+ def create (users: [1 , 2 ]); end
120
+ ` ` `
121
+
122
+ ` ` ` ruby
123
+ sig users: T .Enumerable (User )
124
+ def create (users: User .all); end
125
+ ` ` `
126
+
104
127
#### ` Any `
105
128
106
129
Value **MUST** be any of the given list of values, that is, the value must be one of the given list.
Original file line number Diff line number Diff line change 1
1
# frozen_string_literal: true
2
2
3
3
module Delivered
4
+ EXPENSIVE_TYPE_CHECKS = ENV [ 'DELIVERED_EXPENSIVE_TYPE_CHECKS' ] != 'false'
5
+
4
6
class ArgumentError < ArgumentError
5
7
end
6
8
Original file line number Diff line number Diff line change @@ -13,6 +13,42 @@ def ===(value)
13
13
end
14
14
end
15
15
16
+ class EnumerableType
17
+ def initialize ( type )
18
+ @type = type
19
+ end
20
+
21
+ def inspect = "Enumerable(#{ @type . inspect } )"
22
+
23
+ if Delivered ::EXPENSIVE_TYPE_CHECKS
24
+ def ===( value )
25
+ Enumerable === value && value . all? { |item | @type === item }
26
+ end
27
+ else
28
+ def ===( value )
29
+ Enumerable === value && ( value . empty? || @type === value . first )
30
+ end
31
+ end
32
+ end
33
+
34
+ class ArrayOfType
35
+ def initialize ( type )
36
+ @type = type
37
+ end
38
+
39
+ def inspect = "ArrayOf(#{ @type . inspect } )"
40
+
41
+ if Delivered ::EXPENSIVE_TYPE_CHECKS
42
+ def ===( value )
43
+ Array === value && value . all? { |item | @type === item }
44
+ end
45
+ else
46
+ def ===( value )
47
+ Array === value && ( value . empty? || @type === value [ 0 ] )
48
+ end
49
+ end
50
+ end
51
+
16
52
class RangeOfType
17
53
def initialize ( type )
18
54
@type = type
@@ -68,7 +104,9 @@ module Types
68
104
module_function
69
105
70
106
def Nilable ( type = nil ) = NilableType . new ( type )
71
- def RangeOf ( type = nil ) = RangeOfType . new ( type )
107
+ def Enumerable ( type = nil ) = EnumerableType . new ( type )
108
+ def ArrayOf ( type ) = ArrayOfType . new ( type )
109
+ def RangeOf ( type ) = RangeOfType . new ( type )
72
110
def RespondTo ( *methods ) = RespondToType . new ( *methods )
73
111
def Any ( *types ) = AnyType . new ( *types )
74
112
def Boolean = BooleanType . new
Original file line number Diff line number Diff line change 43
43
end
44
44
end
45
45
46
+ describe 'ArrayOf' do
47
+ it 'should be an Array of given type' do
48
+ assert T . ArrayOf ( Integer ) === [ 1 , 2 ]
49
+ assert T . ArrayOf ( Integer ) === [ ]
50
+ end
51
+
52
+ it 'raises when not an Array' do
53
+ expect { 1 => ^( T . ArrayOf ( Integer ) ) } . to raise_exception NoMatchingPatternError
54
+ end
55
+
56
+ it 'raises when not an Array of given type' do
57
+ expect { [ 1 ] => ^( T . ArrayOf ( String ) ) } . to raise_exception NoMatchingPatternError
58
+ expect { [ 'w' , 1 ] => ^( T . ArrayOf ( String ) ) } . to raise_exception NoMatchingPatternError
59
+ end
60
+ end
61
+
62
+ describe 'Enumerable' do
63
+ it 'should be an Enumerable of given type' do
64
+ assert T . Enumerable === [ ]
65
+ assert T . Enumerable ( Integer ) === [ 1 , 2 ]
66
+ assert T . Enumerable ( Integer ) === [ ]
67
+ end
68
+
69
+ it 'raises when not an Enumerable' do
70
+ expect { 1 => ^( T . Enumerable ( Integer ) ) } . to raise_exception NoMatchingPatternError
71
+ end
72
+
73
+ it 'raises when not an Enumerable of given type' do
74
+ expect { [ 1 ] => ^( T . Enumerable ( String ) ) } . to raise_exception NoMatchingPatternError
75
+ expect { [ 'w' , 1 ] => ^( T . Enumerable ( String ) ) } . to raise_exception NoMatchingPatternError
76
+ end
77
+ end
78
+
46
79
describe 'RangeOf' do
47
80
it 'should be a Range of given type' do
48
81
assert T . RangeOf ( Integer ) === ( 1 ..2 )
You can’t perform that action at this time.
0 commit comments