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
data/Rakefile
ADDED
|
@@ -0,0 +1,869 @@
|
|
|
1
|
+
require "bundler/gem_tasks"
|
|
2
|
+
require "rake/testtask"
|
|
3
|
+
require "rbconfig"
|
|
4
|
+
require 'rake/extensiontask'
|
|
5
|
+
|
|
6
|
+
$LOAD_PATH << File.join(__dir__, "test")
|
|
7
|
+
|
|
8
|
+
ruby = ENV["RUBY"] || RbConfig.ruby
|
|
9
|
+
rbs = File.join(__dir__, "exe/rbs")
|
|
10
|
+
bin = File.join(__dir__, "bin")
|
|
11
|
+
|
|
12
|
+
Rake::ExtensionTask.new("rbs_extension")
|
|
13
|
+
|
|
14
|
+
compile_task = Rake::Task[:compile]
|
|
15
|
+
|
|
16
|
+
task :setup_extconf_compile_commands_json do
|
|
17
|
+
ENV["COMPILE_COMMANDS_JSON"] = "1"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
compile_task.prerequisites.unshift(:setup_extconf_compile_commands_json)
|
|
21
|
+
|
|
22
|
+
test_config = lambda do |t|
|
|
23
|
+
t.libs << "test"
|
|
24
|
+
t.libs << "lib"
|
|
25
|
+
t.test_files = FileList["test/**/*_test.rb"].reject do |path|
|
|
26
|
+
path =~ %r{test/stdlib/}
|
|
27
|
+
end
|
|
28
|
+
if defined?(RubyMemcheck)
|
|
29
|
+
if t.is_a?(RubyMemcheck::TestTask)
|
|
30
|
+
t.verbose = true
|
|
31
|
+
t.options = '-v'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
if RUBY_ENGINE == "jruby"
|
|
37
|
+
# JRuby runs the parser in WebAssembly instead of the C extension, so there is
|
|
38
|
+
# nothing to compile. The wasm runtime must be assembled first with
|
|
39
|
+
# `rake wasm:jruby_setup` (which needs CRuby + the WASI SDK).
|
|
40
|
+
Rake::TestTask.new(:test, &test_config)
|
|
41
|
+
else
|
|
42
|
+
Rake::TestTask.new(test: :compile, &test_config)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
multitask :default => [:test, :stdlib_test, :typecheck_test, :rubocop, :validate, :test_doc]
|
|
46
|
+
|
|
47
|
+
task :lexer do
|
|
48
|
+
sh "re2c -W --no-generation-date -o src/lexer.c src/lexer.re"
|
|
49
|
+
sh "clang-format -i -style=file src/lexer.c"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
task :confirm_lexer => :lexer do
|
|
53
|
+
puts "Testing if lexer.c is updated with respect to lexer.re"
|
|
54
|
+
sh "git diff --exit-code src/lexer.c"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
task :confirm_templates => :templates do
|
|
58
|
+
puts "Testing if generated code under include and src is updated with respect to templates"
|
|
59
|
+
sh "git diff --exit-code -- include src"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Task to format C code using clang-format
|
|
63
|
+
namespace :format do
|
|
64
|
+
dirs = ["src", "ext", "include"]
|
|
65
|
+
|
|
66
|
+
# Find all C source and header files
|
|
67
|
+
files = `find #{dirs.join(" ")} -type f \\( -name "*.c" -o -name "*.h" \\)`.split("\n")
|
|
68
|
+
|
|
69
|
+
desc "Format C source files using clang-format"
|
|
70
|
+
task :c do
|
|
71
|
+
puts "Formatting C files..."
|
|
72
|
+
|
|
73
|
+
# Check if clang-format is installed
|
|
74
|
+
unless system("which clang-format > /dev/null 2>&1")
|
|
75
|
+
abort "Error: clang-format not found. Please install clang-format first."
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
if files.empty?
|
|
79
|
+
puts "No C files found to format"
|
|
80
|
+
next
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
puts "Found #{files.length} files to format (excluding generated files)"
|
|
84
|
+
|
|
85
|
+
exit_status = 0
|
|
86
|
+
files.each do |file|
|
|
87
|
+
puts "Formatting #{file}"
|
|
88
|
+
unless system("clang-format -i -style=file #{file}")
|
|
89
|
+
puts "❌ Error formatting #{file}"
|
|
90
|
+
exit_status = 1
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
exit exit_status unless exit_status == 0
|
|
95
|
+
puts "✅ All files formatted successfully"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
desc "Check if C source files are properly formatted"
|
|
99
|
+
task :c_check do
|
|
100
|
+
puts "Checking C file formatting..."
|
|
101
|
+
|
|
102
|
+
# Check if clang-format is installed
|
|
103
|
+
unless system("which clang-format > /dev/null 2>&1")
|
|
104
|
+
abort "Error: clang-format not found. Please install clang-format first."
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
if files.empty?
|
|
108
|
+
puts "No C files found to check"
|
|
109
|
+
next
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
puts "Found #{files.length} files to check (excluding generated files)"
|
|
113
|
+
|
|
114
|
+
needs_format = false
|
|
115
|
+
files.each do |file|
|
|
116
|
+
formatted = `clang-format -style=file #{file}`
|
|
117
|
+
original = File.read(file)
|
|
118
|
+
|
|
119
|
+
if formatted != original
|
|
120
|
+
puts "❌ #{file} needs formatting"
|
|
121
|
+
puts "Diff:"
|
|
122
|
+
# Save formatted version to temp file and run diff
|
|
123
|
+
temp_file = "#{file}.formatted"
|
|
124
|
+
File.write(temp_file, formatted)
|
|
125
|
+
system("diff -u #{file} #{temp_file}")
|
|
126
|
+
File.unlink(temp_file)
|
|
127
|
+
needs_format = true
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
if needs_format
|
|
132
|
+
warn "Some files need formatting. Run 'rake format:c' to format them."
|
|
133
|
+
exit 1
|
|
134
|
+
else
|
|
135
|
+
puts "✅ All files are properly formatted"
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
rule ".c" => ".re" do |t|
|
|
141
|
+
puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake lexer` ⚠️⚠️⚠️"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
rule %r{^src/(.*)\.c} => 'templates/%X.c.erb' do |t|
|
|
145
|
+
puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake templates` ⚠️⚠️⚠️"
|
|
146
|
+
end
|
|
147
|
+
rule %r{^include/(.*)\.c} => 'templates/%X.c.erb' do |t|
|
|
148
|
+
puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake templates` ⚠️⚠️⚠️"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
task :annotate do
|
|
152
|
+
sh "bin/generate_docs.sh"
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
task :confirm_annotation do
|
|
156
|
+
puts "Testing if RBS docs are updated with respect to RDoc"
|
|
157
|
+
sh "git diff --exit-code core stdlib"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
task :templates do
|
|
161
|
+
sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.h"
|
|
162
|
+
sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.c"
|
|
163
|
+
|
|
164
|
+
sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.h"
|
|
165
|
+
sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.c"
|
|
166
|
+
|
|
167
|
+
sh "#{ruby} templates/template.rb include/rbs/ast.h"
|
|
168
|
+
sh "#{ruby} templates/template.rb src/ast.c"
|
|
169
|
+
|
|
170
|
+
sh "#{ruby} templates/template.rb include/rbs/serialize.h"
|
|
171
|
+
sh "#{ruby} templates/template.rb src/serialize.c"
|
|
172
|
+
sh "#{ruby} templates/template.rb lib/rbs/wasm/serialization_schema.rb"
|
|
173
|
+
|
|
174
|
+
# Format the generated files
|
|
175
|
+
Rake::Task["format:c"].invoke
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
task :compile => "ext/rbs_extension/class_constants.h"
|
|
179
|
+
task :compile => "ext/rbs_extension/class_constants.c"
|
|
180
|
+
task :compile => "src/lexer.c"
|
|
181
|
+
|
|
182
|
+
task :test_doc do
|
|
183
|
+
files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
|
184
|
+
`git ls-files -z`.split("\x0").select do |file| Pathname(file).extname == ".md" end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
sh "#{ruby} #{__dir__}/bin/run_in_md.rb #{files.join(" ")}"
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
task :validate => :compile do
|
|
191
|
+
require 'yaml'
|
|
192
|
+
|
|
193
|
+
sh "#{ruby} #{rbs} validate"
|
|
194
|
+
|
|
195
|
+
libs = FileList["stdlib/*"].map {|path| File.basename(path).to_s }
|
|
196
|
+
|
|
197
|
+
# Skip RBS validation because Ruby CI runs without rubygems
|
|
198
|
+
case skip_rbs_validation = ENV["SKIP_RBS_VALIDATION"]
|
|
199
|
+
when nil
|
|
200
|
+
begin
|
|
201
|
+
Gem::Specification.find_by_name("rbs")
|
|
202
|
+
libs << "rbs"
|
|
203
|
+
rescue Gem::MissingSpecError
|
|
204
|
+
STDERR.puts "🚨🚨🚨🚨 Skipping `rbs` gem because it's not found"
|
|
205
|
+
end
|
|
206
|
+
when "true"
|
|
207
|
+
# Skip
|
|
208
|
+
else
|
|
209
|
+
STDERR.puts "🚨🚨🚨🚨 SKIP_RBS_VALIDATION is expected to be `true` or unset, given `#{skip_rbs_validation}` 🚨🚨🚨🚨"
|
|
210
|
+
libs << "rbs"
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
libs.delete("bigdecimal-math") or raise
|
|
214
|
+
libs.delete("bigdecimal") or raise
|
|
215
|
+
|
|
216
|
+
libs.each do |lib|
|
|
217
|
+
args = ["-r", lib]
|
|
218
|
+
|
|
219
|
+
if lib == "rbs"
|
|
220
|
+
args << "-r" << "prism"
|
|
221
|
+
args << "-r" << "logger"
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
sh "#{ruby} #{rbs} #{args.join(' ')} validate"
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
FileList["test/stdlib/**/*_test.rb"].each do |test|
|
|
229
|
+
task test => :compile do
|
|
230
|
+
sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test}"
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
task :stdlib_test => :compile do
|
|
235
|
+
test_files = FileList["test/stdlib/**/*_test.rb"].reject do |path|
|
|
236
|
+
path =~ %r{Ractor} || path =~ %r{Encoding} || path =~ %r{CGI-escape_test}
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
if ENV["RANDOMIZE_STDLIB_TEST_ORDER"] == "true"
|
|
240
|
+
test_files.shuffle!
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test_files.join(' ')}"
|
|
244
|
+
# TODO: Ractor tests need to be run in a separate process
|
|
245
|
+
sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/CGI-escape_test.rb"
|
|
246
|
+
sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Ractor_test.rb"
|
|
247
|
+
sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Encoding_test.rb"
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
task :typecheck_test => :compile do
|
|
251
|
+
FileList["test/typecheck/*"].each do |test|
|
|
252
|
+
Dir.chdir(test) do
|
|
253
|
+
expectations = File.join(test, "steep_expectations.yml")
|
|
254
|
+
if File.exist?(expectations)
|
|
255
|
+
sh "steep check --with_expectations"
|
|
256
|
+
else
|
|
257
|
+
sh "steep check"
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
task :raap => :compile do
|
|
264
|
+
sh "ruby test/raap/core.rb"
|
|
265
|
+
sh "ruby test/raap/digest.rb"
|
|
266
|
+
sh "ruby test/raap/openssl.rb"
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
task :rubocop do
|
|
270
|
+
format = if ENV["CI"]
|
|
271
|
+
"github"
|
|
272
|
+
else
|
|
273
|
+
"progress"
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
sh "rubocop --parallel --format #{format}"
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
namespace :generate do
|
|
280
|
+
desc "Generate a test file for a stdlib class signatures"
|
|
281
|
+
task :stdlib_test, [:class] do |_task, args|
|
|
282
|
+
klass = args.fetch(:class) do
|
|
283
|
+
raise "Class name is necessary. e.g. rake 'generate:stdlib_test[String]'"
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
require "erb"
|
|
287
|
+
require "rbs"
|
|
288
|
+
|
|
289
|
+
class TestTarget
|
|
290
|
+
def initialize(klass)
|
|
291
|
+
@type_name = RBS::Namespace.parse(klass).to_type_name
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def path
|
|
295
|
+
Pathname(ENV['RBS_GENERATE_TEST_PATH'] || "test/stdlib/#{file_name}_test.rb")
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def file_name
|
|
299
|
+
@type_name.to_s.gsub(/\A::/, '').gsub(/::/, '_')
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def to_s
|
|
303
|
+
@type_name.to_s
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def absolute_type_name
|
|
307
|
+
@absolute_type_name ||= @type_name.absolute!
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
target = TestTarget.new(klass)
|
|
312
|
+
path = target.path
|
|
313
|
+
raise "#{path} already exists!" if path.exist?
|
|
314
|
+
|
|
315
|
+
class TestTemplateBuilder
|
|
316
|
+
attr_reader :target, :env
|
|
317
|
+
|
|
318
|
+
def initialize(target)
|
|
319
|
+
@target = target
|
|
320
|
+
|
|
321
|
+
loader = RBS::EnvironmentLoader.new
|
|
322
|
+
Dir['stdlib/*'].each do |lib|
|
|
323
|
+
next if lib.end_with?('builtin')
|
|
324
|
+
|
|
325
|
+
loader.add(library: File.basename(lib))
|
|
326
|
+
end
|
|
327
|
+
@env = RBS::Environment.from_loader(loader).resolve_type_names
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def call
|
|
331
|
+
ERB.new(<<~ERB, trim_mode: "-").result(binding)
|
|
332
|
+
require_relative "test_helper"
|
|
333
|
+
|
|
334
|
+
<%- unless class_methods.empty? -%>
|
|
335
|
+
class <%= target %>SingletonTest < Test::Unit::TestCase
|
|
336
|
+
include TestHelper
|
|
337
|
+
|
|
338
|
+
# library "logger", "securerandom" # Declare library signatures to load
|
|
339
|
+
testing "singleton(::<%= target %>)"
|
|
340
|
+
|
|
341
|
+
<%- class_methods.each do |method_name, definition| -%>
|
|
342
|
+
def test_<%= test_name_for(method_name) %>
|
|
343
|
+
<%- definition.method_types.each do |method_type| -%>
|
|
344
|
+
assert_send_type "<%= method_type %>",
|
|
345
|
+
<%= target %>, :<%= method_name %>
|
|
346
|
+
<%- end -%>
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
<%- end -%>
|
|
350
|
+
end
|
|
351
|
+
<%- end -%>
|
|
352
|
+
|
|
353
|
+
<%- unless instance_methods.empty? -%>
|
|
354
|
+
class <%= target %>Test < Test::Unit::TestCase
|
|
355
|
+
include TestHelper
|
|
356
|
+
|
|
357
|
+
# library "logger", "securerandom" # Declare library signatures to load
|
|
358
|
+
testing "::<%= target %>"
|
|
359
|
+
|
|
360
|
+
<%- instance_methods.each do |method_name, definition| -%>
|
|
361
|
+
def test_<%= test_name_for(method_name) %>
|
|
362
|
+
<%- definition.method_types.each do |method_type| -%>
|
|
363
|
+
assert_send_type "<%= method_type %>",
|
|
364
|
+
<%= target %>.new, :<%= method_name %>
|
|
365
|
+
<%- end -%>
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
<%- end -%>
|
|
369
|
+
end
|
|
370
|
+
<%- end -%>
|
|
371
|
+
ERB
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
private
|
|
375
|
+
|
|
376
|
+
def test_name_for(method_name)
|
|
377
|
+
{
|
|
378
|
+
:== => 'double_equal',
|
|
379
|
+
:!= => 'not_equal',
|
|
380
|
+
:=== => 'triple_equal',
|
|
381
|
+
:[] => 'square_bracket',
|
|
382
|
+
:[]= => 'square_bracket_assign',
|
|
383
|
+
:> => 'greater_than',
|
|
384
|
+
:< => 'less_than',
|
|
385
|
+
:>= => 'greater_than_equal_to',
|
|
386
|
+
:<= => 'less_than_equal_to',
|
|
387
|
+
:<=> => 'spaceship',
|
|
388
|
+
:+ => 'plus',
|
|
389
|
+
:- => 'minus',
|
|
390
|
+
:* => 'multiply',
|
|
391
|
+
:/ => 'divide',
|
|
392
|
+
:** => 'power',
|
|
393
|
+
:% => 'modulus',
|
|
394
|
+
:& => 'and',
|
|
395
|
+
:| => 'or',
|
|
396
|
+
:^ => 'xor',
|
|
397
|
+
:>> => 'right_shift',
|
|
398
|
+
:<< => 'left_shift',
|
|
399
|
+
:=~ => 'pattern_match',
|
|
400
|
+
:!~ => 'does_not_match',
|
|
401
|
+
:~ => 'tilde'
|
|
402
|
+
}.fetch(method_name, method_name)
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
def class_methods
|
|
406
|
+
@class_methods ||= RBS::DefinitionBuilder.new(env: env).build_singleton(target.absolute_type_name).methods.select {|_, definition|
|
|
407
|
+
definition.implemented_in == target.absolute_type_name
|
|
408
|
+
}
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
def instance_methods
|
|
412
|
+
@instance_methods ||= RBS::DefinitionBuilder.new(env: env).build_instance(target.absolute_type_name).methods.select {|_, definition|
|
|
413
|
+
definition.implemented_in == target.absolute_type_name
|
|
414
|
+
}
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
path.write TestTemplateBuilder.new(target).call
|
|
419
|
+
|
|
420
|
+
puts "Created: #{path}"
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
task :test_generate_stdlib do
|
|
425
|
+
sh "RBS_GENERATE_TEST_PATH=/tmp/Array_test.rb rake 'generate:stdlib_test[Array]'"
|
|
426
|
+
sh "ruby -c /tmp/Array_test.rb"
|
|
427
|
+
sh "RBS_GENERATE_TEST_PATH=/tmp/Thread_Mutex_test.rb rake 'generate:stdlib_test[Thread::Mutex]'"
|
|
428
|
+
sh "ruby -c /tmp/Thread_Mutex_test.rb"
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
Rake::Task[:release].enhance do
|
|
432
|
+
Rake::Task[:"release:note"].invoke
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
namespace :release do
|
|
436
|
+
desc "Explain the post-release steps automatically"
|
|
437
|
+
task :note do
|
|
438
|
+
version = Gem::Version.new(RBS::VERSION)
|
|
439
|
+
major, minor, patch, *_ = RBS::VERSION.split(".")
|
|
440
|
+
major = major.to_i
|
|
441
|
+
minor = minor.to_i
|
|
442
|
+
patch = patch.to_i
|
|
443
|
+
|
|
444
|
+
puts "🎉🎉🎉🎉 Congratulations for **#{version}** release! 🎉🎉🎉🎉"
|
|
445
|
+
puts
|
|
446
|
+
puts "There are a few things left to complete the release. 💪"
|
|
447
|
+
puts
|
|
448
|
+
|
|
449
|
+
if patch == 0 || version.prerelease?
|
|
450
|
+
puts "* [ ] Update release note: https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor}"
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
if patch == 0 && !version.prerelease?
|
|
454
|
+
puts "* [ ] Delete `RBS XYZ is the latest version of...` from release note: https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor}"
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
puts "* [ ] Publish a release at GitHub"
|
|
458
|
+
puts "* [ ] Make some announcements on Twitter/Mustdon/Slack/???"
|
|
459
|
+
|
|
460
|
+
puts
|
|
461
|
+
puts
|
|
462
|
+
|
|
463
|
+
puts "✏️ Making a draft release on GitHub..."
|
|
464
|
+
|
|
465
|
+
content = File.read(File.join(__dir__, "CHANGELOG.md"))
|
|
466
|
+
changelog = content.scan(/^## \d.*?(?=^## \d)/m)[0]
|
|
467
|
+
changelog = changelog.sub(/^.*\n^.*\n/, "").rstrip
|
|
468
|
+
|
|
469
|
+
notes = <<NOTES
|
|
470
|
+
[Release note](https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor})
|
|
471
|
+
|
|
472
|
+
#{changelog}
|
|
473
|
+
NOTES
|
|
474
|
+
|
|
475
|
+
command = [
|
|
476
|
+
"gh",
|
|
477
|
+
"release",
|
|
478
|
+
"create",
|
|
479
|
+
"--draft",
|
|
480
|
+
"v#{RBS::VERSION}",
|
|
481
|
+
"--title=#{RBS::VERSION}",
|
|
482
|
+
"--notes=#{notes}"
|
|
483
|
+
]
|
|
484
|
+
|
|
485
|
+
if version.prerelease?
|
|
486
|
+
command << "--prerelease"
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
require "open3"
|
|
490
|
+
output, status = Open3.capture2(*command)
|
|
491
|
+
if status.success?
|
|
492
|
+
puts " >> Done! Open #{output.chomp} and publish the release!"
|
|
493
|
+
end
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
desc "Generate changelog template from GH pull requests"
|
|
499
|
+
task :changelog do
|
|
500
|
+
major, minor, patch, _pre = RBS::VERSION.split(".", 4)
|
|
501
|
+
major = major.to_i
|
|
502
|
+
minor = minor.to_i
|
|
503
|
+
patch = patch.to_i
|
|
504
|
+
|
|
505
|
+
if patch == 0
|
|
506
|
+
milestone = "RBS #{major}.#{minor}"
|
|
507
|
+
else
|
|
508
|
+
milestone = "RBS #{major}.#{minor}.x"
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
puts "🔍 Finding pull requests that is associated to milestone `#{milestone}`..."
|
|
512
|
+
|
|
513
|
+
command = [
|
|
514
|
+
"gh",
|
|
515
|
+
"pr",
|
|
516
|
+
"list",
|
|
517
|
+
"--limit=10000",
|
|
518
|
+
"--json",
|
|
519
|
+
"url,title,number",
|
|
520
|
+
"--search" ,
|
|
521
|
+
"milestone:\"#{milestone}\" is:merged sort:updated-desc -label:Released"
|
|
522
|
+
]
|
|
523
|
+
|
|
524
|
+
require "open3"
|
|
525
|
+
output, status = Open3.capture2(*command)
|
|
526
|
+
raise status.inspect unless status.success?
|
|
527
|
+
|
|
528
|
+
require "json"
|
|
529
|
+
json = JSON.parse(output, symbolize_names: true)
|
|
530
|
+
|
|
531
|
+
unless json.empty?
|
|
532
|
+
puts
|
|
533
|
+
json.each do |line|
|
|
534
|
+
puts "* #{line[:title]} ([##{line[:number]}](#{line[:url]}))"
|
|
535
|
+
end
|
|
536
|
+
else
|
|
537
|
+
puts " (🤑 There is no *unreleased* pull request associated to the milestone.)"
|
|
538
|
+
end
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
desc "Compile extension without C23 extensions"
|
|
542
|
+
task :compile_c99 do
|
|
543
|
+
ENV["TEST_NO_C23"] = "true"
|
|
544
|
+
Rake::Task[:"compile"].invoke
|
|
545
|
+
ensure
|
|
546
|
+
ENV.delete("TEST_NO_C23")
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
task :prepare_bench do
|
|
550
|
+
ENV.delete("DEBUG")
|
|
551
|
+
Rake::Task[:"clobber"].invoke
|
|
552
|
+
Rake::Task[:"templates"].invoke
|
|
553
|
+
Rake::Task[:"compile"].invoke
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
task :prepare_profiling do
|
|
557
|
+
ENV["DEBUG"] = "1"
|
|
558
|
+
Rake::Task[:"clobber"].invoke
|
|
559
|
+
Rake::Task[:"templates"].invoke
|
|
560
|
+
Rake::Task[:"compile"].invoke
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
namespace :wasm do
|
|
564
|
+
WASM_DIR = File.expand_path("wasm", __dir__)
|
|
565
|
+
WASM_OUTPUT = File.join(WASM_DIR, "rbs_parser.wasm")
|
|
566
|
+
|
|
567
|
+
# The parser under src/ is plain, self-contained C with no dependency on the
|
|
568
|
+
# Ruby C API, so it can be compiled to WebAssembly as-is. The only extra
|
|
569
|
+
# translation unit is the entry-point shim under wasm/.
|
|
570
|
+
def wasm_source_files
|
|
571
|
+
Dir.glob(File.join(__dir__, "src/**/*.c")).sort + [File.join(WASM_DIR, "rbs_wasm.c")]
|
|
572
|
+
end
|
|
573
|
+
|
|
574
|
+
# Locate the clang shipped with the WASI SDK.
|
|
575
|
+
#
|
|
576
|
+
# The system clang can target wasm32, but the WASI SDK additionally provides
|
|
577
|
+
# the wasi-libc sysroot and the wasm32 compiler-rt builtins that the link
|
|
578
|
+
# step needs, so we require it explicitly.
|
|
579
|
+
def wasi_clang
|
|
580
|
+
sdk = ENV["WASI_SDK_PATH"]
|
|
581
|
+
if sdk.nil? || sdk.empty?
|
|
582
|
+
raise <<~MSG
|
|
583
|
+
WASI_SDK_PATH is not set.
|
|
584
|
+
|
|
585
|
+
Install the WASI SDK from https://github.com/WebAssembly/wasi-sdk/releases
|
|
586
|
+
and point WASI_SDK_PATH at the extracted directory, for example:
|
|
587
|
+
|
|
588
|
+
export WASI_SDK_PATH=/opt/wasi-sdk
|
|
589
|
+
rake wasm:build
|
|
590
|
+
MSG
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
clang = File.join(sdk, "bin", "clang")
|
|
594
|
+
raise "clang not found at #{clang} (is WASI_SDK_PATH correct?)" unless File.executable?(clang)
|
|
595
|
+
|
|
596
|
+
clang
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
desc "Build the RBS parser as a WebAssembly module (requires WASI_SDK_PATH)"
|
|
600
|
+
task :build do
|
|
601
|
+
mkdir_p WASM_DIR
|
|
602
|
+
sh wasi_clang,
|
|
603
|
+
"--target=wasm32-wasip1",
|
|
604
|
+
# No `main`; the host calls `_initialize` and then the exported functions.
|
|
605
|
+
"-mexec-model=reactor",
|
|
606
|
+
"-std=gnu11",
|
|
607
|
+
"-O2",
|
|
608
|
+
"-Wno-unused-parameter",
|
|
609
|
+
"-I#{File.join(__dir__, "include")}",
|
|
610
|
+
"-o", WASM_OUTPUT,
|
|
611
|
+
*wasm_source_files
|
|
612
|
+
puts "Built #{WASM_OUTPUT}"
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
desc "Build and smoke-test the WebAssembly module (requires wasmtime)"
|
|
616
|
+
task :check => :build do
|
|
617
|
+
wasmtime = ENV["WASMTIME"] || "wasmtime"
|
|
618
|
+
|
|
619
|
+
# `rbs_wasm_selftest` parses a small fixed signature and returns 1 on
|
|
620
|
+
# success. `--invoke` prints the return value to stdout.
|
|
621
|
+
output = IO.popen([wasmtime, "run", "--invoke", "rbs_wasm_selftest", WASM_OUTPUT], err: File::NULL, &:read).to_s.strip
|
|
622
|
+
|
|
623
|
+
if output == "1"
|
|
624
|
+
puts "WebAssembly selftest passed."
|
|
625
|
+
else
|
|
626
|
+
raise "WebAssembly selftest failed: rbs_wasm_selftest returned #{output.inspect} (expected \"1\")"
|
|
627
|
+
end
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
# Where the runtime looks for the module and jars by default (see
|
|
631
|
+
# RBS::WASM::Runtime). These are build artifacts, bundled into the JRuby gem.
|
|
632
|
+
JRUBY_WASM_DIR = File.expand_path("lib/rbs/wasm", __dir__)
|
|
633
|
+
CHICORY_VERSION = ENV.fetch("CHICORY_VERSION", "1.7.5")
|
|
634
|
+
# `compiler` is Chicory's AOT compiler (wasm -> JVM bytecode); the asm* jars
|
|
635
|
+
# are the ow2 ASM libraries it depends on. Keep ASM_VERSION in sync with what
|
|
636
|
+
# the pinned Chicory release declares.
|
|
637
|
+
CHICORY_JARS = %w[wasm runtime log wasi compiler].freeze
|
|
638
|
+
ASM_VERSION = ENV.fetch("ASM_VERSION", "9.9.1")
|
|
639
|
+
ASM_JARS = %w[asm asm-tree asm-util asm-commons asm-analysis].freeze
|
|
640
|
+
|
|
641
|
+
desc "Download the Chicory and ASM jars the JRuby runtime needs into lib/rbs/wasm/jars"
|
|
642
|
+
task :vendor_jars do
|
|
643
|
+
require "open-uri"
|
|
644
|
+
require "fileutils"
|
|
645
|
+
|
|
646
|
+
jars_dir = File.join(JRUBY_WASM_DIR, "jars")
|
|
647
|
+
FileUtils.mkdir_p(jars_dir)
|
|
648
|
+
|
|
649
|
+
downloads = CHICORY_JARS.map { |name| ["#{name}.jar", "https://repo1.maven.org/maven2/com/dylibso/chicory/#{name}/#{CHICORY_VERSION}/#{name}-#{CHICORY_VERSION}.jar"] }
|
|
650
|
+
downloads += ASM_JARS.map { |name| ["#{name}.jar", "https://repo1.maven.org/maven2/org/ow2/asm/#{name}/#{ASM_VERSION}/#{name}-#{ASM_VERSION}.jar"] }
|
|
651
|
+
|
|
652
|
+
downloads.each do |filename, url|
|
|
653
|
+
puts "Downloading #{url}"
|
|
654
|
+
URI.open(url) { |io| File.binwrite(File.join(jars_dir, filename), io.read) } # steep:ignore
|
|
655
|
+
end
|
|
656
|
+
|
|
657
|
+
puts "Vendored Chicory #{CHICORY_VERSION} + ASM #{ASM_VERSION} into #{jars_dir}"
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
desc "Assemble everything the JRuby gem needs: the .wasm and the Chicory jars"
|
|
661
|
+
task :jruby_setup => [:build, :vendor_jars] do
|
|
662
|
+
cp WASM_OUTPUT, File.join(JRUBY_WASM_DIR, "rbs_parser.wasm")
|
|
663
|
+
puts "JRuby runtime is ready under #{JRUBY_WASM_DIR}"
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
namespace :rust do
|
|
668
|
+
namespace :rbs do
|
|
669
|
+
RUST_DIR = File.expand_path("rust", __dir__)
|
|
670
|
+
RBS_VERSION_FILE = File.join(RUST_DIR, "rbs_version")
|
|
671
|
+
|
|
672
|
+
VENDOR_TARGETS = {
|
|
673
|
+
"ruby-rbs-sys" => %w[include src],
|
|
674
|
+
"ruby-rbs" => %w[config.yml],
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
desc "Sync vendored RBS source from the pinned version"
|
|
678
|
+
task :sync do
|
|
679
|
+
unless File.exist?(RBS_VERSION_FILE)
|
|
680
|
+
raise "#{RBS_VERSION_FILE} not found. Run `rake rust:rbs:pin[VERSION]` first."
|
|
681
|
+
end
|
|
682
|
+
|
|
683
|
+
version = File.read(RBS_VERSION_FILE).strip
|
|
684
|
+
raise "#{RBS_VERSION_FILE} is empty" if version.empty?
|
|
685
|
+
|
|
686
|
+
puts "Syncing vendor/rbs/ from #{version}..."
|
|
687
|
+
|
|
688
|
+
VENDOR_TARGETS.each do |crate, entries|
|
|
689
|
+
vendor_dir = File.join(RUST_DIR, crate, "vendor", "rbs")
|
|
690
|
+
|
|
691
|
+
puts " Copying files for #{crate}:"
|
|
692
|
+
chmod_R "u+w", vendor_dir, verbose: false if File.exist?(vendor_dir)
|
|
693
|
+
rm_rf vendor_dir, verbose: false
|
|
694
|
+
mkdir_p vendor_dir, verbose: false
|
|
695
|
+
|
|
696
|
+
entries.each do |entry|
|
|
697
|
+
target = File.join(vendor_dir, entry)
|
|
698
|
+
|
|
699
|
+
# Extract the entry from the pinned git tag using git archive
|
|
700
|
+
IO.popen(["git", "archive", "--format=tar", version, "--", entry], "rb") do |tar|
|
|
701
|
+
IO.popen(["tar", "xf", "-", "-C", vendor_dir], "wb") do |extract|
|
|
702
|
+
IO.copy_stream(tar, extract)
|
|
703
|
+
end
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
raise "Failed to extract #{entry} from #{version}" unless File.exist?(target)
|
|
707
|
+
puts " #{entry}"
|
|
708
|
+
end
|
|
709
|
+
|
|
710
|
+
# Make files read-only to prevent accidental edits
|
|
711
|
+
chmod_R "a-w", vendor_dir, verbose: false
|
|
712
|
+
end
|
|
713
|
+
|
|
714
|
+
puts "📦 Synced vendor/rbs/ from #{version} (read-only)"
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
desc "Pin a specific RBS version for Rust crates (e.g., rake rust:rbs:pin[v4.0.3])"
|
|
718
|
+
task :pin, [:version] do |_t, args|
|
|
719
|
+
version = args[:version] or raise "Usage: rake rust:rbs:pin[VERSION]"
|
|
720
|
+
|
|
721
|
+
# Verify the tag exists
|
|
722
|
+
unless system("git", "rev-parse", "--verify", "#{version}^{commit}", out: File::NULL, err: File::NULL)
|
|
723
|
+
raise "Tag #{version} not found"
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
File.write(RBS_VERSION_FILE, "#{version}\n")
|
|
727
|
+
puts "📌 Pinned RBS version to #{version}"
|
|
728
|
+
|
|
729
|
+
Rake::Task["rust:rbs:sync"].invoke
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
desc "Create symlinks from vendor/rbs/ to the repository root (for development/CI)"
|
|
733
|
+
task :symlink do
|
|
734
|
+
VENDOR_TARGETS.each do |crate, entries|
|
|
735
|
+
vendor_dir = File.join(RUST_DIR, crate, "vendor", "rbs")
|
|
736
|
+
|
|
737
|
+
puts "Setting up symlinks for #{crate}..."
|
|
738
|
+
entries.each do |entry|
|
|
739
|
+
puts " #{entry} -> repository root"
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
chmod_R "u+w", vendor_dir, verbose: false if File.exist?(vendor_dir)
|
|
743
|
+
rm_rf vendor_dir, verbose: false
|
|
744
|
+
mkdir_p vendor_dir, verbose: false
|
|
745
|
+
|
|
746
|
+
entries.each do |entry|
|
|
747
|
+
ln_s File.join("..", "..", "..", "..", entry), File.join(vendor_dir, entry), verbose: false
|
|
748
|
+
end
|
|
749
|
+
end
|
|
750
|
+
|
|
751
|
+
puts "🔗 Symlinked vendor/rbs/ to repository root"
|
|
752
|
+
end
|
|
753
|
+
end
|
|
754
|
+
|
|
755
|
+
namespace :publish do
|
|
756
|
+
def self.prepare_publish_branch(crate_name)
|
|
757
|
+
dry_run = ENV["RBS_RUST_PUBLISH_DRY_RUN"]
|
|
758
|
+
|
|
759
|
+
version_file = File.join(RUST_DIR, "rbs_version")
|
|
760
|
+
|
|
761
|
+
unless File.exist?(version_file)
|
|
762
|
+
raise "#{version_file} not found. Run `rake rust:rbs:pin[VERSION]` first."
|
|
763
|
+
end
|
|
764
|
+
|
|
765
|
+
rbs_version = File.read(version_file).strip
|
|
766
|
+
raise "#{version_file} is empty" if rbs_version.empty?
|
|
767
|
+
|
|
768
|
+
crate_version = File.read(File.join(RUST_DIR, crate_name, "Cargo.toml"))[/^version\s*=\s*"(.+)"/, 1]
|
|
769
|
+
release_branch = "rust/release-#{crate_name}-#{Time.now.strftime('%Y%m%d%H%M%S')}"
|
|
770
|
+
|
|
771
|
+
puts "=" * 60
|
|
772
|
+
puts "Rust crate publish: #{crate_name}#{dry_run ? " (DRY RUN)" : ""}"
|
|
773
|
+
puts "=" * 60
|
|
774
|
+
puts " RBS source version: #{rbs_version}"
|
|
775
|
+
puts " #{crate_name}: #{crate_version} (tag: #{crate_name}-v#{crate_version})"
|
|
776
|
+
puts " Release branch: #{release_branch}"
|
|
777
|
+
puts "=" * 60
|
|
778
|
+
|
|
779
|
+
# Check that vendor dirs contain real files, not symlinks
|
|
780
|
+
entries = VENDOR_TARGETS.fetch(crate_name)
|
|
781
|
+
entries.each do |entry|
|
|
782
|
+
path = File.join(RUST_DIR, crate_name, "vendor", "rbs", entry)
|
|
783
|
+
if File.symlink?(path)
|
|
784
|
+
raise "#{path} is a symlink. Run `rake rust:rbs:sync` first."
|
|
785
|
+
end
|
|
786
|
+
unless File.exist?(path)
|
|
787
|
+
raise "#{path} does not exist. Run `rake rust:rbs:sync` first."
|
|
788
|
+
end
|
|
789
|
+
end
|
|
790
|
+
|
|
791
|
+
# Ensure working tree is clean before publishing
|
|
792
|
+
unless `git status --porcelain`.strip.empty?
|
|
793
|
+
raise "💢 Working tree is dirty. Please commit or stash your changes before publishing."
|
|
794
|
+
end
|
|
795
|
+
|
|
796
|
+
# Create a release branch with vendor files committed
|
|
797
|
+
original_branch = `git rev-parse --abbrev-ref HEAD`.strip
|
|
798
|
+
|
|
799
|
+
sh "git", "checkout", "-b", release_branch, verbose: false
|
|
800
|
+
vendor_path = File.join("rust", crate_name, "vendor", "rbs")
|
|
801
|
+
sh "git", "add", "-f", vendor_path, verbose: false
|
|
802
|
+
sh "git", "commit", "-m", "Publish #{crate_name} (RBS #{rbs_version})", verbose: false
|
|
803
|
+
|
|
804
|
+
[dry_run, crate_version, original_branch]
|
|
805
|
+
end
|
|
806
|
+
|
|
807
|
+
desc "Publish ruby-rbs-sys crate to crates.io (set RBS_RUST_PUBLISH_DRY_RUN=1 for dry-run only)"
|
|
808
|
+
task :"ruby-rbs-sys" do
|
|
809
|
+
crate_name = "ruby-rbs-sys"
|
|
810
|
+
dry_run, crate_version, original_branch = prepare_publish_branch(crate_name)
|
|
811
|
+
|
|
812
|
+
begin
|
|
813
|
+
puts "🔰 Dry-run publishing..."
|
|
814
|
+
|
|
815
|
+
Dir.chdir(File.join(RUST_DIR, crate_name)) do
|
|
816
|
+
sh "cargo", "publish", "--dry-run"
|
|
817
|
+
end
|
|
818
|
+
|
|
819
|
+
puts "✅ Dry-run succeeded!"
|
|
820
|
+
|
|
821
|
+
unless dry_run
|
|
822
|
+
puts "💪 Publishing #{crate_name} for real..."
|
|
823
|
+
|
|
824
|
+
Dir.chdir(File.join(RUST_DIR, crate_name)) do
|
|
825
|
+
sh "cargo", "publish"
|
|
826
|
+
end
|
|
827
|
+
|
|
828
|
+
sh "git", "tag", "#{crate_name}-v#{crate_version}"
|
|
829
|
+
sh "git", "push", "origin", "#{crate_name}-v#{crate_version}"
|
|
830
|
+
|
|
831
|
+
puts "🎉 Published #{crate_name} successfully!"
|
|
832
|
+
end
|
|
833
|
+
ensure
|
|
834
|
+
sh "git", "checkout", original_branch, verbose: false
|
|
835
|
+
end
|
|
836
|
+
end
|
|
837
|
+
|
|
838
|
+
desc "Publish ruby-rbs crate to crates.io (set RBS_RUST_PUBLISH_DRY_RUN=1 for dry-run only)"
|
|
839
|
+
task :"ruby-rbs" do
|
|
840
|
+
crate_name = "ruby-rbs"
|
|
841
|
+
dry_run, crate_version, original_branch = prepare_publish_branch(crate_name)
|
|
842
|
+
|
|
843
|
+
begin
|
|
844
|
+
puts "🔰 Dry-run publishing..."
|
|
845
|
+
|
|
846
|
+
Dir.chdir(File.join(RUST_DIR, crate_name)) do
|
|
847
|
+
sh "cargo", "publish", "--dry-run", "--no-verify"
|
|
848
|
+
end
|
|
849
|
+
|
|
850
|
+
puts "✅ Dry-run succeeded!"
|
|
851
|
+
|
|
852
|
+
unless dry_run
|
|
853
|
+
puts "💪 Publishing #{crate_name} for real..."
|
|
854
|
+
|
|
855
|
+
Dir.chdir(File.join(RUST_DIR, crate_name)) do
|
|
856
|
+
sh "cargo", "publish"
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
sh "git", "tag", "#{crate_name}-v#{crate_version}"
|
|
860
|
+
sh "git", "push", "origin", "#{crate_name}-v#{crate_version}"
|
|
861
|
+
|
|
862
|
+
puts "🎉 Published #{crate_name} successfully!"
|
|
863
|
+
end
|
|
864
|
+
ensure
|
|
865
|
+
sh "git", "checkout", original_branch, verbose: false
|
|
866
|
+
end
|
|
867
|
+
end
|
|
868
|
+
end
|
|
869
|
+
end
|