rbs 2.8.4 → 3.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (434) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +12 -4
  3. data/.github/workflows/comments.yml +11 -11
  4. data/.github/workflows/dependabot.yml +30 -0
  5. data/.github/workflows/ruby.yml +40 -49
  6. data/.github/workflows/typecheck.yml +36 -0
  7. data/.github/workflows/windows.yml +28 -0
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +42 -2
  10. data/CHANGELOG.md +845 -1
  11. data/README.md +64 -4
  12. data/Rakefile +198 -18
  13. data/Steepfile +11 -11
  14. data/config.yml +311 -0
  15. data/core/array.rbs +2189 -1914
  16. data/core/basic_object.rbs +59 -84
  17. data/core/binding.rbs +7 -69
  18. data/core/builtin.rbs +210 -11
  19. data/core/class.rbs +37 -0
  20. data/core/comparable.rbs +23 -25
  21. data/core/complex.rbs +449 -227
  22. data/core/constants.rbs +29 -21
  23. data/core/data.rbs +415 -0
  24. data/core/dir.rbs +698 -415
  25. data/core/encoding.rbs +468 -843
  26. data/core/enumerable.rbs +495 -455
  27. data/core/enumerator/product.rbs +92 -0
  28. data/core/enumerator.rbs +106 -9
  29. data/core/env.rbs +1 -1
  30. data/core/errno.rbs +506 -605
  31. data/core/errors.rbs +15 -17
  32. data/core/exception.rbs +361 -145
  33. data/core/false_class.rbs +39 -26
  34. data/core/fiber.rbs +121 -14
  35. data/core/file.rbs +1262 -320
  36. data/core/file_test.rbs +62 -45
  37. data/core/float.rbs +187 -208
  38. data/core/gc.rbs +446 -196
  39. data/core/global_variables.rbs +29 -29
  40. data/core/hash.rbs +242 -349
  41. data/core/integer.rbs +246 -308
  42. data/core/io/buffer.rbs +373 -122
  43. data/core/io/wait.rbs +29 -17
  44. data/core/io.rbs +1881 -1518
  45. data/core/kernel.rbs +2116 -1538
  46. data/core/marshal.rbs +24 -14
  47. data/core/match_data.rbs +413 -166
  48. data/core/math.rbs +531 -291
  49. data/core/method.rbs +101 -32
  50. data/core/module.rbs +228 -64
  51. data/core/nil_class.rbs +106 -47
  52. data/core/numeric.rbs +206 -292
  53. data/core/object.rbs +73 -1168
  54. data/core/object_space/weak_key_map.rbs +166 -0
  55. data/core/object_space.rbs +5 -3
  56. data/core/proc.rbs +280 -39
  57. data/core/process.rbs +1318 -658
  58. data/core/ractor.rbs +200 -134
  59. data/core/random.rbs +21 -4
  60. data/core/range.rbs +309 -153
  61. data/core/rational.rbs +4 -12
  62. data/core/rb_config.rbs +64 -43
  63. data/core/rbs/unnamed/argf.rbs +411 -147
  64. data/core/rbs/unnamed/env_class.rbs +137 -253
  65. data/core/rbs/unnamed/random.rbs +49 -26
  66. data/core/refinement.rbs +16 -1
  67. data/core/regexp.rbs +1568 -862
  68. data/core/ruby_vm.rbs +719 -7
  69. data/core/rubygems/config_file.rbs +3 -0
  70. data/core/rubygems/errors.rbs +69 -6
  71. data/core/rubygems/rubygems.rbs +71 -17
  72. data/core/rubygems/version.rbs +11 -7
  73. data/{stdlib/set/0 → core}/set.rbs +80 -91
  74. data/core/signal.rbs +14 -8
  75. data/core/string.rbs +1732 -1607
  76. data/core/struct.rbs +467 -95
  77. data/core/symbol.rbs +215 -245
  78. data/core/thread.rbs +133 -89
  79. data/core/thread_group.rbs +9 -9
  80. data/core/time.rbs +1141 -841
  81. data/core/trace_point.rbs +181 -121
  82. data/core/true_class.rbs +58 -32
  83. data/core/unbound_method.rbs +103 -30
  84. data/core/warning.rbs +50 -5
  85. data/docs/CONTRIBUTING.md +1 -1
  86. data/docs/architecture.md +110 -0
  87. data/docs/collection.md +59 -5
  88. data/docs/data_and_struct.md +86 -0
  89. data/docs/gem.md +57 -0
  90. data/docs/rbs_by_example.md +16 -35
  91. data/docs/repo.md +1 -1
  92. data/docs/sigs.md +7 -7
  93. data/docs/stdlib.md +63 -5
  94. data/docs/syntax.md +255 -61
  95. data/docs/tools.md +1 -0
  96. data/ext/rbs_extension/extconf.rb +10 -0
  97. data/ext/rbs_extension/lexer.c +1741 -1548
  98. data/ext/rbs_extension/lexer.h +11 -1
  99. data/ext/rbs_extension/lexer.re +12 -6
  100. data/ext/rbs_extension/lexstate.c +26 -3
  101. data/ext/rbs_extension/location.c +119 -111
  102. data/ext/rbs_extension/location.h +32 -7
  103. data/ext/rbs_extension/main.c +3 -0
  104. data/ext/rbs_extension/parser.c +883 -481
  105. data/ext/rbs_extension/parserstate.c +65 -25
  106. data/ext/rbs_extension/parserstate.h +13 -3
  107. data/ext/rbs_extension/rbs_extension.h +1 -10
  108. data/ext/rbs_extension/unescape.c +7 -47
  109. data/goodcheck.yml +2 -2
  110. data/{ext/rbs_extension → include/rbs}/constants.h +26 -15
  111. data/include/rbs/ruby_objs.h +72 -0
  112. data/include/rbs.h +7 -0
  113. data/lib/rbs/annotate/annotations.rb +3 -3
  114. data/lib/rbs/annotate/formatter.rb +13 -3
  115. data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
  116. data/lib/rbs/annotate/rdoc_source.rb +12 -3
  117. data/lib/rbs/ast/declarations.rb +85 -2
  118. data/lib/rbs/ast/directives.rb +39 -0
  119. data/lib/rbs/ast/members.rb +49 -15
  120. data/lib/rbs/ast/type_param.rb +104 -15
  121. data/lib/rbs/ast/visitor.rb +137 -0
  122. data/lib/rbs/buffer.rb +5 -0
  123. data/lib/rbs/cli/colored_io.rb +48 -0
  124. data/lib/rbs/cli/diff.rb +83 -0
  125. data/lib/rbs/cli/validate.rb +356 -0
  126. data/lib/rbs/cli.rb +253 -143
  127. data/lib/rbs/collection/cleaner.rb +8 -1
  128. data/lib/rbs/collection/config/lockfile.rb +92 -0
  129. data/lib/rbs/collection/config/lockfile_generator.rb +154 -65
  130. data/lib/rbs/collection/config.rb +19 -46
  131. data/lib/rbs/collection/installer.rb +12 -13
  132. data/lib/rbs/collection/sources/base.rb +2 -2
  133. data/lib/rbs/collection/sources/git.rb +146 -69
  134. data/lib/rbs/collection/sources/local.rb +81 -0
  135. data/lib/rbs/collection/sources/rubygems.rb +10 -12
  136. data/lib/rbs/collection/sources/stdlib.rb +14 -13
  137. data/lib/rbs/collection/sources.rb +15 -2
  138. data/lib/rbs/collection.rb +2 -1
  139. data/lib/rbs/definition.rb +13 -16
  140. data/lib/rbs/definition_builder/ancestor_builder.rb +100 -24
  141. data/lib/rbs/definition_builder/method_builder.rb +4 -4
  142. data/lib/rbs/definition_builder.rb +489 -584
  143. data/lib/rbs/diff.rb +125 -0
  144. data/lib/rbs/environment/use_map.rb +77 -0
  145. data/lib/rbs/environment.rb +406 -105
  146. data/lib/rbs/environment_loader.rb +48 -44
  147. data/lib/rbs/environment_walker.rb +1 -1
  148. data/lib/rbs/errors.rb +175 -56
  149. data/lib/rbs/file_finder.rb +28 -0
  150. data/lib/rbs/location_aux.rb +8 -7
  151. data/lib/rbs/locator.rb +37 -15
  152. data/lib/rbs/method_type.rb +23 -0
  153. data/lib/rbs/namespace.rb +1 -0
  154. data/lib/rbs/parser/lex_result.rb +15 -0
  155. data/lib/rbs/parser/token.rb +23 -0
  156. data/lib/rbs/parser_aux.rb +22 -13
  157. data/lib/rbs/prototype/helpers.rb +48 -22
  158. data/lib/rbs/prototype/node_usage.rb +99 -0
  159. data/lib/rbs/prototype/rb.rb +125 -31
  160. data/lib/rbs/prototype/rbi.rb +49 -36
  161. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  162. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  163. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  164. data/lib/rbs/prototype/runtime.rb +273 -159
  165. data/lib/rbs/resolver/constant_resolver.rb +24 -8
  166. data/lib/rbs/resolver/type_name_resolver.rb +41 -7
  167. data/lib/rbs/sorter.rb +153 -123
  168. data/lib/rbs/substitution.rb +19 -0
  169. data/lib/rbs/subtractor.rb +201 -0
  170. data/lib/rbs/test/errors.rb +24 -11
  171. data/lib/rbs/test/guaranteed.rb +30 -0
  172. data/lib/rbs/test/hook.rb +45 -40
  173. data/lib/rbs/test/setup.rb +1 -1
  174. data/lib/rbs/test/tester.rb +1 -1
  175. data/lib/rbs/test/type_check.rb +120 -23
  176. data/lib/rbs/test.rb +6 -3
  177. data/lib/rbs/type_alias_dependency.rb +13 -3
  178. data/lib/rbs/type_alias_regularity.rb +21 -14
  179. data/lib/rbs/type_name.rb +18 -13
  180. data/lib/rbs/types.rb +352 -18
  181. data/lib/rbs/unit_test/convertibles.rb +176 -0
  182. data/lib/rbs/unit_test/spy.rb +136 -0
  183. data/lib/rbs/unit_test/type_assertions.rb +341 -0
  184. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  185. data/lib/rbs/unit_test.rb +6 -0
  186. data/lib/rbs/validator.rb +55 -30
  187. data/lib/rbs/variance_calculator.rb +26 -23
  188. data/lib/rbs/vendorer.rb +3 -3
  189. data/lib/rbs/version.rb +1 -1
  190. data/lib/rbs/writer.rb +69 -22
  191. data/lib/rbs.rb +7 -2
  192. data/lib/rdoc/discover.rb +1 -1
  193. data/lib/rdoc_plugin/parser.rb +5 -5
  194. data/rbs.gemspec +12 -2
  195. data/schema/decls.json +1 -1
  196. data/schema/members.json +15 -10
  197. data/sig/ancestor_builder.rbs +4 -0
  198. data/sig/ancestor_graph.rbs +22 -2
  199. data/sig/annotate/formatter.rbs +2 -2
  200. data/sig/annotate/rdoc_annotater.rbs +1 -1
  201. data/sig/cli/colored_io.rbs +15 -0
  202. data/sig/cli/diff.rbs +21 -0
  203. data/sig/cli/validate.rbs +43 -0
  204. data/sig/cli.rbs +4 -0
  205. data/sig/collection/config/lockfile.rbs +74 -0
  206. data/sig/collection/config/lockfile_generator.rbs +66 -0
  207. data/sig/collection/config.rbs +5 -48
  208. data/sig/collection/installer.rbs +1 -1
  209. data/sig/collection/sources.rbs +105 -33
  210. data/sig/constant.rbs +1 -1
  211. data/sig/declarations.rbs +42 -3
  212. data/sig/definition.rbs +26 -10
  213. data/sig/definition_builder.rbs +103 -81
  214. data/sig/diff.rbs +28 -0
  215. data/sig/directives.rbs +61 -0
  216. data/sig/environment.rbs +175 -29
  217. data/sig/environment_loader.rbs +20 -18
  218. data/sig/errors.rbs +123 -2
  219. data/sig/file_finder.rbs +28 -0
  220. data/sig/location.rbs +0 -3
  221. data/sig/locator.rbs +14 -2
  222. data/sig/manifest.yaml +0 -1
  223. data/sig/members.rbs +32 -9
  224. data/sig/method_types.rbs +10 -4
  225. data/sig/namespace.rbs +2 -3
  226. data/sig/parser.rbs +55 -16
  227. data/sig/prototype/helpers.rbs +4 -0
  228. data/sig/prototype/node_usage.rbs +20 -0
  229. data/sig/prototype/rb.rbs +10 -2
  230. data/sig/prototype/rbi.rbs +2 -0
  231. data/sig/prototype/runtime.rbs +182 -0
  232. data/sig/rbs.rbs +1 -1
  233. data/sig/rdoc/rbs.rbs +4 -0
  234. data/sig/repository.rbs +7 -5
  235. data/sig/resolver/constant_resolver.rbs +3 -4
  236. data/sig/resolver/context.rbs +1 -1
  237. data/sig/resolver/type_name_resolver.rbs +5 -1
  238. data/sig/shims/bundler.rbs +38 -0
  239. data/sig/shims/rubygems.rbs +19 -0
  240. data/sig/sorter.rbs +23 -5
  241. data/sig/substitution.rbs +6 -0
  242. data/sig/subtractor.rbs +37 -0
  243. data/sig/test/errors.rbs +52 -0
  244. data/sig/test/guranteed.rbs +9 -0
  245. data/sig/test/type_check.rbs +19 -0
  246. data/sig/test.rbs +82 -0
  247. data/sig/type_alias_dependency.rbs +31 -0
  248. data/sig/type_alias_regularity.rbs +12 -6
  249. data/sig/type_param.rbs +45 -9
  250. data/sig/typename.rbs +8 -5
  251. data/sig/types.rbs +119 -12
  252. data/sig/unit_test/convertibles.rbs +154 -0
  253. data/sig/unit_test/spy.rbs +28 -0
  254. data/sig/unit_test/type_assertions.rbs +194 -0
  255. data/sig/unit_test/with_aliases.rbs +136 -0
  256. data/sig/use_map.rbs +35 -0
  257. data/sig/validator.rbs +12 -5
  258. data/sig/variance_calculator.rbs +3 -1
  259. data/sig/vendorer.rbs +1 -1
  260. data/sig/visitor.rbs +47 -0
  261. data/sig/writer.rbs +6 -2
  262. data/src/constants.c +153 -0
  263. data/src/ruby_objs.c +793 -0
  264. data/stdlib/base64/0/base64.rbs +298 -45
  265. data/stdlib/benchmark/0/benchmark.rbs +12 -3
  266. data/stdlib/bigdecimal/0/big_decimal.rbs +62 -198
  267. data/stdlib/cgi/0/core.rbs +68 -15
  268. data/stdlib/cgi/0/manifest.yaml +1 -0
  269. data/stdlib/coverage/0/coverage.rbs +50 -11
  270. data/stdlib/csv/0/csv.rbs +90 -119
  271. data/stdlib/csv/0/manifest.yaml +1 -0
  272. data/stdlib/date/0/date.rbs +806 -735
  273. data/stdlib/date/0/date_time.rbs +70 -211
  274. data/stdlib/dbm/0/dbm.rbs +0 -2
  275. data/stdlib/delegate/0/delegator.rbs +184 -0
  276. data/stdlib/delegate/0/kernel.rbs +47 -0
  277. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  278. data/stdlib/did_you_mean/0/did_you_mean.rbs +3 -8
  279. data/stdlib/digest/0/digest.rbs +48 -35
  280. data/stdlib/erb/0/erb.rbs +15 -39
  281. data/stdlib/etc/0/etc.rbs +174 -54
  282. data/stdlib/fileutils/0/fileutils.rbs +1234 -385
  283. data/stdlib/forwardable/0/forwardable.rbs +4 -4
  284. data/stdlib/io-console/0/io-console.rbs +82 -17
  285. data/stdlib/ipaddr/0/ipaddr.rbs +11 -6
  286. data/stdlib/json/0/json.rbs +434 -151
  287. data/stdlib/kconv/0/kconv.rbs +166 -0
  288. data/stdlib/logger/0/formatter.rbs +0 -2
  289. data/stdlib/logger/0/log_device.rbs +1 -3
  290. data/stdlib/logger/0/logger.rbs +465 -328
  291. data/stdlib/minitest/0/kernel.rbs +2 -2
  292. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +4 -1
  293. data/stdlib/minitest/0/minitest/assertion.rbs +1 -0
  294. data/stdlib/minitest/0/minitest/assertions.rbs +58 -13
  295. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +7 -0
  296. data/stdlib/minitest/0/minitest/bench_spec.rbs +8 -8
  297. data/stdlib/minitest/0/minitest/benchmark.rbs +17 -16
  298. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  299. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  300. data/stdlib/minitest/0/minitest/mock.rbs +9 -5
  301. data/stdlib/minitest/0/minitest/parallel/executor.rbs +4 -0
  302. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +0 -1
  303. data/stdlib/minitest/0/minitest/pride_io.rbs +8 -0
  304. data/stdlib/minitest/0/minitest/pride_lol.rbs +2 -0
  305. data/stdlib/minitest/0/minitest/progress_reporter.rbs +1 -1
  306. data/stdlib/minitest/0/minitest/reportable.rbs +2 -0
  307. data/stdlib/minitest/0/minitest/runnable.rbs +33 -1
  308. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +1 -1
  309. data/stdlib/minitest/0/minitest/spec/dsl.rbs +10 -6
  310. data/stdlib/minitest/0/minitest/spec.rbs +1 -1
  311. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +5 -0
  312. data/stdlib/minitest/0/minitest/summary_reporter.rbs +0 -7
  313. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +7 -7
  314. data/stdlib/minitest/0/minitest/test.rbs +7 -14
  315. data/stdlib/minitest/0/minitest/unexpected_error.rbs +2 -0
  316. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  317. data/stdlib/minitest/0/minitest/unit.rbs +1 -2
  318. data/stdlib/minitest/0/minitest.rbs +41 -892
  319. data/stdlib/monitor/0/monitor.rbs +91 -10
  320. data/stdlib/mutex_m/0/mutex_m.rbs +0 -2
  321. data/stdlib/net-http/0/manifest.yaml +1 -1
  322. data/stdlib/net-http/0/net-http.rbs +3858 -964
  323. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  324. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  325. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  326. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  327. data/stdlib/nkf/0/nkf.rbs +35 -5
  328. data/stdlib/objspace/0/objspace.rbs +40 -18
  329. data/stdlib/observable/0/observable.rbs +217 -0
  330. data/stdlib/open-uri/0/manifest.yaml +4 -0
  331. data/stdlib/open-uri/0/open-uri.rbs +393 -0
  332. data/stdlib/open3/0/open3.rbs +147 -0
  333. data/stdlib/openssl/0/manifest.yaml +1 -0
  334. data/stdlib/openssl/0/openssl.rbs +681 -316
  335. data/stdlib/optparse/0/optparse.rbs +100 -65
  336. data/stdlib/pathname/0/pathname.rbs +24 -15
  337. data/stdlib/pp/0/manifest.yaml +2 -0
  338. data/stdlib/pp/0/pp.rbs +300 -0
  339. data/stdlib/prettyprint/0/prettyprint.rbs +2 -6
  340. data/stdlib/pstore/0/pstore.rbs +370 -156
  341. data/stdlib/psych/0/core_ext.rbs +12 -0
  342. data/stdlib/{yaml → psych}/0/dbm.rbs +3 -3
  343. data/stdlib/psych/0/manifest.yaml +3 -0
  344. data/stdlib/psych/0/psych.rbs +402 -0
  345. data/stdlib/{yaml → psych}/0/store.rbs +2 -2
  346. data/stdlib/pty/0/pty.rbs +63 -11
  347. data/stdlib/rdoc/0/code_object.rbs +51 -0
  348. data/stdlib/rdoc/0/comment.rbs +59 -0
  349. data/stdlib/rdoc/0/context.rbs +153 -0
  350. data/stdlib/rdoc/0/markup.rbs +117 -0
  351. data/stdlib/rdoc/0/parser.rbs +56 -0
  352. data/stdlib/rdoc/0/rdoc.rbs +13 -380
  353. data/stdlib/rdoc/0/ri.rbs +17 -0
  354. data/stdlib/rdoc/0/store.rbs +48 -0
  355. data/stdlib/rdoc/0/top_level.rbs +97 -0
  356. data/stdlib/resolv/0/resolv.rbs +16 -79
  357. data/stdlib/ripper/0/ripper.rbs +1648 -0
  358. data/stdlib/securerandom/0/securerandom.rbs +7 -2
  359. data/stdlib/shellwords/0/shellwords.rbs +11 -12
  360. data/stdlib/singleton/0/singleton.rbs +0 -3
  361. data/stdlib/socket/0/addrinfo.rbs +13 -18
  362. data/stdlib/socket/0/basic_socket.rbs +5 -10
  363. data/stdlib/socket/0/ip_socket.rbs +0 -2
  364. data/stdlib/socket/0/socket.rbs +77 -46
  365. data/stdlib/socket/0/tcp_server.rbs +0 -5
  366. data/stdlib/socket/0/tcp_socket.rbs +36 -3
  367. data/stdlib/socket/0/udp_socket.rbs +4 -5
  368. data/stdlib/socket/0/unix_server.rbs +0 -5
  369. data/stdlib/socket/0/unix_socket.rbs +2 -4
  370. data/{core/string_io.rbs → stdlib/stringio/0/stringio.rbs} +188 -107
  371. data/stdlib/strscan/0/string_scanner.rbs +1269 -425
  372. data/stdlib/tempfile/0/tempfile.rbs +224 -61
  373. data/stdlib/time/0/time.rbs +48 -35
  374. data/stdlib/timeout/0/timeout.rbs +17 -8
  375. data/stdlib/tmpdir/0/tmpdir.rbs +10 -3
  376. data/stdlib/tsort/0/tsort.rbs +0 -4
  377. data/stdlib/uri/0/common.rbs +271 -144
  378. data/stdlib/uri/0/file.rbs +5 -0
  379. data/stdlib/uri/0/ftp.rbs +1 -1
  380. data/stdlib/uri/0/generic.rbs +26 -22
  381. data/stdlib/uri/0/http.rbs +4 -4
  382. data/stdlib/uri/0/ldap.rbs +1 -1
  383. data/stdlib/uri/0/mailto.rbs +84 -0
  384. data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
  385. data/stdlib/yaml/0/manifest.yaml +1 -2
  386. data/stdlib/yaml/0/yaml.rbs +1 -199
  387. data/stdlib/zlib/0/buf_error.rbs +10 -0
  388. data/stdlib/zlib/0/data_error.rbs +10 -0
  389. data/stdlib/zlib/0/deflate.rbs +210 -0
  390. data/stdlib/zlib/0/error.rbs +20 -0
  391. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  392. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  393. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  394. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  395. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  396. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  397. data/stdlib/zlib/0/gzip_writer.rbs +166 -0
  398. data/stdlib/zlib/0/inflate.rbs +180 -0
  399. data/stdlib/zlib/0/mem_error.rbs +10 -0
  400. data/stdlib/zlib/0/need_dict.rbs +13 -0
  401. data/stdlib/zlib/0/stream_end.rbs +11 -0
  402. data/stdlib/zlib/0/stream_error.rbs +11 -0
  403. data/stdlib/zlib/0/version_error.rbs +11 -0
  404. data/stdlib/zlib/0/zlib.rbs +1 -3
  405. data/stdlib/zlib/0/zstream.rbs +200 -0
  406. data/templates/include/rbs/constants.h.erb +20 -0
  407. data/templates/include/rbs/ruby_objs.h.erb +10 -0
  408. data/templates/src/constants.c.erb +36 -0
  409. data/templates/src/ruby_objs.c.erb +27 -0
  410. data/templates/template.rb +122 -0
  411. metadata +136 -36
  412. data/Gemfile +0 -33
  413. data/Gemfile.lock +0 -118
  414. data/core/deprecated.rbs +0 -9
  415. data/ext/rbs_extension/constants.c +0 -135
  416. data/ext/rbs_extension/ruby_objs.c +0 -525
  417. data/ext/rbs_extension/ruby_objs.h +0 -43
  418. data/lib/rbs/constant_table.rb +0 -167
  419. data/lib/rbs/parser_compat/lexer_error.rb +0 -6
  420. data/lib/rbs/parser_compat/located_value.rb +0 -7
  421. data/lib/rbs/parser_compat/semantics_error.rb +0 -6
  422. data/lib/rbs/parser_compat/syntax_error.rb +0 -6
  423. data/lib/rbs/test/spy.rb +0 -6
  424. data/lib/rbs/type_name_resolver.rb +0 -67
  425. data/sig/constant_table.rbs +0 -30
  426. data/sig/shims/abstract_syntax_tree.rbs +0 -25
  427. data/sig/shims/pp.rbs +0 -3
  428. data/sig/shims/ripper.rbs +0 -8
  429. data/sig/shims.rbs +0 -69
  430. data/sig/type_name_resolver.rbs +0 -26
  431. data/stdlib/minitest/0/manifest.yaml +0 -2
  432. data/stdlib/prime/0/integer-extension.rbs +0 -41
  433. data/stdlib/prime/0/manifest.yaml +0 -2
  434. data/stdlib/prime/0/prime.rbs +0 -372
