rtype 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 573badbc833de876d782b2e6c3fb21a0ca10cd49
4
- data.tar.gz: ebd29e696a8752c8f79ac4867d24ac63cedbd72b
3
+ metadata.gz: c238c2b45a71c23c3d5c3a4f442d7c71f512b05b
4
+ data.tar.gz: a4068b256226cc7b8b16e1dbb31c1c086e892fb1
5
5
  SHA512:
6
- metadata.gz: ddda1bff5a6d6f2af36d738fecd36b74f148c912de27d2f4b7c85f8f95d235eade4000746e0ab418075b9817671f734faa0a0882dc96d75f3fff995aa9b977fc
7
- data.tar.gz: 74da35dc41d1b3c4380a9a405ef3ee68a87ded82eaf99269ea35fc1d504e7bfde5fa96495eeffe7fe9e218c1c03d902b7781894b2ca5472104944543d832f0e3
6
+ metadata.gz: a71adbd7caa172f8aeda43b017f9e8a28ff57851c96e21a4461177b24fa0e242624db8193482e07bfda8999b687179507648693eac8fd9eedcd8bbbedee84f4a
7
+ data.tar.gz: 0d308aeadfa63866b391c219c2d3e162722221aed6c8e6480ebc72b7fb0f934f32d173a12cef40c23a6d909425efea898dbe56129f5877c1f1ff848cd402395f
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec :name => 'rtype'
data/README.md CHANGED
@@ -31,9 +31,9 @@ Test::invert(state: 0)
31
31
 
32
32
  ## Requirements
33
33
  - Ruby >= 2.1
34
+ - MRI or RBX if native extension is used. Rtype itself without it is pure-ruby gem, therefore you can use Rtype in JRuby, etc.
34
35
 
35
36
  ## Features
36
- - Very simple
37
37
  - Provide type checking for argument and return
38
38
  - Support type checking for [keyword argument](#keyword-argument)
39
39
  - [Type checking for array elements](#array)
@@ -48,6 +48,14 @@ And add to your `.rb` source file:
48
48
  require 'rtype'
49
49
  ```
50
50
 
51
+ ### Native extension
52
+ Rtype itself is pure-ruby gem. but you can make it more faster by native extension.
53
+
54
+ Just run `gem install rtype-native` or add `gem 'rtype-native'` to your `Gemfile`, then Rtype use it.
55
+ (Do not `require 'rtype-native'`)
56
+
57
+ It is only for MRI or RBX. JRuby extension not supported yet.
58
+
51
59
  ## Usage
52
60
 
53
61
  ### Supported Type Behaviors
@@ -360,100 +368,70 @@ Example.new.method(:test).return_type
360
368
  ## Benchmarks
361
369
  Result of `rake benchmark` ([source](https://github.com/sputnikgugja/rtype/tree/master/benchmark/benchmark.rb))
362
370
 
363
- The benchmark doesn't include `Rubype` gem because I can't install Rubype on my environment.
364
-
365
371
  ### MRI
366
- Rtype is 1.56x faster than Sig and 2.85x faster than Contracts
367
-
368
372
  ```
369
373
  Ruby version: 2.1.7
370
374
  Ruby engine: ruby
371
375
  Ruby description: ruby 2.1.7p400 (2015-08-18 revision 51632) [x64-mingw32]
372
- Rtype version: 0.1.1
376
+ Rtype version: 0.2.0
377
+ Rubype version: 0.3.1
373
378
  Sig version: 1.0.1
374
379
  Contracts version: 0.13.0
375
380
  Typecheck version: 0.1.2
376
381
  Warming up --------------------------------------
377
- pure 52.239k i/100ms
378
- rtype 7.861k i/100ms
379
- sig 5.680k i/100ms
380
- contracts 3.514k i/100ms
381
- typecheck 813.000 i/100ms
382
+ pure 85.600k i/100ms
383
+ rtype 25.735k i/100ms
384
+ rubype 20.922k i/100ms
385
+ sig 8.960k i/100ms
386
+ contracts 4.659k i/100ms
387
+ typecheck 1.102k i/100ms
382
388
  Calculating -------------------------------------
383
- pure 2.125M25.5%) i/s - 10.030M
384
- rtype 106.900k13.8%) i/s - 526.687k
385
- sig 68.405k17.0%) i/s - 335.120k
386
- contracts 37.494k12.1%) i/s - 186.242k
387
- typecheck 9.165k11.7%) i/s - 45.528k
389
+ pure 3.273M 2.4%) i/s - 16.435M
390
+ rtype 340.376k 1.9%) i/s - 1.724M
391
+ rubype 268.253k 4.2%) i/s - 1.339M
392
+ sig 100.050k 1.9%) i/s - 501.760k
393
+ contracts 50.027k 2.0%) i/s - 251.586k
394
+ typecheck 11.317k (± 1.4%) i/s - 57.304k
388
395
 
