rbs 3.0.0.dev.2 → 3.0.0.dev.3

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -1
  3. data/.github/workflows/ruby.yml +4 -0
  4. data/Gemfile.lock +11 -11
  5. data/Rakefile +2 -2
  6. data/Steepfile +1 -1
  7. data/core/array.rbs +573 -423
  8. data/core/basic_object.rbs +11 -39
  9. data/core/binding.rbs +1 -1
  10. data/core/builtin.rbs +8 -0
  11. data/core/class.rbs +37 -0
  12. data/core/comparable.rbs +7 -18
  13. data/core/complex.rbs +2 -2
  14. data/core/data.rbs +419 -0
  15. data/core/dir.rbs +52 -104
  16. data/core/encoding.rbs +22 -181
  17. data/core/enumerable.rbs +212 -175
  18. data/core/enumerator/product.rbs +96 -0
  19. data/core/enumerator.rbs +57 -8
  20. data/core/errors.rbs +8 -2
  21. data/core/exception.rbs +41 -0
  22. data/core/fiber.rbs +95 -12
  23. data/core/file.rbs +840 -275
  24. data/core/file_test.rbs +34 -19
  25. data/core/float.rbs +40 -96
  26. data/core/gc.rbs +15 -3
  27. data/core/hash.rbs +113 -175
  28. data/core/integer.rbs +85 -145
  29. data/core/io/buffer.rbs +187 -60
  30. data/core/io/wait.rbs +28 -16
  31. data/core/io.rbs +1859 -1389
  32. data/core/kernel.rbs +525 -961
  33. data/core/match_data.rbs +306 -142
  34. data/core/math.rbs +506 -234
  35. data/core/method.rbs +0 -24
  36. data/core/module.rbs +110 -17
  37. data/core/nil_class.rbs +2 -0
  38. data/core/numeric.rbs +76 -144
  39. data/core/object.rbs +88 -212
  40. data/core/proc.rbs +17 -5
  41. data/core/process.rbs +22 -5
  42. data/core/ractor.rbs +1 -1
  43. data/core/random.rbs +20 -3
  44. data/core/range.rbs +91 -89
  45. data/core/rational.rbs +2 -3
  46. data/core/rbs/unnamed/argf.rbs +177 -120
  47. data/core/rbs/unnamed/env_class.rbs +89 -163
  48. data/core/rbs/unnamed/random.rbs +36 -12
  49. data/core/refinement.rbs +8 -0
  50. data/core/regexp.rbs +462 -272
  51. data/core/ruby_vm.rbs +210 -0
  52. data/{stdlib/set/0 → core}/set.rbs +43 -47
  53. data/core/string.rbs +1403 -1332
  54. data/core/string_io.rbs +191 -107
  55. data/core/struct.rbs +67 -63
  56. data/core/symbol.rbs +187 -201
  57. data/core/thread.rbs +40 -35
  58. data/core/time.rbs +902 -826
  59. data/core/trace_point.rbs +55 -6
  60. data/core/unbound_method.rbs +48 -24
  61. data/docs/collection.md +4 -0
  62. data/docs/syntax.md +55 -0
  63. data/ext/rbs_extension/parser.c +5 -6
  64. data/lib/rbs/cli.rb +6 -1
  65. data/lib/rbs/collection/cleaner.rb +8 -1
  66. data/lib/rbs/collection/config/lockfile.rb +3 -1
  67. data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
  68. data/lib/rbs/collection/config.rb +1 -1
  69. data/lib/rbs/collection/sources/git.rb +9 -2
  70. data/lib/rbs/collection/sources/local.rb +79 -0
  71. data/lib/rbs/collection/sources.rb +8 -1
  72. data/lib/rbs/environment.rb +6 -5
  73. data/lib/rbs/environment_loader.rb +3 -2
  74. data/lib/rbs/errors.rb +18 -0
  75. data/lib/rbs/locator.rb +26 -7
  76. data/lib/rbs/sorter.rb +2 -2
  77. data/lib/rbs/version.rb +1 -1
  78. data/sig/collection/sources.rbs +32 -3
  79. data/sig/environment.rbs +2 -3
  80. data/sig/locator.rbs +14 -2
  81. data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
  82. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
  83. data/stdlib/cgi/0/core.rbs +16 -0
  84. data/stdlib/coverage/0/coverage.rbs +50 -8
  85. data/stdlib/csv/0/csv.rbs +1 -1
  86. data/stdlib/date/0/date.rbs +856 -726
  87. data/stdlib/date/0/date_time.rbs +83 -210
  88. data/stdlib/erb/0/erb.rbs +13 -36
  89. data/stdlib/etc/0/etc.rbs +127 -20
  90. data/stdlib/fileutils/0/fileutils.rbs +1290 -381
  91. data/stdlib/logger/0/logger.rbs +466 -316
  92. data/stdlib/net-http/0/net-http.rbs +2211 -534
  93. data/stdlib/nkf/0/nkf.rbs +5 -5
  94. data/stdlib/objspace/0/objspace.rbs +31 -14
  95. data/stdlib/openssl/0/openssl.rbs +11 -7
  96. data/stdlib/optparse/0/optparse.rbs +20 -17
  97. data/stdlib/pathname/0/pathname.rbs +21 -4
  98. data/stdlib/pstore/0/pstore.rbs +378 -154
  99. data/stdlib/pty/0/pty.rbs +24 -8
  100. data/stdlib/ripper/0/ripper.rbs +1650 -0
  101. data/stdlib/socket/0/addrinfo.rbs +9 -15
  102. data/stdlib/socket/0/socket.rbs +36 -3
  103. data/stdlib/strscan/0/string_scanner.rbs +7 -5
  104. data/stdlib/tempfile/0/tempfile.rbs +104 -44
  105. data/stdlib/time/0/time.rbs +2 -2
  106. data/stdlib/uri/0/file.rbs +5 -0
  107. data/stdlib/uri/0/generic.rbs +2 -2
  108. data/stdlib/yaml/0/yaml.rbs +2 -2
  109. data/stdlib/zlib/0/zlib.rbs +1 -1
  110. metadata +8 -6
  111. data/core/deprecated.rbs +0 -9
  112. data/sig/shims/ripper.rbs +0 -8
