rbs 2.8.4 → 3.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (434) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +12 -4
  3. data/.github/workflows/comments.yml +11 -11
  4. data/.github/workflows/dependabot.yml +30 -0
  5. data/.github/workflows/ruby.yml +40 -49
  6. data/.github/workflows/typecheck.yml +36 -0
  7. data/.github/workflows/windows.yml +28 -0
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +42 -2
  10. data/CHANGELOG.md +845 -1
  11. data/README.md +64 -4
  12. data/Rakefile +198 -18
  13. data/Steepfile +11 -11
  14. data/config.yml +311 -0
  15. data/core/array.rbs +2189 -1914
  16. data/core/basic_object.rbs +59 -84
  17. data/core/binding.rbs +7 -69
  18. data/core/builtin.rbs +210 -11
  19. data/core/class.rbs +37 -0
  20. data/core/comparable.rbs +23 -25
  21. data/core/complex.rbs +449 -227
  22. data/core/constants.rbs +29 -21
  23. data/core/data.rbs +415 -0
  24. data/core/dir.rbs +698 -415
  25. data/core/encoding.rbs +468 -843
  26. data/core/enumerable.rbs +495 -455
  27. data/core/enumerator/product.rbs +92 -0
  28. data/core/enumerator.rbs +106 -9
  29. data/core/env.rbs +1 -1
  30. data/core/errno.rbs +506 -605
  31. data/core/errors.rbs +15 -17
  32. data/core/exception.rbs +361 -145
  33. data/core/false_class.rbs +39 -26
  34. data/core/fiber.rbs +121 -14
  35. data/core/file.rbs +1262 -320
  36. data/core/file_test.rbs +62 -45
  37. data/core/float.rbs +187 -208
  38. data/core/gc.rbs +446 -196
  39. data/core/global_variables.rbs +29 -29
  40. data/core/hash.rbs +242 -349
  41. data/core/integer.rbs +246 -308
  42. data/core/io/buffer.rbs +373 -122
  43. data/core/io/wait.rbs +29 -17
  44. data/core/io.rbs +1881 -1518
  45. data/core/kernel.rbs +2116 -1538
  46. data/core/marshal.rbs +24 -14
  47. data/core/match_data.rbs +413 -166
  48. data/core/math.rbs +531 -291
  49. data/core/method.rbs +101 -32
  50. data/core/module.rbs +228 -64
  51. data/core/nil_class.rbs +106 -47
  52. data/core/numeric.rbs +206 -292
  53. data/core/object.rbs +73 -1168
  54. data/core/object_space/weak_key_map.rbs +166 -0
  55. data/core/object_space.rbs +5 -3
  56. data/core/proc.rbs +280 -39
  57. data/core/process.rbs +1318 -658
  58. data/core/ractor.rbs +200 -134
  59. data/core/random.rbs +21 -4
  60. data/core/range.rbs +309 -153
  61. data/core/rational.rbs +4 -12
  62. data/core/rb_config.rbs +64 -43
  63. data/core/rbs/unnamed/argf.rbs +411 -147
  64. data/core/rbs/unnamed/env_class.rbs +137 -253
  65. data/core/rbs/unnamed/random.rbs +49 -26
  66. data/core/refinement.rbs +16 -1
  67. data/core/regexp.rbs +1568 -862
  68. data/core/ruby_vm.rbs +719 -7
  69. data/core/rubygems/config_file.rbs +3 -0
  70. data/core/rubygems/errors.rbs +69 -6
  71. data/core/rubygems/rubygems.rbs +71 -17
  72. data/core/rubygems/version.rbs +11 -7
  73. data/{stdlib/set/0 → core}/set.rbs +80 -91
  74. data/core/signal.rbs +14 -8
  75. data/core/string.rbs +1732 -1607
  76. data/core/struct.rbs +467 -95
  77. data/core/symbol.rbs +215 -245
  78. data/core/thread.rbs +133 -89
  79. data/core/thread_group.rbs +9 -9
  80. data/core/time.rbs +1141 -841
  81. data/core/trace_point.rbs +181 -121
  82. data/core/true_class.rbs +58 -32
  83. data/core/unbound_method.rbs +103 -30
  84. data/core/warning.rbs +50 -5
  85. data/docs/CONTRIBUTING.md +1 -1
  86. data/docs/architecture.md +110 -0
  87. data/docs/collection.md +59 -5
  88. data/docs/data_and_struct.md +86 -0
  89. data/docs/gem.md +57 -0
  90. data/docs/rbs_by_example.md +16 -35
  91. data/docs/repo.md +1 -1
  92. data/docs/sigs.md +7 -7
  93. data/docs/stdlib.md +63 -5
  94. data/docs/syntax.md +255 -61
  95. data/docs/tools.md +1 -0
  96. data/ext/rbs_extension/extconf.rb +10 -0
  97. data/ext/rbs_extension/lexer.c +1741 -1548
  98. data/ext/rbs_extension/lexer.h +11 -1
  99. data/ext/rbs_extension/lexer.re +12 -6
  100. data/ext/rbs_extension/lexstate.c +26 -3
  101. data/ext/rbs_extension/location.c +119 -111
  102. data/ext/rbs_extension/location.h +32 -7
  103. data/ext/rbs_extension/main.c +3 -0
  104. data/ext/rbs_extension/parser.c +883 -481
  105. data/ext/rbs_extension/parserstate.c +65 -25
  106. data/ext/rbs_extension/parserstate.h +13 -3
  107. data/ext/rbs_extension/rbs_extension.h +1 -10
  108. data/ext/rbs_extension/unescape.c +7 -47
  109. data/goodcheck.yml +2 -2
  110. data/{ext/rbs_extension → include/rbs}/constants.h +26 -15
  111. data/include/rbs/ruby_objs.h +72 -0
  112. data/include/rbs.h +7 -0
  113. data/lib/rbs/annotate/annotations.rb +3 -3
  114. data/lib/rbs/annotate/formatter.rb +13 -3
  115. data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
  116. data/lib/rbs/annotate/rdoc_source.rb +12 -3
  117. data/lib/rbs/ast/declarations.rb +85 -2
  118. data/lib/rbs/ast/directives.rb +39 -0
  119. data/lib/rbs/ast/members.rb +49 -15
  120. data/lib/rbs/ast/type_param.rb +104 -15
  121. data/lib/rbs/ast/visitor.rb +137 -0
  122. data/lib/rbs/buffer.rb +5 -0
  123. data/lib/rbs/cli/colored_io.rb +48 -0
  124. data/lib/rbs/cli/diff.rb +83 -0
  125. data/lib/rbs/cli/validate.rb +356 -0
  126. data/lib/rbs/cli.rb +253 -143
  127. data/lib/rbs/collection/cleaner.rb +8 -1
  128. data/lib/rbs/collection/config/lockfile.rb +92 -0
  129. data/lib/rbs/collection/config/lockfile_generator.rb +154 -65
  130. data/lib/rbs/collection/config.rb +19 -46
  131. data/lib/rbs/collection/installer.rb +12 -13
  132. data/lib/rbs/collection/sources/base.rb +2 -2
  133. data/lib/rbs/collection/sources/git.rb +146 -69
  134. data/lib/rbs/collection/sources/local.rb +81 -0
  135. data/lib/rbs/collection/sources/rubygems.rb +10 -12
  136. data/lib/rbs/collection/sources/stdlib.rb +14 -13
  137. data/lib/rbs/collection/sources.rb +15 -2
  138. data/lib/rbs/collection.rb +2 -1
  139. data/lib/rbs/definition.rb +13 -16
  140. data/lib/rbs/definition_builder/ancestor_builder.rb +100 -24
  141. data/lib/rbs/definition_builder/method_builder.rb +4 -4
  142. data/lib/rbs/definition_builder.rb +489 -584
  143. data/lib/rbs/diff.rb +125 -0
  144. data/lib/rbs/environment/use_map.rb +77 -0
  145. data/lib/rbs/environment.rb +406 -105
  146. data/lib/rbs/environment_loader.rb +48 -44
  147. data/lib/rbs/environment_walker.rb +1 -1
  148. data/lib/rbs/errors.rb +175 -56
  149. data/lib/rbs/file_finder.rb +28 -0
  150. data/lib/rbs/location_aux.rb +8 -7
  151. data/lib/rbs/locator.rb +37 -15
  152. data/lib/rbs/method_type.rb +23 -0
  153. data/lib/rbs/namespace.rb +1 -0
  154. data/lib/rbs/parser/lex_result.rb +15 -0
  155. data/lib/rbs/parser/token.rb +23 -0
  156. data/lib/rbs/parser_aux.rb +22 -13
  157. data/lib/rbs/prototype/helpers.rb +48 -22
  158. data/lib/rbs/prototype/node_usage.rb +99 -0
  159. data/lib/rbs/prototype/rb.rb +125 -31
  160. data/lib/rbs/prototype/rbi.rb +49 -36
  161. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  162. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  163. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  164. data/lib/rbs/prototype/runtime.rb +273 -159
  165. data/lib/rbs/resolver/constant_resolver.rb +24 -8
  166. data/lib/rbs/resolver/type_name_resolver.rb +41 -7
  167. data/lib/rbs/sorter.rb +153 -123
  168. data/lib/rbs/substitution.rb +19 -0
  169. data/lib/rbs/subtractor.rb +201 -0
  170. data/lib/rbs/test/errors.rb +24 -11
  171. data/lib/rbs/test/guaranteed.rb +30 -0
  172. data/lib/rbs/test/hook.rb +45 -40
  173. data/lib/rbs/test/setup.rb +1 -1
  174. data/lib/rbs/test/tester.rb +1 -1
  175. data/lib/rbs/test/type_check.rb +120 -23
  176. data/lib/rbs/test.rb +6 -3
  177. data/lib/rbs/type_alias_dependency.rb +13 -3
  178. data/lib/rbs/type_alias_regularity.rb +21 -14
  179. data/lib/rbs/type_name.rb +18 -13
  180. data/lib/rbs/types.rb +352 -18
  181. data/lib/rbs/unit_test/convertibles.rb +176 -0
  182. data/lib/rbs/unit_test/spy.rb +136 -0
  183. data/lib/rbs/unit_test/type_assertions.rb +341 -0
  184. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  185. data/lib/rbs/unit_test.rb +6 -0
  186. data/lib/rbs/validator.rb +55 -30
  187. data/lib/rbs/variance_calculator.rb +26 -23
  188. data/lib/rbs/vendorer.rb +3 -3
  189. data/lib/rbs/version.rb +1 -1
  190. data/lib/rbs/writer.rb +69 -22
  191. data/lib/rbs.rb +7 -2
  192. data/lib/rdoc/discover.rb +1 -1
  193. data/lib/rdoc_plugin/parser.rb +5 -5
  194. data/rbs.gemspec +12 -2
  195. data/schema/decls.json +1 -1
  196. data/schema/members.json +15 -10
  197. data/sig/ancestor_builder.rbs +4 -0
  198. data/sig/ancestor_graph.rbs +22 -2
  199. data/sig/annotate/formatter.rbs +2 -2
  200. data/sig/annotate/rdoc_annotater.rbs +1 -1
  201. data/sig/cli/colored_io.rbs +15 -0
  202. data/sig/cli/diff.rbs +21 -0
  203. data/sig/cli/validate.rbs +43 -0
  204. data/sig/cli.rbs +4 -0
  205. data/sig/collection/config/lockfile.rbs +74 -0
  206. data/sig/collection/config/lockfile_generator.rbs +66 -0
  207. data/sig/collection/config.rbs +5 -48
  208. data/sig/collection/installer.rbs +1 -1
  209. data/sig/collection/sources.rbs +105 -33
  210. data/sig/constant.rbs +1 -1
  211. data/sig/declarations.rbs +42 -3
  212. data/sig/definition.rbs +26 -10
  213. data/sig/definition_builder.rbs +103 -81
  214. data/sig/diff.rbs +28 -0
  215. data/sig/directives.rbs +61 -0
  216. data/sig/environment.rbs +175 -29
  217. data/sig/environment_loader.rbs +20 -18
  218. data/sig/errors.rbs +123 -2
  219. data/sig/file_finder.rbs +28 -0
  220. data/sig/location.rbs +0 -3
  221. data/sig/locator.rbs +14 -2
  222. data/sig/manifest.yaml +0 -1
  223. data/sig/members.rbs +32 -9
  224. data/sig/method_types.rbs +10 -4
  225. data/sig/namespace.rbs +2 -3
  226. data/sig/parser.rbs +55 -16
  227. data/sig/prototype/helpers.rbs +4 -0
  228. data/sig/prototype/node_usage.rbs +20 -0
  229. data/sig/prototype/rb.rbs +10 -2
  230. data/sig/prototype/rbi.rbs +2 -0
  231. data/sig/prototype/runtime.rbs +182 -0
  232. data/sig/rbs.rbs +1 -1
  233. data/sig/rdoc/rbs.rbs +4 -0
  234. data/sig/repository.rbs +7 -5
  235. data/sig/resolver/constant_resolver.rbs +3 -4
  236. data/sig/resolver/context.rbs +1 -1
  237. data/sig/resolver/type_name_resolver.rbs +5 -1
  238. data/sig/shims/bundler.rbs +38 -0
  239. data/sig/shims/rubygems.rbs +19 -0
  240. data/sig/sorter.rbs +23 -5
  241. data/sig/substitution.rbs +6 -0
  242. data/sig/subtractor.rbs +37 -0
  243. data/sig/test/errors.rbs +52 -0
  244. data/sig/test/guranteed.rbs +9 -0
  245. data/sig/test/type_check.rbs +19 -0
  246. data/sig/test.rbs +82 -0
  247. data/sig/type_alias_dependency.rbs +31 -0
  248. data/sig/type_alias_regularity.rbs +12 -6
  249. data/sig/type_param.rbs +45 -9
  250. data/sig/typename.rbs +8 -5
  251. data/sig/types.rbs +119 -12
  252. data/sig/unit_test/convertibles.rbs +154 -0
  253. data/sig/unit_test/spy.rbs +28 -0
  254. data/sig/unit_test/type_assertions.rbs +194 -0
  255. data/sig/unit_test/with_aliases.rbs +136 -0
  256. data/sig/use_map.rbs +35 -0
  257. data/sig/validator.rbs +12 -5
  258. data/sig/variance_calculator.rbs +3 -1
  259. data/sig/vendorer.rbs +1 -1
  260. data/sig/visitor.rbs +47 -0
  261. data/sig/writer.rbs +6 -2
  262. data/src/constants.c +153 -0
  263. data/src/ruby_objs.c +793 -0
  264. data/stdlib/base64/0/base64.rbs +298 -45
  265. data/stdlib/benchmark/0/benchmark.rbs +12 -3
  266. data/stdlib/bigdecimal/0/big_decimal.rbs +62 -198
  267. data/stdlib/cgi/0/core.rbs +68 -15
  268. data/stdlib/cgi/0/manifest.yaml +1 -0
  269. data/stdlib/coverage/0/coverage.rbs +50 -11
  270. data/stdlib/csv/0/csv.rbs +90 -119
  271. data/stdlib/csv/0/manifest.yaml +1 -0
  272. data/stdlib/date/0/date.rbs +806 -735
  273. data/stdlib/date/0/date_time.rbs +70 -211
  274. data/stdlib/dbm/0/dbm.rbs +0 -2
  275. data/stdlib/delegate/0/delegator.rbs +184 -0
  276. data/stdlib/delegate/0/kernel.rbs +47 -0
  277. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  278. data/stdlib/did_you_mean/0/did_you_mean.rbs +3 -8
  279. data/stdlib/digest/0/digest.rbs +48 -35
  280. data/stdlib/erb/0/erb.rbs +15 -39
  281. data/stdlib/etc/0/etc.rbs +174 -54
  282. data/stdlib/fileutils/0/fileutils.rbs +1234 -385
  283. data/stdlib/forwardable/0/forwardable.rbs +4 -4
  284. data/stdlib/io-console/0/io-console.rbs +82 -17
  285. data/stdlib/ipaddr/0/ipaddr.rbs +11 -6
  286. data/stdlib/json/0/json.rbs +434 -151
  287. data/stdlib/kconv/0/kconv.rbs +166 -0
  288. data/stdlib/logger/0/formatter.rbs +0 -2
  289. data/stdlib/logger/0/log_device.rbs +1 -3
  290. data/stdlib/logger/0/logger.rbs +465 -328
  291. data/stdlib/minitest/0/kernel.rbs +2 -2
  292. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +4 -1
  293. data/stdlib/minitest/0/minitest/assertion.rbs +1 -0
  294. data/stdlib/minitest/0/minitest/assertions.rbs +58 -13
  295. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +7 -0
  296. data/stdlib/minitest/0/minitest/bench_spec.rbs +8 -8
  297. data/stdlib/minitest/0/minitest/benchmark.rbs +17 -16
  298. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  299. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  300. data/stdlib/minitest/0/minitest/mock.rbs +9 -5
  301. data/stdlib/minitest/0/minitest/parallel/executor.rbs +4 -0
  302. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +0 -1
  303. data/stdlib/minitest/0/minitest/pride_io.rbs +8 -0
  304. data/stdlib/minitest/0/minitest/pride_lol.rbs +2 -0
  305. data/stdlib/minitest/0/minitest/progress_reporter.rbs +1 -1
  306. data/stdlib/minitest/0/minitest/reportable.rbs +2 -0
  307. data/stdlib/minitest/0/minitest/runnable.rbs +33 -1
  308. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +1 -1
  309. data/stdlib/minitest/0/minitest/spec/dsl.rbs +10 -6
  310. data/stdlib/minitest/0/minitest/spec.rbs +1 -1
  311. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +5 -0
  312. data/stdlib/minitest/0/minitest/summary_reporter.rbs +0 -7
  313. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +7 -7
  314. data/stdlib/minitest/0/minitest/test.rbs +7 -14
  315. data/stdlib/minitest/0/minitest/unexpected_error.rbs +2 -0
  316. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  317. data/stdlib/minitest/0/minitest/unit.rbs +1 -2
  318. data/stdlib/minitest/0/minitest.rbs +41 -892
  319. data/stdlib/monitor/0/monitor.rbs +91 -10
  320. data/stdlib/mutex_m/0/mutex_m.rbs +0 -2
  321. data/stdlib/net-http/0/manifest.yaml +1 -1
  322. data/stdlib/net-http/0/net-http.rbs +3858 -964
  323. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  324. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  325. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  326. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  327. data/stdlib/nkf/0/nkf.rbs +35 -5
  328. data/stdlib/objspace/0/objspace.rbs +40 -18
  329. data/stdlib/observable/0/observable.rbs +217 -0
  330. data/stdlib/open-uri/0/manifest.yaml +4 -0
  331. data/stdlib/open-uri/0/open-uri.rbs +393 -0
  332. data/stdlib/open3/0/open3.rbs +147 -0
  333. data/stdlib/openssl/0/manifest.yaml +1 -0
  334. data/stdlib/openssl/0/openssl.rbs +681 -316
  335. data/stdlib/optparse/0/optparse.rbs +100 -65
  336. data/stdlib/pathname/0/pathname.rbs +24 -15
  337. data/stdlib/pp/0/manifest.yaml +2 -0
  338. data/stdlib/pp/0/pp.rbs +300 -0
  339. data/stdlib/prettyprint/0/prettyprint.rbs +2 -6
  340. data/stdlib/pstore/0/pstore.rbs +370 -156
  341. data/stdlib/psych/0/core_ext.rbs +12 -0
  342. data/stdlib/{yaml → psych}/0/dbm.rbs +3 -3
  343. data/stdlib/psych/0/manifest.yaml +3 -0
  344. data/stdlib/psych/0/psych.rbs +402 -0
  345. data/stdlib/{yaml → psych}/0/store.rbs +2 -2
  346. data/stdlib/pty/0/pty.rbs +63 -11
  347. data/stdlib/rdoc/0/code_object.rbs +51 -0
  348. data/stdlib/rdoc/0/comment.rbs +59 -0
  349. data/stdlib/rdoc/0/context.rbs +153 -0
  350. data/stdlib/rdoc/0/markup.rbs +117 -0
  351. data/stdlib/rdoc/0/parser.rbs +56 -0
  352. data/stdlib/rdoc/0/rdoc.rbs +13 -380
  353. data/stdlib/rdoc/0/ri.rbs +17 -0
  354. data/stdlib/rdoc/0/store.rbs +48 -0
  355. data/stdlib/rdoc/0/top_level.rbs +97 -0
  356. data/stdlib/resolv/0/resolv.rbs +16 -79
  357. data/stdlib/ripper/0/ripper.rbs +1648 -0
  358. data/stdlib/securerandom/0/securerandom.rbs +7 -2
  359. data/stdlib/shellwords/0/shellwords.rbs +11 -12
  360. data/stdlib/singleton/0/singleton.rbs +0 -3
  361. data/stdlib/socket/0/addrinfo.rbs +13 -18
  362. data/stdlib/socket/0/basic_socket.rbs +5 -10
  363. data/stdlib/socket/0/ip_socket.rbs +0 -2
  364. data/stdlib/socket/0/socket.rbs +77 -46
  365. data/stdlib/socket/0/tcp_server.rbs +0 -5
  366. data/stdlib/socket/0/tcp_socket.rbs +36 -3
  367. data/stdlib/socket/0/udp_socket.rbs +4 -5
  368. data/stdlib/socket/0/unix_server.rbs +0 -5
  369. data/stdlib/socket/0/unix_socket.rbs +2 -4
  370. data/{core/string_io.rbs → stdlib/stringio/0/stringio.rbs} +188 -107
  371. data/stdlib/strscan/0/string_scanner.rbs +1269 -425
  372. data/stdlib/tempfile/0/tempfile.rbs +224 -61
  373. data/stdlib/time/0/time.rbs +48 -35
  374. data/stdlib/timeout/0/timeout.rbs +17 -8
  375. data/stdlib/tmpdir/0/tmpdir.rbs +10 -3
  376. data/stdlib/tsort/0/tsort.rbs +0 -4
  377. data/stdlib/uri/0/common.rbs +271 -144
  378. data/stdlib/uri/0/file.rbs +5 -0
  379. data/stdlib/uri/0/ftp.rbs +1 -1
  380. data/stdlib/uri/0/generic.rbs +26 -22
  381. data/stdlib/uri/0/http.rbs +4 -4
  382. data/stdlib/uri/0/ldap.rbs +1 -1
  383. data/stdlib/uri/0/mailto.rbs +84 -0
  384. data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
  385. data/stdlib/yaml/0/manifest.yaml +1 -2
  386. data/stdlib/yaml/0/yaml.rbs +1 -199
  387. data/stdlib/zlib/0/buf_error.rbs +10 -0
  388. data/stdlib/zlib/0/data_error.rbs +10 -0
  389. data/stdlib/zlib/0/deflate.rbs +210 -0
  390. data/stdlib/zlib/0/error.rbs +20 -0
  391. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  392. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  393. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  394. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  395. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  396. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  397. data/stdlib/zlib/0/gzip_writer.rbs +166 -0
  398. data/stdlib/zlib/0/inflate.rbs +180 -0
  399. data/stdlib/zlib/0/mem_error.rbs +10 -0
  400. data/stdlib/zlib/0/need_dict.rbs +13 -0
  401. data/stdlib/zlib/0/stream_end.rbs +11 -0
  402. data/stdlib/zlib/0/stream_error.rbs +11 -0
  403. data/stdlib/zlib/0/version_error.rbs +11 -0
  404. data/stdlib/zlib/0/zlib.rbs +1 -3
  405. data/stdlib/zlib/0/zstream.rbs +200 -0
  406. data/templates/include/rbs/constants.h.erb +20 -0
  407. data/templates/include/rbs/ruby_objs.h.erb +10 -0
  408. data/templates/src/constants.c.erb +36 -0
  409. data/templates/src/ruby_objs.c.erb +27 -0
  410. data/templates/template.rb +122 -0
  411. metadata +136 -36
  412. data/Gemfile +0 -33
  413. data/Gemfile.lock +0 -118
  414. data/core/deprecated.rbs +0 -9
  415. data/ext/rbs_extension/constants.c +0 -135
  416. data/ext/rbs_extension/ruby_objs.c +0 -525
  417. data/ext/rbs_extension/ruby_objs.h +0 -43
  418. data/lib/rbs/constant_table.rb +0 -167
  419. data/lib/rbs/parser_compat/lexer_error.rb +0 -6
  420. data/lib/rbs/parser_compat/located_value.rb +0 -7
  421. data/lib/rbs/parser_compat/semantics_error.rb +0 -6
  422. data/lib/rbs/parser_compat/syntax_error.rb +0 -6
  423. data/lib/rbs/test/spy.rb +0 -6
  424. data/lib/rbs/type_name_resolver.rb +0 -67
  425. data/sig/constant_table.rbs +0 -30
  426. data/sig/shims/abstract_syntax_tree.rbs +0 -25
  427. data/sig/shims/pp.rbs +0 -3
  428. data/sig/shims/ripper.rbs +0 -8
  429. data/sig/shims.rbs +0 -69
  430. data/sig/type_name_resolver.rbs +0 -26
  431. data/stdlib/minitest/0/manifest.yaml +0 -2
  432. data/stdlib/prime/0/integer-extension.rbs +0 -41
  433. data/stdlib/prime/0/manifest.yaml +0 -2
  434. data/stdlib/prime/0/prime.rbs +0 -372