389
396
  Comparison:
390
- pure: 2124989.5 i/s
391
- rtype: 106899.8 i/s - 19.88x slower
392
- sig: 68405.0 i/s - 31.06x slower
393
- contracts: 37493.9 i/s - 56.68x slower
394
- typecheck: 9164.5 i/s - 231.87x slower
397
+ pure: 3272978.0 i/s
398
+ rtype: 340375.8 i/s - 9.62x slower
399
+ rubype: 268252.5 i/s - 12.20x slower
400
+ sig: 100050.1 i/s - 32.71x slower
401
+ contracts: 50026.9 i/s - 65.42x slower
402
+ typecheck: 11317.1 i/s - 289.21x slower
395
403
  ```
396
404
 
397
405
  ### JRuby
398
- Rtype is 1.23x ~ 1.90x faster than Sig and 3.26x ~ 4.57x faster than Contracts
406
+ Without Rubype that doesn't support JRuby
399
407
 
400
408
  ```
401
- # Test 1
402
- Ruby version: 2.2.3
403
- Ruby engine: jruby
404
- Ruby description: jruby 9.0.5.0 (2.2.3) 2016-01-26 7bee00d Java HotSpot(TM) 64-Bit Server VM 25.60-b23 on 1.8.0_60-b27 +jit [Windows 10-amd64]
405
- Rtype version: 0.1.1
406
- Sig version: 1.0.1
407
- Contracts version: 0.13.0
408
- Typecheck version: 0.1.2
409
- Warming up --------------------------------------
410
- pure 7.415k i/100ms
411
- rtype 883.000 i/100ms
412
- sig 922.000 i/100ms
413
- contracts 408.000 i/100ms
414
- typecheck 404.000 i/100ms
415
- Calculating -------------------------------------
416
- pure 4.242M (±46.3%) i/s - 16.795M
417
- rtype 55.772k (±29.1%) i/s - 249.006k
418
- sig 29.344k (±23.5%) i/s - 134.612k
419
- contracts 12.192k (±29.4%) i/s - 51.816k
420
- typecheck 7.503k (±23.5%) i/s - 35.148k
421
-
422
- Comparison:
423
- pure: 4241753.6 i/s
424
- rtype: 55771.7 i/s - 76.06x slower
425
- sig: 29344.3 i/s - 144.55x slower
426
- contracts: 12192.0 i/s - 347.91x slower
427
- typecheck: 7502.8 i/s - 565.36x slower
428
- ```
429
- ```
430
- # Test 2
431
409
  Ruby version: 2.2.3
432
410
  Ruby engine: jruby
433
411
  Ruby description: jruby 9.0.5.0 (2.2.3) 2016-01-26 7bee00d Java HotSpot(TM) 64-Bit Server VM 25.60-b23 on 1.8.0_60-b27 +jit [Windows 10-amd64]
434
- Rtype version: 0.1.1
412
+ Rtype version: 0.2.0
435
413
  Sig version: 1.0.1
436
414
  Contracts version: 0.13.0
437
415
  Typecheck version: 0.1.2
438
416
  Warming up --------------------------------------
439
- pure 7.943k i/100ms
440
- rtype 1.060k i/100ms
441
- sig 1.565k i/100ms
442
- contracts 365.000 i/100ms
443
- typecheck 545.000 i/100ms
417
+ pure 29.127k i/100ms
418
+ rtype 4.566k i/100ms
419
+ sig 4.162k i/100ms
420
+ contracts 776.000 i/100ms
421
+ typecheck 981.000 i/100ms
444
422
  Calculating -------------------------------------
