rbs 3.3.2 → 3.4.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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -5
  3. data/.github/workflows/ruby.yml +7 -8
  4. data/.github/workflows/typecheck.yml +37 -0
  5. data/CHANGELOG.md +65 -0
  6. data/Gemfile +1 -1
  7. data/Gemfile.lock +11 -11
  8. data/README.md +1 -0
  9. data/Rakefile +2 -2
  10. data/Steepfile +2 -2
  11. data/core/array.rbs +19 -49
  12. data/core/basic_object.rbs +2 -2
  13. data/core/comparable.rbs +17 -8
  14. data/core/complex.rbs +82 -43
  15. data/core/data.rbs +2 -4
  16. data/core/dir.rbs +635 -295
  17. data/core/enumerable.rbs +11 -18
  18. data/core/enumerator.rbs +37 -31
  19. data/core/errors.rbs +4 -0
  20. data/core/false_class.rbs +34 -15
  21. data/core/fiber.rbs +23 -0
  22. data/core/file.rbs +329 -120
  23. data/core/float.rbs +17 -32
  24. data/core/gc.rbs +17 -11
  25. data/core/hash.rbs +22 -44
  26. data/core/integer.rbs +82 -113
  27. data/core/io/buffer.rbs +90 -47
  28. data/core/io.rbs +54 -121
  29. data/core/kernel.rbs +442 -489
  30. data/core/match_data.rbs +55 -56
  31. data/core/module.rbs +45 -1
  32. data/core/nil_class.rbs +98 -35
  33. data/core/numeric.rbs +22 -32
  34. data/core/object_space/weak_key_map.rbs +102 -0
  35. data/core/process.rbs +1242 -655
  36. data/core/ractor.rbs +139 -120
  37. data/core/range.rbs +100 -4
  38. data/core/rational.rbs +0 -4
  39. data/core/rbs/unnamed/argf.rbs +16 -8
  40. data/core/rbs/unnamed/env_class.rbs +0 -24
  41. data/core/refinement.rbs +8 -0
  42. data/core/regexp.rbs +1149 -598
  43. data/core/ruby_vm.rbs +126 -12
  44. data/core/rubygems/platform.rbs +9 -0
  45. data/core/rubygems/rubygems.rbs +1 -1
  46. data/core/rubygems/version.rbs +5 -1
  47. data/core/set.rbs +20 -22
  48. data/core/signal.rbs +4 -4
  49. data/core/string.rbs +283 -230
  50. data/core/string_io.rbs +2 -14
  51. data/core/struct.rbs +404 -24
  52. data/core/symbol.rbs +1 -19
  53. data/core/thread.rbs +29 -12
  54. data/core/time.rbs +227 -104
  55. data/core/trace_point.rbs +2 -5
  56. data/core/true_class.rbs +54 -21
  57. data/core/warning.rbs +14 -11
  58. data/docs/data_and_struct.md +29 -0
  59. data/docs/gem.md +58 -0
  60. data/docs/syntax.md +3 -5
  61. data/docs/tools.md +1 -0
  62. data/ext/rbs_extension/lexer.c +643 -559
  63. data/ext/rbs_extension/lexer.re +5 -1
  64. data/ext/rbs_extension/parser.c +12 -3
  65. data/ext/rbs_extension/unescape.c +7 -47
  66. data/lib/rbs/cli/diff.rb +4 -1
  67. data/lib/rbs/cli/validate.rb +280 -0
  68. data/lib/rbs/cli.rb +2 -194
  69. data/lib/rbs/collection/config.rb +5 -6
  70. data/lib/rbs/collection/sources/git.rb +1 -1
  71. data/lib/rbs/collection.rb +1 -0
  72. data/lib/rbs/diff.rb +7 -4
  73. data/lib/rbs/errors.rb +11 -0
  74. data/lib/rbs/test/errors.rb +10 -2
  75. data/lib/rbs/test/guaranteed.rb +2 -3
  76. data/lib/rbs/test/type_check.rb +15 -10
  77. data/lib/rbs/test.rb +3 -3
  78. data/lib/rbs/types.rb +29 -0
  79. data/lib/rbs/unit_test/convertibles.rb +176 -0
  80. data/lib/rbs/unit_test/spy.rb +136 -0
  81. data/lib/rbs/unit_test/type_assertions.rb +341 -0
  82. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  83. data/lib/rbs/unit_test.rb +6 -0
  84. data/lib/rbs/version.rb +1 -1
  85. data/sig/cli/validate.rbs +43 -0
  86. data/sig/diff.rbs +3 -1
  87. data/sig/errors.rbs +8 -0
  88. data/sig/rbs.rbs +1 -1
  89. data/sig/test/errors.rbs +52 -0
  90. data/sig/test/guranteed.rbs +9 -0
  91. data/sig/test/type_check.rbs +19 -0
  92. data/sig/test.rbs +82 -0
  93. data/sig/types.rbs +6 -1
  94. data/sig/unit_test/convertibles.rbs +154 -0
  95. data/sig/unit_test/spy.rbs +28 -0
  96. data/sig/unit_test/type_assertions.rbs +194 -0
  97. data/sig/unit_test/with_aliases.rbs +136 -0
  98. data/stdlib/base64/0/base64.rbs +307 -45
  99. data/stdlib/bigdecimal/0/big_decimal.rbs +35 -15
  100. data/stdlib/coverage/0/coverage.rbs +2 -2
  101. data/stdlib/csv/0/csv.rbs +25 -55
  102. data/stdlib/date/0/date.rbs +1 -43
  103. data/stdlib/date/0/date_time.rbs +1 -13
  104. data/stdlib/delegate/0/delegator.rbs +186 -0
  105. data/stdlib/delegate/0/kernel.rbs +47 -0
  106. data/stdlib/delegate/0/simple_delegator.rbs +98 -0
  107. data/stdlib/did_you_mean/0/did_you_mean.rbs +1 -1
  108. data/stdlib/erb/0/erb.rbs +2 -2
  109. data/stdlib/fileutils/0/fileutils.rbs +0 -19
  110. data/stdlib/io-console/0/io-console.rbs +12 -1
  111. data/stdlib/ipaddr/0/ipaddr.rbs +2 -1
  112. data/stdlib/json/0/json.rbs +320 -81
  113. data/stdlib/logger/0/logger.rbs +9 -5
  114. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +6 -6
  115. data/stdlib/monitor/0/monitor.rbs +78 -0
  116. data/stdlib/net-http/0/net-http.rbs +1880 -543
  117. data/stdlib/objspace/0/objspace.rbs +19 -13
  118. data/stdlib/openssl/0/openssl.rbs +508 -127
  119. data/stdlib/optparse/0/optparse.rbs +25 -11
  120. data/stdlib/pathname/0/pathname.rbs +1 -1
  121. data/stdlib/pp/0/pp.rbs +2 -5
  122. data/stdlib/prettyprint/0/prettyprint.rbs +2 -2
  123. data/stdlib/pstore/0/pstore.rbs +2 -4
  124. data/stdlib/rdoc/0/comment.rbs +1 -2
  125. data/stdlib/resolv/0/resolv.rbs +4 -2
  126. data/stdlib/socket/0/socket.rbs +2 -2
  127. data/stdlib/socket/0/unix_socket.rbs +2 -2
  128. data/stdlib/strscan/0/string_scanner.rbs +3 -2
  129. data/stdlib/tempfile/0/tempfile.rbs +1 -1
  130. data/stdlib/uri/0/common.rbs +245 -123
  131. metadata +24 -4
  132. data/lib/rbs/test/spy.rb +0 -6
