rbs 3.6.1 → 3.9.5

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 (268) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -2
  3. data/.github/workflows/dependabot.yml +1 -1
  4. data/.github/workflows/ruby.yml +34 -10
  5. data/.github/workflows/windows.yml +20 -3
  6. data/.gitignore +1 -0
  7. data/.rubocop.yml +26 -1
  8. data/CHANGELOG.md +241 -0
  9. data/Rakefile +54 -4
  10. data/config.yml +317 -0
  11. data/core/array.rbs +1756 -1591
  12. data/core/basic_object.rbs +38 -35
  13. data/core/comparable.rbs +1 -1
  14. data/core/complex.rbs +166 -94
  15. data/core/data.rbs +2 -2
  16. data/core/dir.rbs +2 -18
  17. data/core/encoding.rbs +12 -32
  18. data/core/enumerable.rbs +270 -266
  19. data/core/enumerator.rbs +14 -4
  20. data/core/env.rbs +1 -1
  21. data/core/errno.rbs +33 -16
  22. data/core/errors.rbs +6 -2
  23. data/core/exception.rbs +342 -167
  24. data/core/fiber.rbs +3 -2
  25. data/core/file.rbs +26 -75
  26. data/core/float.rbs +125 -72
  27. data/core/gc.rbs +158 -42
  28. data/core/hash.rbs +122 -143
  29. data/core/integer.rbs +79 -50
  30. data/core/io/buffer.rbs +49 -43
  31. data/core/io.rbs +108 -151
  32. data/core/kernel.rbs +341 -209
  33. data/core/match_data.rbs +76 -2
  34. data/core/math.rbs +0 -36
  35. data/core/method.rbs +2 -2
  36. data/core/module.rbs +32 -27
  37. data/core/nil_class.rbs +2 -2
  38. data/core/numeric.rbs +101 -104
  39. data/core/object.rbs +1 -5
  40. data/core/object_space/weak_key_map.rbs +3 -4
  41. data/core/object_space.rbs +3 -3
  42. data/core/proc.rbs +82 -14
  43. data/core/process.rbs +110 -58
  44. data/core/ractor.rbs +57 -4
  45. data/core/range.rbs +114 -87
  46. data/core/rational.rbs +0 -2
  47. data/core/rbs/unnamed/argf.rbs +237 -36
  48. data/core/rbs/unnamed/env_class.rbs +35 -53
  49. data/core/rbs/unnamed/random.rbs +1 -2
  50. data/core/regexp.rbs +10 -56
  51. data/core/ruby_vm.rbs +88 -9
  52. data/core/rubygems/config_file.rbs +3 -0
  53. data/core/rubygems/errors.rbs +3 -6
  54. data/core/rubygems/platform.rbs +0 -9
  55. data/core/rubygems/rubygems.rbs +3 -6
  56. data/core/rubygems/version.rbs +8 -8
  57. data/core/set.rbs +4 -16
  58. data/core/string.rbs +271 -264
  59. data/core/struct.rbs +6 -18
  60. data/core/symbol.rbs +14 -21
  61. data/core/thread.rbs +32 -35
  62. data/core/time.rbs +131 -50
  63. data/core/trace_point.rbs +124 -113
  64. data/core/true_class.rbs +0 -1
  65. data/core/unbound_method.rbs +1 -1
  66. data/core/warning.rbs +9 -2
  67. data/docs/architecture.md +1 -1
  68. data/docs/syntax.md +17 -10
  69. data/ext/rbs_extension/extconf.rb +11 -0
  70. data/ext/rbs_extension/location.c +61 -29
  71. data/ext/rbs_extension/location.h +4 -3
  72. data/ext/rbs_extension/main.c +23 -1
  73. data/ext/rbs_extension/parser.c +506 -517
  74. data/ext/rbs_extension/parserstate.c +109 -30
  75. data/ext/rbs_extension/parserstate.h +6 -4
  76. data/ext/rbs_extension/rbs_extension.h +1 -10
  77. data/{ext/rbs_extension → include/rbs}/constants.h +21 -19
  78. data/include/rbs/ruby_objs.h +72 -0
  79. data/include/rbs/util/rbs_constant_pool.h +219 -0
  80. data/include/rbs.h +7 -0
  81. data/lib/rbs/annotate/annotations.rb +3 -3
  82. data/lib/rbs/annotate/rdoc_source.rb +2 -2
  83. data/lib/rbs/ast/declarations.rb +9 -4
  84. data/lib/rbs/ast/directives.rb +10 -0
  85. data/lib/rbs/ast/members.rb +2 -0
  86. data/lib/rbs/ast/type_param.rb +2 -12
  87. data/lib/rbs/cli/diff.rb +3 -3
  88. data/lib/rbs/cli/validate.rb +2 -1
  89. data/lib/rbs/cli.rb +16 -16
  90. data/lib/rbs/collection/config/lockfile_generator.rb +58 -8
  91. data/lib/rbs/collection/config.rb +5 -3
  92. data/lib/rbs/collection/sources/rubygems.rb +1 -1
  93. data/lib/rbs/collection.rb +1 -0
  94. data/lib/rbs/definition.rb +51 -34
  95. data/lib/rbs/definition_builder/ancestor_builder.rb +5 -3
  96. data/lib/rbs/definition_builder.rb +83 -24
  97. data/lib/rbs/environment.rb +33 -18
  98. data/lib/rbs/environment_loader.rb +6 -1
  99. data/lib/rbs/errors.rb +24 -0
  100. data/lib/rbs/locator.rb +2 -0
  101. data/lib/rbs/method_type.rb +2 -0
  102. data/lib/rbs/namespace.rb +1 -0
  103. data/lib/rbs/parser_aux.rb +40 -3
  104. data/lib/rbs/prototype/rb.rb +20 -12
  105. data/lib/rbs/prototype/rbi.rb +11 -6
  106. data/lib/rbs/prototype/runtime/value_object_generator.rb +7 -5
  107. data/lib/rbs/prototype/runtime.rb +7 -5
  108. data/lib/rbs/subtractor.rb +3 -3
  109. data/lib/rbs/test/hook.rb +47 -42
  110. data/lib/rbs/test/type_check.rb +7 -5
  111. data/lib/rbs/type_name.rb +14 -9
  112. data/lib/rbs/types.rb +63 -14
  113. data/lib/rbs/unit_test/spy.rb +4 -2
  114. data/lib/rbs/unit_test/type_assertions.rb +19 -13
  115. data/lib/rbs/unit_test/with_aliases.rb +3 -1
  116. data/lib/rbs/validator.rb +7 -1
  117. data/lib/rbs/version.rb +1 -1
  118. data/lib/rbs/writer.rb +10 -5
  119. data/lib/rbs.rb +1 -0
  120. data/lib/rdoc_plugin/parser.rb +2 -2
  121. data/rbs.gemspec +6 -2
  122. data/sig/ancestor_graph.rbs +5 -5
  123. data/sig/annotate/rdoc_source.rbs +2 -0
  124. data/sig/cli.rbs +2 -0
  125. data/sig/collection/config/lockfile_generator.rbs +9 -1
  126. data/sig/declarations.rbs +10 -3
  127. data/sig/definition.rbs +80 -12
  128. data/sig/definition_builder.rbs +18 -4
  129. data/sig/directives.rbs +17 -1
  130. data/sig/environment.rbs +3 -1
  131. data/sig/errors.rbs +19 -0
  132. data/sig/namespace.rbs +2 -3
  133. data/sig/parser.rbs +5 -1
  134. data/sig/prototype/rb.rbs +1 -1
  135. data/sig/resolver/constant_resolver.rbs +2 -2
  136. data/sig/resolver/context.rbs +1 -1
  137. data/sig/subtractor.rbs +1 -1
  138. data/sig/test/type_check.rbs +2 -2
  139. data/sig/type_alias_dependency.rbs +2 -2
  140. data/sig/type_alias_regularity.rbs +6 -6
  141. data/sig/type_param.rbs +4 -4
  142. data/sig/typename.rbs +8 -5
  143. data/sig/types.rbs +1 -1
  144. data/sig/unit_test/spy.rbs +2 -0
  145. data/sig/unit_test/type_assertions.rbs +2 -0
  146. data/sig/use_map.rbs +1 -1
  147. data/sig/validator.rbs +6 -2
  148. data/sig/vendorer.rbs +1 -1
  149. data/sig/writer.rbs +1 -1
  150. data/{ext/rbs_extension → src}/constants.c +35 -36
  151. data/src/ruby_objs.c +799 -0
  152. data/src/util/rbs_constant_pool.c +342 -0
  153. data/stdlib/base64/0/base64.rbs +0 -9
  154. data/stdlib/benchmark/0/benchmark.rbs +11 -2
  155. data/stdlib/bigdecimal/0/big_decimal.rbs +26 -182
  156. data/stdlib/cgi/0/core.rbs +60 -3
  157. data/stdlib/cgi/0/manifest.yaml +1 -0
  158. data/stdlib/coverage/0/coverage.rbs +0 -3
  159. data/stdlib/csv/0/csv.rbs +18 -58
  160. data/stdlib/csv/0/manifest.yaml +1 -0
  161. data/stdlib/date/0/date.rbs +27 -42
  162. data/stdlib/did_you_mean/0/did_you_mean.rbs +1 -6
  163. data/stdlib/digest/0/digest.rbs +25 -2
  164. data/stdlib/erb/0/erb.rbs +0 -1
  165. data/stdlib/etc/0/etc.rbs +51 -34
  166. data/stdlib/fileutils/0/fileutils.rbs +3 -44
  167. data/stdlib/io-console/0/io-console.rbs +69 -15
  168. data/stdlib/ipaddr/0/ipaddr.rbs +16 -4
  169. data/stdlib/json/0/json.rbs +107 -120
  170. data/stdlib/logger/0/log_device.rbs +1 -1
  171. data/stdlib/logger/0/logger.rbs +3 -18
  172. data/stdlib/minitest/0/kernel.rbs +2 -2
  173. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +4 -1
  174. data/stdlib/minitest/0/minitest/assertion.rbs +1 -0
  175. data/stdlib/minitest/0/minitest/assertions.rbs +58 -13
  176. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +7 -0
  177. data/stdlib/minitest/0/minitest/bench_spec.rbs +8 -8
  178. data/stdlib/minitest/0/minitest/benchmark.rbs +17 -16
  179. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  180. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  181. data/stdlib/minitest/0/minitest/mock.rbs +9 -5
  182. data/stdlib/minitest/0/minitest/parallel/executor.rbs +4 -0
  183. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +0 -1
  184. data/stdlib/minitest/0/minitest/pride_io.rbs +8 -0
  185. data/stdlib/minitest/0/minitest/pride_lol.rbs +2 -0
  186. data/stdlib/minitest/0/minitest/progress_reporter.rbs +1 -1
  187. data/stdlib/minitest/0/minitest/reportable.rbs +2 -0
  188. data/stdlib/minitest/0/minitest/runnable.rbs +33 -1
  189. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +1 -1
  190. data/stdlib/minitest/0/minitest/spec/dsl.rbs +10 -6
  191. data/stdlib/minitest/0/minitest/spec.rbs +1 -1
  192. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +5 -0
  193. data/stdlib/minitest/0/minitest/summary_reporter.rbs +0 -7
  194. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +1 -1
  195. data/stdlib/minitest/0/minitest/test.rbs +7 -14
  196. data/stdlib/minitest/0/minitest/unexpected_error.rbs +2 -0
  197. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  198. data/stdlib/minitest/0/minitest/unit.rbs +1 -2
  199. data/stdlib/minitest/0/minitest.rbs +41 -892
  200. data/stdlib/monitor/0/monitor.rbs +13 -4
  201. data/stdlib/net-http/0/net-http.rbs +42 -109
  202. data/stdlib/nkf/0/nkf.rbs +30 -0
  203. data/stdlib/objspace/0/objspace.rbs +1 -2
  204. data/stdlib/observable/0/observable.rbs +1 -1
  205. data/stdlib/open-uri/0/manifest.yaml +1 -0
  206. data/stdlib/open-uri/0/open-uri.rbs +52 -0
  207. data/stdlib/open3/0/open3.rbs +0 -8
  208. data/stdlib/openssl/0/manifest.yaml +1 -0
  209. data/stdlib/openssl/0/openssl.rbs +235 -143
  210. data/stdlib/optparse/0/optparse.rbs +58 -18
  211. data/stdlib/pathname/0/pathname.rbs +2 -8
  212. data/stdlib/pp/0/pp.rbs +3 -1
  213. data/stdlib/prettyprint/0/prettyprint.rbs +0 -4
  214. data/stdlib/pstore/0/pstore.rbs +0 -6
  215. data/stdlib/psych/0/core_ext.rbs +12 -0
  216. data/stdlib/psych/0/psych.rbs +15 -4
  217. data/stdlib/pty/0/pty.rbs +46 -4
  218. data/stdlib/rdoc/0/code_object.rbs +0 -4
  219. data/stdlib/rdoc/0/markup.rbs +10 -12
  220. data/stdlib/rdoc/0/rdoc.rbs +13 -8
  221. data/stdlib/resolv/0/resolv.rbs +21 -12
  222. data/stdlib/ripper/0/ripper.rbs +0 -2
  223. data/stdlib/securerandom/0/securerandom.rbs +7 -2
  224. data/stdlib/shellwords/0/shellwords.rbs +11 -12
  225. data/stdlib/singleton/0/singleton.rbs +0 -1
  226. data/stdlib/socket/0/addrinfo.rbs +1 -2
  227. data/stdlib/socket/0/basic_socket.rbs +0 -5
  228. data/stdlib/socket/0/socket.rbs +32 -27
  229. data/stdlib/socket/0/tcp_server.rbs +0 -3
  230. data/stdlib/socket/0/tcp_socket.rbs +36 -3
  231. data/stdlib/socket/0/udp_socket.rbs +0 -1
  232. data/stdlib/socket/0/unix_server.rbs +0 -3
  233. data/stdlib/socket/0/unix_socket.rbs +4 -2
  234. data/{core/string_io.rbs → stdlib/stringio/0/stringio.rbs} +1 -1
  235. data/stdlib/strscan/0/string_scanner.rbs +1265 -422
  236. data/stdlib/tempfile/0/tempfile.rbs +135 -28
  237. data/stdlib/time/0/time.rbs +48 -35
  238. data/stdlib/timeout/0/timeout.rbs +11 -8
  239. data/stdlib/tmpdir/0/tmpdir.rbs +10 -3
  240. data/stdlib/tsort/0/tsort.rbs +0 -4
  241. data/stdlib/uri/0/common.rbs +28 -30
  242. data/stdlib/uri/0/ftp.rbs +1 -1
  243. data/stdlib/uri/0/generic.rbs +22 -18
  244. data/stdlib/uri/0/http.rbs +2 -2
  245. data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
  246. data/stdlib/zlib/0/buf_error.rbs +1 -70
  247. data/stdlib/zlib/0/data_error.rbs +1 -70
  248. data/stdlib/zlib/0/deflate.rbs +8 -72
  249. data/stdlib/zlib/0/error.rbs +1 -70
  250. data/stdlib/zlib/0/gzip_file/crc_error.rbs +2 -105
  251. data/stdlib/zlib/0/gzip_file/error.rbs +2 -105
  252. data/stdlib/zlib/0/gzip_file/length_error.rbs +2 -105
  253. data/stdlib/zlib/0/gzip_file/no_footer.rbs +2 -105
  254. data/stdlib/zlib/0/gzip_file.rbs +1 -71
  255. data/stdlib/zlib/0/gzip_reader.rbs +3 -74
  256. data/stdlib/zlib/0/gzip_writer.rbs +1 -70
  257. data/stdlib/zlib/0/inflate.rbs +4 -71
  258. data/stdlib/zlib/0/mem_error.rbs +1 -70
  259. data/stdlib/zlib/0/need_dict.rbs +1 -70
  260. data/stdlib/zlib/0/stream_end.rbs +1 -70
  261. data/stdlib/zlib/0/stream_error.rbs +1 -70
  262. data/stdlib/zlib/0/version_error.rbs +1 -70
  263. data/stdlib/zlib/0/zlib.rbs +0 -2
  264. data/stdlib/zlib/0/zstream.rbs +4 -72
  265. metadata +17 -13
  266. data/ext/rbs_extension/ruby_objs.c +0 -602
  267. data/ext/rbs_extension/ruby_objs.h +0 -51
  268. data/stdlib/minitest/0/manifest.yaml +0 -2