data/core/dir.rbs CHANGED
@@ -1,698 +1,981 @@
1
1
  # <!-- rdoc-file=dir.rb -->
2
- # Objects of class Dir are directory streams representing directories in the
3
- # underlying file system. They provide a variety of ways to list directories and
4
- # their contents. See also File.
2
+ # An object of class Dir represents a directory in the underlying file system.
5
3
  #
6
- # The directory used in these examples contains the two regular files
7
- # (`config.h` and `main.rb`), the parent directory (`..`), and the directory
8
- # itself (`.`).
4
+ # It consists mainly of:
9
5
  #
10
- # ## What's Here
6
+ # * A string *path*, given when the object is created, that specifies a
7
+ # directory in the underlying file system; method #path returns the path.
8
+ # * A collection of string *entry names*, each of which is the name of a
9
+ # directory or file in the underlying file system; the entry names may be
10
+ # retrieved in an [array-like fashion](rdoc-ref:Dir@Dir+As+Array-Like) or in
11
+ # a [stream-like fashion](rdoc-ref:Dir@Dir+As+Stream-Like).
11
12
  #
12
- # First, what's elsewhere. Class Dir:
13
+ # ## About the Examples
13
14
  #
14
- # * Inherits from [class
15
- # Object](Object.html#class-Object-label-What-27s+Here).
16
- # * Includes [module
17
- # Enumerable](Enumerable.html#module-Enumerable-label-What-27s+Here), which
18
- # provides dozens of additional methods.
15
+ # Some examples on this page use this simple file tree:
19
16
  #
