rdl 2.0.0 → 2.0.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: 4b6df831f327b7589e40ffedbd3bc38e4e314bf0
4
- data.tar.gz: 7e540623bf270ff3c2dfa8152aa09b43f501cb92
3
+ metadata.gz: a08748b1afa6ca7710e6bf7c31e1162aa034de66
4
+ data.tar.gz: 104e8ede0573645fcd3c571000e402875ba94fa8
5
5
  SHA512:
6
- metadata.gz: daf3b07c5d3cb7d4efcc67ffb3306da05eaa63e6ed9175547dc8c42975f4aac967180fea3fca4f195b10375bce8e2d12c4b1c916476cab2634c43b8b3313a03b
7
- data.tar.gz: 6128fc47b326e48e36632df96268ec76f8fedcecfb0853c85221ac10fdfb77b9f71d59817fd8fda367d09a04a25ec38a5c0f49c6d1f594f1c0344bcfb31a5a85
6
+ metadata.gz: 341fc4e02d341179c93cea2a94c4f60c451a3ff4b5f1b1d7fb7ff01218e5309182e0d421cdbe6eaae1d4d04b00a7dca26f9650d0f8fff55157cf256881a50241
7
+ data.tar.gz: f38cd8208c3b22ef65ecc317521a28dc03a068b7425d875be9d8df91946a3f5b5caec55cf3940a9a871b76215251305effea50f2b8cf8a448d0f3e221bfde962
data/CHANGES.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.0.1] - 2016-11-11
6
+
7
+ ### Fixed
8
+ - Improved support for modules (still incomplete)
9
+ - Fix a bug with typing self.new
10
+ - Fix bug with annotated return types
11
+ - Fix bug with rdl_query
12
+ - Fix bug with running under Rails where type files don't exist (Joel Holdbrooks)
13
+
5
14
  ## [2.0.0] - 2016-08-24
6
15
  ### Added
7
16
  - Static type checking!
data/README.md CHANGED
@@ -884,9 +884,7 @@ In Object-Oriented Program Languages and Systems (OOPS) Track at ACM Symposium o
884
884
 
885
885
  Copyright (c) 2014-2016, University of Maryland, College Park. All rights reserved.
886
886
 
887
- # Contributors
888
-
889
- ## Authors
887
+ # Authors
890
888
 