data/core/true_class.rbs CHANGED
@@ -1,72 +1,98 @@
1
1
  # <!-- rdoc-file=object.c -->
2
- # The global value `true` is the only instance of class TrueClass and represents
3
- # a logically true value in boolean expressions. The class provides operators
4
- # allowing `true` to be used in logical expressions.
2
+ # The class of the singleton object `true`.
3
+ #
4
+ # Several of its methods act as operators:
5
+ #
6
+ # * #&
7
+ # * #|
8
+ # * #===
9
+ # * #^
10
+ #
11
+ # One other method:
12
+ #
13
+ # * #to_s and its alias #inspect.
5
14
  #
6
15
  class TrueClass
7
- public
8
-
9
16
  def !: () -> false
10
17
 
11
18
  # <!--
12
19
  # rdoc-file=object.c
13
- # - true & obj -> true or false
20
+ # - true & object -> true or false
14
21
  # -->
15
- # And---Returns `false` if *obj* is `nil` or `false`, `true` otherwise.
22
+ # Returns `false` if `object` is `false` or `nil`, `true` otherwise:
23
+ #
24
+ # true & Object.new # => true true & false # => false true & nil #
25
+ # => false
16
26
  #
17
- def &: (nil) -> false
18
- | (false) -> false
19
- | (untyped obj) -> true
27
+ def &: (false | nil) -> false
28
+ | (untyped obj) -> bool
20
29
 
