rbs 2.6.0 → 2.7.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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +5 -0
  4. data/CHANGELOG.md +48 -1
  5. data/Gemfile.lock +10 -9
  6. data/Rakefile +0 -5
  7. data/Steepfile +1 -0
  8. data/core/basic_object.rbs +2 -2
  9. data/core/fiber.rbs +304 -14
  10. data/core/float.rbs +2 -0
  11. data/core/io.rbs +95 -1
  12. data/core/kernel.rbs +1 -1
  13. data/core/module.rbs +1 -1
  14. data/core/regexp.rbs +1 -1
  15. data/core/string_io.rbs +1 -1
  16. data/core/warning.rbs +1 -1
  17. data/ext/rbs_extension/parser.c +36 -10
  18. data/ext/rbs_extension/ruby_objs.c +4 -2
  19. data/ext/rbs_extension/ruby_objs.h +2 -2
  20. data/lib/rbs/ancestor_graph.rb +2 -0
  21. data/lib/rbs/annotate/annotations.rb +2 -0
  22. data/lib/rbs/annotate/formatter.rb +4 -2
  23. data/lib/rbs/annotate/rdoc_annotator.rb +2 -0
  24. data/lib/rbs/annotate/rdoc_source.rb +2 -0
  25. data/lib/rbs/annotate.rb +2 -0
  26. data/lib/rbs/ast/annotation.rb +2 -0
  27. data/lib/rbs/ast/comment.rb +2 -0
  28. data/lib/rbs/ast/declarations.rb +2 -0
  29. data/lib/rbs/ast/members.rb +2 -0
  30. data/lib/rbs/ast/type_param.rb +3 -1
  31. data/lib/rbs/buffer.rb +2 -0
  32. data/lib/rbs/builtin_names.rb +2 -0
  33. data/lib/rbs/cli.rb +39 -2
  34. data/lib/rbs/collection/cleaner.rb +2 -0
  35. data/lib/rbs/collection/config/lockfile_generator.rb +8 -3
  36. data/lib/rbs/collection/config.rb +2 -0
  37. data/lib/rbs/collection/installer.rb +2 -0
  38. data/lib/rbs/collection/sources/base.rb +14 -0
  39. data/lib/rbs/collection/sources/git.rb +3 -0
  40. data/lib/rbs/collection/sources/rubygems.rb +3 -0
  41. data/lib/rbs/collection/sources/stdlib.rb +12 -7
  42. data/lib/rbs/collection/sources.rb +3 -0
  43. data/lib/rbs/collection.rb +2 -0
  44. data/lib/rbs/constant.rb +2 -0
  45. data/lib/rbs/constant_table.rb +5 -3
  46. data/lib/rbs/definition.rb +13 -1
  47. data/lib/rbs/definition_builder/ancestor_builder.rb +2 -0
  48. data/lib/rbs/definition_builder/method_builder.rb +2 -0
  49. data/lib/rbs/definition_builder.rb +75 -13
  50. data/lib/rbs/environment.rb +2 -0
  51. data/lib/rbs/environment_loader.rb +25 -5
  52. data/lib/rbs/environment_walker.rb +2 -0
  53. data/lib/rbs/errors.rb +3 -1
  54. data/lib/rbs/factory.rb +2 -0
  55. data/lib/rbs/location_aux.rb +3 -1
  56. data/lib/rbs/locator.rb +2 -0
  57. data/lib/rbs/method_type.rb +7 -5
  58. data/lib/rbs/namespace.rb +9 -5
  59. data/lib/rbs/parser_aux.rb +2 -0
  60. data/lib/rbs/parser_compat/lexer_error.rb +2 -0
  61. data/lib/rbs/parser_compat/located_value.rb +2 -0
  62. data/lib/rbs/parser_compat/semantics_error.rb +2 -0
  63. data/lib/rbs/parser_compat/syntax_error.rb +2 -0
  64. data/lib/rbs/prototype/helpers.rb +13 -8
  65. data/lib/rbs/prototype/rb.rb +2 -0
  66. data/lib/rbs/prototype/rbi.rb +11 -6
  67. data/lib/rbs/prototype/runtime.rb +13 -4
  68. data/lib/rbs/repository.rb +4 -4
  69. data/lib/rbs/resolver/constant_resolver.rb +2 -0
  70. data/lib/rbs/resolver/type_name_resolver.rb +2 -0
  71. data/lib/rbs/sorter.rb +168 -0
  72. data/lib/rbs/substitution.rb +2 -0
  73. data/lib/rbs/test/errors.rb +2 -0
  74. data/lib/rbs/test/hook.rb +2 -0
  75. data/lib/rbs/test/observer.rb +2 -0
  76. data/lib/rbs/test/setup.rb +2 -0
  77. data/lib/rbs/test/setup_helper.rb +2 -0
  78. data/lib/rbs/test/spy.rb +2 -0
  79. data/lib/rbs/test/tester.rb +2 -0
  80. data/lib/rbs/test/type_check.rb +2 -0
  81. data/lib/rbs/test.rb +2 -0
  82. data/lib/rbs/type_alias_dependency.rb +2 -0
  83. data/lib/rbs/type_alias_regularity.rb +2 -0
  84. data/lib/rbs/type_name.rb +2 -0
  85. data/lib/rbs/type_name_resolver.rb +4 -2
  86. data/lib/rbs/types.rb +68 -18
  87. data/lib/rbs/validator.rb +2 -0
  88. data/lib/rbs/variance_calculator.rb +2 -0
  89. data/lib/rbs/vendorer.rb +2 -0
  90. data/lib/rbs/version.rb +3 -1
  91. data/lib/rbs/writer.rb +3 -1
  92. data/lib/rbs.rb +4 -2
  93. data/lib/rdoc/discover.rb +20 -0
  94. data/lib/rdoc_plugin/parser.rb +163 -0
  95. data/schema/methodType.json +7 -1
  96. data/schema/types.json +13 -1
  97. data/sig/ancestor_builder.rbs +66 -7
  98. data/sig/annotation.rbs +7 -6
  99. data/sig/builtin_names.rbs +2 -0
  100. data/sig/cli.rbs +8 -0
  101. data/sig/collection/config.rbs +13 -4
  102. data/sig/collection/installer.rbs +2 -0
  103. data/sig/collection/sources.rbs +23 -4
  104. data/sig/definition.rbs +8 -0
  105. data/sig/definition_builder.rbs +64 -7
  106. data/sig/environment.rbs +4 -0
  107. data/sig/environment_loader.rbs +4 -2
  108. data/sig/location.rbs +8 -4
  109. data/sig/manifest.yaml +1 -0
  110. data/sig/members.rbs +1 -1
  111. data/sig/method_builder.rbs +10 -0
  112. data/sig/namespace.rbs +54 -31
  113. data/sig/prototype/rb.rbs +4 -0
  114. data/sig/rbs.rbs +8 -6
  115. data/sig/rdoc/rbs.rbs +63 -0
  116. data/sig/{polyfill.rbs → shims.rbs} +1 -31
  117. data/sig/sorter.rbs +23 -0
  118. data/sig/types.rbs +14 -2
  119. data/sig/vendorer.rbs +32 -25
  120. data/stdlib/bigdecimal/0/big_decimal.rbs +250 -0
  121. data/stdlib/erb/0/erb.rbs +107 -0
  122. data/stdlib/logger/0/logger.rbs +2 -2
  123. data/stdlib/rdoc/0/rdoc.rbs +758 -0
  124. data/steep/Gemfile.lock +8 -8
  125. metadata +12 -6
  126. data/stdlib/fiber/0/fiber.rbs +0 -99
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b7c0492a40dd2d8ce395ddb823807f2a33d76646a5a63edbbed4fbae0c924e28
4
- data.tar.gz: 66f2ea0d8fa7982274b687d3d27146db1cded7f45ecce88ed5a320cdbd1b125a
3
+ metadata.gz: aeae92c94238c9c1b417f2efd334c6af1435c94b6f43480f6979b413694936b4
4
+ data.tar.gz: 8abf8d32d6ce0b2103696436698fe5687bef05a677da6f46a317f83adfe73380
5
5
  SHA512:
