rtype 0.1.0 → 0.1.1

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: 05918bfadfd474f37a811f57b5504868a353ca88
4
- data.tar.gz: 1be969833dce3048884e47bed71f6602b44cab3e
3
+ metadata.gz: 573badbc833de876d782b2e6c3fb21a0ca10cd49
4
+ data.tar.gz: ebd29e696a8752c8f79ac4867d24ac63cedbd72b
5
5
  SHA512:
6
- metadata.gz: 57da419c19fae640ca9f9cfc480ac54e7706d3c6be975778de885d423896f4af6f911f8c43b81197d487621f007c67c0814ddc5be7c2e993b55d709ff5bd6812
7
- data.tar.gz: 07e3998a9f936988ac17bc140eee6eb5f9301fb8621892a257aa6ffcf4790a2f6621856bb0268bc4958eb59d87449f019a77fec35fd6f26439d97d572c9acd9a
6
+ metadata.gz: ddda1bff5a6d6f2af36d738fecd36b74f148c912de27d2f4b7c85f8f95d235eade4000746e0ab418075b9817671f734faa0a0882dc96d75f3fff995aa9b977fc
7
+ data.tar.gz: 74da35dc41d1b3c4380a9a405ef3ee68a87ded82eaf99269ea35fc1d504e7bfde5fa96495eeffe7fe9e218c1c03d902b7781894b2ca5472104944543d832f0e3
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Rtype: ruby with type
2
- [![Gem Version](https://badge.fury.io/rb/rtype.svg)](https://badge.fury.io/rb/rtype) [![Build Status](https://travis-ci.org/sputnikgugja/rtype.svg?branch=master)](https://travis-ci.org/sputnikgugja/rtype)
2
+ [![Gem Version](https://badge.fury.io/rb/rtype.svg)](https://badge.fury.io/rb/rtype)
3
+ [![Build Status](https://travis-ci.org/sputnikgugja/rtype.svg?branch=master)](https://travis-ci.org/sputnikgugja/rtype)
4
+ [![Coverage Status](https://coveralls.io/repos/github/sputnikgugja/rtype/badge.svg?branch=master)](https://coveralls.io/github/sputnikgugja/rtype?branch=master)
3
5
 
4
6
  You can do the type checking in Ruby with this gem!
5
7
 
@@ -352,69 +354,106 @@ Example.new.method(:test).return_type
352
354
  # => Any
353
355
  ```
354
356
 
357
+ ## Documentation
358
+ [RubyDoc.info](http://www.rubydoc.info/gems/rtype)
359
+
355
360
  ## Benchmarks
356
361
  Result of `rake benchmark` ([source](https://github.com/sputnikgugja/rtype/tree/master/benchmark/benchmark.rb))
357
362
 
358
363
  The benchmark doesn't include `Rubype` gem because I can't install Rubype on my environment.
359
364
 
360
365
  ### MRI
366
+ Rtype is 1.56x faster than Sig and 2.85x faster than Contracts
367
+
361
368
  ```
362
369
  Ruby version: 2.1.7
363
370
  Ruby engine: ruby
364
371
  Ruby description: ruby 2.1.7p400 (2015-08-18 revision 51632) [x64-mingw32]
365
- Rtype version: 0.0.1
372
+ Rtype version: 0.1.1
366
373
  Sig version: 1.0.1
367
374
  Contracts version: 0.13.0
368
375
  Typecheck version: 0.1.2
369
376
  Warming up --------------------------------------
370
- pure 84.672k i/100ms
371
- rtype 10.221k i/100ms
372
- sig 8.271k i/100ms
373
- contracts 4.604k i/100ms
374
- typecheck 1.102k i/100ms
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
375
382
  Calculating -------------------------------------
376
- pure 3.438M33.5%) i/s - 15.580M
377
- rtype 115.274k 9.2%) i/s - 572.376k
378
- sig 100.204k 8.0%) i/s - 504.531k
379
- contracts 49.026k 9.6%) i/s - 244.012k
380
- typecheck 11.108k 7.4%) i/s - 56.202k
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
381
388
 
382
389
  Comparison:
383
- pure: 3437842.1 i/s
384
- rtype: 115274.1 i/s - 29.82x slower
385
- sig: 100203.7 i/s - 34.31x slower
386
- contracts: 49025.8 i/s - 70.12x slower
387
- typecheck: 11107.6 i/s - 309.50x slower
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
388
395
  ```
389
396
 
390
397
  ### JRuby
398
+ Rtype is 1.23x ~ 1.90x faster than Sig and 3.26x ~ 4.57x faster than Contracts
399
+
400
+ ```
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
+ ```
391
429
  ```
430
+ # Test 2
392
431
  Ruby version: 2.2.3
393
432
  Ruby engine: jruby
394
433
  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]
395
- Rtype version: 0.0.1
434
+ Rtype version: 0.1.1
396
435
  Sig version: 1.0.1
397
436
  Contracts version: 0.13.0
398
437
  Typecheck version: 0.1.2
399
438
  Warming up --------------------------------------
400
- pure 17.077k i/100ms
401
- rtype 2.774k i/100ms
402
- sig 3.747k i/100ms
403
- contracts 907.000 i/100ms
404
- typecheck 937.000 i/100ms
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
405
444
  Calculating -------------------------------------
406
- pure 5.186M50.8%) i/s - 15.933M
407
- rtype 69.206k15.3%) i/s - 341.202k
408
- sig 64.460k16.4%) i/s - 314.748k
409
- contracts 24.372k13.2%) i/s - 119.724k
410
- typecheck 11.670k12.8%) i/s - 58.094k
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
411
450
 
