rtype 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4bad8e7cdc12a3c4a598e806553fd89c184c212
4
- data.tar.gz: 67576b9e8839a9f1988ee4f561cb0474824ecb84
3
+ metadata.gz: 3e11e54455d379c4d6317ad318c97065c003f4de
4
+ data.tar.gz: 5111741978b57a0ed2741dcc936329bb8590a63b
5
5
  SHA512:
6
- metadata.gz: 4b82873431c88b2811b9ee34bdd84a3f23e683cbf4baaba9c57da29954b34869a3739db623496f0e07af92b8eab5750d10d523b3e93c3cf91080a5a36c5dd5fb
7
- data.tar.gz: 29a5f2356be7ed7637841a0a240689cd11f7d19f73ce5b5447c8ec99bb497ee931e2c48706048efacffe4d15c7a73619b184b49e53bbb9c920dfd328905e4954
6
+ metadata.gz: 16573abd845d6ce88f84014bbc7be4ad39a7b5a78dba4613729b00451983ba697d1b7ee2679f76c95bce06b4ae952254ccf1676c739289215f95e04c7418ca6b
7
+ data.tar.gz: d784a35084da9e02ff50cfd80a8c18867b8a0ca7133a2e4697d15f3e754db56f24ea55037afa398f6203962e93c27ba649036cd41736eefe700f00adc04797db
data/README.md CHANGED
@@ -8,22 +8,22 @@ You can do the type checking in Ruby with this gem!
8
8
  ```ruby
9
9
  require 'rtype'
10
10
 
11
- rtype :sum, [:to_i, Numeric] => Numeric
12
- def sum(a, b)
13
- a.to_i + b
14
- end
15
-
16
- sum(123, "asd")
17
- # (Rtype::ArgumentTypeError) for 2nd argument:
18
- # Expected "asd" to be a Numeric
19
-
20
11
  class Test
21
- rtype_self :invert, {state: Boolean} => Boolean
12
+ rtype [:to_i, Numeric] => Numeric
13
+ def sum(a, b)
14
+ a.to_i + b
15
+ end
16
+
17
+ rtype {state: Boolean} => Boolean
22
18
  def self.invert(state:)
23
19
  !state
24
20
  end
25
21
  end
26
22
 
23
+ Test.new.sum(123, "asd")
24
+ # (Rtype::ArgumentTypeError) for 2nd argument:
25
+ # Expected "asd" to be a Numeric
26
+
27
27
  Test::invert(state: 0)
28
28
  # (Rtype::ArgumentTypeError) for 'state' argument:
29
29
  # Expected 0 to be a Boolean
@@ -102,7 +102,7 @@ then, Rtype use it. (Do not `require 'rtype-java'`)
102
102
  - Each of value’s elements must be valid
103
103
  - Value's key list must be equal to the hash's key list
104
104
  - **String** key is **different** from **symbol** key
105
- - The type signature could not be positioned at last index
105
+ - vs Keyword arguments
106
106
  - `[{}]` is **not** hash type argument. it is keyword argument because its position is last
107
107
  - `[{}, {}]` is empty hash type argument (first) and one empty keyword argument (second)
108
108
  - `[{}, {}, {}]` is two empty hash type argument (first, second) and empty keyword argument (last)
@@ -158,15 +158,15 @@ then, Rtype use it. (Do not `require 'rtype-java'`)
158
158
  require 'rtype'
159
159
 
160
160
  class Example
161
- rtype :test, [Integer] => nil
161
+ rtype [Integer] => nil
162
162
  def test(i)
163
163
  end
164
164
 
165
- rtype :any_type_arg, [Any] => nil
165
+ rtype [Any] => nil
166
166
  def any_type_arg(arg)
167
167
  end
168
168
 
169
- rtype :return_type_test, [] => Integer
169
+ rtype [] => Integer
170
170
  def return_type_test
171
171
  "not integer"
172
172
  end
@@ -189,13 +189,13 @@ e.return_type_test
189
189
  require 'rtype'
190
190
 
191
191
  class Example
192
- rtype :say_your_name, {name: String} => Any
192
+ rtype {name: String} => Any
193
193
  def say_your_name(name:)
194
194
  puts "My name is #{name}"
195
195
  end
196
196
 
197
197
  # Mixing positional arguments and keyword arguments
198
- rtype :name_and_age, [String, {age: Integer}] => Any
198
+ rtype [String, {age: Integer}] => Any
199
199
  def name_and_age(name, age:)
200
200
  puts "Name: #{name}, Age: #{age}"
201
201
  end
@@ -214,7 +214,7 @@ Example.new.say_your_name(name: 12345)
214
214
  require 'rtype'
215
215
 
216
216
  class Duck
217
- rtype :says, [:to_i] => Any
217
+ rtype [:to_i] => Any
218
218
  def says(i)
219
219
  puts "duck:" + " quack"*i.to_i
220
220
  end
@@ -286,7 +286,7 @@ func({msg: "hello hash"}, {}) # hello hash
286
286
  ```