data/core/range.rbs CHANGED
@@ -13,15 +13,13 @@
13
13
  # (1...4).to_a # => [1, 2, 3]
14
14
  # ('a'...'d').to_a # => ["a", "b", "c"]
15
15
  #
16
+ # * Method Range.new:
16
17
  #
17
- # A range may be created using method Range.new:
18
- #
19
- # # Ranges that by default include the given end value.
20
- # Range.new(1, 4).to_a # => [1, 2, 3, 4]
21
- # Range.new('a', 'd').to_a # => ["a", "b", "c", "d"]
22
- # # Ranges that use third argument +exclude_end+ to exclude the given end value.
23
- # Range.new(1, 4, true).to_a # => [1, 2, 3]
24
- # Range.new('a', 'd', true).to_a # => ["a", "b", "c"]
18
+ # # Ranges that by default include the given end value. Range.new(1, 4).to_a
19
+ # # => [1, 2, 3, 4] Range.new('a', 'd').to_a # => ["a", "b", "c", "d"] #
20
+ # Ranges that use third argument `exclude_end` to exclude the given end
21
+ # value. Range.new(1, 4, true).to_a # => [1, 2, 3] Range.new('a', 'd',
22
+ # true).to_a # => ["a", "b", "c"]
25
23
  #
26
24
  # ## Beginless Ranges