21
30
  # <!--
22
31
  # rdoc-file=object.c
23
- # - obj === other -> true or false
32
+ # - true === other -> true or false
33
+ # - false === other -> true or false
34
+ # - nil === other -> true or false
24
35
  # -->
25
- # Case Equality -- For class Object, effectively the same as calling `#==`, but
26
- # typically overridden by descendants to provide meaningful semantics in `case`
27
- # statements.
36
+ # Returns `true` or `false`.
37
+ #
38
+ # Like Object#==, if `object` is an instance of Object (and not an instance of
39
+ # one of its many subclasses).
40
+ #
41
+ # This method is commonly overridden by those subclasses, to provide meaningful
42
+ # semantics in `case` statements.
28
43
  #
29
44
  def ===: (true) -> true
30
- | (untyped obj) -> false
45
+ | (untyped obj) -> bool
31
46
 
32
47
  # <!--
33
48
  # rdoc-file=object.c
34
- # - true ^ obj -> !obj
49
+ # - true ^ object -> !object
35
50
  # -->
36
- # Exclusive Or---Returns `true` if *obj* is `nil` or `false`, `false` otherwise.
51
+ # Returns `true` if `object` is `false` or `nil`, `false` otherwise:
52
+ #
53
+ # true ^ Object.new # => false
54
+ # true ^ false # => true
55
+ # true ^ nil # => true
37
56
  #