data/core/enumerator.rbs CHANGED
@@ -37,8 +37,10 @@
37
37
  # list's elements to strings containing the index and the element as a string
38
38
  # via:
39
39
  #
40
- # puts %w[foo bar baz].map.with_index { |w, i| "#{i}:#{w}" }
41
- # # => ["0:foo", "1:bar", "2:baz"]
40
+ # puts %w[foo bar baz].map.with_index { |w, i| "#{i}:#{w}" }
41
+ # # => ["0:foo", "1:bar", "2:baz"]
42
+ #
43
+ # == External Iteration
42
44
  #
43
45
  # An Enumerator can also be used as an external iterator. For example,
44
46
  # Enumerator#next returns the next value of the iterator or raises StopIteration
@@ -50,14 +52,44 @@
50
52
  # puts e.next # => 3
51
53
  # puts e.next # raises StopIteration
52
54
  #
53
- # Note that enumeration sequence by `next`, `next_values`, `peek` and
54
- # `peek_values` do not affect other non-external enumeration methods, unless the
55
- # underlying iteration method itself has side-effect, e.g. IO#each_line.
55
+ # `next`, `next_values`, `peek` and `peek_values` are the only methods which use
56
+ # external iteration (and Array#zip(Enumerable-not-Array) which uses `next`).
56
57
  #
57
- # Moreover, implementation typically uses fibers so performance could be slower
58
- # and exception stacktraces different than expected.
58
+ # These methods do not affect other internal enumeration methods, unless the
59
+ # underlying iteration method itself has side-effect, e.g. IO#each_line.
59
60
  #