27
25
  #
@@ -42,8 +40,12 @@
42
40
  # A beginless range may be used to slice an array:
43
41
  #
44
42
  # a = [1, 2, 3, 4]
45
- # r = (..2) # => nil...2
46
- # a[r] # => [1, 2]
43
+ # # Include the third array element in the slice
44
+ # r = (..2) # => nil..2
45
+ # a[r] # => [1, 2, 3]
46
+ # # Exclude the third array element from the slice
47
+ # r = (...2) # => nil...2
48
+ # a[r] # => [1, 2]
47
49
  #
48
50
  # Method `each` for a beginless range raises an exception.
49
51
  #
@@ -96,8 +98,8 @@
96
98
  # ## Ranges and Other Classes
97
99
  #
98
100
  # An object may be put into a range if its class implements instance method
99
- # `<=>`. Ruby core classes that do so include Array, Complex, File::Stat, Float,
100
- # Integer, Kernel, Module, Numeric, Rational, String, Symbol, and Time.
101
+ # `#<=>`. Ruby core classes that do so include Array, Complex, File::Stat,
102
+ # Float, Integer, Kernel, Module, Numeric, Rational, String, Symbol, and Time.
101
103
  #
102
104
  # Example:
103
105
  #
@@ -117,7 +119,6 @@
117
119
  # * Included from module Enumerable: #each_entry, #each_with_index,
