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/COPYING ADDED
@@ -0,0 +1,56 @@
1
+ rbs is copyrighted free software by Soutaro Matsumoto <matsumoto@soutaro.com>.
2
+ You can redistribute it and/or modify it under either the terms of the
3
+ 2-clause BSDL (see the file BSDL), or the conditions below:
4
+
5
+ 1. You may make and give away verbatim copies of the source form of the
6
+ software without restriction, provided that you duplicate all of the
7
+ original copyright notices and associated disclaimers.
8
+
9
+ 2. You may modify your copy of the software in any way, provided that
10
+ you do at least ONE of the following:
11
+
12
+ a. place your modifications in the Public Domain or otherwise
13
+ make them Freely Available, such as by posting said
14
+ modifications to Usenet or an equivalent medium, or by allowing
15
+ the author to include your modifications in the software.
16
+
17
+ b. use the modified software only within your corporation or
18
+ organization.
19
+
20
+ c. give non-standard binaries non-standard names, with
21
+ instructions on where to get the original software distribution.
22
+
23
+ d. make other distribution arrangements with the author.
24
+
25
+ 3. You may distribute the software in object code or binary form,
26
+ provided that you do at least ONE of the following:
27
+
28
+ a. distribute the binaries and library files of the software,
29
+ together with instructions (in the manual page or equivalent)
30
+ on where to get the original distribution.
31
+
32
+ b. accompany the distribution with the machine-readable source of
33
+ the software.
34
+
35
+ c. give non-standard binaries non-standard names, with
36
+ instructions on where to get the original software distribution.
37
+
38
+ d. make other distribution arrangements with the author.
39
+
40
+ 4. You may modify and include the part of the software into any other
41
+ software (possibly commercial). But some files in the distribution
42
+ are not written by the author, so that they are not under these terms.
43
+
44
+ For the list of those files and their copying conditions, see the
45
+ file LEGAL.
46
+
47
+ 5. The scripts and library files supplied as input to or produced as
48
+ output from the software do not automatically fall under the
49
+ copyright of the software, but belong to whomever generated them,
50
+ and may be sold commercially, and may be aggregated with this
51
+ software.
52
+
53
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
54
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
55
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56
+ PURPOSE.
data/README.md ADDED
@@ -0,0 +1,203 @@
1
+ # RBS
2
+
3
+ RBS is a language to describe the structure of Ruby programs.
4
+ You can write down the definition of a class or module: methods defined in the class, instance variables and their types, and inheritance/mix-in relations.
5
+ It also allows declaring constants and global variables.
6
+
7
+ The following is a small example of RBS for a chat app.
8
+
9
+ <!-- run-start:a.rbs:bundle exec rbs -I a.rbs validate -->
10
+ ```rbs
11
+ module ChatApp
12
+ VERSION: String
13
+
14
+ class User
15
+ attr_reader login: String
16
+ attr_reader email: String
17
+
18
+ def initialize: (login: String, email: String) -> void
19
+ end
20
+
21
+ class Bot
22
+ attr_reader name: String
23
+ attr_reader email: String
24
+ attr_reader owner: User
25
+
26
+ def initialize: (name: String, owner: User) -> void
27
+ end
28
+
29
+ class Message
30
+ attr_reader id: String
31
+ attr_reader string: String
32
+ attr_reader from: User | Bot # `|` means union types: `#from` can be `User` or `Bot`
33
+ attr_reader reply_to: Message? # `?` means optional type: `#reply_to` can be `nil`
34
+
35
+ def initialize: (from: User | Bot, string: String) -> void
36
+
37
+ def reply: (from: User | Bot, string: String) -> Message
38
+ end
39
+
40
+ class Channel
41
+ attr_reader name: String
42
+ attr_reader messages: Array[Message]
43
+ attr_reader users: Array[User]
44
+ attr_reader bots: Array[Bot]
45
+
46
+ def initialize: (name: String) -> void
47
+
48
+ def each_member: () { (User | Bot) -> void } -> void # `{` and `}` means block.
49
+ | () -> Enumerator[User | Bot, void] # Method can be overloaded.
50
+ end
51
+ end
52
+ ```
53
+ <!-- run-end -->
54
+
55
+ ## The Target Version
56
+
57
+ * The standard library signatures targets the latest release of Ruby. (`3.2` as of 2023.)
58
+ * The library code targets non-EOL versions of Ruby. (`>= 3.0` as of 2023.)
59
+
60
+ ## Installation
61
+
62
+ Install the `rbs` gem. `$ gem install rbs` from the command line, or add a line in your `Gemfile`.
63
+
64
+ ```rb
65
+ gem "rbs"
66
+ ```
67
+
68
+ ## CLI
69
+
70
+ The gem ships with the `rbs` command line tool to demonstrate what it can do and help develop RBS.
71
+
72
+ ```console
73
+ $ rbs version
74
+ $ rbs list
75
+ $ rbs ancestors ::Object
76
+ $ rbs methods ::Object
77
+ $ rbs method Object then
78
+ ```
79
+
80
+ An end user of `rbs` will probably find `rbs prototype` the most useful. This command generates boilerplate signature declarations for ruby files. For example, say you have written the below ruby script.
81
+
82
+ ```ruby
83
+ # person.rb
84
+ class Person
85
+ attr_reader :name
86
+ attr_reader :contacts
87
+
88
+ def initialize(name:)
89
+ @name = name
90
+ @contacts = []
91
+ end
92
+
93
+ def speak
94
+ "I'm #{@name} and I love Ruby!"
95
+ end
96
+ end
97
+ ```
98
+
99
+ Running prototype on the above will automatically generate
100
+
101
+ ```console
102
+ $ rbs prototype rb person.rb
103
+ class Person
104
+ @name: untyped
105
+
106
+ @contacts: untyped
107
+
108
+ attr_reader name: untyped
109
+
110
+ attr_reader contacts: untyped
111
+
112
+ def initialize: (name: untyped) -> void
113
+
114
+ def speak: () -> ::String
115
+ end
116
+ ```
117
+
118
+ It prints signatures for all methods, classes, instance variables, and constants.
119
+ This is only a starting point, and you should edit the output to match your signature more accurately.
120
+
121
+ `rbs prototype` offers three options.
122
+
123
+ - `rb` generates from just the available Ruby code
124
+ - `rbi` generates from Sorbet RBI
125
+ - `runtime` generates from runtime API
126
+
127
+ ## Library
128
+
129
+ There are two important concepts, _environment_ and _definition_.
130
+
131
+ An _environment_ is a dictionary that keeps track of all declarations. What is the declaration associated with `String` class? An _environment_ will give you the answer.
132
+
133
+ A _definition_ gives you the detail of the class. What is the type of the return value of `gsub` method of the `String` class? The _definition_ for `String` class knows the list of methods it provides and their types.
134
+
135
+ The following is a small code to retrieve the definition of the `String#gsub` method.
136
+
137
+ <!-- run-start:a.rb:bundle exec ruby a.rb -->
138
+ ```rb
139
+ require "rbs"
140
+
141
+ loader = RBS::EnvironmentLoader.new()
142
+
143
+ # loader.add(path: Pathname("sig")) # Load .rbs files from `sig` directory
144
+ # loader.add(library: "pathname") # Load pathname library
145
+
146
+ environment = RBS::Environment.from_loader(loader).resolve_type_names
147
+
148
+ # ::String
149
+ string = RBS::TypeName.new(name: :String, namespace: RBS::Namespace.root)
150
+
151
+ # Class declaration for ::String
152
+ decl = environment.class_decls[string]
153
+
154
+ # Builder provides the translation from `declaration` to `definition`
155
+ builder = RBS::DefinitionBuilder.new(env: environment)
156
+
157
+ # Definition of instance of String
158
+ instance = builder.build_instance(string)
159
+
160
+ # Print the types of `gsub` method:
161
+ puts instance.methods[:gsub].method_types.join("\n")
162
+ # Outputs =>
163
+ # (::Regexp | ::string pattern, ::string replacement) -> ::String
164
+ # (::Regexp | ::string pattern, ::Hash[::String, ::String] hash) -> ::String
165
+ # (::Regexp | ::string pattern) { (::String match) -> ::_ToS } -> ::String
166
+ # (::Regexp | ::string pattern) -> ::Enumerator[::String, self]
167
+
168
+ # Definition of singleton of String
169
+ singleton = builder.build_singleton(string)
170
+ # No `gsub` method for String singleton
171
+ puts singleton.methods[:gsub]
172
+ ```
173
+ <!-- run-end -->
174
+
175
+ ## Guides
176
+
177
+ - [Architecture](docs/architecture.md)
178
+ - [Core and standard library signature contribution guide](docs/CONTRIBUTING.md)
179
+ - [Writing signatures guide](docs/sigs.md)
180
+ - [Stdlib signatures guide](docs/stdlib.md)
181
+ - [Syntax](docs/syntax.md)
182
+ - [RBS by Example](docs/rbs_by_example.md)
183
+ - [RBS collection](docs/collection.md)
184
+ - [Using `Data` and `Struct`](docs/data_and_struct.md)
185
+ - [Releasing a gem with RBS](docs/gem.md)
186
+
187
+ ## Community
188
+
189
+ Here is a list of some places you can talk with active maintainers.
190
+
191
+ - [Ruby Discord Server (invite link)](https://discord.gg/ad2acQFtkh) -- We have `rbs` channel in Ruby Discord server.
192
+ - [ruby-jp Slack Workspace (in Japanese)](https://ruby-jp.github.io/) -- We have `types` channel in ruby-jp slack workspace.
193
+ - [gem_rbs_collection](https://github.com/ruby/gem_rbs_collection) -- We have a repository of third-party RBS type definitions, for the case your dependency doesn't ship with RBS files.
194
+
195
+ ## Development
196
+
197
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
198
+
199
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
200
+
201
+ ## Contributing
202
+
203
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/rbs.
data/Rakefile ADDED
@@ -0,0 +1,417 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ require "rbconfig"
4
+ require 'rake/extensiontask'
5
+
6
+ $LOAD_PATH << File.join(__dir__, "test")
7
+
8
+ ruby = ENV["RUBY"] || RbConfig.ruby
9
+ rbs = File.join(__dir__, "exe/rbs")
10
+ bin = File.join(__dir__, "bin")
11
+
12
+ Rake::ExtensionTask.new("rbs_extension")
13
+
14
+ Rake::TestTask.new(:test => :compile) do |t|
15
+ t.libs << "test"
16
+ t.libs << "lib"
17
+ t.test_files = FileList["test/**/*_test.rb"].reject do |path|
18
+ path =~ %r{test/stdlib/}
19
+ end
20
+ end
21
+
22
+ multitask :default => [:test, :stdlib_test, :typecheck_test, :rubocop, :validate, :test_doc]
23
+
24
+ task :lexer do
25
+ sh "re2c -W --no-generation-date -o ext/rbs_extension/lexer.c ext/rbs_extension/lexer.re"
26
+ end
27
+
28
+ task :confirm_lexer => :lexer do
29
+ puts "Testing if lexer.c is updated with respect to lexer.re"
30
+ sh "git diff --exit-code ext/rbs_extension/lexer.c"
31
+ end
32
+
33
+ task :confirm_templates => :templates do
34
+ puts "Testing if generated code under include and src is updated with respect to templates"
35
+ sh "git diff --exit-code -- include src"
36
+ end
37
+
38
+ rule ".c" => ".re" do |t|
39
+ puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake lexer` ⚠️⚠️⚠️"
40
+ end
41
+
42
+ rule %r{^src/(.*)\.c} => 'templates/%X.c.erb' do |t|
43
+ puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake templates` ⚠️⚠️⚠️"
44
+ end
45
+ rule %r{^include/(.*)\.c} => 'templates/%X.c.erb' do |t|
46
+ puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake templates` ⚠️⚠️⚠️"
47
+ end
48
+
49
+ task :annotate do
50
+ sh "bin/generate_docs.sh"
51
+ end
52
+
53
+ task :confirm_annotation do
54
+ puts "Testing if RBS docs are updated with respect to RDoc"
55
+ sh "git diff --exit-code core stdlib"
56
+ end
57
+
58
+ task :templates do
59
+ sh "#{ruby} templates/template.rb include/rbs/constants.h"
60
+ sh "#{ruby} templates/template.rb include/rbs/ruby_objs.h"
61
+ sh "#{ruby} templates/template.rb src/constants.c"
62
+ sh "#{ruby} templates/template.rb src/ruby_objs.c"
63
+ end
64
+
65
+ task :compile => "ext/rbs_extension/lexer.c"
66
+ task :compile => "include/rbs/constants.h"
67
+ task :compile => "include/rbs/ruby_objs.h"
68
+ task :compile => "src/constants.c"
69
+ task :compile => "src/ruby_objs.c"
70
+
71
+ task :test_doc do
72
+ files = Dir.chdir(File.expand_path('..', __FILE__)) do
73
+ `git ls-files -z`.split("\x0").select do |file| Pathname(file).extname == ".md" end
74
+ end
75
+
76
+ sh "#{ruby} #{__dir__}/bin/run_in_md.rb #{files.join(" ")}"
77
+ end
78
+
79
+ task :validate => :compile do
80
+ require 'yaml'
81
+
82
+ sh "#{ruby} #{rbs} validate --exit-error-on-syntax-error"
83
+
84
+ libs = FileList["stdlib/*"].map {|path| File.basename(path).to_s }
85
+
86
+ # Skip RBS validation because Ruby CI runs without rubygems
87
+ case skip_rbs_validation = ENV["SKIP_RBS_VALIDATION"]
88
+ when nil
89
+ begin
90
+ Gem::Specification.find_by_name("rbs")
91
+ libs << "rbs"
92
+ rescue Gem::MissingSpecError
93
+ STDERR.puts "🚨🚨🚨🚨 Skipping `rbs` gem because it's not found"
94
+ end
95
+ when "true"
96
+ # Skip
97
+ else
98
+ STDERR.puts "🚨🚨🚨🚨 SKIP_RBS_VALIDATION is expected to be `true` or unset, given `#{skip_rbs_validation}` 🚨🚨🚨🚨"
99
+ libs << "rbs"
100
+ end
101
+
102
+ libs.each do |lib|
103
+ sh "#{ruby} #{rbs} -r #{lib} validate --exit-error-on-syntax-error"
104
+ end
105
+ end
106
+
107
+ FileList["test/stdlib/**/*_test.rb"].each do |test|
108
+ task test => :compile do
109
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test}"
110
+ end
111
+ end
112
+
113
+ task :stdlib_test => :compile do
114
+ test_files = FileList["test/stdlib/**/*_test.rb"].reject do |path|
115
+ path =~ %r{Ractor} || path =~ %r{Encoding}
116
+ end
117
+
118
+ if ENV["RANDOMIZE_STDLIB_TEST_ORDER"] == "true"
119
+ test_files.shuffle!
120
+ end
121
+
122
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test_files.join(' ')}"
123
+ # TODO: Ractor tests need to be run in a separate process
124
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Ractor_test.rb"
125
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Encoding_test.rb"
126
+ end
127
+
128
+ task :typecheck_test => :compile do
129
+ FileList["test/typecheck/*"].each do |test|
130
+ Dir.chdir(test) do
131
+ expectations = File.join(test, "steep_expectations.yml")
132
+ if File.exist?(expectations)
133
+ sh "steep check --with_expectations"
134
+ else
135
+ sh "steep check"
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ task :raap => :compile do
142
+ sh "ruby test/raap/core.rb"
143
+ sh "ruby test/raap/digest.rb"
144
+ sh "ruby test/raap/openssl.rb"
145
+ end
146
+
147
+ task :rubocop do
148
+ format = if ENV["CI"]
149
+ "github"
150
+ else
151
+ "progress"
152
+ end
153
+
154
+ sh "rubocop --parallel --format #{format}"
155
+ end
156
+
157
+ namespace :generate do
158
+ desc "Generate a test file for a stdlib class signatures"
159
+ task :stdlib_test, [:class] do |_task, args|
160
+ klass = args.fetch(:class) do
161
+ raise "Class name is necessary. e.g. rake 'generate:stdlib_test[String]'"
162
+ end
163
+
164
+ require "erb"
165
+ require "rbs"
166
+
167
+ class TestTarget
168
+ def initialize(klass)
169
+ @type_name = RBS::Namespace.parse(klass).to_type_name
170
+ end
171
+
172
+ def path
173
+ Pathname(ENV['RBS_GENERATE_TEST_PATH'] || "test/stdlib/#{file_name}_test.rb")
174
+ end
175
+
176
+ def file_name
177
+ @type_name.to_s.gsub(/\A::/, '').gsub(/::/, '_')
178
+ end
179
+
180
+ def to_s
181
+ @type_name.to_s
182
+ end
183
+
184
+ def absolute_type_name
185
+ @absolute_type_name ||= @type_name.absolute!
186
+ end
187
+ end
188
+
189
+ target = TestTarget.new(klass)
190
+ path = target.path
191
+ raise "#{path} already exists!" if path.exist?
192
+
193
+ class TestTemplateBuilder
194
+ attr_reader :target, :env
195
+
196
+ def initialize(target)
197
+ @target = target
198
+
199
+ loader = RBS::EnvironmentLoader.new
200
+ Dir['stdlib/*'].each do |lib|
201
+ next if lib.end_with?('builtin')
202
+
203
+ loader.add(library: File.basename(lib))
204
+ end
205
+ @env = RBS::Environment.from_loader(loader).resolve_type_names
206
+ end
207
+
208
+ def call
209
+ ERB.new(<<~ERB, trim_mode: "-").result(binding)
210
+ require_relative "test_helper"
211
+
212
+ <%- unless class_methods.empty? -%>
213
+ class <%= target %>SingletonTest < Test::Unit::TestCase
214
+ include TestHelper
215
+
216
+ # library "pathname", "securerandom" # Declare library signatures to load
217
+ testing "singleton(::<%= target %>)"
218
+
219
+ <%- class_methods.each do |method_name, definition| -%>
220
+ def test_<%= test_name_for(method_name) %>
221
+ <%- definition.method_types.each do |method_type| -%>
222
+ assert_send_type "<%= method_type %>",
223
+ <%= target %>, :<%= method_name %>
224
+ <%- end -%>
225
+ end
226
+
227
+ <%- end -%>
228
+ end
229
+ <%- end -%>
230
+
231
+ <%- unless instance_methods.empty? -%>
232
+ class <%= target %>Test < Test::Unit::TestCase
233
+ include TestHelper
234
+
235
+ # library "pathname", "securerandom" # Declare library signatures to load
236
+ testing "::<%= target %>"
237
+
238
+ <%- instance_methods.each do |method_name, definition| -%>
239
+ def test_<%= test_name_for(method_name) %>
240
+ <%- definition.method_types.each do |method_type| -%>
241
+ assert_send_type "<%= method_type %>",
242
+ <%= target %>.new, :<%= method_name %>
243
+ <%- end -%>
244
+ end
245
+
246
+ <%- end -%>
247
+ end
248
+ <%- end -%>
249
+ ERB
250
+ end
251
+
252
+ private
253
+
254
+ def test_name_for(method_name)
255
+ {
256
+ :== => 'double_equal',
257
+ :!= => 'not_equal',
258
+ :=== => 'triple_equal',
259
+ :[] => 'square_bracket',
260
+ :[]= => 'square_bracket_assign',
261
+ :> => 'greater_than',
262
+ :< => 'less_than',
263
+ :>= => 'greater_than_equal_to',
264
+ :<= => 'less_than_equal_to',
265
+ :<=> => 'spaceship',
266
+ :+ => 'plus',
267
+ :- => 'minus',
268
+ :* => 'multiply',
269
+ :/ => 'divide',
270
+ :** => 'power',
271
+ :% => 'modulus',
272
+ :& => 'and',
273
+ :| => 'or',
274
+ :^ => 'xor',
275
+ :>> => 'right_shift',
276
+ :<< => 'left_shift',
277
+ :=~ => 'pattern_match',
278
+ :!~ => 'does_not_match',
279
+ :~ => 'tilde'
280
+ }.fetch(method_name, method_name)
281
+ end
282
+
283
+ def class_methods
284
+ @class_methods ||= RBS::DefinitionBuilder.new(env: env).build_singleton(target.absolute_type_name).methods.select {|_, definition|
285
+ definition.implemented_in == target.absolute_type_name
286
+ }
287
+ end
288
+
289
+ def instance_methods
290
+ @instance_methods ||= RBS::DefinitionBuilder.new(env: env).build_instance(target.absolute_type_name).methods.select {|_, definition|
291
+ definition.implemented_in == target.absolute_type_name
292
+ }
293
+ end
294
+ end
295
+
296
+ path.write TestTemplateBuilder.new(target).call
297
+
298
+ puts "Created: #{path}"
299
+ end
300
+ end
301
+
302
+ task :test_generate_stdlib do
303
+ sh "RBS_GENERATE_TEST_PATH=/tmp/Array_test.rb rake 'generate:stdlib_test[Array]'"
304
+ sh "ruby -c /tmp/Array_test.rb"
305
+ sh "RBS_GENERATE_TEST_PATH=/tmp/Thread_Mutex_test.rb rake 'generate:stdlib_test[Thread::Mutex]'"
306
+ sh "ruby -c /tmp/Thread_Mutex_test.rb"
307
+ end
308
+
309
+ # Rake::Task[:release].enhance do
310
+ # Rake::Task[:"release:note"].invoke
311
+ # end
312
+
313
+ namespace :release do
314
+ desc "Explain the post-release steps automatically"
315
+ task :note do
316
+ version = Gem::Version.new(RBS::VERSION)
317
+ major, minor, patch, *_ = RBS::VERSION.split(".")
318
+ major = major.to_i
319
+ minor = minor.to_i
320
+ patch = patch.to_i
321
+
322
+ puts "🎉🎉🎉🎉 Congratulations for **#{version}** release! 🎉🎉🎉🎉"
323
+ puts
324
+ puts "There are a few things left to complete the release. 💪"
325
+ puts
326
+
327
+ if patch == 0 || version.prerelease?
328
+ puts "* [ ] Update release note: https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor}"
329
+ end
330
+
331
+ if patch == 0 && !version.prerelease?
332
+ puts "* [ ] Delete `RBS XYZ is the latest version of...` from release note: https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor}"
333
+ end
334
+
335
+ puts "* [ ] Publish a release at GitHub"
336
+ puts "* [ ] Make some announcements on Twitter/Mustdon/Slack/???"
337
+
338
+ puts
339
+ puts
340
+
341
+ puts "✏️ Making a draft release on GitHub..."
342
+
343
+ content = File.read(File.join(__dir__, "CHANGELOG.md"))
344
+ changelog = content.scan(/^## \d.*?(?=^## \d)/m)[0]
345
+ changelog = changelog.sub(/^.*\n^.*\n/, "").rstrip
346
+
347
+ notes = <<NOTES
348
+ [Release note](https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor})
349
+
350
+ #{changelog}
351
+ NOTES
352
+
353
+ command = [
354
+ "gh",
355
+ "release",
356
+ "create",
357
+ "--draft",
358
+ "v#{RBS::VERSION}",
359
+ "--title=#{RBS::VERSION}",
360
+ "--notes=#{notes}"
361
+ ]
362
+
363
+ if version.prerelease?
364
+ command << "--prerelease"
365
+ end
366
+
367
+ require "open3"
368
+ output, status = Open3.capture2(*command)
369
+ if status.success?
370
+ puts " >> Done! Open #{output.chomp} and publish the release!"
371
+ end
372
+ end
373
+ end
374
+
375
+
376
+ desc "Generate changelog template from GH pull requests"
377
+ task :changelog do
378
+ major, minor, patch, _pre = RBS::VERSION.split(".", 4)
379
+ major = major.to_i
380
+ minor = minor.to_i
381
+ patch = patch.to_i
382
+
383
+ if patch == 0
384
+ milestone = "RBS #{major}.#{minor}"
385
+ else
386
+ milestone = "RBS #{major}.#{minor}.x"
387
+ end
388
+
389
+ puts "🔍 Finding pull requests that is associated to milestone `#{milestone}`..."
390
+
391
+ command = [
392
+ "gh",
393
+ "pr",
394
+ "list",
395
+ "--limit=10000",
396
+ "--json",
397
+ "url,title,number",
398
+ "--search" ,
399
+ "milestone:\"#{milestone}\" is:merged sort:updated-desc -label:Released"
400
+ ]
401
+
402
+ require "open3"
403
+ output, status = Open3.capture2(*command)
404
+ raise status.inspect unless status.success?
405
+
406
+ require "json"
407
+ json = JSON.parse(output, symbolize_names: true)
408
+
409
+ unless json.empty?
410
+ puts
411
+ json.each do |line|
412
+ puts "* #{line[:title]} ([##{line[:number]}](#{line[:url]}))"
413
+ end
414
+ else
415
+ puts " (🤑 There is no *unreleased* pull request associated to the milestone.)"
416
+ end
417
+ end