287
287
 
288
288
  #### rtype with attr_accessor
289
- `rtype_accessor`
289
+ `rtype_accessor` : call attr_accessor and make it typed method
290
290
 
291
291
  You can use `rtype_accessor_self` for static accessor.
292
292
 
@@ -295,7 +295,7 @@ require 'rtype'
295
295
 
296
296
  class Example
297
297
  rtype_accessor :value, String
298
- attr_accessor :value
298
+
299
299
  def initialize
300
300
  @value = 456
301
301
  end
@@ -316,9 +316,9 @@ Example.new.value
316
316
  require 'rtype'
317
317
 
318
318
  class Example
319
- rtype :and_test, [String.and(:func)] => Any
319
+ rtype [String.and(:func)] => Any
320
320
  # also works:
321
- # rtype :and_test, [Rtype::and(String, :func)] => Any
321
+ # rtype [Rtype::and(String, :func)] => Any
322
322
  def and_test(arg)
323
323
  end
324
324
  end
@@ -354,7 +354,7 @@ module Game
354
354
  class Player < Entity
355
355
  include Rtype::Behavior
356
356
 
357
- rtype :attack, [And[*ENEMY]] => Any
357
+ rtype [And[*ENEMY]] => Any
358
358
  def attacks(enemy)
359
359
  "Player attacks '#{enemy.name}' (level #{enemy.level})!"
360
360
  end
@@ -375,12 +375,18 @@ Game::Player.new.attacks Game::Slime.new
375
375
  # Player attacks 'Powerful Slime' (level 123)!
376
376
  ```
377
377
 
378
- #### Position of `rtype` && (symbol || string)
378
+ #### Position of `rtype` && (Specify method name || annotation mode) && (Symbol || String)
379
379
  ```ruby
380
380
  require 'rtype'
381
381
 
382
382
  class Example
383
- # Works. Recommended
383
+ # Recommended. Annotation mode (no method name required)
384
+ rtype [Integer, String] => String
385
+ def hello_world(i, str)
386
+ puts "Hello? #{i} #{st
387
+ end
388
+
389
+ # Works (specifying method name)
384
390
  rtype :hello_world, [Integer, String] => String
385
391
  def hello_world(i, str)
386
392
  puts "Hello? #{i} #{st
@@ -397,11 +403,17 @@ class Example
397
403
  def hello_world_three(i, str)
398
404
  puts "Hello? #{i} #{str}"
399
405
  end
406
+
407
+ # Don't works. `rtype` works for next method
408
+ def hello_world_four(i, str)
409
+ puts "Hello? #{i} #{str}"
410
+ end
411
+ rtype [Integer, String] => String
400
412
  end
401
413
  ```
402
414
 
403
415
  #### Outside of module (root)
404
- Yes, it works
416
+ Outside of module, annotation mode don't works. You must specify method name.
405
417
 
406
418
  ```ruby
407
419
  rtype :say, [String] => Any
@@ -409,11 +421,29 @@ def say(message)
409
421
  puts message