38
- def ^: (nil) -> true
39
- | (false) -> true
40
- | (untyped obj) -> false
57
+ def ^: (false | nil) -> true
58
+ | (untyped obj) -> bool
41
59
 
42
60
  # <!-- rdoc-file=object.c -->
43
- # The string representation of `true` is "true".
61
+ # Returns string `'true'`:
62
+ #
63
+ # true.to_s # => "true"
64
+ #
65
+ # TrueClass#inspect is an alias for TrueClass#to_s.
44
66
  #
45
67
  alias inspect to_s
46
68
 
47
69
  # <!--
48
70
  # rdoc-file=object.c
49
- # - true.to_s -> "true"
71
+ # - true.to_s -> 'true'
50
72
  # -->
51
- # The string representation of `true` is "true".
73
+ # Returns string `'true'`:
74
+ #
75
+ # true.to_s # => "true"
76
+ #
77
+ # TrueClass#inspect is an alias for TrueClass#to_s.
52
78
  #
53
79
  def to_s: () -> "true"
54
80
 
55
81
  # <!--
56
82
  # rdoc-file=object.c
57
- # - true | obj -> true
83
+ # - true | object -> true
58
84
  # -->
59
- # Or---Returns `true`. As *obj* is an argument to a method call, it is always
60
- # evaluated; there is no short-circuit evaluation in this case.
85
+ # Returns `true`:
61
86
  #