data/core/string_io.rbs CHANGED
@@ -131,8 +131,6 @@ class StringIO
131
131
  # Calls the block with each remaining line read from the stream; does nothing if
132
132
  # already at end-of-file; returns `self`. See [Line IO](rdoc-ref:IO@Line+IO).
133
133
  #
134
- # StringIO#each is an alias for StringIO#each_line.
135
- #
136
134
  def each: (?String sep, ?Integer limit, ?chomp: boolish) { (String) -> untyped } -> self
137
135
  | (?String sep, ?Integer limit, ?chomp: boolish) -> ::Enumerator[String, self]
138
136
 
@@ -177,12 +175,10 @@ class StringIO
177
175
  # - eof? -> true or false
178
176
  # -->
179
177
  # Returns `true` if positioned at end-of-stream, `false` otherwise; see
180
- # [Position](rdoc-ref:File@Position).
178
+ # [Position](rdoc-ref:IO@Position).
181
179
  #
182
180
  # Raises IOError if the stream is not opened for reading.
183
181
  #
184
- # StreamIO#eof is an alias for StreamIO#eof?.
185
- #
186
182
  def eof: () -> bool
187
183
 
188
184
  # <!--
@@ -304,8 +300,6 @@ class StringIO
304
300
  # -->
305
301
  # Returns the current position (in bytes); see [Position](rdoc-ref:IO@Position).
306
302
  #
307
- # StringIO#tell is an alias for StringIO#pos.
308
- #
309
303
  def pos: () -> Integer
310
304
 
311
305
  # <!--
@@ -491,8 +485,6 @@ class StringIO
491
485
  # -->
492
486
  # Returns the current position (in bytes); see [Position](rdoc-ref:IO@Position).
493
487
  #
494
- # StringIO#tell is an alias for StringIO#pos.
495
- #
496
488
  def tell: () -> Integer
497
489
 
498
490
  # <!--
@@ -557,19 +549,15 @@ class StringIO
557
549
  # Calls the block with each remaining line read from the stream; does nothing if
