rbs 3.1.3 → 3.2.0.pre.1
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 +4 -4
- data/.github/workflows/ruby.yml +0 -6
- data/CHANGELOG.md +68 -0
- data/Gemfile +0 -6
- data/Gemfile.lock +12 -21
- data/README.md +1 -1
- data/Rakefile +44 -0
- data/Steepfile +3 -3
- data/core/array.rbs +0 -8
- data/core/builtin.rbs +28 -8
- data/core/constants.rbs +13 -5
- data/core/exception.rbs +1 -1
- data/core/global_variables.rbs +27 -27
- data/core/io.rbs +163 -172
- data/core/kernel.rbs +7 -4
- data/core/module.rbs +34 -32
- data/core/object.rbs +2 -2
- data/core/string_io.rbs +9 -0
- data/core/thread.rbs +25 -1
- data/core/time.rbs +3 -3
- data/docs/CONTRIBUTING.md +1 -1
- data/docs/rbs_by_example.md +16 -35
- data/docs/repo.md +1 -1
- data/docs/sigs.md +7 -7
- data/docs/stdlib.md +2 -3
- data/docs/syntax.md +40 -40
- data/lib/rbs/cli.rb +15 -4
- data/lib/rbs/collection/installer.rb +5 -2
- data/lib/rbs/collection/sources/stdlib.rb +5 -1
- data/lib/rbs/errors.rb +8 -1
- data/lib/rbs/file_finder.rb +1 -1
- data/lib/rbs/prototype/rb.rb +64 -6
- data/lib/rbs/prototype/rbi.rb +2 -6
- data/lib/rbs/prototype/runtime.rb +29 -8
- data/lib/rbs/subtractor.rb +17 -0
- data/lib/rbs/type_name.rb +4 -4
- data/lib/rbs/version.rb +1 -1
- data/rbs.gemspec +1 -1
- data/schema/decls.json +1 -1
- data/sig/errors.rbs +54 -0
- data/sig/parser.rbs +2 -2
- data/sig/prototype/rb.rbs +9 -1
- data/sig/subtractor.rbs +4 -0
- data/stdlib/logger/0/logger.rbs +1 -1
- data/stdlib/observable/0/observable.rbs +219 -0
- data/stdlib/uri/0/common.rbs +24 -0
- data/stdlib/zlib/0/buf_error.rbs +79 -0
- data/stdlib/zlib/0/data_error.rbs +79 -0
- data/stdlib/zlib/0/deflate.rbs +276 -0
- data/stdlib/zlib/0/error.rbs +89 -0
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +115 -0
- data/stdlib/zlib/0/gzip_file/error.rbs +128 -0
- data/stdlib/zlib/0/gzip_file/length_error.rbs +115 -0
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +114 -0
- data/stdlib/zlib/0/gzip_file.rbs +228 -0
- data/stdlib/zlib/0/gzip_reader.rbs +362 -0
- data/stdlib/zlib/0/gzip_writer.rbs +237 -0
- data/stdlib/zlib/0/inflate.rbs +249 -0
- data/stdlib/zlib/0/mem_error.rbs +79 -0
- data/stdlib/zlib/0/need_dict.rbs +82 -0
- data/stdlib/zlib/0/stream_end.rbs +80 -0
- data/stdlib/zlib/0/stream_error.rbs +80 -0
- data/stdlib/zlib/0/version_error.rbs +80 -0
- data/stdlib/zlib/0/zstream.rbs +270 -0
- metadata +24 -8
- data/stdlib/prime/0/integer-extension.rbs +0 -41
- data/stdlib/prime/0/manifest.yaml +0 -2
- data/stdlib/prime/0/prime.rbs +0 -372
data/core/module.rbs
CHANGED
@@ -235,7 +235,7 @@ class Module < Object
|
|
235
235
|
#
|
236
236
|
# Exiting with code 99
|
237
237
|
#
|
238
|
-
def alias_method: (
|
238
|
+
def alias_method: (id new_name, id old_name) -> ::Symbol
|
239
239
|
|
240
240
|
# <!--
|
241
241
|
# rdoc-file=object.c
|
@@ -284,7 +284,7 @@ class Module < Object
|
|
284
284
|
# end
|
285
285
|
# Mod.instance_methods.sort #=> [:one, :one=, :two, :two=]
|
286
286
|
#
|
287
|
-
def attr_accessor: (*
|
287
|
+
def attr_accessor: (*id arg0) -> Array[Symbol]
|
288
288
|
|
289
289
|
# <!--
|
290
290
|
# rdoc-file=object.c
|
@@ -298,7 +298,7 @@ class Module < Object
|
|
298
298
|
# in turn. String arguments are converted to symbols. Returns an array of
|
299
299
|
# defined method names as symbols.
|
300
300
|
#
|
301
|
-
def attr_reader: (*
|
301
|
+
def attr_reader: (*id arg0) -> Array[Symbol]
|
302
302
|
|
303
303
|
# <!--
|
304
304
|
# rdoc-file=object.c
|
@@ -309,7 +309,7 @@ class Module < Object
|
|
309
309
|
# *symbol*`.id2name`. String arguments are converted to symbols. Returns an
|
310
310
|
# array of defined method names as symbols.
|
311
311
|
#
|
312
|
-
def attr_writer: (*
|
312
|
+
def attr_writer: (*id arg0) -> Array[Symbol]
|
313
313
|
|
314
314
|
# <!--
|
315
315
|
# rdoc-file=load.c
|
@@ -328,7 +328,7 @@ class Module < Object
|
|
328
328
|
# replaced with *filename*. If *const* is defined but not as autoload, does
|
329
329
|
# nothing.
|
330
330
|
#
|
331
|
-
def autoload: (
|
331
|
+
def autoload: (id _module, String filename) -> NilClass
|
332
332
|
|
333
333
|
# <!--
|
334
334
|
# rdoc-file=load.c
|
@@ -354,7 +354,7 @@ class Module < Object
|
|
354
354
|
# B.autoload?(:CONST) #=> "const.rb", found in A (ancestor)
|
355
355
|
# B.autoload?(:CONST, false) #=> nil, not found in B itself
|
356
356
|
#
|
357
|
-
def autoload?: (
|
357
|
+
def autoload?: (id name, ?boolish inherit) -> String?
|
358
358
|
|
359
359
|
# <!-- rdoc-file=vm_eval.c -->
|
360
360
|
# Evaluates the string or block in the context of *mod*, except that when a
|
@@ -412,7 +412,7 @@ class Module < Object
|
|
412
412
|
# Fred.class_variable_defined?(:@@foo) #=> true
|
413
413
|
# Fred.class_variable_defined?(:@@bar) #=> false
|
414
414
|
#
|
415
|
-
def class_variable_defined?: (
|
415
|
+
def class_variable_defined?: (id arg0) -> bool
|
416
416
|
|
417
417
|
# <!--
|
418
418
|
# rdoc-file=object.c
|
@@ -428,7 +428,7 @@ class Module < Object
|
|
428
428
|
# end
|
429
429
|
# Fred.class_variable_get(:@@foo) #=> 99
|
430
430
|
#
|
431
|
-
def class_variable_get: (
|
431
|
+
def class_variable_get: (id arg0) -> untyped
|
432
432
|
|
433
433
|
# <!--
|
434
434
|
# rdoc-file=object.c
|
@@ -447,7 +447,7 @@ class Module < Object
|
|
447
447
|
# Fred.class_variable_set(:@@foo, 101) #=> 101
|
448
448
|
# Fred.new.foo #=> 101
|
449
449
|
#
|
450
|
-
def class_variable_set: (
|
450
|
+
def class_variable_set: (id arg0, untyped arg1) -> untyped
|
451
451
|
|
452
452
|
# <!--
|
453
453
|
# rdoc-file=object.c
|
@@ -527,7 +527,7 @@ class Module < Object
|
|
527
527
|
#
|
528
528
|
# Hash.const_defined? 'foobar' #=> NameError: wrong constant name foobar
|
529
529
|
#
|
530
|
-
def const_defined?: (
|
530
|
+
def const_defined?: (id name, ?boolish inherit) -> bool
|
531
531
|
|
532
532
|
# <!--
|
533
533
|
# rdoc-file=object.c
|
@@ -566,7 +566,7 @@ class Module < Object
|
|
566
566
|
#
|
567
567
|
# Object.const_get 'foobar' #=> NameError: wrong constant name foobar
|
568
568
|
#
|
569
|
-
def const_get: (
|
569
|
+
def const_get: (id name, ?boolish inherit) -> untyped
|
570
570
|
|
571
571
|
# <!--
|
572
572
|
# rdoc-file=object.c
|
@@ -618,7 +618,7 @@ class Module < Object
|
|
618
618
|
#
|
619
619
|
# Object.const_set('foobar', 42) #=> NameError: wrong constant name foobar
|
620
620
|
#
|
621
|
-
def const_set: (
|
621
|
+
def const_set: (id arg0, untyped arg1) -> untyped
|
622
622
|
|
623
623
|
# <!--
|
624
624
|
# rdoc-file=object.c
|
@@ -668,7 +668,7 @@ class Module < Object
|
|
668
668
|
# p Object.const_source_location('A::C1') # => ["test.rb", 2] -- nesting is supported
|
669
669
|
# p Object.const_source_location('String') # => [] -- constant is defined in C code
|
670
670
|
#
|
671
|
-
def const_source_location: (
|
671
|
+
def const_source_location: (id name, ?boolish inherit) -> ([ String, Integer ] | [ ] | nil)
|
672
672
|
|
673
673
|
# <!--
|
674
674
|
# rdoc-file=object.c
|
@@ -726,8 +726,8 @@ class Module < Object
|
|
726
726
|
# I'm Dino!
|
727
727
|
# #<B:0x401b39e8>
|
728
728
|
#
|
729
|
-
def define_method: (
|
730
|
-
| (
|
729
|
+
def define_method: (id symbol, Proc | Method | UnboundMethod method) -> Symbol
|
730
|
+
| (id symbol) { () -> untyped } -> Symbol
|
731
731
|
|
732
732
|
# <!--
|
733
733
|
# rdoc-file=object.c
|
@@ -746,7 +746,7 @@ class Module < Object
|
|
746
746
|
# HTTP::NOT_FOUND
|
747
747
|
# # warning: constant HTTP::NOT_FOUND is deprecated
|
748
748
|
#
|
749
|
-
def deprecate_constant: (*
|
749
|
+
def deprecate_constant: (*id) -> self
|
750
750
|
|
751
751
|
def eql?: (untyped other) -> bool
|
752
752
|
|
@@ -936,7 +936,7 @@ class Module < Object
|
|
936
936
|
#
|
937
937
|
# Hello there, Dave!
|
938
938
|
#
|
939
|
-
def instance_method: (
|
939
|
+
def instance_method: (id arg0) -> UnboundMethod
|
940
940
|
|
941
941
|
# <!--
|
942
942
|
# rdoc-file=object.c
|
@@ -1029,7 +1029,7 @@ class Module < Object
|
|
1029
1029
|
# C.method_defined? "method4" #=> false
|
1030
1030
|
# C.method_defined? "private_method2" #=> false
|
1031
1031
|
#
|
1032
|
-
def method_defined?: (
|
1032
|
+
def method_defined?: (id name, ?boolish inherit) -> bool
|
1033
1033
|
|
1034
1034
|
# <!--
|
1035
1035
|
# rdoc-file=object.c
|
@@ -1147,7 +1147,7 @@ class Module < Object
|
|
1147
1147
|
# Mod.one #=> "This is one"
|
1148
1148
|
# c.call_one #=> "This is the new one"
|
1149
1149
|
#
|
1150
|
-
def module_function: (*
|
1150
|
+
def module_function: (*id arg0) -> self
|
1151
1151
|
|
1152
1152
|
# <!--
|
1153
1153
|
# rdoc-file=object.c
|
@@ -1246,7 +1246,7 @@ class Module < Object
|
|
1246
1246
|
# end
|
1247
1247
|
# end
|
1248
1248
|
#
|
1249
|
-
def private_class_method: (*
|
1249
|
+
def private_class_method: (*id arg0) -> self
|
1250
1250
|
|
1251
1251
|
# <!--
|
1252
1252
|
# rdoc-file=object.c
|
@@ -1254,7 +1254,7 @@ class Module < Object
|
|
1254
1254
|
# -->
|
1255
1255
|
# Makes a list of existing constants private.
|
1256
1256
|
#
|
1257
|
-
def private_constant: (*
|
1257
|
+
def private_constant: (*id arg0) -> self
|
1258
1258
|
|
1259
1259
|
# <!--
|
1260
1260
|
# rdoc-file=object.c
|
@@ -1301,7 +1301,7 @@ class Module < Object
|
|
1301
1301
|
# C.private_method_defined? "method2", false #=> false
|
1302
1302
|
# C.method_defined? "method2" #=> false
|
1303
1303
|
#
|
1304
|
-
def private_method_defined?: (
|
1304
|
+
def private_method_defined?: (id name, ?boolish inherit) -> bool
|
1305
1305
|
|
1306
1306
|
# <!--
|
1307
1307
|
# rdoc-file=vm_method.c
|
@@ -1365,7 +1365,7 @@ class Module < Object
|
|
1365
1365
|
# C.protected_method_defined? "method2", false #=> false
|
1366
1366
|
# C.method_defined? "method2" #=> true
|
1367
1367
|
#
|
1368
|
-
def protected_method_defined?: (
|
1368
|
+
def protected_method_defined?: (id name, ?boolish inherit) -> bool
|
1369
1369
|
|
1370
1370
|
# <!--
|
1371
1371
|
# rdoc-file=vm_method.c
|
@@ -1398,7 +1398,7 @@ class Module < Object
|
|
1398
1398
|
# String arguments are converted to symbols. An Array of Symbols and/or Strings
|
1399
1399
|
# is also accepted.
|
1400
1400
|
#
|
1401
|
-
def public_class_method: (*
|
1401
|
+
def public_class_method: (*id arg0) -> self
|
1402
1402
|
|
1403
1403
|
# <!--
|
1404
1404
|
# rdoc-file=object.c
|
@@ -1406,7 +1406,7 @@ class Module < Object
|
|
1406
1406
|
# -->
|
1407
1407
|
# Makes a list of existing constants public.
|
1408
1408
|
#
|
1409
|
-
def public_constant: (*
|
1409
|
+
def public_constant: (*id arg0) -> self
|
1410
1410
|
|
1411
1411
|
# <!--
|
1412
1412
|
# rdoc-file=proc.c
|
@@ -1414,7 +1414,7 @@ class Module < Object
|
|
1414
1414
|
# -->
|
1415
1415
|
# Similar to *instance_method*, searches public method only.
|
1416
1416
|
#
|
1417
|
-
def public_instance_method: (
|
1417
|
+
def public_instance_method: (id arg0) -> UnboundMethod
|
1418
1418
|
|
1419
1419
|
# <!--
|
1420
1420
|
# rdoc-file=object.c
|
@@ -1453,7 +1453,7 @@ class Module < Object
|
|
1453
1453
|
# C.public_method_defined? "method2" #=> false
|
1454
1454
|
# C.method_defined? "method2" #=> true
|
1455
1455
|
#
|
1456
|
-
def public_method_defined?: (
|
1456
|
+
def public_method_defined?: (id name, ?boolish inherit) -> bool
|
1457
1457
|
|
1458
1458
|
# <!--
|
1459
1459
|
# rdoc-file=eval.c
|
@@ -1505,7 +1505,7 @@ class Module < Object
|
|
1505
1505
|
# 99
|
1506
1506
|
# nil
|
1507
1507
|
#
|
1508
|
-
def remove_class_variable: (
|
1508
|
+
def remove_class_variable: (id arg0) -> untyped
|
1509
1509
|
|
1510
1510
|
# <!--
|
1511
1511
|
# rdoc-file=object.c
|
@@ -1515,7 +1515,7 @@ class Module < Object
|
|
1515
1515
|
# previous value. If that constant referred to a module, this will not change
|
1516
1516
|
# that module's name and can lead to confusion.
|
1517
1517
|
#
|
1518
|
-
def remove_const: (
|
1518
|
+
def remove_const: (id arg0) -> untyped
|
1519
1519
|
|
1520
1520
|
# <!--
|
1521
1521
|
# rdoc-file=vm_method.c
|
@@ -1525,7 +1525,7 @@ class Module < Object
|
|
1525
1525
|
# Removes the method identified by *symbol* from the current class. For an
|
1526
1526
|
# example, see Module#undef_method. String arguments are converted to symbols.
|
1527
1527
|
#
|
1528
|
-
def remove_method: (*
|
1528
|
+
def remove_method: (*id arg0) -> self
|
1529
1529
|
|
1530
1530
|
# <!--
|
1531
1531
|
# rdoc-file=object.c
|
@@ -1591,7 +1591,7 @@ class Module < Object
|
|
1591
1591
|
# In parent
|
1592
1592
|
# prog.rb:23: undefined method `hello' for #<Child:0x401b3bb4> (NoMethodError)
|
1593
1593
|
#
|
1594
|
-
def undef_method: (*
|
1594
|
+
def undef_method: (*id arg0) -> self
|
1595
1595
|
|
1596
1596
|
# <!--
|
1597
1597
|
# rdoc-file=object.c
|
@@ -1629,5 +1629,7 @@ class Module < Object
|
|
1629
1629
|
# `attr_reader(name)` but deprecated. Returns an array of defined method names
|
1630
1630
|
# as symbols.
|
1631
1631
|
#
|
1632
|
-
def attr: (*
|
1632
|
+
def attr: (*id arg0) -> Array[Symbol]
|
1633
|
+
|
1634
|
+
type id = Symbol | string
|
1633
1635
|
end
|
data/core/object.rbs
CHANGED
@@ -205,7 +205,7 @@ class Object < BasicObject
|
|
205
205
|
# chris.define_singleton_method(:greet) {|greeting| "#{greeting}, I'm Chris!" }
|
206
206
|
# chris.greet("Hi") #=> "Hi, I'm Chris!"
|
207
207
|
#
|
208
|
-
def define_singleton_method: (name, Method | UnboundMethod) -> Symbol
|
208
|
+
def define_singleton_method: (name, Method | UnboundMethod | Proc method) -> Symbol
|
209
209
|
| (name) { (*untyped) -> untyped } -> Symbol
|
210
210
|
|
211
211
|
# <!--
|
@@ -320,7 +320,7 @@ class Object < BasicObject
|
|
320
320
|
# enum.first(4) # => [1, 1, 1, 2]
|
321
321
|
# enum.size # => 42
|
322
322
|
#
|
323
|
-
def enum_for: (Symbol method, *untyped
|
323
|
+
def enum_for: (Symbol method, *untyped, **untyped) ?{ (*untyped, **untyped) -> Integer } -> Enumerator[untyped, untyped]
|
324
324
|
| () ?{ () -> Integer } -> Enumerator[untyped, self]
|
325
325
|
|
326
326
|
# <!--
|
data/core/string_io.rbs
CHANGED
@@ -495,6 +495,15 @@ class StringIO
|
|
495
495
|
#
|
496
496
|
def tell: () -> Integer
|
497
497
|
|
498
|
+
# <!--
|
499
|
+
# rdoc-file=ext/stringio/stringio.c
|
500
|
+
# - strio.truncate(integer) -> 0
|
501
|
+
# -->
|
502
|
+
# Truncates the buffer string to at most *integer* bytes. The stream must be
|
503
|
+
# opened for writing.
|
504
|
+
#
|
505
|
+
def truncate: (Integer) -> 0
|
506
|
+
|
498
507
|
# <!-- rdoc-file=ext/stringio/stringio.c -->
|
499
508
|
# Returns `false`. Just for compatibility to IO.
|
500
509
|
#
|
data/core/thread.rbs
CHANGED
@@ -971,6 +971,30 @@ class Thread < Object
|
|
971
971
|
#
|
972
972
|
def self.handle_interrupt: (untyped hash) -> untyped
|
973
973
|
|
974
|
+
# <!--
|
975
|
+
# rdoc-file=thread.c
|
976
|
+
# - thr.raise
|
977
|
+
# - thr.raise(string)
|
978
|
+
# - thr.raise(exception [, string [, array]])
|
979
|
+
# -->
|
980
|
+
# Raises an exception from the given thread. The caller does not have to be
|
981
|
+
# `thr`. See Kernel#raise for more information.
|
982
|
+
#
|
983
|
+
# Thread.abort_on_exception = true
|
984
|
+
# a = Thread.new { sleep(200) }
|
985
|
+
# a.raise("Gotcha")
|
986
|
+
#
|
987
|
+
# This will produce:
|
988
|
+
#
|
989
|
+
# prog.rb:3: Gotcha (RuntimeError)
|
990
|
+
# from prog.rb:2:in `initialize'
|
991
|
+
# from prog.rb:2:in `new'
|
992
|
+
# from prog.rb:2
|
993
|
+
#
|
994
|
+
def self?.raise: () -> bot
|
995
|
+
| (String message, ?cause: Exception?) -> bot
|
996
|
+
| (_Exception exception, ?untyped message, ?::Array[String] backtrace, ?cause: Exception?) -> bot
|
997
|
+
|
974
998
|
# <!--
|
975
999
|
# rdoc-file=thread.c
|
976
1000
|
# - Thread.kill(thread) -> thread
|
@@ -1414,7 +1438,7 @@ class Thread::ConditionVariable < Object
|
|
1414
1438
|
#
|
1415
1439
|
# Returns the slept result on `mutex`.
|
1416
1440
|
#
|
1417
|
-
def wait: (Thread::Mutex mutex, ?Integer timeout) -> self
|
1441
|
+
def wait: (Thread::Mutex mutex, ?Integer | Float? timeout) -> self
|
1418
1442
|
end
|
1419
1443
|
|
1420
1444
|
# <!-- rdoc-file=thread_sync.c -->
|
data/core/time.rbs
CHANGED
@@ -1093,7 +1093,7 @@ class Time < Object
|
|
1093
1093
|
#
|
1094
1094
|
# Related: Time#ceil, Time#floor.
|
1095
1095
|
#
|
1096
|
-
def round: (?
|
1096
|
+
def round: (?int ndigits) -> Time
|
1097
1097
|
|
1098
1098
|
# <!--
|
1099
1099
|
# rdoc-file=time.c
|
@@ -1503,7 +1503,7 @@ class Time < Object
|
|
1503
1503
|
#
|
1504
1504
|
# Related: Time#ceil, Time#round.
|
1505
1505
|
#
|
1506
|
-
def floor: (?
|
1506
|
+
def floor: (?int ndigits) -> Time
|
1507
1507
|
|
1508
1508
|
# <!--
|
1509
1509
|
# rdoc-file=time.c
|
@@ -1530,7 +1530,7 @@ class Time < Object
|
|
1530
1530
|
#
|
1531
1531
|
# Related: Time#floor, Time#round.
|
1532
1532
|
#
|
1533
|
-
def ceil: (?
|
1533
|
+
def ceil: (?int ndigits) -> Time
|
1534
1534
|
end
|
1535
1535
|
|
1536
1536
|
Time::RFC2822_DAY_NAME: Array[String]
|
data/docs/CONTRIBUTING.md
CHANGED
@@ -69,7 +69,7 @@ We define the standard members order so that ordering doesn't bother reading dif
|
|
69
69
|
5. `public` & public instance methods
|
70
70
|
6. `private` & private instance methods
|
71
71
|
|
72
|
-
```
|
72
|
+
```rbs
|
73
73
|
class HelloWorld[X]
|
74
74
|
def self.new: [A] () { (void) -> A } -> HelloWorld[A] # new or initialize comes first
|
75
75
|
def initialize: () -> void
|
data/docs/rbs_by_example.md
CHANGED
@@ -6,20 +6,20 @@ The purpose of this doc is to teach you how to write RBS signatures by using the
|
|
6
6
|
|
7
7
|
## Examples
|
8
8
|
|
9
|
+
In each example, the first snippet is for *Ruby* and the second one is for *RBS*.
|
10
|
+
|
9
11
|
### Zero argument methods
|
10
12
|
|
11
13
|
**Example:** `String#empty?`
|
12
14
|
|
13
15
|
```ruby
|
14
|
-
# .rb
|
15
16
|
"".empty?
|
16
17
|
# => true
|
17
18
|
"hello".empty?
|
18
19
|
# => false
|
19
20
|
```
|
20
21
|
|
21
|
-
```
|
22
|
-
# .rbs
|
22
|
+
```rbs
|
23
23
|
class String
|
24
24
|
def empty?: () -> bool
|
25
25
|
end
|
@@ -32,14 +32,13 @@ end
|
|
32
32
|
**Example:** `String#include?`
|
33
33
|
|
34
34
|
```ruby
|
35
|
-
# .rb
|
36
35
|
"homeowner".include?("house")
|
37
36
|
# => false
|
38
37
|
"homeowner".include?("meow")
|
39
38
|
# => true
|
40
39
|
```
|
41
40
|
|
42
|
-
```
|
41
|
+
```rbs
|
43
42
|
class String
|
44
43
|
def include?: (String) -> bool
|
45
44
|
end
|
@@ -53,7 +52,6 @@ boolean value
|
|
53
52
|
**Example:** `String#end_with?`
|
54
53
|
|
55
54
|
```ruby
|
56
|
-
# .rb
|
57
55
|
"hello?".end_with?("!")
|
58
56
|
# => false
|
59
57
|
"hello?".end_with?("?")
|
@@ -64,8 +62,7 @@ boolean value
|
|
64
62
|
# => false
|
65
63
|
```
|
66
64
|
|
67
|
-
```
|
68
|
-
# .rbs
|
65
|
+
```rbs
|
69
66
|
class String
|
70
67
|
def end_with?: (*String) -> bool
|
71
68
|
end
|
@@ -79,7 +76,6 @@ returns a boolean value.
|
|
79
76
|
**Example:** `String#ljust`
|
80
77
|
|
81
78
|
```ruby
|
82
|
-
# .rb
|
83
79
|
"hello".ljust(4)
|
84
80
|
#=> "hello"
|
85
81
|
"hello".ljust(20)
|
@@ -88,8 +84,7 @@ returns a boolean value.
|
|
88
84
|
#=> "hello123412341234123"
|
89
85
|
```
|
90
86
|
|
91
|
-
```
|
92
|
-
# .rbs
|
87
|
+
```rbs
|
93
88
|
class String
|
94
89
|
def ljust: (Integer, ?String) -> String
|
95
90
|
end
|
@@ -102,7 +97,6 @@ end
|
|
102
97
|
**Example:** `Array#*`
|
103
98
|
|
104
99
|
```ruby
|
105
|
-
# .rb
|
106
100
|
[1, 2, 3] * ","
|
107
101
|
# => "1,2,3"
|
108
102
|
[1, 2, 3] * 2
|
@@ -112,8 +106,7 @@ end
|
|
112
106
|
*Note:* Some of the signatures after this point include type variables (e.g. `Elem`, `T`).
|
113
107
|
For now, it's safe to ignore them, but they're included for completeness.
|
114
108
|
|
115
|
-
```
|
116
|
-
# .rbs
|
109
|
+
```rbs
|
117
110
|
class Array[Elem]
|
118
111
|
def *: (String) -> String
|
119
112
|
| (Integer) -> Array[Elem]
|
@@ -128,7 +121,6 @@ end
|
|
128
121
|
**Example:** `String#<<`
|
129
122
|
|
130
123
|
```ruby
|
131
|
-
# .rb
|
132
124
|
a = "hello "
|
133
125
|
a << "world"
|
134
126
|
#=> "hello world"
|
@@ -136,8 +128,7 @@ a << 33
|
|
136
128
|
#=> "hello world!"
|
137
129
|
```
|
138
130
|
|
139
|
-
```
|
140
|
-
# .rbs
|
131
|
+
```rbs
|
141
132
|
class String
|
142
133
|
def <<: (String | Integer) -> String
|
143
134
|
end
|
@@ -148,7 +139,6 @@ end
|
|
148
139
|
### Nilable types
|
149
140
|
|
150
141
|
```ruby
|
151
|
-
# .rb
|
152
142
|
[1, 2, 3].first
|
153
143
|
# => 1
|
154
144
|
[].first
|
@@ -159,8 +149,7 @@ end
|
|
159
149
|
# => []
|
160
150
|
```
|
161
151
|
|
162
|
-
```
|
163
|
-
# .rbs
|
152
|
+
```rbs
|
164
153
|
class Enumerable[Elem]
|
165
154
|
def first: () -> Elem?
|
166
155
|
| (Integer) -> Array[Elem]
|
@@ -183,7 +172,6 @@ The `?` syntax is a convenient shorthand for a union with nil. An equivalent uni
|
|
183
172
|
**Example**: `String#lines`
|
184
173
|
|
185
174
|
```ruby
|
186
|
-
# .rb
|
187
175
|
"hello\nworld\n".lines
|
188
176
|
# => ["hello\n", "world\n"]
|
189
177
|
"hello world".lines(' ')
|
@@ -192,8 +180,7 @@ The `?` syntax is a convenient shorthand for a union with nil. An equivalent uni
|
|
192
180
|
# => ["hello", "world"]
|
193
181
|
```
|
194
182
|
|
195
|
-
```
|
196
|
-
# .rbs
|
183
|
+
```rbs
|
197
184
|
class String
|
198
185
|
def lines: (?String, ?chomp: bool) -> Array[String]
|
199
186
|
end
|
@@ -209,12 +196,11 @@ Keyword arguments are declared similar to in ruby, with the keyword immediately
|
|
209
196
|
**Example**: `Time.now`
|
210
197
|
|
211
198
|
```ruby
|
212
|
-
# .rb
|
213
199
|
Time.now
|
214
200
|
# => 2009-06-24 12:39:54 +0900
|
215
201
|
```
|
216
202
|
|
217
|
-
```
|
203
|
+
```rbs
|
218
204
|
class Time
|
219
205
|
def self.now: () -> Time
|
220
206
|
end
|
@@ -228,7 +214,6 @@ end
|
|
228
214
|
**Example**: `Array#filter`
|
229
215
|
|
230
216
|
```ruby
|
231
|
-
# .rb
|
232
217
|
[1,2,3,4,5].filter {|num| num.even? }
|
233
218
|
# => [2, 4]
|
234
219
|
%w[ a b c d e f ].filter {|v| v =~ /[aeiou]/ }
|
@@ -236,8 +221,7 @@ end
|
|
236
221
|
[1,2,3,4,5].filter
|
237
222
|
```
|
238
223
|
|
239
|
-
```
|
240
|
-
# .rbs
|
224
|
+
```rbs
|
241
225
|
class Array[Elem]
|
242
226
|
def filter: () { (Elem) -> boolish } -> ::Array[Elem]
|
243
227
|
| () -> ::Enumerator[Elem, ::Array[Elem]]
|
@@ -260,8 +244,7 @@ h.keys
|
|
260
244
|
# => ["a", "b", "c", "d"]
|
261
245
|
```
|
262
246
|
|
263
|
-
```
|
264
|
-
# .rbs
|
247
|
+
```rbs
|
265
248
|
class Hash[K, V]
|
266
249
|
def keys: () -> Array[K]
|
267
250
|
end
|
@@ -273,7 +256,6 @@ Generic types in RBS are parameterized at declaration time. These type variables
|
|
273
256
|
|
274
257
|
|
275
258
|
```ruby
|
276
|
-
# .rb
|
277
259
|
a = [ "a", "b", "c", "d" ]
|
278
260
|
a.collect {|x| x + "!"}
|
279
261
|
# => ["a!", "b!", "c!", "d!"]
|
@@ -281,8 +263,7 @@ a.collect.with_index {|x, i| x * i}
|
|
281
263
|
# => ["", "b", "cc", "ddd"]
|
282
264
|
```
|
283
265
|
|
284
|
-
```
|
285
|
-
# .rbs
|
266
|
+
```rbs
|
286
267
|
class Array[Elem]
|
287
268
|
def collect: [U] () { (Elem) -> U } -> Array[U]
|
288
269
|
| () -> Enumerator[Elem, Array[untyped]]
|
@@ -302,7 +283,7 @@ In this example, the method receives its signature from the inferred return type
|
|
302
283
|
# => [[2, 4, 6], [1, 3, 5]]
|
303
284
|
```
|
304
285
|
|
305
|
-
```
|
286
|
+
```rbs
|
306
287
|
class Enumerable[Elem]
|
307
288
|
def partition: () { (Elem) -> boolish } -> [Array[Elem], Array[Elem]]
|
308
289
|
| () -> ::Enumerator[Elem, [Array[Elem], Array[Elem] ]]
|
@@ -318,7 +299,7 @@ Tuples can be of any size, and they can have mixed types.
|
|
318
299
|
# => {1=>1, 2=>4, 3=>9, 4=>16, 5=>25}
|
319
300
|
```
|
320
301
|
|
321
|
-
```
|
302
|
+
```rbs
|
322
303
|
class Enumerable[Elem]
|
323
304
|
def to_h: () -> ::Hash[untyped, untyped]
|
324
305
|
| [T, U] () { (Elem) -> [T, U] } -> ::Hash[T, U]
|
data/docs/repo.md
CHANGED
data/docs/sigs.md
CHANGED
@@ -18,7 +18,7 @@ See [syntax guide](syntax.md).
|
|
18
18
|
When you finish writing signature, you may want to test the signature.
|
19
19
|
rbs provides a feature to test your signature.
|
20
20
|
|
21
|
-
```
|
21
|
+
```console
|
22
22
|
$ RBS_TEST_TARGET='Foo::*' bundle exec ruby -r rbs/test/setup test/foo_test.rb
|
23
23
|
```
|
24
24
|
|
@@ -74,7 +74,7 @@ The `rbs` test framework tries to the best error message for overloaded methods
|
|
74
74
|
|
75
75
|
The error is reported when a method is defined multiple times, as RBS does not allow duplicate method definitions. When you need to overload a method, use the `...` syntax:
|
76
76
|
|
77
|
-
```
|
77
|
+
```rbs
|
78
78
|
# First definition
|
79
79
|
class C
|
80
80
|
def foo: () -> untyped
|
@@ -99,14 +99,14 @@ The design of the signature testing aims to be non-intrusive. The setup is done
|
|
99
99
|
You need to require `rbs/test/setup` for signature testing.
|
100
100
|
You can do it using `-r` option through command line argument or the `RUBYOPT` environment variable.
|
101
101
|
|
102
|
-
```
|
102
|
+
```console
|
103
103
|
$ ruby -r rbs/test/setup run_tests.rb
|
104
104
|
$ RUBYOPT='-rrbs/test/setup' rake test
|
105
105
|
```
|
106
106
|
|
107
107
|
When you are using Bundler, you may need to require `bundler/setup` explicitly.
|
108
108
|
|
109
|
-
```
|
109
|
+
```console
|
110
110
|
$ RUBYOPT='-rbundler/setup -rrbs/test/setup' bundle exec rake test
|
111
111
|
```
|
112
112
|
|
@@ -130,7 +130,7 @@ You need to specify `RBS_TEST_TARGET` to run the test, and you can customize the
|
|
130
130
|
You may need to specify `-r` or `-I` to load signatures.
|
131
131
|
The default is `-I sig`.
|
132
132
|
|
133
|
-
```
|
133
|
+
```shell
|
134
134
|
RBS_TEST_OPT='-r pathname -I sig'
|
135
135
|
```
|
136
136
|
|
@@ -144,7 +144,7 @@ You can see the backtrace how the type error is caused and debug your program or
|
|
144
144
|
|
145
145
|
So, a typical command line to start the test would look like the following:
|
146
146
|
|
147
|
-
```
|
147
|
+
```console
|
148
148
|
$ RBS_TEST_LOGLEVEL=error \
|
149
149
|
RBS_TEST_TARGET='Kaigi::*' \
|
150
150
|
RBS_TEST_SKIP='Kaigi::MonkeyPatch' \
|
@@ -160,7 +160,7 @@ $ RBS_TEST_LOGLEVEL=error \
|
|
160
160
|
|
161
161
|
You can skip installing the instrumentation per-method basis using `rbs:test:skip` annotation.
|
162
162
|
|
163
|
-
```
|
163
|
+
```rbs
|
164
164
|
class String
|
165
165
|
%a{rbs:test:skip} def =~: (Regexp) -> Integer?
|
166
166
|
end
|
data/docs/stdlib.md
CHANGED
@@ -10,7 +10,7 @@ We support writing tests for core/stdlib signatures.
|
|
10
10
|
|
11
11
|
First, execute `generate:stdlib_test` rake task with a class name that you want to test.
|
12
12
|
|
13
|
-
```
|
13
|
+
```console
|
14
14
|
$ bundle exec rake 'generate:stdlib_test[String]'
|
15
15
|
Created: test/stdlib/String_test.rb
|
16
16
|
```
|
@@ -47,7 +47,6 @@ end
|
|
47
47
|
class StringTest < Test::Unit::TestCase
|
48
48
|
include TypeAssertions
|
49
49
|
|
50
|
-
# library "pathname", "set", "securerandom" # Declare library signatures to load
|
51
50
|
testing "::String"
|
52
51
|
|
53
52
|
def test_gsub
|
@@ -83,7 +82,7 @@ If the execution of the program escape from the class definition, the instrument
|
|
83
82
|
|
84
83
|
You can run the test with:
|
85
84
|
|
86
|
-
```
|
85
|
+
```console
|
87
86
|
$ bundle exec rake stdlib_test # Run all tests
|
88
87
|
$ bundle exec ruby test/stdlib/String_test.rb # Run specific tests
|
89
88
|
```
|