412
451
  Comparison:
413
- pure: 5185896.5 i/s
414
- rtype: 69206.2 i/s - 74.93x slower
415
- sig: 64460.2 i/s - 80.45x slower
416
- contracts: 24371.7 i/s - 212.78x slower
417
- typecheck: 11670.0 i/s - 444.38x slower
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
418
457
  ```
419
458
 
420
459
  ## Rubype, Sig
@@ -39,20 +39,24 @@ private
39
39
  end
40
40
 
41
41
  class Method
42
+ def typed?
43
+ !!::Rtype.type_signatures[owner][name]
44
+ end
45
+
42
46
  def type_signature
43
47
  ::Rtype.type_signatures[owner][name]
44
48
  end
45
49
 
46
50
  def type_info
47
- type_signature.info
51
+ ::Rtype.type_signatures[owner][name].info
48
52
  end
49
53
 
50
54
  def argument_type
51
- type_signature.argument_type
55
+ ::Rtype.type_signatures[owner][name].argument_type
52
56
  end
53
57
 
54
58
  def return_type
55
- type_signature.return_type
59
+ ::Rtype.type_signatures[owner][name].return_type
56
60
  end
57
61
  end
58
62
 
data/lib/rtype/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rtype
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.1.1".freeze
3
3
  end
data/lib/rtype.rb CHANGED
@@ -45,13 +45,13 @@ module Rtype
45
45
  sig.return_type = return_sig
46
46
  @@type_signatures[owner][method_name] = sig
47
47
 
48
- owner.method(:_rtype_proxy).call.send :define_method, method_name do |*args, **kwargs, &block|
48
+ # `send` is faster than `method(...).call`
49
+ owner.send(:_rtype_proxy).send :define_method, method_name do |*args, **kwargs, &block|
49
50
  if kwargs.empty?
50
51
  ::Rtype.assert_arguments_type(expected_args, args)
51
52
  result = super(*args, &block)
52
53
  else
53
- ::Rtype.assert_arguments_type(expected_args, args)
54
- ::Rtype.assert_keyword_arguments_type(expected_kwargs, kwargs)
54
+ ::Rtype.assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
55
55
  result = super(*args, **kwargs, &block)
56
56
  end
57
57
  ::Rtype.assert_return_type(return_sig, result)
@@ -70,8 +70,6 @@ module Rtype
70
70
  # validate argument type
71
71
  def valid?(expected, value)
72
72
  case expected
73
- when Rtype::Behavior::Base
74
- expected.valid? value
75
73
  when Module
76
74
  value.is_a? expected
77
75
  when Symbol
@@ -91,6 +89,8 @@ module Rtype
91
89
  !!value
92
90
  when false
93
91
  !value
92
+ when Rtype::Behavior::Base
93
+ expected.valid? value
94
94
  else
95
95
  raise TypeSignatureError, "Invalid type signature: Unknown type behavior #{expected}"
96
96
  end
@@ -101,16 +101,18 @@ module Rtype
101
101
  end
102
102
 
103
103
  def assert_arguments_type(expected_args, args)
104
- args.each_with_index do |value, idx|
105
- expected = expected_args[idx]
104
+ # `length.times` is faster than `each_with_index`
105
+ args.length.times do |i|
106
+ expected = expected_args[i]
107
+ value = args[i]
106
108
  unless expected.nil?
107
109
  unless valid?(expected, value)
108
- raise ArgumentTypeError, "for #{(idx+1).ordinalize} argument:\n" + type_error_message(expected, value)
110
+ raise ArgumentTypeError, "for #{(i+1).ordinalize} argument:\n" + type_error_message(expected, value)
109
111
  end
110
112
  end
111
113
  end
112
114
  end
113
-
115
+ =begin
114
116
  def assert_keyword_arguments_type(expected_kwargs, kwargs)
115
117
  kwargs.each do |key, value|
116
118
  expected = expected_kwargs[key]
@@ -121,6 +123,27 @@ module Rtype
121
123
  end
122
124
  end
123
125
  end
126
+ =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
146
+ end
124
147
 
125
148
  def assert_return_type(expected, result)
126
149
  if expected.nil?
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  # $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
5
  require_relative '../lib/rtype'
3
6
  require 'rspec'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rtype
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sputnik Gugja
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: Ruby with type
42
56
  email:
43
57
  - sputnikgugja@gmail.com