558
550
  # already at end-of-file; returns `self`. See [Line IO](rdoc-ref:IO@Line+IO).
559
551
  #
560
- # StringIO#each is an alias for StringIO#each_line.
561
- #
562
552
  def each_line: (?String sep, ?Integer limit, ?chomp: boolish) { (String) -> untyped } -> self
563
553
  | (?String sep, ?Integer limit, ?chomp: boolish) -> ::Enumerator[String, self]
564
554
 
565
555
  # <!-- rdoc-file=ext/stringio/stringio.c -->
566
556
  # Returns `true` if positioned at end-of-stream, `false` otherwise; see
567
- # [Position](rdoc-ref:File@Position).
557
+ # [Position](rdoc-ref:IO@Position).
568
558
  #
569
559
  # Raises IOError if the stream is not opened for reading.
570
560
  #
571
- # StreamIO#eof is an alias for StreamIO#eof?.
572
- #
573
561
  def eof?: () -> bool
574
562
 
575
563
  # This is a deprecated alias for #each_line.
data/core/struct.rbs CHANGED
@@ -112,15 +112,18 @@
112
112
  # * #inspect, #to_s: Returns a string representation of `self`.
113
113
  # * #to_h: Returns a hash of the member name/value pairs in `self`.
114
114
  #
115
- class Struct[Elem] < Object
116
- include Enumerable[Elem?]
115
+ class Struct[Elem]
116
+ include Enumerable[Elem]
117
117
 
118
- type attribute_name = interned
118
+ # The types that can be used when "indexing" into a `Struct` via `[]`, `[]=`, `dig`, and
119
+ # `deconstruct_keys`.
120
+ #
121
+ type index = String | Symbol | int
119
122
 
120
123
  # <!--
121
124
  # rdoc-file=struct.c
122
- # - Struct.new(*member_names, keyword_init: false){|Struct_subclass| ... } -> Struct_subclass
123
- # - Struct.new(class_name, *member_names, keyword_init: false){|Struct_subclass| ... } -> Struct_subclass
125
+ # - Struct.new(*member_names, keyword_init: nil){|Struct_subclass| ... } -> Struct_subclass
126
+ # - Struct.new(class_name, *member_names, keyword_init: nil){|Struct_subclass| ... } -> Struct_subclass
124
127
  # - Struct_subclass.new(*member_names) -> Struct_subclass_instance
125
128
  # - Struct_subclass.new(**member_names) -> Struct_subclass_instance
126
129
  # -->
@@ -203,8 +206,6 @@ class Struct[Elem] < Object
203
206
  # Foo.new(foo: 0, bar: 1, baz: 2)
204
207
  # # Raises ArgumentError: unknown keywords: baz
205
208
  #
206
- # Method `::[]` is an alias for method `::new`.
207
- #
208
209
  # * Method `:inspect` returns a string representation of the subclass:
209
210
  #
210
211
  # Foo.inspect
@@ -243,7 +244,192 @@ class Struct[Elem] < Object
243
244
  # Any.new(1, 2)
244
245
  # # => #<struct Any foo=1, bar=2>
245
246
  #