60
- # You can use this to implement an internal iterator as follows:
61
+ # External iteration differs **significantly** from internal iteration due to
62
+ # using a Fiber:
63
+ # - The Fiber adds some overhead compared to internal enumeration.
64
+ # - The stacktrace will only include the stack from the Enumerator, not above.
65
+ # - Fiber-local variables are *not* inherited inside the Enumerator Fiber,
66
+ # which instead starts with no Fiber-local variables.
67
+ # - Fiber storage variables *are* inherited and are designed
68
+ # to handle Enumerator Fibers. Assigning to a Fiber storage variable
69
+ # only affects the current Fiber, so if you want to change state
70
+ # in the caller Fiber of the Enumerator Fiber, you need to use an
71
+ # extra indirection (e.g., use some object in the Fiber storage
72
+ # variable and mutate some ivar of it).
73
+ #
74
+ # Concretely:
75
+ # Thread.current[:fiber_local] = 1
76
+ # Fiber[:storage_var] = 1
77
+ # e = Enumerator.new do |y|
78
+ # p Thread.current[:fiber_local] # for external iteration: nil, for internal iteration: 1
79
+ # p Fiber[:storage_var] # => 1, inherited
80
+ # Fiber[:storage_var] += 1
81
+ # y << 42
82
+ # end
83
+ #
84
+ # p e.next # => 42
85
+ # p Fiber[:storage_var] # => 1 (it ran in a different Fiber)
86
+ #
87
+ # e.each { p _1 }
88
+ # p Fiber[:storage_var] # => 2 (it ran in the same Fiber/"stack" as the current Fiber)
89
+ #
90
+ # == Convert External Iteration to Internal Iteration
91
+ #
92
+ # You can use an external iterator to implement an internal iterator as follows:
61
93
  #
62
94
  # def ext_each(e)
63
95
  # while true
@@ -92,6 +124,23 @@
92
124
  class Enumerator[unchecked out Elem, out Return] < Object
93
125
  include Enumerable[Elem]
94
126
 
127
+ # <!--
128
+ # rdoc-file=enumerator.c
129
+ # - Enumerator.product(*enums) -> enumerator
130
+ # - Enumerator.product(*enums) { |elts| ... } -> enumerator
131
+ # -->
132
+ # Generates a new enumerator object that generates a Cartesian product of given
133
+ # enumerable objects. This is equivalent to Enumerator::Product.new.
134
+ #
135
+ # e = Enumerator.product(1..3, [4, 5])
136
+ # e.to_a #=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]
137
+ # e.size #=> 6
138
+ #
139
+ # When a block is given, calls the block with each N-element array generated and
140
+ # returns `nil`.
141
+ #
142
+ def self.product: [Elem] (*_EachEntry[Elem]) -> Product[Elem]
143
+
95
144
  # <!--
96
145
  # rdoc-file=enumerator.c
97
146
  # - enum.each { |elm| block } -> obj
data/core/errors.rbs CHANGED
@@ -39,14 +39,15 @@ end
39
39
  # exist in two forms,
40
40
  #
41
41
  # one that returns `nil` when the end of file is reached, the other raises
42
- # `EOFError`.
42
+ # EOFError.
43
43
  #
44
- # `EOFError` is a subclass of `IOError`.
44
+ # EOFError is a subclass of IOError.
45
45
  #
46
46
  # file = File.open("/etc/hosts")
47
47
  # file.read
48
48
  # file.gets #=> nil
49
49
  # file.readline #=> EOFError: end of file reached
50
+ # file.close
50
51
  #
51
52
  class EOFError < IOError
52
53
  end
@@ -567,6 +568,11 @@ class SyntaxError < ScriptError
567
568
  # Construct a SyntaxError exception.
568
569
  #
569
570
  def initialize: (?string msg) -> void
571
+
572
+ # <!-- rdoc-file=error.c -->
573
+ # the path failed to parse
574
+ #
575
+ def path: () -> String?
570
576
  end
571
577
 
572
578
  # <!-- rdoc-file=error.c -->
data/core/exception.rbs CHANGED
@@ -191,6 +191,47 @@ class Exception < Object
191
191
  #
192
192
  def cause: () -> Exception?
193
193
 