410
422
  end
411
423
 
412
- say "Hello" # Hello
424
+ Test.new.say "Hello" # Hello
425
+
426
+ rtype [String] => Any
427
+ # (ArgumentError) Annotation mode not working out of module
413
428
  ```
414
429
 
415
430
  #### Static(singleton) method
416
- Use `rtype_self`
431
+ rtype annotation mode works both instance and class method
432
+
433
+ ```ruby
434
+ require 'rtype'
435
+
436
+ class Example
437
+ rtype [:to_i] => Any
438
+ def self.say_ya(i)
439
+ puts "say" + " ya"*i.to_i
440
+ end
441
+ end
442
+
443
+ Example::say_ya(3) #say ya ya ya
444
+ ```
445
+
446
+ however, if you specify method name, you must use `rtype_self` instead of `rtype`
417
447
 
418
448
  ```ruby
419
449
  require 'rtype'
@@ -437,7 +467,7 @@ Any change of this doesn't affect type checking
437
467
  require 'rtype'
438
468
 
439
469
  class Example
440
- rtype :test, [:to_i] => Any
470
+ rtype [:to_i] => Any
441
471
  def test(i)
442
472
  end
443
473
  end
@@ -34,17 +34,17 @@ end
34
34
  pure_obj = PureTest.new
35
35
 
36
36
  class RtypeTest
37
- rtype :sum, [Numeric, Numeric] => Numeric
37
+ rtype [Numeric, Numeric] => Numeric
38
38
  def sum(x, y)
39
39
  x + y
40
40
  end
41
41
 
42
- rtype :mul, [:to_i, :to_i] => Numeric
42
+ rtype [:to_i, :to_i] => Numeric
43
43
  def mul(x, y)
44
44
  x * y
45
45
  end
46
46
 
47
- rtype :args, [Integer, Numeric, String, :to_i] => Any
47
+ rtype [Integer, Numeric, String, :to_i] => Any
48
48
  def args(a, b, c, d)
49
49
  end
50
50
  end
@@ -3,21 +3,35 @@ class TrueClass; include Boolean; end
3
3
  class FalseClass; include Boolean; end
4
4
  Any = BasicObject
5
5
 
6
+ class Object
7
+ include ::Rtype::MethodAnnotator
8
+ end
9
+
6
10
  module Kernel
7
11
  private
8
12
  def _rtype_proxy
9
13
  unless @_rtype_proxy
10
- @_rtype_proxy = Module.new
14
+ @_rtype_proxy = ::Rtype::RtypeProxy.new
11
15
  prepend @_rtype_proxy
12
16
  end
13
17
  @_rtype_proxy
14
18
  end
15
19
 
16
- def rtype(method_name, type_sig_info)
20
+ def rtype(method_name=nil, type_sig_info)
17
21
  if is_a?(Module)
18
- ::Rtype::define_typed_method(self, method_name, type_sig_info)
22
+ if method_name.nil?
23
+ ::Rtype::assert_valid_type_sig(type_sig_info)
24
+ _rtype_proxy.annotation_mode = true
25
+ _rtype_proxy.annotation_type_sig = type_sig_info
26
+ else
27
+ ::Rtype::define_typed_method(self, method_name, type_sig_info)
28
+ end
19
29
  else
20
- rtype_self(method_name, type_sig_info)
30
+ if method_name.nil?
31
+ raise ArgumentError, "Annotation mode not working out of module"
32
+ else
33
+ rtype_self(method_name, type_sig_info)
34
+ end
21
35
  end
22
36
  end
23
37
 
@@ -26,6 +40,11 @@ private
26
40
  end
27
41
 
28
42
  def rtype_accessor(accessor_name, type_behavior)
43
+ accessor_name = accessor_name.to_sym
44
+ if !respond_to?(accessor_name) || !respond_to?(:"#{accessor_name}=")
45
+ attr_accessor accessor_name
46
+ end
47
+
29
48
  if is_a?(Module)
30
49
  ::Rtype::define_typed_accessor(self, accessor_name, type_behavior)