246
- def initialize: (attribute_name, *attribute_name, ?keyword_init: boolish) ?{ () -> void } -> void
247
+ def self.new: (string? classname, *interned fields, ?keyword_init: boolish?) ?{ (singleton(Struct)) [self: singleton(Struct)] -> void } -> untyped
248
+ | (Symbol field1, *interned fields, ?keyword_init: boolish?) ?{ (singleton(Struct)) [self: singleton(Struct)] -> void } -> untyped
249
+
250
+ # <!--
251
+ # rdoc-file=struct.c
252
+ # - StructClass::members -> array_of_symbols
253
+ # -->
254
+ # Returns the member names of the Struct descendant as an array:
255
+ #
256
+ # Customer = Struct.new(:name, :address, :zip)
257
+ # Customer.members # => [:name, :address, :zip]
258
+ #
259
+ def self.members: () -> Array[Symbol]
260
+
261
+ # <!--
262
+ # rdoc-file=struct.c
263
+ # - StructClass::keyword_init? -> true or falsy value
264
+ # -->
265
+ # Returns `true` if the class was initialized with `keyword_init: true`.
266
+ # Otherwise returns `nil` or `false`.
267
+ #
268
+ # Examples:
269
+ # Foo = Struct.new(:a)
270
+ # Foo.keyword_init? # => nil
271
+ # Bar = Struct.new(:a, keyword_init: true)
272
+ # Bar.keyword_init? # => true
273
+ # Baz = Struct.new(:a, keyword_init: false)
274
+ # Baz.keyword_init? # => false
275
+ #
276
+ def self.keyword_init?: () -> bool?
277
+
278
+ # <!--
279
+ # rdoc-file=struct.c
280
+ # - self == other -> true or false
281
+ # -->
282
+ # Returns `true` if and only if the following are true; otherwise returns
283
+ # `false`:
284
+ #
285
+ # * `other.class == self.class`.
286
+ # * For each member name `name`, `other.name == self.name`.
287
+ #
288
+ #
289
+ # Examples:
290
+ #
291
+ # Customer = Struct.new(:name, :address, :zip)
292
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
293
+ # joe_jr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
294
+ # joe_jr == joe # => true
295
+ # joe_jr[:name] = 'Joe Smith, Jr.'
296
+ # # => "Joe Smith, Jr."
297
+ # joe_jr == joe # => false
298
+ #
299
+ def ==: (untyped other) -> bool
300
+
301
+ # <!--
302
+ # rdoc-file=struct.c
303
+ # - eql?(other) -> true or false
304
+ # -->
305
+ # Returns `true` if and only if the following are true; otherwise returns
306
+ # `false`:
307
+ #
308
+ # * `other.class == self.class`.
309
+ # * For each member name `name`, `other.name.eql?(self.name)`.
310
+ #
311
+ # Customer = Struct.new(:name, :address, :zip)
312
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
313
+ # joe_jr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
314
+ # joe_jr.eql?(joe) # => true
315
+ # joe_jr[:name] = 'Joe Smith, Jr.'
316
+ # joe_jr.eql?(joe) # => false
317
+ #
318
+ #
319
+ # Related: Object#==.
320
+ #
321
+ def eql?: (untyped other) -> bool
322
+
323
+ # <!--
324
+ # rdoc-file=struct.c
325
+ # - hash -> integer
326
+ # -->
327
+ # Returns the integer hash value for `self`.
328
+ #
329
+ # Two structs of the same class and with the same content will have the same
330
+ # hash code (and will compare using Struct#eql?):
331
+ #
332
+ # Customer = Struct.new(:name, :address, :zip)
333
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
334
+ # joe_jr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
335
+ # joe.hash == joe_jr.hash # => true
336
+ # joe_jr[:name] = 'Joe Smith, Jr.'
337
+ # joe.hash == joe_jr.hash # => false
338
+ #
339
+ # Related: Object#hash.
340
+ #
341
+ def hash: () -> Integer
342
+
343
+ # <!--
344
+ # rdoc-file=struct.c
345
+ # - inspect -> string
346
+ # -->
347
+ # Returns a string representation of `self`:
348
+ #
349
+ # Customer = Struct.new(:name, :address, :zip) # => Customer
350
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
351
+ # joe.inspect # => "#<struct Customer name=\"Joe Smith\", address=\"123 Maple, Anytown NC\", zip=12345>"
352
+ #
353
+ def inspect: () -> String
354
+
355
+ # <!-- rdoc-file=struct.c -->
356
+ # Returns a string representation of `self`:
357
+ #
358
+ # Customer = Struct.new(:name, :address, :zip) # => Customer
359
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
360
+ # joe.inspect # => "#<struct Customer name=\"Joe Smith\", address=\"123 Maple, Anytown NC\", zip=12345>"
361
+ #
362
+ alias to_s inspect
363
+
364
+ # <!--
365
+ # rdoc-file=struct.c
366
+ # - to_a -> array
367
+ # -->
368
+ # Returns the values in `self` as an array:
369
+ #
370
+ # Customer = Struct.new(:name, :address, :zip)
371
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
372
+ # joe.to_a # => ["Joe Smith", "123 Maple, Anytown NC", 12345]
373
+ #
374
+ # Related: #members.
375
+ #
376
+ def to_a: () -> Array[Elem]
377
+
378
+ # <!--
379
+ # rdoc-file=struct.c
380
+ # - to_h -> hash
381
+ # - to_h {|name, value| ... } -> hash
382
+ # -->
383
+ # Returns a hash containing the name and value for each member:
384
+ #
385
+ # Customer = Struct.new(:name, :address, :zip)
386
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
387
+ # h = joe.to_h
388
+ # h # => {:name=>"Joe Smith", :address=>"123 Maple, Anytown NC", :zip=>12345}
389
+ #
390
+ # If a block is given, it is called with each name/value pair; the block should
391
+ # return a 2-element array whose elements will become a key/value pair in the
392
+ # returned hash:
393
+ #
394
+ # h = joe.to_h{|name, value| [name.upcase, value.to_s.upcase]}
395
+ # h # => {:NAME=>"JOE SMITH", :ADDRESS=>"123 MAPLE, ANYTOWN NC", :ZIP=>"12345"}
396
+ #
397
+ # Raises ArgumentError if the block returns an inappropriate value.
398
+ #
399
+ def to_h: () -> Hash[Symbol, Elem]
400
+ | [K, V] () { (Symbol key, Elem value) -> [K, V] } -> Hash[K, V]
401
+
402
+ # <!-- rdoc-file=struct.c -->
403
+ # Returns the values in `self` as an array:
404
+ #
405
+ # Customer = Struct.new(:name, :address, :zip)
406
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
407
+ # joe.to_a # => ["Joe Smith", "123 Maple, Anytown NC", 12345]
408
+ #
409
+ # Related: #members.
410
+ #
411
+ alias values to_a
412
+
413
+ # <!--
414
+ # rdoc-file=struct.c
415
+ # - size -> integer
416
+ # -->
417
+ # Returns the number of members.
418
+ #
419
+ # Customer = Struct.new(:name, :address, :zip)
420
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
421
+ # joe.size #=> 3
422
+ #
423
+ def size: () -> Integer
424
+
425
+ # <!-- rdoc-file=struct.c -->
426
+ # Returns the number of members.
427
+ #
428
+ # Customer = Struct.new(:name, :address, :zip)
429
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
430
+ # joe.size #=> 3
431
+ #
432
+ alias length size
247
433
 
