rdl 2.0.1 → 2.1.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.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -0
  3. data/CHANGES.md +35 -0
  4. data/README.md +153 -116
  5. data/bin/rdl_query +1 -1
  6. data/extras/type_tests/typetests.rb +905 -0
  7. data/lib/rdl.rb +0 -1
  8. data/lib/rdl/boot.rb +108 -77
  9. data/lib/rdl/boot_rails.rb +2 -8
  10. data/lib/rdl/config.rb +44 -17
  11. data/lib/rdl/contracts/flat.rb +1 -1
  12. data/lib/rdl/info.rb +3 -3
  13. data/lib/rdl/query.rb +11 -11
  14. data/lib/rdl/typecheck.rb +399 -136
  15. data/lib/rdl/types/finite_hash.rb +3 -2
  16. data/lib/rdl/types/generic.rb +7 -6
  17. data/lib/rdl/types/intersection.rb +3 -2
  18. data/lib/rdl/types/lexer.rex +2 -3
  19. data/lib/rdl/types/lexer.rex.rb +1 -4
  20. data/lib/rdl/types/method.rb +7 -6
  21. data/lib/rdl/types/nominal.rb +10 -1
  22. data/lib/rdl/types/parser.racc +7 -8
  23. data/lib/rdl/types/parser.tab.rb +108 -109
  24. data/lib/rdl/types/structural.rb +1 -0
  25. data/lib/rdl/types/tuple.rb +2 -2
  26. data/lib/rdl/types/type.rb +8 -8
  27. data/lib/rdl/types/type_inferencer.rb +1 -1
  28. data/lib/rdl/types/union.rb +2 -1
  29. data/lib/rdl/util.rb +28 -3
  30. data/lib/rdl/wrap.rb +216 -165
  31. data/lib/rdl_disable.rb +22 -15
  32. data/lib/types/core.rb +2 -4
  33. data/lib/types/core/_aliases.rb +14 -0
  34. data/lib/types/core/abbrev.rb +3 -0
  35. data/lib/types/core/array.rb +139 -0
  36. data/lib/types/core/base64.rb +8 -0
  37. data/lib/types/core/basic_object.rb +12 -0
  38. data/lib/types/core/benchmark.rb +9 -0
  39. data/lib/types/core/bigdecimal.rb +223 -0
  40. data/lib/types/core/bigmath.rb +10 -0
  41. data/lib/types/core/bignum.rb +214 -0
  42. data/lib/types/core/class.rb +15 -0
  43. data/lib/types/core/complex.rb +123 -0
  44. data/lib/types/core/coverage.rb +4 -0
  45. data/lib/types/core/csv.rb +3 -0
  46. data/lib/types/core/date.rb +4 -0
  47. data/lib/types/core/dir.rb +37 -0
  48. data/lib/types/core/encoding.rb +21 -0
  49. data/lib/types/core/enumerable.rb +96 -0
  50. data/lib/types/core/enumerator.rb +24 -0
  51. data/lib/types/core/exception.rb +15 -0
  52. data/lib/types/core/file.rb +125 -0
  53. data/lib/types/core/fileutils.rb +4 -0
  54. data/lib/types/core/fixnum.rb +213 -0
  55. data/lib/types/core/float.rb +199 -0
  56. data/lib/types/core/gem.rb +19 -0
  57. data/lib/types/core/hash.rb +72 -0
  58. data/lib/types/core/integer.rb +194 -0
  59. data/lib/types/core/io.rb +101 -0
  60. data/lib/types/core/kernel.rb +89 -0
  61. data/lib/types/core/marshal.rb +3 -0
  62. data/lib/types/core/matchdata.rb +24 -0
  63. data/lib/types/core/math.rb +50 -0
  64. data/lib/types/core/module.rb +81 -0
  65. data/lib/types/core/nil.rb +11 -0
  66. data/lib/types/core/numeric.rb +56 -0
  67. data/lib/types/core/object.rb +73 -0
  68. data/lib/types/core/pathname.rb +104 -0
  69. data/lib/types/core/proc.rb +12 -0
  70. data/lib/types/core/process.rb +110 -0
  71. data/lib/types/core/random.rb +13 -0
  72. data/lib/types/core/range.rb +37 -0
  73. data/lib/types/core/rational.rb +207 -0
  74. data/lib/types/core/regexp.rb +28 -0
  75. data/lib/types/core/set.rb +56 -0
  76. data/lib/types/core/string.rb +140 -0
  77. data/lib/types/core/strscan.rb +6 -0
  78. data/lib/types/core/symbol.rb +27 -0
  79. data/lib/types/core/time.rb +66 -0
  80. data/lib/types/core/uri.rb +18 -0
  81. data/lib/types/core/yaml.rb +3 -0
  82. data/lib/types/devise.rb +1 -0
  83. data/lib/types/devise/controller_helpers.rb +3 -0
  84. data/lib/types/devise/parameter_sanitizer.rb +2 -0
  85. data/lib/types/pundit.rb +2 -0
  86. data/lib/types/rails/_helpers.rb +50 -0
  87. data/lib/types/rails/abstract_controller/translation.rb +2 -0
  88. data/lib/types/rails/action_controller/base.rb +3 -0
  89. data/lib/types/rails/action_controller/instrumentation.rb +6 -0
  90. data/lib/types/rails/action_controller/metal.rb +3 -0
  91. data/lib/types/rails/action_controller/mime_responds.rb +13 -0
  92. data/lib/types/rails/action_controller/parameters.rb +3 -0
  93. data/lib/types/{rails-5.x → rails}/action_controller/strong_parameters.rb +4 -8
  94. data/lib/types/rails/action_dispatch/flashhash.rb +8 -0
  95. data/lib/types/rails/action_dispatch/routing.rb +10 -0
  96. data/lib/types/rails/action_mailer/base.rb +2 -0
  97. data/lib/types/rails/action_mailer/message_delivery.rb +2 -0
  98. data/lib/types/rails/action_view/helpers_sanitizehelper.rb +2 -0
  99. data/lib/types/rails/action_view/helpers_urlhelper.rb +5 -0
  100. data/lib/types/rails/active_model/errors.rb +14 -0
  101. data/lib/types/rails/active_model/validations.rb +2 -0
  102. data/lib/types/rails/active_record/associations.rb +208 -0
  103. data/lib/types/rails/active_record/base.rb +2 -0
  104. data/lib/types/rails/active_record/core.rb +2 -0
  105. data/lib/types/rails/active_record/finder_methods.rb +2 -0
  106. data/lib/types/rails/active_record/model_schema.rb +37 -0
  107. data/lib/types/rails/active_record/relation.rb +11 -0
  108. data/lib/types/rails/active_record/schema_types.rb +51 -0
  109. data/lib/types/rails/active_record/validations.rb +2 -0
  110. data/lib/types/rails/active_support/base.rb +2 -0
  111. data/lib/types/rails/active_support/logger.rb +3 -0
  112. data/lib/types/rails/active_support/tagged_logging.rb +2 -0
  113. data/lib/types/rails/active_support/time_with_zone.rb +13 -0
  114. data/lib/types/rails/active_support/time_zone.rb +2 -0
  115. data/lib/types/rails/fixnum.rb +2 -0
  116. data/lib/types/rails/integer.rb +2 -0
  117. data/lib/types/rails/rack/request.rb +2 -0
  118. data/lib/types/rails/string.rb +3 -0
  119. data/lib/types/rails/time.rb +1 -0
  120. data/rdl.gemspec +2 -2
  121. data/test/disabled_test_rdoc.rb +8 -8
  122. data/test/test_alias.rb +1 -0
  123. data/test/test_dsl.rb +4 -4
  124. data/test/test_generic.rb +45 -38
  125. data/test/test_intersection.rb +10 -10
  126. data/test/test_le.rb +103 -102
  127. data/test/test_member.rb +33 -33
  128. data/test/test_parser.rb +101 -96
  129. data/test/test_query.rb +84 -84
  130. data/test/test_rdl.rb +87 -52
  131. data/test/test_rdl_type.rb +26 -9
  132. data/test/test_type_contract.rb +32 -31
  133. data/test/test_typecheck.rb +802 -436
  134. data/test/test_types.rb +39 -39
  135. data/test/test_wrap.rb +3 -2
  136. metadata +91 -120
  137. data/extras/type_tests/%.rb +0 -171
  138. data/extras/type_tests/&.rb +0 -159
  139. data/extras/type_tests/**.rb +0 -222
  140. data/extras/type_tests/*.rb +0 -177
  141. data/extras/type_tests/+.rb +0 -170
  142. data/extras/type_tests/-.rb +0 -171
  143. data/extras/type_tests/1scomp.rb +0 -157
  144. data/extras/type_tests/<.rb +0 -170
  145. data/extras/type_tests/<<.rb +0 -159
  146. data/extras/type_tests/>>.rb +0 -159
  147. data/extras/type_tests/[].rb +0 -163
  148. data/extras/type_tests/^.rb +0 -159
  149. data/extras/type_tests/abs.rb +0 -155
  150. data/extras/type_tests/abs2.rb +0 -164
  151. data/extras/type_tests/angle.rb +0 -157
  152. data/extras/type_tests/arg.rb +0 -157
  153. data/extras/type_tests/bit_length.rb +0 -157
  154. data/extras/type_tests/ceil.rb +0 -157
  155. data/extras/type_tests/ceilRational.rb +0 -160
  156. data/extras/type_tests/conj.rb +0 -158
  157. data/extras/type_tests/defwhere.rb +0 -86
  158. data/extras/type_tests/denominator.rb +0 -157
  159. data/extras/type_tests/div.rb +0 -172
  160. data/extras/type_tests/divslash.rb +0 -179
  161. data/extras/type_tests/even?.rb +0 -157
  162. data/extras/type_tests/fdiv.rb +0 -244
  163. data/extras/type_tests/finite?.rb +0 -157
  164. data/extras/type_tests/floor.rb +0 -157
  165. data/extras/type_tests/floorRational.rb +0 -161
  166. data/extras/type_tests/hash.rb +0 -157
  167. data/extras/type_tests/imag.rb +0 -158
  168. data/extras/type_tests/infinite?.rb +0 -157
  169. data/extras/type_tests/modulo.rb +0 -171
  170. data/extras/type_tests/nan?.rb +0 -157
  171. data/extras/type_tests/neg.rb +0 -155
  172. data/extras/type_tests/next.rb +0 -157
  173. data/extras/type_tests/next_float.rb +0 -157
  174. data/extras/type_tests/numerator.rb +0 -157
  175. data/extras/type_tests/phase.rb +0 -157
  176. data/extras/type_tests/prev_float.rb +0 -157
  177. data/extras/type_tests/quo.rb +0 -179
  178. data/extras/type_tests/rationalize.rb +0 -157
  179. data/extras/type_tests/rationalizeArg.rb +0 -198
  180. data/extras/type_tests/real.rb +0 -157
  181. data/extras/type_tests/real?.rb +0 -157
  182. data/extras/type_tests/round.rb +0 -157
  183. data/extras/type_tests/roundArg.rb +0 -169
  184. data/extras/type_tests/size.rb +0 -157
  185. data/extras/type_tests/to_c.rb +0 -157
  186. data/extras/type_tests/to_f.rb +0 -155
  187. data/extras/type_tests/to_i.rb +0 -157
  188. data/extras/type_tests/to_r.rb +0 -157
  189. data/extras/type_tests/to_s.rb +0 -157
  190. data/extras/type_tests/truncate.rb +0 -157
  191. data/extras/type_tests/truncateArg.rb +0 -166
  192. data/extras/type_tests/type tests +0 -1
  193. data/extras/type_tests/zero?.rb +0 -155
  194. data/extras/type_tests/|.rb +0 -159
  195. data/lib/types/core-ruby-2.x/_aliases.rb +0 -15
  196. data/lib/types/core-ruby-2.x/abbrev.rb +0 -5
  197. data/lib/types/core-ruby-2.x/array.rb +0 -137
  198. data/lib/types/core-ruby-2.x/base64.rb +0 -10
  199. data/lib/types/core-ruby-2.x/basic_object.rb +0 -14
  200. data/lib/types/core-ruby-2.x/benchmark.rb +0 -11
  201. data/lib/types/core-ruby-2.x/bigdecimal.rb +0 -224
  202. data/lib/types/core-ruby-2.x/bigmath.rb +0 -12
  203. data/lib/types/core-ruby-2.x/bignum.rb +0 -214
  204. data/lib/types/core-ruby-2.x/class.rb +0 -17
  205. data/lib/types/core-ruby-2.x/complex.rb +0 -124
  206. data/lib/types/core-ruby-2.x/coverage.rb +0 -6
  207. data/lib/types/core-ruby-2.x/csv.rb +0 -5
  208. data/lib/types/core-ruby-2.x/date.rb +0 -6
  209. data/lib/types/core-ruby-2.x/dir.rb +0 -38
  210. data/lib/types/core-ruby-2.x/encoding.rb +0 -23
  211. data/lib/types/core-ruby-2.x/enumerable.rb +0 -98
  212. data/lib/types/core-ruby-2.x/enumerator.rb +0 -26
  213. data/lib/types/core-ruby-2.x/exception.rb +0 -17
  214. data/lib/types/core-ruby-2.x/file.rb +0 -126
  215. data/lib/types/core-ruby-2.x/fileutils.rb +0 -6
  216. data/lib/types/core-ruby-2.x/fixnum.rb +0 -213
  217. data/lib/types/core-ruby-2.x/float.rb +0 -199
  218. data/lib/types/core-ruby-2.x/gem.rb +0 -247
  219. data/lib/types/core-ruby-2.x/hash.rb +0 -72
  220. data/lib/types/core-ruby-2.x/integer.rb +0 -197
  221. data/lib/types/core-ruby-2.x/io.rb +0 -103
  222. data/lib/types/core-ruby-2.x/kernel.rb +0 -90
  223. data/lib/types/core-ruby-2.x/marshal.rb +0 -5
  224. data/lib/types/core-ruby-2.x/matchdata.rb +0 -26
  225. data/lib/types/core-ruby-2.x/math.rb +0 -53
  226. data/lib/types/core-ruby-2.x/module.rb +0 -83
  227. data/lib/types/core-ruby-2.x/nil.rb +0 -12
  228. data/lib/types/core-ruby-2.x/numeric.rb +0 -56
  229. data/lib/types/core-ruby-2.x/object.rb +0 -75
  230. data/lib/types/core-ruby-2.x/pathname.rb +0 -106
  231. data/lib/types/core-ruby-2.x/proc.rb +0 -16
  232. data/lib/types/core-ruby-2.x/process.rb +0 -127
  233. data/lib/types/core-ruby-2.x/random.rb +0 -17
  234. data/lib/types/core-ruby-2.x/range.rb +0 -39
  235. data/lib/types/core-ruby-2.x/rational.rb +0 -209
  236. data/lib/types/core-ruby-2.x/regexp.rb +0 -30
  237. data/lib/types/core-ruby-2.x/set.rb +0 -58
  238. data/lib/types/core-ruby-2.x/string.rb +0 -143
  239. data/lib/types/core-ruby-2.x/strscan.rb +0 -7
  240. data/lib/types/core-ruby-2.x/symbol.rb +0 -29
  241. data/lib/types/core-ruby-2.x/time.rb +0 -68
  242. data/lib/types/core-ruby-2.x/uri.rb +0 -20
  243. data/lib/types/core-ruby-2.x/yaml.rb +0 -5
  244. data/lib/types/rails-5.x/_helpers.rb +0 -52
  245. data/lib/types/rails-5.x/action_controller/mime_responds.rb +0 -11
  246. data/lib/types/rails-5.x/action_dispatch/routing.rb +0 -10
  247. data/lib/types/rails-5.x/active_model/errors.rb +0 -15
  248. data/lib/types/rails-5.x/active_model/validations.rb +0 -5
  249. data/lib/types/rails-5.x/active_record/associations.rb +0 -190
  250. data/lib/types/rails-5.x/active_record/core.rb +0 -3
  251. data/lib/types/rails-5.x/active_record/model_schema.rb +0 -39
  252. data/lib/types/rails-5.x/fixnum.rb +0 -3
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'ActiveRecord::Base'
2
+ RDL.type :'ActiveRecord::Base', :logger, '() -> ActiveSupport::Logger'
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'ActiveRecord::Core'
2
+ RDL.type :'ActiveRecord::Core', :==, '(%any) -> %bool'
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'ActiveRecord::FinderMethods'
2
+ RDL.type :'ActiveRecord::FinderMethods', :exists?, '(?String or Fixnum or Array<String> or Hash<String or Symbol, %any>) -> %bool'
@@ -0,0 +1,37 @@
1
+ module ActiveRecord::ModelSchema::ClassMethods
2
+ extend RDL::RDLAnnotate
3
+
4
+ rdl_post(:load_schema!) { |ret| # load_schema! doesn't return anything interesting
5
+ columns_hash.each { |name, col|
6
+ t = RDL::Rails.column_to_rdl(col.type)
7
+ if col.null
8
+ # may be null; show nullability in return type
9
+ rdl_type name, "() -> #{t} or nil" # getter
10
+ rdl_type "#{name}=", "(#{t}) -> #{t} or nil" # setter
11
+ rdl_type "write_attribute", "(:#{name}, #{t}) -> %bool"
12
+ rdl_type "update_attribute", "(:#{name}, #{t}) -> %bool"
13
+ rdl_type "update_column", "(:#{name}, #{t}) -> %bool"
14
+ else
15
+ # not null; can't truly check in type system but hint via the name
16
+ rdl_type name, "() -> !#{t}" # getter
17
+ rdl_type "#{name}=", "(!#{t}) -> !#{t}" # setter
18
+ rdl_type "write_attribute", "(:#{name}, !#{t}) -> %bool"
19
+ rdl_type "update_attribute", "(:#{name}, #{t}) -> %bool"
20
+ rdl_type "update_column", "(:#{name}, #{t}) -> %bool"
21
+ end
22
+ }
23
+
24
+ attribute_types = RDL::Rails.attribute_types(self)
25
+ rdl_type 'self.find_by', '(' + attribute_types + ") -> #{self} or nil"
26
+ rdl_type 'self.find_by!', '(' + attribute_types + ") -> #{self}"
27
+ rdl_type 'update', '(' + attribute_types + ') -> %bool'
28
+ rdl_type 'update_columns', '(' + attribute_types + ') -> %bool'
29
+ rdl_type 'attributes=', '(' + attribute_types + ') -> %bool'
30
+
31
+ # If called with String arguments, can't check types as precisely
32
+ rdl_type 'write_attribute', '(String, %any) -> %bool'
33
+ rdl_type 'update_attribute', '(String, %any) -> %bool'
34
+ rdl_type 'update_column', '(String, %any) -> %bool'
35
+ true
36
+ }
37
+ end
@@ -0,0 +1,11 @@
1
+ RDL.nowrap :'ActiveRecord::Relation'
2
+
3
+ RDL.type_params :'ActiveRecord::Relation', [:t], :all?
4
+
5
+ RDL.type :'ActiveRecord::Relation', :[], '(Fixnum) -> t'
6
+ RDL.type :'ActiveRecord::Relation', :empty?, '() -> %bool'
7
+ RDL.type :'ActiveRecord::Relation', :first, '() -> t'
8
+ RDL.type :'ActiveRecord::Relation', :length, '() -> Fixnum'
9
+ RDL.type :'ActiveRecord::Relation', :sort, '() {(t, t) -> Fixnum} -> Array<t>'
10
+ RDL.type :'ActiveRecord::Relation', :each, '() -> Enumerator<t>'
11
+ RDL.type :'ActiveRecord::Relation', :each, '() { (t) -> %any } -> Array<t>'
@@ -0,0 +1,51 @@
1
+ class ActiveRecord::Base
2
+ extend RDL::RDLAnnotate
3
+
4
+ def self.add_schema_types
5
+ end
6
+
7
+ rdl_post('self.add_schema_types') { |ret| # load_schema! doesn't return anything interesting
8
+ type 'self.where', "(*%any) -> ActiveRecord::Relation<#{self}>"
9
+
10
+ columns_hash.each { |name, col|
11
+ t = RDL::Rails.column_to_rdl(col.type)
12
+ if col.null
13
+ # may be null; show nullability in return type
14
+ rdl_type name, "() -> #{t} or nil" # getter
15
+ rdl_type "#{name}_id", "() -> #{t} or nil" # getter
16
+ rdl_type "#{name}=", "(#{t}) -> #{t} or nil" # setter
17
+ rdl_type "write_attribute", "(:#{name}, #{t}) -> %bool"
18
+ rdl_type "update_attribute", "(:#{name}, #{t}) -> %bool"
19
+ rdl_type "update_column", "(:#{name}, #{t}) -> %bool"
20
+ else
21
+ # not null; can't truly check in type system but hint via the name
22
+ rdl_type name, "() -> !#{t}" # getter
23
+ rdl_type "#{name}_id", "() -> !#{t}" # getter
24
+ rdl_type "#{name}=", "(!#{t}) -> !#{t}" # setter
25
+ rdl_type "write_attribute", "(:#{name}, !#{t}) -> %bool"
26
+ rdl_type "update_attribute", "(:#{name}, #{t}) -> %bool"
27
+ rdl_type "update_column", "(:#{name}, #{t}) -> %bool"
28
+ end
29
+ }
30
+
31
+ attribute_types = RDL::Rails.attribute_types(self)
32
+
33
+ rdl_type 'self.find', "(Fixnum) -> #{self}"
34
+ rdl_type 'self.find', "(String) -> #{self}"
35
+ rdl_type 'self.find', '({' + attribute_types + "}) -> #{self}"
36
+
37
+ =begin
38
+ type 'self.find_by', '(' + attribute_types + ") -> #{self} or nil"
39
+ type 'self.find_by!', '(' + attribute_types + ") -> #{self}"
40
+ type 'update', '(' + attribute_types + ') -> %bool'
41
+ type 'update_columns', '(' + attribute_types + ') -> %bool'
42
+ type 'attributes=', '(' + attribute_types + ') -> %bool'
43
+
44
+ # If called with String arguments, can't check types as precisely
45
+ type 'write_attribute', '(String, %any) -> %bool'
46
+ type 'update_attribute', '(String, %any) -> %bool'
47
+ type 'update_column', '(String, %any) -> %bool'
48
+ =end
49
+ true
50
+ }
51
+ end
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'ActiveRecord::Validations'
2
+ RDL.type :'ActiveRecord::Validations', :valid?, '(?:create or :update or :on or NilClass) -> %bool'
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'ActiveRecord::Base'
2
+ RDL.type :'ActiveRecord::Base', :logger, '() -> ActiveSupport::Logger'
@@ -0,0 +1,3 @@
1
+ RDL.nowrap :'ActiveSupport::Logger'
2
+ RDL.type :'ActiveSupport::Logger', :error, '(String) -> %bool'
3
+ RDL.type :'ActiveSupport::Logger', :debug, '(String) -> %bool'
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'ActiveSupport::TaggedLogging'
2
+ RDL.type :'ActiveSupport::TaggedLogging', :info, '(String) -> %bool'
@@ -0,0 +1,13 @@
1
+ RDL.nowrap :'ActiveSupport::TimeWithZone'
2
+ RDL.type :'ActiveSupport::TimeWithZone', :beginning_of_day, '() -> ActiveSupport::TimeWithZone'
3
+ RDL.type :'ActiveSupport::TimeWithZone', :end_of_day, '() -> ActiveSupport::TimeWithZone'
4
+ RDL.type :'ActiveSupport::TimeWithZone', :beginning_of_week, '() -> ActiveSupport::TimeWithZone'
5
+ RDL.type :'ActiveSupport::TimeWithZone', :end_of_week, '() -> ActiveSupport::TimeWithZone'
6
+ RDL.type :'ActiveSupport::TimeWithZone', :to_date, '() -> Date'
7
+ RDL.type :'ActiveSupport::TimeWithZone', :strftime, '(String) -> String'
8
+ RDL.type :'ActiveSupport::TimeWithZone', :+, '(ActiveSupport::Duration) -> ActiveSupport::TimeWithZone'
9
+ RDL.type :'ActiveSupport::TimeWithZone', :-, '(ActiveSupport::Duration) -> ActiveSupport::TimeWithZone'
10
+ RDL.type :'ActiveSupport::TimeWithZone', :<, '(ActiveSupport::TimeWithZone or Time) -> %bool'
11
+ RDL.type :'ActiveSupport::TimeWithZone', :>, '(ActiveSupport::TimeWithZone or Time) -> %bool'
12
+ RDL.type :'ActiveSupport::TimeWithZone', :<=, '(ActiveSupport::TimeWithZone or Time) -> %bool'
13
+ RDL.type :'ActiveSupport::TimeWithZone', :>=, '(ActiveSupport::TimeWithZone or Time) -> %bool'
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'ActiveSupport::TimeZone'
2
+ RDL.type :'ActiveSupport::TimeZone', :now, '() -> ActiveSupport::TimeWithZone'
@@ -0,0 +1,2 @@
1
+ RDL.type :Fixnum, :*, '(ActiveSupport::Duration) -> ActiveSupport::Duration', version: RDL::Globals::FIXBIG_VERSIONS
2
+ RDL.type :Fixnum, :day, '() -> ActiveSupport::Duration', version: RDL::Globals::FIXBIG_VERSIONS
@@ -0,0 +1,2 @@
1
+ RDL.type :Integer, :*, '(ActiveSupport::Duration) -> ActiveSupport::Duration'
2
+ RDL.type :Integer, :day, '() -> ActiveSupport::Duration'
@@ -0,0 +1,2 @@
1
+ RDL.nowrap :'Rack::Request'
2
+ RDL.type :'Rack::Request', :env, '() -> Hash<String, %any>'
@@ -0,0 +1,3 @@
1
+ RDL.type :String, :truncate, '(Fixnum) -> String'
2
+ RDL.type :String, :strftime, '(String) -> String'
3
+ RDL.type :String, :sanitize, '() -> String'
@@ -0,0 +1 @@
1
+ RDL.type :Time, 'self.zone', '() -> ActiveSupport::TimeZone'
@@ -4,8 +4,8 @@
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'rdl'
7
- s.version = '2.0.1'
8
- s.date = '2016-11-11'
7
+ s.version = '2.1.0'
8
+ s.date = '2017-06-14'
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
@@ -14,9 +14,9 @@ class RdocTest < MiniTest::Test
14
14
 
15
15
  class TestClass
16
16
  extend RDL
17
-
18
- typesig :size, "()->Fixnum"
19
- typesig :bytesize, "()->Fixnum"
17
+
18
+ typesig :size, "()->Integer"
19
+ typesig :bytesize, "()->Integer"
20
20
  end
21
21
 
22
22
  def test_rdoc_gen
@@ -35,25 +35,25 @@ class TestRDLRDoc
35
35
  @rdoc = RDoc::RDoc.new
36
36
  @rdoc.store = @store
37
37
  @rdoc.options = RDoc::Options.new
38
-
38
+
39
39
  g = Object.new
40
40
  def g.class_dir() end
41
41
  def g.file_dir() end
42
42
  @rdoc.generator = g
43
-
43
+
44
44
  @lib_dir = "#{@pwd}/lib"
45
45
  $LOAD_PATH.unshift @lib_dir # ensure we load from this RDoc
46
-
46
+
47
47
  @options = RDoc::Options.new
48
48
  @options.option_parser = OptionParser.new
49
-
49
+
50
50
  p Dir.tmpdir
51
51
  @tmpdir = File.join Dir.tmpdir, "test_rdoc_generator_darkfish_#{$$}"
52
52
  FileUtils.mkdir_p @tmpdir
53
53
  Dir.chdir @tmpdir
54
54
  @options.op_dir = @tmpdir
55
55
  @options.generator = RDoc::Generator::Darkfish
56
-
56
+
57
57
  $LOAD_PATH.each do |path|
58
58
  darkfish_dir = File.join path, 'rdoc/generator/template/darkfish/'
59
59
  next unless File.directory? darkfish_dir
@@ -3,6 +3,7 @@ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
3
  require 'rdl'
4
4
 
5
5
  class TestAlias < Minitest::Test
6
+ extend RDL::Annotate
6
7
 
7
8
  def test_alias_lookup
8
9
  self.class.class_eval {
@@ -7,8 +7,8 @@ class TestDsl < Minitest::Test
7
7
  class Pair
8
8
 
9
9
  # dsl {
10
- # type :left, '(Fixnum) -> Fixnum'
11
- # type :right, '(Fixnum) -> Fixnum'
10
+ # type :left, '(Integer) -> Integer'
11
+ # type :right, '(Integer) -> Integer'
12
12
  # }
13
13
  def entry(&blk)
14
14
  instance_eval(&blk)
@@ -30,9 +30,9 @@ class TestDsl < Minitest::Test
30
30
  class Tree
31
31
 
32
32
  # dsl :tree { # recursive DSL
33
- # type :left, '(Fixnum) -> Fixnum'
33
+ # type :left, '(Integer) -> Integer'
34
34
  # dsl :left, :tree
35
- # type :right, '(Fixnum) -> Fixnum'
35
+ # type :right, '(Integer) -> Integer'
36
36
  # dsl :right, :tree
37
37
  # }
38
38
  def entry(val, &blk)
@@ -3,10 +3,12 @@ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
3
  require 'rdl'
4
4
 
5
5
  class TestGeneric < Minitest::Test
6
+ extend RDL::Annotate
6
7
 
7
8
  # Make two classes that wrap Array and Hash, so we don't mess with their
8
9
  # implementations in test case evaluation.
9
10
  class A
11
+ extend RDL::Annotate
10
12
  type_params [:t], :all?
11
13
  def initialize(a); @a = a end
12
14
  def all?(&blk)
@@ -15,6 +17,7 @@ class TestGeneric < Minitest::Test
15
17
  end
16
18
 
17
19
  class H
20
+ extend RDL::Annotate
18
21
  type_params [:k, :v], :all?
19
22
  def initialize(h); @h = h end
20
23
  def all?(&blk)
@@ -23,6 +26,7 @@ class TestGeneric < Minitest::Test
23
26
  end
24
27
 
25
28
  class B
29
+ extend RDL::Annotate
26
30
  # class for checking other variance annotations
27
31
  type_params [:a, :b], nil, variance: [:+, :-] { |a, b| true }
28
32
  type "(a) -> nil"
@@ -37,13 +41,13 @@ class TestGeneric < Minitest::Test
37
41
  def setup
38
42
  @ta = RDL::Type::NominalType.new "TestGeneric::A"
39
43
  @th = RDL::Type::NominalType.new "TestGeneric::H"
40
- @tas = RDL::Type::GenericType.new(@ta, $__rdl_string_type)
41
- @tao = RDL::Type::GenericType.new(@ta, $__rdl_object_type)
44
+ @tas = RDL::Type::GenericType.new(@ta, RDL::Globals.types[:string])
45
+ @tao = RDL::Type::GenericType.new(@ta, RDL::Globals.types[:object])
42
46
  @taas = RDL::Type::GenericType.new(@ta, @tas)
43
47
  @taao = RDL::Type::GenericType.new(@ta, @tao)
44
- @thss = RDL::Type::GenericType.new(@th, $__rdl_string_type, $__rdl_string_type)
45
- @thoo = RDL::Type::GenericType.new(@th, $__rdl_object_type, $__rdl_object_type)
46
- @thsf = RDL::Type::GenericType.new(@th, $__rdl_string_type, $__rdl_fixnum_type)
48
+ @thss = RDL::Type::GenericType.new(@th, RDL::Globals.types[:string], RDL::Globals.types[:string])
49
+ @thoo = RDL::Type::GenericType.new(@th, RDL::Globals.types[:object], RDL::Globals.types[:object])
50
+ @thsf = RDL::Type::GenericType.new(@th, RDL::Globals.types[:string], RDL::Globals.types[:integer])
47
51
  @tb = RDL::Type::NominalType.new "TestGeneric::B"
48
52
  end
49
53
 
@@ -68,10 +72,10 @@ class TestGeneric < Minitest::Test
68
72
  assert (not (@thss <= @th))
69
73
 
70
74
  # Check co- and contravariance using B
71
- tbss = RDL::Type::GenericType.new(@tb, $__rdl_string_type, $__rdl_string_type)
72
- tbso = RDL::Type::GenericType.new(@tb, $__rdl_string_type, $__rdl_object_type)
73
- tbos = RDL::Type::GenericType.new(@tb, $__rdl_object_type, $__rdl_string_type)
74
- tboo = RDL::Type::GenericType.new(@tb, $__rdl_object_type, $__rdl_object_type)
75
+ tbss = RDL::Type::GenericType.new(@tb, RDL::Globals.types[:string], RDL::Globals.types[:string])
76
+ tbso = RDL::Type::GenericType.new(@tb, RDL::Globals.types[:string], RDL::Globals.types[:object])
77
+ tbos = RDL::Type::GenericType.new(@tb, RDL::Globals.types[:object], RDL::Globals.types[:string])
78
+ tboo = RDL::Type::GenericType.new(@tb, RDL::Globals.types[:object], RDL::Globals.types[:object])
75
79
  assert (tbss <= tbss)
76
80
  assert (not (tbss <= tbso))
77
81
  assert (tbss <= tbos)
@@ -91,10 +95,10 @@ class TestGeneric < Minitest::Test
91
95
  end
92
96
 
93
97
  def test_le_structural
94
- tbss = RDL::Type::GenericType.new(@tb, $__rdl_string_type, $__rdl_string_type)
95
- tma = RDL::Type::MethodType.new([], nil, $__rdl_nil_type)
96
- tmb = RDL::Type::MethodType.new([$__rdl_string_type], nil, $__rdl_nil_type)
97
- tmc = RDL::Type::MethodType.new([$__rdl_fixnum_type], nil, $__rdl_nil_type)
98
+ tbss = RDL::Type::GenericType.new(@tb, RDL::Globals.types[:string], RDL::Globals.types[:string])
99
+ tma = RDL::Type::MethodType.new([], nil, RDL::Globals.types[:nil])
100
+ tmb = RDL::Type::MethodType.new([RDL::Globals.types[:string]], nil, RDL::Globals.types[:nil])
101
+ tmc = RDL::Type::MethodType.new([RDL::Globals.types[:integer]], nil, RDL::Globals.types[:nil])
98
102
  ts1 = RDL::Type::StructuralType.new(m2: tma)
99
103
  assert (tbss <= ts1)
100
104
  ts2 = RDL::Type::StructuralType.new(m1: tmb)
@@ -108,6 +112,7 @@ class TestGeneric < Minitest::Test
108
112
  end
109
113
 
110
114
  class C
115
+ extend RDL::Annotate
111
116
  type "() -> self"
112
117
  def m1() return self; end
113
118
  type "() -> self"
@@ -141,51 +146,53 @@ class TestGeneric < Minitest::Test
141
146
  end
142
147
 
143
148
  def test_instantiate
144
- assert_raises(RuntimeError) { Object.new.instantiate!($__rdl_string_type) }
149
+ assert_raises(RuntimeError) { RDL.instantiate!(Object.new, RDL::Globals.types[:string]) }
145
150
 
146
151
  # Array<String>
147
- assert (A.new([]).instantiate!('String'))
148
- assert (A.new(["a", "b", "c"]).instantiate!($__rdl_string_type))
149
- assert (A.new(["a", "b", "c"]).instantiate!('String'))
150
- assert_raises(RDL::Type::TypeError) { A.new([1, 2, 3]).instantiate!('String') }
152
+ assert (RDL.instantiate!(A.new([]), 'String'))
153
+ assert (RDL.instantiate!(A.new(["a", "b", "c"]), RDL::Globals.types[:string], check: true))
154
+ assert (RDL.instantiate!(A.new(["a", "b", "c"]), 'String', check: true))
155
+ assert_raises(RDL::Type::TypeError) { RDL.instantiate!(A.new([1, 2, 3]), 'String', check: true) }
156
+ assert (RDL.instantiate!(A.new([1, 2, 3]), 'String', check: false))
151
157
 
152
158
  # Array<Object>
153
- assert (A.new([])).instantiate!('Object')
154
- assert (A.new(["a", "b", "c"]).instantiate!($__rdl_object_type))
155
- assert (A.new(["a", "b", "c"]).instantiate!('Object'))
156
- assert (A.new([1, 2, 3]).instantiate!('Object'))
157
-
158
- # Hash<String, Fixnum>
159
- assert (H.new({}).instantiate!('String', 'Fixnum'))
160
- assert (H.new({"one"=>1, "two"=>2}).instantiate!('String', 'Fixnum'))
159
+ assert (RDL.instantiate!(A.new([]), 'Object', check: true))
160
+ assert (RDL.instantiate!(A.new(["a", "b", "c"]), RDL::Globals.types[:object], check: true))
161
+ assert (RDL.instantiate!(A.new(["a", "b", "c"]), 'Object', check: true))
162
+ assert (RDL.instantiate!(A.new([1, 2, 3]), 'Object', check: true))
163
+
164
+ # Hash<String, Integer>
165
+ assert (RDL.instantiate!(H.new({}), 'String', 'Integer', check: true))
166
+ assert (RDL.instantiate!(H.new({"one"=>1, "two"=>2}), 'String', 'Integer', check: true))
161
167
  assert_raises(RDL::Type::TypeError) {
162
- H.new(one: 1, two: 2).instantiate!('String', 'Fixnum')
168
+ RDL.instantiate!(H.new(one: 1, two: 2), 'String', 'Integer', check: true)
163
169
  }
170
+ assert (RDL.instantiate!(H.new(one: 1, two: 2), 'String', 'Integer', check: false))
164
171
  assert_raises(RDL::Type::TypeError){
165
- H.new({"one"=>:one, "two"=>:two}).instantiate!('String', 'Fixnum')
172
+ RDL.instantiate!(H.new({"one"=>:one, "two"=>:two}), 'String', 'Integer', check: true)
166
173
  }
167
174
 
168
175
  # Hash<Object, Object>
169
- assert (H.new({}).instantiate!('Object', 'Object'))
170
- assert (H.new({"one"=>1, "two"=>2}).instantiate!('Object', 'Object'))
171
- assert (H.new(one: 1, two: 2).instantiate!('Object', 'Object'))
172
- assert (H.new({"one"=>:one, "two"=>:two}).instantiate!('Object', 'Object'))
176
+ assert (RDL.instantiate!(H.new({}), 'Object', 'Object', check: true))
177
+ assert (RDL.instantiate!(H.new({"one"=>1, "two"=>2}), 'Object', 'Object', check: true))
178
+ assert (RDL.instantiate!(H.new(one: 1, two: 2), 'Object', 'Object', check: true))
179
+ assert (RDL.instantiate!(H.new({"one"=>:one, "two"=>:two}), 'Object', 'Object', check: true))
173
180
 
174
181
  # A<A<String>>
175
- assert (A.new([A.new(["a", "b"]).instantiate!('String'),
176
- A.new(["c"]).instantiate!('String')]).instantiate!('TestGeneric::A<String>'))
182
+ assert (RDL.instantiate!(A.new([RDL.instantiate!(A.new(["a", "b"]), 'String', check: true),
183
+ RDL.instantiate!(A.new(["c"]), 'String', check: true)]), 'TestGeneric::A<String>', check: true))
177
184
  assert_raises(RDL::Type::TypeError) {
178
185
  # Must instantiate all members
179
- A.new([A.new(["a", "b"]).instantiate!('String'), A.new([])]).instantiate!('TestGeneric::A<String>')
186
+ RDL.instantiate!(A.new([RDL.instantiate!(A.new(["a", "b"]), 'String', check: true), A.new([])]), 'TestGeneric::A<String>', check: true)
180
187
  }
181
188
  assert_raises(RDL::Type::TypeError) {
182
189
  # All members must be of same type
183
- A.new([A.new(["a", "b"]).instantiate!('String'), "A"]).instantiate!('TestGeneric::A<String>')
190
+ RDL.instantiate!(A.new([RDL.instantiate!(A.new(["a", "b"]), 'String', check: true), "A"]), 'TestGeneric::A<String>', check: true)
184
191
  }
185
192
  assert_raises(RDL::Type::TypeError) {
186
193
  # All members must be instantiated and of same type
187
- A.new([A.new(["a", "b"]).instantiate!('String'),
188
- H.new({a: 1, b: 2}).instantiate!('Object', 'Object')]).instantiate!('TestGeneric::A<String>')
194
+ RDL.instantiate!(A.new([RDL.instantiate!(A.new(["a", "b"]), 'String', check: true),
195
+ RDL.instantiate!(H.new({a: 1, b: 2}), 'Object', 'Object', check: true)]), 'TestGeneric::A<String>', check: true)
189
196
  }
190
197
  end
191
198
 
@@ -8,7 +8,7 @@ class TestIntersection < Minitest::Test
8
8
  def setup
9
9
  @parser = RDL::Type::Parser.new
10
10
 
11
- @fixnum = NominalType.new(Fixnum)
11
+ @integer = NominalType.new(Integer)
12
12
  @string = NominalType.new(String)
13
13
  @array = NominalType.new(Array)
14
14
  @hash = NominalType.new(Hash)
@@ -16,24 +16,24 @@ class TestIntersection < Minitest::Test
16
16
 
17
17
  @tparam_t = VarType.new(:t)
18
18
 
19
- @f_or_s = UnionType.new(@fixnum, @string)
19
+ @f_or_s = UnionType.new(@integer, @string)
20
20
  @string_or_true = UnionType.new(@string, @true_n)
21
21
 
22
- @array_of_fixnum = GenericType.new(@array, @fixnum)
22
+ @array_of_integer = GenericType.new(@array, @integer)
23
23
  @array_of_true = GenericType.new(@array, @true_n)
24
- @array_of_fixnum_string = GenericType.new(@array, @f_or_s)
24
+ @array_of_integer_string = GenericType.new(@array, @f_or_s)
25
25
  @array_of_true_string = GenericType.new(@array, @string_or_true)
26
- @hash_of_string_fixnum = GenericType.new(@hash, @string, @fixnum)
27
- @hash_of_string_true_fixnum = GenericType.new(@hash, @string_or_true, @fixnum)
28
- @a_a_f = GenericType.new(@array, @array_of_fixnum)
26
+ @hash_of_string_integer = GenericType.new(@hash, @string, @integer)
27
+ @hash_of_string_true_integer = GenericType.new(@hash, @string_or_true, @integer)
28
+ @a_a_f = GenericType.new(@array, @array_of_integer)
29
29
  @a_a_a_f = GenericType.new(@array, @a_a_f)
30
30
  @a_a_a_a_f = GenericType.new(@array, @a_a_a_f)
31
31
  end
32
32
 
33
33
  def test_intersection_same
34
- t1 = @parser.scan_str "(Fixnum) -> Fixnum"
35
- t2 = @parser.scan_str "(Fixnum) -> Fixnum"
36
- t3 = @parser.scan_str "(Fixnum) -> Fixnum"
34
+ t1 = @parser.scan_str "(Integer) -> Integer"
35
+ t2 = @parser.scan_str "(Integer) -> Integer"
36
+ t3 = @parser.scan_str "(Integer) -> Integer"
37
37
  i = IntersectionType.new(t1, t2, t3)
38
38
 
39
39
  assert_equal(t1, i)