118
120
  # #each_with_object, #each_slice, #each_cons, and #reverse_each.
119
121
  #
120
- #
121
122
  # Example:
122
123
  #
123
124
  # a = []
@@ -127,12 +128,12 @@
127
128
  # ## Ranges and User-Defined Classes
128
129
  #
129
130
  # A user-defined class that is to be used in a range must implement instance
130
- # `<=>`; see Integer#<=>. To make iteration available, it must also implement
131
- # instance method `succ`; see Integer#succ.
131
+ # method `#<=>`; see Integer#<=>. To make iteration available, it must also
132
+ # implement instance method `succ`; see Integer#succ.
132
133
  #
133
- # The class below implements both `<=>` and `succ`, and so can be used both to
134
+ # The class below implements both `#<=>` and `succ`, and so can be used both to
134
135
  # construct ranges and to iterate over them. Note that the Comparable module is
135
- # included so the `==` method is defined in terms of `<=>`.
136
+ # included so the `==` method is defined in terms of `#<=>`.
136
137
  #
137
138
  # # Represent a string of 'X' characters.
138
139
  # class Xs
@@ -168,7 +169,6 @@
168
169
  # * Includes [module Enumerable](rdoc-ref:Enumerable@What-27s+Here), which
169
170
  # provides dozens of additional methods.