248
434
  # <!--
249
435
  # rdoc-file=struct.c
@@ -266,34 +452,228 @@ class Struct[Elem] < Object
266
452
  #
267
453
  # Related: #each_pair.
268
454
  #
269
- def each: () -> ::Enumerator[Elem?, self]
270
- | () { (Elem? item) -> void } -> self
455
+ def each: () -> Enumerator[Elem, self]
456
+ | () { (Elem value) -> void } -> self
271
457
 
272
458
  # <!--
273
459
  # rdoc-file=struct.c
274
- # - StructClass::members -> array_of_symbols
460
+ # - each_pair {|(name, value)| ... } -> self
461
+ # - each_pair -> enumerator
275
462
  # -->
276
- # Returns the member names of the Struct descendant as an array:
463
+ # Calls the given block with each member name/value pair; returns `self`:
464
+ #
465
+ # Customer = Struct.new(:name, :address, :zip) # => Customer
466
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
467
+ # joe.each_pair {|(name, value)| p "#{name} => #{value}" }
468
+ #
469
+ # Output:
470
+ #
471
+ # "name => Joe Smith"
472
+ # "address => 123 Maple, Anytown NC"
473
+ # "zip => 12345"
474
+ #
475
+ # Returns an Enumerator if no block is given.
476
+ #
477
+ # Related: #each.
478
+ #
479
+ def each_pair: () -> Enumerator[[Symbol, Elem], self]
480
+ | () { ([Symbol, Elem] key_value) -> void } -> self
481
+
482
+ # <!--
483
+ # rdoc-file=struct.c
484
+ # - struct[name] -> object
485
+ # - struct[n] -> object
486
+ # -->
487
+ # Returns a value from `self`.
488
+ #
489
+ # With symbol or string argument `name` given, returns the value for the named
490
+ # member:
277
491
  #
278
492
  # Customer = Struct.new(:name, :address, :zip)
279
- # Customer.members # => [:name, :address, :zip]
493
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
494
+ # joe[:zip] # => 12345
495
+ #
496
+ # Raises NameError if `name` is not the name of a member.
497
+ #
498
+ # With integer argument `n` given, returns `self.values[n]` if `n` is in range;
499
+ # see Array@Array+Indexes:
500
+ #
501
+ # joe[2] # => 12345
502
+ # joe[-2] # => "123 Maple, Anytown NC"
503
+ #
504
+ # Raises IndexError if `n` is out of range.
280
505
  #
281
- def self.members: () -> ::Array[Symbol]
506
+ def []: (index name_or_position) -> Elem
282
507
 
283
508
  # <!--
284
509
  # rdoc-file=struct.c
285
- # - StructClass::keyword_init? -> true or falsy value
510
+ # - struct[name] = value -> value
511
+ # - struct[n] = value -> value
286
512
  # -->