194
+ # <!--
195
+ # rdoc-file=error.c
196
+ # - exception.detailed_message(highlight: bool, **opt) -> string
197
+ # -->
198
+ # Processes a string returned by #message.
199
+ #
200
+ # It may add the class name of the exception to the end of the first line. Also,
201
+ # when `highlight` keyword is true, it adds ANSI escape sequences to make the
202
+ # message bold.
203
+ #
204
+ # If you override this method, it must be tolerant for unknown keyword
205
+ # arguments. All keyword arguments passed to #full_message are delegated to this
206
+ # method.
207
+ #
208
+ # This method is overridden by did_you_mean and error_highlight to add their
209
+ # information.
210
+ #
211
+ # A user-defined exception class can also define their own `detailed_message`
212
+ # method to add supplemental information. When `highlight` is true, it can
213
+ # return a string containing escape sequences, but use widely-supported ones. It
214
+ # is recommended to limit the following codes:
215
+ #
216
+ # * Reset (`\e[0m`)
217
+ # * Bold (`\e[1m`)
218
+ # * Underline (`\e[4m`)
219
+ # * Foreground color except white and black
220
+ # * Red (`\e[31m`)
221
+ # * Green (`\e[32m`)
222
+ # * Yellow (`\e[33m`)
223
+ # * Blue (`\e[34m`)
224
+ # * Magenta (`\e[35m`)
225
+ # * Cyan (`\e[36m`)
226
+ #
227
+ #
228
+ #
229
+ # Use escape sequences carefully even if `highlight` is true. Do not use escape
230
+ # sequences to express essential information; the message should be readable
231
+ # even if all escape sequences are ignored.
232
+ #
233
+ def detailed_message: () -> String
234
+
194
235
  # <!--
195
236
  # rdoc-file=error.c
196
237
  # - exc.exception([string]) -> an_exception or exc
data/core/fiber.rbs CHANGED
@@ -69,13 +69,38 @@
69
69
  # blocking and non-blocking fibers' behavior is identical.
70
70
  #
71
71
  # Ruby doesn't provide a scheduler class: it is expected to be implemented by
72
- # the user and correspond to Fiber::SchedulerInterface.
72
+ # the user and correspond to Fiber::Scheduler.
73
73
  #
74
74
  # There is also Fiber.schedule method, which is expected to immediately perform
75
75
  # the given block in a non-blocking manner. Its actual implementation is up to
76
76
  # the scheduler.
77
77
  #
78
78
  class Fiber < Object
79
+ # <!--
80
+ # rdoc-file=cont.c
81
+ # - Fiber[key] -> value
82
+ # -->
83
+ # Returns the value of the fiber storage variable identified by `key`.
84
+ #
85
+ # The `key` must be a symbol, and the value is set by Fiber#[]= or Fiber#store.
86
+ #
87
+ # See also Fiber::[]=.
88
+ #
89
+ def self.[]: (Symbol | String) -> untyped
90
+
91
+ # <!--
92
+ # rdoc-file=cont.c
93
+ # - Fiber[key] = value
94
+ # -->
95
+ # Assign `value` to the fiber storage variable identified by `key`. The variable
96
+ # is created if it doesn't exist.
97
+ #
98
+ # `key` must be a Symbol, otherwise a TypeError is raised.
99
+ #
100
+ # See also Fiber::[].
101
+ #
102
+ def self.[]=: [A] (Symbol | String, A) -> A
103
+
79
104
  # <!--
80
105
  # rdoc-file=cont.c
81
106
  # - Fiber.blocking? -> false or 1
@@ -146,8 +171,8 @@ class Fiber < Object
146
171
  #
147
172
  # Note that the behavior described above is how the method is *expected* to
148
173
  # behave, actual behavior is up to the current scheduler's implementation of
149
- # Fiber::SchedulerInterface#fiber method. Ruby doesn't enforce this method to
150
- # behave in any particular way.
174
+ # Fiber::Scheduler#fiber method. Ruby doesn't enforce this method to behave in
175
+ # any particular way.
151
176
  #
152
177
  # If the scheduler is not set, the method raises `RuntimeError (No scheduler is
153
178
  # available!)`.
@@ -158,11 +183,11 @@ class Fiber < Object
158
183
  # rdoc-file=cont.c
159
184
  # - Fiber.scheduler -> obj or nil
160
185
  # -->
161
- # Returns the Fiber scheduler, that was last set for the current thread with Fiber.set_scheduler.
162
- # Returns +nil+ if no scheduler is set (which is the default), and non-blocking fibers'
163
- #
164
- # # behavior is the same as blocking.
165
- # (see "Non-blocking fibers" section in class docs for details about the scheduler concept).
186
+ # Returns the Fiber scheduler, that was last set for the current thread with
187
+ # Fiber.set_scheduler. Returns `nil` if no scheduler is set (which is the
188
+ # default), and non-blocking fibers' behavior is the same as blocking. (see
189
+ # "Non-blocking fibers" section in class docs for details about the scheduler
190
+ # concept).
166
191
  #