170
171
  #
171
- #
172
172
  # Here, class Range provides methods that are useful for:
173
173
  #
174
174
  # * [Creating a Range](rdoc-ref:Range@Methods+for+Creating+a+Range)
@@ -179,12 +179,10 @@
179
179
  # * [Methods for Working with
180
180
  # JSON](rdoc-ref:Range@Methods+for+Working+with+JSON)
181
181
  #
182
- #
183
182
  # ### Methods for Creating a Range
184
183
  #
185
184
  # * ::new: Returns a new range.
186
185
  #
187
- #
188
186
  # ### Methods for Querying
189
187
  #
190
188
  # * #begin: Returns the begin value given for `self`.
@@ -200,7 +198,6 @@
200
198
  # * #minmax: Returns the minimum and maximum values in `self`.
201
199
  # * #size: Returns the count of elements in `self`.
202
200
  #
203
- #
204
201
  # ### Methods for Comparing
205
202
  #
206
203
  # * #==: Returns whether a given object is equal to `self` (uses #==).
@@ -211,7 +208,6 @@
211
208
  # * #include? (aliased as #member?): Returns whether a given object is an
212
209
  # element of `self`.
213
210
  #
214
- #
215
211
  # ### Methods for Iterating
216
212
  #
217
213
  # * #%: Requires argument `n`; calls the block with each `n`-th element of
@@ -220,14 +216,12 @@
220
216
  # * #step: Takes optional argument `n` (defaults to 1); calls the block with
221
217
  # each `n`-th element of `self`.
222
218
  #
223
- #
224
219
  # ### Methods for Converting
225
220
  #
226
221
  # * #inspect: Returns a string representation of `self` (uses #inspect).
227
222
  # * #to_a (aliased as #entries): Returns elements of `self` in an array.
228
223
  # * #to_s: Returns a string representation of `self` (uses #to_s).
229
224
  #
230
- #
231
225
  # ### Methods for Working with JSON
232
226
  #
233
227
  # * ::json_create: Returns a new Range object constructed from the given
@@ -235,7 +229,6 @@
235
229
  # * #as_json: Returns a 2-element hash representing `self`.
236
230
  # * #to_json: Returns a JSON string representing `self`.
237
231
  #
238
- #
239
232
  # To make these methods available:
240
233
  #
241
234
  # require 'json/add/range'
@@ -246,29 +239,24 @@ class Range[out Elem] < Object
246
239
  # <!--
247
240
  # rdoc-file=range.c
248
241
  # - %(n) {|element| ... } -> self