6
- metadata.gz: 49dc3f14f20efc27a4eb590d36af44e2565dfdc20061260336b6ed2ae88784d5f759759ff602b3ba88c402df110ee13c9d198caa75b7153dafc3938c6df776ea
7
- data.tar.gz: d4659a14549a0fd7686b8a9e0c8bd7433d688e9470e26780785bb9c627625fc2ac32332298f6d7dc1442316dd6eb439a7c4c0bd99f28c6fbd2cab50698b3d9d3
6
+ metadata.gz: 6bdb78cad95578cf94728625e0d20ca211a1ed8140a728f5f723b2331731733d73bc6d33e0ec4f914782ff1cde52d52079c5625afe008a297c1952b115870075
7
+ data.tar.gz: 0c56b8f9ce630cc77ec080ca5ad172611005fb2cd6cfcc18ea239dc5a8490aa11f74a0f4bd9d3045a8e71f6920b41d203fb7d228207696ea92d0c74c9069b317
data/.gitignore CHANGED
@@ -18,3 +18,5 @@
18
18
  lib/**/*.bundle
19
19
  lib/**/*.so
20
20
  lib/**/*.dll
21
+ doc/
22
+ **/*.gem
data/.rubocop.yml CHANGED
@@ -13,3 +13,8 @@ Lint/DuplicateMethods:
13
13
  Enabled: true
14
14
  Include:
15
15
  - 'test/**/*_test.rb'