31
50
  else
@@ -34,6 +53,10 @@ private
34
53
  end
35
54
 
36
55
  def rtype_accessor_self(accessor_name, type_behavior)
56
+ accessor_name = accessor_name.to_sym
57
+ if !respond_to?(accessor_name) || !respond_to?(:"#{accessor_name}=")
58
+ singleton_class.send(:attr_accessor, accessor_name)
59
+ end
37
60
  ::Rtype::define_typed_accessor(singleton_class, accessor_name, type_behavior)
38
61
  end
39
62
  end
@@ -0,0 +1,31 @@
1
+ module Rtype
2
+ module MethodAnnotator
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def method_added(name)
9
+ if @_rtype_proxy
10
+ proxy = _rtype_proxy
11
+ if proxy.annotation_mode
12
+ ::Rtype::define_typed_method(self, name, proxy.annotation_type_sig)
13
+ proxy.annotation_mode = false
14
+ proxy.annotation_type_sig = nil
15
+ end
16
+ end
17
+ end
18
+
19
+ def singleton_method_added(name)
20
+ if @_rtype_proxy
21
+ proxy = _rtype_proxy
22
+ if proxy.annotation_mode
23
+ ::Rtype::define_typed_method(singleton_class, name, proxy.annotation_type_sig)
24
+ proxy.annotation_mode = false
25
+ proxy.annotation_type_sig = nil
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,10 @@
1
+ module Rtype
2
+ class RtypeProxy < Module
3
+ attr_accessor :annotation_mode
4
+ attr_accessor :annotation_type_sig
5
+ def initialize
6
+ @annotation_mode = false
7
+ @annotation_type_sig = nil
8
+ end
9
+ end
10
+ end
data/lib/rtype/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rtype
2
- VERSION = "0.4.0".freeze
2
+ VERSION = "0.5.0".freeze
3
3
  end
data/lib/rtype.rb CHANGED
@@ -15,6 +15,8 @@ else
15
15
  end
16
16
  end
17
17
 
18
+ require_relative 'rtype/rtype_proxy'
19
+ require_relative 'rtype/method_annotator'
18
20
  require_relative 'rtype/core_ext'
19
21
  require_relative 'rtype/version'
20
22
  require_relative 'rtype/type_signature_error'
@@ -31,9 +33,9 @@ module Rtype
31
33
  @@type_signatures = Hash.new({})
32
34
 
33
35
  def define_typed_method(owner, method_name, type_sig_info)
34
- raise TypeSignatureError, "Invalid type signature" unless valid_type_sig_info_form?(type_sig_info)
35
36
  method_name = method_name.to_sym
36
37
  raise ArgumentError, "method_name is nil" if method_name.nil?
38
+ assert_valid_type_sig(type_sig_info)
37
39
 
38
40
  el = type_sig_info.first
39
41
  arg_sig = el[0]
@@ -51,13 +53,6 @@ module Rtype
51
53
  expected_kwargs = arg_sig
52
54
  end
53
55
 
54
- expected_args.each { |e| check_valid_argument_type_sig(e) }
55
- if expected_kwargs.keys.any? { |e| !e.is_a?(Symbol) }
56
- raise TypeSignatureError, "Invalid type signature: keyword arguments contain non-symbol key"
57
- end
58
- expected_kwargs.each_value { |e| check_valid_argument_type_sig(e) }
59
- check_valid_return_type_sig(return_sig)
60
-
61
56
  sig = TypeSignature.new
62
57
  sig.argument_type = arg_sig
63
58
  sig.return_type = return_sig
@@ -158,30 +153,41 @@ module Rtype
158
153
  end
159
154
  end
160
155
 