17
+ # example/
18
+ # ├── config.h
19
+ # ├── lib/
20
+ # │ ├── song/
21
+ # │ │ └── karaoke.rb
22
+ # │ └── song.rb
23
+ # └── main.rb
20
24
  #
21
- # Here, class Dir provides methods that are useful for:
25
+ # Others use the file tree for the [Ruby project
26
+ # itself](https://github.com/ruby/ruby).
22
27
  #
23
- # * [Reading](#class-Dir-label-Reading)
24
- # * [Setting](#class-Dir-label-Setting)
25
- # * [Querying](#class-Dir-label-Querying)
26
- # * [Iterating](#class-Dir-label-Iterating)
27
- # * [Other](#class-Dir-label-Other)
28
+ # ## Dir As Array-Like
28
29
  #
30
+ # A Dir object is in some ways array-like:
29
31
  #
30
- # ### Reading
32
+ # * It has instance methods #children, #each, and #each_child.
33
+ # * It includes [module Enumerable](rdoc-ref:Enumerable@What-27s+Here).
31
34
  #
32
- # #close
33
- # : Closes the directory stream for `self`.
35
+ # ## Dir As Stream-Like
34
36
  #
35
- # #pos=
36
- # : Sets the position in the directory stream for `self`.
37
+ # A Dir object is in some ways stream-like.
37
38
  #
38
- # #read
39
- # : Reads and returns the next entry in the directory stream for `self`.
39
+ # The stream is initially open for reading, but may be closed manually (using
40
+ # method #close), and will be closed on block exit if created by Dir.open called
41
+ # with a block. The closed stream may not be further manipulated, and may not be
42
+ # reopened.
40
43
  #
41
- # #rewind
42
- # : Sets the position in the directory stream for `self` to the first
43
- # entry.
44
+ # The stream has a *position*, which is the index of an entry in the directory:
44
45
  #
45
- # #seek
46
- # : Sets the position in the directory stream for `self` the entry at the
47
- # given offset.
46
+ # * The initial position is zero (before the first entry).
47
+ # * Method #tell (aliased as #pos) returns the position.
48
+ # * Method #pos= sets the position (but ignores a value outside the stream),
49
+ # and returns the position.
50
+ # * Method #seek is like #pos=, but returns `self` (convenient for chaining).
51
+ # * Method #read, if not at end-of-stream, reads the next entry and increments
52
+ # the position; if at end-of-stream, does not increment the position.
53
+ # * Method #rewind sets the position to zero.
48
54
  #
55
+ # Examples (using the [simple file tree](rdoc-ref:Dir@About+the+Examples)):
49
56
  #
57
+ # dir = Dir.new('example') # => #<Dir:example>
58
+ # dir.pos # => 0
50
59
  #
51
- # ### Setting
52
- #
53
- # ::chdir
54
- # : Changes the working directory of the current process to the given
55
- # directory.
60
+ # dir.read # => "."
61
+ # dir.read # => ".."
62
+ # dir.read # => "config.h"
63
+ # dir.read # => "lib"
64
+ # dir.read # => "main.rb"
65
+ # dir.pos # => 5
66
+ # dir.read # => nil
67
+ # dir.pos # => 5
56
68
  #
57
- # ::chroot
58
- # : Changes the file-system root for the current process to the given
59
- # directory.
69
+ # dir.rewind # => #<Dir:example>
70
+ # dir.pos # => 0
60
71
  #
72
+ # dir.pos = 3 # => 3
73
+ # dir.pos # => 3
61
74
  #
75
+ # dir.seek(4) # => #<Dir:example>
76
+ # dir.pos # => 4
62
77
  #
63
- # ### Querying
64
- #
65
- # ::[]
66
- # : Same as ::glob without the ability to pass flags.
78
+ # dir.close # => nil
79
+ # dir.read # Raises IOError.
67
80
  #
68
- # ::children
69
- # : Returns an array of names of the children (both files and directories)
70
- # of the given directory, but not including `.` or `..`.
71
- #
72
- # ::empty?
73
- # : Returns whether the given path is an empty directory.
74
- #
75
- # ::entries
76
- # : Returns an array of names of the children (both files and directories)
77
- # of the given directory, including `.` and `..`.
81
+ # ## What's Here
78
82
  #
79
- # ::exist?
80
- # : Returns whether the given path is a directory.
83
+ # First, what's elsewhere. Class Dir:
81
84
  #
82
- # ::getwd (aliased as #pwd)
83
- # : Returns the path to the current working directory.
85
+ # * Inherits from [class Object](rdoc-ref:Object@What-27s+Here).
86
+ # * Includes [module Enumerable](rdoc-ref:Enumerable@What-27s+Here), which
87
+ # provides dozens of additional methods.
84
88
  #
85
- # ::glob
86
- # : Returns an array of file paths matching the given pattern and flags.
89
+ # Here, class Dir provides methods that are useful for:
87
90
  #
88
- # ::home
89
- # : Returns the home directory path for a given user or the current user.
91
+ # * [Reading](rdoc-ref:Dir@Reading)
92
+ # * [Setting](rdoc-ref:Dir@Setting)
93
+ # * [Querying](rdoc-ref:Dir@Querying)
94
+ # * [Iterating](rdoc-ref:Dir@Iterating)
95
+ # * [Other](rdoc-ref:Dir@Other)
90
96
  #
91
- # #children
92
- # : Returns an array of names of the children (both files and directories)
93
- # of `self`, but not including `.` or `..`.
97
+ # ### Reading
94
98
  #
95
- # #fileno
96
- # : Returns the integer file descriptor for `self`.
99
+ # * #close: Closes the directory stream for `self`.
100
+ # * #pos=: Sets the position in the directory stream for `self`.
101
+ # * #read: Reads and returns the next entry in the directory stream for
102
+ # `self`.
103
+ # * #rewind: Sets the position in the directory stream for `self` to the first
104
+ # entry.
105
+ # * #seek: Sets the position in the directory stream for `self` the entry at
106
+ # the given offset.
97
107
  #
98
- # #path (aliased as #to_path)
99
- # : Returns the path used to create `self`.
108
+ # ### Setting
100
109
  #
101
- # #tell (aliased as #pos)
102
- # : Returns the integer position in the directory stream for `self`.
110
+ # * ::chdir: Changes the working directory of the current process to the given
111
+ # directory.
112
+ # * ::chroot: Changes the file-system root for the current process to the
113
+ # given directory.
103
114
  #