62
- # true | puts("or")
63
- # true || puts("logical or")
87
+ # true | Object.new # => true
88
+ # true | false # => true
89
+ # true | nil # => true
64
90
  #
65
- # *produces:*
91
+ # Argument `object` is evaluated. This is different from `true` with the
92
+ # short-circuit operator, whose operand is evaluated only if necessary:
66
93
  #
67
- # or
94
+ # true | raise # => Raises RuntimeError.
95
+ # true || raise # => true
68
96
  #
69
97
  def |: (untyped obj) -> true
70
-
71
- def clone: (?freeze: true?) -> self
72
98
  end
@@ -46,6 +46,44 @@
46
46
  # um.bind(t).call #=> :original
47
47
  #
48
48
  class UnboundMethod
49
+ # <!--
50
+ # rdoc-file=proc.c
51
+ # - meth.eql?(other_meth) -> true or false
52
+ # - meth == other_meth -> true or false
53
+ # -->
54
+ # Two unbound method objects are equal if they refer to the same method
55
+ # definition.
56
+ #
57
+ # Array.instance_method(:each_slice) == Enumerable.instance_method(:each_slice)
58
+ # #=> true
59
+ #
60
+ # Array.instance_method(:sum) == Enumerable.instance_method(:sum)
61
+ # #=> false, Array redefines the method for efficiency
62
+ #
63
+ def ==: (untyped other) -> bool
64
+
65
+ # <!-- rdoc-file=proc.c -->
66
+ # Two unbound method objects are equal if they refer to the same method
67
+ # definition.
68
+ #
69
+ # Array.instance_method(:each_slice) == Enumerable.instance_method(:each_slice)
70
+ # #=> true
71
+ #
72
+ # Array.instance_method(:sum) == Enumerable.instance_method(:sum)
73
+ # #=> false, Array redefines the method for efficiency
74
+ #
75
+ alias eql? ==
76
+
77
+ # <!--
78
+ # rdoc-file=proc.c
79
+ # - meth.hash -> integer
80
+ # -->
81
+ # Returns a hash value corresponding to the method object.
82
+ #
83
+ # See also Object#hash.
84
+ #
85
+ def hash: () -> Integer
86
+
49
87
  # <!--