161
- private
162
- def valid_type_sig_info_form?(hash)
163
- return false unless hash.is_a?(Hash)
164
- arg_sig = hash.first[0]
165
- arg_sig.is_a?(Array) || arg_sig.is_a?(Hash)
156
+ def assert_valid_type_sig(sig)
157
+ unless sig.is_a?(Hash)
158
+ raise TypeSignatureError, "Invalid type signature: type signature is not hash"
159
+ end
160
+ if sig.empty?
161
+ raise TypeSignatureError, "Invalid type signature: type signature is empty hash"
162
+ end
163
+ assert_valid_arguments_type_sig(sig.first[0])
164
+ assert_valid_return_type_sig(sig.first[1])
166
165
  end
167
166
 
168
- def define_typed_method_to_proxy(owner, method_name, expected_args, expected_kwargs, return_sig)
169
- # `send` is faster than `method(...).call`
170
- owner.send(:_rtype_proxy).send :define_method, method_name do |*args, **kwargs, &block|
171
- if kwargs.empty?
172
- ::Rtype.assert_arguments_type(expected_args, args)
173
- result = super(*args, &block)
167
+ def assert_valid_arguments_type_sig(sig)
168
+ if sig.is_a?(Array)
169
+ sig = sig.dup
170
+ if sig.last.is_a?(Hash)
171
+ kwargs = sig.pop
174
172
  else
175
- ::Rtype.assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
176
- result = super(*args, **kwargs, &block)
173
+ kwargs = {}
177
174
  end
178
- ::Rtype.assert_return_type(return_sig, result)
179
- result
175
+ sig.each { |e| assert_valid_argument_type_sig_element(e) }
176
+ if kwargs.keys.any? { |e| !e.is_a?(Symbol) }
177
+ raise TypeSignatureError, "Invalid type signature: keyword arguments contain non-symbol key"
178
+ end
179
+ kwargs.each_value { |e| assert_valid_argument_type_sig_element(e) }
180
+ elsif sig.is_a?(Hash)
181
+ if sig.keys.any? { |e| !e.is_a?(Symbol) }
182
+ raise TypeSignatureError, "Invalid type signature: keyword arguments contain non-symbol key"
183
+ end
184
+ sig.each_value { |e| assert_valid_argument_type_sig_element(e) }
185
+ else
186
+ raise TypeSignatureError, "Invalid type signature: arguments type signature is neither array nor hash"
180
187
  end
181
- nil
182
188
  end
183
189
 
184
- def check_valid_argument_type_sig(sig)
190
+ def assert_valid_argument_type_sig_element(sig)
185
191
  case sig
186
192
  when Rtype::Behavior::Base
187
193
  when Module
@@ -190,11 +196,11 @@ private
190
196
  when Range
191
197
  when Array
192
198
  sig.each do |e|
193
- check_valid_argument_type_sig(e)
199
+ assert_valid_argument_type_sig_element(e)
194
200
  end
195
201
  when Hash
196
202
  sig.each_value do |e|
197
- check_valid_argument_type_sig(e)
203
+ assert_valid_argument_type_sig_element(e)
198
204
  end
199
205
  when Proc
200
206
  when true
@@ -204,8 +210,25 @@ private
204
210
  end
205
211
  end
206
212
 
207
- def check_valid_return_type_sig(sig)
208
- check_valid_argument_type_sig(sig) unless sig.nil?
213
+ def assert_valid_return_type_sig(sig)
214
+ assert_valid_argument_type_sig_element(sig) unless sig.nil?
215
+ end
216
+
217
+ private
218
+ def define_typed_method_to_proxy(owner, method_name, expected_args, expected_kwargs, return_sig)
219
+ # `send` is faster than `method(...).call`
220
+ owner.send(:_rtype_proxy).send :define_method, method_name do |*args, **kwargs, &block|
221
+ if kwargs.empty?
222
+ ::Rtype::assert_arguments_type(expected_args, args)
223
+ result = super(*args, &block)
224
+ else
225
+ ::Rtype::assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
226
+ result = super(*args, **kwargs, &block)
227
+ end
228
+ ::Rtype::assert_return_type(return_sig, result)
229
+ result
230
+ end
231
+ nil
209
232
  end
210
233
 
211
234
  public
data/spec/rtype_spec.rb CHANGED
@@ -62,6 +62,38 @@ describe Rtype do
62
62
  end