115
+ # ### Querying
104
116
  #
117
+ # * ::[]: Same as ::glob without the ability to pass flags.
118
+ # * ::children: Returns an array of names of the children (both files and
119
+ # directories) of the given directory, but not including `.` or `..`.
120
+ # * ::empty?: Returns whether the given path is an empty directory.
121
+ # * ::entries: Returns an array of names of the children (both files and
122
+ # directories) of the given directory, including `.` and `..`.
123
+ # * ::exist?: Returns whether the given path is a directory.
124
+ # * ::getwd (aliased as #pwd): Returns the path to the current working
125
+ # directory.
126
+ # * ::glob: Returns an array of file paths matching the given pattern and
127
+ # flags.
128
+ # * ::home: Returns the home directory path for a given user or the current
129
+ # user.
130
+ # * #children: Returns an array of names of the children (both files and
131
+ # directories) of `self`, but not including `.` or `..`.
132
+ # * #fileno: Returns the integer file descriptor for `self`.
133
+ # * #path (aliased as #to_path): Returns the path used to create `self`.
134
+ # * #tell (aliased as #pos): Returns the integer position in the directory
135
+ # stream for `self`.
105
136
  #
106
137
  # ### Iterating
107
138
  #
108
- # ::each_child
109
- # : Calls the given block with each entry in the given directory, but not
110
- # including `.` or `..`.
111
- #
112
- # ::foreach
113
- # : Calls the given block with each entryin the given directory, including
114
- # `.` and `..`.
115
- #
116
- # #each
117
- # : Calls the given block with each entry in `self`, including `.` and
118
- # `..`.
119
- #
120
- # #each_child
121
- # : Calls the given block with each entry in `self`, but not including `.`
122
- # or `..`.
123
- #
124
- #
139
+ # * ::each_child: Calls the given block with each entry in the given
140
+ # directory, but not including `.` or `..`.
141
+ # * ::foreach: Calls the given block with each entry in the given directory,
142
+ # including `.` and `..`.
143
+ # * #each: Calls the given block with each entry in `self`, including `.` and
144
+ # `..`.
145
+ # * #each_child: Calls the given block with each entry in `self`, but not
146
+ # including `.` or `..`.
125
147
  #
126
148
  # ### Other
127
149
  #
128
- # ::mkdir
129
- # : Creates a directory at the given path, with optional permissions.
130
- #
131
- # ::new
132
- # : Returns a new Dir for the given path, with optional encoding.
133
- #
134
- # ::open
135
- # : Same as ::new, but if a block is given, yields the Dir to the block,
136
- # closing it upon block exit.
137
- #
138
- # ::unlink (aliased as ::delete and ::rmdir)
139
- # : Removes the given directory.
140
- #
141
- # #inspect
142
- # : Returns a string description of `self`.
150
+ # * ::mkdir: Creates a directory at the given path, with optional permissions.
151
+ # * ::new: Returns a new Dir for the given path, with optional encoding.
152
+ # * ::open: Same as ::new, but if a block is given, yields the Dir to the
153
+ # block, closing it upon block exit.
154
+ # * ::unlink (aliased as ::delete and ::rmdir): Removes the given directory.
155
+ # * #inspect: Returns a string description of `self`.
143
156
  #
144
157
  class Dir
145
158
  include Enumerable[String]
146
159
 
147
160
  # <!--
148
161
  # rdoc-file=dir.rb
149
- # - Dir.new( string ) -> aDir
150
- # - Dir.new( string, encoding: enc ) -> aDir
162
+ # - Dir.new(dirpath) -> dir
163
+ # - Dir.new(dirpath, encoding: nil) -> dir
151
164
  # -->
152
- # Returns a new directory object for the named directory.
165
+ # Returns a new Dir object for the directory at `dirpath`:
166
+ #
167
+ # Dir.new('.') # => #<Dir:.>
153
168
  #
154
- # The optional *encoding* keyword argument specifies the encoding of the
155
- # directory. If not specified, the filesystem encoding is used.
169
+ # The value given with optional keyword argument `encoding` specifies the
170
+ # encoding for the directory entry names; if `nil` (the default), the file
171
+ # system's encoding is used:
156
172
  #
157
- def initialize: (string, ?encoding: encoding | nil) -> void
173
+ # Dir.new('.').read.encoding # => #<Encoding:UTF-8>
174
+ # Dir.new('.', encoding: 'US-ASCII').read.encoding # => #<Encoding:US-ASCII>
175
+ #
176
+ def initialize: (path dir, ?encoding: encoding?) -> void
158
177
 
159
178
  # <!--
160
179
  # rdoc-file=dir.rb
161
- # - Dir[ string [, string ...] [, base: path] [, sort: true] ] -> array
180
+ # - Dir[*patterns, base: nil, sort: true] -> array
162
181
  # -->
163
- # Equivalent to calling `Dir.glob([`*string,...*`], 0)`.
182
+ # Calls Dir.glob with argument `patterns` and the values of keyword arguments
183
+ # `base` and `sort`; returns the array of selected entry names.
164
184
  #
165
- def self.[]: (*string patterns, ?base: string) ?{ (String path) -> void } -> Array[String]
185
+ def self.[]: (*path patterns, ?base: path?, ?sort: bool) -> Array[String]
166
186
 
167
187
  # <!--
168
188
  # rdoc-file=dir.c
169
- # - Dir.chdir( [ string] ) -> 0
170
- # - Dir.chdir( [ string] ) {| path | block } -> anObject
171
- # -->
172
- # Changes the current working directory of the process to the given string. When
173
- # called without an argument, changes the directory to the value of the
174
- # environment variable `HOME`, or `LOGDIR`. SystemCallError (probably
175
- # Errno::ENOENT) if the target directory does not exist.
176
- #
177
- # If a block is given, it is passed the name of the new current directory, and
178
- # the block is executed with that as the current directory. The original working
179
- # directory is restored when the block exits. The return value of `chdir` is the
180
- # value of the block. `chdir` blocks can be nested, but in a multi-threaded
181
- # program an error will be raised if a thread attempts to open a `chdir` block
182
- # while another thread has one open or a call to `chdir` without a block occurs
183
- # inside a block passed to `chdir` (even in the same thread).
184
- #
185
- # Dir.chdir("/var/spool/mail")
186
- # puts Dir.pwd
187
- # Dir.chdir("/tmp") do
188
- # puts Dir.pwd
189
- # Dir.chdir("/usr") do
190
- # puts Dir.pwd
189
+ # - Dir.chdir(new_dirpath) -> 0
190
+ # - Dir.chdir -> 0
191
+ # - Dir.chdir(new_dirpath) {|new_dirpath| ... } -> object
192
+ # - Dir.chdir {|cur_dirpath| ... } -> object
193
+ # -->
194
+ # Changes the current working directory.
195
+ #
196
+ # With argument `new_dirpath` and no block, changes to the given `dirpath`:
197
+ #
198
+ # Dir.pwd # => "/example"
199
+ # Dir.chdir('..') # => 0
200
+ # Dir.pwd # => "/"
201
+ #
202
+ # With no argument and no block:
203
+ #
204
+ # * Changes to the value of environment variable `HOME` if defined.
205
+ # * Otherwise changes to the value of environment variable `LOGDIR` if
206
+ # defined.
207
+ # * Otherwise makes no change.
208
+ #
209
+ # With argument `new_dirpath` and a block, temporarily changes the working
210
+ # directory:
211
+ #
212
+ # * Calls the block with the argument.
213
+ # * Changes to the given directory.
214
+ # * Executes the block (yielding the new path).
215
+ # * Restores the previous working directory.
216
+ # * Returns the block's return value.
217
+ #
218
+ # Example:
219
+ #
220
+ # Dir.chdir('/var/spool/mail')
221
+ # Dir.pwd # => "/var/spool/mail"
222
+ # Dir.chdir('/tmp') do
223
+ # Dir.pwd # => "/tmp"
224
+ # end
225
+ # Dir.pwd # => "/var/spool/mail"
226
+ #
227
+ # With no argument and a block, calls the block with the current working
228
+ # directory (string) and returns the block's return value.
229
+ #
230
+ # Calls to Dir.chdir with blocks may be nested:
231
+ #
232
+ # Dir.chdir('/var/spool/mail')
233
+ # Dir.pwd # => "/var/spool/mail"
234
+ # Dir.chdir('/tmp') do
235
+ # Dir.pwd # => "/tmp"
236
+ # Dir.chdir('/usr') do
237
+ # Dir.pwd # => "/usr"
191
238
  # end
192
- # puts Dir.pwd
239
+ # Dir.pwd # => "/tmp"
193
240
  # end
194
- # puts Dir.pwd
241
+ # Dir.pwd # => "/var/spool/mail"
195
242
  #
196
- # *produces:*
243
+ # In a multi-threaded program an error is raised if a thread attempts to open a
244
+ # `chdir` block while another thread has one open, or a call to `chdir` without
245
+ # a block occurs inside a block passed to `chdir` (even in the same thread).
197
246
  #
198
- # /var/spool/mail
199
- # /tmp
200
- # /usr
201
- # /tmp
202
- # /var/spool/mail
247
+ # Raises an exception if the target directory does not exist.
203
248
  #
204
- def self.chdir: (?string) -> void
205
- | [U] (?string) { (String) -> U } -> U
249
+ def self.chdir: (?path dir) -> 0
250
+ | [U] (?path dir) { (String dir) -> U } -> U
206
251
 
207
252
  # <!--
208
253
  # rdoc-file=dir.c
209
- # - Dir.children( dirname ) -> array
210
- # - Dir.children( dirname, encoding: enc ) -> array
254
+ # - Dir.children(dirpath) -> array
255
+ # - Dir.children(dirpath, encoding: 'UTF-8') -> array
211
256
  # -->
212
- # Returns an array containing all of the filenames except for "." and ".." in
213
- # the given directory. Will raise a SystemCallError if the named directory
214
- # doesn't exist.
257
+ # Returns an array of the entry names in the directory at `dirpath` except for
258
+ # `'.'` and `'..'`; sets the given encoding onto each returned entry name:
259
+ #
260
+ # Dir.children('/example') # => ["config.h", "lib", "main.rb"]
261
+ # Dir.children('/example').first.encoding
262
+ # # => #<Encoding:UTF-8>
263
+ # Dir.children('/example', encoding: 'US-ASCII').first.encoding
264
+ # # => #<Encoding:US-ASCII>
215
265
  #
216
- # The optional *encoding* keyword argument specifies the encoding of the
217
- # directory. If not specified, the filesystem encoding is used.
266
+ # See [String Encoding](rdoc-ref:encodings.rdoc@String+Encoding).
218
267
  #
219
- # Dir.children("testdir") #=> ["config.h", "main.rb"]
268
+ # Raises an exception if the directory does not exist.
220
269
  #
221
- def self.children: (string dirname, ?encoding: string | Encoding | nil enc) -> Array[String]
270
+ def self.children: (path dirname, ?encoding: encoding?) -> Array[String]
222
271
 
223
272
  # <!--
224
273
  # rdoc-file=dir.c