287
- # Returns `true` if the class was initialized with `keyword_init: true`.
288
- # Otherwise returns `nil` or `false`.
513
+ # Assigns a value to a member.
514
+ #
515
+ # With symbol or string argument `name` given, assigns the given `value` to the
516
+ # named member; returns `value`:
517
+ #
518
+ # Customer = Struct.new(:name, :address, :zip)
519
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
520
+ # joe[:zip] = 54321 # => 54321
521
+ # joe # => #<struct Customer name="Joe Smith", address="123 Maple, Anytown NC", zip=54321>
522
+ #
523
+ # Raises NameError if `name` is not the name of a member.
524
+ #
525
+ # With integer argument `n` given, assigns the given `value` to the `n`-th
526
+ # member if `n` is in range; see Array@Array+Indexes:
527
+ #
528
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
529
+ # joe[2] = 54321 # => 54321
530
+ # joe[-3] = 'Joseph Smith' # => "Joseph Smith"
531
+ # joe # => #<struct Customer name="Joseph Smith", address="123 Maple, Anytown NC", zip=54321>
532
+ #
533
+ # Raises IndexError if `n` is out of range.
534
+ #
535
+ def []=: (index name_or_position, Elem value) -> Elem
536
+
537
+ # <!--
538
+ # rdoc-file=struct.c
539
+ # - select {|value| ... } -> array
540
+ # - select -> enumerator
541
+ # -->
542
+ # With a block given, returns an array of values from `self` for which the block
543
+ # returns a truthy value:
544
+ #
545
+ # Customer = Struct.new(:name, :address, :zip)
546
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
547
+ # a = joe.select {|value| value.is_a?(String) }
548
+ # a # => ["Joe Smith", "123 Maple, Anytown NC"]
549
+ # a = joe.select {|value| value.is_a?(Integer) }
550
+ # a # => [12345]
551
+ #
552
+ # With no block given, returns an Enumerator.
553
+ #
554
+ def select: () -> Enumerator[Elem, Array[Elem]]
555
+ | () { (Elem value) -> boolish } -> Array[Elem]
556
+
557
+ # <!-- rdoc-file=struct.c -->
558
+ # With a block given, returns an array of values from `self` for which the block
559
+ # returns a truthy value:
560
+ #
561
+ # Customer = Struct.new(:name, :address, :zip)
562
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
563
+ # a = joe.select {|value| value.is_a?(String) }
564
+ # a # => ["Joe Smith", "123 Maple, Anytown NC"]
565
+ # a = joe.select {|value| value.is_a?(Integer) }
566
+ # a # => [12345]
567
+ #
568
+ # With no block given, returns an Enumerator.
569
+ #
570
+ alias filter select
571
+
572
+ # <!--
573
+ # rdoc-file=struct.c
574
+ # - values_at(*integers) -> array
575
+ # - values_at(integer_range) -> array
576
+ # -->
577
+ # Returns an array of values from `self`.
578
+ #
579
+ # With integer arguments `integers` given, returns an array containing each
580
+ # value given by one of `integers`:
581
+ #
582
+ # Customer = Struct.new(:name, :address, :zip)
583
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
584
+ # joe.values_at(0, 2) # => ["Joe Smith", 12345]
585
+ # joe.values_at(2, 0) # => [12345, "Joe Smith"]
586
+ # joe.values_at(2, 1, 0) # => [12345, "123 Maple, Anytown NC", "Joe Smith"]
587
+ # joe.values_at(0, -3) # => ["Joe Smith", "Joe Smith"]
588
+ #
589
+ # Raises IndexError if any of `integers` is out of range; see
590
+ # Array@Array+Indexes.
591
+ #
592
+ # With integer range argument `integer_range` given, returns an array containing
593
+ # each value given by the elements of the range; fills with `nil` values for
594
+ # range elements larger than the structure:
595
+ #
596
+ # joe.values_at(0..2)
597
+ # # => ["Joe Smith", "123 Maple, Anytown NC", 12345]
598
+ # joe.values_at(-3..-1)
599
+ # # => ["Joe Smith", "123 Maple, Anytown NC", 12345]
600
+ # joe.values_at(1..4) # => ["123 Maple, Anytown NC", 12345, nil, nil]
601
+ #
602
+ # Raises RangeError if any element of the range is negative and out of range;
603
+ # see Array@Array+Indexes.
604
+ #
605
+ def values_at: (*int | range[int?] positions) -> Array[Elem]
606
+
607
+ # <!--
608
+ # rdoc-file=struct.c
609
+ # - members -> array_of_symbols
610
+ # -->
611
+ # Returns the member names from `self` as an array:
612
+ #
613
+ # Customer = Struct.new(:name, :address, :zip)
614
+ # Customer.new.members # => [:name, :address, :zip]
615
+ #
616
+ # Related: #to_a.
617
+ #
618
+ def members: () -> Array[Symbol]
619
+
620
+ # <!--
621
+ # rdoc-file=struct.c
622
+ # - dig(name, *identifiers) -> object
623
+ # - dig(n, *identifiers) -> object
624
+ # -->
625
+ # Finds and returns an object among nested objects. The nested objects may be
626
+ # instances of various classes. See [Dig Methods](rdoc-ref:dig_methods.rdoc).
627
+ #
628
+ # Given symbol or string argument `name`, returns the object that is specified
629
+ # by `name` and `identifiers`:
289
630
  #
290
- # Examples:
291
631
  # Foo = Struct.new(:a)