445
- pure 4.321M48.9%) i/s - 17.220M
446
- rtype 56.584k22.5%) i/s - 266.060k
447
- sig 45.925k17.8%) i/s - 223.795k
448
- contracts 17.338k20.8%) i/s - 82.490k
449
- typecheck 8.449k16.5%) i/s - 41.420k
423
+ pure 6.705M12.0%) i/s - 32.826M
424
+ rtype 89.262k 3.3%) i/s - 447.468k
425
+ sig 74.070k 2.0%) i/s - 370.418k
426
+ contracts 25.399k 2.9%) i/s - 127.264k
427
+ typecheck 12.461k 9.0%) i/s - 61.803k
450
428
 
451
429
  Comparison:
452
- pure: 4320949.8 i/s
453
- rtype: 56584.5 i/s - 76.36x slower
454
- sig: 45925.4 i/s - 94.09x slower
455
- contracts: 17337.9 i/s - 249.22x slower
456
- typecheck: 8449.4 i/s - 511.39x slower
430
+ pure: 6705166.5 i/s
431
+ rtype: 89262.5 i/s - 75.12x slower
432
+ sig: 74070.1 i/s - 90.52x slower
433
+ contracts: 25398.9 i/s - 263.99x slower
434
+ typecheck: 12460.7 i/s - 538.10x slower
457
435
  ```
458
436
 
459
437
  ## Rubype, Sig
@@ -1,6 +1,9 @@
1
1
  require 'benchmark/ips'
2
2
 
3
- require_relative '../lib/rtype'
3
+ is_mri = RUBY_ENGINE == 'ruby'
4
+
5
+ require "rtype"
6
+ require "rubype" if is_mri
4
7
  require "sig"
5
8
  require "contracts"
6
9
  require "contracts/version"
@@ -11,6 +14,7 @@ puts "Ruby engine: #{RUBY_ENGINE}"
11
14
  puts "Ruby description: #{RUBY_DESCRIPTION}"
12
15
 
13
16
  puts "Rtype version: #{Rtype::VERSION}"
17
+ puts "Rubype version: #{Rubype::VERSION}" if is_mri
14
18
  puts "Sig version: #{Sig::VERSION}"
15
19
  puts "Contracts version: #{Contracts::VERSION}"
16
20
  puts "Typecheck version: #{Typecheck::VERSION}"
@@ -46,6 +50,25 @@ class RtypeTest
46
50
  end
47
51
  rtype_obj = RtypeTest.new
48
52
 
53
+ if is_mri
54
+ class RubypeTest
55
+ def sum(x, y)
56
+ x + y
57
+ end
58
+ typesig :sum, [Numeric, Numeric] => Numeric
59
+
60
+ def mul(x, y)
61
+ x * y
62
+ end
63
+ typesig :mul, [:to_i, :to_i] => Numeric
64
+
65
+ def args(a, b, c, d)
66
+ end
67
+ typesig :args, [Integer, Numeric, String, :to_i] => Any
68
+ end
69
+ rubype_obj = RubypeTest.new
70
+ end
71
+
49
72
  class SigTest
50
73
  sig [Numeric, Numeric], Numeric,
51
74
  def sum(x, y)
@@ -123,6 +146,18 @@ Benchmark.ips do |x|
123
146
  end
124
147
  end
125
148
 
149
+ if is_mri
150
+ x.report("rubype") do |times|
151
+ i = 0
152
+ while i < times
153
+ rubype_obj.sum(1, 2)
154
+ rubype_obj.mul(1, 2)
155
+ rubype_obj.args(1, 2, "c", 4)
156
+ i += 1
157
+ end
158
+ end
159
+ end
160
+
126
161
  x.report("sig") do |times|
127
162
  i = 0
128
163
  while i < times
@@ -6,7 +6,7 @@ module Rtype
6
6
  end
7
7
 
8
8
  def valid?(value)
9
- value.nil? || Rtype::valid?(e, value)
9
+ value.nil? || Rtype::valid?(@type, value)
10
10
  end
11
11
 
12
12
  def error_message(value)
data/lib/rtype/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rtype
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.2.0".freeze
3
3
  end
data/lib/rtype.rb CHANGED
@@ -1,3 +1,10 @@
1
+ begin
2
+ require "rtype/rtype_native"
3
+ puts "Rtype with native extension"
4
+ rescue LoadError
5
+ puts "Rtype without native extension"
6
+ end
7
+
1
8
  require_relative 'rtype/core_ext'
2
9
  require_relative 'rtype/version'
3
10
  require_relative 'rtype/type_signature_error'
@@ -45,18 +52,7 @@ module Rtype
45
52
  sig.return_type = return_sig
46
53
  @@type_signatures[owner][method_name] = sig
47
54
 
48
- # `send` is faster than `method(...).call`
49
- owner.send(:_rtype_proxy).send :define_method, method_name do |*args, **kwargs, &block|
50
- if kwargs.empty?
51
- ::Rtype.assert_arguments_type(expected_args, args)
52
- result = super(*args, &block)
53
- else
54
- ::Rtype.assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
55
- result = super(*args, **kwargs, &block)
56
- end
57
- ::Rtype.assert_return_type(return_sig, result)
58
- result
59
- end
55
+ define_typed_method_to_proxy(owner, method_name, expected_args, expected_kwargs, return_sig)
60
56
  end
61
57
 
62
58
  def define_typed_accessor(owner, accessor_name, type_behavior)
@@ -67,51 +63,10 @@ module Rtype
67
63
  define_typed_method owner, setter, [type_behavior] => Any
68
64
  end
69
65
 
70
- # validate argument type
71
- def valid?(expected, value)
72
- case expected
73
- when Module
74
- value.is_a? expected
75
- when Symbol
76
- value.respond_to? expected
77
- when Regexp
78
- !!(expected =~ value.to_s)
79
- when Range
80
- expected.include?(value)
81
- when Array
82
- return false unless value.is_a?(Array)
83
- return false unless expected.length == value.length
84
- idx = -1
85
- expected.all? { |e| idx += 1; valid?(e, value[idx]) }
86
- when Proc
87
- !!expected.call(value)
88
- when true
89
- !!value
90
- when false
91
- !value
92
- when Rtype::Behavior::Base
93
- expected.valid? value
94
- else
95
- raise TypeSignatureError, "Invalid type signature: Unknown type behavior #{expected}"
96
- end
97
- end
98
-
99
66
  def type_signatures
100
67
  @@type_signatures
101
68
  end
102
69
 
103
- def assert_arguments_type(expected_args, args)
104
- # `length.times` is faster than `each_with_index`
105
- args.length.times do |i|
106
- expected = expected_args[i]
107
- value = args[i]
108
- unless expected.nil?
109
- unless valid?(expected, value)
110
- raise ArgumentTypeError, "for #{(i+1).ordinalize} argument:\n" + type_error_message(expected, value)
111
- end
112
- end
113
- end
114
- end
115
70
  =begin
116
71
  def assert_keyword_arguments_type(expected_kwargs, kwargs)
117
72
  kwargs.each do |key, value|
@@ -124,39 +79,24 @@ module Rtype
124
79
  end
125
80
  end
126
81
  =end
127
- def assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
128
- # `length.times` is faster than `each_with_index`
129
- args.length.times do |i|
130
- expected = expected_args[i]
131
- value = args[i]
132
- unless expected.nil?
133
- unless valid?(expected, value)
134
- raise ArgumentTypeError, "for #{(i+1).ordinalize} argument:\n" + type_error_message(expected, value)
135
- end
136
- end
137
- end
138
- kwargs.each do |key, value|
139
- expected = expected_kwargs[key]
140
- unless expected.nil?
141
- unless valid?(expected, value)
142
- raise ArgumentTypeError, "for '#{key}' argument:\n" + type_error_message(expected, value)
143
- end
144
- end
145
- end
82
+
83
+ def arg_type_error_message(idx, expected, value)
84
+ "#{arg_message(idx)}\n" + type_error_message(expected, value)
146
85
  end
147
86
 
148
- def assert_return_type(expected, result)
149
- if expected.nil?
150
- unless result.nil?
151
- raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
152
- end
153
- else
154
- unless valid?(expected, result)
155
- raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
156
- end
157
- end
87
+ def kwarg_type_error_message(key, expected, value)
88
+ "#{kwarg_message(key)}\n" + type_error_message(expected, value)
89
+ end
90
+
91
+ def arg_message(idx)
92
+ "for #{(idx+1).ordinalize} argument:"
93
+ end
94
+
95
+ def kwarg_message(key)
96
+ "for '#{key}' argument:"
158
97
  end
159
98
 
99
+
160
100
  def type_error_message(expected, value)
161
101
  case expected
162
102
  when Rtype::Behavior::Base
@@ -199,5 +139,104 @@ module Rtype
199
139
  arg_sig = hash.first[0]
200
140
  arg_sig.is_a?(Array) || arg_sig.is_a?(Hash)
201
141
  end
142
+
143
+ def define_typed_method_to_proxy(owner, method_name, expected_args, expected_kwargs, return_sig)
144
+ # `send` is faster than `method(...).call`
145
+ owner.send(:_rtype_proxy).send :define_method, method_name do |*args, **kwargs, &block|
146
+ if kwargs.empty?
147
+ ::Rtype.assert_arguments_type(expected_args, args)
148
+ result = super(*args, &block)
149
+ else
150
+ ::Rtype.assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
151
+ result = super(*args, **kwargs, &block)
152
+ end
153
+ ::Rtype.assert_return_type(return_sig, result)
154
+ result
155
+ end
156
+ nil
157
+ end
158
+ end
159
+
160
+ unless self.respond_to?(:valid?)
161
+ # validate argument type
162
+ def self.valid?(expected, value)
163
+ case expected
164
+ when Module
165
+ value.is_a? expected
166
+ when Symbol
167
+ value.respond_to? expected
168
+ when Regexp
169
+ !!(expected =~ value.to_s)
170
+ when Range
171
+ expected.include?(value)
172
+ when Array
173
+ return false unless value.is_a?(Array)
174
+ return false unless expected.length == value.length
175
+ idx = -1
176
+ expected.all? { |e| idx += 1; valid?(e, value[idx]) }
177
+ when Proc
178
+ !!expected.call(value)
179
+ when true
180
+ !!value
181
+ when false
182
+ !value
183
+ when Rtype::Behavior::Base
184
+ expected.valid? value
185
+ else
186
+ raise TypeSignatureError, "Invalid type signature: Unknown type behavior #{expected}"
187
+ end
188
+ end
189
+ end
190
+
191
+ unless self.respond_to?(:assert_arguments_type)
192
+ def self.assert_arguments_type(expected_args, args)
193
+ # `length.times` is faster than `each_with_index`
194
+ args.length.times do |i|
195
+ expected = expected_args[i]
196
+ value = args[i]
197
+ unless expected.nil?
198
+ unless valid?(expected, value)
199
+ raise ArgumentTypeError, "for #{(i+1).ordinalize} argument:\n" + type_error_message(expected, value)
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ unless self.respond_to?(:assert_arguments_type_with_keywords)
207
+ def self.assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
208
+ # `length.times` is faster than `each_with_index`
209
+ args.length.times do |i|
210
+ expected = expected_args[i]
211
+ value = args[i]
212
+ unless expected.nil?
213
+ unless valid?(expected, value)
214
+ raise ArgumentTypeError, "#{arg_message(idx)}\n" + type_error_message(expected, value)
215
+ end
216
+ end
217
+ end
218
+ kwargs.each do |key, value|
219
+ expected = expected_kwargs[key]
220
+ unless expected.nil?
221
+ unless valid?(expected, value)
222
+ raise ArgumentTypeError, "#{kwarg_message(key)}\n" + type_error_message(expected, value)
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+
229
+ unless self.respond_to?(:assert_return_type)
230
+ def self.assert_return_type(expected, result)
231
+ if expected.nil?
232
+ unless result.nil?
233
+ raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
234
+ end
235
+ else
236
+ unless valid?(expected, result)
237
+ raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
238
+ end
239
+ end
240
+ end
202
241
  end
203
242
  end
data/spec/rtype_spec.rb CHANGED
@@ -3,10 +3,22 @@ require_relative 'spec_helper'
3
3
  describe Rtype do
4
4
  let(:klass) do
5
5
  Class.new do
6
+ attr_accessor :value
7
+
8
+ def initialize
9
+ @value = 123
10
+ end
11
+
6
12
  def return_arg(obj)
7
13
  obj
8
14
  end
9
15
 
16
+ def three_args(a, b, c)
17
+ end
18
+
19
+ def three_kwargs(a:, b:, c:)
20
+ end
21
+
10
22
  def return_nil(obj)
11
23
  nil
12
24
  end
@@ -265,6 +277,40 @@ describe Rtype do
265
277
  }.to raise_error Rtype::TypeSignatureError
266
278
  end
267
279
  end
280
+
281
+ describe 'Special type behaviors' do
282
+ it 'Rtype::Behavior::And' do
283
+ klass.send :rtype, :return_nil, [Rtype.and(:to_i, :chars)] => nil
284
+ instance.return_nil("Hello")
285
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
286
+ end
287
+
288
+ it 'Rtype::Behavior::Or' do
289
+ klass.send :rtype, :return_nil, [Rtype.or(Integer, String)] => nil
290
+ instance.return_nil(123)
291
+ instance.return_nil("abc")
292
+ expect {instance.return_nil(nil)}.to raise_error Rtype::ArgumentTypeError
293
+ end
294
+
295
+ it 'Rtype::Behavior::Nilable' do
296
+ klass.send :rtype, :return_nil, [Rtype.nilable(Integer)] => nil
297
+ instance.return_nil(nil)
298
+ instance.return_nil(123)
299
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
300
+ end
301
+
302
+ it 'Rtype::Behavior::Not' do
303
+ klass.send :rtype, :return_nil, [Rtype.not(String)] => nil
304
+ instance.return_nil(123)
305
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
306
+ end
307
+
308
+ it 'Rtype::Behavior::Xor' do
309
+ klass.send :rtype, :return_nil, [Rtype.xor(:to_i, String)] => nil
310
+ instance.return_nil(123)
311
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
312
+ end
313
+ end
268
314
  end
269
315
 
270
316
  describe 'Signature' do
@@ -433,5 +479,63 @@ describe Rtype do
433
479
  expect {instance.private_func}.to raise_error NoMethodError
434
480
  end
435
481
  end
482
+
483
+ context 'with empty argument signature' do
484
+ it 'accept any arguments' do
485
+ klass.send :rtype, :three_args, [] => Any
486
+ instance.three_args("abc", 123, 456)
487
+ end
488
+ end
489
+
490
+ context 'when args length is more than arg signature length' do
491
+ it 'type checking ignore rest args' do
492
+ klass.send :rtype, :three_args, [String] => Any
493
+ instance.three_args("abc", 123, 456)
494
+ end
495
+ end
496
+
497
+ context 'when keyword args contain a key not configured to rtype' do
498
+ it 'type checking ignore the key' do
499
+ klass.send :rtype, :three_kwargs, {a: String} => Any
500
+ instance.three_kwargs(a: "abc", b: 123, c: 456)
501
+ end
502
+ end
503
+ end
504
+
505
+ describe "Call Rtype`s static method directly" do
506
+ it 'Rtype::define_typed_method' do
507
+ Rtype::define_typed_method klass, :return_arg, [String] => Any
508
+ expect {instance.return_arg(123)}.to raise_error Rtype::ArgumentTypeError
509
+ end
510
+
511
+ it 'Rtype::define_typed_accessor' do
512
+ Rtype::define_typed_accessor klass, :value, String
513
+ expect { instance.value = 123 }.to raise_error Rtype::ArgumentTypeError
514
+ expect { instance.value }.to raise_error Rtype::ReturnTypeError
515
+ end
516
+
517
+ it 'Rtype::valid?' do
518
+ expect {
519
+ Rtype::valid?("Invalid type behavior", "Test Value")
520
+ }.to raise_error Rtype::TypeSignatureError
521
+ end
522
+
523
+ it 'Rtype::assert_arguments_type' do
524
+ expect {
525
+ Rtype::assert_arguments_type([Integer, String], [123, 123])
526
+ }.to raise_error Rtype::ArgumentTypeError
527
+ end
528
+
529
+ it 'Rtype::assert_arguments_type_with_keywords' do
530
+ expect {
531
+ Rtype::assert_arguments_type_with_keywords([Integer, String], [123, "abc"], {arg: String}, {arg: 123})
532
+ }.to raise_error Rtype::ArgumentTypeError
533
+ end
534
+
535
+ it 'Rtype::assert_return_type' do
536
+ expect {
537
+ Rtype::assert_return_type nil, "No nil"
538
+ }.to raise_error Rtype::ReturnTypeError
539
+ end
436
540
  end
437
541
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,5 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
-
4
- # $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
- require_relative '../lib/rtype'
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require 'rtype'
6
5
  require 'rspec'
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.1.1
4
+ version: 0.2.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-03-13 00:00:00.000000000 Z
11
+ date: 2016-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -90,7 +90,7 @@ require_paths:
90
90
  - lib
91
91
  required_ruby_version: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - ">="
93
+ - - "~>"
94
94
  - !ruby/object:Gem::Version
95
95
  version: '2.1'
96
96
  required_rubygems_version: !ruby/object:Gem::Requirement