50
88
  # rdoc-file=proc.c
51
89
  # - method.clone -> new_method
@@ -62,7 +100,7 @@ class UnboundMethod
62
100
  # m.call # => "bar"
63
101
  # n = m.clone.call # => "bar"
64
102
  #
65
- def clone: () -> self
103
+ def clone: () -> instance
66
104
 
67
105
  # <!--
68
106
  # rdoc-file=proc.c
@@ -141,6 +179,66 @@ class UnboundMethod
141
179
  #
142
180
  def bind: (untyped obj) -> Method
143
181
 
182
+ # <!--
183
+ # rdoc-file=proc.c
184
+ # - meth.to_s -> string
185
+ # - meth.inspect -> string
186
+ # -->
187
+ # Returns a human-readable description of the underlying method.
188
+ #
189
+ # "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
190
+ # (1..3).method(:map).inspect #=> "#<Method: Range(Enumerable)#map()>"
191
+ #
192
+ # In the latter case, the method description includes the "owner" of the
193
+ # original method (`Enumerable` module, which is included into `Range`).
194
+ #
195
+ # `inspect` also provides, when possible, method argument names (call sequence)
196
+ # and source location.
197
+ #
198
+ # require 'net/http'
199
+ # Net::HTTP.method(:get).inspect
200
+ # #=> "#<Method: Net::HTTP.get(uri_or_host, path=..., port=...) <skip>/lib/ruby/2.7.0/net/http.rb:457>"
201
+ #
202
+ # `...` in argument definition means argument is optional (has some default
203
+ # value).
204
+ #
205
+ # For methods defined in C (language core and extensions), location and argument
206
+ # names can't be extracted, and only generic information is provided in form of
207
+ # `*` (any number of arguments) or `_` (some positional argument).
208
+ #
209
+ # "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
210
+ # "cat".method(:+).inspect #=> "#<Method: String#+(_)>""
211
+ #
212
+ def inspect: () -> String
213
+
214
+ # <!-- rdoc-file=proc.c -->
215
+ # Returns a human-readable description of the underlying method.
216
+ #
217
+ # "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
218
+ # (1..3).method(:map).inspect #=> "#<Method: Range(Enumerable)#map()>"
219
+ #
220
+ # In the latter case, the method description includes the "owner" of the
221
+ # original method (`Enumerable` module, which is included into `Range`).
222
+ #
223
+ # `inspect` also provides, when possible, method argument names (call sequence)
224
+ # and source location.
225
+ #
226
+ # require 'net/http'
227
+ # Net::HTTP.method(:get).inspect
228
+ # #=> "#<Method: Net::HTTP.get(uri_or_host, path=..., port=...) <skip>/lib/ruby/2.7.0/net/http.rb:457>"
229
+ #
230
+ # `...` in argument definition means argument is optional (has some default
231
+ # value).
232
+ #
233
+ # For methods defined in C (language core and extensions), location and argument
234
+ # names can't be extracted, and only generic information is provided in form of
235
+ # `*` (any number of arguments) or `_` (some positional argument).
236
+ #
237
+ # "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
238
+ # "cat".method(:+).inspect #=> "#<Method: String#+(_)>""
239
+ #
240
+ alias to_s inspect
241
+
144
242
  # <!--
145
243
  # rdoc-file=proc.c
146
244
  # - meth.name -> symbol
@@ -165,7 +263,7 @@ class UnboundMethod
165
263
  #
166
264
  # (1..3).method(:map).owner #=> Enumerable
167
265
  #
168
- def owner: () -> Module
266
+ def owner: () -> (Class | Module)
169
267
 
170
268
  # <!--
171
269
  # rdoc-file=proc.c
@@ -185,32 +283,7 @@ class UnboundMethod
185
283
  # def foo(bar, baz, *args, &blk); end
