rbs-relaxed 3.9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +22 -0
  3. data/.github/workflows/comments.yml +35 -0
  4. data/.github/workflows/dependabot.yml +30 -0
  5. data/.github/workflows/ruby.yml +82 -0
  6. data/.github/workflows/typecheck.yml +38 -0
  7. data/.github/workflows/windows.yml +43 -0
  8. data/.gitignore +23 -0
  9. data/.rubocop.yml +68 -0
  10. data/BSDL +22 -0
  11. data/CHANGELOG.md +1868 -0
  12. data/COPYING +56 -0
  13. data/README.md +203 -0
  14. data/Rakefile +417 -0
  15. data/Steepfile +44 -0
  16. data/config.yml +313 -0
  17. data/core/array.rbs +4062 -0
  18. data/core/basic_object.rbs +375 -0
  19. data/core/binding.rbs +150 -0
  20. data/core/builtin.rbs +277 -0
  21. data/core/class.rbs +220 -0
  22. data/core/comparable.rbs +171 -0
  23. data/core/complex.rbs +786 -0
  24. data/core/constants.rbs +96 -0
  25. data/core/data.rbs +415 -0
  26. data/core/dir.rbs +981 -0
  27. data/core/encoding.rbs +1371 -0
  28. data/core/enumerable.rbs +2405 -0
  29. data/core/enumerator/product.rbs +92 -0
  30. data/core/enumerator.rbs +630 -0
  31. data/core/env.rbs +6 -0
  32. data/core/errno.rbs +673 -0
  33. data/core/errors.rbs +760 -0
  34. data/core/exception.rbs +485 -0
  35. data/core/false_class.rbs +82 -0
  36. data/core/fiber.rbs +550 -0
  37. data/core/fiber_error.rbs +11 -0
  38. data/core/file.rbs +2936 -0
  39. data/core/file_test.rbs +331 -0
  40. data/core/float.rbs +1151 -0
  41. data/core/gc.rbs +644 -0
  42. data/core/global_variables.rbs +184 -0
  43. data/core/hash.rbs +1861 -0
  44. data/core/integer.rbs +1413 -0
  45. data/core/io/buffer.rbs +984 -0
  46. data/core/io/wait.rbs +70 -0
  47. data/core/io.rbs +3406 -0
  48. data/core/kernel.rbs +3096 -0
  49. data/core/marshal.rbs +207 -0
  50. data/core/match_data.rbs +635 -0
  51. data/core/math.rbs +729 -0
  52. data/core/method.rbs +386 -0
  53. data/core/module.rbs +1704 -0
  54. data/core/nil_class.rbs +209 -0
  55. data/core/numeric.rbs +818 -0
  56. data/core/object.rbs +110 -0
  57. data/core/object_space/weak_key_map.rbs +166 -0
  58. data/core/object_space.rbs +190 -0
  59. data/core/proc.rbs +868 -0
  60. data/core/process.rbs +2296 -0
  61. data/core/ractor.rbs +1068 -0
  62. data/core/random.rbs +237 -0
  63. data/core/range.rbs +1107 -0
  64. data/core/rational.rbs +531 -0
  65. data/core/rb_config.rbs +88 -0
  66. data/core/rbs/unnamed/argf.rbs +1229 -0
  67. data/core/rbs/unnamed/env_class.rbs +1209 -0
  68. data/core/rbs/unnamed/random.rbs +293 -0
  69. data/core/refinement.rbs +59 -0
  70. data/core/regexp.rbs +1930 -0
  71. data/core/ruby_vm.rbs +765 -0
  72. data/core/rubygems/basic_specification.rbs +6 -0
  73. data/core/rubygems/config_file.rbs +38 -0
  74. data/core/rubygems/dependency_installer.rbs +6 -0
  75. data/core/rubygems/errors.rbs +176 -0
  76. data/core/rubygems/installer.rbs +15 -0
  77. data/core/rubygems/path_support.rbs +6 -0
  78. data/core/rubygems/platform.rbs +7 -0
  79. data/core/rubygems/request_set.rbs +49 -0
  80. data/core/rubygems/requirement.rbs +148 -0
  81. data/core/rubygems/rubygems.rbs +1171 -0
  82. data/core/rubygems/source_list.rbs +15 -0
  83. data/core/rubygems/specification.rbs +23 -0
  84. data/core/rubygems/stream_ui.rbs +5 -0
  85. data/core/rubygems/uninstaller.rbs +10 -0
  86. data/core/rubygems/version.rbs +294 -0
  87. data/core/set.rbs +621 -0
  88. data/core/signal.rbs +100 -0
  89. data/core/string.rbs +3583 -0
  90. data/core/struct.rbs +667 -0
  91. data/core/symbol.rbs +475 -0
  92. data/core/thread.rbs +1765 -0
  93. data/core/thread_group.rbs +79 -0
  94. data/core/time.rbs +1762 -0
  95. data/core/trace_point.rbs +477 -0
  96. data/core/true_class.rbs +98 -0
  97. data/core/unbound_method.rbs +329 -0
  98. data/core/warning.rbs +87 -0
  99. data/docs/CONTRIBUTING.md +106 -0
  100. data/docs/architecture.md +110 -0
  101. data/docs/collection.md +192 -0
  102. data/docs/data_and_struct.md +86 -0
  103. data/docs/gem.md +57 -0
  104. data/docs/rbs_by_example.md +309 -0
  105. data/docs/repo.md +125 -0
  106. data/docs/sigs.md +167 -0
  107. data/docs/stdlib.md +147 -0
  108. data/docs/syntax.md +910 -0
  109. data/docs/tools.md +17 -0
  110. data/exe/rbs +7 -0
  111. data/ext/rbs_extension/extconf.rb +15 -0
  112. data/ext/rbs_extension/lexer.c +2728 -0
  113. data/ext/rbs_extension/lexer.h +179 -0
  114. data/ext/rbs_extension/lexer.re +147 -0
  115. data/ext/rbs_extension/lexstate.c +175 -0
  116. data/ext/rbs_extension/location.c +325 -0
  117. data/ext/rbs_extension/location.h +85 -0
  118. data/ext/rbs_extension/main.c +33 -0
  119. data/ext/rbs_extension/parser.c +2973 -0
  120. data/ext/rbs_extension/parser.h +18 -0
  121. data/ext/rbs_extension/parserstate.c +397 -0
  122. data/ext/rbs_extension/parserstate.h +163 -0
  123. data/ext/rbs_extension/rbs_extension.h +31 -0
  124. data/ext/rbs_extension/unescape.c +32 -0
  125. data/goodcheck.yml +91 -0
  126. data/include/rbs/constants.h +82 -0
  127. data/include/rbs/ruby_objs.h +72 -0
  128. data/include/rbs/util/rbs_constant_pool.h +219 -0
  129. data/include/rbs.h +7 -0
  130. data/lib/rbs/ancestor_graph.rb +92 -0
  131. data/lib/rbs/annotate/annotations.rb +199 -0
  132. data/lib/rbs/annotate/formatter.rb +92 -0
  133. data/lib/rbs/annotate/rdoc_annotator.rb +400 -0
  134. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  135. data/lib/rbs/annotate.rb +8 -0
  136. data/lib/rbs/ast/annotation.rb +29 -0
  137. data/lib/rbs/ast/comment.rb +29 -0
  138. data/lib/rbs/ast/declarations.rb +467 -0
  139. data/lib/rbs/ast/directives.rb +49 -0
  140. data/lib/rbs/ast/members.rb +451 -0
  141. data/lib/rbs/ast/type_param.rb +225 -0
  142. data/lib/rbs/ast/visitor.rb +137 -0
  143. data/lib/rbs/buffer.rb +67 -0
  144. data/lib/rbs/builtin_names.rb +58 -0
  145. data/lib/rbs/cli/colored_io.rb +48 -0
  146. data/lib/rbs/cli/diff.rb +83 -0
  147. data/lib/rbs/cli/validate.rb +357 -0
  148. data/lib/rbs/cli.rb +1223 -0
  149. data/lib/rbs/collection/cleaner.rb +38 -0
  150. data/lib/rbs/collection/config/lockfile.rb +92 -0
  151. data/lib/rbs/collection/config/lockfile_generator.rb +218 -0
  152. data/lib/rbs/collection/config.rb +81 -0
  153. data/lib/rbs/collection/installer.rb +32 -0
  154. data/lib/rbs/collection/sources/base.rb +14 -0
  155. data/lib/rbs/collection/sources/git.rb +258 -0
  156. data/lib/rbs/collection/sources/local.rb +81 -0
  157. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  158. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  159. data/lib/rbs/collection/sources.rb +38 -0
  160. data/lib/rbs/collection.rb +16 -0
  161. data/lib/rbs/constant.rb +28 -0
  162. data/lib/rbs/definition.rb +401 -0
  163. data/lib/rbs/definition_builder/ancestor_builder.rb +620 -0
  164. data/lib/rbs/definition_builder/method_builder.rb +254 -0
  165. data/lib/rbs/definition_builder.rb +845 -0
  166. data/lib/rbs/diff.rb +125 -0
  167. data/lib/rbs/environment/use_map.rb +77 -0
  168. data/lib/rbs/environment.rb +829 -0
  169. data/lib/rbs/environment_loader.rb +173 -0
  170. data/lib/rbs/environment_walker.rb +155 -0
  171. data/lib/rbs/errors.rb +645 -0
  172. data/lib/rbs/factory.rb +18 -0
  173. data/lib/rbs/file_finder.rb +28 -0
  174. data/lib/rbs/location_aux.rb +138 -0
  175. data/lib/rbs/locator.rb +243 -0
  176. data/lib/rbs/method_type.rb +143 -0
  177. data/lib/rbs/namespace.rb +125 -0
  178. data/lib/rbs/parser/lex_result.rb +15 -0
  179. data/lib/rbs/parser/token.rb +23 -0
  180. data/lib/rbs/parser_aux.rb +114 -0
  181. data/lib/rbs/prototype/helpers.rb +140 -0
  182. data/lib/rbs/prototype/node_usage.rb +99 -0
  183. data/lib/rbs/prototype/rb.rb +840 -0
  184. data/lib/rbs/prototype/rbi.rb +641 -0
  185. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  186. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  187. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  188. data/lib/rbs/prototype/runtime.rb +667 -0
  189. data/lib/rbs/repository.rb +127 -0
  190. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  191. data/lib/rbs/resolver/type_name_resolver.rb +91 -0
  192. data/lib/rbs/sorter.rb +198 -0
  193. data/lib/rbs/substitution.rb +83 -0
  194. data/lib/rbs/subtractor.rb +201 -0
  195. data/lib/rbs/test/errors.rb +80 -0
  196. data/lib/rbs/test/guaranteed.rb +30 -0
  197. data/lib/rbs/test/hook.rb +212 -0
  198. data/lib/rbs/test/observer.rb +19 -0
  199. data/lib/rbs/test/setup.rb +84 -0
  200. data/lib/rbs/test/setup_helper.rb +50 -0
  201. data/lib/rbs/test/tester.rb +167 -0
  202. data/lib/rbs/test/type_check.rb +435 -0
  203. data/lib/rbs/test.rb +112 -0
  204. data/lib/rbs/type_alias_dependency.rb +100 -0
  205. data/lib/rbs/type_alias_regularity.rb +126 -0
  206. data/lib/rbs/type_name.rb +109 -0
  207. data/lib/rbs/types.rb +1596 -0
  208. data/lib/rbs/unit_test/convertibles.rb +176 -0
  209. data/lib/rbs/unit_test/spy.rb +138 -0
  210. data/lib/rbs/unit_test/type_assertions.rb +347 -0
  211. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  212. data/lib/rbs/unit_test.rb +6 -0
  213. data/lib/rbs/validator.rb +186 -0
  214. data/lib/rbs/variance_calculator.rb +189 -0
  215. data/lib/rbs/vendorer.rb +71 -0
  216. data/lib/rbs/version.rb +5 -0
  217. data/lib/rbs/writer.rb +424 -0
  218. data/lib/rbs.rb +94 -0
  219. data/lib/rdoc/discover.rb +20 -0
  220. data/lib/rdoc_plugin/parser.rb +163 -0
  221. data/rbs-relaxed.gemspec +48 -0
  222. data/schema/annotation.json +14 -0
  223. data/schema/comment.json +26 -0
  224. data/schema/decls.json +326 -0
  225. data/schema/function.json +87 -0
  226. data/schema/location.json +56 -0
  227. data/schema/members.json +266 -0
  228. data/schema/methodType.json +50 -0
  229. data/schema/typeParam.json +36 -0
  230. data/schema/types.json +317 -0
  231. data/sig/ancestor_builder.rbs +163 -0
  232. data/sig/ancestor_graph.rbs +60 -0
  233. data/sig/annotate/annotations.rbs +102 -0
  234. data/sig/annotate/formatter.rbs +24 -0
  235. data/sig/annotate/rdoc_annotater.rbs +82 -0
  236. data/sig/annotate/rdoc_source.rbs +30 -0
  237. data/sig/annotation.rbs +27 -0
  238. data/sig/buffer.rbs +32 -0
  239. data/sig/builtin_names.rbs +44 -0
  240. data/sig/cli/colored_io.rbs +15 -0
  241. data/sig/cli/diff.rbs +21 -0
  242. data/sig/cli/validate.rbs +43 -0
  243. data/sig/cli.rbs +87 -0
  244. data/sig/collection/cleaner.rbs +13 -0
  245. data/sig/collection/config/lockfile.rbs +74 -0
  246. data/sig/collection/config/lockfile_generator.rbs +66 -0
  247. data/sig/collection/config.rbs +46 -0
  248. data/sig/collection/installer.rbs +17 -0
  249. data/sig/collection/sources.rbs +214 -0
  250. data/sig/collection.rbs +4 -0
  251. data/sig/comment.rbs +26 -0
  252. data/sig/constant.rbs +21 -0
  253. data/sig/declarations.rbs +267 -0
  254. data/sig/definition.rbs +173 -0
  255. data/sig/definition_builder.rbs +165 -0
  256. data/sig/diff.rbs +28 -0
  257. data/sig/directives.rbs +77 -0
  258. data/sig/environment.rbs +279 -0
  259. data/sig/environment_loader.rbs +111 -0
  260. data/sig/environment_walker.rbs +65 -0
  261. data/sig/errors.rbs +405 -0
  262. data/sig/factory.rbs +5 -0
  263. data/sig/file_finder.rbs +28 -0
  264. data/sig/location.rbs +110 -0
  265. data/sig/locator.rbs +58 -0
  266. data/sig/manifest.yaml +7 -0
  267. data/sig/members.rbs +258 -0
  268. data/sig/method_builder.rbs +84 -0
  269. data/sig/method_types.rbs +58 -0
  270. data/sig/namespace.rbs +146 -0
  271. data/sig/parser.rbs +100 -0
  272. data/sig/prototype/helpers.rbs +27 -0
  273. data/sig/prototype/node_usage.rbs +20 -0
  274. data/sig/prototype/rb.rbs +96 -0
  275. data/sig/prototype/rbi.rbs +75 -0
  276. data/sig/prototype/runtime.rbs +182 -0
  277. data/sig/rbs.rbs +21 -0
  278. data/sig/rdoc/rbs.rbs +67 -0
  279. data/sig/repository.rbs +85 -0
  280. data/sig/resolver/constant_resolver.rbs +92 -0
  281. data/sig/resolver/context.rbs +34 -0
  282. data/sig/resolver/type_name_resolver.rbs +35 -0
  283. data/sig/shims/bundler.rbs +38 -0
  284. data/sig/shims/enumerable.rbs +5 -0
  285. data/sig/shims/rubygems.rbs +19 -0
  286. data/sig/sorter.rbs +41 -0
  287. data/sig/substitution.rbs +48 -0
  288. data/sig/subtractor.rbs +37 -0
  289. data/sig/test/errors.rbs +52 -0
  290. data/sig/test/guranteed.rbs +9 -0
  291. data/sig/test/type_check.rbs +19 -0
  292. data/sig/test.rbs +82 -0
  293. data/sig/type_alias_dependency.rbs +53 -0
  294. data/sig/type_alias_regularity.rbs +98 -0
  295. data/sig/type_param.rbs +110 -0
  296. data/sig/typename.rbs +79 -0
  297. data/sig/types.rbs +579 -0
  298. data/sig/unit_test/convertibles.rbs +154 -0
  299. data/sig/unit_test/spy.rbs +30 -0
  300. data/sig/unit_test/type_assertions.rbs +196 -0
  301. data/sig/unit_test/with_aliases.rbs +136 -0
  302. data/sig/use_map.rbs +35 -0
  303. data/sig/util.rbs +9 -0
  304. data/sig/validator.rbs +63 -0
  305. data/sig/variance_calculator.rbs +87 -0
  306. data/sig/vendorer.rbs +51 -0
  307. data/sig/version.rbs +3 -0
  308. data/sig/visitor.rbs +47 -0
  309. data/sig/writer.rbs +127 -0
  310. data/src/constants.c +153 -0
  311. data/src/ruby_objs.c +795 -0
  312. data/src/util/rbs_constant_pool.c +342 -0
  313. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  314. data/stdlib/abbrev/0/array.rbs +26 -0
  315. data/stdlib/base64/0/base64.rbs +355 -0
  316. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  317. data/stdlib/bigdecimal/0/big_decimal.rbs +1629 -0
  318. data/stdlib/bigdecimal-math/0/big_math.rbs +119 -0
  319. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  320. data/stdlib/cgi/0/core.rbs +1285 -0
  321. data/stdlib/cgi/0/manifest.yaml +3 -0
  322. data/stdlib/coverage/0/coverage.rbs +263 -0
  323. data/stdlib/csv/0/csv.rbs +3776 -0
  324. data/stdlib/csv/0/manifest.yaml +3 -0
  325. data/stdlib/date/0/date.rbs +1585 -0
  326. data/stdlib/date/0/date_time.rbs +616 -0
  327. data/stdlib/date/0/time.rbs +26 -0
  328. data/stdlib/dbm/0/dbm.rbs +421 -0
  329. data/stdlib/delegate/0/delegator.rbs +184 -0
  330. data/stdlib/delegate/0/kernel.rbs +47 -0
  331. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  332. data/stdlib/did_you_mean/0/did_you_mean.rbs +343 -0
  333. data/stdlib/digest/0/digest.rbs +577 -0
  334. data/stdlib/erb/0/erb.rbs +532 -0
  335. data/stdlib/etc/0/etc.rbs +865 -0
  336. data/stdlib/fileutils/0/fileutils.rbs +1734 -0
  337. data/stdlib/find/0/find.rbs +49 -0
  338. data/stdlib/forwardable/0/forwardable.rbs +268 -0
  339. data/stdlib/io-console/0/io-console.rbs +414 -0
  340. data/stdlib/ipaddr/0/ipaddr.rbs +428 -0
  341. data/stdlib/json/0/json.rbs +1916 -0
  342. data/stdlib/kconv/0/kconv.rbs +166 -0
  343. data/stdlib/logger/0/formatter.rbs +45 -0
  344. data/stdlib/logger/0/log_device.rbs +100 -0
  345. data/stdlib/logger/0/logger.rbs +796 -0
  346. data/stdlib/logger/0/manifest.yaml +2 -0
  347. data/stdlib/logger/0/period.rbs +17 -0
  348. data/stdlib/logger/0/severity.rbs +34 -0
  349. data/stdlib/minitest/0/kernel.rbs +42 -0
  350. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  351. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  352. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  353. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  354. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  355. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  356. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  357. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  358. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  359. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  360. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  361. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  362. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  363. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  364. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  365. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  366. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  367. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  368. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  369. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  370. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  371. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  372. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  373. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  374. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  375. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  376. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  377. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  378. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  379. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  380. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  381. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  382. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  383. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  384. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  385. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  386. data/stdlib/minitest/0/minitest.rbs +115 -0
  387. data/stdlib/monitor/0/monitor.rbs +363 -0
  388. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  389. data/stdlib/net-http/0/manifest.yaml +3 -0
  390. data/stdlib/net-http/0/net-http.rbs +5552 -0
  391. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  392. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  393. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  394. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  395. data/stdlib/nkf/0/nkf.rbs +402 -0
  396. data/stdlib/objspace/0/objspace.rbs +487 -0
  397. data/stdlib/observable/0/observable.rbs +217 -0
  398. data/stdlib/open-uri/0/manifest.yaml +4 -0
  399. data/stdlib/open-uri/0/open-uri.rbs +393 -0
  400. data/stdlib/open3/0/open3.rbs +147 -0
  401. data/stdlib/openssl/0/manifest.yaml +3 -0
  402. data/stdlib/openssl/0/openssl.rbs +12113 -0
  403. data/stdlib/optparse/0/optparse.rbs +1725 -0
  404. data/stdlib/pathname/0/pathname.rbs +1406 -0
  405. data/stdlib/pp/0/manifest.yaml +2 -0
  406. data/stdlib/pp/0/pp.rbs +300 -0
  407. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  408. data/stdlib/pstore/0/pstore.rbs +603 -0
  409. data/stdlib/psych/0/core_ext.rbs +12 -0
  410. data/stdlib/psych/0/dbm.rbs +237 -0
  411. data/stdlib/psych/0/manifest.yaml +3 -0
  412. data/stdlib/psych/0/psych.rbs +402 -0
  413. data/stdlib/psych/0/store.rbs +59 -0
  414. data/stdlib/pty/0/pty.rbs +237 -0
  415. data/stdlib/rdoc/0/code_object.rbs +51 -0
  416. data/stdlib/rdoc/0/comment.rbs +59 -0
  417. data/stdlib/rdoc/0/context.rbs +153 -0
  418. data/stdlib/rdoc/0/markup.rbs +117 -0
  419. data/stdlib/rdoc/0/parser.rbs +56 -0
  420. data/stdlib/rdoc/0/rdoc.rbs +391 -0
  421. data/stdlib/rdoc/0/ri.rbs +17 -0
  422. data/stdlib/rdoc/0/store.rbs +48 -0
  423. data/stdlib/rdoc/0/top_level.rbs +97 -0
  424. data/stdlib/resolv/0/manifest.yaml +3 -0
  425. data/stdlib/resolv/0/resolv.rbs +1830 -0
  426. data/stdlib/ripper/0/ripper.rbs +1648 -0
  427. data/stdlib/securerandom/0/securerandom.rbs +62 -0
  428. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  429. data/stdlib/singleton/0/singleton.rbs +131 -0
  430. data/stdlib/socket/0/addrinfo.rbs +666 -0
  431. data/stdlib/socket/0/basic_socket.rbs +590 -0
  432. data/stdlib/socket/0/constants.rbs +2295 -0
  433. data/stdlib/socket/0/ip_socket.rbs +92 -0
  434. data/stdlib/socket/0/socket.rbs +4157 -0
  435. data/stdlib/socket/0/socket_error.rbs +5 -0
  436. data/stdlib/socket/0/tcp_server.rbs +192 -0
  437. data/stdlib/socket/0/tcp_socket.rbs +79 -0
  438. data/stdlib/socket/0/udp_socket.rbs +133 -0
  439. data/stdlib/socket/0/unix_server.rbs +169 -0
  440. data/stdlib/socket/0/unix_socket.rbs +172 -0
  441. data/stdlib/stringio/0/stringio.rbs +567 -0
  442. data/stdlib/strscan/0/string_scanner.rbs +1627 -0
  443. data/stdlib/tempfile/0/tempfile.rbs +479 -0
  444. data/stdlib/time/0/time.rbs +432 -0
  445. data/stdlib/timeout/0/timeout.rbs +81 -0
  446. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  447. data/stdlib/tsort/0/cyclic.rbs +5 -0
  448. data/stdlib/tsort/0/interfaces.rbs +20 -0
  449. data/stdlib/tsort/0/tsort.rbs +409 -0
  450. data/stdlib/uri/0/common.rbs +582 -0
  451. data/stdlib/uri/0/file.rbs +118 -0
  452. data/stdlib/uri/0/ftp.rbs +13 -0
  453. data/stdlib/uri/0/generic.rbs +1108 -0
  454. data/stdlib/uri/0/http.rbs +104 -0
  455. data/stdlib/uri/0/https.rbs +14 -0
  456. data/stdlib/uri/0/ldap.rbs +230 -0
  457. data/stdlib/uri/0/ldaps.rbs +14 -0
  458. data/stdlib/uri/0/mailto.rbs +92 -0
  459. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  460. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  461. data/stdlib/uri/0/ws.rbs +13 -0
  462. data/stdlib/uri/0/wss.rbs +9 -0
  463. data/stdlib/yaml/0/manifest.yaml +2 -0
  464. data/stdlib/yaml/0/yaml.rbs +1 -0
  465. data/stdlib/zlib/0/buf_error.rbs +10 -0
  466. data/stdlib/zlib/0/data_error.rbs +10 -0
  467. data/stdlib/zlib/0/deflate.rbs +210 -0
  468. data/stdlib/zlib/0/error.rbs +20 -0
  469. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  470. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  471. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  472. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  473. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  474. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  475. data/stdlib/zlib/0/gzip_writer.rbs +166 -0
  476. data/stdlib/zlib/0/inflate.rbs +180 -0
  477. data/stdlib/zlib/0/mem_error.rbs +10 -0
  478. data/stdlib/zlib/0/need_dict.rbs +13 -0
  479. data/stdlib/zlib/0/stream_end.rbs +11 -0
  480. data/stdlib/zlib/0/stream_error.rbs +11 -0
  481. data/stdlib/zlib/0/version_error.rbs +11 -0
  482. data/stdlib/zlib/0/zlib.rbs +449 -0
  483. data/stdlib/zlib/0/zstream.rbs +200 -0
  484. metadata +532 -0