249
- # - %(n) -> enumerator
242
+ # - %(n) -> enumerator or arithmetic_sequence
250
243
  # -->
251
- # Iterates over the elements of `self`.
244
+ # Same as #step (but doesn't provide default value for `n`). The method is
245
+ # convenient for experssive producing of Enumerator::ArithmeticSequence.
252
246
  #
253
- # With a block given, calls the block with selected elements of the range;
254
- # returns `self`:
247
+ # array = [0, 1, 2, 3, 4, 5, 6]
255
248
  #
256
- # a = []
257
- # (1..5).%(2) {|element| a.push(element) } # => 1..5
258
- # a # => [1, 3, 5]
259
- # a = []
260
- # ('a'..'e').%(2) {|element| a.push(element) } # => "a".."e"
261
- # a # => ["a", "c", "e"]
262
- #
263
- # With no block given, returns an enumerator, which will be of class
264
- # Enumerator::ArithmeticSequence if `self` is numeric; otherwise of class
265
- # Enumerator:
249
+ # # slice each second element:
250
+ # seq = (0..) % 2 #=> ((0..).%(2))
251
+ # array[seq] #=> [0, 2, 4, 6]
252
+ # # or just
253
+ # array[(0..) % 2] #=> [0, 2, 4, 6]
266
254
  #
267
- # e = (1..5) % 2 # => ((1..5).%(2))
268
- # e.class # => Enumerator::ArithmeticSequence
269
- # ('a'..'e') % 2 # => #<Enumerator: ...>
255
+ # Note that due to operator precedence in Ruby, parentheses are mandatory around
256
+ # range in this case:
270
257
  #
271
- # Related: Range#step.
258
+ # (0..7) % 2 #=> ((0..7).%(2)) -- as expected
259
+ # 0..7 % 2 #=> 0..1 -- parsed as 0..(7 % 2)
272
260
  #
273
261
  def %: (Numeric | int n) -> Enumerator[Elem, self]
274
262
  | (Numeric | int n) { (Elem element) -> void } -> self
@@ -284,7 +272,6 @@ class Range[out Elem] < Object
284
272
  # * `other.end == self.end`.
285
273
  # * `other.exclude_end? == self.exclude_end?`.
286
274
  #
287
- #
288
275
  # Otherwise returns `false`.
289
276
  #
290
277
  # r = (1..5)
@@ -447,10 +434,9 @@ class Range[out Elem] < Object
447
434
  # Returns `false` if either:
448
435
  #
449
436
  # * The begin value of `self` is larger than its end value.
450
- # * An internal call to `<=>` returns `nil`; that is, the operands are not
437
+ # * An internal call to `#<=>` returns `nil`; that is, the operands are not
451
438
  # comparable.
452
439
  #
453
- #
454
440
  # Beginless ranges cover all values of the same type before the end, excluding
455
441
  # the end for exclusive ranges. Beginless ranges cover ranges that end before
456
442
  # the end of the beginless range, or at the end of the beginless range for
@@ -682,7 +668,7 @@ class Range[out Elem] < Object
682
668
  # - max {|a, b| ... } -> object
683
669
  # - max(n) {|a, b| ... } -> array
684
670
  # -->
685
- # Returns the maximum value in `self`, using method `<=>` or a given block for
671
+ # Returns the maximum value in `self`, using method `#<=>` or a given block for
686
672
  # comparison.
687
673
  #
688
674
  # With no argument and no block given, returns the maximum-valued element of
@@ -706,7 +692,6 @@ class Range[out Elem] < Object
706
692
  # * Then, sequentially, with the so-far maximum value and the next element of
707
693
  # `self`.
708
694
  #
709
- #
710
695
  # To illustrate:
711
696
  #
712
697
  # (1..4).max {|a, b| p [a, b]; a <=> b } # => 4
@@ -749,13 +734,11 @@ class Range[out Elem] < Object
749
734
  # (1...1).max {|a, b| -(a <=> b) } # => nil
750
735
  # (1...1).max(2) {|a, b| -(a <=> b) } # => []
751
736
  #
752
- #
753
737
  # Raises an exception if either:
754
738
  #
755
739
  # * `self` is a endless range: `(1..)`.
756
740
  # * A block is given and `self` is a beginless range.
757
741
  #
758
- #
759
742
  # Related: Range#min, Range#minmax.
760
743
  #
761
744
  def max: () -> Elem
@@ -770,7 +753,7 @@ class Range[out Elem] < Object
770
753
  # - min {|a, b| ... } -> object
771
754
  # - min(n) {|a, b| ... } -> array
772
755
  # -->