167
192
  def self.scheduler: () -> untyped?
168
193
 
@@ -177,8 +202,8 @@ class Fiber < Object
177
202
  # finalization (allowing the scheduler to properly manage all non-finished
178
203
  # fibers).
179
204
  #
180
- # `scheduler` can be an object of any class corresponding to
181
- # Fiber::SchedulerInterface. Its implementation is up to the user.
205
+ # `scheduler` can be an object of any class corresponding to Fiber::Scheduler.
206
+ # Its implementation is up to the user.
182
207
  #
183
208
  # See also the "Non-blocking fibers" section in class docs.
184
209
  #
@@ -197,7 +222,7 @@ class Fiber < Object
197
222
 
198
223
  # <!--
199
224
  # rdoc-file=cont.c
200
- # - Fiber.new(blocking: false) { |*args| ... } -> fiber
225
+ # - Fiber.new(blocking: false, storage: true) { |*args| ... } -> fiber
201
226
  # -->
202
227
  # Creates new Fiber. Initially, the fiber is not running and can be resumed with
203
228
  # #resume. Arguments to the first #resume call will be passed to the block:
@@ -218,7 +243,32 @@ class Fiber < Object
218
243
  # Fiber.scheduler defined, the Fiber becomes non-blocking (see "Non-blocking
219
244
  # Fibers" section in class docs).
220
245
  #
221
- def initialize: (?blocking: boolish) { (*untyped) -> void } -> void
246
+ # If the `storage` is unspecified, the default is to inherit a copy of the
247
+ # storage from the current fiber. This is the same as specifying `storage:
248
+ # true`.
249
+ #
250
+ # Fiber[:x] = 1
251
+ # Fiber.new do
252
+ # Fiber[:x] # => 1
253
+ # Fiber[:x] = 2
254
+ # end.resume
255
+ # Fiber[:x] # => 1
256
+ #
257
+ # If the given `storage` is `nil`, this function will lazy initialize the
258
+ # internal storage, which starts as an empty hash.
259
+ #
260
+ # Fiber[:x] = "Hello World"
261
+ # Fiber.new(storage: nil) do
262
+ # Fiber[:x] # nil
263
+ # end
264
+ #
265
+ # Otherwise, the given `storage` is used as the new fiber's storage, and it must
266
+ # be an instance of Hash.
267
+ #
268
+ # Explicitly using `storage: true` is currently experimental and may change in
269
+ # the future.
270
+ #
271
+ def initialize: (?blocking: boolish, ?storage: true | Hash[Symbol | String, untyped] | nil) { (*untyped) -> void } -> void
222
272
 
223
273
  # <!--
224
274
  # rdoc-file=cont.c
@@ -357,6 +407,39 @@ class Fiber < Object
357
407
  #
358
408
  def resume: (*untyped) -> untyped
359
409
 
410
+ # <!--
411
+ # rdoc-file=cont.c
412
+ # - fiber.storage -> hash (dup)
413
+ # -->
414
+ # Returns a copy of the storage hash for the fiber. The method can only be
415
+ # called on the Fiber.current.
416
+ #
417
+ def storage: () -> Hash[Symbol | String, untyped]
418
+
419
+ # <!--
420
+ # rdoc-file=cont.c
421
+ # - fiber.storage = hash
422
+ # -->
423
+ # Sets the storage hash for the fiber. This feature is experimental and may
424
+ # change in the future. The method can only be called on the Fiber.current.
425
+ #
426
+ # You should be careful about using this method as you may inadvertently clear
427
+ # important fiber-storage state. You should mostly prefer to assign specific
428
+ # keys in the storage using Fiber::[]=.
429
+ #
430
+ # You can also use `Fiber.new(storage: nil)` to create a fiber with an empty
431
+ # storage.
432
+ #
433
+ # Example:
434
+ #
435
+ # while request = request_queue.pop
436
+ # # Reset the per-request state:
437
+ # Fiber.current.storage = nil
438
+ # handle_request(request)
439
+ # end
440
+ #
441
+ def storage=: (Hash[Symbol | String, untyped]) -> Hash[Symbol | String, untyped]
442
+
360
443
  # <!--
361
444
  # rdoc-file=cont.c
362
445
  # - to_s()