rtype 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +34 -67
- data/lib/rtype/behavior/core_ext.rb +1 -5
- data/lib/rtype/behavior.rb +1 -2
- data/lib/rtype/core_ext.rb +4 -13
- data/lib/rtype/version.rb +5 -1
- data/lib/rtype.rb +34 -38
- data/spec/rtype_spec.rb +22 -51
- metadata +2 -3
- data/lib/rtype/behavior/or.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 545e8dc3a8ac3c44aa68d87126c6dbf8d57302bb
|
4
|
+
data.tar.gz: f3d34bb1fb2ecd9cb7f4b0a9315d14fa5a726940
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e39262cd99fdf372ed953a2e4c09cafcc09b7d236946d66d3d37acd03f432e72a0de4f7aaf3cd7d74e0d8997ef0178846ba35c040e209acc08a4a60b4e43f7b5
|
7
|
+
data.tar.gz: e31ad200c1d08bb0077ef429cfa4d813bff2732f04f705eafc0ce4166c9dbbf0f82581a9e4655500fdb35ec09721cc22c3d29104fccf40c789fd2cdc7bd3f8b2
|
data/README.md
CHANGED
@@ -37,9 +37,8 @@ Test::invert(state: 0)
|
|
37
37
|
- If Java extension is used, otherwise it is not required
|
38
38
|
|
39
39
|
## Features
|
40
|
-
-
|
41
|
-
-
|
42
|
-
- [Type checking for array elements](#array)
|
40
|
+
- Provides type checking for arguments and return
|
41
|
+
- Supports type checking for [keyword argument](#keyword-argument)
|
43
42
|
- [Type checking for hash elements](#hash)
|
44
43
|
- [Duck typing](#duck-typing)
|
45
44
|
- Custom type behavior
|
@@ -81,28 +80,23 @@ then, Rtype use it. (Do not `require 'rtype-java'`)
|
|
81
80
|
|
82
81
|
### Supported Type Behaviors
|
83
82
|
- `Module`
|
84
|
-
- Value must be an instance of
|
83
|
+
- Value must be an instance of the module/class or one of its superclasses
|
85
84
|
- `Any` : An alias for `BasicObject` (means Any Object)
|
86
85
|
- `Boolean` : `true` or `false`
|
87
86
|
- `Symbol`
|
88
|
-
- Value must have(respond to) a method with
|
87
|
+
- Value must have(respond to) a method with the name
|
89
88
|
- `Regexp`
|
90
|
-
- Value must match
|
89
|
+
- Value must match the regexp pattern
|
91
90
|
- `Range`
|
92
|
-
- Value must be included in
|
93
|
-
- `Array`
|
94
|
-
- Value
|
95
|
-
- Each of value's elements must be valid
|
96
|
-
- Value's length must be equal to the array's length
|
97
|
-
- Of course, nested array works
|
98
|
-
- Example: [Array](#array)
|
99
|
-
- This can be used as a tuple
|
91
|
+
- Value must be included in the range
|
92
|
+
- `Array`
|
93
|
+
- Value can be any type in the array
|
100
94
|
- `Hash`
|
101
95
|
- Value must be an hash
|
102
96
|
- Each of value’s elements must be valid
|
103
97
|
- Value's key list must be equal to the hash's key list
|
104
98
|
- **String** key is **different** from **symbol** key
|
105
|
-
- vs Keyword arguments
|
99
|
+
- vs Keyword arguments (e.g.)
|
106
100
|
- `[{}]` is **not** hash type argument. it is keyword argument because its position is last
|
107
101
|
- `[{}, {}]` is empty hash type argument (first) and one empty keyword argument (second)
|
108
102
|
- `[{}, {}, {}]` is two empty hash type argument (first, second) and empty keyword argument (last)
|
@@ -110,44 +104,31 @@ then, Rtype use it. (Do not `require 'rtype-java'`)
|
|
110
104
|
- Of course, nested hash works
|
111
105
|
- Example: [Hash](#hash)
|
112
106
|
- `Proc`
|
113
|
-
- Value must return a truthy value for
|
107
|
+
- Value must return a truthy value for the proc
|
114
108
|
- `true`
|
115
109
|
- Value must be **truthy**
|
116
110
|
- `false`
|
117
111
|
- Value must be **falsy**
|
118
112
|
- `nil`
|
119
|
-
-
|
113
|
+
- Value must be nil
|
120
114
|
- Special Behaviors
|
121
115
|
- `Rtype::and(*types)` : Ensure value is valid for all the types
|
122
|
-
- `Rtype::and(*types)`
|
123
|
-
- `
|
124
|
-
- `
|
125
|
-
|
126
|
-
|
127
|
-
- `Rtype::or(*types)` : Ensure value is valid for at least one of the types
|
128
|
-
- `Rtype::or(*types)`
|
129
|
-
- `Rtype::Behavior::Or[*types]`
|
130
|
-
- `include Rtype::Behavior; Or[...]`
|
131
|
-
- `obj.or(*others)` (core extension)
|
132
|
-
|
116
|
+
- `Rtype::and(*types)`, `Rtype::Behavior::And[*types]`, `include Rtype::Behavior; And[...]`
|
117
|
+
- `Array#comb`
|
118
|
+
- `Object#and(*others)`
|
119
|
+
|
133
120
|
- `Rtype::xor(*types)` : Ensure value is valid for only one of the types
|
134
|
-
- `Rtype::xor(*types)`
|
135
|
-
- `
|
136
|
-
- `include Rtype::Behavior; Xor[...]`
|
137
|
-
- `obj.xor(*others)` (core extension)
|
121
|
+
- `Rtype::xor(*types)`, `Rtype::Behavior::Xor[*types]`, `include Rtype::Behavior; Xor[...]`
|
122
|
+
- `Object#xor(*others)`
|
138
123
|
|
139
124
|
- `Rtype::not(*types)` : Ensure value is not valid for all the types
|
140
|
-
- `Rtype::not(*types)`
|
141
|
-
- `
|
142
|
-
- `include Rtype::Behavior; Not[...]`
|
143
|
-
- `obj.not` (core extension)
|
125
|
+
- `Rtype::not(*types)`, `Rtype::Behavior::Not[*types]`, `include Rtype::Behavior; Not[...]`
|
126
|
+
- `Object#not`
|
144
127
|
|
145
128
|
- `Rtype::nilable(type)` : Ensure value can be nil
|
146
|
-
- `Rtype::nilable(type)`
|
147
|
-
- `
|
148
|
-
- `
|
149
|
-
- `obj.nilable` (core extension)
|
150
|
-
- `obj.or_nil` (core extension)
|
129
|
+
- `Rtype::nilable(type)`, `Rtype::Behavior::Nilable[type]`, `include Rtype::Behavior; Nilable[...]`
|
130
|
+
- `Object#nilable`
|
131
|
+
- `Object#or_nil`
|
151
132
|
|
152
133
|
- You can create custom behavior by extending `Rtype::Behavior::Base`
|
153
134
|
|
@@ -224,33 +205,19 @@ Duck.new.says("2") # duck: quack quack
|
|
224
205
|
```
|
225
206
|
|
226
207
|
#### Array
|
227
|
-
This can be used as a tuple.
|
228
|
-
|
229
208
|
```ruby
|
230
|
-
rtype :
|
231
|
-
def
|
232
|
-
|
209
|
+
rtype :ruby!, [[String, Integer]] => Any
|
210
|
+
def ruby!(arg)
|
211
|
+
puts "ruby!"
|
233
212
|
end
|
234
213
|
|
235
|
-
func
|
236
|
-
|
237
|
-
# Expected [1, "str"] to be an array with 2 elements:
|
238
|
-
# - [0] index : Expected 1 to be a Numeric
|
239
|
-
# - [1] index : Expected "str" to be a Numeric
|
240
|
-
|
241
|
-
func [1, 2, 3]
|
242
|
-
# (Rtype::ArgumentTypeError) for 1st argument:
|
243
|
-
# Expected [1, 2, 3] to be an array with 2 elements:
|
244
|
-
# - [0] index : Expected 1 to be a Numeric
|
245
|
-
# - [1] index : Expected 2 to be a Numeric
|
214
|
+
func("str") # ruby!
|
215
|
+
func(123) # ruby!
|
246
216
|
|
247
|
-
func
|
217
|
+
func(nil)
|
248
218
|
# (Rtype::ArgumentTypeError) for 1st argument:
|
249
|
-
# Expected
|
250
|
-
#
|
251
|
-
# - [1] index : Expected nil to be a Numeric
|
252
|
-
|
253
|
-
func [1, 2] # Your location is (1, 2). I will look for you. I will find you
|
219
|
+
# Expected nil to be a String
|
220
|
+
# OR Expected nil to be a Integer
|
254
221
|
```
|
255
222
|
|
256
223
|
#### Hash
|
@@ -316,7 +283,7 @@ Example.new.value
|
|
316
283
|
require 'rtype'
|
317
284
|
|
318
285
|
class Example
|
319
|
-
rtype [String
|
286
|
+
rtype [[String, :func].comb] => Any
|
320
287
|
# also works:
|
321
288
|
# rtype [Rtype::and(String, :func)] => Any
|
322
289
|
def and_test(arg)
|
@@ -349,12 +316,12 @@ module Game
|
|
349
316
|
ENEMY = [
|
350
317
|
:name,
|
351
318
|
:level
|
352
|
-
]
|
319
|
+
].comb
|
353
320
|
|
354
321
|
class Player < Entity
|
355
322
|
include Rtype::Behavior
|
356
323
|
|
357
|
-
rtype [
|
324
|
+
rtype [ENEMY] => Any
|
358
325
|
def attacks(enemy)
|
359
326
|
"Player attacks '#{enemy.name}' (level #{enemy.level})!"
|
360
327
|
end
|
@@ -565,4 +532,4 @@ Sputnik Gugja (sputnikgugja@gmail.com)
|
|
565
532
|
## License
|
566
533
|
MIT license (@ Sputnik Gugja)
|
567
534
|
|
568
|
-
See `LICENSE` file.
|
535
|
+
See `LICENSE` file.
|
data/lib/rtype/behavior.rb
CHANGED
@@ -4,9 +4,8 @@ module Rtype
|
|
4
4
|
end
|
5
5
|
|
6
6
|
require_relative 'behavior/base'
|
7
|
-
require_relative 'behavior/or'
|
8
7
|
require_relative 'behavior/and'
|
9
8
|
require_relative 'behavior/xor'
|
10
9
|
require_relative 'behavior/not'
|
11
10
|
require_relative 'behavior/nilable'
|
12
|
-
require_relative 'behavior/core_ext'
|
11
|
+
require_relative 'behavior/core_ext'
|
data/lib/rtype/core_ext.rb
CHANGED
@@ -83,17 +83,8 @@ class Method
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
class
|
87
|
-
def
|
88
|
-
|
89
|
-
"#{self}th"
|
90
|
-
else
|
91
|
-
case self % 10
|
92
|
-
when 1; "#{self}st"
|
93
|
-
when 2; "#{self}nd"
|
94
|
-
when 3; "#{self}rd"
|
95
|
-
else "#{self}th"
|
96
|
-
end
|
97
|
-
end
|
86
|
+
class Array
|
87
|
+
def comb
|
88
|
+
::Rtype::Behavior::And[*self]
|
98
89
|
end
|
99
|
-
end
|
90
|
+
end
|
data/lib/rtype/version.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
1
|
module Rtype
|
2
|
-
VERSION = "0.
|
2
|
+
VERSION = "0.6.0".freeze
|
3
|
+
# rtype java extension version. nil If the extension is not used
|
4
|
+
JAVA_EXT_VERSION = nil unless defined?(JAVA_EXT_VERSION)
|
5
|
+
# rtype c extension version. nil If the extension is not used
|
6
|
+
NATIVE_EXT_VERSION = nil unless defined?(NATIVE_EXT_VERSION)
|
3
7
|
end
|
data/lib/rtype.rb
CHANGED
@@ -98,14 +98,13 @@ module Rtype
|
|
98
98
|
end
|
99
99
|
|
100
100
|
def arg_message(idx)
|
101
|
-
"for #{(idx+1)
|
101
|
+
"for #{ordinalize_number(idx+1)} argument:"
|
102
102
|
end
|
103
103
|
|
104
104
|
def kwarg_message(key)
|
105
105
|
"for '#{key}' argument:"
|
106
106
|
end
|
107
107
|
|
108
|
-
|
109
108
|
def type_error_message(expected, value)
|
110
109
|
case expected
|
111
110
|
when Rtype::Behavior::Base
|
@@ -119,18 +118,8 @@ module Rtype
|
|
119
118
|
when Range
|
120
119
|
"Expected #{value.inspect} to be included in range #{expected.inspect}"
|
121
120
|
when Array
|
122
|
-
|
123
|
-
|
124
|
-
if e.is_a?(Array) || e.is_a?(Hash)
|
125
|
-
"- [#{idx}] index : {\n" + type_error_message(e, value[idx]) + "\n}"
|
126
|
-
else
|
127
|
-
"- [#{idx}] index : " + type_error_message(e, value[idx])
|
128
|
-
end
|
129
|
-
end
|
130
|
-
"Expected #{value.inspect} to be an array with #{expected.length} elements:\n" + arr.join("\n")
|
131
|
-
else
|
132
|
-
"Expected #{value.inspect} to be an array"
|
133
|
-
end
|
121
|
+
arr = expected.map { |e| type_error_message(e, value) }
|
122
|
+
arr.join("\nOR ")
|
134
123
|
when Hash
|
135
124
|
if value.is_a?(Hash)
|
136
125
|
arr = []
|
@@ -208,13 +197,14 @@ module Rtype
|
|
208
197
|
when Proc
|
209
198
|
when true
|
210
199
|
when false
|
200
|
+
when nil
|
211
201
|
else
|
212
202
|
raise TypeSignatureError, "Invalid type signature: Unknown type behavior #{sig}"
|
213
203
|
end
|
214
204
|
end
|
215
205
|
|
216
206
|
def assert_valid_return_type_sig(sig)
|
217
|
-
assert_valid_argument_type_sig_element(sig)
|
207
|
+
assert_valid_argument_type_sig_element(sig)
|
218
208
|
end
|
219
209
|
|
220
210
|
private
|
@@ -233,7 +223,19 @@ private
|
|
233
223
|
end
|
234
224
|
nil
|
235
225
|
end
|
236
|
-
|
226
|
+
|
227
|
+
def ordinalize_number(num)
|
228
|
+
if (11..13).include?(num % 100)
|
229
|
+
"#{num}th"
|
230
|
+
else
|
231
|
+
case num % 10
|
232
|
+
when 1; "#{num}st"
|
233
|
+
when 2; "#{num}nd"
|
234
|
+
when 3; "#{num}rd"
|
235
|
+
else "#{num}th"
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
237
239
|
public
|
238
240
|
unless respond_to?(:valid?)
|
239
241
|
# validate argument type
|
@@ -252,10 +254,7 @@ public
|
|
252
254
|
return false unless expected.keys == value.keys
|
253
255
|
expected.all? { |k, v| valid?(v, value[k]) }
|
254
256
|
when Array
|
255
|
-
|
256
|
-
return false unless expected.length == value.length
|
257
|
-
idx = -1
|
258
|
-
expected.all? { |e| idx += 1; valid?(e, value[idx]) }
|
257
|
+
expected.any? { |e| valid?(e, value) }
|
259
258
|
when Proc
|
260
259
|
!!expected.call(value)
|
261
260
|
when true
|
@@ -264,6 +263,8 @@ public
|
|
264
263
|
!value
|
265
264
|
when Rtype::Behavior::Base
|
266
265
|
expected.valid? value
|
266
|
+
when nil
|
267
|
+
value.nil?
|
267
268
|
else
|
268
269
|
raise TypeSignatureError, "Invalid type signature: Unknown type behavior #{expected}"
|
269
270
|
end
|
@@ -272,14 +273,14 @@ public
|
|
272
273
|
|
273
274
|
unless respond_to?(:assert_arguments_type)
|
274
275
|
def assert_arguments_type(expected_args, args)
|
276
|
+
e_len = expected_args.length
|
275
277
|
# `length.times` is faster than `each_with_index`
|
276
278
|
args.length.times do |i|
|
279
|
+
break if i >= e_len
|
277
280
|
expected = expected_args[i]
|
278
281
|
value = args[i]
|
279
|
-
unless expected
|
280
|
-
|
281
|
-
raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
|
282
|
-
end
|
282
|
+
unless valid?(expected, value)
|
283
|
+
raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
|
283
284
|
end
|
284
285
|
end
|
285
286
|
end
|
@@ -287,19 +288,20 @@ public
|
|
287
288
|
|
288
289
|
unless respond_to?(:assert_arguments_type_with_keywords)
|
289
290
|
def assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
|
291
|
+
e_len = expected_args.length
|
290
292
|
# `length.times` is faster than `each_with_index`
|
291
293
|
args.length.times do |i|
|
294
|
+
break if i >= e_len
|
292
295
|
expected = expected_args[i]
|
293
296
|
value = args[i]
|
294
|
-
unless expected
|
295
|
-
|
296
|
-
raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
|
297
|
-
end
|
297
|
+
unless valid?(expected, value)
|
298
|
+
raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
|
298
299
|
end
|
299
300
|
end
|
301
|
+
|
300
302
|
kwargs.each do |key, value|
|
301
|
-
|
302
|
-
|
303
|
+
if expected_kwargs.key?(key)
|
304
|
+
expected = expected_kwargs[key]
|
303
305
|
unless valid?(expected, value)
|
304
306
|
raise ArgumentTypeError, "#{kwarg_message(key)}\n" + type_error_message(expected, value)
|
305
307
|
end
|
@@ -310,14 +312,8 @@ public
|
|
310
312
|
|
311
313
|
unless respond_to?(:assert_return_type)
|
312
314
|
def assert_return_type(expected, result)
|
313
|
-
|
314
|
-
|
315
|
-
raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
|
316
|
-
end
|
317
|
-
else
|
318
|
-
unless valid?(expected, result)
|
319
|
-
raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
|
320
|
-
end
|
315
|
+
unless valid?(expected, result)
|
316
|
+
raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
|
321
317
|
end
|
322
318
|
end
|
323
319
|
end
|
data/spec/rtype_spec.rb
CHANGED
@@ -237,31 +237,30 @@ describe Rtype do
|
|
237
237
|
|
238
238
|
describe 'Array' do
|
239
239
|
it "is right" do
|
240
|
-
klass.send :rtype, :return_arg, [[:to_i
|
241
|
-
instance.return_arg(
|
240
|
+
klass.send :rtype, :return_arg, [[:to_i]] => Any
|
241
|
+
instance.return_arg(123)
|
242
242
|
|
243
|
-
klass.send :rtype, :
|
244
|
-
instance.
|
243
|
+
klass.send :rtype, :return_arg, [[String, Integer]] => Any
|
244
|
+
instance.return_arg("str")
|
245
|
+
instance.return_arg(123)
|
246
|
+
|
247
|
+
klass.send :rtype, :return_arg, [] => [String, Integer]
|
248
|
+
instance.return_arg("str")
|
249
|
+
instance.return_arg(123)
|
245
250
|
end
|
246
251
|
it "is wrong args" do
|
247
|
-
klass.send :rtype, :return_arg, [[
|
248
|
-
expect {
|
249
|
-
instance.return_arg([123, [true]])
|
250
|
-
}.to raise_error Rtype::ArgumentTypeError
|
252
|
+
klass.send :rtype, :return_arg, [[String, Integer]] => Any
|
251
253
|
expect {
|
252
|
-
instance.return_arg(
|
254
|
+
instance.return_arg(nil)
|
253
255
|
}.to raise_error Rtype::ArgumentTypeError
|
254
256
|
|
255
|
-
klass.send :rtype, :
|
257
|
+
klass.send :rtype, :return_arg, [[String]] => Any
|
256
258
|
expect {
|
257
|
-
instance.
|
258
|
-
}.to raise_error Rtype::ArgumentTypeError
|
259
|
-
expect {
|
260
|
-
instance.two_args([123], 123)
|
259
|
+
instance.return_arg(123)
|
261
260
|
}.to raise_error Rtype::ArgumentTypeError
|
262
261
|
end
|
263
262
|
it "is wrong result" do
|
264
|
-
klass.send :rtype, :return_arg, [Any] => [
|
263
|
+
klass.send :rtype, :return_arg, [Any] => [String, Integer]
|
265
264
|
expect {instance.return_arg(true)}.to raise_error Rtype::ReturnTypeError
|
266
265
|
end
|
267
266
|
end
|
@@ -335,17 +334,19 @@ describe Rtype do
|
|
335
334
|
end
|
336
335
|
|
337
336
|
describe 'nil' do
|
338
|
-
it "
|
337
|
+
it "for return" do
|
339
338
|
klass.send :rtype, :return_nil, [] => nil
|
340
339
|
instance.return_nil(123)
|
341
340
|
|
342
341
|
klass.send :rtype, :return_arg, [] => nil
|
343
342
|
expect {instance.return_arg(123)}.to raise_error Rtype::ReturnTypeError
|
344
343
|
end
|
345
|
-
it "
|
344
|
+
it "for args" do
|
345
|
+
klass.send :rtype, :return_arg, [nil] => Any
|
346
|
+
instance.return_arg(nil)
|
346
347
|
expect {
|
347
|
-
|
348
|
-
}.to raise_error Rtype::
|
348
|
+
instance.return_arg(123)
|
349
|
+
}.to raise_error Rtype::ArgumentTypeError
|
349
350
|
end
|
350
351
|
end
|
351
352
|
|
@@ -370,29 +371,6 @@ describe Rtype do
|
|
370
371
|
end
|
371
372
|
end
|
372
373
|
|
373
|
-
describe 'Rtype::Behavior::Or' do
|
374
|
-
it 'module singleton method' do
|
375
|
-
klass.send :rtype, :return_nil, [Rtype::or(Integer, String)] => nil
|
376
|
-
instance.return_nil(123)
|
377
|
-
instance.return_nil("abc")
|
378
|
-
expect {instance.return_nil(nil)}.to raise_error Rtype::ArgumentTypeError
|
379
|
-
end
|
380
|
-
|
381
|
-
it 'class singleton [] method' do
|
382
|
-
klass.send :rtype, :return_nil, [ Rtype::Behavior::Or[Integer, String] ] => nil
|
383
|
-
instance.return_nil(123)
|
384
|
-
instance.return_nil("abc")
|
385
|
-
expect {instance.return_nil(nil)}.to raise_error Rtype::ArgumentTypeError
|
386
|
-
end
|
387
|
-
|
388
|
-
it 'core extension method' do
|
389
|
-
klass.send :rtype, :return_nil, [ Integer.or(String) ] => nil
|
390
|
-
instance.return_nil(123)
|
391
|
-
instance.return_nil("abc")
|
392
|
-
expect {instance.return_nil(nil)}.to raise_error Rtype::ArgumentTypeError
|
393
|
-
end
|
394
|
-
end
|
395
|
-
|
396
374
|
describe 'Rtype::Behavior::Nilable' do
|
397
375
|
it 'module singleton method' do
|
398
376
|
klass.send :rtype, :return_nil, [Rtype::nilable(Integer)] => nil
|
@@ -480,13 +458,6 @@ describe Rtype do
|
|
480
458
|
expect {instance.sum(1, 2.0)}.to raise_error Rtype::ArgumentTypeError
|
481
459
|
end
|
482
460
|
|
483
|
-
it 'two array' do
|
484
|
-
klass.send :rtype, :sum, [[Integer], [Integer]] => Any
|
485
|
-
instance.sum([1], [2])
|
486
|
-
expect {instance.sum([1], 2)}.to raise_error Rtype::ArgumentTypeError
|
487
|
-
expect {instance.sum([1], ["str"])}.to raise_error Rtype::ArgumentTypeError
|
488
|
-
end
|
489
|
-
|
490
461
|
it 'two hash' do
|
491
462
|
klass.send :rtype, :two_args, [{k: Integer}, {k: Integer}, {}] => Any
|
492
463
|
instance.two_args({k: 123}, {k: 456}, {})
|
@@ -564,9 +535,9 @@ describe Rtype do
|
|
564
535
|
instance.return_arg("str")
|
565
536
|
end
|
566
537
|
|
567
|
-
it 'Array
|
538
|
+
it 'Array' do
|
568
539
|
klass.send :rtype, :return_arg, [] => [Integer, Float]
|
569
|
-
expect {instance.return_arg(
|
540
|
+
expect {instance.return_arg("str")}.to raise_error Rtype::ReturnTypeError
|
570
541
|
end
|
571
542
|
end
|
572
543
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rtype
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sputnik Gugja
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -72,7 +72,6 @@ files:
|
|
72
72
|
- lib/rtype/behavior/core_ext.rb
|
73
73
|
- lib/rtype/behavior/nilable.rb
|
74
74
|
- lib/rtype/behavior/not.rb
|
75
|
-
- lib/rtype/behavior/or.rb
|
76
75
|
- lib/rtype/behavior/xor.rb
|
77
76
|
- lib/rtype/core_ext.rb
|
78
77
|
- lib/rtype/method_annotator.rb
|
data/lib/rtype/behavior/or.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Rtype
|
2
|
-
module Behavior
|
3
|
-
class Or < Base
|
4
|
-
def initialize(*types)
|
5
|
-
@types = types
|
6
|
-
end
|
7
|
-
|
8
|
-
def valid?(value)
|
9
|
-
@types.any? do |e|
|
10
|
-
Rtype::valid? e, value
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def error_message(value)
|
15
|
-
arr = @types.map { |e| Rtype::type_error_message(e, value) }
|
16
|
-
arr.join "\nOR "
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def or(*args)
|
22
|
-
Behavior::Or[*args]
|
23
|
-
end
|
24
|
-
end
|