data/core/ractor.rbs ADDED
@@ -0,0 +1,1068 @@
1
+ # <!-- rdoc-file=ractor.rb -->
2
+ # Ractor is an Actor-model abstraction for Ruby that provides thread-safe
3
+ # parallel execution.
4
+ #
5
+ # Ractor.new makes a new Ractor, which can run in parallel.
6
+ #
7
+ # # The simplest ractor
8
+ # r = Ractor.new {puts "I am in Ractor!"}
9
+ # r.take # wait for it to finish
10
+ # # Here, "I am in Ractor!" is printed
11
+ #
12
+ # Ractors do not share all objects with each other. There are two main benefits
13
+ # to this: across ractors, thread-safety concerns such as data-races and
14
+ # race-conditions are not possible. The other benefit is parallelism.
15
+ #
16
+ # To achieve this, object sharing is limited across ractors. For example, unlike
17
+ # in threads, ractors can't access all the objects available in other ractors.
18
+ # Even objects normally available through variables in the outer scope are
19
+ # prohibited from being used across ractors.
20
+ #
21
+ # a = 1
22
+ # r = Ractor.new {puts "I am in Ractor! a=#{a}"}
23
+ # # fails immediately with
24
+ # # ArgumentError (can not isolate a Proc because it accesses outer variables (a).)
25
+ #
26
+ # The object must be explicitly shared:
27
+ # a = 1
28
+ # r = Ractor.new(a) { |a1| puts "I am in Ractor! a=#{a1}"}
29
+ #
30
+ # On CRuby (the default implementation), Global Virtual Machine Lock (GVL) is
31
+ # held per ractor, so ractors can perform in parallel without locking each
32
+ # other. This is unlike the situation with threads on CRuby.
33
+ #
34
+ # Instead of accessing shared state, objects should be passed to and from
35
+ # ractors by sending and receiving them as messages.
36
+ #
37
+ # a = 1
38
+ # r = Ractor.new do
39
+ # a_in_ractor = receive # receive blocks until somebody passes a message
40
+ # puts "I am in Ractor! a=#{a_in_ractor}"
41
+ # end
42
+ # r.send(a) # pass it
43
+ # r.take
44
+ # # Here, "I am in Ractor! a=1" is printed
45
+ #
46
+ # There are two pairs of methods for sending/receiving messages:
47
+ #
48
+ # * Ractor#send and Ractor.receive for when the *sender* knows the receiver
49
+ # (push);
50
+ # * Ractor.yield and Ractor#take for when the *receiver* knows the sender
51
+ # (pull);
52
+ #
53
+ # In addition to that, any arguments passed to Ractor.new are passed to the
54
+ # block and available there as if received by Ractor.receive, and the last block
55
+ # value is sent outside of the ractor as if sent by Ractor.yield.
56
+ #
57
+ # A little demonstration of a classic ping-pong:
58
+ #
59
+ # server = Ractor.new(name: "server") do
60
+ # puts "Server starts: #{self.inspect}"
61
+ # puts "Server sends: ping"
62
+ # Ractor.yield 'ping' # The server doesn't know the receiver and sends to whoever interested
63
+ # received = Ractor.receive # The server doesn't know the sender and receives from whoever sent
64
+ # puts "Server received: #{received}"
65
+ # end
66
+ #
67
+ # client = Ractor.new(server) do |srv| # The server is sent to the client, and available as srv
68
+ # puts "Client starts: #{self.inspect}"
69
+ # received = srv.take # The client takes a message from the server
70
+ # puts "Client received from " \
71
+ # "#{srv.inspect}: #{received}"
72
+ # puts "Client sends to " \
73
+ # "#{srv.inspect}: pong"
74
+ # srv.send 'pong' # The client sends a message to the server
75
+ # end
76
+ #
77
+ # [client, server].each(&:take) # Wait until they both finish
78
+ #
79
+ # This will output something like:
80
+ #
81
+ # Server starts: #<Ractor:#2 server test.rb:1 running>
82
+ # Server sends: ping
83
+ # Client starts: #<Ractor:#3 test.rb:8 running>
84
+ # Client received from #<Ractor:#2 server test.rb:1 blocking>: ping
85
+ # Client sends to #<Ractor:#2 server test.rb:1 blocking>: pong
86
+ # Server received: pong
87
+ #
88
+ # Ractors receive their messages via the *incoming port*, and send them to the
89
+ # *outgoing port*. Either one can be disabled with Ractor#close_incoming and
90
+ # Ractor#close_outgoing, respectively. When a ractor terminates, its ports are
91
+ # closed automatically.
92
+ #
93
+ # ## Shareable and unshareable objects
94
+ #
95
+ # When an object is sent to and from a ractor, it's important to understand
96
+ # whether the object is shareable or unshareable. Most Ruby objects are
97
+ # unshareable objects. Even frozen objects can be unshareable if they contain
98
+ # (through their instance variables) unfrozen objects.
99
+ #
100
+ # Shareable objects are those which can be used by several threads without
101
+ # compromising thread-safety, for example numbers, `true` and `false`.
102
+ # Ractor.shareable? allows you to check this, and Ractor.make_shareable tries to
103
+ # make the object shareable if it's not already, and gives an error if it can't
104
+ # do it.
105
+ #
106
+ # Ractor.shareable?(1) #=> true -- numbers and other immutable basic values are shareable
107
+ # Ractor.shareable?('foo') #=> false, unless the string is frozen due to # frozen_string_literal: true
108
+ # Ractor.shareable?('foo'.freeze) #=> true
109
+ # Ractor.shareable?([Object.new].freeze) #=> false, inner object is unfrozen
110
+ #
111
+ # ary = ['hello', 'world']
112
+ # ary.frozen? #=> false
113
+ # ary[0].frozen? #=> false
114
+ # Ractor.make_shareable(ary)
115
+ # ary.frozen? #=> true
116
+ # ary[0].frozen? #=> true
117
+ # ary[1].frozen? #=> true
118
+ #
119
+ # When a shareable object is sent (via #send or Ractor.yield), no additional
120
+ # processing occurs on it. It just becomes usable by both ractors. When an
121
+ # unshareable object is sent, it can be either *copied* or *moved*. The first is
122
+ # the default, and it copies the object fully by deep cloning (Object#clone) the
123
+ # non-shareable parts of its structure.
124
+ #
125
+ # data = ['foo', 'bar'.freeze]
126
+ # r = Ractor.new do
127
+ # data2 = Ractor.receive
128
+ # puts "In ractor: #{data2.object_id}, #{data2[0].object_id}, #{data2[1].object_id}"
129
+ # end
130
+ # r.send(data)
131
+ # r.take
132
+ # puts "Outside : #{data.object_id}, #{data[0].object_id}, #{data[1].object_id}"
133
+ #
134
+ # This will output something like:
135
+ #
136
+ # In ractor: 340, 360, 320
137
+ # Outside : 380, 400, 320
138
+ #
139
+ # Note that the object ids of the array and the non-frozen string inside the
140
+ # array have changed in the ractor because they are different objects. The
141
+ # second array's element, which is a shareable frozen string, is the same
142
+ # object.
143
+ #
144
+ # Deep cloning of objects may be slow, and sometimes impossible. Alternatively,
145
+ # `move: true` may be used during sending. This will *move* the unshareable
146
+ # object to the receiving ractor, making it inaccessible to the sending ractor.
147
+ #
148
+ # data = ['foo', 'bar']
149
+ # r = Ractor.new do
150
+ # data_in_ractor = Ractor.receive
151
+ # puts "In ractor: #{data_in_ractor.object_id}, #{data_in_ractor[0].object_id}"
152
+ # end
153
+ # r.send(data, move: true)
154
+ # r.take
155
+ # puts "Outside: moved? #{Ractor::MovedObject === data}"
156
+ # puts "Outside: #{data.inspect}"
157
+ #
158
+ # This will output:
159
+ #
160
+ # In ractor: 100, 120
161
+ # Outside: moved? true
162
+ # test.rb:9:in `method_missing': can not send any methods to a moved object (Ractor::MovedError)
163
+ #
164
+ # Notice that even `inspect` (and more basic methods like `__id__`) is
165
+ # inaccessible on a moved object.
166
+ #
167
+ # Class and Module objects are shareable so the class/module definitions are
168
+ # shared between ractors. Ractor objects are also shareable. All operations on
169
+ # shareable objects are thread-safe, so the thread-safety property will be kept.
170
+ # We can not define mutable shareable objects in Ruby, but C extensions can
171
+ # introduce them.
172
+ #
173
+ # It is prohibited to access (get) instance variables of shareable objects in
174
+ # other ractors if the values of the variables aren't shareable. This can occur
175
+ # because modules/classes are shareable, but they can have instance variables
176
+ # whose values are not. In non-main ractors, it's also prohibited to set
177
+ # instance variables on classes/modules (even if the value is shareable).
178
+ #
179
+ # class C
180
+ # class << self
181
+ # attr_accessor :tricky
182
+ # end
183
+ # end
184
+ #
185
+ # C.tricky = "unshareable".dup
186
+ #
187
+ # r = Ractor.new(C) do |cls|
188
+ # puts "I see #{cls}"
189
+ # puts "I can't see #{cls.tricky}"
190
+ # cls.tricky = true # doesn't get here, but this would also raise an error
191
+ # end
192
+ # r.take
193
+ # # I see C
194
+ # # can not access instance variables of classes/modules from non-main Ractors (RuntimeError)
195
+ #
196
+ # Ractors can access constants if they are shareable. The main Ractor is the
197
+ # only one that can access non-shareable constants.
198
+ #
199
+ # GOOD = 'good'.freeze
200
+ # BAD = 'bad'.dup
201
+ #
202
+ # r = Ractor.new do
203
+ # puts "GOOD=#{GOOD}"
204
+ # puts "BAD=#{BAD}"
205
+ # end
206
+ # r.take
207
+ # # GOOD=good
208
+ # # can not access non-shareable objects in constant Object::BAD by non-main Ractor. (NameError)
209
+ #
210
+ # # Consider the same C class from above
211
+ #
212
+ # r = Ractor.new do
213
+ # puts "I see #{C}"
214
+ # puts "I can't see #{C.tricky}"
215
+ # end
216
+ # r.take
217
+ # # I see C
218
+ # # can not access instance variables of classes/modules from non-main Ractors (RuntimeError)
219
+ #
220
+ # See also the description of `# shareable_constant_value` pragma in [Comments
221
+ # syntax](rdoc-ref:syntax/comments.rdoc) explanation.
222
+ #
223
+ # ## Ractors vs threads
224
+ #
225
+ # Each ractor has its own main Thread. New threads can be created from inside
226
+ # ractors (and, on CRuby, they share the GVL with other threads of this ractor).
227
+ #
228
+ # r = Ractor.new do
229
+ # a = 1
230
+ # Thread.new {puts "Thread in ractor: a=#{a}"}.join
231
+ # end
232
+ # r.take
233
+ # # Here "Thread in ractor: a=1" will be printed
234
+ #
235
+ # ## Note on code examples
236
+ #
237
+ # In the examples below, sometimes we use the following method to wait for
238
+ # ractors that are not currently blocked to finish (or to make progress).
239
+ #
240
+ # def wait
241
+ # sleep(0.1)
242
+ # end
243
+ #
244
+ # It is **only for demonstration purposes** and shouldn't be used in a real
245
+ # code. Most of the time, #take is used to wait for ractors to finish.
246
+ #
247
+ # ## Reference
248
+ #
249
+ # See [Ractor design doc](rdoc-ref:ractor.md) for more details.
250
+ #
251
+ class Ractor
252
+ # <!--
253
+ # rdoc-file=ractor.rb
254
+ # - _require(feature)
255
+ # -->
256
+ # internal method
257
+ #
258
+ def self._require: (String feature) -> bool
259
+
260
+ # <!--
261
+ # rdoc-file=ractor.rb
262
+ # - [](sym)
263
+ # -->
264
+ # get a value from ractor-local storage of current Ractor
265
+ #
266
+ def self.[]: (Symbol) -> untyped
267
+
268
+ # <!--
269
+ # rdoc-file=ractor.rb
270
+ # - []=(sym, val)
271
+ # -->
272
+ # set a value in ractor-local storage of current Ractor
273
+ #
274
+ def self.[]=: (Symbol, untyped) -> untyped
275
+
276
+ # <!--
277
+ # rdoc-file=ractor.rb
278
+ # - count()
279
+ # -->
280
+ # Returns the number of Ractors currently running or blocking (waiting).
281
+ #
282
+ # Ractor.count #=> 1
283
+ # r = Ractor.new(name: 'example') { Ractor.yield(1) }
284
+ # Ractor.count #=> 2 (main + example ractor)
285
+ # r.take # wait for Ractor.yield(1)
286
+ # r.take # wait until r will finish
287
+ # Ractor.count #=> 1
288
+ #
289
+ def self.count: () -> Integer
290
+
291
+ # <!--
292
+ # rdoc-file=ractor.rb
293
+ # - current()
294
+ # -->
295
+ # Returns the currently executing Ractor.
296
+ #
297
+ # Ractor.current #=> #<Ractor:#1 running>
298
+ #
299
+ def self.current: () -> untyped
300
+
301
+ # <!--
302
+ # rdoc-file=ractor.rb
303
+ # - main()
304
+ # -->
305
+ # returns main ractor
306
+ #
307
+ def self.main: () -> Ractor
308
+
309
+ # <!--
310
+ # rdoc-file=ractor.rb
311
+ # - main?()
312
+ # -->
313
+ # return true if the current ractor is main ractor
314
+ #
315
+ def self.main?: () -> boolish
316
+
317
+ # <!--
318
+ # rdoc-file=ractor.rb
319
+ # - Ractor.make_shareable(obj, copy: false) -> shareable_obj
320
+ # -->
321
+ # Make `obj` shareable between ractors.
322
+ #
323
+ # `obj` and all the objects it refers to will be frozen, unless they are already
324
+ # shareable.
325
+ #
326
+ # If `copy` keyword is `true`, it will copy objects before freezing them, and
327
+ # will not modify `obj` or its internal objects.
328
+ #
329
+ # Note that the specification and implementation of this method are not mature
330
+ # and may be changed in the future.
331
+ #
332
+ # obj = ['test']
333
+ # Ractor.shareable?(obj) #=> false
334
+ # Ractor.make_shareable(obj) #=> ["test"]
335
+ # Ractor.shareable?(obj) #=> true
336
+ # obj.frozen? #=> true
337
+ # obj[0].frozen? #=> true
338
+ #
339
+ # # Copy vs non-copy versions:
340
+ # obj1 = ['test']
341
+ # obj1s = Ractor.make_shareable(obj1)
342
+ # obj1.frozen? #=> true
343
+ # obj1s.object_id == obj1.object_id #=> true
344
+ # obj2 = ['test']
345
+ # obj2s = Ractor.make_shareable(obj2, copy: true)
346
+ # obj2.frozen? #=> false
347
+ # obj2s.frozen? #=> true
348
+ # obj2s.object_id == obj2.object_id #=> false
349
+ # obj2s[0].object_id == obj2[0].object_id #=> false
350
+ #
351
+ # See also the "Shareable and unshareable objects" section in the Ractor class
352
+ # docs.
353
+ #
354
+ def self.make_shareable: [T] (T obj, ?copy: boolish) -> T
355
+
356
+ # <!--
357
+ # rdoc-file=ractor.rb
358
+ # - Ractor.new(*args, name: nil) {|*args| block } -> ractor
359
+ # -->
360
+ # Create a new Ractor with args and a block.
361
+ #
362
+ # The given block (Proc) will be isolated (can't access any outer variables).
363
+ # `self` inside the block will refer to the current Ractor.
364
+ #
365
+ # r = Ractor.new { puts "Hi, I am #{self.inspect}" }
366
+ # r.take
367
+ # # Prints "Hi, I am #<Ractor:#2 test.rb:1 running>"
368
+ #
369
+ # Any `args` passed are propagated to the block arguments by the same rules as
370
+ # objects sent via #send/Ractor.receive. If an argument in `args` is not
371
+ # shareable, it will be copied (via deep cloning, which might be inefficient).
372
+ #
373
+ # arg = [1, 2, 3]
374
+ # puts "Passing: #{arg} (##{arg.object_id})"
375
+ # r = Ractor.new(arg) {|received_arg|
376
+ # puts "Received: #{received_arg} (##{received_arg.object_id})"
377
+ # }
378
+ # r.take
379
+ # # Prints:
380
+ # # Passing: [1, 2, 3] (#280)
381
+ # # Received: [1, 2, 3] (#300)
382
+ #
383
+ # Ractor's `name` can be set for debugging purposes:
384
+ #
385
+ # r = Ractor.new(name: 'my ractor') {}; r.take
386
+ # p r
387
+ # #=> #<Ractor:#3 my ractor test.rb:1 terminated>
388
+ #
389
+ def self.new: (*untyped args, ?name: string) { (?) -> untyped } -> Ractor
390
+
391
+ # <!--
392
+ # rdoc-file=ractor.rb
393
+ # - Ractor.receive -> msg
394
+ # -->
395
+ # Receive a message from the incoming port of the current ractor (which was sent
396
+ # there by #send from another ractor).
397
+ #
398
+ # r = Ractor.new do
399
+ # v1 = Ractor.receive
400
+ # puts "Received: #{v1}"
401
+ # end
402
+ # r.send('message1')
403
+ # r.take
404
+ # # Here will be printed: "Received: message1"
405
+ #
406
+ # Alternatively, the private instance method `receive` may be used:
407
+ #
408
+ # r = Ractor.new do
409
+ # v1 = receive
410
+ # puts "Received: #{v1}"
411
+ # end
412
+ # r.send('message1')
413
+ # r.take
414
+ # # This prints: "Received: message1"
415
+ #
416
+ # The method blocks if the queue is empty.
417
+ #
418
+ # r = Ractor.new do
419
+ # puts "Before first receive"
420
+ # v1 = Ractor.receive
421
+ # puts "Received: #{v1}"
422
+ # v2 = Ractor.receive
423
+ # puts "Received: #{v2}"
424
+ # end
425
+ # wait
426
+ # puts "Still not received"
427
+ # r.send('message1')
428
+ # wait
429
+ # puts "Still received only one"
430
+ # r.send('message2')
431
+ # r.take
432
+ #
433
+ # Output:
434
+ #
435
+ # Before first receive
436
+ # Still not received
437
+ # Received: message1
438
+ # Still received only one
439
+ # Received: message2
440
+ #
441
+ # If close_incoming was called on the ractor, the method raises
442
+ # Ractor::ClosedError if there are no more messages in the incoming queue:
443
+ #
444
+ # Ractor.new do
445
+ # close_incoming
446
+ # receive
447
+ # end
448
+ # wait
449
+ # # in `receive': The incoming port is already closed => #<Ractor:#2 test.rb:1 running> (Ractor::ClosedError)
450
+ #
451
+ def self.receive: () -> untyped
452
+
453
+ # <!--
454
+ # rdoc-file=ractor.rb
455
+ # - Ractor.receive_if {|msg| block } -> msg
456
+ # -->
457
+ # Receive only a specific message.
458
+ #
459
+ # Instead of Ractor.receive, Ractor.receive_if can be given a pattern (or any
460
+ # filter) in a block and you can choose the messages to accept that are
461
+ # available in your ractor's incoming queue.
462
+ #
463
+ # r = Ractor.new do
464
+ # p Ractor.receive_if{|msg| msg.match?(/foo/)} #=> "foo3"
465
+ # p Ractor.receive_if{|msg| msg.match?(/bar/)} #=> "bar1"
466
+ # p Ractor.receive_if{|msg| msg.match?(/baz/)} #=> "baz2"
467
+ # end
468
+ # r << "bar1"
469
+ # r << "baz2"
470
+ # r << "foo3"
471
+ # r.take
472
+ #
473
+ # This will output:
474
+ #
475
+ # foo3
476
+ # bar1
477
+ # baz2
478
+ #
479
+ # If the block returns a truthy value, the message is removed from the incoming
480
+ # queue and returned. Otherwise, the message remains in the incoming queue and
481
+ # the next messages are checked by the given block.
482
+ #
483
+ # If there are no messages left in the incoming queue, the method will block
484
+ # until new messages arrive.
485
+ #
486
+ # If the block is escaped by break/return/exception/throw, the message is
487
+ # removed from the incoming queue as if a truthy value had been returned.
488
+ #
489
+ # r = Ractor.new do
490
+ # val = Ractor.receive_if{|msg| msg.is_a?(Array)}
491
+ # puts "Received successfully: #{val}"
492
+ # end
493
+ #
494
+ # r.send(1)
495
+ # r.send('test')
496
+ # wait
497
+ # puts "2 non-matching sent, nothing received"
498
+ # r.send([1, 2, 3])
499
+ # wait
500
+ #
501
+ # Prints:
502
+ #
503
+ # 2 non-matching sent, nothing received
504
+ # Received successfully: [1, 2, 3]
505
+ #
506
+ # Note that you can not call receive/receive_if in the given block recursively.
507
+ # You should not do any tasks in the block other than message filtration.
508
+ #
509
+ # Ractor.current << true
510
+ # Ractor.receive_if{|msg| Ractor.receive}
511
+ # #=> `receive': can not call receive/receive_if recursively (Ractor::Error)
512
+ #
513
+ def self.receive_if: () { (untyped) -> boolish } -> untyped
514
+
515
+ # <!--
516
+ # rdoc-file=ractor.rb
517
+ # - recv()
518
+ # -->
519
+ #
520
+ alias self.recv self.receive
521
+
522
+ # <!--
523
+ # rdoc-file=ractor.rb
524
+ # - Ractor.select(*ractors, [yield_value:, move: false]) -> [ractor or symbol, obj]
525
+ # -->
526
+ # Wait for any ractor to have something in its outgoing port, read from this
527
+ # ractor, and then return that ractor and the object received.
528
+ #
529
+ # r1 = Ractor.new {Ractor.yield 'from 1'}
530
+ # r2 = Ractor.new {Ractor.yield 'from 2'}
531
+ #
532
+ # r, obj = Ractor.select(r1, r2)
533
+ #
534
+ # puts "received #{obj.inspect} from #{r.inspect}"
535
+ # # Prints: received "from 1" from #<Ractor:#2 test.rb:1 running>
536
+ # # But could just as well print "from r2" here, either prints could be first.
537
+ #
538
+ # If one of the given ractors is the current ractor, and it is selected, `r`
539
+ # will contain the `:receive` symbol instead of the ractor object.
540
+ #
541
+ # r1 = Ractor.new(Ractor.current) do |main|
542
+ # main.send 'to main'
543
+ # Ractor.yield 'from 1'
544
+ # end
545
+ # r2 = Ractor.new do
546
+ # Ractor.yield 'from 2'
547
+ # end
548
+ #
549
+ # r, obj = Ractor.select(r1, r2, Ractor.current)
550
+ # puts "received #{obj.inspect} from #{r.inspect}"
551
+ # # Could print: received "to main" from :receive
552
+ #
553
+ # If `yield_value` is provided, that value may be yielded if another ractor is
554
+ # calling #take. In this case, the pair `[:yield, nil]` is returned:
555
+ #
556
+ # r1 = Ractor.new(Ractor.current) do |main|
557
+ # puts "Received from main: #{main.take}"
558
+ # end
559
+ #
560
+ # puts "Trying to select"
561
+ # r, obj = Ractor.select(r1, Ractor.current, yield_value: 123)
562
+ # wait
563
+ # puts "Received #{obj.inspect} from #{r.inspect}"
564
+ #
565
+ # This will print:
566
+ #
567
+ # Trying to select
568
+ # Received from main: 123
569
+ # Received nil from :yield
570
+ #
571
+ # `move` boolean flag defines whether yielded value will be copied (default) or
572
+ # moved.
573
+ #
574
+ def self.select: (*Ractor ractors, ?move: boolish, ?yield_value: untyped) -> [ Ractor | Symbol, untyped ]
575
+
576
+ # <!--
577
+ # rdoc-file=ractor.rb
578
+ # - Ractor.shareable?(obj) -> true | false
579
+ # -->
580
+ # Checks if the object is shareable by ractors.
581
+ #
582
+ # Ractor.shareable?(1) #=> true -- numbers and other immutable basic values are frozen
583
+ # Ractor.shareable?('foo') #=> false, unless the string is frozen due to # frozen_string_literal: true
584
+ # Ractor.shareable?('foo'.freeze) #=> true
585
+ #
586
+ # See also the "Shareable and unshareable objects" section in the Ractor class
587
+ # docs.
588
+ #
589
+ def self.shareable?: (untyped obj) -> bool
590
+
591
+ # <!--
592
+ # rdoc-file=ractor.rb
593
+ # - Ractor.store_if_absent(key){ init_block }
594
+ # -->
595
+ # If the correponding value is not set, yield a value with init_block and store
596
+ # the value in thread-safe manner. This method returns corresponding stored
597
+ # value.
598
+ #
599
+ # (1..10).map{
600
+ # Thread.new(it){|i|
601
+ # Ractor.store_if_absent(:s){ f(); i }
602
+ # #=> return stored value of key :s
603
+ # }
604
+ # }.map(&:value).uniq.size #=> 1 and f() is called only once
605
+ #
606
+ def self.store_if_absent: [A] (Symbol) { (nil) -> A } -> A
607
+
608
+ # <!--
609
+ # rdoc-file=ractor.rb
610
+ # - Ractor.yield(msg, move: false) -> nil
611
+ # -->
612
+ # Send a message to the current ractor's outgoing port to be accepted by #take.
613
+ #
614
+ # r = Ractor.new {Ractor.yield 'Hello from ractor'}
615
+ # puts r.take
616
+ # # Prints: "Hello from ractor"
617
+ #
618
+ # This method is blocking, and will return only when somebody consumes the sent
619
+ # message.
620
+ #
621
+ # r = Ractor.new do
622
+ # Ractor.yield 'Hello from ractor'
623
+ # puts "Ractor: after yield"
624
+ # end
625
+ # wait
626
+ # puts "Still not taken"
627
+ # puts r.take
628
+ #
629
+ # This will print:
630
+ #
631
+ # Still not taken
632
+ # Hello from ractor
633
+ # Ractor: after yield
634
+ #
635
+ # If the outgoing port was closed with #close_outgoing, the method will raise:
636
+ #
637
+ # r = Ractor.new do
638
+ # close_outgoing
639
+ # Ractor.yield 'Hello from ractor'
640
+ # end
641
+ # wait
642
+ # # `yield': The outgoing-port is already closed (Ractor::ClosedError)
643
+ #
644
+ # The meaning of the `move` argument is the same as for #send.
645
+ #
646
+ def self.yield: (untyped obj, ?move: boolish) -> untyped
647
+
648
+ # <!--
649
+ # rdoc-file=ractor.rb
650
+ # - <<(obj, move: false)
651
+ # -->
652
+ #
653
+ alias << send
654
+
655
+ # <!--
656
+ # rdoc-file=ractor.rb
657
+ # - [](sym)
658
+ # -->
659
+ # get a value from ractor-local storage of current Ractor Obsolete and use
660
+ # Ractor.[] instead.
661
+ #
662
+ def []: (interned sym) -> untyped
663
+
664
+ # <!--
665
+ # rdoc-file=ractor.rb
666
+ # - []=(sym, val)
667
+ # -->
668
+ # set a value in ractor-local storage of current Ractor Obsolete and use
669
+ # Ractor.[]= instead.
670
+ #
671
+ def []=: [T] (interned sym, T val) -> T
672
+
673
+ # <!--
674
+ # rdoc-file=ractor.rb
675
+ # - ractor.close_incoming -> true | false
676
+ # -->
677
+ # Closes the incoming port and returns whether it was already closed. All
678
+ # further attempts to Ractor.receive in the ractor, and #send to the ractor will
679
+ # fail with Ractor::ClosedError.
680
+ #
681
+ # r = Ractor.new {sleep(500)}
682
+ # r.close_incoming #=> false
683
+ # r.close_incoming #=> true
684
+ # r.send('test')
685
+ # # Ractor::ClosedError (The incoming-port is already closed)
686
+ #
687
+ def close_incoming: () -> bool
688
+
689
+ # <!--
690
+ # rdoc-file=ractor.rb
691
+ # - ractor.close_outgoing -> true | false
692
+ # -->
693
+ # Closes the outgoing port and returns whether it was already closed. All
694
+ # further attempts to Ractor.yield in the ractor, and #take from the ractor will
695
+ # fail with Ractor::ClosedError.
696
+ #
697
+ # r = Ractor.new {sleep(500)}
698
+ # r.close_outgoing #=> false
699
+ # r.close_outgoing #=> true
700
+ # r.take
701
+ # # Ractor::ClosedError (The outgoing-port is already closed)
702
+ #
703
+ def close_outgoing: () -> bool
704
+
705
+ # <!--
706
+ # rdoc-file=ractor.rb
707
+ # - inspect()
708
+ # -->
709
+ #
710
+ def inspect: () -> String
711
+
712
+ # <!--
713
+ # rdoc-file=ractor.rb
714
+ # - name()
715
+ # -->
716
+ # The name set in Ractor.new, or `nil`.
717
+ #
718
+ def name: () -> String?
719
+
720
+ # <!--
721
+ # rdoc-file=ractor.rb
722
+ # - ractor.send(msg, move: false) -> self
723
+ # -->
724
+ # Send a message to a Ractor's incoming queue to be accepted by Ractor.receive.
725
+ #
726
+ # r = Ractor.new do
727
+ # value = Ractor.receive
728
+ # puts "Received #{value}"
729
+ # end
730
+ # r.send 'message'
731
+ # # Prints: "Received: message"
732
+ #
733
+ # The method is non-blocking (will return immediately even if the ractor is not
734
+ # ready to receive anything):
735
+ #
736
+ # r = Ractor.new {sleep(5)}
737
+ # r.send('test')
738
+ # puts "Sent successfully"
739
+ # # Prints: "Sent successfully" immediately
740
+ #
741
+ # An attempt to send to a ractor which already finished its execution will raise
742
+ # Ractor::ClosedError.
743
+ #
744
+ # r = Ractor.new {}
745
+ # r.take
746
+ # p r
747
+ # # "#<Ractor:#6 (irb):23 terminated>"
748
+ # r.send('test')
749
+ # # Ractor::ClosedError (The incoming-port is already closed)
750
+ #
751
+ # If close_incoming was called on the ractor, the method also raises
752
+ # Ractor::ClosedError.
753
+ #
754
+ # r = Ractor.new do
755
+ # sleep(500)
756
+ # receive
757
+ # end
758
+ # r.close_incoming
759
+ # r.send('test')
760
+ # # Ractor::ClosedError (The incoming-port is already closed)
761
+ # # The error is raised immediately, not when the ractor tries to receive
762
+ #
763
+ # If the `obj` is unshareable, by default it will be copied into the receiving
764
+ # ractor by deep cloning. If `move: true` is passed, the object is *moved* into
765
+ # the receiving ractor and becomes inaccessible to the sender.
766
+ #
767
+ # r = Ractor.new {puts "Received: #{receive}"}
768
+ # msg = 'message'
769
+ # r.send(msg, move: true)
770
+ # r.take
771
+ # p msg
772
+ #
773
+ # This prints:
774
+ #
775
+ # Received: message
776
+ # in `p': undefined method `inspect' for #<Ractor::MovedObject:0x000055c99b9b69b8>
777
+ #
778
+ # All references to the object and its parts will become invalid to the sender.
779
+ #
780
+ # r = Ractor.new {puts "Received: #{receive}"}
781
+ # s = 'message'
782
+ # ary = [s]
783
+ # copy = ary.dup
784
+ # r.send(ary, move: true)
785
+ #
786
+ # s.inspect
787
+ # # Ractor::MovedError (can not send any methods to a moved object)
788
+ # ary.class
789
+ # # Ractor::MovedError (can not send any methods to a moved object)
790
+ # copy.class
791
+ # # => Array, it is different object
792
+ # copy[0].inspect
793
+ # # Ractor::MovedError (can not send any methods to a moved object)
794
+ # # ...but its item was still a reference to `s`, which was moved
795
+ #
796
+ # If the object is shareable, `move: true` has no effect on it:
797
+ #
798
+ # r = Ractor.new {puts "Received: #{receive}"}
799
+ # s = 'message'.freeze
800
+ # r.send(s, move: true)
801
+ # s.inspect #=> "message", still available
802
+ #
803
+ def send: (untyped obj, ?move: boolish) -> Ractor
804
+
805
+ # <!--
806
+ # rdoc-file=ractor.rb
807
+ # - ractor.take -> msg
808
+ # -->
809
+ # Get a message from the ractor's outgoing port, which was put there by
810
+ # Ractor.yield or at ractor's termination.
811
+ #
812
+ # r = Ractor.new do
813
+ # Ractor.yield 'explicit yield'
814
+ # 'last value'
815
+ # end
816
+ # puts r.take #=> 'explicit yield'
817
+ # puts r.take #=> 'last value'
818
+ # puts r.take # Ractor::ClosedError (The outgoing-port is already closed)
819
+ #
820
+ # The fact that the last value is also sent to the outgoing port means that
821
+ # `take` can be used as an analog of Thread#join ("just wait until ractor
822
+ # finishes"). However, it will raise if somebody has already consumed that
823
+ # message.
824
+ #
825
+ # If the outgoing port was closed with #close_outgoing, the method will raise
826
+ # Ractor::ClosedError.
827
+ #
828
+ # r = Ractor.new do
829
+ # sleep(500)
830
+ # Ractor.yield 'Hello from ractor'
831
+ # end
832
+ # r.close_outgoing
833
+ # r.take
834
+ # # Ractor::ClosedError (The outgoing-port is already closed)
835
+ # # The error would be raised immediately, not when ractor will try to receive
836
+ #
837
+ # If an uncaught exception is raised in the Ractor, it is propagated by take as
838
+ # a Ractor::RemoteError.
839
+ #
840
+ # r = Ractor.new {raise "Something weird happened"}
841
+ #
842
+ # begin
843
+ # r.take
844
+ # rescue => e
845
+ # p e # => #<Ractor::RemoteError: thrown by remote Ractor.>
846
+ # p e.ractor == r # => true
847
+ # p e.cause # => #<RuntimeError: Something weird happened>
848
+ # end
849
+ #
850
+ # Ractor::ClosedError is a descendant of StopIteration, so the termination of
851
+ # the ractor will break out of any loops that receive this message without
852
+ # propagating the error:
853
+ #
854
+ # r = Ractor.new do
855
+ # 3.times {|i| Ractor.yield "message #{i}"}
856
+ # "finishing"
857
+ # end
858
+ #
859
+ # loop {puts "Received: " + r.take}
860
+ # puts "Continue successfully"
861
+ #
862
+ # This will print:
863
+ #
864
+ # Received: message 0
865
+ # Received: message 1
866
+ # Received: message 2
867
+ # Received: finishing
868
+ # Continue successfully
869
+ #
870
+ def take: () -> untyped
871
+
872
+ # <!--
873
+ # rdoc-file=ractor.rb
874
+ # - to_s()
875
+ # -->
876
+ #
877
+ alias to_s inspect
878
+
879
+ private
880
+
881
+ # <!--
882
+ # rdoc-file=ractor.rb
883
+ # - receive()
884
+ # -->
885
+ # same as Ractor.receive
886
+ #
887
+ def receive: () -> untyped
888
+
889
+ # <!--
890
+ # rdoc-file=ractor.rb
891
+ # - receive_if(&b)
892
+ # -->
893
+ # same as Ractor.receive_if
894
+ #
895
+ def receive_if: () { (untyped) -> boolish } -> untyped
896
+
897
+ # <!--
898
+ # rdoc-file=ractor.rb
899
+ # - recv()
900
+ # -->
901
+ #
902
+ alias recv receive
903
+
904
+ # <!-- rdoc-file=ractor.c -->
905
+ # Raised when an attempt is made to send a message to a closed port, or to
906
+ # retrieve a message from a closed and empty port. Ports may be closed
907
+ # explicitly with Ractor#close_outgoing/close_incoming and are closed implicitly
908
+ # when a Ractor terminates.
909
+ #
910
+ # r = Ractor.new { sleep(500) }
911
+ # r.close_outgoing
912
+ # r.take # Ractor::ClosedError
913
+ #
914
+ # ClosedError is a descendant of StopIteration, so the closing of the ractor
915
+ # will break the loops without propagating the error:
916
+ #
917
+ # r = Ractor.new do
918
+ # loop do
919
+ # msg = receive # raises ClosedError and loop traps it
920
+ # puts "Received: #{msg}"
921
+ # end
922
+ # puts "loop exited"
923
+ # end
924
+ #
925
+ # 3.times{|i| r << i}
926
+ # r.close_incoming
927
+ # r.take
928
+ # puts "Continue successfully"
929
+ #
930
+ # This will print:
931
+ #
932
+ # Received: 0
933
+ # Received: 1
934
+ # Received: 2
935
+ # loop exited
936
+ # Continue successfully
937
+ #
938
+ class ClosedError < StopIteration
939
+ end
940
+
941
+ class Error < RuntimeError
942
+ end
943
+
944
+ class IsolationError < Ractor::Error
945
+ end
946
+
947
+ # <!-- rdoc-file=ractor.c -->
948
+ # Raised on an attempt to access an object which was moved in Ractor#send or
949
+ # Ractor.yield.
950
+ #
951
+ # r = Ractor.new { sleep }
952
+ #
953
+ # ary = [1, 2, 3]
954
+ # r.send(ary, move: true)
955
+ # ary.inspect
956
+ # # Ractor::MovedError (can not send any methods to a moved object)
957
+ #
958
+ class MovedError < Ractor::Error
959
+ end
960
+
961
+ # <!-- rdoc-file=ractor.c -->
962
+ # A special object which replaces any value that was moved to another ractor in
963
+ # Ractor#send or Ractor.yield. Any attempt to access the object results in
964
+ # Ractor::MovedError.
965
+ #
966
+ # r = Ractor.new { receive }
967
+ #
968
+ # ary = [1, 2, 3]
969
+ # r.send(ary, move: true)
970
+ # p Ractor::MovedObject === ary
971
+ # # => true
972
+ # ary.inspect
973
+ # # Ractor::MovedError (can not send any methods to a moved object)
974
+ #
975
+ class MovedObject < BasicObject
976
+ # <!--
977
+ # rdoc-file=ractor.c
978
+ # - !(*args)
979
+ # -->
980
+ #
981
+ def !: (*untyped) -> untyped
982
+
983
+ # <!--
984
+ # rdoc-file=ractor.c
985
+ # - !=(*args)
986
+ # -->
987
+ #
988
+ def !=: (*untyped) -> untyped
989
+
990
+ # <!--
991
+ # rdoc-file=ractor.c
992
+ # - ==(*args)
993
+ # -->
994
+ #
995
+ def ==: (*untyped) -> untyped
996
+
997
+ # <!--
998
+ # rdoc-file=ractor.c
999
+ # - __id__(*args)
1000
+ # -->
1001
+ #
1002
+ def __id__: (*untyped) -> untyped
1003
+
1004
+ # <!--
1005
+ # rdoc-file=ractor.c
1006
+ # - __send__(*args)
1007
+ # -->
1008
+ #
1009
+ def __send__: (*untyped) -> untyped
1010
+
1011
+ # <!--
1012
+ # rdoc-file=ractor.c
1013
+ # - equal?(*args)
1014
+ # -->
1015
+ #
1016
+ def equal?: (*untyped) -> untyped
1017
+
1018
+ # <!--
1019
+ # rdoc-file=ractor.c
1020
+ # - instance_eval(*args)
1021
+ # -->
1022
+ #
1023
+ def instance_eval: (*untyped) -> untyped
1024
+
1025
+ # <!--
1026
+ # rdoc-file=ractor.c
1027
+ # - instance_exec(*args)
1028
+ # -->
1029
+ #
1030
+ def instance_exec: (*untyped) -> untyped
1031
+
1032
+ # <!--
1033
+ # rdoc-file=ractor.c
1034
+ # - method_missing(*args)
1035
+ # -->
1036
+ #
1037
+ def method_missing: (*untyped) -> untyped
1038
+ end
1039
+
1040
+ # <!-- rdoc-file=ractor.c -->
1041
+ # Raised on attempt to Ractor#take if there was an uncaught exception in the
1042
+ # Ractor. Its `cause` will contain the original exception, and `ractor` is the
1043
+ # original ractor it was raised in.
1044
+ #
1045
+ # r = Ractor.new { raise "Something weird happened" }
1046
+ #
1047
+ # begin
1048
+ # r.take
1049
+ # rescue => e
1050
+ # p e # => #<Ractor::RemoteError: thrown by remote Ractor.>
1051
+ # p e.ractor == r # => true
1052
+ # p e.cause # => #<RuntimeError: Something weird happened>
1053
+ # end
1054
+ #
1055
+ class RemoteError < Ractor::Error
1056
+ # <!-- rdoc-file=ractor.rb -->
1057
+ # The Ractor an uncaught exception is raised in.
1058
+ #
1059
+ def ractor: () -> Ractor
1060
+ end
1061
+
1062
+ class UnsafeError < Ractor::Error
1063
+ end
1064
+
1065
+ %a{annotate:rdoc:skip}
1066
+ class Selector
1067
+ end
1068
+ end