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,201 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class Subtractor
5
+ def initialize(minuend, subtrahend)
6
+ @minuend = minuend
7
+ @subtrahend = subtrahend
8
+ end
9
+
10
+ def call(minuend = @minuend, context: nil)
11
+ minuend.map do |decl|
12
+ case decl
13
+ when AST::Declarations::Constant
14
+ name = absolute_typename(decl.name, context: context)
15
+ decl unless @subtrahend.constant_name?(name)
16
+ when AST::Declarations::Interface
17
+ name = absolute_typename(decl.name, context: context)
18
+ decl unless @subtrahend.interface_name?(name)
19
+ when AST::Declarations::Class, AST::Declarations::Module
20
+ name = absolute_typename(decl.name, context: context)
21
+ case
22
+ when @subtrahend.class_decl?(name) && decl.is_a?(AST::Declarations::Class)
23
+ filter_members(decl, context: context)
24
+ when @subtrahend.module_decl?(name) && decl.is_a?(AST::Declarations::Module)
25
+ filter_members(decl, context: context)
26
+ when @subtrahend.constant_name?(name)
27
+ nil
28
+ else
29
+ decl
30
+ end
31
+ when AST::Declarations::Global
32
+ decl unless @subtrahend.global_decls[decl.name]
33
+ when AST::Declarations::TypeAlias
34
+ name = absolute_typename(decl.name, context: context)
35
+ decl unless @subtrahend.type_alias_decls[name]
36
+ when AST::Declarations::ClassAlias
37
+ name = absolute_typename(decl.new_name, context: context)
38
+ decl unless @subtrahend.class_alias?(name) || @subtrahend.class_decl?(name)
39
+ when AST::Declarations::ModuleAlias
40
+ name = absolute_typename(decl.new_name, context: context)
41
+ decl unless @subtrahend.module_alias?(name) || @subtrahend.module_decl?(name)
42
+ else
43
+ raise "unknown decl: #{(_ = decl).class}"
44
+ end
45
+ end.compact
46
+ end
47
+
48
+ private def filter_members(decl, context:)
49
+ owner = absolute_typename(decl.name, context: context)
50
+
51
+ context = _ = [context, decl.name]
52
+ children = call(decl.each_decl.to_a, context: context) +
53
+ decl.each_member.reject { |m| member_exist?(owner, m, context: context) }
54
+ children = filter_redundant_access_modifiers(children)
55
+ return nil if children.empty?
56
+
57
+ update_decl(decl, members: children)
58
+ end
59
+
60
+ private def member_exist?(owner, member, context:)
61
+ case member
62
+ when AST::Members::MethodDefinition
63
+ method_exist?(owner, member.name, member.kind)
64
+ when AST::Members::Alias
65
+ method_exist?(owner, member.new_name, member.kind)
66
+ when AST::Members::AttrReader
67
+ method_exist?(owner, member.name, member.kind)
68
+ when AST::Members::AttrWriter
69
+ method_exist?(owner, :"#{member.name}=", member.kind)
70
+ when AST::Members::AttrAccessor
71
+ # TODO: It unexpectedly removes attr_accessor even if either reader or writer does not exist in the subtrahend.
72
+ method_exist?(owner, member.name, member.kind) || method_exist?(owner, :"#{member.name}=", member.kind)
73
+ when AST::Members::InstanceVariable
74
+ ivar_exist?(owner, member.name, :instance)
75
+ when AST::Members::ClassInstanceVariable
76
+ ivar_exist?(owner, member.name, :singleton)
77
+ when AST::Members::ClassVariable
78
+ cvar_exist?(owner, member.name)
79
+ when AST::Members::Include, AST::Members::Extend, AST::Members::Prepend
80
+ mixin_exist?(owner, member, context: context)
81
+ when AST::Members::Public, AST::Members::Private
82
+ # They should not be removed even if the subtrahend has them.
83
+ false
84
+ else
85
+ raise "unknown member: #{(_ = member).class}"
86
+ end
87
+ end
88
+
89
+ private def method_exist?(owner, method_name, kind)
90
+ each_member(owner).any? do |m|
91
+ case m
92
+ when AST::Members::MethodDefinition
93
+ m.name == method_name && m.kind == kind
94
+ when AST::Members::Alias
95
+ m.new_name == method_name && m.kind == kind
96
+ when AST::Members::AttrReader
97
+ m.name == method_name && m.kind == kind
98
+ when AST::Members::AttrWriter
99
+ :"#{m.name}=" == method_name && m.kind == kind
100
+ when AST::Members::AttrAccessor
101
+ (m.name == method_name || :"#{m.name}=" == method_name) && m.kind == kind
102
+ end
103
+ end
104
+ end
105
+
106
+ private def ivar_exist?(owner, name, kind)
107
+ each_member(owner).any? do |m|
108
+ case m
109
+ when AST::Members::InstanceVariable
110
+ m.name == name
111
+ when AST::Members::Attribute
112
+ ivar_name = m.ivar_name == false ? nil : m.ivar_name || :"@#{m.name}"
113
+ ivar_name == name && m.kind == kind
114
+ end
115
+ end
116
+ end
117
+
118
+ private def cvar_exist?(owner, name)
119
+ each_member(owner).any? do |m|
120
+ case m
121
+ when AST::Members::ClassVariable
122
+ m.name == name
123
+ end
124
+ end
125
+ end
126
+
127
+ private def each_member(owner, &block)
128
+ return enum_for((__method__ or raise), owner) unless block
129
+
130
+ entry = @subtrahend.class_decls[owner]
131
+ return unless entry
132
+ decls = entry.decls.map { |d| d.decl }
133
+
134
+ decls.each { |d| d.members.each { |m| block.call(m) } }
135
+ end
136
+
137
+ private def mixin_exist?(owner, mixin, context:)
138
+ candidates = typename_candidates(mixin.name, context: context)
139
+ each_member(owner).any? do |m|
140
+ case m
141
+ when mixin.class
142
+ # @type var m: AST::Members::Include | AST::Members::Extend | AST::Members::Prepend
143
+ candidates.include?(m.name)
144
+ end
145
+ end
146
+ end
147
+
148
+ private def filter_redundant_access_modifiers(decls)
149
+ decls = decls.dup
150
+ decls.pop while access_modifier?(decls.last)
151
+ decls = decls.map.with_index do |decl, i|
152
+ if access_modifier?(decl) && access_modifier?(decls[i + 1])
153
+ nil
154
+ else
155
+ decl
156
+ end
157
+ end.compact
158
+ end
159
+
160
+ private def access_modifier?(decl)
161
+ decl.is_a?(AST::Members::Public) || decl.is_a?(AST::Members::Private)
162
+ end
163
+
164
+ private def update_decl(decl, members:)
165
+ case decl
166
+ when AST::Declarations::Class
167
+ decl.class.new(name: decl.name, type_params: decl.type_params, super_class: decl.super_class,
168
+ annotations: decl.annotations, location: decl.location, comment: decl.comment,
169
+ members: members)
170
+ when AST::Declarations::Module
171
+ decl.class.new(name: decl.name, type_params: decl.type_params, self_types: decl.self_types,
172
+ annotations: decl.annotations, location: decl.location, comment: decl.comment,
173
+ members: members)
174
+ end
175
+ end
176
+
177
+ private def absolute_typename(name, context:)
178
+ while context
179
+ ns = context[1] or raise
180
+ name = name.with_prefix(ns.to_namespace)
181
+ context = _ = context[0]
182
+ end
183
+ name.absolute!
184
+ end
185
+
186
+ private def typename_candidates(name, context:)
187
+ ret = [name.absolute!, name.relative!]
188
+ return ret if name.absolute?
189
+
190
+ while context
191
+ ns = context[1] or raise
192
+ name = name.with_prefix(ns.to_namespace)
193
+ ret.concat [name.absolute!, name.relative!]
194
+
195
+ context = _ = context[0]
196
+ end
197
+
198
+ ret
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Test
5
+ module Errors
6
+ ArgumentTypeError =
7
+ Struct.new(:klass, :method_name, :method_type, :param, :value, keyword_init: true)
8
+ BlockArgumentTypeError =
9
+ Struct.new(:klass, :method_name, :method_type, :param, :value, keyword_init: true)
10
+ ArgumentError =
11
+ Struct.new(:klass, :method_name, :method_type, keyword_init: true)
12
+ BlockArgumentError =
13
+ Struct.new(:klass, :method_name, :method_type, keyword_init: true)
14
+ ReturnTypeError =
15
+ Struct.new(:klass, :method_name, :method_type, :type, :value, keyword_init: true)
16
+ BlockReturnTypeError =
17
+ Struct.new(:klass, :method_name, :method_type, :type, :value, keyword_init: true)
18
+
19
+ UnexpectedBlockError = Struct.new(:klass, :method_name, :method_type, keyword_init: true)
20
+ MissingBlockError = Struct.new(:klass, :method_name, :method_type, keyword_init: true)
21
+
22
+ UnresolvedOverloadingError = Struct.new(:klass, :method_name, :method_types, keyword_init: true)
23
+
24
+ def self.format_param(param)
25
+ if param.name
26
+ "`#{param.type}` (#{param.name})"
27
+ else
28
+ "`#{param.type}`"
29
+ end
30
+ end
31
+
32
+ RESPOND_TO = ::Kernel.instance_method :respond_to?
33
+ private_constant :RESPOND_TO
34
+
35
+ def self.inspect_(obj)
36
+ if RESPOND_TO.bind_call(obj, :inspect)
37
+ obj.inspect
38
+ else
39
+ Test::INSPECT.bind(obj).call # For the case inspect is not defined (like BasicObject)
40
+ end
41
+ end
42
+
43
+ def self.method_tag(error)
44
+ if error.klass.singleton_class?
45
+ name = inspect_(error.klass).sub(/\A#<Class:(.*)>\z/, '\1')
46
+ method_name = ".#{error.method_name}"
47
+ else
48
+ name = error.klass.name
49
+ method_name = "##{error.method_name}"
50
+ end
51
+ "[#{name}#{method_name}]"
52
+ end
53
+
54
+ def self.to_string(error)
55
+ case error
56
+ when ArgumentTypeError
57
+ "#{method_tag(error)} ArgumentTypeError: expected #{format_param error.param} but given `#{inspect_(error.value)}`"
58
+ when BlockArgumentTypeError
59
+ "#{method_tag(error)} BlockArgumentTypeError: expected #{format_param error.param} but given `#{inspect_(error.value)}`"
60
+ when ArgumentError
61
+ "#{method_tag(error)} ArgumentError: expected method type #{error.method_type}"
62
+ when BlockArgumentError
63
+ "#{method_tag(error)} BlockArgumentError: expected method type #{error.method_type}"
64
+ when ReturnTypeError
65
+ "#{method_tag(error)} ReturnTypeError: expected `#{error.type}` but returns `#{inspect_(error.value)}`"
66
+ when BlockReturnTypeError
67
+ "#{method_tag(error)} BlockReturnTypeError: expected `#{error.type}` but returns `#{inspect_(error.value)}`"
68
+ when UnexpectedBlockError
69
+ "#{method_tag(error)} UnexpectedBlockError: unexpected block is given for `#{error.method_type}`"
70
+ when MissingBlockError
71
+ "#{method_tag(error)} MissingBlockError: required block is missing for `#{error.method_type}`"
72
+ when UnresolvedOverloadingError
73
+ "#{method_tag(error)} UnresolvedOverloadingError: couldn't find a suitable overloading"
74
+ else
75
+ raise "Unexpected error: #{inspect_(error)}"
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Test
5
+ module Guaranteed
6
+ module Inspect
7
+ EQUAL = ::BasicObject.instance_method(:equal?)
8
+ INSPECT = ::Kernel.instance_method(:inspect)
9
+ private_constant :EQUAL, :INSPECT
10
+
11
+ module_function def guaranteed_inspect(obj)
12
+ obj.inspect
13
+ rescue NoMethodError
14
+ INSPECT.bind_call(obj)
15
+ end
16
+
17
+ def inspect
18
+ string = "<#{self.class.name}:"
19
+
20
+ instance_variables.each_with_index do |variable, index|
21
+ string.concat ', ' unless index.zero?
22
+ string.concat "#{variable}: #{guaranteed_inspect(instance_variable_get(variable))}"
23
+ end
24
+
25
+ string.concat '>'
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,212 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rbs"
4
+ require "pp"
5
+
6
+ module RBS
7
+ module Test
8
+ module Hook
9
+ OPERATORS = {
10
+ :[] => "indexlookup",
11
+ :[]= => "indexset",
12
+ :== => "eqeq",
13
+ :=== => "eqeqeq",
14
+ :!= => "noteq",
15
+ :+ => "plus",
16
+ :- => "minus",
17
+ :* => "star",
18
+ :/ => "slash",
19
+ :> => "gt",
20
+ :>= => "gteq",
21
+ :< => "lt",
22
+ :<= => "lteq",
23
+ :<=> => "ufo",
24
+ :& => "amp",
25
+ :| => "vbar",
26
+ :^ => "hat",
27
+ :! => "not",
28
+ :<< => "lshift",
29
+ :>> => "rshift",
30
+ :~ => "tilde",
31
+ :=~ => "eqtilde",
32
+ :% => "percent",
33
+ :+@ => "unary_plus",
34
+ :-@ => "unary_minus"
35
+ }
36
+ def self.alias_names(target, random)
37
+ suffix = "#{RBS::Test.suffix}_#{random}"
38
+
39
+ case target
40
+ when *OPERATORS.keys
41
+ name = OPERATORS[target]
42
+ [
43
+ "#{name}____with__#{suffix}",
44
+ "#{name}____without__#{suffix}"
45
+ ]
46
+ else
47
+ aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
48
+
49
+ [
50
+ "#{aliased_target}__with__#{suffix}#{punctuation}",
51
+ "#{aliased_target}__without__#{suffix}#{punctuation}"
52
+ ]
53
+ end
54
+ end
55
+
56
+ def self.setup_alias_method_chain(klass, target, random:)
57
+ with_method, without_method = alias_names(target, random)
58
+
59
+ RBS.logger.debug "alias name: #{target}, #{with_method}, #{without_method}"
60
+
61
+ klass.instance_eval do
62
+ alias_method without_method, target
63
+ alias_method target, with_method
64
+
65
+ case
66
+ when public_method_defined?(without_method)
67
+ public target
68
+ when protected_method_defined?(without_method)
69
+ protected target
70
+ when private_method_defined?(without_method)
71
+ private target
72
+ end
73
+ end
74
+ end
75
+
76
+ def self.hook_method_source(prefix, method_name, key, random:, params:)
77
+ with_name, without_name = alias_names(method_name, random)
78
+ full_method_name = "#{prefix}#{method_name}"
79
+
80
+ param_source = params.take_while {|param| param[0] == :req }
81
+ .map.with_index {|pair, index| pair[1] || "__req__#{random}__#{index}" }
82
+ param_source.push("*rest_args__#{random}")
83
+ block_param = "block__#{random}"
84
+
85
+ RBS.logger.debug {
86
+ "Generating method definition: def #{with_name}(#{param_source.join(", ")}, &#{block_param}) ..."
87
+ }
88
+
89
+ [__LINE__ + 1, <<RUBY]
90
+ def #{with_name}(#{param_source.join(", ")}, &#{block_param})
91
+ args = [#{param_source.join(", ")}]
92
+ ::RBS.logger.debug { "#{full_method_name} with arguments: [" + args.map(&:inspect).join(", ") + "]" }
93
+
94
+ begin
95
+ return_from_call = false
96
+ block_calls = []
97
+
98
+ if block_given?
99
+ block_receives_block = #{block_param}.parameters.last&.yield_self {|type, _| type == :block }
100
+
101
+ wrapped_block = Object.new.instance_exec do
102
+ new_object = self
103
+
104
+ proc do |*block_args, &block2|
105
+ return_from_block = false
106
+
107
+ begin
108
+ block_result = if self.equal?(new_object)
109
+ if block_receives_block
110
+ #{block_param}.call(*block_args, &block2)
111
+ else
112
+ yield(*block_args)
113
+ end
114
+ else
115
+ # Detected that `self` inside `proc` is not equal to the `self` outside block (which is saved to `new_object`).
116
+ # This means that the block is called with `instance_exec` or `instance_eval`.
117
+ self.instance_exec(*block_args, &#{block_param})
118
+ end
119
+
120
+ return_from_block = true
121
+ ensure
122
+ exn = $!
123
+
124
+ case
125
+ when return_from_block
126
+ # Returned from yield
127
+ block_calls << ::RBS::Test::ArgumentsReturn.return(
128
+ arguments: block_args,
129
+ value: block_result
130
+ )
131
+ when exn
132
+ # Exception
133
+ block_calls << ::RBS::Test::ArgumentsReturn.exception(
134
+ arguments: block_args,
135
+ exception: exn
136
+ )
137
+ else
138
+ # break?
139
+ block_calls << ::RBS::Test::ArgumentsReturn.break(
140
+ arguments: block_args
141
+ )
142
+ end
143
+ end
144
+
145
+ block_result
146
+ end.ruby2_keywords
147
+ end
148
+
149
+ result = __send__(:"#{without_name}", *args, &wrapped_block)
150
+ else
151
+ result = __send__(:"#{without_name}", *args)
152
+ end
153
+ return_from_call = true
154
+ result
155
+ ensure
156
+ exn = $!
157
+
158
+ case
159
+ when return_from_call
160
+ ::RBS.logger.debug { "#{full_method_name} return with value: " + result.inspect }
161
+ method_call = ::RBS::Test::ArgumentsReturn.return(
162
+ arguments: args,
163
+ value: result
164
+ )
165
+ when exn
166
+ ::RBS.logger.debug { "#{full_method_name} exit with exception: " + exn.inspect }
167
+ method_call = ::RBS::Test::ArgumentsReturn.exception(
168
+ arguments: args,
169
+ exception: exn
170
+ )
171
+ else
172
+ ::RBS.logger.debug { "#{full_method_name} exit with jump" }
173
+ method_call = ::RBS::Test::ArgumentsReturn.break(arguments: args)
174
+ end
175
+
176
+ trace = ::RBS::Test::CallTrace.new(
177
+ method_name: #{method_name.inspect},
178
+ method_call: method_call,
179
+ block_calls: block_calls,
180
+ block_given: block_given?,
181
+ )
182
+
183
+ ::RBS::Test::Observer.notify(#{key.inspect}, self, trace)
184
+ end
185
+
186
+ result
187
+ end
188
+
189
+ ruby2_keywords :#{with_name}
190
+ RUBY
191
+ end
192
+
193
+ def self.hook_instance_method(klass, method, key:)
194
+ random = SecureRandom.hex(4)
195
+ params = klass.instance_method(method).parameters
196
+ line, source = hook_method_source("#{klass}#", method, key, random: random, params: params)
197
+
198
+ klass.module_eval(source, __FILE__, line)
199
+ setup_alias_method_chain klass, method, random: random
200
+ end
201
+
202
+ def self.hook_singleton_method(klass, method, key:)
203
+ random = SecureRandom.hex(4)
204
+ params = klass.method(method).parameters
205
+ line, source = hook_method_source("#{klass}.",method, key, random: random, params: params)
206
+
207
+ klass.singleton_class.module_eval(source, __FILE__, line)
208
+ setup_alias_method_chain klass.singleton_class, method, random: random
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Test
5
+ module Observer
6
+ @@observers = {}
7
+
8
+ class <<self
9
+ def notify(key, *args)
10
+ @@observers[key]&.call(*args)
11
+ end
12
+
13
+ def register(key, object = nil, &block)
14
+ @@observers[key] = object || block
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rbs"
4
+ require "rbs/test"
5
+ require "optparse"
6
+ require "shellwords"
7
+ require "rbs/cli"
8
+
9
+ include RBS::Test::SetupHelper
10
+
11
+ logger = Logger.new(STDERR)
12
+
13
+ begin
14
+ opts = Shellwords.shellsplit(ENV["RBS_TEST_OPT"] || "-I sig")
15
+ filter = ENV.fetch('RBS_TEST_TARGET', "").split(',').map! { |e| e.strip }
16
+ skips = (ENV['RBS_TEST_SKIP'] || '').split(',').map! { |e| e.strip }
17
+ RBS.logger_level = (ENV["RBS_TEST_LOGLEVEL"] || "info")
18
+ logger.level = RBS.logger_level
19
+ sample_size = get_sample_size(ENV['RBS_TEST_SAMPLE_SIZE'] || '')
20
+ double_class = to_double_class(ENV['RBS_TEST_DOUBLE_SUITE'])
21
+ unchecked_classes = (ENV['RBS_TEST_UNCHECKED_CLASSES'] || '').split(',').map! { |unchecked_class| unchecked_class.strip }.push(*double_class)
22
+ rescue InvalidSampleSizeError => exception
23
+ RBS.logger.error exception.message
24
+ exit 1
25
+ end
26
+
27
+ if filter.empty?
28
+ STDERR.puts "rbs/test/setup handles the following environment variables:"
29
+ STDERR.puts " [REQUIRED] RBS_TEST_TARGET: test target class name, `Foo::Bar,Foo::Baz` for each class or `Foo::*` for all classes under `Foo`"
30
+ STDERR.puts " [OPTIONAL] RBS_TEST_SKIP: skip testing classes"
31
+ STDERR.puts " [OPTIONAL] RBS_TEST_OPT: options for signatures (`-r` for libraries or `-I` for signatures)"
32
+ STDERR.puts " [OPTIONAL] RBS_TEST_LOGLEVEL: one of debug|info|warn|error|fatal (defaults to info)"
33
+ STDERR.puts " [OPTIONAL] RBS_TEST_SAMPLE_SIZE: sets the amount of values in a collection to be type-checked (Set to `ALL` to type check all the values)"
34
+ STDERR.puts " [OPTIONAL] RBS_TEST_DOUBLE_SUITE: sets the double suite in use (currently supported: minitest | rspec)"
35
+ STDERR.puts " [OPTIONAL] RBS_TEST_UNCHECKED_CLASSES: sets the classes that would not be checked"
36
+ exit 1
37
+ end
38
+
39
+ options = RBS::CLI::LibraryOptions.new()
40
+
41
+ OptionParser.new do |opts|
42
+ options.setup_library_options(opts)
43
+ end.parse!(opts)
44
+
45
+ loader = options.loader
46
+ env = RBS::Environment.from_loader(loader).resolve_type_names
47
+
48
+ def match(filter, name)
49
+ if filter.end_with?("*")
50
+ size = filter.size
51
+ name.start_with?(filter[0, size - 1]) || name == filter[0, size-3]
52
+ else
53
+ filter == name
54
+ end
55
+ end
56
+
57
+ def to_absolute_typename(type_name)
58
+ RBS::Factory.new().type_name(type_name).absolute!
59
+ end
60
+
61
+ tester = RBS::Test::Tester.new(env: env)
62
+
63
+ module_name = Module.instance_method(:name)
64
+
65
+ TracePoint.trace :end do |tp|
66
+ class_name = module_name.bind(tp.self).call&.yield_self {|name| to_absolute_typename name }
67
+
68
+ if class_name
69
+ if filter.any? {|f| match(to_absolute_typename(f).to_s, class_name.to_s) } && skips.none? {|f| match(f, class_name.to_s) }
70
+ if env.module_name?(class_name)
71
+ logger.info "Setting up hooks for #{class_name}"
72
+ tester.install!(tp.self, sample_size: sample_size, unchecked_classes: unchecked_classes)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ at_exit do
79
+ if $!.nil? || $!.is_a?(SystemExit) && $!.success?
80
+ if tester.targets.empty?
81
+ logger.debug { "No type checker was installed!" }
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Test
5
+ module SetupHelper
6
+ class InvalidSampleSizeError < StandardError
7
+ attr_reader :string
8
+
9
+ def initialize(string)
10
+ @string = string
11
+ super("Sample size should be a positive integer: `#{string}`")
12
+ end
13
+ end
14
+
15
+ DEFAULT_SAMPLE_SIZE = 100
16
+
17
+ def get_sample_size(string)
18
+ case string
19
+ when ""
20
+ DEFAULT_SAMPLE_SIZE
21
+ when 'ALL'
22
+ nil
23
+ else
24
+ int_size = string.to_i
25
+ raise InvalidSampleSizeError.new(string) unless int_size.positive?
26
+ int_size
27
+ end
28
+ end
29
+
30
+ def to_double_class(double_suite)
31
+ return nil unless double_suite
32
+
33
+ case double_suite.downcase.strip
34
+ when 'rspec'
35
+ [
36
+ '::RSpec::Mocks::Double',
37
+ '::RSpec::Mocks::InstanceVerifyingDouble',
38
+ '::RSpec::Mocks::ObjectVerifyingDouble',
39
+ '::RSpec::Mocks::ClassVerifyingDouble',
40
+ ]
41
+ when 'minitest'
42
+ ['::Minitest::Mock']
43
+ else
44
+ RBS.logger.warn "Unknown test suite - defaults to nil"
45
+ nil
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end