186
284
  # method(:foo).parameters #=> [[:req, :bar], [:req, :baz], [:rest, :args], [:block, :blk]]
187
285
  #
188
- def parameters: () -> ::Array[[ Symbol, Symbol ]]
189
- | () -> ::Array[[ Symbol ]]
190
-
191
- # <!--
192
- # rdoc-file=proc.c
193
- # - meth.private? -> true or false
194
- # -->
195
- # Returns whether the method is private.
196
- #
197
- def private?: () -> bool
198
-
199
- # <!--
200
- # rdoc-file=proc.c
201
- # - meth.protected? -> true or false
202
- # -->
203
- # Returns whether the method is protected.
204
- #
205
- def protected?: () -> bool
206
-
207
- # <!--
208
- # rdoc-file=proc.c
209
- # - meth.public? -> true or false
210
- # -->
211
- # Returns whether the method is public.
212
- #
213
- def public?: () -> bool
286
+ def parameters: () -> Method::param_types
214
287
 
215
288
  # <!--
216
289
  # rdoc-file=proc.c
@@ -219,7 +292,7 @@ class UnboundMethod
219
292
  # Returns the Ruby source filename and line number containing this method or nil
220
293
  # if this method was not defined in Ruby (i.e. native).
221
294
  #
222
- def source_location: () -> [ String, Integer ]?
295
+ def source_location: () -> [String, Integer]?
223
296
 
224
297
  # <!--
225
298
  # rdoc-file=proc.c
@@ -252,5 +325,5 @@ class UnboundMethod
252
325
  # arguments. This is semantically equivalent to `umeth.bind(recv).call(args,
253
326
  # ...)`.
254
327
  #
255
- def bind_call: (untyped recv, *untyped args) ?{ (*untyped) -> untyped } -> untyped
328
+ def bind_call: (untyped recv, *untyped, **untyped) ?{ (?) -> untyped } -> untyped
256
329
  end
data/core/warning.rbs CHANGED
@@ -5,11 +5,11 @@
5
5
  #
6
6
  # Changing the behavior of Warning.warn is useful to customize how warnings are
7
7
  # handled by Ruby, for instance by filtering some warnings, and/or outputting
8
- # warnings somewhere other than $stderr.
8
+ # warnings somewhere other than `$stderr`.
9
9
  #
10
10
  # If you want to change the behavior of Warning.warn you should use
11
- # +Warning.extend(MyNewModuleWithWarnMethod)+ and you can use `super` to get the
12
- # default behavior of printing the warning to $stderr.
11
+ # `Warning.extend(MyNewModuleWithWarnMethod)` and you can use `super` to get the
12
+ # default behavior of printing the warning to `$stderr`.
13
13
  #
14
14
  # Example:
15
15
  # module MyWarningFilter
@@ -26,9 +26,54 @@
26
26
  # You should never redefine Warning#warn (the instance method), as that will
27
27
  # then no longer provide a way to use the default behavior.
28
28
  #
29
- # The `warning` gem provides convenient ways to customize Warning.warn.
29
+ # The [warning](https://rubygems.org/gems/warning) gem provides convenient ways
30
+ # to customize Warning.warn.
30
31
  #
31
32
  module Warning
33
+ # The types of categories the `Warning` module understands.
34
+ #
35
+ type category = :deprecated | :experimental | :performance
36
+
37
+ # <!--
38
+ # rdoc-file=error.c
39
+ # - Warning[category] -> true or false
40
+ # -->
41
+ # Returns the flag to show the warning messages for `category`. Supported
42
+ # categories are:
43
+ #
44
+ # `:deprecated`
45
+ # : deprecation warnings
46
+ # * assignment of non-nil value to `$,` and `$;`
47
+ # * keyword arguments
48
+ # etc.
49
+ #
50
+ #
51
+ # `:experimental`
52
+ # : experimental features
53
+ #
54
+ #
55
+ # `:performance`
56
+ # : performance hints
57
+ # * Shape variation limit
58
+ #
59
+ def self.[]: (category) -> bool
60
+
61
+ # <!--
62
+ # rdoc-file=error.c
63
+ # - Warning[category] = flag -> flag
64
+ # -->
65
+ # Sets the warning flags for `category`. See Warning.[] for the categories.
66
+ #
67
+ def self.[]=: [T] (category, T flag) -> T
68
+
69
+ # <!--
70
+ # rdoc-file=error.c
71
+ # - categories -> array
72
+ # -->
73
+ # Returns a list of the supported category symbols.
74
+ #
75
+ def self.categories: () -> Array[Symbol]
76
+
32
77
  # <!--
33
78
  # rdoc-file=error.c
34
79
  # - warn(msg, category: nil) -> nil
@@ -38,5 +83,5 @@ module Warning
38
83
  #
39
84
  # See the documentation of the Warning module for how to customize this.
40
85
  #
41
- def self?.warn: (String message, ?category: :deprecated | :experimental | nil) -> nil
86
+ def self?.warn: (String message, ?category: category?) -> nil
42
87
  end
data/docs/CONTRIBUTING.md CHANGED
@@ -69,7 +69,7 @@ We define the standard members order so that ordering doesn't bother reading dif
69
69
  5. `public` & public instance methods
70
70
  6. `private` & private instance methods
71
71
 
72
- ```
72
+ ```rbs
73
73
  class HelloWorld[X]
74
74
  def self.new: [A] () { (void) -> A } -> HelloWorld[A] # new or initialize comes first
75
75
  def initialize: () -> void