292
- # Foo.keyword_init? # => nil
293
- # Bar = Struct.new(:a, keyword_init: true)
294
- # Bar.keyword_init? # => true
295
- # Baz = Struct.new(:a, keyword_init: false)
296
- # Baz.keyword_init? # => false
632
+ # f = Foo.new(Foo.new({b: [1, 2, 3]}))
633
+ # f.dig(:a) # => #<struct Foo a={:b=>[1, 2, 3]}>
634
+ # f.dig(:a, :a) # => {:b=>[1, 2, 3]}
635
+ # f.dig(:a, :a, :b) # => [1, 2, 3]
636
+ # f.dig(:a, :a, :b, 0) # => 1
637
+ # f.dig(:b, 0) # => nil
638
+ #
639
+ # Given integer argument `n`, returns the object that is specified by `n` and
640
+ # `identifiers`:
641
+ #
642
+ # f.dig(0) # => #<struct Foo a={:b=>[1, 2, 3]}>
643
+ # f.dig(0, 0) # => {:b=>[1, 2, 3]}
644
+ # f.dig(0, 0, :b) # => [1, 2, 3]
645
+ # f.dig(0, 0, :b, 0) # => 1
646
+ # f.dig(:b, 0) # => nil
647
+ #
648
+ def dig: (index name_or_position) -> Elem
649
+ | (index name_or_position, untyped, *untyped) -> untyped
650
+
651
+ # <!-- rdoc-file=struct.c -->
652
+ # Returns the values in `self` as an array:
653
+ #
654
+ # Customer = Struct.new(:name, :address, :zip)
655
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
656
+ # joe.to_a # => ["Joe Smith", "123 Maple, Anytown NC", 12345]
657
+ #
658
+ # Related: #members.
659
+ #
660
+ alias deconstruct to_a
661
+
662
+ # <!--
663
+ # rdoc-file=struct.c
664
+ # - deconstruct_keys(array_of_names) -> hash
665
+ # -->
666
+ # Returns a hash of the name/value pairs for the given member names.
667
+ #
668
+ # Customer = Struct.new(:name, :address, :zip)
669
+ # joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
670
+ # h = joe.deconstruct_keys([:zip, :address])
671
+ # h # => {:zip=>12345, :address=>"123 Maple, Anytown NC"}
672
+ #
673
+ # Returns all names and values if `array_of_names` is `nil`:
674
+ #
675
+ # h = joe.deconstruct_keys(nil)
676
+ # h # => {:name=>"Joseph Smith, Jr.", :address=>"123 Maple, Anytown NC", :zip=>12345}
297
677
  #
298
- def self.keyword_init?: () -> (true | false | nil)
678
+ def deconstruct_keys: (Array[index & Hash::_Key]? indices) -> Hash[index & Hash::_Key, Elem]
299
679
  end
data/core/symbol.rbs CHANGED
@@ -161,15 +161,11 @@ class Symbol
161
161
  # -->
162
162
  # Returns `true` if `object` is the same object as `self`, `false` otherwise.
163
163
  #
164
- # Symbol#=== is an alias for Symbol#==.
165
- #
166
164
  def ==: (untyped obj) -> bool
167
165
 
168
166
  # <!-- rdoc-file=string.c -->
169
167
  # Returns `true` if `object` is the same object as `self`, `false` otherwise.
170
168
  #
171
- # Symbol#=== is an alias for Symbol#==.
172
- #
173
169
  def ===: (untyped obj) -> bool
174
170
 
175
171
  # <!--
@@ -311,7 +307,7 @@ class Symbol
311
307
 
312
308
  # <!--
313
309
  # rdoc-file=string.c
314
- # - end_with?(*string_or_regexp) -> true or false
310
+ # - end_with?(*strings) -> true or false
315
311
  # -->
316
312
  # Equivalent to `self.to_s.end_with?`; see String#end_with?.
317
313
  #
@@ -322,8 +318,6 @@ class Symbol
322
318
  #
323
319
  # :foo.to_s # => "foo"
324
320
  #
325
- # Symbol#id2name is an alias for Symbol#to_s.
326
- #
327
321
  # Related: Symbol#inspect, Symbol#name.
328
322
  #
329
323
  def id2name: () -> String
@@ -353,8 +347,6 @@ class Symbol
353
347
  # -->
354
348
  # Equivalent to `self.to_s.length`; see String#length.
355
349
  #
356
- # Symbol#size is an alias for Symbol#length.
357
- #
358
350
  def length: () -> Integer
359
351
 
360
352
  # <!--
@@ -381,8 +373,6 @@ class Symbol
381
373
  #
382
374
  # :foo.succ # => :fop
383
375
  #
384
- # Symbol#next is an alias for Symbol#succ.
385
- #
386
376
  # Related: String#succ.
387
377
  #
388
378
  def next: () -> Symbol
@@ -390,8 +380,6 @@ class Symbol
390
380
  # <!-- rdoc-file=string.c -->
391
381
  # Equivalent to `self.to_s.length`; see String#length.
392
382
  #
393
- # Symbol#size is an alias for Symbol#length.
394
- #
395
383
  alias size length
396
384
 