225
- # - Dir.chroot( string ) -> 0
274
+ # - Dir.chroot(dirpath) -> 0
226
275
  # -->
227
- # Changes this process's idea of the file system root. Only a privileged process
228
- # may make this call. Not available on all platforms. On Unix systems, see
229
- # `chroot(2)` for more information.
276
+ # Changes the root directory of the calling process to that specified in
277
+ # `dirpath`. The new root directory is used for pathnames beginning with `'/'`.
278
+ # The root directory is inherited by all children of the calling process.
230
279
  #
231
- def self.chroot: (string) -> void
280
+ # Only a privileged process may call `chroot`.
281
+ #
282
+ # See [Linux chroot](https://man7.org/linux/man-pages/man2/chroot.2.html).
283
+ #
284
+ def self.chroot: (path root) -> 0
232
285
 
233
286
  # <!--
234
287
  # rdoc-file=dir.c
235
- # - Dir.delete( string ) -> 0
236
- # - Dir.rmdir( string ) -> 0
237
- # - Dir.unlink( string ) -> 0
288
+ # - Dir.rmdir(dirpath) -> 0
238
289
  # -->
239
- # Deletes the named directory. Raises a subclass of SystemCallError if the
240
- # directory isn't empty.
290
+ # Removes the directory at `dirpath` from the underlying file system:
291
+ #
292
+ # Dir.rmdir('foo') # => 0
293
+ #
294
+ # Raises an exception if the directory is not empty.
241
295
  #
242
- def self.delete: (string) -> void
296
+ def self.delete: (path dirname) -> 0
243
297
 
244
298
  # <!--
245
299
  # rdoc-file=dir.c
246
- # - Dir.each_child( dirname ) {| filename | block } -> nil
247
- # - Dir.each_child( dirname, encoding: enc ) {| filename | block } -> nil
248
- # - Dir.each_child( dirname ) -> an_enumerator
249
- # - Dir.each_child( dirname, encoding: enc ) -> an_enumerator
300
+ # - Dir.each_child(dirpath) {|entry_name| ... } -> nil
301
+ # - Dir.each_child(dirpath, encoding: 'UTF-8') {|entry_name| ... } -> nil
250
302
  # -->
251
- # Calls the block once for each entry except for "." and ".." in the named
252
- # directory, passing the filename of each entry as a parameter to the block.
303
+ # Like Dir.foreach, except that entries `'.'` and `'..'` are not included.
253
304
  #
254
- # If no block is given, an enumerator is returned instead.
255
- #
256
- # Dir.each_child("testdir") {|x| puts "Got #{x}" }
305
+ def self.each_child: (path dirname, ?encoding: encoding?) -> Enumerator[String, nil]
306
+ | (path dirname, ?encoding: encoding?) { (String filename) -> void } -> nil
307
+
308
+ # <!--
309
+ # rdoc-file=dir.c
310
+ # - Dir.empty?(dirpath) -> true or false
311
+ # -->
312
+ # Returns whether `dirpath` specifies an empty directory:
257
313
  #
258
- # *produces:*
314
+ # dirpath = '/tmp/foo'
315
+ # Dir.mkdir(dirpath)
316
+ # Dir.empty?(dirpath) # => true
317
+ # Dir.empty?('/example') # => false
318
+ # Dir.empty?('/example/main.rb') # => false
259
319
  #
260
- # Got config.h
261
- # Got main.rb
320
+ # Raises an exception if `dirpath` does not specify a directory or file in the
321
+ # underlying file system.
262
322
  #
263
- def self.each_child: (string dirname, ?encoding: string | Encoding | nil enc) -> Enumerator[String, void]
264
- | (string dirname, ?encoding: string | Encoding | nil enc) { (String filename) -> void } -> void
323
+ def self.empty?: (path path_name) -> bool
265
324
 
266
325
  # <!--
267
326
  # rdoc-file=dir.c
268
- # - Dir.empty?(path_name) -> true or false
327
+ # - Dir.entries(dirname, encoding: 'UTF-8') -> array
269
328
  # -->
270
- # Returns `true` if the named file is an empty directory, `false` if it is not a
271
- # directory or non-empty.
329
+ # Returns an array of the entry names in the directory at `dirpath`; sets the
330
+ # given encoding onto each returned entry name:
331
+ #
332
+ # Dir.entries('/example') # => ["config.h", "lib", "main.rb", "..", "."]
333
+ # Dir.entries('/example').first.encoding
334
+ # # => #<Encoding:UTF-8>
335
+ # Dir.entries('/example', encoding: 'US-ASCII').first.encoding
336
+ # # => #<Encoding:US-ASCII>
337
+ #
338
+ # See [String Encoding](rdoc-ref:encodings.rdoc@String+Encoding).
272
339
  #
273
- def self.empty?: (string path_name) -> bool
340
+ # Raises an exception if the directory does not exist.
341
+ #
342
+ def self.entries: (path dirname, ?encoding: encoding?) -> Array[String]
274
343
 
275
344
  # <!--
276
345
  # rdoc-file=dir.c
277
- # - Dir.entries( dirname ) -> array
278
- # - Dir.entries( dirname, encoding: enc ) -> array
346
+ # - Dir.exist?(dirpath) -> true or false
279
347
  # -->
280
- # Returns an array containing all of the filenames in the given directory. Will
281
- # raise a SystemCallError if the named directory doesn't exist.
348
+ # Returns whether `dirpath` is a directory in the underlying file system:
282
349
  #
283
- # The optional *encoding* keyword argument specifies the encoding of the
284
- # directory. If not specified, the filesystem encoding is used.
350
+ # Dir.exist?('/example') # => true
351
+ # Dir.exist?('/nosuch') # => false
352
+ # Dir.exist?('/example/main.rb') # => false
285
353
  #
286
- # Dir.entries("testdir") #=> [".", "..", "config.h", "main.rb"]
354
+ # Same as File.directory?.
287
355
  #
288
- def self.entries: (string dirname, ?encoding: encoding | nil enc) -> ::Array[String]
356
+ def self.exist?: (path | io file_name) -> bool
289
357
 
290
358
  # <!--
291
359
  # rdoc-file=dir.c
292
- # - Dir.exist?(file_name) -> true or false
360
+ # - Dir.fchdir(fd) -> 0
361
+ # - Dir.fchdir(fd) { ... } -> object
293
362
  # -->
294
- # Returns `true` if the named file is a directory, `false` otherwise.
363
+ # Changes the current working directory to the directory specified by the
364
+ # integer file descriptor `fd`.
365
+ #
366
+ # When passing a file descriptor over a UNIX socket or to a child process, using
367
+ # `fchdir` instead of `chdir` avoids the [time-of-check to time-of-use
368
+ # vulnerability](https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use)
369
+ #
370
+ # With no block, changes to the directory given by `fd`:
371
+ #
372
+ # Dir.chdir('/var/spool/mail')
373
+ # Dir.pwd # => "/var/spool/mail"
374
+ # dir = Dir.new('/usr')
375
+ # fd = dir.fileno
376
+ # Dir.fchdir(fd)
377
+ # Dir.pwd # => "/usr"
378
+ #
379
+ # With a block, temporarily changes the working directory:
380
+ #
381
+ # * Calls the block with the argument.
382
+ # * Changes to the given directory.
383
+ # * Executes the block (yields no args).
384
+ # * Restores the previous working directory.
385
+ # * Returns the block's return value.
386
+ #
387
+ # Example:
388
+ #
389
+ # Dir.chdir('/var/spool/mail')
390
+ # Dir.pwd # => "/var/spool/mail"
391
+ # dir = Dir.new('/tmp')
392
+ # fd = dir.fileno
393
+ # Dir.fchdir(fd) do
394
+ # Dir.pwd # => "/tmp"
395
+ # end
396
+ # Dir.pwd # => "/var/spool/mail"
295
397
  #
296
- def self.exist?: (string file) -> bool
398
+ # This method uses the
399
+ # [fchdir()](https://www.man7.org/linux/man-pages/man3/fchdir.3p.html) function
400
+ # defined by POSIX 2008; the method is not implemented on non-POSIX platforms
401
+ # (raises NotImplementedError).
402
+ #
403
+ # Raises an exception if the file descriptor is not valid.
404
+ #
405
+ # In a multi-threaded program an error is raised if a thread attempts to open a
406
+ # `chdir` block while another thread has one open, or a call to `chdir` without
407
+ # a block occurs inside a block passed to `chdir` (even in the same thread).
408
+ #
409
+ def self.fchdir: (int) -> Integer
410
+ | [T] (int) { () -> T } -> T
297
411
 
298
412
  # <!--
299
413
  # rdoc-file=dir.c
300
- # - Dir.foreach( dirname ) {| filename | block } -> nil
301
- # - Dir.foreach( dirname, encoding: enc ) {| filename | block } -> nil
302
- # - Dir.foreach( dirname ) -> an_enumerator
303
- # - Dir.foreach( dirname, encoding: enc ) -> an_enumerator
414
+ # - Dir.foreach(dirpath, encoding: 'UTF-8') {|entry_name| ... } -> nil
304
415
  # -->
305
- # Calls the block once for each entry in the named directory, passing the
306
- # filename of each entry as a parameter to the block.
416
+ # Calls the block with each entry name in the directory at `dirpath`; sets the
417
+ # given encoding onto each passed `entry_name`:
418
+ #
419
+ # Dir.foreach('/example') {|entry_name| p entry_name }
307
420
  #
308
- # If no block is given, an enumerator is returned instead.
421
+ # Output:
309
422
  #
310
- # Dir.foreach("testdir") {|x| puts "Got #{x}" }
423
+ # "config.h"
424
+ # "lib"
425
+ # "main.rb"
426
+ # ".."
427
+ # "."
311
428
  #
312
- # *produces:*
429
+ # Encoding:
313
430
  #
314
- # Got .
315
- # Got ..
316
- # Got config.h
317
- # Got main.rb
431
+ # Dir.foreach('/example') {|entry_name| p entry_name.encoding; break }
432
+ # Dir.foreach('/example', encoding: 'US-ASCII') {|entry_name| p entry_name.encoding; break }
433
+ #
434
+ # Output:
435
+ #
436
+ # #<Encoding:UTF-8>
437
+ # #<Encoding:US-ASCII>
438
+ #
439
+ # See [String Encoding](rdoc-ref:encodings.rdoc@String+Encoding).
440
+ #
441
+ # Returns an enumerator if no block is given.
318
442
  #
319
443
  alias self.foreach self.each_child
320
444
 
321
445
  # <!--
322
446
  # rdoc-file=dir.c
323
- # - Dir.getwd -> string
447
+ # - Dir.for_fd(fd) -> dir
448
+ # -->
449
+ # Returns a new Dir object representing the directory specified by the given
450
+ # integer directory file descriptor `fd`:
451
+ #
452
+ # d0 = Dir.new('..')
453
+ # d1 = Dir.for_fd(d0.fileno)
454
+ #
455
+ # Note that the returned `d1` does not have an associated path:
456
+ #
457
+ # d0.path # => '..'
458
+ # d1.path # => nil
459
+ #
460
+ # This method uses the
461
+ # [fdopendir()](https://www.man7.org/linux/man-pages/man3/fdopendir.3p.html)
462
+ # function defined by POSIX 2008; the method is not implemented on non-POSIX
463
+ # platforms (raises NotImplementedError).
464
+ #
465
+ def self.for_fd: (int) -> Dir
466
+
467
+ # <!--
468
+ # rdoc-file=dir.c
324
469
  # - Dir.pwd -> string