891
889
  * [Jeffrey S. Foster](http://www.cs.umd.edu/~jfoster/)
892
890
  * [Brianna M. Ren](https://www.cs.umd.edu/~bren/)
@@ -894,6 +892,10 @@ Copyright (c) 2014-2016, University of Maryland, College Park. All rights reserv
894
892
  * Alexander T. Yu
895
893
  * Milod Kazerounian
896
894
 
895
+ # Contributors
896
+
897
+ * [Joel Holdbrooks](https://github.com/noprompt)
898
+
897
899
  # Discussion group
898
900
 
899
901
  [RDL Users](https://groups.google.com/forum/#!forum/rdl-users)
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require_relative '../lib/rdl.rb'
4
- require_relative '../lib/rdl_types.rb'
4
+ require_relative '../lib/types/core.rb'
5
5
 
6
6
  if ARGV.length != 1 then
7
7
  print <<EOF
@@ -2,9 +2,14 @@ if Rails.env.development? || Rails.env.test?
2
2
  require 'rdl/boot'
3
3
  require 'types/core'
4
4
 
5
- dir = Rails::VERSION::STRING.split('.')[0] + ".x"
6
- require_relative "../types/rails-#{dir}/_helpers.rb" # load type aliases first
7
- Dir[File.dirname(__FILE__) + "/../types/rails-#{dir}/**/*.rb"].each { |f| require f }
5
+ version = Rails::VERSION::STRING.split('.')[0] + ".x"
6
+
7
+ begin
8
+ require_relative "../types/rails-#{version}/_helpers.rb" # load type aliases first
9
+ Dir[File.dirname(__FILE__) + "/../types/rails-#{version}/**/*.rb"].each { |f| require f }
10
+ rescue LoadError
11
+ $stderr.puts("rdl could not load type definitions for Rails v#{version}")
12
+ end
8
13
  elsif Rails.env.production?
9
14
  require 'rdl_disable'
10
15
  class ActionController::Base
@@ -549,6 +549,9 @@ module RDL::Typecheck
549
549
  case c
550
550
  when TrueClass, FalseClass, Complex, Rational, Fixnum, Bignum, Float, Symbol, Class
551
551
  [env, RDL::Type::SingletonType.new(c)]
552
+ when Module
553
+ t = RDL::Type::SingletonType.new(const_get(e.children[1]))
554
+ [env, t]
552
555
  else
553
556
  [env, RDL::Type::NominalType.new(const_get(e.children[1]).class)]
554
557
  end
@@ -659,10 +662,10 @@ RUBY
659
662
  envguards << envi
660
663
  }
661
664
  initial_env = Env.join(e, *envguards)
662
- if (tguards.all? { |t| t.is_a?(RDL::Type::SingletonType) && t.val.is_a?(Class) }) && (e.children[0].type == :lvar)
665
+ if (tguards.all? { |typ| typ.is_a?(RDL::Type::SingletonType) && typ.val.is_a?(Class) }) && (e.children[0].type == :lvar)
663
666
  # Special case! We're branching on the type of the guard, which is a local variable.
664
667
  # So rebind that local variable to have the union of the guard types
665
- new_typ = RDL::Type::UnionType.new(*(tguards.map { |t| RDL::Type::NominalType.new(t.val) })).canonical
668
+ new_typ = RDL::Type::UnionType.new(*(tguards.map { |typ| RDL::Type::NominalType.new(typ.val) })).canonical
666
669
  # TODO adjust following for generics!
667
670
  if tcontrol.is_a? RDL::Type::GenericType
668
671
  if new_typ == tcontrol.base
@@ -761,19 +764,19 @@ RUBY
761
764
  end
762
765
  teaches = lookup(scope, tcollect.base.name, :each, e.children[1])
763
766
  inst = tcollect.to_inst.merge(self: tcollect)
764
- teaches = teaches.map { |t| t.instantiate(inst) }
767
+ teaches = teaches.map { |typ| typ.instantiate(inst) }
765
768
  else
766
769
  error :for_collection, [tcollect], e.children[1]
767
770
  end
768
771
  teach = nil
769
- teaches.each { |t|
772
+ teaches.each { |typ|
770
773
  # find `each` method with right type signature:
771
774
  # () { (t1) -> t2 } -> t3
772
- next unless t.args.empty?
773
- next if t.block.nil?
774
- next unless t.block.args.size == 1
775
- next unless t.block.block.nil?
776
- teach = t
775
+ next unless typ.args.empty?
776
+ next if typ.block.nil?
777
+ next unless typ.block.args.size == 1
778
+ next unless typ.block.block.nil?
779
+ teach = typ
777
780
  break
778
781
  }
779
782
  error :no_each_type, [tcollect.name], e.children[1] if teach.nil?
@@ -1006,6 +1009,7 @@ RUBY
1006
1009
  trecvs.each { |trecv|
1007
1010
  trets.concat(tc_send_one_recv(scope, env, trecv, meth, tactuals, block, e))
1008
1011
  }
1012
+ trets.map! {|t| t.is_a?(RDL::Type::AnnotatedArgType) ? t.type : t}
1009
1013
  return RDL::Type::UnionType.new(*trets)
1010
1014
  end
1011
1015
 
@@ -1015,9 +1019,8 @@ RUBY
1015
1019
  tmeth_inter = [] # Array<MethodType>, i.e., an intersection types
1016
1020
  case trecv
1017
1021
  when RDL::Type::SingletonType
1018
- if trecv.val.is_a? Class
1019
- if meth == :new then name = :initialize else name = meth end
1020
- ts = lookup(scope, RDL::Util.add_singleton_marker(trecv.val.to_s), name, e)
1022
+ if trecv.val.is_a? Class or trecv.val.is_a? Module
1023
+ ts = lookup(scope, RDL::Util.add_singleton_marker(trecv.val.to_s), meth, e)
1021
1024
  ts = [RDL::Type::MethodType.new([], nil, RDL::Type::NominalType.new(trecv.val))] if (meth == :new) && (ts.nil?) # there's always a nullary new if initialize is undefined
1022
1025
  error :no_singleton_method_type, [trecv.val, meth], e unless ts
1023
1026
  inst = {self: trecv}
@@ -1243,6 +1246,8 @@ RUBY
1243
1246
  klass = RDL::Util.remove_singleton_marker klass
1244
1247
  klass = '(singleton) ' + klass
1245
1248
  end
1249
+
1250
+ return nil if the_klass.to_s.start_with?('#<Class:') and name ==:new
1246
1251
  error :missing_ancestor_type, [ancestor, klass, name], e
1247
1252
  end
1248
1253
  }
@@ -4,8 +4,8 @@
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'rdl'
7
- s.version = '2.0.0'
8
- s.date = '2016-08-24'
7
+ s.version = '2.0.1'
8
+ s.date = '2016-11-11'
9
9
  s.summary = 'Ruby type and contract system'
10
10
  s.description = <<-EOF
11
11
  RDL is a gem that adds types and contracts to Ruby. RDL includes extensive
@@ -18,5 +18,5 @@ EOF
18
18
  s.executables << 'rdl_query'
19
19
  s.homepage = 'https://github.com/plum-umd/rdl'
20
20
  s.license = 'BSD-3-Clause'
21
- s.add_runtime_dependency 'parser', '~>2.3', '>= 2.3.1.2'
21
+ s.add_runtime_dependency 'parser', '~>2.3', '>= 2.3.1.4'
22
22
  end
@@ -3,8 +3,20 @@ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
3
  require 'rdl'
4
4
  require 'types/core'
5
5
 
6
- class TestTypecheck < Minitest::Test
6
+ class TestTypecheckC
7
+ type 'self.bar', '() -> Fixnum or String ret'
8
+ type 'self.foo', '() -> :A'
9
+ type 'self.new', '(:D) -> :E'
10
+ end
11
+
12
+ class TestTypecheckD
13
+ end
7
14
 
15
+ module TestTypecheckM
16
+ type 'self.foo', '() -> :B'
17
+ end
18
+
19
+ class TestTypecheck < Minitest::Test
8
20
  type :_any_object, "() -> Object" # a method that could return true or false
9
21
 
10
22
  def setup
@@ -960,7 +972,7 @@ class TestTypecheck < Minitest::Test
960
972
  assert_equal @t34, do_tc("begin puts 'foo'; 3; rescue; 4; end", env: @env)
961
973
  assert_equal tt("StandardError or 3"), do_tc("begin puts 'foo'; 3; rescue => e; e; end", env: @env)
962
974
  assert_equal tt("RuntimeError or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; end", env: @env)
963
- assert_equal tt("3"), do_tc("begin puts 'foo'; 3; else; 4; end", env: @env) # parser discards else clause!
975
+ assert_equal tt("4"), do_tc("begin puts 'foo'; 3; else; 4; end", env: @env) # parser discards else clause!
964
976
  assert_equal tt("RuntimeError or ArgumentError or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; rescue ArgumentError => x; x; end", env: @env)
965
977
  assert_equal tt("RuntimeError or ArgumentError or 42 or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; rescue ArgumentError => x; x; else 42; end", env: @env)
966
978
  assert_equal tt("RuntimeError or ArgumentError or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError, ArgumentError => e; e; end", env: @env)
@@ -1259,4 +1271,22 @@ class TestTypecheck < Minitest::Test
1259
1271
 
1260
1272
  end
1261
1273
 
1274
+ def test_singleton
1275
+ assert_equal ':A', do_tc("TestTypecheckC.foo", env: @env).to_s
1276
+ assert_equal ':B', do_tc("TestTypecheckM.foo", env: @env).to_s
1277
+ end
1278
+
1279
+ def test_annotated_ret
1280
+ t = $__rdl_parser.scan_str '#T Fixnum or String'
1281
+ assert_equal t, do_tc("TestTypecheckC.bar", env: @env)
1282
+ end
1283
+
1284
+ def test_constructor
1285
+ t = do_tc("TestTypecheckC.new(:D)", env: @env)
1286
+ assert_equal ':E', t.to_s
1287
+
1288
+ t = do_tc("TestTypecheckD.new", env: @env)
1289
+ t2 = RDL::Type::NominalType.new TestTypecheckD
1290
+ assert_equal t2, t
1291
+ end
1262
1292
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdl
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeffrey S. Foster
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2016-08-24 00:00:00.000000000 Z
15
+ date: 2016-11-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: parser
@@ -23,7 +23,7 @@ dependencies:
23
23
  version: '2.3'
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 2.3.1.2
26
+ version: 2.3.1.4
27
27
  type: :runtime
28
28
  prerelease: false
29
29
  version_requirements: !ruby/object:Gem::Requirement
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: '2.3'
34
34
  - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: 2.3.1.2
36
+ version: 2.3.1.4
37
37
  description: |
38
38
  RDL is a gem that adds types and contracts to Ruby. RDL includes extensive
39
39
  support for specifying method types, which can either be enforced as