63
63
 
64
64
  describe 'Kernel#rtype' do
65
+ context "with annotation mode" do
66
+ it "works with instance method" do
67
+ class AnnotationTest
68
+ rtype [String] => Any
69
+ def test(str)
70
+ end
71
+ end
72
+ expect {
73
+ AnnotationTest.new.test(123)
74
+ }.to raise_error Rtype::ArgumentTypeError
75
+ end
76
+ it "works with class method" do
77
+ class AnnotationTest
78
+ rtype [String] => Any
79
+ def self.class_method_test(str)
80
+ end
81
+ end
82
+ expect {
83
+ AnnotationTest::class_method_test(123)
84
+ }.to raise_error Rtype::ArgumentTypeError
85
+ end
86
+ context "outside of module" do
87
+ it "doesn't works" do
88
+ expect {
89
+ rtype [String] => Any
90
+ def annotation_test(str)
91
+ end
92
+ }.to raise_error ArgumentError
93
+ end
94
+ end
95
+ end
96
+
65
97
  it "outside of module" do
66
98
  rtype :test_args, [String] => Any
67
99
  def test_args(str)
@@ -119,7 +151,6 @@ describe Rtype do
119
151
  it 'Kernel#rtype_accessor' do
120
152
  class TestClass
121
153
  rtype_accessor :value, String
122
- attr_accessor :value
123
154
 
124
155
  def initialize
125
156
  @value = 123
@@ -134,12 +165,6 @@ describe Rtype do
134
165
  @@val = 123
135
166
 
136
167
  rtype_accessor_self :value, String
137
- def self.value=(val)
138
- @@val = val
139
- end
140
- def self.value
141
- @@val
142
- end
143
168
  end
144
169
  expect {TestClass::value = 123}.to raise_error Rtype::ArgumentTypeError
145
170
  expect {TestClass::value}.to raise_error Rtype::ReturnTypeError
@@ -198,11 +223,15 @@ describe Rtype do
198
223
  end
199
224
  it "is wrong args" do
200
225
  klass.send :rtype, :return_arg, [1..10] => Any
201
- expect {instance.return_arg(1001)}.to raise_error Rtype::ArgumentTypeError
226
+ expect {
227
+ instance.return_arg(1001)
228
+ }.to raise_error Rtype::ArgumentTypeError
202
229
  end
203
230
  it "is wrong result" do
204
231
  klass.send :rtype, :return_nil, [Any] => 1..10
205
- expect {instance.return_nil(5)}.to raise_error Rtype::ReturnTypeError
232
+ expect {
233
+ instance.return_nil(5)
234
+ }.to raise_error Rtype::ReturnTypeError
206
235
  end
207
236
  end
208
237
 
@@ -549,13 +578,13 @@ describe Rtype do
549
578
  end
550
579
 
551
580
  describe 'wrong case' do
552
- describe 'invalid signature form' do
553
- it 'invalid argument signature' do
581
+ describe 'invalid type signature' do
582
+ it 'invalid arguments type signature' do
554
583
  expect {
555
584
  klass.send :rtype, :return_arg, Any => nil
556
585
  }.to raise_error Rtype::TypeSignatureError
557
586
  end
558
- it 'invalid return signature' do
587
+ it 'invalid return type signature' do
559
588
  expect {
560
589
  klass.send :rtype, :return_arg, [] => 123
561
590
  }.to raise_error Rtype::TypeSignatureError
@@ -590,6 +619,18 @@ describe Rtype do
590
619
  klass.send :rtype, :return_arg, [] => "abc"
591
620
  }.to raise_error Rtype::TypeSignatureError
592
621
  end
622
+
623
+ context "with annotation mode" do
624
+ it 'works' do
625
+ expect {
626
+ class AnnotationTest
627
+ rtype [String, 123] => Any
628
+ def invalid_test(arg)
629
+ end
630
+ end
631
+ }.to raise_error Rtype::TypeSignatureError
632
+ end
633
+ end
593
634
  end