325
470
  # -->
326
- # Returns the path to the current working directory of this process as a string.
471
+ # Returns the path to the current working directory:
327
472
  #
328
- # Dir.chdir("/tmp") #=> 0
329
- # Dir.getwd #=> "/tmp"
330
- # Dir.pwd #=> "/tmp"
473
+ # Dir.chdir("/tmp") # => 0
474
+ # Dir.pwd # => "/tmp"
331
475
  #
332
476
  def self.getwd: () -> String
333
477
 
334
478
  # <!--
335
479
  # rdoc-file=dir.rb
336
- # - Dir.glob( pattern, [flags], [base: path] [, sort: true] ) -> array
337
- # - Dir.glob( pattern, [flags], [base: path] [, sort: true] ) { |filename| block } -> nil
480
+ # - Dir.glob(*patterns, flags: 0, base: nil, sort: true) -> array
481
+ # - Dir.glob(*patterns, flags: 0, base: nil, sort: true) {|entry_name| ... } -> nil
338
482
  # -->
339
- # Expands `pattern`, which is a pattern string or an Array of pattern strings,
340
- # and returns an array containing the matching filenames. If a block is given,
341
- # calls the block once for each matching filename, passing the filename as a
342
- # parameter to the block.
483
+ # Forms an array *entry_names* of the entry names selected by the arguments.
343
484
  #
344
- # The optional `base` keyword argument specifies the base directory for
345
- # interpreting relative pathnames instead of the current working directory. As
346
- # the results are not prefixed with the base directory name in this case, you
347
- # will need to prepend the base directory name if you want real paths.
485
+ # Argument `patterns` is a string pattern or an array of string patterns; note
486
+ # that these are not regexps; see below.
348
487
  #
349
- # The results which matched single wildcard or character set are sorted in
350
- # binary ascending order, unless `false` is given as the optional `sort` keyword
351
- # argument. The order of an Array of pattern strings and braces are preserved.
488
+ # Notes for the following examples:
352
489
  #
353
- # Note that the pattern is not a regexp, it's closer to a shell glob. See
354
- # File::fnmatch for the meaning of the `flags` parameter. Case sensitivity
355
- # depends on your system (`File::FNM_CASEFOLD` is ignored).
490
+ # * `'*'` is the pattern that matches any entry name except those that begin
491
+ # with `'.'`.
492
+ # * We use method Array#take to shorten returned arrays that otherwise would
493
+ # be very large.
356
494
  #
357
- # `*`
358
- # : Matches any file. Can be restricted by other values in the glob.
359
- # Equivalent to `/.*/mx` in regexp.
495
+ # With no block, returns array *entry_names*; example (using the [simple file
496
+ # tree](rdoc-ref:Dir@About+the+Examples)):
360
497
  #
361
- # `*`
362
- # : Matches all files
363
- # `c*`
364
- # : Matches all files beginning with `c`
365
- # `*c`
366
- # : Matches all files ending with `c`
367
- # `*c*`
368
- # : Match all files that have `c` in them (including at the beginning or
369
- # end).
498
+ # Dir.glob('*') # => ["config.h", "lib", "main.rb"]
370
499
  #
500
+ # With a block, calls the block with each of the *entry_names* and returns
501
+ # `nil`:
371
502
  #
372
- # Note, this will not match Unix-like hidden files (dotfiles). In order to
373
- # include those in the match results, you must use the File::FNM_DOTMATCH
374
- # flag or something like `"{*,.*}"`.
503
+ # Dir.glob('*') {|entry_name| puts entry_name } # => nil
375
504
  #
376
- # `**`
377
- # : Matches directories recursively if followed by `/`. If this path segment
378
- # contains any other characters, it is the same as the usual `*`.
505
+ # Output:
379
506
  #
380
- # `?`
381
- # : Matches any one character. Equivalent to `/.{1}/` in regexp.
507
+ # config.h
508
+ # lib
509
+ # main.rb
382
510
  #
383
- # `[set]`
384
- # : Matches any one character in `set`. Behaves exactly like character sets
385
- # in Regexp, including set negation (`[^a-z]`).
511
+ # If optional keyword argument `flags` is given, the value modifies the
512
+ # matching; see below.
386
513
  #
387
- # `{p,q}`
388
- # : Matches either literal `p` or literal `q`. Equivalent to pattern
389
- # alternation in regexp.
514
+ # If optional keyword argument `base` is given, its value specifies the base
515
+ # directory. Each pattern string specifies entries relative to the base
516
+ # directory; the default is `'.'`. The base directory is not prepended to the
517
+ # entry names in the result:
390
518
  #
391
- # Matching literals may be more than one character in length. More than two
392
- # literals may be specified.
519
+ # Dir.glob(pattern, base: 'lib').take(5)
520
+ # # => ["abbrev.gemspec", "abbrev.rb", "base64.gemspec", "base64.rb", "benchmark.gemspec"]
521
+ # Dir.glob(pattern, base: 'lib/irb').take(5)
522
+ # # => ["cmd", "color.rb", "color_printer.rb", "completion.rb", "context.rb"]
393
523
  #
394
- # `\`
395
- # : Escapes the next metacharacter.
524
+ # If optional keyword `sort` is given, its value specifies whether the array is
525
+ # to be sorted; the default is `true`. Passing value `false` with that keyword
526
+ # disables sorting (though the underlying file system may already have sorted
527
+ # the array).
396
528
  #
397
- # Note that this means you cannot use backslash on windows as part of a
398
- # glob, i.e. `Dir["c:\\foo*"]` will not work, use `Dir["c:/foo*"]` instead.
529
+ # **Patterns**
399
530
  #
531
+ # Each pattern string is expanded according to certain metacharacters; examples
532
+ # below use the [Ruby file tree](rdoc-ref:Dir@About+the+Examples):
400
533
  #
401
- # Examples:
534
+ # * `'*'`: Matches any substring in an entry name, similar in meaning to
535
+ # regexp `/.*/mx`; may be restricted by other values in the pattern strings:
536
+ #
537
+ # * `'*'` matches all entry names:
538
+ #
539
+ # Dir.glob('*').take(3) # => ["BSDL", "CONTRIBUTING.md", "COPYING"]
540
+ #
541
+ # * `'c*'` matches entry names beginning with `'c'`:
542
+ #
543
+ # Dir.glob('c*').take(3) # => ["CONTRIBUTING.md", "COPYING", "COPYING.ja"]
544
+ #
545
+ # * `'*c'` matches entry names ending with `'c'`:
546
+ #
547
+ # Dir.glob('*c').take(3) # => ["addr2line.c", "array.c", "ast.c"]
548
+ #
549
+ # * `'*c*'` matches entry names that contain `'c'`, even at the beginning
550
+ # or end:
551
+ #
552
+ # Dir.glob('*c*').take(3) # => ["CONTRIBUTING.md", "COPYING", "COPYING.ja"]
553
+ #
554
+ # Does not match Unix-like hidden entry names ("dot files"). To include
555
+ # those in the matched entry names, use flag IO::FNM_DOTMATCH or something
556
+ # like `'{*,.*}'`.
557
+ #
558
+ # * `'**'`: Matches entry names recursively if followed by the slash
559
+ # character `'/'`:
560
+ #
561
+ # Dir.glob('**/').take(3) # => ["basictest/", "benchmark/", "benchmark/gc/"]
562
+ #
563
+ # If the string pattern contains other characters or is not followed by a
564
+ # slash character, it is equivalent to `'*'`.
565
+ #
566
+ # * `'?'` Matches any single character; similar in meaning to regexp `/./`:
567
+ #
568
+ # Dir.glob('io.?') # => ["io.c"]
569
+ #
570
+ # * `'[*set*]'`: Matches any one character in the string *set*; behaves like a
571
+ # [Regexp character class](rdoc-ref:Regexp@Character+Classes), including set
572
+ # negation (`'[^a-z]'`):
573
+ #
574
+ # Dir.glob('*.[a-z][a-z]').take(3)
575
+ # # => ["CONTRIBUTING.md", "COPYING.ja", "KNOWNBUGS.rb"]
576
+ #
577
+ # * `'{*abc*,*xyz*}'`: Matches either string *abc* or string *xyz*; behaves
578
+ # like [Regexp alternation](rdoc-ref:Regexp@Alternation):
579
+ #
580
+ # Dir.glob('{LEGAL,BSDL}') # => ["LEGAL", "BSDL"]
581
+ #
582
+ # More than two alternatives may be given.
583
+ #
584
+ # * `\`: Escapes the following metacharacter.
585
+ #
586
+ # Note that on Windows, the backslash character may not be used in a string
587
+ # pattern: `Dir['c:\\foo*']` will not work, use `Dir['c:/foo*']` instead.
588
+ #
589
+ # More examples (using the [simple file tree](rdoc-ref:Dir@About+the+Examples)):
590
+ #
591
+ # # We're in the example directory.
592
+ # File.basename(Dir.pwd) # => "example"
593
+ # Dir.glob('config.?') # => ["config.h"]
594
+ # Dir.glob('*.[a-z][a-z]') # => ["main.rb"]
595
+ # Dir.glob('*.[^r]*') # => ["config.h"]
596
+ # Dir.glob('*.{rb,h}') # => ["main.rb", "config.h"]
597
+ # Dir.glob('*') # => ["config.h", "lib", "main.rb"]
598
+ # Dir.glob('*', File::FNM_DOTMATCH) # => [".", "config.h", "lib", "main.rb"]
599
+ # Dir.glob(["*.rb", "*.h"]) # => ["main.rb", "config.h"]
600
+ #
601
+ # Dir.glob('**/*.rb')
602
+ # => ["lib/song/karaoke.rb", "lib/song.rb", "main.rb"]
603
+ #
604
+ # Dir.glob('**/*.rb', base: 'lib') # => ["song/karaoke.rb", "song.rb"]
605
+ #
606
+ # Dir.glob('**/lib') # => ["lib"]
607
+ #
608
+ # Dir.glob('**/lib/**/*.rb') # => ["lib/song/karaoke.rb", "lib/song.rb"]
609
+ #
610
+ # Dir.glob('**/lib/*.rb') # => ["lib/song.rb"]
402
611
  #
403
- # Dir["config.?"] #=> ["config.h"]
404
- # Dir.glob("config.?") #=> ["config.h"]
405
- # Dir.glob("*.[a-z][a-z]") #=> ["main.rb"]
406
- # Dir.glob("*.[^r]*") #=> ["config.h"]
407
- # Dir.glob("*.{rb,h}") #=> ["main.rb", "config.h"]
408
- # Dir.glob("*") #=> ["config.h", "main.rb"]
409
- # Dir.glob("*", File::FNM_DOTMATCH) #=> [".", "config.h", "main.rb"]
410
- # Dir.glob(["*.rb", "*.h"]) #=> ["main.rb", "config.h"]
612
+ # **Flags**
411
613
  #