@@ -0,0 +1,110 @@
1
+ # Architecture
2
+
3
+ This guide describes the outline of the architecture of RBS library. It helps you to understand the structure and key features of the library to start contributing to the library.
4
+
5
+ ## Bird's Eye View
6
+
7
+ The goal of the library is simple: Read RBS files and generate the structure of Ruby programs.
8
+
9
+ ```
10
+ RBS files
11
+ ↓ -- RBS::Parser
12
+ Syntax tree
13
+
14
+ Environment
15
+ ↓ -- Definition builder
16
+ Definition
17
+ ```
18
+
19
+ The input is RBS files. The gem ships with RBS type definitions of Ruby core library and some of the standard libraries. You write RBS files for your applications or gems.
20
+
21
+ Syntax tree is the next representation. `RBS::Parser` transforms the sequence of characters in RBS files into syntax trees.
22
+
23
+ Syntax tree objects are loaded to `RBS::Environment`. It collects loaded RBS objects, organizes the definitions, and provides some utilities, like resolving type names and finding the declarations.
24
+
25
+ `RBS::Definition` is the goal of the transformation steps. It is associated with a class singleton, a class object, or an interface. You can find the list of available methods and their types, instance variables, and class hierarchies.
26
+
27
+ ## Core classes
28
+
29
+ ### Types
30
+
31
+ Types are defined under `RBS::Types`, like `RBS::Types::ClassInstance` or `RBS::Types::Union`. You will find the definition of each type supported in RBS.
32
+
33
+ ### Parsing RBS files
34
+
35
+ The RBS source code is loaded into `RBS::Buffer`, and `RBS::Parser` is the parser. The parser is implemented in C extension.
36
+
37
+ `RBS::Parser` provides three entrypoints.
38
+
39
+ - `RBS::Parser.parse_method_type` parsers a *method type*. (`[T] (String) { (IO) -> T } -> Array[T]`)
40
+ - `RBS::Parser.parse_type` parses a *type*. (`Hash[Symbol, untyped]`)
41
+ - `RBS::Parser.parse_signature` parses the whole RBS file.
42
+
43
+ ### Environment
44
+
45
+ RBS AST is loaded to `RBS::Environment` by `RBS::EnvironmentLoader`. `Environment` gives *absolute names* to the declarations, and provides an index from the *absolute name* to their declarations.
46
+
47
+ Assume we have the following nested RBS declarations:
48
+
49
+ ```rbs
50
+ module Hello
51
+ class World
52
+ end
53
+ end
54
+
55
+ class Hello::World
56
+ end
57
+ ```
58
+
59
+ And the environment organizes the definitions as follows:
60
+
61
+ - There are two classes `::Hello` and `::Hello::World`
62
+ - It provides a mapping from `::Hello` to it's `module` declaration and `::Hello::World` to it's two `class` declarations
63
+
64
+ ### Definition and DefinitionBuilder
65
+
66
+ `RBS::Definition` tells you:
67
+
68
+ - The set of available methods in a class/module/interface
69
+ - The set of instance variables in a class/module
70
+ - The ancestors in a class/module
71
+
72
+ Definition is constructed for:
73
+
74
+ - A singleton class of a class/module -- `singleton(String)`, `singleton(Array)`,
75
+ - An instance of a class -- `String`, `Array[T]`, or
76
+ - An interface -- `_ToS`
77
+
78
+ Note that generic class instances/interfaces are kept generic. We don't have a definition of `Array[String]` but of `Array[T]`.
79
+
80
+ `DefinitionBuilder` constructs `Definition` of given type names.
81
+
82
+ - `DefinitionBuilder#build_singleton` returns a definition of singleton classes of given class/module.
83
+ - `DefinitionBuilder#build_instance` returns a definition of instances of given class/module.
84
+ - `DefinitionBuilder#build_interface` returns a definition of interfaces.
85
+
86
+ It uses `AncestorBuilder` to construct ancestor chains of the type. `MethodBuilder` constructs sets of available methods based on the ancestor chains.
87
+
88
+ The `#build_singleton` calculates the type of `.new` methods based on the definition of `#initialize` method. This is different from Ruby's implementation -- it reused `Class#new` method but we need the custom implementation to give precise `.new` method type of each class.
89
+
90
+ #### Working with type aliases
91
+
92
+ `DefinitionBuilder#expand_alias` and its variants provide one step *unfold* operation of type aliases.
93
+
94
+ ```ruby
95
+ builder.expand_alias2(RBS::TypeName.parse("::int"), []) # => returns `::Integer | ::_ToInt`
96
+ ```
97
+
98
+ We don't have *normalize* operation for type aliases, because RBS allows recursive type alias definition, which cannot be *fully* unfolded.
99
+
100
+ ### Other utilities
101
+
102
+ `RBS::Validator` provides validation of RBS type declaration. It validates that all of the type name references can be resolved, all type applications have correct arity, and so on.
103
+
104
+ `RBS::Test` provides runtime type checking, which confirms if a Ruby object can have an RBS type. It also provides an integration to existing Ruby code so that we run Ruby code, assuming unit tests, with runtime type checking.
105
+
106
+ `RBS::UnitTest` provides utilities to help write unit tests for RBS type definitions. Use the tool to make sure your RBS type definition is consistent with implementation.
107
+
108
+ `RBS::Prototype` is the core of `rbs prototype` feature. It scans Ruby source code or uses reflection features, and it generates the prototype of RBS files.
109
+
110
+ `RBS::Collection` includes `rbs collection` features.
data/docs/collection.md CHANGED
@@ -28,11 +28,10 @@ sources:
28
28
  # A directory to install the downloaded RBSs
29
29
  path: .gem_rbs_collection
30
30
 
31
- gems:
32
- # Skip loading rbs gem's RBS.
33
- # It's unnecessary if you don't use rbs as a library.
34
- - name: rbs
35
- ignore: true
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
36
35
  ```
37
36
 
38
37
  I also recommend updating `.gitignore`.
@@ -79,6 +78,10 @@ sources:
79
78
  revision: main
80
79
  repo_dir: gems
81
80
 
81
+ # You can also add a local path as a collection source optionally.
82
+ - type: local
83
+ path: path/to/local/dir
84
+
82
85
  # A directory to install the downloaded RBSs
83
86
  path: .gem_rbs_collection
84
87
 
@@ -95,6 +98,57 @@ gems:
95
98
  ignore: true
96
99
  ```
97
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
+
98
152
  ### `manifest.yaml`
99
153
 
100
154
  If you are a gem maintainer, you can write `manifest.yaml`.
@@ -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
+ ```