594
635
  end
595
636
  end
@@ -672,6 +713,40 @@ describe Rtype do
672
713
  }.to raise_error Rtype::ArgumentTypeError
673
714
  end
674
715
  end
716
+
717
+ it "One rtype annotation affect only one method" do
718
+ class AnnotationTest
719
+ rtype [String] => Any
720
+ def one(str)
721
+ end
722
+
723
+ def two(str)
724
+ end
725
+ end
726
+ expect {
727
+ AnnotationTest.new.one(123)
728
+ }.to raise_error Rtype::ArgumentTypeError
729
+ AnnotationTest.new.two(123)
730
+ end
731
+
732
+ it "One rtype annotation affect only one method, regardless of instance method or class method" do
733
+ class AnnotationTest2
734
+ rtype [String] => Any
735
+ def self.static_one(str)
736
+ end
737
+
738
+ def inst_one(str)
739
+ end
740
+
741
+ def self.static_two(str)
742
+ end
743
+ end
744
+ expect {
745
+ AnnotationTest2::static_one(123)
746
+ }.to raise_error Rtype::ArgumentTypeError
747
+ AnnotationTest2.new.inst_one(123)
748
+ AnnotationTest2::static_two(123)
749
+ end
675
750
  end
676
751
 
677
752
  describe "Call Rtype`s static method directly" do
@@ -687,6 +762,12 @@ describe Rtype do
687
762
  end
688
763
 
689
764
  it 'Rtype::valid?' do
765
+ expect(
766
+ Rtype::valid?(String, "str")
767
+ ).to be true
768
+ expect(
769
+ Rtype::valid?(Integer, "str")
770
+ ).to be false
690
771
  expect {
691
772
  Rtype::valid?("Invalid type behavior", "Test Value")
692
773
  }.to raise_error Rtype::TypeSignatureError
@@ -709,5 +790,33 @@ describe Rtype do
709
790
  Rtype::assert_return_type nil, "No nil"
710
791
  }.to raise_error Rtype::ReturnTypeError
711
792
  end
793
+
794
+ it 'Rtype::assert_valid_type_sig' do
795
+ Rtype::assert_valid_type_sig([Integer, String] => Any)
796
+ expect {
797
+ Rtype::assert_valid_type_sig([Integer, String])
798
+ }.to raise_error Rtype::TypeSignatureError
799
+ end
800
+
801
+ it 'Rtype::assert_valid_arguments_type_sig' do
802
+ Rtype::assert_valid_arguments_type_sig([Integer, String])
803
+ expect {
804
+ Rtype::assert_valid_arguments_type_sig("[Integer, String]")
805
+ }.to raise_error Rtype::TypeSignatureError
806
+ end
807
+
808
+ it 'Rtype::assert_valid_argument_type_sig_element' do
809
+ Rtype::assert_valid_argument_type_sig_element(Integer)
810
+ expect {
811
+ Rtype::assert_valid_argument_type_sig_element("Integer")
812
+ }.to raise_error Rtype::TypeSignatureError
813
+ end
814
+
815
+ it 'Rtype::assert_valid_return_type_sig' do
816
+ Rtype::assert_valid_return_type_sig(Integer)
817
+ expect {
818
+ Rtype::assert_valid_return_type_sig("Integer")
819
+ }.to raise_error Rtype::TypeSignatureError
820
+ end
712
821
  end
713
822
  end
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.0
4
+ version: 0.5.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-04-01 00:00:00.000000000 Z
11
+ date: 2016-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -75,7 +75,9 @@ files:
75
75
  - lib/rtype/behavior/or.rb
76
76
  - lib/rtype/behavior/xor.rb
77
77
  - lib/rtype/core_ext.rb
78
+ - lib/rtype/method_annotator.rb
78
79
  - lib/rtype/return_type_error.rb
80
+ - lib/rtype/rtype_proxy.rb
79
81
  - lib/rtype/type_signature.rb
80
82
  - lib/rtype/type_signature_error.rb
81
83
  - lib/rtype/version.rb