412
- # Dir.glob("**/*.rb") #=> ["main.rb",
413
- # # "lib/song.rb",
414
- # # "lib/song/karaoke.rb"]
614
+ # If optional keyword argument `flags` is given (the default is zero -- no
615
+ # flags), its value should be the bitwise OR of one or more of the constants
616
+ # defined in module File::Constants.
415
617
  #
416
- # Dir.glob("**/*.rb", base: "lib") #=> ["song.rb",
417
- # # "song/karaoke.rb"]
618
+ # Example:
418
619
  #
419
- # Dir.glob("**/lib") #=> ["lib"]
620
+ # flags = File::FNM_EXTGLOB | File::FNM_DOTMATCH
420
621
  #
421
- # Dir.glob("**/lib/**/*.rb") #=> ["lib/song.rb",
422
- # # "lib/song/karaoke.rb"]
622
+ # Specifying flags can extend, restrict, or otherwise modify the matching.
423
623
  #
424
- # Dir.glob("**/lib/*.rb") #=> ["lib/song.rb"]
624
+ # The flags for this method (other constants in File::Constants do not apply):
425
625
  #
426
- def self.glob: (string | ::Array[string] pattern, ?Integer flags, ?base: string) -> ::Array[String]
427
- | (string | ::Array[string] pattern, ?Integer flags, ?base: string) { (String) -> void } -> void
626
+ # * File::FNM_DOTMATCH: specifies that entry names beginning with `'.'` should
627
+ # be considered for matching:
628
+ #
629
+ # Dir.glob('*').take(5)
630
+ # # => ["BSDL", "CONTRIBUTING.md", "COPYING", "COPYING.ja", "GPL"]
631
+ # Dir.glob('*', flags: File::FNM_DOTMATCH).take(5)
632
+ # # => [".", ".appveyor.yml", ".cirrus.yml", ".dir-locals.el", ".document"]
633
+ #
634
+ # * File::FNM_EXTGLOB: enables the pattern extension `'{*a*,*b*}'`, which
635
+ # matches pattern *a* and pattern *b*; behaves like a [regexp
636
+ # union](rdoc-ref:Regexp.union) (e.g., `'(?:*a*|*b*)'`):
637
+ #
638
+ # pattern = '{LEGAL,BSDL}'
639
+ # Dir.glob(pattern) # => ["LEGAL", "BSDL"]
640
+ #
641
+ # * File::FNM_NOESCAPE: specifies that escaping with the backslash character
642
+ # `'\'` is disabled; the character is not an escape character.
643
+ #
644
+ # * File::FNM_PATHNAME: specifies that metacharacters `'*'` and `'?'` do not
645
+ # match directory separators.
646
+ #
647
+ # * File::FNM_SHORTNAME: specifies that patterns may match short names if they
648
+ # exist; Windows only.
649
+ #
650
+ def self.glob: (array[path] | path pattern, ?int flags, ?base: path?, ?sort: bool) -> Array[String]
651
+ | (array[path] | path pattern, ?int flags, ?base: path?, ?sort: bool) { (String pathname) -> void } -> nil
428
652
 
429
653
  # <!--
430
654
  # rdoc-file=dir.c
431
- # - Dir.home() -> "/home/me"
432
- # - Dir.home("root") -> "/root"
655
+ # - Dir.home(user_name = nil) -> dirpath
433
656
  # -->
434
- # Returns the home directory of the current user or the named user if given.
657
+ # Returns the home directory path of the user specified with `user_name` if it
658
+ # is not `nil`, or the current login user:
659
+ #
660
+ # Dir.home # => "/home/me"
661
+ # Dir.home('root') # => "/root"
662
+ #
663
+ # Raises ArgumentError if `user_name` is not a user name.
435
664
  #
436
- def self.home: (?string user) -> String
665
+ def self.home: (?string? user) -> String
437
666
 
438
667
  # <!--
439
668
  # rdoc-file=dir.c
440
- # - Dir.mkdir( string [, integer] ) -> 0
669
+ # - Dir.mkdir(dirpath, permissions = 0775) -> 0
441
670
  # -->
442
- # Makes a new directory named by *string*, with permissions specified by the
443
- # optional parameter *anInteger*. The permissions may be modified by the value
444
- # of File::umask, and are ignored on NT. Raises a SystemCallError if the
445
- # directory cannot be created. See also the discussion of permissions in the
446
- # class documentation for File.
671
+ # Creates a directory in the underlying file system at `dirpath` with the given
672
+ # `permissions`; returns zero:
447
673
  #
448
- # Dir.mkdir(File.join(Dir.home, ".foo"), 0700) #=> 0
674
+ # Dir.mkdir('foo')
675
+ # File.stat(Dir.new('foo')).mode.to_s(8)[1..4] # => "0755"
676
+ # Dir.mkdir('bar', 0644)
677
+ # File.stat(Dir.new('bar')).mode.to_s(8)[1..4] # => "0644"
449
678
  #
450
- def self.mkdir: (string, ?Integer permissions) -> void
679
+ # See [File Permissions](rdoc-ref:File@File+Permissions). Note that argument
680
+ # `permissions` is ignored on Windows.
681
+ #
682
+ def self.mkdir: (path dirname, ?int permissions) -> 0
451
683
 
452
684
  # <!--
453
685
  # rdoc-file=dir.rb
454
- # - Dir.open( string ) -> aDir
455
- # - Dir.open( string, encoding: enc ) -> aDir
456
- # - Dir.open( string ) {| aDir | block } -> anObject
457
- # - Dir.open( string, encoding: enc ) {| aDir | block } -> anObject
686
+ # - Dir.open(dirpath) -> dir
687
+ # - Dir.open(dirpath, encoding: nil) -> dir
688
+ # - Dir.open(dirpath) {|dir| ... } -> object
689
+ # - Dir.open(dirpath, encoding: nil) {|dir| ... } -> object
458
690
  # -->
459
- # The optional *encoding* keyword argument specifies the encoding of the
460
- # directory. If not specified, the filesystem encoding is used.
691
+ # Creates a new Dir object *dir* for the directory at `dirpath`.
692
+ #
693
+ # With no block, the method equivalent to Dir.new(dirpath, encoding):
694
+ #
695
+ # Dir.open('.') # => #<Dir:.>
696
+ #
697
+ # With a block given, the block is called with the created *dir*; on block exit
698
+ # *dir* is closed and the block's value is returned:
461
699
  #
462
- # With no block, `open` is a synonym for Dir::new. If a block is present, it is
463
- # passed *aDir* as a parameter. The directory is closed at the end of the block,
464
- # and Dir::open returns the value of the block.
700
+ # Dir.open('.') {|dir| dir.inspect } # => "#<Dir:.>"
465
701
  #
466
- def self.open: (string, ?encoding: encoding | nil) -> Dir
467
- | [U] (string, ?encoding: encoding | nil) { (Dir) -> U } -> U
702
+ # The value given with optional keyword argument `encoding` specifies the
703
+ # encoding for the directory entry names; if `nil` (the default), the file
704
+ # system's encoding is used:
705
+ #
706
+ # Dir.open('.').read.encoding # => #<Encoding:UTF-8>
707
+ # Dir.open('.', encoding: 'US-ASCII').read.encoding # => #<Encoding:US-ASCII>
708
+ #
709
+ def self.open: (path dirname, ?encoding: encoding?) -> instance
710
+ | [U] (path dirname, ?encoding: encoding?) { (instance) -> U } -> U
468
711
 
469
712
  # <!--
470
713
  # rdoc-file=dir.c
471
- # - Dir.getwd -> string
472
714
  # - Dir.pwd -> string
473
715
  # -->
474
- # Returns the path to the current working directory of this process as a string.
716
+ # Returns the path to the current working directory:
475
717
  #
476
- # Dir.chdir("/tmp") #=> 0
477
- # Dir.getwd #=> "/tmp"
478
- # Dir.pwd #=> "/tmp"
718
+ # Dir.chdir("/tmp") # => 0
719
+ # Dir.pwd # => "/tmp"
479
720
  #
480
- def self.pwd: () -> String
721
+ alias self.pwd self.getwd
481
722
 
482
723
  # <!--
483
724
  # rdoc-file=dir.c
484
- # - Dir.delete( string ) -> 0
485
- # - Dir.rmdir( string ) -> 0
486
- # - Dir.unlink( string ) -> 0
725
+ # - Dir.rmdir(dirpath) -> 0
487
726
  # -->
488
- # Deletes the named directory. Raises a subclass of SystemCallError if the
489
- # directory isn't empty.
727
+ # Removes the directory at `dirpath` from the underlying file system:
728
+ #
729
+ # Dir.rmdir('foo') # => 0
730
+ #
731
+ # Raises an exception if the directory is not empty.
490
732
  #
491
733
  alias self.rmdir self.delete
492
734
 
493
735
  # <!--
494
736
  # rdoc-file=dir.c
495
- # - Dir.delete( string ) -> 0
496
- # - Dir.rmdir( string ) -> 0
497
- # - Dir.unlink( string ) -> 0
737
+ # - Dir.rmdir(dirpath) -> 0
498
738
  # -->
499
- # Deletes the named directory. Raises a subclass of SystemCallError if the
500
- # directory isn't empty.
739
+ # Removes the directory at `dirpath` from the underlying file system:
740
+ #
741
+ # Dir.rmdir('foo') # => 0
742
+ #
743
+ # Raises an exception if the directory is not empty.
501
744
  #
502
745
  alias self.unlink self.delete
503
746
 
504
- public
747
+ # <!--
748
+ # rdoc-file=dir.c
749
+ # - chdir -> 0
750
+ # - chdir { ... } -> object
751
+ # -->
752
+ # Changes the current working directory to `self`:
753
+ #
754
+ # Dir.pwd # => "/"
755
+ # dir = Dir.new('example')
756
+ # dir.chdir
757
+ # Dir.pwd # => "/example"
758
+ #
759
+ # With a block, temporarily changes the working directory:
760
+ #
761
+ # * Calls the block.
762
+ # * Changes to the given directory.
763
+ # * Executes the block (yields no args).
764
+ # * Restores the previous working directory.
765
+ # * Returns the block's return value.
766
+ #
767
+ # Uses Dir.fchdir if available, and Dir.chdir if not, see those methods for
768
+ # caveats.
769
+ #
770
+ def chdir: () -> Integer
771
+ | [T] () { () -> T } -> T
505
772
 
506
773
  # <!--
507
774
  # rdoc-file=dir.c
508
- # - dir.children -> array
775
+ # - children -> array
509
776
  # -->
510
- # Returns an array containing all of the filenames except for "." and ".." in
511
- # this directory.
777
+ # Returns an array of the entry names in `self` except for `'.'` and `'..'`:
512
778
  #
513
- # d = Dir.new("testdir")
514
- # d.children #=> ["config.h", "main.rb"]
779
+ # dir = Dir.new('/example')
780
+ # dir.children # => ["config.h", "lib", "main.rb"]
515
781
  #
516
782
  def children: () -> Array[String]
517
783
 
518
784
  # <!--
519
785
  # rdoc-file=dir.c
520
- # - dir.close -> nil
786
+ # - close -> nil
521
787
  # -->
