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
@@ -0,0 +1,192 @@
1
+ # RBS Collection manager
2
+
3
+ `rbs collection` sub command manages third party gems' RBS. In short, it is `bundler` for RBS.
4
+
5
+ ## Requirements
6
+
7
+ * `git(1)`
8
+ * `Gemfile.lock`
9
+
10
+ ## Usage
11
+
12
+ ### Setup
13
+
14
+ First, generate the configuration file, `rbs_collection.yaml`, with `rbs collection init`.
15
+
16
+ ```console
17
+ $ rbs collection init
18
+ created: rbs_collection.yaml
19
+
20
+ $ cat rbs_collection.yaml
21
+ # Download sources
22
+ sources:
23
+ - name: ruby/gem_rbs_collection
24
+ remote: https://github.com/ruby/gem_rbs_collection.git
25
+ revision: main
26
+ repo_dir: gems
27
+
28
+ # A directory to install the downloaded RBSs
29
+ path: .gem_rbs_collection
30
+
31
+ # gems:
32
+ # # If you want to avoid installing rbs files for gems, you can specify them here.
33
+ # - name: GEM_NAME
34
+ # ignore: true
35
+ ```
36
+
37
+ I also recommend updating `.gitignore`.
38
+
39
+ ```console
40
+ $ echo /.gem_rbs_collection/ >> .gitignore
41
+ ```
42
+
43
+ ### Install dependencies
44
+
45
+ Then, install gems' RBS with `rbs collection install`! It copies RBS from [the gem RBS repository](https://github.com/ruby/gem_rbs_collection) to `.gem_rbs_collection/` directory by default.
46
+ I recommend to ignore `.gem_rbs_collection/` from version control system, such as Git.
47
+
48
+ ```console
49
+ $ rbs collection install
50
+ Installing ast:2.4 (ruby/gem_rbs_collection@4b1a2a2f64c)
51
+ ...
52
+ It's done! 42 gems's RBSs now installed.
53
+ ```
54
+
55
+ Finally the third party RBSs are available! `rbs` commands, such as `rbs validate`, automatically load the third party RBSs.
56
+
57
+ ### Other commands
58
+
59
+ `rbs collection` has two more commands.
60
+
61
+ * `rbs collection update` updates `rbs_collection.lock.yaml`.
62
+ * `rbs collection clean` removes unnecessary rbs from `.gem_rbs_collection` directory.
63
+
64
+ ## Configuration
65
+
66
+ ### `rbs_collection.yaml`
67
+
68
+ Configure `rbs collection` with editing `rbs_collection.yaml`.
69
+
70
+ ```yaml
71
+ # rbs_collection.yaml
72
+
73
+ # Download sources.
74
+ # You can add own collection git repository.
75
+ sources:
76
+ - name: ruby/gem_rbs_collection
77
+ remote: https://github.com/ruby/gem_rbs_collection.git
78
+ revision: main
79
+ repo_dir: gems
80
+
81
+ # You can also add a local path as a collection source optionally.
82
+ - type: local
83
+ path: path/to/local/dir
84
+
85
+ # A directory to install the downloaded RBSs
86
+ path: .gem_rbs_collection
87
+
88
+ gems:
89
+ # If the Gemfile.lock doesn't contain csv gem but you use csv gem,
90
+ # you can write the gem name explicitly to install RBS of the gem.
91
+ - name: csv
92
+
93
+ # If the Gemfile.lock contains nokogiri gem but you don't want to use the RBS,
94
+ # you can ignore the gem.
95
+ # `rbs collection` avoids to install nokogiri gem's RBS by this change.
96
+ # It is useful if the nokogiri RBS has a problem, such as compatibility issue with other RBS.
97
+ - name: nokogiri
98
+ ignore: true
99
+ ```
100
+
101
+ ### Avoid installing RBS
102
+
103
+ There are two ways to avoid RBS installation.
104
+
105
+ #### `require: false` in `Gemfile`
106
+
107
+ First, you can specify `require: false` in `Gemfile`. It is the recommended way to avoid installing RBS.
108
+ For example:
109
+
110
+ ```ruby
111
+ # Gemfile
112
+
113
+ gem 'GEM_NAME', require: false
114
+ ```
115
+
116
+ In this case, `rbs collection` doesn't install the RBS of `GEM_NAME`.
117
+ We recommend to specify `require: false` for `rbs` gem itself because `rbs` gem's RBS file is not necessary in most cases.
118
+
119
+ #### `ignore: true` in `rbs_collection.yaml`
120
+
121
+ Second, you can write `ignore: true` in `rbs_collection.yaml`. It is useful if you want to avoid installing RBS but you need to require the gem.
122
+
123
+ ```yaml
124
+ # rbs_collection.yaml
125
+
126
+ gems:
127
+ - name: GEM_NAME
128
+ ignore: true
129
+ ```
130
+
131
+ #### Load RBS specified `require: false`
132
+
133
+ You can also use `ignore: false` if you want to install RBS for a gem which you specify `require: false` in `Gemfile`.
134
+ For example:
135
+
136
+ ```ruby
137
+ # Gemfile
138
+
139
+ gem 'GEM_NAME', require: false
140
+ ```
141
+
142
+ ```yaml
143
+ # rbs_collection.yaml
144
+
145
+ gems:
146
+ - name: GEM_NAME
147
+ ignore: false
148
+ ```
149
+
150
+ In this case, `rbs collection` installs the RBS of `GEM_NAME`.
151
+
152
+ ### `manifest.yaml`
153
+
154
+ If you are a gem maintainer, you can write `manifest.yaml`.
155
+ You need to put the file if the gem has implicit dependencies, which don't appear in `Gemfile.lock`. You have to write standard libraries' dependencies in most cases.
156
+ For example:
157
+
158
+ ```yaml
159
+ # manifest.yaml
160
+
161
+ dependencies:
162
+ # If your gem depends on pathname but the gemspec doesn't include pathname,
163
+ # you need to write the following.
164
+ - name: pathname
165
+ ```
166
+
167
+ If the gem's RBS is managed with [ruby/gem_rbs_collection](https://github.com/ruby/gem_rbs_collection), put it as `gems/GEM_NAME/VERSION/manifest.yaml`. For example, `gems/activesupport/6.0/manifest.yaml`.
168
+ If the gem's RBS is included in the gem package, put it as `sig/manifest.yaml`.
169
+
170
+
171
+ ## Files / Directories
172
+
173
+ * `rbs_collection.yaml`
174
+ * The configuration file.
175
+ * You need to edit it if:
176
+ * You don't want to ignore gem's RBS.
177
+ * You want to add gem's RBS explicitly.
178
+ * You can change the file path with `--collection` option. e.g. `rbs --collection another_conf.yaml collection install`.
179
+ * `rbs_collection.lock.yaml`
180
+ * RBS installs and loads RBS files with this file.
181
+ * It is auto-generated file. Do not edit this file.
182
+ * I recommend to manage it with VCS such as git.
183
+ * `.gem_rbs_collection/`
184
+ * RBS installs third party RBS files to the directory.
185
+ * I recommend to ignore it from VCS.
186
+ * You can change the path with `path` option of `rbs_collection.yaml` file.
187
+
188
+
189
+ ## How it works
190
+
191
+ `rbs collection` is integrated with Bundler.
192
+ `rbs collection install` command generates `gem_rbs_collection.lock.yaml` from `gem_rbs_collection.yaml` and `Gemfile.lock`. It uses `Gemfile.lock` to detects dependencies.
@@ -0,0 +1,86 @@
1
+ # Using `Data` and `Struct`
2
+
3
+ `Data` and `Struct` are commonly used utilities to define simple *value* objects. The objects have attributes, and the equality between the two objects are defined by equality of the attributes. (Note that we can define additional methods and overwrite the equality definitions when we want.)
4
+
5
+ ```ruby
6
+ # Defines `Measure` class with `#amount` and `#unit` attributes
7
+ Measure = Data.define(:amount, :unit)
8
+ ```
9
+
10
+ Unfortunately, supporting `Data` and `Struct` in RBS is not straightforward. You have to write down the attribute definitions and initializers in RBS.
11
+
12
+ ```rbs
13
+ class Measure
14
+ # `attr_accessor amount: Integer` in the case of Struct
15
+ attr_reader amount: Integer
16
+
17
+ # `attr_accessor unit: String` in the case of Struct
18
+ attr_reader unit: String
19
+
20
+ def initialize: (Integer amount, String unit) -> void
21
+ | (amount: Integer, unit: String) -> void
22
+ end
23
+ ```
24
+
25
+ This is simplified definition of the `Measure` class, for the case you only use the attributes and initializers. You can add more method definitions or inherit from `Data` class to make the definition more complete.
26
+
27
+ However, it's common that you don't need all of the `Data` and `Struct` methods, like `.members` and `.[]`. When you are using those utility classes just for the attributes methods, you can simply ignore other methods or skip specifying a super class.
28
+
29
+ > You may want to implement a generator that understands `Data.define` and `Struct.new`. But even with the generator, you need to edit the generated RBS files so that the attribute definitions have correct types.
30
+
31
+ ## Type checking class definitions using `Data` and `Struct`
32
+
33
+ If you use Steep, you may need additional annotation in Ruby implementation.
34
+
35
+ ```ruby
36
+ # Type error because return type of `Data.define(...)` is not `singleton(Measure)`
37
+ Measure = Data.define(:amount, :unit)
38
+ ```
39
+
40
+ You can please the type checker by adding a cast (`_`) or define the class inheriting from `Data.define(...)`.
41
+
42
+ ```ruby
43
+ # Skip type checking by assigning to `_`
44
+ Measure = _ = Data.define(:amount, :unit)
45
+
46
+ # Super class is not type checked by Steep
47
+ class Measure < Data.define(:amount, :unit)
48
+ end
49
+ ```
50
+
51
+ @soutaro has prefered inheriting from `Data.define`, but you may find an extra annonymous class in `.ancestors` [^1].
52
+
53
+ ```ruby
54
+ Measure.ancestors #=> [Measure, #<Class:0xOOF>, Data, ...]
55
+ ```
56
+
57
+ [^1]: [Shannon Skipper](https://github.com/havenwood) told me it in Discord
58
+
59
+ ## Generate prototype for `Data` and `Struct`
60
+
61
+ RBS prototypes for classes using `Data` and `Struct` can be generated by `rbs prototype runtime`.
62
+
63
+ ```rb
64
+ # t.rb
65
+ class Measure < Data.define(:amount, :unit)
66
+ end
67
+ ```
68
+
69
+ ```
70
+ $ bundle exec rbs prototype runtime -R t.rb Measure
71
+ class Measure < ::Data
72
+ def self.new: (untyped amount, untyped unit) -> instance
73
+ | (amount: untyped, unit: untyped) -> instance
74
+
75
+ def self.[]: (untyped amount, untyped unit) -> instance
76
+ | (amount: untyped, unit: untyped) -> instance
77
+
78
+ def self.members: () -> [ :amount, :unit ]
79
+
80
+ def members: () -> [ :amount, :unit ]
81
+
82
+ attr_reader amount: untyped
83
+
84
+ attr_reader unit: untyped
85
+ end
86
+ ```
data/docs/gem.md ADDED
@@ -0,0 +1,57 @@
1
+ # Releasing a gem with RBS
2
+
3
+ You can release the RBS type definition of your gem included in the gem package. Just add your RBS files inside `/sig` directory, put them in your rubygem package, and release a new version. RBS gem will load the RBS files from your gem package automatically.
4
+
5
+ ## `/sig` directory
6
+
7
+ RBS gem tries to load a type definition of a gem from gem package first. It checks if there is `/sig` directory in the gem package and loads `*.rbs` files from the directory. So, everything you have to do to make your type definition available are:
8
+
9
+ 1. Add `/sig` directory in your gem package
10
+ 2. Put your RBS files inside the directory
11
+ 3. Make sure the RBS files are included in the gem package
12
+
13
+ ### Hidden RBS files
14
+
15
+ If you have RBS files you don't want to export to the gem users, you can put the files under a directory that starts with `_``.
16
+
17
+ Assume you have three RBS files in your gem package:
18
+
19
+ * `/sig/foo.rbs`
20
+ * `/sig/bar/baz.rbs`
21
+ * `/sig/_private/internal.rbs`
22
+
23
+ `foo.rbs` and `baz.rbs` will be loaded from the gem package, but the `internal.rbs` will be skipped. This is only when you load RBS files of a *library*, for example through `-r` option given to `rbs` command. If you load RBS files as *source code*, for example through `-I` option given to `rbs` command, the hidden RBS files will be loaded too.
24
+
25
+ * `rbs -r your-gem` => Loading a library
26
+ * `rbs -I sig` => Loading RBS files as source code
27
+
28
+ ### Adding `manifest.yaml`
29
+
30
+ `manifest.yaml` lets you declare dependencies to standard libraries. Here is an example, from [RBS gem](https://github.com/ruby/rbs/blob/6b3d0f976a50b3974d0bff26ea8fa9931053f38b/sig/manifest.yaml).
31
+
32
+ ```yaml
33
+ dependencies:
34
+ - name: json
35
+ - name: logger
36
+ - name: optparse
37
+ - name: pathname
38
+ - name: rdoc
39
+ - name: tsort
40
+ ```
41
+
42
+ Note that you don't have to write the dependencies that are included in your `.gemspec`. RBS will detect the dependencies between gems, declared in `.gemspec`. `manifest.yaml` is a material for undeclared dependencies, which usually is for standard libraries.
43
+
44
+ ## Testing your type definition
45
+
46
+ If you develop your gem using a static type checker, like [Steep](https://github.com/soutaro/steep), your type definition will be (mostly) correct and reliable. If not, we strongly recommend adding extra tests focusing on the RBS type definitions.
47
+
48
+ `RBS::UnitTest` is a library to do that. `assert_send_type` is the most important assertion.
49
+
50
+ ```rb
51
+ assert_send_type '(Regexp) { (String) -> String } -> String',
52
+ 'hello', :gsub, /hello/, &proc { "foo" }
53
+ ```
54
+
55
+ It calls `String#gsub` method and confirms if given arguments and the return value has correct types.
56
+
57
+ You can find examples under `test/stdlib` directory of [RBS repository](https://github.com/ruby/rbs/blob/6b3d0f976a50b3974d0bff26ea8fa9931053f38b/test/stdlib/String_test.rb).
@@ -0,0 +1,309 @@
1
+ # RBS By Example
2
+
3
+ ## Goal
4
+
5
+ The purpose of this doc is to teach you how to write RBS signatures by using the standard library's methods as a guide.
6
+
7
+ ## Examples
8
+
9
+ In each example, the first snippet is for *Ruby* and the second one is for *RBS*.
10
+
11
+ ### Zero argument methods
12
+
13
+ **Example:** `String#empty?`
14
+
15
+ ```ruby
16
+ "".empty?
17
+ # => true
18
+ "hello".empty?
19
+ # => false
20
+ ```
21
+
22
+ ```rbs
23
+ class String
24
+ def empty?: () -> bool
25
+ end
26
+ ```
27
+
28
+ `String`'s `#empty` method takes no parameters, and returns a boolean value
29
+
30
+ ### Single argument methods
31
+
32
+ **Example:** `String#include?`
33
+
34
+ ```ruby
35
+ "homeowner".include?("house")
36
+ # => false
37
+ "homeowner".include?("meow")
38
+ # => true
39
+ ```
40
+
41
+ ```rbs
42
+ class String
43
+ def include?: (String) -> bool
44
+ end
45
+ ```
46
+
47
+ `String`'s `include?` method takes one argument, a `String`, and returns a
48
+ boolean value
49
+
50
+ ### Variable argument methods
51
+
52
+ **Example:** `String#end_with?`
53
+
54
+ ```ruby
55
+ "hello?".end_with?("!")
56
+ # => false
57
+ "hello?".end_with?("?")
58
+ # => true
59
+ "hello?".end_with?("?", "!")
60
+ # => true
61
+ "hello?".end_with?(".", "!")
62
+ # => false
63
+ ```
64
+
65
+ ```rbs
66
+ class String
67
+ def end_with?: (*String) -> bool
68
+ end
69
+ ```
70
+
71
+ `String`'s `#end_with?` method takes any number of `String` arguments, and
72
+ returns a boolean value.
73
+
74
+ ### Optional positional arguments
75
+
76
+ **Example:** `String#ljust`
77
+
78
+ ```ruby
79
+ "hello".ljust(4)
80
+ #=> "hello"
81
+ "hello".ljust(20)
82
+ #=> "hello "
83
+ "hello".ljust(20, '1234')
84
+ #=> "hello123412341234123"
85
+ ```
86
+
87
+ ```rbs
88
+ class String
89
+ def ljust: (Integer, ?String) -> String
90
+ end
91
+ ```
92
+
93
+ `String`'s `ljust` takes one `Integer` argument, and an optional `String` argument, indicated by the the `?` prefix marker. It returns a `String`.
94
+
95
+ ### Multiple signatures for a single method
96
+
97
+ **Example:** `Array#*`
98
+
99
+ ```ruby
100
+ [1, 2, 3] * ","
101
+ # => "1,2,3"
102
+ [1, 2, 3] * 2
103
+ # => [1, 2, 3, 1, 2, 3]
104
+ ```
105
+
106
+ *Note:* Some of the signatures after this point include type variables (e.g. `Elem`, `T`).
107
+ For now, it's safe to ignore them, but they're included for completeness.
108
+
109
+ ```rbs
110
+ class Array[Elem]
111
+ def *: (String) -> String
112
+ | (Integer) -> Array[Elem]
113
+ end
114
+ ```
115
+
116
+ `Array`'s `*` method, when given a `String` returns a `String`. When given an
117
+ `Integer`, it returns an `Array` of the same contained type `Elem` (in our example case, `Elem` corresponds to `Integer`).
118
+
119
+ ### Union types
120
+
121
+ **Example:** `String#<<`
122
+
123
+ ```ruby
124
+ a = "hello "
125
+ a << "world"
126
+ #=> "hello world"
127
+ a << 33
128
+ #=> "hello world!"
129
+ ```
130
+
131
+ ```rbs
132
+ class String
133
+ def <<: (String | Integer) -> String
134
+ end
135
+ ```
136
+
137
+ `String`'s `<<` operator takes either a `String` or an `Integer`, and returns a `String`.
138
+
139
+ ### Nilable types
140
+
141
+ ```ruby
142
+ [1, 2, 3].first
143
+ # => 1
144
+ [].first
145
+ # => nil
146
+ [1, 2, 3].first(2)
147
+ # => [1, 2]
148
+ [].first(2)
149
+ # => []
150
+ ```
151
+
152
+ ```rbs
153
+ class Enumerable[Elem]
154
+ def first: () -> Elem?
155
+ | (Integer) -> Array[Elem]
156
+ end
157
+ ```
158
+
159
+ `Enumerable`'s `#first` method has two different signatures.
160
+
161
+ When called with no arguments, the return value will either be an instance of
162
+ whatever type is contained in the enumerable, or `nil`. We represent that with
163
+ the type variable `Elem`, and the `?` suffix nilable marker.
164
+
165
+ When called with an `Integer` positional argument, the return value will be an
166
+ `Array` of whatever type is contained.
167
+
168
+ The `?` syntax is a convenient shorthand for a union with nil. An equivalent union type would be `(Elem | nil)`.
169
+
170
+ ### Keyword Arguments
171
+
172
+ **Example**: `String#lines`
173
+
174
+ ```ruby
175
+ "hello\nworld\n".lines
176
+ # => ["hello\n", "world\n"]
177
+ "hello world".lines(' ')
178
+ # => ["hello ", " ", "world"]
179
+ "hello\nworld\n".lines(chomp: true)
180
+ # => ["hello", "world"]
181
+ ```
182
+
183
+ ```rbs
184
+ class String
185
+ def lines: (?String, ?chomp: bool) -> Array[String]
186
+ end
187
+ ```
188
+
189
+ `String`'s `#lines` method take two arguments: one optional String argument, and another optional boolean keyword argument. It returns an `Array` of `String`s.
190
+
191
+ Keyword arguments are declared similar to in ruby, with the keyword immediately followed by a colon. Keyword arguments that are optional are indicated as optional using the same `?` prefix as positional arguments.
192
+
193
+
194
+ ### Class methods
195
+
196
+ **Example**: `Time.now`
197
+
198
+ ```ruby
199
+ Time.now
200
+ # => 2009-06-24 12:39:54 +0900
201
+ ```
202
+
203
+ ```rbs
204
+ class Time
205
+ def self.now: () -> Time
206
+ end
207
+ ```
208
+
209
+ `Time`'s class method `now` takes no arguments, and returns an instance of the
210
+ `Time` class.
211
+
212
+ ### Block Arguments
213
+
214
+ **Example**: `Array#filter`
215
+
216
+ ```ruby
217
+ [1,2,3,4,5].filter {|num| num.even? }
218
+ # => [2, 4]
219
+ %w[ a b c d e f ].filter {|v| v =~ /[aeiou]/ }
220
+ # => ["a", "e"]
221
+ [1,2,3,4,5].filter
222
+ ```
223
+
224
+ ```rbs
225
+ class Array[Elem]
226
+ def filter: () { (Elem) -> boolish } -> ::Array[Elem]
227
+ | () -> ::Enumerator[Elem, ::Array[Elem]]
228
+ end
229
+ ```
230
+
231
+ `Array`'s `#filter` method, when called with no arguments returns an Enumerator.
232
+
233
+ When called with a block, the method returns an `Array` of whatever type the original contained. The block will take one argument, of the type of the contained value, and the block will return a truthy or falsy value.
234
+
235
+ `boolish` is a special keyword for any type that will be treated as if it were a `bool`.
236
+
237
+ ### Type Variables
238
+
239
+ **Example**: `Hash`, `Hash#keys`
240
+
241
+ ```ruby
242
+ h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
243
+ h.keys
244
+ # => ["a", "b", "c", "d"]
245
+ ```
246
+
247
+ ```rbs
248
+ class Hash[K, V]
249
+ def keys: () -> Array[K]
250
+ end
251
+ ```
252
+
253
+ Generic types in RBS are parameterized at declaration time. These type variables are then available throughout all the methods contained in the `class` block.
254
+
255
+ `Hash`'s `#keys` method takes no arguments, and returns an `Array` of the first type parameter. In the above example, `a` is of concrete type `Hash[String, Integer]`, so `#keys` returns an `Array` for `String`.
256
+
257
+
258
+ ```ruby
259
+ a = [ "a", "b", "c", "d" ]
260
+ a.collect {|x| x + "!"}
261
+ # => ["a!", "b!", "c!", "d!"]
262
+ a.collect.with_index {|x, i| x * i}
263
+ # => ["", "b", "cc", "ddd"]
264
+ ```
265
+
266
+ ```rbs
267
+ class Array[Elem]
268
+ def collect: [U] () { (Elem) -> U } -> Array[U]
269
+ | () -> Enumerator[Elem, Array[untyped]]
270
+ end
271
+ ```
272
+
273
+ Type variables can also be introduced in methods. Here, in `Array`'s `#collect` method, we introduce a type variable `U`. The block passed to `#collect` will receive a parameter of type `Elem`, and return a value of type `U`. Then `#collect` will return an `Array` of type `U`.
274
+
275
+ In this example, the method receives its signature from the inferred return type of the passed block. When then block is absent, as in when the method returns an `Enumerator`, we can't infer the type, and so the return value of the enumerator can only be described as `Array[untyped]`.
276
+
277
+ ### Tuples
278
+
279
+ **Examples**: `Enumerable#partition`, `Enumerable#to_h`
280
+
281
+ ```ruby
282
+ (1..6).partition { |v| v.even? }
283
+ # => [[2, 4, 6], [1, 3, 5]]
284
+ ```
285
+
286
+ ```rbs
287
+ class Enumerable[Elem]
288
+ def partition: () { (Elem) -> boolish } -> [Array[Elem], Array[Elem]]
289
+ | () -> ::Enumerator[Elem, [Array[Elem], Array[Elem] ]]
290
+ end
291
+ ```
292
+
293
+ `Enumerable`'s `partition` method, when given a block, returns a 2-item tuple of `Array`s containing the original type of the `Enumerable`.
294
+
295
+ Tuples can be of any size, and they can have mixed types.
296
+
297
+ ```ruby
298
+ (1..5).to_h {|x| [x, x ** 2]}
299
+ # => {1=>1, 2=>4, 3=>9, 4=>16, 5=>25}
300
+ ```
301
+
302
+ ```rbs
303
+ class Enumerable[Elem]
304
+ def to_h: () -> ::Hash[untyped, untyped]
305
+ | [T, U] () { (Elem) -> [T, U] } -> ::Hash[T, U]
306
+ end
307
+ ```
308
+
309
+ `Enumerable`'s `to_h` method, when given a block that returns a 2-item tuple, returns a `Hash` with keys the type of the first position in the tuple, and values the type of the second position in the tuple.