773
- # Returns the minimum value in `self`, using method `<=>` or a given block for
756
+ # Returns the minimum value in `self`, using method `#<=>` or a given block for
774
757
  # comparison.
775
758
  #
776
759
  # With no argument and no block given, returns the minimum-valued element of
@@ -794,7 +777,6 @@ class Range[out Elem] < Object
794
777
  # * Then, sequentially, with the so-far minimum value and the next element of
795
778
  # `self`.
796
779
  #
797
- #
798
780
  # To illustrate:
799
781
  #
800
782
  # (1..4).min {|a, b| p [a, b]; a <=> b } # => 1
@@ -837,13 +819,11 @@ class Range[out Elem] < Object
837
819
  # (1...1).min {|a, b| -(a <=> b) } # => nil
838
820
  # (1...1).min(2) {|a, b| -(a <=> b) } # => []
839
821
  #
840
- #
841
822
  # Raises an exception if either:
842
823
  #
843
824
  # * `self` is a beginless range: `(..4)`.
844
825
  # * A block is given and `self` is an endless range.
845
826
  #
846
- #
847
827
  # Related: Range#max, Range#minmax.
848
828
  #
849
829
  def min: () -> Elem
@@ -865,7 +845,7 @@ class Range[out Elem] < Object
865
845
  #
866
846
  # (1..3).overlap?(1) # TypeError
867
847
  #
868
- # Returns `false` if an internal call to `<=>` returns `nil`; that is, the
848
+ # Returns `false` if an internal call to `#<=>` returns `nil`; that is, the
869
849
  # operands are not comparable.
870
850
  #
871
851
  # (1..3).overlap?('a'..'d') # => false
@@ -947,7 +927,12 @@ class Range[out Elem] < Object
947
927
  # (1..4).size # => 4
948
928
  # (1...4).size # => 3
949
929
  # (1..).size # => Infinity
950
- # ('a'..'z').size #=> nil
930
+ # ('a'..'z').size # => nil
931
+ #
932
+ # If `self` is not iterable, raises an exception:
933
+ #
934
+ # (0.5..2.5).size # TypeError
935
+ # (..1).size # TypeError
951
936
  #
952
937
  # Related: Range#count.
953
938
  #
@@ -956,43 +941,86 @@ class Range[out Elem] < Object
956
941
 
957
942
  # <!--
958
943
  # rdoc-file=range.c
959
- # - step(n = 1) {|element| ... } -> self
960
- # - step(n = 1) -> enumerator
944
+ # - step(s = 1) {|element| ... } -> self
945
+ # - step(s = 1) -> enumerator/arithmetic_sequence
961
946
  # -->
962
- # Iterates over the elements of `self`.
947
+ # Iterates over the elements of range in steps of `s`. The iteration is
948
+ # performed by `+` operator:
963
949
  #
964
- # With a block given and no argument, calls the block each element of the range;
965
- # returns `self`:
950
+ # (0..6).step(2) { puts _1 } #=> 1..5
951
+ # # Prints: 0, 2, 4, 6
966
952
  #
967
- # a = []
968
- # (1..5).step {|element| a.push(element) } # => 1..5
969
- # a # => [1, 2, 3, 4, 5]
970
- # a = []
971
- # ('a'..'e').step {|element| a.push(element) } # => "a".."e"
972
- # a # => ["a", "b", "c", "d", "e"]
953
+ # # Iterate between two dates in step of 1 day (24 hours)
954
+ # (Time.utc(2022, 2, 24)..Time.utc(2022, 3, 1)).step(24*60*60) { puts _1 }
955
+ # # Prints:
956
+ # # 2022-02-24 00:00:00 UTC
957
+ # # 2022-02-25 00:00:00 UTC
958
+ # # 2022-02-26 00:00:00 UTC
959
+ # # 2022-02-27 00:00:00 UTC
960
+ # # 2022-02-28 00:00:00 UTC
961
+ # # 2022-03-01 00:00:00 UTC
973
962
  #
974
- # With a block given and a positive integer argument `n` given, calls the block
975
- # with element `0`, element `n`, element `2n`, and so on:
963
+ # If ` + step` decreases the value, iteration is still performed when step
964
+ # `begin` is higher than the `end`:
976
965
  #