522
- # Closes the directory stream. Calling this method on closed Dir object is
523
- # ignored since Ruby 2.3.
788
+ # Closes the stream in `self`, if it is open, and returns `nil`; ignored if
789
+ # `self` is already closed:
524
790
  #
525
- # d = Dir.new("testdir")
526
- # d.close #=> nil
791
+ # dir = Dir.new('example')
792
+ # dir.read # => "."
793
+ # dir.close # => nil
794
+ # dir.close # => nil
795
+ # dir.read # Raises IOError.
527
796
  #
528
- def close: () -> void
797
+ def close: () -> nil
529
798
 
530
799
  # <!--
531
800
  # rdoc-file=dir.c
532
- # - dir.each { |filename| block } -> dir
533
- # - dir.each -> an_enumerator
801
+ # - each {|entry_name| ... } -> self
534
802
  # -->
535
- # Calls the block once for each entry in this directory, passing the filename of
536
- # each entry as a parameter to the block.
803
+ # Calls the block with each entry name in `self`:
537
804
  #
538
- # If no block is given, an enumerator is returned instead.
805
+ # Dir.new('example').each {|entry_name| p entry_name }
539
806
  #
540
- # d = Dir.new("testdir")
541
- # d.each {|x| puts "Got #{x}" }
807
+ # Output:
542
808
  #
543
- # *produces:*
809
+ # "."
810
+ # ".."
811
+ # "config.h"
812
+ # "lib"
813
+ # "main.rb"
544
814
  #
545
- # Got .
546
- # Got ..
547
- # Got config.h
548
- # Got main.rb
815
+ # With no block given, returns an Enumerator.
549
816
  #
550
817
  def each: () { (String) -> void } -> self
551
- | () -> ::Enumerator[String, self]
818
+ | () -> Enumerator[String, self]
552
819
 
553
820
  # <!--
554
821
  # rdoc-file=dir.c
555
- # - dir.each_child {| filename | block } -> dir
556
- # - dir.each_child -> an_enumerator
822
+ # - each_child {|entry_name| ... } -> self
557
823
  # -->
558
- # Calls the block once for each entry except for "." and ".." in this directory,
559
- # passing the filename of each entry as a parameter to the block.
824
+ # Calls the block with each entry name in `self` except `'.'` and `'..'`:
560
825
  #
561
- # If no block is given, an enumerator is returned instead.
826
+ # dir = Dir.new('/example')
827
+ # dir.each_child {|entry_name| p entry_name }
562
828
  #
563
- # d = Dir.new("testdir")
564
- # d.each_child {|x| puts "Got #{x}" }
829
+ # Output:
565
830
  #
566
- # *produces:*
831
+ # "config.h"
832
+ # "lib"
833
+ # "main.rb"
567
834
  #
568
- # Got config.h
569
- # Got main.rb
835
+ # If no block is given, returns an enumerator.
570
836
  #
571
837
  def each_child: () { (String) -> void } -> self
572
- | () -> ::Enumerator[String, self]
838
+ | () -> Enumerator[String, self]
573
839
 
574
840
  # <!--
575
841
  # rdoc-file=dir.c
576
- # - dir.fileno -> integer
842
+ # - fileno -> integer
577
843
  # -->
578
844
  # Returns the file descriptor used in *dir*.
579
845
  #
580
- # d = Dir.new("..")
581
- # d.fileno #=> 8
846
+ # d = Dir.new('..')
847
+ # d.fileno # => 8
582
848
  #
583
- # This method uses dirfd() function defined by POSIX 2008. NotImplementedError
584
- # is raised on other platforms, such as Windows, which doesn't provide the
585
- # function.
849
+ # This method uses the
850
+ # [dirfd()](https://www.man7.org/linux/man-pages/man3/dirfd.3.html) function
851
+ # defined by POSIX 2008; the method is not implemented on non-POSIX platforms
852
+ # (raises NotImplementedError).
586
853
  #
587
854
  def fileno: () -> Integer
588
855
 
589
856
  # <!--
590
857
  # rdoc-file=dir.c
591
- # - dir.inspect -> string
858
+ # - inspect -> string
592
859
  # -->
593
- # Return a string describing this Dir object.
860
+ # Returns a string description of `self`:
861
+ #
862
+ # Dir.new('example').inspect # => "#<Dir:example>"
594
863
  #
595
864
  def inspect: () -> String
596
865
 
597
866
  # <!--
598
867
  # rdoc-file=dir.c
599
- # - dir.path -> string or nil
600
- # - dir.to_path -> string or nil
868
+ # - path -> string or nil
601
869
  # -->
602
- # Returns the path parameter passed to *dir*'s constructor.
870
+ # Returns the `dirpath` string that was used to create `self` (or `nil` if
871
+ # created by method Dir.for_fd):
603
872
  #
604
- # d = Dir.new("..")
605
- # d.path #=> ".."
873
+ # Dir.new('example').path # => "example"
606
874
  #
607
875
  def path: () -> String?
608
876
 
609
877
  # <!-- rdoc-file=dir.c -->
610
- # Returns the current position in *dir*. See also Dir#seek.
878
+ # Returns the current position of `self`; see [Dir As
879
+ # Stream-Like](rdoc-ref:Dir@Dir+As+Stream-Like):
611
880
  #
612
- # d = Dir.new("testdir")
613
- # d.tell #=> 0
614
- # d.read #=> "."
615
- # d.tell #=> 12
881
+ # dir = Dir.new('example')
882
+ # dir.tell # => 0
883
+ # dir.read # => "."
884
+ # dir.tell # => 1
616
885
  #
617
886
  def pos: () -> Integer
618
887
 
619
888
  # <!--
620
889
  # rdoc-file=dir.c
621
- # - dir.pos = integer -> integer
890
+ # - pos = position -> integer
622
891
  # -->
623
- # Synonym for Dir#seek, but returns the position parameter.
892
+ # Sets the position in `self` and returns `position`. The value of `position`
893
+ # should have been returned from an earlier call to #tell; if not, the return
894
+ # values from subsequent calls to #read are unspecified.
895
+ #
896
+ # See [Dir As Stream-Like](rdoc-ref:Dir@Dir+As+Stream-Like).
897
+ #
898
+ # Examples:
624
899
  #
625
- # d = Dir.new("testdir") #=> #<Dir:0x401b3c40>
626
- # d.read #=> "."
627
- # i = d.pos #=> 12
628
- # d.read #=> ".."
629
- # d.pos = i #=> 12
630
- # d.read #=> ".."
900
+ # dir = Dir.new('example')
901
+ # dir.pos # => 0
902
+ # dir.pos = 3 # => 3
903
+ # dir.pos # => 3
904
+ # dir.pos = 30 # => 30
905
+ # dir.pos # => 5
631
906
  #
632
- def pos=: (Integer pos) -> Integer
907
+ def pos=: [U < _ToInt] (U pos) -> U
633
908
 
634
909
  # <!--
635
910
  # rdoc-file=dir.c
636
- # - dir.read -> string or nil
911
+ # - read -> string or nil
637
912
  # -->
638
- # Reads the next entry from *dir* and returns it as a string. Returns `nil` at
639
- # the end of the stream.
913
+ # Reads and returns the next entry name from `self`; returns `nil` if at
914
+ # end-of-stream; see [Dir As Stream-Like](rdoc-ref:Dir@Dir+As+Stream-Like):
640
915
  #
641
- # d = Dir.new("testdir")
642
- # d.read #=> "."
643
- # d.read #=> ".."
644
- # d.read #=> "config.h"
916
+ # dir = Dir.new('example')
917
+ # dir.read # => "."
918
+ # dir.read # => ".."
919
+ # dir.read # => "config.h"
645
920
  #
646
921
  def read: () -> String?
647
922
 
648
923
  # <!--
649
924
  # rdoc-file=dir.c
650
- # - dir.rewind -> dir
925
+ # - rewind -> self
651
926
  # -->
652
- # Repositions *dir* to the first entry.
927
+ # Sets the position in `self` to zero; see [Dir As
928
+ # Stream-Like](rdoc-ref:Dir@Dir+As+Stream-Like):
653
929
  #
654
- # d = Dir.new("testdir")
655
- # d.read #=> "."
656
- # d.rewind #=> #<Dir:0x401b3fb0>
657
- # d.read #=> "."
930
+ # dir = Dir.new('example')
931
+ # dir.read # => "."
932
+ # dir.read # => ".."
933
+ # dir.pos # => 2
934
+ # dir.rewind # => #<Dir:example>
935
+ # dir.pos # => 0
658
936
  #
659
937
  def rewind: () -> self
660
938
 
661
939
  # <!--
662
940
  # rdoc-file=dir.c
663
- # - dir.seek( integer ) -> dir
941
+ # - seek(position) -> self
664
942
  # -->
665
- # Seeks to a particular location in *dir*. *integer* must be a value returned by
666
- # Dir#tell.
943
+ # Sets the position in `self` and returns `self`. The value of `position` should
944
+ # have been returned from an earlier call to #tell; if not, the return values
945
+ # from subsequent calls to #read are unspecified.
946
+ #
947
+ # See [Dir As Stream-Like](rdoc-ref:Dir@Dir+As+Stream-Like).
948
+ #
949
+ # Examples:
667
950
  #
668
- # d = Dir.new("testdir") #=> #<Dir:0x401b3c40>
669
- # d.read #=> "."
670
- # i = d.tell #=> 12
671
- # d.read #=> ".."
672
- # d.seek(i) #=> #<Dir:0x401b3c40>
673
- # d.read #=> ".."
951
+ # dir = Dir.new('example')
952
+ # dir.pos # => 0
953
+ # dir.seek(3) # => #<Dir:example>
954
+ # dir.pos # => 3
955
+ # dir.seek(30) # => #<Dir:example>
956
+ # dir.pos # => 5
674
957
  #
675
- def seek: (Integer) -> self
958
+ def seek: (int pos) -> self
676
959
 
677
960
  # <!--
678
961
  # rdoc-file=dir.c
679
- # - dir.pos -> integer
680
- # - dir.tell -> integer
962
+ # - tell -> integer
681
963
  # -->
682
- # Returns the current position in *dir*. See also Dir#seek.
964
+ # Returns the current position of `self`; see [Dir As
965
+ # Stream-Like](rdoc-ref:Dir@Dir+As+Stream-Like):
683
966
  #
684
- # d = Dir.new("testdir")
685
- # d.tell #=> 0
686
- # d.read #=> "."
687
- # d.tell #=> 12
967
+ # dir = Dir.new('example')
968
+ # dir.tell # => 0
969
+ # dir.read # => "."
970
+ # dir.tell # => 1
688
971
  #
689
- def tell: () -> Integer
972
+ alias tell pos
690
973
 
691
974
  # <!-- rdoc-file=dir.c -->
692
- # Returns the path parameter passed to *dir*'s constructor.
975
+ # Returns the `dirpath` string that was used to create `self` (or `nil` if
976
+ # created by method Dir.for_fd):
693
977
  #
694
- # d = Dir.new("..")
695
- # d.path #=> ".."
978
+ # Dir.new('example').path # => "example"
696
979
  #
697
980
  alias to_path path
698
981
  end