16
+
17
+ Style/FrozenStringLiteralComment:
18
+ Enabled: true
19
+ Include:
20
+ - 'lib/**/*.rb'
data/CHANGELOG.md CHANGED
@@ -2,6 +2,53 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 2.7.0.pre.1 (2022-09-02)
6
+
7
+ See [Release Note 2.7](https://github.com/ruby/rbs/wiki/Release-Note-2.7) for the highlights of this release.
8
+
9
+ ### Signature updates
10
+
11
+ * fiber ([#1071](https://github.com/ruby/rbs/pull/1071))
12
+ * `BigDecimal` ([#1053](https://github.com/ruby/rbs/pull/1053))
13
+ * `ERB::Util`, `ERB::DefMethod` ([#1074](https://github.com/ruby/rbs/pull/1074))
14
+ * `Float::Infinity` ([#1095](https://github.com/ruby/rbs/pull/1095))
15
+ * `Logger` ([#1046](https://github.com/ruby/rbs/pull/1046))
16
+ * `IO.pipe`, `IO.foreach` ([#1057](https://github.com/ruby/rbs/pull/1057))
17
+ * `Module#refine` ([#1064](https://github.com/ruby/rbs/pull/1064))
18
+ * `Regexp.new` ([#1059](https://github.com/ruby/rbs/pull/1059))
19
+ * `StringIO#write` ([#1065](https://github.com/ruby/rbs/pull/1065))
20
+ * `Warning.#warn`, `Kernel.#warn` ([#1056](https://github.com/ruby/rbs/pull/1056))
21
+
22
+ ### Language updates
23
+
24
+ * Type of `self` in blocks/procs ([#1077](https://github.com/ruby/rbs/issues/1077), [#1101](https://github.com/ruby/rbs/pull/1101))
25
+
26
+ ### Library changes
27
+
28
+ * RDoc plugin ([#1048](https://github.com/ruby/rbs/pull/1048))
29
+ * Dedupe method comments ([#1103](https://github.com/ruby/rbs/pull/1103))
30
+ * Reduce object allocations for GC ([#1102](https://github.com/ruby/rbs/pull/1102))
31
+ * Add `frozen_string_literal: true` ([#1100](https://github.com/ruby/rbs/pull/1100))
32
+ * Load dependencies on `-r` option also ([#1013](https://github.com/ruby/rbs/pull/1013))
33
+ * Fix DefinitionBuilder for methods aliased from module self constraints ([#1099](https://github.com/ruby/rbs/pull/1099))
34
+ * Fix RBS type definitions ([#1098](https://github.com/ruby/rbs/pull/1098))
35
+ * Give aliases of `.new` methods correct type ([#1097](https://github.com/ruby/rbs/pull/1097))
36
+ * `nil` versions are discouraged and will be deprecated in Rubygems 4 ([#1091](https://github.com/ruby/rbs/pull/1091))
37
+ * Fixes towards Rubygems 4.0 ([#1090](https://github.com/ruby/rbs/pull/1090))
38
+ * Remove redundant `add` for `Repository.default` ([#1062](https://github.com/ruby/rbs/pull/1062))
39
+ * Refactor: Use Repository in stdlib source ([#1063](https://github.com/ruby/rbs/pull/1063))
40
+ * Move `bin/sort` implementation to under `lib/` ([#1051](https://github.com/ruby/rbs/pull/1051))
41
+
42
+ #### rbs prototype
43
+
44
+ * Fix some error on `prototype runtime` ([#1055](https://github.com/ruby/rbs/pull/1055))
45
+ * Skip existing RBS files from batch `prototype` ([#1060](https://github.com/ruby/rbs/pull/1060))
46
+
47
+ ### Miscellaneous
48
+
49
+ * Discard outputs from test code ([#1093](https://github.com/ruby/rbs/pull/1093))
50
+ * Skip testing visibility methods with Ruby 3.2 ([#1082](https://github.com/ruby/rbs/pull/1082))
51
+
5
52
  ## 2.6.0 (2022-06-22)
6
53
 
7
54
  RBS 2.6 ships with `rbs prototype` commands improvements and signature updates.
@@ -44,7 +91,7 @@ New minitest RBS definitions will help you to type check your tests.
44
91
  * Fix type errors ([\#1023](https://github.com/ruby/rbs/pull/1023))
45
92
  * Clarify GHA step name for rake annotate ([\#1024](https://github.com/ruby/rbs/pull/1024))
46
93
  * Silence parser warning ([\#1039](https://github.com/ruby/rbs/pull/1039))
47
- * Fix warnings ([\#1035](https://github.com/ruby/rbs/pull/1035)
94
+ * Fix warnings ([\#1035](https://github.com/ruby/rbs/pull/1035))
48
95
 
49
96
  ## 2.5.1 (2022-06-19)
50
97
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbs (2.6.0)
4
+ rbs (2.7.0.pre.1)
5
5
 
6
6
  PATH
7
7
  remote: test/assets/test-gem
@@ -30,9 +30,9 @@ GEM
30
30
  json-schema (3.0.0)
31
31
  addressable (>= 2.8)
32
32
  marcel (1.0.2)
33
- minitest (5.16.1)
33
+ minitest (5.16.3)
34
34
  parallel (1.22.1)
35
- parser (3.1.2.0)
35
+ parser (3.1.2.1)
36
36
  ast (~> 2.4.1)
37
37
  power_assert (2.0.1)
38
38
  prime (0.1.2)
@@ -62,16 +62,17 @@ GEM
62
62
  diff-lcs (>= 1.2.0, < 2.0)
63
63
  rspec-support (~> 3.11.0)
64
64
  rspec-support (3.11.0)
65
- rubocop (1.30.1)
65
+ rubocop (1.35.1)
66
+ json (~> 2.3)
66
67
  parallel (~> 1.10)
67
- parser (>= 3.1.0.0)
68
+ parser (>= 3.1.2.1)
68
69
  rainbow (>= 2.2.2, < 4.0)
69
70
  regexp_parser (>= 1.8, < 3.0)
70
71
  rexml (>= 3.2.5, < 4.0)
71
- rubocop-ast (>= 1.18.0, < 2.0)
72
+ rubocop-ast (>= 1.20.1, < 2.0)
72
73
  ruby-progressbar (~> 1.7)
73
74
  unicode-display_width (>= 1.4.0, < 3.0)
74
- rubocop-ast (1.18.0)
75
+ rubocop-ast (1.21.0)
75
76
  parser (>= 3.1.1.0)
76
77
  rubocop-rubycw (0.1.6)
77
78
  rubocop (~> 1.0)
@@ -79,13 +80,13 @@ GEM
79
80
  rake (>= 0.8.1)
80
81
  ruby-progressbar (1.11.0)
81
82
  singleton (0.1.1)
82
- stackprof (0.2.19)
83
+ stackprof (0.2.21)
83
84
  stringio (3.0.2)
84
85
  strong_json (2.1.2)
85
86
  tempfile (0.1.2)
86
87
  test-unit (3.5.3)
87
88
  power_assert
88
- unicode-display_width (2.1.0)
89
+ unicode-display_width (2.2.0)
89
90
 
90
91
  PLATFORMS
91
92
  ruby
data/Rakefile CHANGED
@@ -60,11 +60,6 @@ task :validate => :compile do
60
60
 
61
61
  FileList["stdlib/*"].each do |path|
62
62
  lib = [File.basename(path).to_s]
63
- if File.exist?("#{path}/0/manifest.yaml")
64
- YAML.load_file("#{path}/0/manifest.yaml")["dependencies"].each do |dep|
65
- lib << dep["name"]
66
- end
67
- end
68
63
 
69
64
  sh "#{ruby} #{rbs} #{lib.map {|l| "-r #{l}"}.join(" ")} validate --silent"
70
65
  end
data/Steepfile CHANGED
@@ -13,6 +13,7 @@ target :lib do
13
13
  signature "stdlib/strscan/0/"
14
14
  signature "stdlib/rubygems/0/"
15
15
  signature "stdlib/optparse/0/"
16
+ signature "stdlib/rdoc/0/"
16
17
 
17
18
  configure_code_diagnostics do |config|
18
19
  config[D::Ruby::MethodDefinitionMissing] = :hint
@@ -257,7 +257,7 @@ class BasicObject
257
257
  # k.instance_eval {|obj| obj == self } #=> true
258
258
  #
259
259
  def instance_eval: (String, ?String filename, ?Integer lineno) -> untyped
260
- | [U] () { (self) -> U } -> U
260
+ | [U] () { (self) [self: self] -> U } -> U
261
261
 
262
262
  # <!--
263
263
  # rdoc-file=vm_eval.c
@@ -276,7 +276,7 @@ class BasicObject
276
276
  # k = KlassWithSecret.new
277
277
  # k.instance_exec(5) {|x| @secret+x } #=> 104
278
278
  #
279
- def instance_exec: [U, V] (*V args) { (*V args) -> U } -> U
279
+ def instance_exec: [U, V] (*V args) { (*V args) [self: self] -> U } -> U
280
280
 
281
281
  # <!--
282
282
  # rdoc-file=object.c
data/core/fiber.rbs CHANGED
@@ -76,6 +76,114 @@
76
76
  # the scheduler.
77
77
  #
78
78
  class Fiber < Object
79
+ # <!--
80
+ # rdoc-file=cont.c
81
+ # - Fiber.blocking? -> false or 1
82
+ # -->
83
+ # Returns `false` if the current fiber is non-blocking. Fiber is non-blocking if
84
+ # it was created via passing `blocking: false` to Fiber.new, or via
85
+ # Fiber.schedule.
86
+ #
87
+ # If the current Fiber is blocking, the method returns 1. Future developments
88
+ # may allow for situations where larger integers could be returned.
89
+ #
90
+ # Note that, even if the method returns `false`, Fiber behaves differently only
91
+ # if Fiber.scheduler is set in the current thread.
92
+ #
93
+ # See the "Non-blocking fibers" section in class docs for details.
94
+ #
95
+ def self.blocking?: () -> untyped
96
+
97
+ # <!--
98
+ # rdoc-file=cont.c
99
+ # - Fiber.current -> fiber
100
+ # -->
101
+ # Returns the current fiber. If you are not running in the context of a fiber
102
+ # this method will return the root fiber.
103
+ #
104
+ def self.current: () -> Fiber
105
+
106
+ # <!--
107
+ # rdoc-file=cont.c
108
+ # - Fiber.current_scheduler -> obj or nil
109
+ # -->
110
+ # Returns the Fiber scheduler, that was last set for the current thread with
111
+ # Fiber.set_scheduler if and only if the current fiber is non-blocking.
112
+ #
113
+ def self.current_scheduler: () -> untyped?
114
+
115
+ # <!--
116
+ # rdoc-file=cont.c
117
+ # - Fiber.schedule { |*args| ... } -> fiber
118
+ # -->
119
+ # The method is *expected* to immediately run the provided block of code in a
120
+ # separate non-blocking fiber.
121
+ #
122
+ # puts "Go to sleep!"
123
+ #
124
+ # Fiber.set_scheduler(MyScheduler.new)
125
+ #
126
+ # Fiber.schedule do
127
+ # puts "Going to sleep"
128
+ # sleep(1)
129
+ # puts "I slept well"
130
+ # end
131
+ #
132
+ # puts "Wakey-wakey, sleepyhead"
133
+ #
134
+ # Assuming MyScheduler is properly implemented, this program will produce:
135
+ #
136
+ # Go to sleep!
137
+ # Going to sleep
138
+ # Wakey-wakey, sleepyhead
139
+ # ...1 sec pause here...
140
+ # I slept well
141
+ #
142
+ # ...e.g. on the first blocking operation inside the Fiber (`sleep(1)`), the
143
+ # control is yielded to the outside code (main fiber), and *at the end of that
144
+ # execution*, the scheduler takes care of properly resuming all the blocked
145
+ # fibers.
146
+ #
147
+ # Note that the behavior described above is how the method is *expected* to
148
+ # 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.
151
+ #
152
+ # If the scheduler is not set, the method raises `RuntimeError (No scheduler is
153
+ # available!)`.
154
+ #
155
+ def self.schedule: () { () -> void } -> Fiber
156
+
157
+ # <!--
158
+ # rdoc-file=cont.c
159
+ # - Fiber.scheduler -> obj or nil
160
+ # -->
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).
166
+ #
167
+ def self.scheduler: () -> untyped?
168
+
169
+ # <!--
170
+ # rdoc-file=cont.c
171
+ # - Fiber.set_scheduler(scheduler) -> scheduler
172
+ # -->
173
+ # Sets the Fiber scheduler for the current thread. If the scheduler is set,
174
+ # non-blocking fibers (created by Fiber.new with `blocking: false`, or by
175
+ # Fiber.schedule) call that scheduler's hook methods on potentially blocking
176
+ # operations, and the current thread will call scheduler's `close` method on
177
+ # finalization (allowing the scheduler to properly manage all non-finished
178
+ # fibers).
179
+ #
180
+ # `scheduler` can be an object of any class corresponding to
181
+ # Fiber::SchedulerInterface. Its implementation is up to the user.
182
+ #
183
+ # See also the "Non-blocking fibers" section in class docs.
184
+ #
185
+ def self.set_scheduler: (untyped) -> untyped
186
+
79
187
  # <!--
80
188
  # rdoc-file=cont.c
81
189
  # - Fiber.yield(args, ...) -> obj
@@ -85,7 +193,7 @@ class Fiber < Object
85
193
  # point when #resume is called next. Any arguments passed to the next #resume
86
194
  # will be the value that this Fiber.yield expression evaluates to.
87
195
  #
88
- def self.yield: (*untyped args) -> untyped
196
+ def self.yield: (*untyped) -> untyped
89
197
 
90
198
  # <!--
91
199
  # rdoc-file=cont.c
@@ -110,22 +218,106 @@ class Fiber < Object
110
218
  # Fiber.scheduler defined, the Fiber becomes non-blocking (see "Non-blocking
111
219
  # Fibers" section in class docs).
112
220
  #
113
- def initialize: () { () -> untyped } -> void
221
+ def initialize: (?blocking: boolish) { (*untyped) -> void } -> void
114
222
 
115
223
  # <!--
116
224
  # rdoc-file=cont.c
117
- # - fiber.resume(args, ...) -> obj
225
+ # - fiber.alive? -> true or false
118
226
  # -->
119
- # Resumes the fiber from the point at which the last Fiber.yield was called, or
120
- # starts running it if it is the first call to #resume. Arguments passed to
121
- # resume will be the value of the Fiber.yield expression or will be passed as
122
- # block parameters to the fiber's block if this is the first #resume.
227
+ # Returns true if the fiber can still be resumed (or transferred to). After
228
+ # finishing execution of the fiber block this method will always return `false`.
123
229
  #
124
- # Alternatively, when resume is called it evaluates to the arguments passed to
125
- # the next Fiber.yield statement inside the fiber's block or to the block value
126
- # if it runs to completion without any Fiber.yield
230
+ def alive?: () -> bool
231
+
232
+ # <!--
233
+ # rdoc-file=cont.c
234
+ # - fiber.backtrace -> array
235
+ # - fiber.backtrace(start) -> array
236
+ # - fiber.backtrace(start, count) -> array
237
+ # - fiber.backtrace(start..end) -> array
238
+ # -->
239
+ # Returns the current execution stack of the fiber. `start`, `count` and `end`
240
+ # allow to select only parts of the backtrace.
241
+ #
242
+ # def level3
243
+ # Fiber.yield
244
+ # end
127
245
  #
128
- def resume: (*untyped args) -> untyped
246
+ # def level2
247
+ # level3
248
+ # end
249
+ #
250
+ # def level1
251
+ # level2
252
+ # end
253
+ #
254
+ # f = Fiber.new { level1 }
255
+ #
256
+ # # It is empty before the fiber started
257
+ # f.backtrace
258
+ # #=> []
259
+ #
260
+ # f.resume
261
+ #
262
+ # f.backtrace
263
+ # #=> ["test.rb:2:in `yield'", "test.rb:2:in `level3'", "test.rb:6:in `level2'", "test.rb:10:in `level1'", "test.rb:13:in `block in <main>'"]
264
+ # p f.backtrace(1) # start from the item 1
265
+ # #=> ["test.rb:2:in `level3'", "test.rb:6:in `level2'", "test.rb:10:in `level1'", "test.rb:13:in `block in <main>'"]
266
+ # p f.backtrace(2, 2) # start from item 2, take 2
267
+ # #=> ["test.rb:6:in `level2'", "test.rb:10:in `level1'"]
268
+ # p f.backtrace(1..3) # take items from 1 to 3
269
+ # #=> ["test.rb:2:in `level3'", "test.rb:6:in `level2'", "test.rb:10:in `level1'"]
270
+ #
271
+ # f.resume
272
+ #
273
+ # # It is nil after the fiber is finished
274
+ # f.backtrace
275
+ # #=> nil
276
+ #
277
+ def backtrace: (?Integer start, ?Integer count) -> Array[String]?
278
+ | (Range[Integer]) -> Array[String]?
279
+
280
+ # <!--
281
+ # rdoc-file=cont.c
282
+ # - fiber.backtrace_locations -> array
283
+ # - fiber.backtrace_locations(start) -> array
284
+ # - fiber.backtrace_locations(start, count) -> array
285
+ # - fiber.backtrace_locations(start..end) -> array
286
+ # -->
287
+ # Like #backtrace, but returns each line of the execution stack as a
288
+ # Thread::Backtrace::Location. Accepts the same arguments as #backtrace.
289
+ #
290
+ # f = Fiber.new { Fiber.yield }
291
+ # f.resume
292
+ # loc = f.backtrace_locations.first
293
+ # loc.label #=> "yield"
294
+ # loc.path #=> "test.rb"
295
+ # loc.lineno #=> 1
296
+ #
297
+ def backtrace_locations: (?Integer start, ?Integer count) -> Array[Thread::Backtrace::Location]?
298
+ | (Range[Integer]) -> Array[Thread::Backtrace::Location]?
299
+
300
+ # <!--
301
+ # rdoc-file=cont.c
302
+ # - fiber.blocking? -> true or false
303
+ # -->
304
+ # Returns `true` if `fiber` is blocking and `false` otherwise. Fiber is
305
+ # non-blocking if it was created via passing `blocking: false` to Fiber.new, or
306
+ # via Fiber.schedule.
307
+ #
308
+ # Note that, even if the method returns `false`, the fiber behaves differently
309
+ # only if Fiber.scheduler is set in the current thread.
310
+ #
311
+ # See the "Non-blocking fibers" section in class docs for details.
312
+ #
313
+ def blocking?: () -> bool
314
+
315
+ # <!--
316
+ # rdoc-file=cont.c
317
+ # - inspect()
318
+ # -->
319
+ #
320
+ alias inspect to_s
129
321
 
130
322
  # <!--
131
323
  # rdoc-file=cont.c
@@ -147,7 +339,105 @@ class Fiber < Object
147
339
  # parameter is an array of callback information. Exceptions are caught by the
148
340
  # `rescue` clause of `begin...end` blocks.
149
341
  #
150
- def raise: () -> untyped
151
- | (string message) -> untyped
152
- | (_Exception exception, ?string message, ?Array[String] backtrace) -> untyped
342
+ def raise: (?string msg) -> untyped
343
+ | (_Exception, ?string msg, ?Array[string] backtrace) -> untyped
344
+
345
+ # <!--
346
+ # rdoc-file=cont.c
347
+ # - fiber.resume(args, ...) -> obj
348
+ # -->
349
+ # Resumes the fiber from the point at which the last Fiber.yield was called, or
350
+ # starts running it if it is the first call to #resume. Arguments passed to
351
+ # resume will be the value of the Fiber.yield expression or will be passed as
352
+ # block parameters to the fiber's block if this is the first #resume.
353
+ #
354
+ # Alternatively, when resume is called it evaluates to the arguments passed to
355
+ # the next Fiber.yield statement inside the fiber's block or to the block value
356
+ # if it runs to completion without any Fiber.yield
357
+ #
358
+ def resume: (*untyped) -> untyped
359
+
360
+ # <!--
361
+ # rdoc-file=cont.c
362
+ # - to_s()
363
+ # -->
364
+ #
365
+ def to_s: () -> untyped
366
+
367
+ # <!--
368
+ # rdoc-file=cont.c
369
+ # - fiber.transfer(args, ...) -> obj
370
+ # -->
371
+ # Transfer control to another fiber, resuming it from where it last stopped or
372
+ # starting it if it was not resumed before. The calling fiber will be suspended
373
+ # much like in a call to Fiber.yield.
374
+ #
375
+ # The fiber which receives the transfer call treats it much like a resume call.
376
+ # Arguments passed to transfer are treated like those passed to resume.
377
+ #
378
+ # The two style of control passing to and from fiber (one is #resume and
379
+ # Fiber::yield, another is #transfer to and from fiber) can't be freely mixed.
380
+ #
381
+ # * If the Fiber's lifecycle had started with transfer, it will never be able
382
+ # to yield or be resumed control passing, only finish or transfer back. (It
383
+ # still can resume other fibers that are allowed to be resumed.)
384
+ # * If the Fiber's lifecycle had started with resume, it can yield or transfer
385
+ # to another Fiber, but can receive control back only the way compatible
386
+ # with the way it was given away: if it had transferred, it only can be
387
+ # transferred back, and if it had yielded, it only can be resumed back.
388
+ # After that, it again can transfer or yield.
389
+ #
390
+ #
391
+ # If those rules are broken FiberError is raised.
392
+ #
393
+ # For an individual Fiber design, yield/resume is easier to use (the Fiber just
394
+ # gives away control, it doesn't need to think about who the control is given
395
+ # to), while transfer is more flexible for complex cases, allowing to build
396
+ # arbitrary graphs of Fibers dependent on each other.
397
+ #
398
+ # Example:
399
+ #
400
+ # manager = nil # For local var to be visible inside worker block
401
+ #
402
+ # # This fiber would be started with transfer
403
+ # # It can't yield, and can't be resumed
404
+ # worker = Fiber.new { |work|
405
+ # puts "Worker: starts"
406
+ # puts "Worker: Performed #{work.inspect}, transferring back"
407
+ # # Fiber.yield # this would raise FiberError: attempt to yield on a not resumed fiber
408
+ # # manager.resume # this would raise FiberError: attempt to resume a resumed fiber (double resume)
409
+ # manager.transfer(work.capitalize)
410
+ # }
411
+ #
412
+ # # This fiber would be started with resume
413
+ # # It can yield or transfer, and can be transferred
414
+ # # back or resumed
415
+ # manager = Fiber.new {
416
+ # puts "Manager: starts"
417
+ # puts "Manager: transferring 'something' to worker"
418
+ # result = worker.transfer('something')
419
+ # puts "Manager: worker returned #{result.inspect}"
420
+ # # worker.resume # this would raise FiberError: attempt to resume a transferring fiber
421
+ # Fiber.yield # this is OK, the fiber transferred from and to, now it can yield
422
+ # puts "Manager: finished"
423
+ # }
424
+ #
425
+ # puts "Starting the manager"
426
+ # manager.resume
427
+ # puts "Resuming the manager"
428
+ # # manager.transfer # this would raise FiberError: attempt to transfer to a yielding fiber
429
+ # manager.resume
430
+ #
431
+ # *produces*
432
+ #
433
+ # Starting the manager
434
+ # Manager: starts
435
+ # Manager: transferring 'something' to worker
436
+ # Worker: starts
437
+ # Worker: Performed "something", transferring back
438
+ # Manager: worker returned "Something"
439
+ # Resuming the manager
440
+ # Manager: finished
441
+ #
442
+ def transfer: (*untyped) -> untyped
153
443
  end
data/core/float.rbs CHANGED
@@ -1078,6 +1078,8 @@ Float::EPSILON: Float
1078
1078
  #
1079
1079
  Float::INFINITY: Float
1080
1080
 
1081
+ Float::Infinity: Float
1082
+
1081
1083
  # <!-- rdoc-file=numeric.c -->
1082
1084
  # The number of base digits for the `double` data type.
1083
1085
  #
data/core/io.rbs CHANGED
@@ -2383,6 +2383,100 @@ class IO < Object
2383
2383
  #
2384
2384
  def self.popen: (*untyped args) -> untyped
2385
2385
 
2386
+ # <!--
2387
+ # rdoc-file=io.c
2388
+ # - IO.foreach(name, sep=$/ [, getline_args, open_args]) {|line| block } -> nil
2389
+ # - IO.foreach(name, limit [, getline_args, open_args]) {|line| block } -> nil
2390
+ # - IO.foreach(name, sep, limit [, getline_args, open_args]) {|line| block } -> nil
2391
+ # - IO.foreach(...) -> an_enumerator
2392
+ # - File.foreach(name, sep=$/ [, getline_args, open_args]) {|line| block } -> nil
2393
+ # - File.foreach(name, limit [, getline_args, open_args]) {|line| block } -> nil
2394
+ # - File.foreach(name, sep, limit [, getline_args, open_args]) {|line| block } -> nil
2395
+ # - File.foreach(...) -> an_enumerator
2396
+ # -->
2397
+ # Executes the block for every line in the named I/O port, where lines are
2398
+ # separated by *sep*.
2399
+ #
2400
+ # If no block is given, an enumerator is returned instead.
2401
+ #
2402
+ # If `name` starts with a pipe character (`"|"`) and the receiver is the IO
2403
+ # class, a subprocess is created in the same way as Kernel#open, and its output
2404
+ # is returned. Consider to use File.foreach to disable the behavior of
2405
+ # subprocess invocation.
2406
+ #
2407
+ # File.foreach("testfile") {|x| print "GOT ", x }
2408
+ # IO.foreach("| cat testfile") {|x| print "GOT ", x }
2409
+ #
2410
+ # *produces:*
2411
+ #
2412
+ # GOT This is line one
2413
+ # GOT This is line two
2414
+ # GOT This is line three
2415
+ # GOT And so on...
2416
+ #
2417
+ # If the last argument is a hash, it's the keyword argument to open. See
2418
+ # IO.readlines for details about getline_args. And see also IO.read for details
2419
+ # about open_args.
2420
+ #
2421
+ def self.foreach: (string | _ToPath path, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) { (String line) -> void } -> nil
2422
+ | (string | _ToPath path, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> ::Enumerator[String, nil]
2423
+
2424
+ # <!--
2425
+ # rdoc-file=io.c
2426
+ # - IO.pipe -> [read_io, write_io]
2427
+ # - IO.pipe(ext_enc) -> [read_io, write_io]
2428
+ # - IO.pipe("ext_enc:int_enc" [, opt]) -> [read_io, write_io]
2429
+ # - IO.pipe(ext_enc, int_enc [, opt]) -> [read_io, write_io]
2430
+ # - IO.pipe(...) {|read_io, write_io| ... }
2431
+ # -->
2432
+ # Creates a pair of pipe endpoints (connected to each other) and returns them as
2433
+ # a two-element array of IO objects: `[` *read_io*, *write_io* `]`.
2434
+ #
2435
+ # If a block is given, the block is called and returns the value of the block.
2436
+ # *read_io* and *write_io* are sent to the block as arguments. If read_io and
2437
+ # write_io are not closed when the block exits, they are closed. i.e. closing
2438
+ # read_io and/or write_io doesn't cause an error.
2439
+ #
2440
+ # Not available on all platforms.
2441
+ #
2442
+ # If an encoding (encoding name or encoding object) is specified as an optional
2443
+ # argument, read string from pipe is tagged with the encoding specified. If the
2444
+ # argument is a colon separated two encoding names "A:B", the read string is
2445
+ # converted from encoding A (external encoding) to encoding B (internal
2446
+ # encoding), then tagged with B. If two optional arguments are specified, those
2447
+ # must be encoding objects or encoding names, and the first one is the external
2448
+ # encoding, and the second one is the internal encoding. If the external
2449
+ # encoding and the internal encoding is specified, optional hash argument
2450
+ # specify the conversion option.
2451
+ #
2452
+ # In the example below, the two processes close the ends of the pipe that they
2453
+ # are not using. This is not just a cosmetic nicety. The read end of a pipe will
2454
+ # not generate an end of file condition if there are any writers with the pipe
2455
+ # still open. In the case of the parent process, the `rd.read` will never return
2456
+ # if it does not first issue a `wr.close`.
2457
+ #
2458
+ # rd, wr = IO.pipe
2459
+ #
2460
+ # if fork
2461
+ # wr.close
2462
+ # puts "Parent got: <#{rd.read}>"
2463
+ # rd.close
2464
+ # Process.wait
2465
+ # else
2466
+ # rd.close
2467
+ # puts "Sending message to parent"
2468
+ # wr.write "Hi Dad"
2469
+ # wr.close
2470
+ # end
2471
+ #
2472
+ # *produces:*
2473
+ #
2474
+ # Sending message to parent
2475
+ # Parent got: <Hi Dad>
2476
+ #
2477
+ def self.pipe: (?String | Encoding ext_or_ext_int_enc, ?String | Encoding int_enc, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> [IO, IO]
2478
+ | [X] (?String | Encoding ext_or_ext_int_enc, ?String | Encoding int_enc, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) { (IO read_io, IO write_io) -> X } -> X
2479
+
2386
2480
  # <!--
2387
2481
  # rdoc-file=io.c
2388
2482
  # - IO.read(name, [length [, offset]] [, opt]) -> string
@@ -2469,7 +2563,7 @@ class IO < Object
2469
2563
  #
2470
2564
  # See also IO.read for details about `name` and open_args.
2471
2565
  #
2472
- def self.readlines: (String name, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> ::Array[String]
2566
+ def self.readlines: (String | _ToPath name, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> ::Array[String]
2473
2567
 
2474
2568
  # <!--
2475
2569
  # rdoc-file=io.c
data/core/kernel.rbs CHANGED
@@ -2135,7 +2135,7 @@ module Kernel : BasicObject
2135
2135
  # :experimental
2136
2136
  # : Used for experimental features that may change in future releases.
2137
2137
  #
2138
- def self?.warn: (*untyped msg, ?uplevel: Integer | nil) -> NilClass
2138
+ def self?.warn: (*untyped msg, ?uplevel: Integer | nil, ?category: :deprecated | :experimental | nil) -> NilClass
2139
2139
 
2140
2140
  # <!--
2141
2141
  # rdoc-file=process.c