977
- # a = []
978
- # (1..5).step(2) {|element| a.push(element) } # => 1..5
979
- # a # => [1, 3, 5]
980
- # a = []
981
- # ('a'..'e').step(2) {|element| a.push(element) } # => "a".."e"
982
- # a # => ["a", "c", "e"]
966
+ # (0..6).step(-2) { puts _1 }
967
+ # # Prints nothing
968
+ #
969
+ # (6..0).step(-2) { puts _1 }
970
+ # # Prints: 6, 4, 2, 0
971
+ #
972
+ # (Time.utc(2022, 3, 1)..Time.utc(2022, 2, 24)).step(-24*60*60) { puts _1 }
973
+ # # Prints:
974
+ # # 2022-03-01 00:00:00 UTC
975
+ # # 2022-02-28 00:00:00 UTC
976
+ # # 2022-02-27 00:00:00 UTC
977
+ # # 2022-02-26 00:00:00 UTC
978
+ # # 2022-02-25 00:00:00 UTC
979
+ # # 2022-02-24 00:00:00 UTC
980
+ #
981
+ # When the block is not provided, and range boundaries and step are Numeric, the
982
+ # method returns Enumerator::ArithmeticSequence.
983
983
  #
984
- # With no block given, returns an enumerator, which will be of class
985
- # Enumerator::ArithmeticSequence if `self` is numeric; otherwise of class
986
- # Enumerator:
984
+ # (1..5).step(2) # => ((1..5).step(2))
985
+ # (1.0..).step(1.5) #=> ((1.0..).step(1.5))
986
+ # (..3r).step(1/3r) #=> ((..3/1).step((1/3)))
987
987
  #
988
- # e = (1..5).step(2) # => ((1..5).step(2))
989
- # e.class # => Enumerator::ArithmeticSequence
990
- # ('a'..'e').step # => #<Enumerator: ...>
988
+ # Enumerator::ArithmeticSequence can be further used as a value object for
989
+ # iteration or slicing of collections (see Array#[]). There is a convenience
990
+ # method #% with behavior similar to `step` to produce arithmetic sequences more
991
+ # expressively:
991
992
  #
992
- # Related: Range#%.
993
+ # # Same as (1..5).step(2)
994
+ # (1..5) % 2 # => ((1..5).%(2))
993
995
  #
994
- def step: (?Numeric | int n) -> Enumerator[Elem, self]
995
- | (?Numeric | int n) { (Elem element) -> void } -> self
996
+ # In a generic case, when the block is not provided, Enumerator is returned:
997
+ #
998
+ # ('a'..).step('b') #=> #<Enumerator: "a"..:step("b")>
999
+ # ('a'..).step('b').take(3) #=> ["a", "ab", "abb"]
1000
+ #
1001
+ # If `s` is not provided, it is considered `1` for ranges with numeric `begin`:
1002
+ #
1003
+ # (1..5).step { p _1 }
1004
+ # # Prints: 1, 2, 3, 4, 5
1005
+ #
1006
+ # For non-Numeric ranges, step absence is an error:
1007
+ #
1008
+ # (Time.utc(2022, 3, 1)..Time.utc(2022, 2, 24)).step { p _1 }
1009
+ # # raises: step is required for non-numeric ranges (ArgumentError)
1010
+ #
1011
+ # For backward compatibility reasons, String ranges support the iteration both
1012
+ # with string step and with integer step. In the latter case, the iteration is
1013
+ # performed by calculating the next values with String#succ:
1014
+ #
1015
+ # ('a'..'e').step(2) { p _1 }
1016
+ # # Prints: a, c, e
1017
+ # ('a'..'e').step { p _1 }
1018
+ # # Default step 1; prints: a, b, c, d, e
1019
+ #
1020
+ def step: (?Numeric | int) -> Enumerator[Elem, self]
1021
+ | (?Numeric | int) { (Elem element) -> void } -> self
1022
+ | (untyped) -> Enumerator[Elem, self]
1023
+ | (untyped) { (Elem element) -> void } -> self
996
1024
 
997
1025
  # <!--
998
1026
  # rdoc-file=range.c
@@ -1022,11 +1050,10 @@ class Range[out Elem] < Object
1022
1050
  # Returns `true` if and only if:
1023
1051
  #
1024
1052
  # * `other` is a range.
1025
- # * `other.begin eql? self.begin`.
1026
- # * `other.end eql? self.end`.
1053
+ # * `other.begin.eql?(self.begin)`.
1054
+ # * `other.end.eql?(self.end)`.
1027
1055
  # * `other.exclude_end? == self.exclude_end?`.
1028
1056
  #
1029
- #
1030
1057
  # Otherwise returns `false`.
1031
1058
  #
1032
1059
  # r = (1..5)
data/core/rational.rbs CHANGED
@@ -7,12 +7,10 @@
7
7
  #
8
8
  # * A [rational literal](rdoc-ref:syntax/literals.rdoc@Rational+Literals).
9
9
  #
10
- #
11
10
  # You can convert certain objects to Rationals with:
12
11
  #
13
12
  # * Method #Rational.
14
13
  #
15
- #
16
14
  # Examples
17
15
  #
18
16
  # Rational(1) #=> (1/1)