397
385
  # <!-- rdoc-file=string.c -->
@@ -415,8 +403,6 @@ class Symbol
415
403
  #
416
404
  # :foo.succ # => :fop
417
405
  #
418
- # Symbol#next is an alias for Symbol#succ.
419
- #
420
406
  # Related: String#succ.
421
407
  #
422
408
  alias succ next
@@ -456,8 +442,6 @@ class Symbol
456
442
  #
457
443
  # :foo.to_s # => "foo"
458
444
  #
459
- # Symbol#id2name is an alias for Symbol#to_s.
460
- #
461
445
  # Related: Symbol#inspect, Symbol#name.
462
446
  #
463
447
  alias to_s id2name
@@ -468,8 +452,6 @@ class Symbol
468
452
  # -->
469
453
  # Returns `self`.
470
454
  #
471
- # Symbol#intern is an alias for Symbol#to_sym.
472
- #
473
455
  # Related: String#to_sym.
474
456
  #
475
457
  alias to_sym intern
data/core/thread.rbs CHANGED
@@ -991,9 +991,8 @@ class Thread < Object
991
991
  # from prog.rb:2:in `new'
992
992
  # from prog.rb:2
993
993
  #
994
- def self?.raise: () -> bot
995
- | (String message, ?cause: Exception?) -> bot
996
- | (_Exception exception, ?untyped message, ?::Array[String] backtrace, ?cause: Exception?) -> bot
994
+ def raise: (?String message) -> nil
995
+ | (_Exception, ?_ToS message, ?Array[String] backtrace) -> nil
997
996
 
998
997
  # <!--
999
998
  # rdoc-file=thread.c
@@ -1438,7 +1437,7 @@ class Thread::ConditionVariable < Object
1438
1437
  #
1439
1438
  # Returns the slept result on `mutex`.
1440
1439
  #
1441
- def wait: (Thread::Mutex mutex, ?Integer | Float? timeout) -> self
1440
+ def wait: (Thread::Mutex mutex, ?Integer | Float? timeout) -> Integer?
1442
1441
  end
1443
1442
 
1444
1443
  # <!-- rdoc-file=thread_sync.c -->
@@ -1521,8 +1520,8 @@ end
1521
1520
  # exchanged safely between multiple threads. The Thread::Queue class implements
1522
1521
  # all the required locking semantics.
1523
1522
  #
1524
- # The class implements FIFO type of queue. In a FIFO queue, the first tasks
1525
- # added are the first retrieved.
1523
+ # The class implements FIFO (first in, first out) type of queue. In a FIFO
1524
+ # queue, the first tasks added are the first retrieved.
1526
1525
  #
1527
1526
  # Example:
1528
1527
  #
@@ -1530,17 +1529,17 @@ end
1530
1529
  #
1531
1530
  # producer = Thread.new do
1532
1531
  # 5.times do |i|
1533
- # sleep rand(i) # simulate expense
1534
- # queue << i
1535
- # puts "#{i} produced"
1532
+ # sleep rand(i) # simulate expense
1533
+ # queue << i
1534
+ # puts "#{i} produced"
1536
1535
  # end
1537
1536
  # end
1538
1537
  #
1539
1538
  # consumer = Thread.new do
1540
1539
  # 5.times do |i|
1541
- # value = queue.pop
1542
- # sleep rand(i/2) # simulate expense
1543
- # puts "consumed #{value}"
1540
+ # value = queue.pop
1541
+ # sleep rand(i/2) # simulate expense
1542
+ # puts "consumed #{value}"
1544
1543
  # end
1545
1544
  # end
1546
1545
  #
@@ -1623,6 +1622,15 @@ class Thread::Queue < Object
1623
1622
  #
1624
1623
  alias enq push
1625
1624
 
1625
+ # <!--
1626
+ # rdoc-file=thread_sync.c
1627
+ # - freeze
1628
+ # -->
1629
+ # Raises an exception:
1630
+ # Queue.new.freeze # Raises TypeError (cannot freeze #<Thread::Queue:0x...>)
1631
+ #
1632
+ def freeze: () -> bot
1633
+
1626
1634
  # <!--
1627
1635
  # rdoc-file=thread_sync.c
1628
1636
  # - length
@@ -1699,6 +1707,15 @@ class Thread::SizedQueue < Thread::Queue
1699
1707
  #
1700
1708
  alias enq push
1701
1709
 
1710
+ # <!--
1711
+ # rdoc-file=thread_sync.c
1712
+ # - freeze
1713
+ # -->
1714
+ # Raises an exception:
1715
+ # Queue.new.freeze # Raises TypeError (cannot freeze #<Thread::Queue:0x...>)
1716
+ #
1717
+ def freeze: () -> bot
1718
+
1702
1719
  # <!--
1703
1720
  # rdoc-file=thread_sync.c
1704
1721
  # - new(max)