rbs 4.1.0.pre.2-java
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.
- checksums.yaml +7 -0
- data/.clang-format +75 -0
- data/.clangd +2 -0
- data/.github/dependabot.yml +24 -0
- data/.github/workflows/bundle-update.yml +63 -0
- data/.github/workflows/c-check.yml +61 -0
- data/.github/workflows/comments.yml +37 -0
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/jruby.yml +67 -0
- data/.github/workflows/milestone.yml +83 -0
- data/.github/workflows/ruby.yml +158 -0
- data/.github/workflows/rust.yml +184 -0
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +39 -0
- data/.github/workflows/wasm.yml +53 -0
- data/.github/workflows/windows.yml +49 -0
- data/.gitignore +38 -0
- data/.rubocop.yml +72 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +2292 -0
- data/COPYING +56 -0
- data/README.md +240 -0
- data/Rakefile +869 -0
- data/Steepfile +53 -0
- data/config.yml +913 -0
- data/core/array.rbs +4142 -0
- data/core/basic_object.rbs +376 -0
- data/core/binding.rbs +148 -0
- data/core/builtin.rbs +278 -0
- data/core/class.rbs +223 -0
- data/core/comparable.rbs +192 -0
- data/core/complex.rbs +812 -0
- data/core/constants.rbs +96 -0
- data/core/data.rbs +415 -0
- data/core/dir.rbs +993 -0
- data/core/encoding.rbs +1368 -0
- data/core/enumerable.rbs +2506 -0
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +705 -0
- data/core/env.rbs +6 -0
- data/core/errno.rbs +682 -0
- data/core/errors.rbs +789 -0
- data/core/exception.rbs +485 -0
- data/core/false_class.rbs +82 -0
- data/core/fiber.rbs +570 -0
- data/core/fiber_error.rbs +11 -0
- data/core/file.rbs +2045 -0
- data/core/file_constants.rbs +463 -0
- data/core/file_stat.rbs +534 -0
- data/core/file_test.rbs +331 -0
- data/core/float.rbs +1316 -0
- data/core/gc.rbs +788 -0
- data/core/global_variables.rbs +184 -0
- data/core/hash.rbs +2183 -0
- data/core/integer.rbs +1374 -0
- data/core/io/buffer.rbs +995 -0
- data/core/io/wait.rbs +48 -0
- data/core/io.rbs +3472 -0
- data/core/kernel.rbs +3172 -0
- data/core/marshal.rbs +207 -0
- data/core/match_data.rbs +637 -0
- data/core/math.rbs +770 -0
- data/core/method.rbs +422 -0
- data/core/module.rbs +1856 -0
- data/core/nil_class.rbs +210 -0
- data/core/numeric.rbs +832 -0
- data/core/object.rbs +108 -0
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +197 -0
- data/core/pathname.rbs +1322 -0
- data/core/proc.rbs +905 -0
- data/core/process.rbs +2316 -0
- data/core/ractor.rbs +924 -0
- data/core/random.rbs +255 -0
- data/core/range.rbs +1209 -0
- data/core/rational.rbs +502 -0
- data/core/rb_config.rbs +88 -0
- data/core/rbs/ops.rbs +154 -0
- data/core/rbs/unnamed/argf.rbs +1236 -0
- data/core/rbs/unnamed/env_class.rbs +1214 -0
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +186 -0
- data/core/refinement.rbs +59 -0
- data/core/regexp.rbs +1974 -0
- data/core/ruby.rbs +53 -0
- data/core/ruby_vm.rbs +809 -0
- data/core/rubygems/basic_specification.rbs +6 -0
- data/core/rubygems/config_file.rbs +38 -0
- data/core/rubygems/dependency_installer.rbs +6 -0
- data/core/rubygems/errors.rbs +109 -0
- data/core/rubygems/installer.rbs +15 -0
- data/core/rubygems/path_support.rbs +6 -0
- data/core/rubygems/platform.rbs +7 -0
- data/core/rubygems/request_set.rbs +49 -0
- data/core/rubygems/requirement.rbs +148 -0
- data/core/rubygems/rubygems.rbs +1105 -0
- data/core/rubygems/source_list.rbs +15 -0
- data/core/rubygems/specification.rbs +23 -0
- data/core/rubygems/stream_ui.rbs +5 -0
- data/core/rubygems/uninstaller.rbs +10 -0
- data/core/rubygems/version.rbs +293 -0
- data/core/set.rbs +751 -0
- data/core/signal.rbs +110 -0
- data/core/string.rbs +5532 -0
- data/core/struct.rbs +668 -0
- data/core/symbol.rbs +482 -0
- data/core/thread.rbs +1826 -0
- data/core/thread_group.rbs +79 -0
- data/core/time.rbs +1793 -0
- data/core/trace_point.rbs +483 -0
- data/core/true_class.rbs +98 -0
- data/core/unbound_method.rbs +337 -0
- data/core/warning.rbs +87 -0
- data/docs/CONTRIBUTING.md +107 -0
- data/docs/aliases.md +79 -0
- data/docs/architecture.md +110 -0
- data/docs/collection.md +192 -0
- data/docs/config.md +171 -0
- data/docs/data_and_struct.md +86 -0
- data/docs/encoding.md +56 -0
- data/docs/gem.md +56 -0
- data/docs/inline.md +634 -0
- data/docs/rbs_by_example.md +309 -0
- data/docs/repo.md +125 -0
- data/docs/rust.md +96 -0
- data/docs/sigs.md +167 -0
- data/docs/stdlib.md +147 -0
- data/docs/syntax.md +940 -0
- data/docs/tools.md +17 -0
- data/docs/type_fingerprint.md +21 -0
- data/docs/wasm_serialization.md +80 -0
- data/exe/rbs +7 -0
- data/ext/rbs_extension/ast_translation.c +1855 -0
- data/ext/rbs_extension/ast_translation.h +41 -0
- data/ext/rbs_extension/class_constants.c +187 -0
- data/ext/rbs_extension/class_constants.h +104 -0
- data/ext/rbs_extension/compat.h +10 -0
- data/ext/rbs_extension/extconf.rb +40 -0
- data/ext/rbs_extension/legacy_location.c +294 -0
- data/ext/rbs_extension/legacy_location.h +82 -0
- data/ext/rbs_extension/main.c +613 -0
- data/ext/rbs_extension/rbs_extension.h +16 -0
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/goodcheck.yml +91 -0
- data/include/rbs/ast.h +1047 -0
- data/include/rbs/defines.h +99 -0
- data/include/rbs/lexer.h +207 -0
- data/include/rbs/location.h +40 -0
- data/include/rbs/parser.h +153 -0
- data/include/rbs/serialize.h +39 -0
- data/include/rbs/string.h +47 -0
- data/include/rbs/util/rbs_allocator.h +59 -0
- data/include/rbs/util/rbs_assert.h +20 -0
- data/include/rbs/util/rbs_buffer.h +83 -0
- data/include/rbs/util/rbs_constant_pool.h +155 -0
- data/include/rbs/util/rbs_encoding.h +282 -0
- data/include/rbs/util/rbs_unescape.h +24 -0
- data/include/rbs.h +14 -0
- data/lib/rbs/ancestor_graph.rb +92 -0
- data/lib/rbs/annotate/annotations.rb +199 -0
- data/lib/rbs/annotate/formatter.rb +82 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
- data/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/lib/rbs/annotate.rb +8 -0
- data/lib/rbs/ast/annotation.rb +29 -0
- data/lib/rbs/ast/comment.rb +29 -0
- data/lib/rbs/ast/declarations.rb +472 -0
- data/lib/rbs/ast/directives.rb +49 -0
- data/lib/rbs/ast/members.rb +451 -0
- data/lib/rbs/ast/ruby/annotations.rb +451 -0
- data/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/lib/rbs/ast/ruby/declarations.rb +291 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +762 -0
- data/lib/rbs/ast/type_param.rb +235 -0
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +189 -0
- data/lib/rbs/builtin_names.rb +58 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +84 -0
- data/lib/rbs/cli/validate.rb +294 -0
- data/lib/rbs/cli.rb +1253 -0
- data/lib/rbs/collection/cleaner.rb +38 -0
- data/lib/rbs/collection/config/lockfile.rb +92 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
- data/lib/rbs/collection/config.rb +81 -0
- data/lib/rbs/collection/installer.rb +32 -0
- data/lib/rbs/collection/sources/base.rb +14 -0
- data/lib/rbs/collection/sources/git.rb +265 -0
- data/lib/rbs/collection/sources/local.rb +81 -0
- data/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/lib/rbs/collection/sources.rb +38 -0
- data/lib/rbs/collection.rb +16 -0
- data/lib/rbs/constant.rb +28 -0
- data/lib/rbs/definition.rb +415 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
- data/lib/rbs/definition_builder/method_builder.rb +295 -0
- data/lib/rbs/definition_builder.rb +1054 -0
- data/lib/rbs/diff.rb +131 -0
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +1028 -0
- data/lib/rbs/environment_loader.rb +167 -0
- data/lib/rbs/environment_walker.rb +155 -0
- data/lib/rbs/errors.rb +634 -0
- data/lib/rbs/factory.rb +18 -0
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +568 -0
- data/lib/rbs/location_aux.rb +170 -0
- data/lib/rbs/locator.rb +247 -0
- data/lib/rbs/method_type.rb +145 -0
- data/lib/rbs/namespace.rb +154 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +142 -0
- data/lib/rbs/prototype/helpers.rb +197 -0
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +816 -0
- data/lib/rbs/prototype/rbi.rb +625 -0
- data/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
- data/lib/rbs/prototype/runtime.rb +680 -0
- data/lib/rbs/repository.rb +127 -0
- data/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/lib/rbs/resolver/type_name_resolver.rb +167 -0
- data/lib/rbs/rewriter.rb +70 -0
- data/lib/rbs/sorter.rb +198 -0
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/substitution.rb +83 -0
- data/lib/rbs/subtractor.rb +204 -0
- data/lib/rbs/test/errors.rb +80 -0
- data/lib/rbs/test/guaranteed.rb +30 -0
- data/lib/rbs/test/hook.rb +212 -0
- data/lib/rbs/test/observer.rb +19 -0
- data/lib/rbs/test/setup.rb +84 -0
- data/lib/rbs/test/setup_helper.rb +50 -0
- data/lib/rbs/test/tester.rb +167 -0
- data/lib/rbs/test/type_check.rb +457 -0
- data/lib/rbs/test.rb +112 -0
- data/lib/rbs/type_alias_dependency.rb +100 -0
- data/lib/rbs/type_alias_regularity.rb +126 -0
- data/lib/rbs/type_name.rb +122 -0
- data/lib/rbs/types.rb +1604 -0
- data/lib/rbs/unit_test/convertibles.rb +177 -0
- data/lib/rbs/unit_test/spy.rb +138 -0
- data/lib/rbs/unit_test/type_assertions.rb +383 -0
- data/lib/rbs/unit_test/with_aliases.rb +145 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/validator.rb +186 -0
- data/lib/rbs/variance_calculator.rb +189 -0
- data/lib/rbs/vendorer.rb +71 -0
- data/lib/rbs/version.rb +5 -0
- data/lib/rbs/wasm/deserializer.rb +213 -0
- data/lib/rbs/wasm/jars/asm-analysis.jar +0 -0
- data/lib/rbs/wasm/jars/asm-commons.jar +0 -0
- data/lib/rbs/wasm/jars/asm-tree.jar +0 -0
- data/lib/rbs/wasm/jars/asm-util.jar +0 -0
- data/lib/rbs/wasm/jars/asm.jar +0 -0
- data/lib/rbs/wasm/jars/compiler.jar +0 -0
- data/lib/rbs/wasm/jars/log.jar +0 -0
- data/lib/rbs/wasm/jars/runtime.jar +0 -0
- data/lib/rbs/wasm/jars/wasi.jar +0 -0
- data/lib/rbs/wasm/jars/wasm.jar +0 -0
- data/lib/rbs/wasm/location.rb +61 -0
- data/lib/rbs/wasm/parser.rb +137 -0
- data/lib/rbs/wasm/rbs_parser.wasm +0 -0
- data/lib/rbs/wasm/runtime.rb +217 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs/writer.rb +424 -0
- data/lib/rbs.rb +117 -0
- data/lib/rdoc/discover.rb +20 -0
- data/lib/rdoc_plugin/parser.rb +163 -0
- data/rbs.gemspec +68 -0
- data/schema/annotation.json +14 -0
- data/schema/comment.json +26 -0
- data/schema/decls.json +326 -0
- data/schema/function.json +87 -0
- data/schema/location.json +56 -0
- data/schema/members.json +266 -0
- data/schema/methodType.json +50 -0
- data/schema/typeParam.json +52 -0
- data/schema/types.json +317 -0
- data/sig/ancestor_builder.rbs +163 -0
- data/sig/ancestor_graph.rbs +60 -0
- data/sig/annotate/annotations.rbs +102 -0
- data/sig/annotate/formatter.rbs +24 -0
- data/sig/annotate/rdoc_annotater.rbs +85 -0
- data/sig/annotate/rdoc_source.rbs +32 -0
- data/sig/annotation.rbs +27 -0
- data/sig/ast/ruby/annotations.rbs +470 -0
- data/sig/ast/ruby/comment_block.rbs +127 -0
- data/sig/ast/ruby/declarations.rbs +158 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +198 -0
- data/sig/buffer.rbs +108 -0
- data/sig/builtin_names.rbs +44 -0
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +15 -0
- data/sig/cli/validate.rbs +47 -0
- data/sig/cli.rbs +89 -0
- data/sig/collection/cleaner.rbs +13 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +68 -0
- data/sig/collection/config.rbs +46 -0
- data/sig/collection/installer.rbs +17 -0
- data/sig/collection/sources.rbs +214 -0
- data/sig/collection.rbs +4 -0
- data/sig/comment.rbs +26 -0
- data/sig/constant.rbs +21 -0
- data/sig/declarations.rbs +274 -0
- data/sig/definition.rbs +232 -0
- data/sig/definition_builder.rbs +181 -0
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +77 -0
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +286 -0
- data/sig/environment_loader.rbs +111 -0
- data/sig/environment_walker.rbs +65 -0
- data/sig/errors.rbs +408 -0
- data/sig/factory.rbs +5 -0
- data/sig/file_finder.rbs +28 -0
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +126 -0
- data/sig/location.rbs +135 -0
- data/sig/locator.rbs +56 -0
- data/sig/manifest.yaml +5 -0
- data/sig/members.rbs +258 -0
- data/sig/method_builder.rbs +89 -0
- data/sig/method_types.rbs +58 -0
- data/sig/namespace.rbs +161 -0
- data/sig/parser.rbs +164 -0
- data/sig/prototype/helpers.rbs +29 -0
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/prototype/rb.rbs +96 -0
- data/sig/prototype/rbi.rbs +75 -0
- data/sig/prototype/runtime.rbs +182 -0
- data/sig/rbs.rbs +21 -0
- data/sig/rdoc/rbs.rbs +67 -0
- data/sig/repository.rbs +85 -0
- data/sig/resolver/constant_resolver.rbs +92 -0
- data/sig/resolver/context.rbs +34 -0
- data/sig/resolver/type_name_resolver.rbs +61 -0
- data/sig/rewriter.rbs +45 -0
- data/sig/shims/bundler.rbs +38 -0
- data/sig/shims/enumerable.rbs +5 -0
- data/sig/shims/rubygems.rbs +19 -0
- data/sig/sorter.rbs +41 -0
- data/sig/source.rbs +48 -0
- data/sig/substitution.rbs +48 -0
- data/sig/subtractor.rbs +37 -0
- data/sig/test/errors.rbs +52 -0
- data/sig/test/guranteed.rbs +9 -0
- data/sig/test/type_check.rbs +19 -0
- data/sig/test.rbs +82 -0
- data/sig/type_alias_dependency.rbs +53 -0
- data/sig/type_alias_regularity.rbs +98 -0
- data/sig/type_param.rbs +115 -0
- data/sig/typename.rbs +89 -0
- data/sig/types.rbs +578 -0
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +22 -0
- data/sig/unit_test/type_assertions.rbs +211 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/sig/use_map.rbs +35 -0
- data/sig/util.rbs +9 -0
- data/sig/validator.rbs +63 -0
- data/sig/variance_calculator.rbs +87 -0
- data/sig/vendorer.rbs +51 -0
- data/sig/version.rbs +3 -0
- data/sig/visitor.rbs +47 -0
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/sig/writer.rbs +127 -0
- data/src/ast.c +1628 -0
- data/src/lexer.c +3217 -0
- data/src/lexer.re +155 -0
- data/src/lexstate.c +217 -0
- data/src/location.c +31 -0
- data/src/parser.c +4255 -0
- data/src/serialize.c +958 -0
- data/src/string.c +41 -0
- data/src/util/rbs_allocator.c +162 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +268 -0
- data/src/util/rbs_encoding.c +21308 -0
- data/src/util/rbs_unescape.c +167 -0
- data/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/stdlib/abbrev/0/array.rbs +26 -0
- data/stdlib/base64/0/base64.rbs +355 -0
- data/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
- data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/cgi/0/core.rbs +911 -0
- data/stdlib/cgi/0/manifest.yaml +4 -0
- data/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/stdlib/coverage/0/coverage.rbs +266 -0
- data/stdlib/csv/0/csv.rbs +3776 -0
- data/stdlib/csv/0/manifest.yaml +3 -0
- data/stdlib/date/0/date.rbs +1598 -0
- data/stdlib/date/0/date_time.rbs +617 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/dbm/0/dbm.rbs +421 -0
- data/stdlib/delegate/0/delegator.rbs +187 -0
- data/stdlib/delegate/0/kernel.rbs +47 -0
- data/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
- data/stdlib/digest/0/digest.rbs +687 -0
- data/stdlib/erb/0/erb.rbs +933 -0
- data/stdlib/etc/0/etc.rbs +884 -0
- data/stdlib/fileutils/0/fileutils.rbs +1753 -0
- data/stdlib/find/0/find.rbs +49 -0
- data/stdlib/forwardable/0/forwardable.rbs +271 -0
- data/stdlib/io-console/0/io-console.rbs +414 -0
- data/stdlib/ipaddr/0/ipaddr.rbs +436 -0
- data/stdlib/json/0/json.rbs +1963 -0
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/logger/0/formatter.rbs +45 -0
- data/stdlib/logger/0/log_device.rbs +100 -0
- data/stdlib/logger/0/logger.rbs +796 -0
- data/stdlib/logger/0/manifest.yaml +2 -0
- data/stdlib/logger/0/period.rbs +17 -0
- data/stdlib/logger/0/severity.rbs +34 -0
- data/stdlib/minitest/0/kernel.rbs +42 -0
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/stdlib/minitest/0/minitest.rbs +115 -0
- data/stdlib/monitor/0/monitor.rbs +363 -0
- data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/stdlib/net-http/0/manifest.yaml +3 -0
- data/stdlib/net-http/0/net-http.rbs +5580 -0
- data/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/stdlib/nkf/0/nkf.rbs +402 -0
- data/stdlib/objspace/0/objspace.rbs +470 -0
- data/stdlib/observable/0/observable.rbs +217 -0
- data/stdlib/open-uri/0/manifest.yaml +4 -0
- data/stdlib/open-uri/0/open-uri.rbs +433 -0
- data/stdlib/open3/0/open3.rbs +606 -0
- data/stdlib/openssl/0/manifest.yaml +3 -0
- data/stdlib/openssl/0/openssl.rbs +12231 -0
- data/stdlib/optparse/0/optparse.rbs +1734 -0
- data/stdlib/pathname/0/pathname.rbs +36 -0
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +301 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/stdlib/pstore/0/pstore.rbs +608 -0
- data/stdlib/psych/0/core_ext.rbs +12 -0
- data/stdlib/psych/0/dbm.rbs +237 -0
- data/stdlib/psych/0/manifest.yaml +3 -0
- data/stdlib/psych/0/psych.rbs +455 -0
- data/stdlib/psych/0/store.rbs +57 -0
- data/stdlib/pty/0/pty.rbs +240 -0
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +52 -0
- data/stdlib/rdoc/0/comment.rbs +61 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +393 -0
- data/stdlib/rdoc/0/ri.rbs +17 -0
- data/stdlib/rdoc/0/store.rbs +48 -0
- data/stdlib/rdoc/0/top_level.rbs +97 -0
- data/stdlib/resolv/0/manifest.yaml +3 -0
- data/stdlib/resolv/0/resolv.rbs +1787 -0
- data/stdlib/ripper/0/ripper.rbs +1654 -0
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +49 -0
- data/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/stdlib/singleton/0/singleton.rbs +134 -0
- data/stdlib/socket/0/addrinfo.rbs +666 -0
- data/stdlib/socket/0/basic_socket.rbs +590 -0
- data/stdlib/socket/0/constants.rbs +2295 -0
- data/stdlib/socket/0/ip_socket.rbs +94 -0
- data/stdlib/socket/0/socket.rbs +4170 -0
- data/stdlib/socket/0/socket_error.rbs +5 -0
- data/stdlib/socket/0/tcp_server.rbs +192 -0
- data/stdlib/socket/0/tcp_socket.rbs +87 -0
- data/stdlib/socket/0/udp_socket.rbs +133 -0
- data/stdlib/socket/0/unix_server.rbs +169 -0
- data/stdlib/socket/0/unix_socket.rbs +172 -0
- data/stdlib/stringio/0/stringio.rbs +1681 -0
- data/stdlib/strscan/0/string_scanner.rbs +1648 -0
- data/stdlib/tempfile/0/tempfile.rbs +483 -0
- data/stdlib/time/0/time.rbs +434 -0
- data/stdlib/timeout/0/timeout.rbs +137 -0
- data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/stdlib/tsort/0/cyclic.rbs +8 -0
- data/stdlib/tsort/0/interfaces.rbs +20 -0
- data/stdlib/tsort/0/tsort.rbs +410 -0
- data/stdlib/uri/0/common.rbs +621 -0
- data/stdlib/uri/0/file.rbs +118 -0
- data/stdlib/uri/0/ftp.rbs +13 -0
- data/stdlib/uri/0/generic.rbs +1116 -0
- data/stdlib/uri/0/http.rbs +104 -0
- data/stdlib/uri/0/https.rbs +14 -0
- data/stdlib/uri/0/ldap.rbs +230 -0
- data/stdlib/uri/0/ldaps.rbs +14 -0
- data/stdlib/uri/0/mailto.rbs +92 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/stdlib/uri/0/ws.rbs +13 -0
- data/stdlib/uri/0/wss.rbs +9 -0
- data/stdlib/yaml/0/manifest.yaml +2 -0
- data/stdlib/yaml/0/yaml.rbs +1 -0
- data/stdlib/zlib/0/buf_error.rbs +10 -0
- data/stdlib/zlib/0/data_error.rbs +10 -0
- data/stdlib/zlib/0/deflate.rbs +211 -0
- data/stdlib/zlib/0/error.rbs +20 -0
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/stdlib/zlib/0/gzip_writer.rbs +168 -0
- data/stdlib/zlib/0/inflate.rbs +180 -0
- data/stdlib/zlib/0/mem_error.rbs +10 -0
- data/stdlib/zlib/0/need_dict.rbs +13 -0
- data/stdlib/zlib/0/stream_end.rbs +11 -0
- data/stdlib/zlib/0/stream_error.rbs +11 -0
- data/stdlib/zlib/0/version_error.rbs +11 -0
- data/stdlib/zlib/0/zlib.rbs +449 -0
- data/stdlib/zlib/0/zstream.rbs +201 -0
- data/wasm/README.md +59 -0
- data/wasm/rbs_wasm.c +411 -0
- metadata +660 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# RBS By Example
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
The purpose of this doc is to teach you how to write RBS signatures by using the standard library's methods as a guide.
|
|
6
|
+
|
|
7
|
+
## Examples
|
|
8
|
+
|
|
9
|
+
In each example, the first snippet is for *Ruby* and the second one is for *RBS*.
|
|
10
|
+
|
|
11
|
+
### Zero argument methods
|
|
12
|
+
|
|
13
|
+
**Example:** `String#empty?`
|
|
14
|
+
|
|
15
|
+
```ruby
|
|
16
|
+
"".empty?
|
|
17
|
+
# => true
|
|
18
|
+
"hello".empty?
|
|
19
|
+
# => false
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```rbs
|
|
23
|
+
class String
|
|
24
|
+
def empty?: () -> bool
|
|
25
|
+
end
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`String`'s `#empty` method takes no parameters, and returns a boolean value
|
|
29
|
+
|
|
30
|
+
### Single argument methods
|
|
31
|
+
|
|
32
|
+
**Example:** `String#include?`
|
|
33
|
+
|
|
34
|
+
```ruby
|
|
35
|
+
"homeowner".include?("house")
|
|
36
|
+
# => false
|
|
37
|
+
"homeowner".include?("meow")
|
|
38
|
+
# => true
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```rbs
|
|
42
|
+
class String
|
|
43
|
+
def include?: (String) -> bool
|
|
44
|
+
end
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`String`'s `include?` method takes one argument, a `String`, and returns a
|
|
48
|
+
boolean value
|
|
49
|
+
|
|
50
|
+
### Variable argument methods
|
|
51
|
+
|
|
52
|
+
**Example:** `String#end_with?`
|
|
53
|
+
|
|
54
|
+
```ruby
|
|
55
|
+
"hello?".end_with?("!")
|
|
56
|
+
# => false
|
|
57
|
+
"hello?".end_with?("?")
|
|
58
|
+
# => true
|
|
59
|
+
"hello?".end_with?("?", "!")
|
|
60
|
+
# => true
|
|
61
|
+
"hello?".end_with?(".", "!")
|
|
62
|
+
# => false
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```rbs
|
|
66
|
+
class String
|
|
67
|
+
def end_with?: (*String) -> bool
|
|
68
|
+
end
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`String`'s `#end_with?` method takes any number of `String` arguments, and
|
|
72
|
+
returns a boolean value.
|
|
73
|
+
|
|
74
|
+
### Optional positional arguments
|
|
75
|
+
|
|
76
|
+
**Example:** `String#ljust`
|
|
77
|
+
|
|
78
|
+
```ruby
|
|
79
|
+
"hello".ljust(4)
|
|
80
|
+
#=> "hello"
|
|
81
|
+
"hello".ljust(20)
|
|
82
|
+
#=> "hello "
|
|
83
|
+
"hello".ljust(20, '1234')
|
|
84
|
+
#=> "hello123412341234123"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```rbs
|
|
88
|
+
class String
|
|
89
|
+
def ljust: (Integer, ?String) -> String
|
|
90
|
+
end
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`String`'s `ljust` takes one `Integer` argument, and an optional `String` argument, indicated by the the `?` prefix marker. It returns a `String`.
|
|
94
|
+
|
|
95
|
+
### Multiple signatures for a single method
|
|
96
|
+
|
|
97
|
+
**Example:** `Array#*`
|
|
98
|
+
|
|
99
|
+
```ruby
|
|
100
|
+
[1, 2, 3] * ","
|
|
101
|
+
# => "1,2,3"
|
|
102
|
+
[1, 2, 3] * 2
|
|
103
|
+
# => [1, 2, 3, 1, 2, 3]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
*Note:* Some of the signatures after this point include type variables (e.g. `Elem`, `T`).
|
|
107
|
+
For now, it's safe to ignore them, but they're included for completeness.
|
|
108
|
+
|
|
109
|
+
```rbs
|
|
110
|
+
class Array[E]
|
|
111
|
+
def *: (String) -> String
|
|
112
|
+
| (Integer) -> Array[E]
|
|
113
|
+
end
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`Array`'s `*` method, when given a `String` returns a `String`. When given an
|
|
117
|
+
`Integer`, it returns an `Array` of the same contained type `E` (in our example case, `E` corresponds to `Integer`).
|
|
118
|
+
|
|
119
|
+
### Union types
|
|
120
|
+
|
|
121
|
+
**Example:** `String#<<`
|
|
122
|
+
|
|
123
|
+
```ruby
|
|
124
|
+
a = "hello "
|
|
125
|
+
a << "world"
|
|
126
|
+
#=> "hello world"
|
|
127
|
+
a << 33
|
|
128
|
+
#=> "hello world!"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```rbs
|
|
132
|
+
class String
|
|
133
|
+
def <<: (String | Integer) -> String
|
|
134
|
+
end
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
`String`'s `<<` operator takes either a `String` or an `Integer`, and returns a `String`.
|
|
138
|
+
|
|
139
|
+
### Nilable types
|
|
140
|
+
|
|
141
|
+
```ruby
|
|
142
|
+
[1, 2, 3].first
|
|
143
|
+
# => 1
|
|
144
|
+
[].first
|
|
145
|
+
# => nil
|
|
146
|
+
[1, 2, 3].first(2)
|
|
147
|
+
# => [1, 2]
|
|
148
|
+
[].first(2)
|
|
149
|
+
# => []
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
```rbs
|
|
153
|
+
class Enumerable[E]
|
|
154
|
+
def first: () -> E?
|
|
155
|
+
| (Integer) -> Array[E]
|
|
156
|
+
end
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`Enumerable`'s `#first` method has two different signatures.
|
|
160
|
+
|
|
161
|
+
When called with no arguments, the return value will either be an instance of
|
|
162
|
+
whatever type is contained in the enumerable, or `nil`. We represent that with
|
|
163
|
+
the type variable `E`, and the `?` suffix nilable marker.
|
|
164
|
+
|
|
165
|
+
When called with an `Integer` positional argument, the return value will be an
|
|
166
|
+
`Array` of whatever type is contained.
|
|
167
|
+
|
|
168
|
+
The `?` syntax is a convenient shorthand for a union with nil. An equivalent union type would be `(E | nil)`.
|
|
169
|
+
|
|
170
|
+
### Keyword Arguments
|
|
171
|
+
|
|
172
|
+
**Example**: `String#lines`
|
|
173
|
+
|
|
174
|
+
```ruby
|
|
175
|
+
"hello\nworld\n".lines
|
|
176
|
+
# => ["hello\n", "world\n"]
|
|
177
|
+
"hello world".lines(' ')
|
|
178
|
+
# => ["hello ", " ", "world"]
|
|
179
|
+
"hello\nworld\n".lines(chomp: true)
|
|
180
|
+
# => ["hello", "world"]
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```rbs
|
|
184
|
+
class String
|
|
185
|
+
def lines: (?String, ?chomp: bool) -> Array[String]
|
|
186
|
+
end
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
`String`'s `#lines` method take two arguments: one optional String argument, and another optional boolean keyword argument. It returns an `Array` of `String`s.
|
|
190
|
+
|
|
191
|
+
Keyword arguments are declared similar to in ruby, with the keyword immediately followed by a colon. Keyword arguments that are optional are indicated as optional using the same `?` prefix as positional arguments.
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
### Class methods
|
|
195
|
+
|
|
196
|
+
**Example**: `Time.now`
|
|
197
|
+
|
|
198
|
+
```ruby
|
|
199
|
+
Time.now
|
|
200
|
+
# => 2009-06-24 12:39:54 +0900
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
```rbs
|
|
204
|
+
class Time
|
|
205
|
+
def self.now: () -> Time
|
|
206
|
+
end
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`Time`'s class method `now` takes no arguments, and returns an instance of the
|
|
210
|
+
`Time` class.
|
|
211
|
+
|
|
212
|
+
### Block Arguments
|
|
213
|
+
|
|
214
|
+
**Example**: `Array#filter`
|
|
215
|
+
|
|
216
|
+
```ruby
|
|
217
|
+
[1,2,3,4,5].filter {|num| num.even? }
|
|
218
|
+
# => [2, 4]
|
|
219
|
+
%w[ a b c d e f ].filter {|v| v =~ /[aeiou]/ }
|
|
220
|
+
# => ["a", "e"]
|
|
221
|
+
[1,2,3,4,5].filter
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
```rbs
|
|
225
|
+
class Array[E]
|
|
226
|
+
def filter: () { (E) -> boolish } -> ::Array[E]
|
|
227
|
+
| () -> ::Enumerator[E, ::Array[E]]
|
|
228
|
+
end
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
`Array`'s `#filter` method, when called with no arguments returns an Enumerator.
|
|
232
|
+
|
|
233
|
+
When called with a block, the method returns an `Array` of whatever type the original contained. The block will take one argument, of the type of the contained value, and the block will return a truthy or falsy value.
|
|
234
|
+
|
|
235
|
+
`boolish` is a special keyword for any type that will be treated as if it were a `bool`.
|
|
236
|
+
|
|
237
|
+
### Type Variables
|
|
238
|
+
|
|
239
|
+
**Example**: `Hash`, `Hash#keys`
|
|
240
|
+
|
|
241
|
+
```ruby
|
|
242
|
+
h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
|
|
243
|
+
h.keys
|
|
244
|
+
# => ["a", "b", "c", "d"]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
```rbs
|
|
248
|
+
class Hash[K, V]
|
|
249
|
+
def keys: () -> Array[K]
|
|
250
|
+
end
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Generic types in RBS are parameterized at declaration time. These type variables are then available throughout all the methods contained in the `class` block.
|
|
254
|
+
|
|
255
|
+
`Hash`'s `#keys` method takes no arguments, and returns an `Array` of the first type parameter. In the above example, `a` is of concrete type `Hash[String, Integer]`, so `#keys` returns an `Array` for `String`.
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
```ruby
|
|
259
|
+
a = [ "a", "b", "c", "d" ]
|
|
260
|
+
a.collect {|x| x + "!"}
|
|
261
|
+
# => ["a!", "b!", "c!", "d!"]
|
|
262
|
+
a.collect.with_index {|x, i| x * i}
|
|
263
|
+
# => ["", "b", "cc", "ddd"]
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
```rbs
|
|
267
|
+
class Array[E]
|
|
268
|
+
def collect: [U] () { (E) -> U } -> Array[U]
|
|
269
|
+
| () -> Enumerator[E, Array[untyped]]
|
|
270
|
+
end
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Type variables can also be introduced in methods. Here, in `Array`'s `#collect` method, we introduce a type variable `U`. The block passed to `#collect` will receive a parameter of type `E`, and return a value of type `U`. Then `#collect` will return an `Array` of type `U`.
|
|
274
|
+
|
|
275
|
+
In this example, the method receives its signature from the inferred return type of the passed block. When then block is absent, as in when the method returns an `Enumerator`, we can't infer the type, and so the return value of the enumerator can only be described as `Array[untyped]`.
|
|
276
|
+
|
|
277
|
+
### Tuples
|
|
278
|
+
|
|
279
|
+
**Examples**: `Enumerable#partition`, `Enumerable#to_h`
|
|
280
|
+
|
|
281
|
+
```ruby
|
|
282
|
+
(1..6).partition { |v| v.even? }
|
|
283
|
+
# => [[2, 4, 6], [1, 3, 5]]
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
```rbs
|
|
287
|
+
class Enumerable[E]
|
|
288
|
+
def partition: () { (E) -> boolish } -> [Array[E], Array[E]]
|
|
289
|
+
| () -> ::Enumerator[E, [Array[E], Array[E] ]]
|
|
290
|
+
end
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
`Enumerable`'s `partition` method, when given a block, returns a 2-item tuple of `Array`s containing the original type of the `Enumerable`.
|
|
294
|
+
|
|
295
|
+
Tuples can be of any size, and they can have mixed types.
|
|
296
|
+
|
|
297
|
+
```ruby
|
|
298
|
+
(1..5).to_h {|x| [x, x ** 2]}
|
|
299
|
+
# => {1=>1, 2=>4, 3=>9, 4=>16, 5=>25}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
```rbs
|
|
303
|
+
class Enumerable[E]
|
|
304
|
+
def to_h: () -> ::Hash[untyped, untyped]
|
|
305
|
+
| [T, U] () { (E) -> [T, U] } -> ::Hash[T, U]
|
|
306
|
+
end
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
`Enumerable`'s `to_h` method, when given a block that returns a 2-item tuple, returns a `Hash` with keys the type of the first position in the tuple, and values the type of the second position in the tuple.
|
data/docs/repo.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Third-party RBS Repository
|
|
2
|
+
|
|
3
|
+
This is the spec of the directory structure for RBS files of gems without RBS files. It allows distributing RBS type definitions of gems separately from the `.gemspec` files so that the Ruby developers can type check their Ruby programs even if the dependent gems don't ship with their type definitions.
|
|
4
|
+
|
|
5
|
+
The spec includes:
|
|
6
|
+
|
|
7
|
+
* The directory structure, and
|
|
8
|
+
* The RBS file lookup rules given _repository root_, gem name, and version.
|
|
9
|
+
|
|
10
|
+
## Motivating Example
|
|
11
|
+
|
|
12
|
+
Assume there is a rubygem called `bug-free-doodle` and our application depends on the library. We are trying to type check our application and we need RBS files of `bug-free-doodle`. The problem is that the `bug-free-doodle` gem doesn't ship with RBS files. The type checkers cannot resolve the type of constant `Bug::Free::Doodle` and its methods.
|
|
13
|
+
|
|
14
|
+
One workaround is to add type definitions of the library in the application signatures.
|
|
15
|
+
|
|
16
|
+
```rbs
|
|
17
|
+
# sig/polyfill/bug-free-doodle.rbs
|
|
18
|
+
|
|
19
|
+
module Bug
|
|
20
|
+
module Free
|
|
21
|
+
class Doodle
|
|
22
|
+
attr_reader name: Symbol
|
|
23
|
+
attr_reader strokes: Array[Stroke]
|
|
24
|
+
|
|
25
|
+
def initialize: (name: Symbol) -> void
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
You may want to distribute the RBS file to anyone who needs it. Which version do we support? Testing it? How to load the RBS files? This is the spec you need!
|
|
32
|
+
|
|
33
|
+
### Third-party RBS repository
|
|
34
|
+
|
|
35
|
+
Make a directory (or you may want to `git init`) to put your _third party RBSs_.
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
$ make my-rbs # Or you may want a git repository: git init my-rbs
|
|
39
|
+
$ cd my-rbs
|
|
40
|
+
$ mkdir gems
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
We call the `my-rbs/gems` directory _repository root_. Note that it is different from the root of the git repository. The RBS repository root is the directory that contains directories of gem names.
|
|
44
|
+
|
|
45
|
+
Make a directory for the gem and the version.
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
$ mkdir gems/bug-free-doodle
|
|
49
|
+
$ mkdir gems/bug-free-doodle/1.2.3
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
And copy the RBS file in it.
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
$ cp your-app/sig/polyfill/bug-free-doodle.rbs gems/bug-free-doodle/1.2.3
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Reading Third-party RBS
|
|
59
|
+
|
|
60
|
+
`rbs` command accepts `--repo` option which points to a _repository root_. You can specify `-r` option to let the command know which gems you want to load.
|
|
61
|
+
|
|
62
|
+
In this case, the _repository root_ is `./gems` and we are trying to load `bug-free-doodle` gem.
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
$ rbs --repo=gems -r bug-free-doodle paths
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The `-r` option also accepts gem name with version.
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
$ rbs --repo=gems -r bug-free-doodle:1.2.3 paths
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Note that the version resolution is not compatible with semantic versioning. It is optimistic. It resolves to some version unless no version for the gem is available.
|
|
75
|
+
|
|
76
|
+
## Directory Structure
|
|
77
|
+
|
|
78
|
+
There are directories for each gem under _repository root_. We also have directories for each version of each gem.
|
|
79
|
+
|
|
80
|
+
- $REPO_ROOT/bug-free-doodle/0.2.0
|
|
81
|
+
- $REPO_ROOT/bug-free-doodle/1.0
|
|
82
|
+
- $REPO_ROOT/bug-free-doodle/1.2.3
|
|
83
|
+
- $REPO_ROOT/bug-free-doodle/2.0
|
|
84
|
+
|
|
85
|
+
Note that we assume that we have git repositories for each RBS repository, and we have a directory at the root of the git repository for _repository root_.
|
|
86
|
+
|
|
87
|
+
So the git repository structure would be something like the following:
|
|
88
|
+
|
|
89
|
+
- /Gemfile
|
|
90
|
+
- /Gemfile.lock
|
|
91
|
+
- /README.md
|
|
92
|
+
- /LICENSE
|
|
93
|
+
- /gems/bug-free-doodle/1.2.3/bug-free-doodle.rbs
|
|
94
|
+
|
|
95
|
+
You should have `Gemfile` and `Gemfile.lock` to manage dependencies, `README.md` and `LICENSE` to documentation, and `gems` directory as _repository root_.
|
|
96
|
+
|
|
97
|
+
(We call _repository root_ `gems` in this doc, but the name can be anything you like.)
|
|
98
|
+
|
|
99
|
+
## Version Resolution
|
|
100
|
+
|
|
101
|
+
The version resolution in RBS is optimistic. We don't block loading RBS files for _incompatible_ version in terms of semantic versioning.
|
|
102
|
+
|
|
103
|
+
It tries to resolve version _n_ as follows:
|
|
104
|
+
|
|
105
|
+
1. It resolves to _m_ such that _m_ is the latest version available and _m_ <= _n_ holds.
|
|
106
|
+
2. It resolves to the oldest version when rule 1 cannot find version _m_.
|
|
107
|
+
|
|
108
|
+
If two versions, `0.4.0`, `1.0.0` are available for a gem:
|
|
109
|
+
|
|
110
|
+
| Requested version | Resolved version |
|
|
111
|
+
|-------------------|------------------|
|
|
112
|
+
| `0.3.0` | `0.4.0` (Rule 2) |
|
|
113
|
+
| `0.4.0` | `0.4.0` |
|
|
114
|
+
| `0.5.0` | `0.4.0` |
|
|
115
|
+
| `1.0.0` | `1.0.0` |
|
|
116
|
+
| `2.0.0` | `1.0.0` |
|
|
117
|
+
|
|
118
|
+
This is not compatible with the concept of semantic versioning. We don't want to block users to load RBS even for incompatible versions of gems.
|
|
119
|
+
|
|
120
|
+
We believe this makes more sense because:
|
|
121
|
+
|
|
122
|
+
* Using (potentially) incompatible type definitions are better than no type definition.
|
|
123
|
+
* Users can stop loading RBS if incompatibility causes an issue and falling back to hand-written polyfills.
|
|
124
|
+
|
|
125
|
+
|
data/docs/rust.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Rust Crates
|
|
2
|
+
|
|
3
|
+
RBS provides two Rust crates:
|
|
4
|
+
|
|
5
|
+
- **`ruby-rbs-sys`** -- Low-level FFI bindings to the RBS C parser
|
|
6
|
+
- **`ruby-rbs`** -- High-level safe Rust API for parsing RBS signatures
|
|
7
|
+
|
|
8
|
+
Both crates are published to [crates.io](https://crates.io/) and are developed within the `rust/` directory of this repository.
|
|
9
|
+
|
|
10
|
+
## Vendored RBS Source
|
|
11
|
+
|
|
12
|
+
The Rust crates depend on the RBS C parser source code (`include/`, `src/`) and configuration (`config.yml`) from this repository. These files are vendored into each crate's `vendor/rbs/` directory, which is managed by Rake tasks and not tracked by git.
|
|
13
|
+
|
|
14
|
+
The file `rust/rbs_version` records which version of RBS the Rust crates are pinned to.
|
|
15
|
+
|
|
16
|
+
## Setup
|
|
17
|
+
|
|
18
|
+
After cloning the repository, set up the vendored source before building the Rust crates:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
rake rust:rbs:sync # Uses the pinned version from rust/rbs_version
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Then build and test:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd rust
|
|
28
|
+
cargo test
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Rake Tasks
|
|
32
|
+
|
|
33
|
+
### `rake rust:rbs:sync`
|
|
34
|
+
|
|
35
|
+
Copies the source files from the pinned version into each crate's `vendor/rbs/`. The copied files are made read-only to prevent accidental edits.
|
|
36
|
+
|
|
37
|
+
### `rake rust:rbs:pin[VERSION]`
|
|
38
|
+
|
|
39
|
+
Records a git tag in `rust/rbs_version`. For example:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
rake rust:rbs:pin[v4.0.3]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### `rake rust:publish:ruby-rbs-sys` / `rake rust:publish:ruby-rbs`
|
|
46
|
+
|
|
47
|
+
Publishes each crate to crates.io individually. Each task:
|
|
48
|
+
|
|
49
|
+
1. Verifies `rust/rbs_version` is set
|
|
50
|
+
2. Verifies vendor directories contain real files (not symlinks)
|
|
51
|
+
3. Verifies the git working tree is clean
|
|
52
|
+
4. Creates a release branch and commits the vendor files
|
|
53
|
+
5. Runs a dry-run to check packaging
|
|
54
|
+
6. Publishes the crate
|
|
55
|
+
|
|
56
|
+
Set `RBS_RUST_PUBLISH_DRY_RUN=1` to only run the dry-run step and skip the actual publish to crates.io. This is used in CI to verify that the crates can be packaged correctly.
|
|
57
|
+
|
|
58
|
+
### `rake rust:rbs:symlink`
|
|
59
|
+
|
|
60
|
+
If your development needs unreleased version of RBS source code, use `rake rust:rbs:symlink` to set up symlinks in vendor directories to refer the worktree source code. Changes to the C parser source are immediately reflected in Rust builds.
|
|
61
|
+
|
|
62
|
+
## Publishing Workflow
|
|
63
|
+
|
|
64
|
+
1. Pin the RBS version to release against:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
rake rust:rbs:pin[v4.0.3]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
2. Sync the vendored source:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
rake rust:rbs:sync
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
3. Update crate versions in `rust/ruby-rbs-sys/Cargo.toml` and `rust/ruby-rbs/Cargo.toml`.
|
|
77
|
+
|
|
78
|
+
4. Build and test:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
cd rust && cargo test
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
5. Commit the version changes and `rust/rbs_version`:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
git add rust/rbs_version rust/ruby-rbs-sys/Cargo.toml rust/ruby-rbs/Cargo.toml
|
|
88
|
+
git commit -m "Bump Rust crate versions"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
6. Publish each crate:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
rake rust:publish:ruby-rbs-sys
|
|
95
|
+
rake rust:publish:ruby-rbs
|
|
96
|
+
```
|
data/docs/sigs.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Writing Signatures Guide
|
|
2
|
+
|
|
3
|
+
You can write the signature of your applications and libraries.
|
|
4
|
+
Signature of your Ruby program would help:
|
|
5
|
+
|
|
6
|
+
1. Understanding the code structure
|
|
7
|
+
2. Finding APIs
|
|
8
|
+
|
|
9
|
+
And if you ship your gem with signature, the gem users can type check their applications!
|
|
10
|
+
|
|
11
|
+
## Writing signatures
|
|
12
|
+
|
|
13
|
+
You first need to write your program's signature.
|
|
14
|
+
See [syntax guide](syntax.md).
|
|
15
|
+
|
|
16
|
+
## Testing signatures
|
|
17
|
+
|
|
18
|
+
When you finish writing signature, you may want to test the signature.
|
|
19
|
+
rbs provides a feature to test your signature.
|
|
20
|
+
|
|
21
|
+
```console
|
|
22
|
+
$ RBS_TEST_TARGET='Foo::*' bundle exec ruby -r rbs/test/setup test/foo_test.rb
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The test installs instrumentations to spy the method calls and check if arguments/return values are correct with respect to the type of the method in signature.
|
|
26
|
+
If errors are reported by the test, you will fix the signature.
|
|
27
|
+
You will be sure that you ship a correct signature finally.
|
|
28
|
+
|
|
29
|
+
The instrumentations are implemented using `Module#prepend`.
|
|
30
|
+
It defines a module with same name of methods, which asserts the type of arguments/return values and calls `super`.
|
|
31
|
+
|
|
32
|
+
## Type errors
|
|
33
|
+
|
|
34
|
+
If the test detects type errors, it will print error messages.
|
|
35
|
+
|
|
36
|
+
### ArgumentTypeError, BlockArgumentTypeError
|
|
37
|
+
|
|
38
|
+
The message means there is an unexpected type of argument or block argument.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
ERROR -- : [Kaigi::Speaker.new] ArgumentTypeError: expected `::String` (email) but given `:"matsumoto@soutaro.com"`
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### ArgumentError, BlockArgumentError
|
|
45
|
+
|
|
46
|
+
The message means there is an unexpected argument or missing argument.
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
[Kaigi::Speaker.new] ArgumentError: expected method type (size: ::Symbol, email: ::String, name: ::String) -> ::Kaigi::Speaker
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### ReturnTypeError, BlockReturnTypeError
|
|
53
|
+
|
|
54
|
+
The message means the return value from method or block is incorrect.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
ERROR -- : [Kaigi::Conference#each_speaker] ReturnTypeError: expected `self` but returns `[#<Kaigi::Speaker:0x00007fb2b249e5a0 @name="Soutaro Matsumoto", @email=:"matsumoto@soutaro.com">]`
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### UnexpectedBlockError, MissingBlockError
|
|
61
|
+
|
|
62
|
+
The errors are reported when required block is not given or unused block is given.
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
ERROR -- : [Kaigi::Conference#speakers] UnexpectedBlockError: unexpected block is given for `() -> ::Array[::Kaigi::Speaker]`
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### UnresolvedOverloadingError
|
|
69
|
+
|
|
70
|
+
The error means there is a type error on overloaded methods.
|
|
71
|
+
The `rbs` test framework tries to the best error message for overloaded methods too, but it reports the `UnresolvedOverloadingError` when it fails.
|
|
72
|
+
|
|
73
|
+
### DuplicatedMethodDefinitionError
|
|
74
|
+
|
|
75
|
+
The error is reported when a method is defined multiple times, as RBS does not allow duplicate method definitions. When you need to overload a method, use the `...` syntax:
|
|
76
|
+
|
|
77
|
+
```rbs
|
|
78
|
+
# First definition
|
|
79
|
+
class C
|
|
80
|
+
def foo: () -> untyped
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Second definition, use `...` syntax to tell RBS that we're overloading the method
|
|
84
|
+
class C
|
|
85
|
+
def foo: () -> untyped
|
|
86
|
+
| ...
|
|
87
|
+
end
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Setting up the test
|
|
91
|
+
|
|
92
|
+
The design of the signature testing aims to be non-intrusive. The setup is done in two steps:
|
|
93
|
+
|
|
94
|
+
1. Loading the testing library
|
|
95
|
+
2. Setting up the test through environment variables
|
|
96
|
+
|
|
97
|
+
### Loading the library
|
|
98
|
+
|
|
99
|
+
You need to require `rbs/test/setup` for signature testing.
|
|
100
|
+
You can do it using `-r` option through command line argument or the `RUBYOPT` environment variable.
|
|
101
|
+
|
|
102
|
+
```console
|
|
103
|
+
$ ruby -r rbs/test/setup run_tests.rb
|
|
104
|
+
$ RUBYOPT='-rrbs/test/setup' rake test
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
When you are using Bundler, you may need to require `bundler/setup` explicitly.
|
|
108
|
+
|
|
109
|
+
```console
|
|
110
|
+
$ RUBYOPT='-rbundler/setup -rrbs/test/setup' bundle exec rake test
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Environment variables
|
|
114
|
+
|
|
115
|
+
You need to specify `RBS_TEST_TARGET` to run the test, and you can customize the test with the following environment variables.
|
|
116
|
+
|
|
117
|
+
- `RBS_TEST_SKIP` (optional)
|
|
118
|
+
- `RBS_TEST_OPT` (optional)
|
|
119
|
+
- `RBS_TEST_LOGLEVEL` (optional)
|
|
120
|
+
- `RBS_TEST_RAISE` (optional)
|
|
121
|
+
|
|
122
|
+
`RBS_TEST_TARGET` is to specify the classes you want to test. `RBS_TEST_TARGET` can contain comma-separated class name pattern, which is one of an exact class name or with wildcard `*`.
|
|
123
|
+
|
|
124
|
+
- `RBS_TEST_TARGET=Foo::Bar,Foo::Baz` comma separated exact class names
|
|
125
|
+
- `RBS_TEST_TARGET=Foo::*` using wildcard
|
|
126
|
+
|
|
127
|
+
`RBS_TEST_SKIP` is to skip some of the classes which matches with `RBS_TEST_TARGET`.
|
|
128
|
+
|
|
129
|
+
`RBS_TEST_OPT` is to pass the options for rbs handling.
|
|
130
|
+
You may need to specify `-r` or `-I` to load signatures.
|
|
131
|
+
The default is `-I sig`.
|
|
132
|
+
|
|
133
|
+
```shell
|
|
134
|
+
RBS_TEST_OPT='-r logger -I sig'
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Replacing `logger` with the `stdlib` you want to include. For example, if you need to load `Set` and `BigDecimal` in `stdlib`, you would need to have `RBS_TEST_OPT='-r set -r bigdecimal -I sig'`
|
|
138
|
+
|
|
139
|
+
`RBS_TEST_LOGLEVEL` can be used to configure log level. Defaults to `info`.
|
|
140
|
+
|
|
141
|
+
`RBS_TEST_RAISE` may help to debug the type signatures.
|
|
142
|
+
If the environment variable is set, it raises an exception when a type error is detected.
|
|
143
|
+
You can see the backtrace how the type error is caused and debug your program or signature.
|
|
144
|
+
|
|
145
|
+
So, a typical command line to start the test would look like the following:
|
|
146
|
+
|
|
147
|
+
```console
|
|
148
|
+
$ RBS_TEST_LOGLEVEL=error \
|
|
149
|
+
RBS_TEST_TARGET='Kaigi::*' \
|
|
150
|
+
RBS_TEST_SKIP='Kaigi::MonkeyPatch' \
|
|
151
|
+
RBS_TEST_OPT='-rlogger -Isig -Iprivate' \
|
|
152
|
+
RBS_TEST_RAISE=true \
|
|
153
|
+
RUBYOPT='-rbundler/setup -rrbs/test/setup' \
|
|
154
|
+
bundle exec rake test
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Testing tips
|
|
158
|
+
|
|
159
|
+
### Skipping a method
|
|
160
|
+
|
|
161
|
+
You can skip installing the instrumentation per-method basis using `rbs:test:skip` annotation.
|
|
162
|
+
|
|
163
|
+
```rbs
|
|
164
|
+
class String
|
|
165
|
+
%a{rbs:test:skip} def =~: (Regexp) -> Integer?
|
|
166
|
+
end
|
|
167
|
+
```
|