rbs-relaxed 3.9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/dependabot.yml +22 -0
- data/.github/workflows/comments.yml +35 -0
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/ruby.yml +82 -0
- data/.github/workflows/typecheck.yml +38 -0
- data/.github/workflows/windows.yml +43 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +68 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +1868 -0
- data/COPYING +56 -0
- data/README.md +203 -0
- data/Rakefile +417 -0
- data/Steepfile +44 -0
- data/config.yml +313 -0
- data/core/array.rbs +4062 -0
- data/core/basic_object.rbs +375 -0
- data/core/binding.rbs +150 -0
- data/core/builtin.rbs +277 -0
- data/core/class.rbs +220 -0
- data/core/comparable.rbs +171 -0
- data/core/complex.rbs +786 -0
- data/core/constants.rbs +96 -0
- data/core/data.rbs +415 -0
- data/core/dir.rbs +981 -0
- data/core/encoding.rbs +1371 -0
- data/core/enumerable.rbs +2405 -0
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +630 -0
- data/core/env.rbs +6 -0
- data/core/errno.rbs +673 -0
- data/core/errors.rbs +760 -0
- data/core/exception.rbs +485 -0
- data/core/false_class.rbs +82 -0
- data/core/fiber.rbs +550 -0
- data/core/fiber_error.rbs +11 -0
- data/core/file.rbs +2936 -0
- data/core/file_test.rbs +331 -0
- data/core/float.rbs +1151 -0
- data/core/gc.rbs +644 -0
- data/core/global_variables.rbs +184 -0
- data/core/hash.rbs +1861 -0
- data/core/integer.rbs +1413 -0
- data/core/io/buffer.rbs +984 -0
- data/core/io/wait.rbs +70 -0
- data/core/io.rbs +3406 -0
- data/core/kernel.rbs +3096 -0
- data/core/marshal.rbs +207 -0
- data/core/match_data.rbs +635 -0
- data/core/math.rbs +729 -0
- data/core/method.rbs +386 -0
- data/core/module.rbs +1704 -0
- data/core/nil_class.rbs +209 -0
- data/core/numeric.rbs +818 -0
- data/core/object.rbs +110 -0
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +190 -0
- data/core/proc.rbs +868 -0
- data/core/process.rbs +2296 -0
- data/core/ractor.rbs +1068 -0
- data/core/random.rbs +237 -0
- data/core/range.rbs +1107 -0
- data/core/rational.rbs +531 -0
- data/core/rb_config.rbs +88 -0
- data/core/rbs/unnamed/argf.rbs +1229 -0
- data/core/rbs/unnamed/env_class.rbs +1209 -0
- data/core/rbs/unnamed/random.rbs +293 -0
- data/core/refinement.rbs +59 -0
- data/core/regexp.rbs +1930 -0
- data/core/ruby_vm.rbs +765 -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 +176 -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 +1171 -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 +294 -0
- data/core/set.rbs +621 -0
- data/core/signal.rbs +100 -0
- data/core/string.rbs +3583 -0
- data/core/struct.rbs +667 -0
- data/core/symbol.rbs +475 -0
- data/core/thread.rbs +1765 -0
- data/core/thread_group.rbs +79 -0
- data/core/time.rbs +1762 -0
- data/core/trace_point.rbs +477 -0
- data/core/true_class.rbs +98 -0
- data/core/unbound_method.rbs +329 -0
- data/core/warning.rbs +87 -0
- data/docs/CONTRIBUTING.md +106 -0
- data/docs/architecture.md +110 -0
- data/docs/collection.md +192 -0
- data/docs/data_and_struct.md +86 -0
- data/docs/gem.md +57 -0
- data/docs/rbs_by_example.md +309 -0
- data/docs/repo.md +125 -0
- data/docs/sigs.md +167 -0
- data/docs/stdlib.md +147 -0
- data/docs/syntax.md +910 -0
- data/docs/tools.md +17 -0
- data/exe/rbs +7 -0
- data/ext/rbs_extension/extconf.rb +15 -0
- data/ext/rbs_extension/lexer.c +2728 -0
- data/ext/rbs_extension/lexer.h +179 -0
- data/ext/rbs_extension/lexer.re +147 -0
- data/ext/rbs_extension/lexstate.c +175 -0
- data/ext/rbs_extension/location.c +325 -0
- data/ext/rbs_extension/location.h +85 -0
- data/ext/rbs_extension/main.c +33 -0
- data/ext/rbs_extension/parser.c +2973 -0
- data/ext/rbs_extension/parser.h +18 -0
- data/ext/rbs_extension/parserstate.c +397 -0
- data/ext/rbs_extension/parserstate.h +163 -0
- data/ext/rbs_extension/rbs_extension.h +31 -0
- data/ext/rbs_extension/unescape.c +32 -0
- data/goodcheck.yml +91 -0
- data/include/rbs/constants.h +82 -0
- data/include/rbs/ruby_objs.h +72 -0
- data/include/rbs/util/rbs_constant_pool.h +219 -0
- data/include/rbs.h +7 -0
- data/lib/rbs/ancestor_graph.rb +92 -0
- data/lib/rbs/annotate/annotations.rb +199 -0
- data/lib/rbs/annotate/formatter.rb +92 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +400 -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 +467 -0
- data/lib/rbs/ast/directives.rb +49 -0
- data/lib/rbs/ast/members.rb +451 -0
- data/lib/rbs/ast/type_param.rb +225 -0
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +67 -0
- data/lib/rbs/builtin_names.rb +58 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +83 -0
- data/lib/rbs/cli/validate.rb +357 -0
- data/lib/rbs/cli.rb +1223 -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 +218 -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 +258 -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 +401 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +620 -0
- data/lib/rbs/definition_builder/method_builder.rb +254 -0
- data/lib/rbs/definition_builder.rb +845 -0
- data/lib/rbs/diff.rb +125 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +829 -0
- data/lib/rbs/environment_loader.rb +173 -0
- data/lib/rbs/environment_walker.rb +155 -0
- data/lib/rbs/errors.rb +645 -0
- data/lib/rbs/factory.rb +18 -0
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/location_aux.rb +138 -0
- data/lib/rbs/locator.rb +243 -0
- data/lib/rbs/method_type.rb +143 -0
- data/lib/rbs/namespace.rb +125 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +114 -0
- data/lib/rbs/prototype/helpers.rb +140 -0
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +840 -0
- data/lib/rbs/prototype/rbi.rb +641 -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 +667 -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 +91 -0
- data/lib/rbs/sorter.rb +198 -0
- data/lib/rbs/substitution.rb +83 -0
- data/lib/rbs/subtractor.rb +201 -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 +435 -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 +109 -0
- data/lib/rbs/types.rb +1596 -0
- data/lib/rbs/unit_test/convertibles.rb +176 -0
- data/lib/rbs/unit_test/spy.rb +138 -0
- data/lib/rbs/unit_test/type_assertions.rb +347 -0
- data/lib/rbs/unit_test/with_aliases.rb +143 -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/writer.rb +424 -0
- data/lib/rbs.rb +94 -0
- data/lib/rdoc/discover.rb +20 -0
- data/lib/rdoc_plugin/parser.rb +163 -0
- data/rbs-relaxed.gemspec +48 -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 +36 -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 +82 -0
- data/sig/annotate/rdoc_source.rbs +30 -0
- data/sig/annotation.rbs +27 -0
- data/sig/buffer.rbs +32 -0
- data/sig/builtin_names.rbs +44 -0
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +21 -0
- data/sig/cli/validate.rbs +43 -0
- data/sig/cli.rbs +87 -0
- data/sig/collection/cleaner.rbs +13 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +66 -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 +267 -0
- data/sig/definition.rbs +173 -0
- data/sig/definition_builder.rbs +165 -0
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +77 -0
- data/sig/environment.rbs +279 -0
- data/sig/environment_loader.rbs +111 -0
- data/sig/environment_walker.rbs +65 -0
- data/sig/errors.rbs +405 -0
- data/sig/factory.rbs +5 -0
- data/sig/file_finder.rbs +28 -0
- data/sig/location.rbs +110 -0
- data/sig/locator.rbs +58 -0
- data/sig/manifest.yaml +7 -0
- data/sig/members.rbs +258 -0
- data/sig/method_builder.rbs +84 -0
- data/sig/method_types.rbs +58 -0
- data/sig/namespace.rbs +146 -0
- data/sig/parser.rbs +100 -0
- data/sig/prototype/helpers.rbs +27 -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 +35 -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/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 +110 -0
- data/sig/typename.rbs +79 -0
- data/sig/types.rbs +579 -0
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +30 -0
- data/sig/unit_test/type_assertions.rbs +196 -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/writer.rbs +127 -0
- data/src/constants.c +153 -0
- data/src/ruby_objs.c +795 -0
- data/src/util/rbs_constant_pool.c +342 -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 +1629 -0
- data/stdlib/bigdecimal-math/0/big_math.rbs +119 -0
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/cgi/0/core.rbs +1285 -0
- data/stdlib/cgi/0/manifest.yaml +3 -0
- data/stdlib/coverage/0/coverage.rbs +263 -0
- data/stdlib/csv/0/csv.rbs +3776 -0
- data/stdlib/csv/0/manifest.yaml +3 -0
- data/stdlib/date/0/date.rbs +1585 -0
- data/stdlib/date/0/date_time.rbs +616 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/dbm/0/dbm.rbs +421 -0
- data/stdlib/delegate/0/delegator.rbs +184 -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 +343 -0
- data/stdlib/digest/0/digest.rbs +577 -0
- data/stdlib/erb/0/erb.rbs +532 -0
- data/stdlib/etc/0/etc.rbs +865 -0
- data/stdlib/fileutils/0/fileutils.rbs +1734 -0
- data/stdlib/find/0/find.rbs +49 -0
- data/stdlib/forwardable/0/forwardable.rbs +268 -0
- data/stdlib/io-console/0/io-console.rbs +414 -0
- data/stdlib/ipaddr/0/ipaddr.rbs +428 -0
- data/stdlib/json/0/json.rbs +1916 -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 +5552 -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 +487 -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 +393 -0
- data/stdlib/open3/0/open3.rbs +147 -0
- data/stdlib/openssl/0/manifest.yaml +3 -0
- data/stdlib/openssl/0/openssl.rbs +12113 -0
- data/stdlib/optparse/0/optparse.rbs +1725 -0
- data/stdlib/pathname/0/pathname.rbs +1406 -0
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +300 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/stdlib/pstore/0/pstore.rbs +603 -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 +402 -0
- data/stdlib/psych/0/store.rbs +59 -0
- data/stdlib/pty/0/pty.rbs +237 -0
- data/stdlib/rdoc/0/code_object.rbs +51 -0
- data/stdlib/rdoc/0/comment.rbs +59 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +391 -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 +1830 -0
- data/stdlib/ripper/0/ripper.rbs +1648 -0
- data/stdlib/securerandom/0/securerandom.rbs +62 -0
- data/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/stdlib/singleton/0/singleton.rbs +131 -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 +92 -0
- data/stdlib/socket/0/socket.rbs +4157 -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 +79 -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 +567 -0
- data/stdlib/strscan/0/string_scanner.rbs +1627 -0
- data/stdlib/tempfile/0/tempfile.rbs +479 -0
- data/stdlib/time/0/time.rbs +432 -0
- data/stdlib/timeout/0/timeout.rbs +81 -0
- data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/stdlib/tsort/0/cyclic.rbs +5 -0
- data/stdlib/tsort/0/interfaces.rbs +20 -0
- data/stdlib/tsort/0/tsort.rbs +409 -0
- data/stdlib/uri/0/common.rbs +582 -0
- data/stdlib/uri/0/file.rbs +118 -0
- data/stdlib/uri/0/ftp.rbs +13 -0
- data/stdlib/uri/0/generic.rbs +1108 -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 +210 -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 +166 -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 +200 -0
- metadata +532 -0
data/docs/collection.md
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
# RBS Collection manager
|
2
|
+
|
3
|
+
`rbs collection` sub command manages third party gems' RBS. In short, it is `bundler` for RBS.
|
4
|
+
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
* `git(1)`
|
8
|
+
* `Gemfile.lock`
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
### Setup
|
13
|
+
|
14
|
+
First, generate the configuration file, `rbs_collection.yaml`, with `rbs collection init`.
|
15
|
+
|
16
|
+
```console
|
17
|
+
$ rbs collection init
|
18
|
+
created: rbs_collection.yaml
|
19
|
+
|
20
|
+
$ cat rbs_collection.yaml
|
21
|
+
# Download sources
|
22
|
+
sources:
|
23
|
+
- name: ruby/gem_rbs_collection
|
24
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
25
|
+
revision: main
|
26
|
+
repo_dir: gems
|
27
|
+
|
28
|
+
# A directory to install the downloaded RBSs
|
29
|
+
path: .gem_rbs_collection
|
30
|
+
|
31
|
+
# gems:
|
32
|
+
# # If you want to avoid installing rbs files for gems, you can specify them here.
|
33
|
+
# - name: GEM_NAME
|
34
|
+
# ignore: true
|
35
|
+
```
|
36
|
+
|
37
|
+
I also recommend updating `.gitignore`.
|
38
|
+
|
39
|
+
```console
|
40
|
+
$ echo /.gem_rbs_collection/ >> .gitignore
|
41
|
+
```
|
42
|
+
|
43
|
+
### Install dependencies
|
44
|
+
|
45
|
+
Then, install gems' RBS with `rbs collection install`! It copies RBS from [the gem RBS repository](https://github.com/ruby/gem_rbs_collection) to `.gem_rbs_collection/` directory by default.
|
46
|
+
I recommend to ignore `.gem_rbs_collection/` from version control system, such as Git.
|
47
|
+
|
48
|
+
```console
|
49
|
+
$ rbs collection install
|
50
|
+
Installing ast:2.4 (ruby/gem_rbs_collection@4b1a2a2f64c)
|
51
|
+
...
|
52
|
+
It's done! 42 gems's RBSs now installed.
|
53
|
+
```
|
54
|
+
|
55
|
+
Finally the third party RBSs are available! `rbs` commands, such as `rbs validate`, automatically load the third party RBSs.
|
56
|
+
|
57
|
+
### Other commands
|
58
|
+
|
59
|
+
`rbs collection` has two more commands.
|
60
|
+
|
61
|
+
* `rbs collection update` updates `rbs_collection.lock.yaml`.
|
62
|
+
* `rbs collection clean` removes unnecessary rbs from `.gem_rbs_collection` directory.
|
63
|
+
|
64
|
+
## Configuration
|
65
|
+
|
66
|
+
### `rbs_collection.yaml`
|
67
|
+
|
68
|
+
Configure `rbs collection` with editing `rbs_collection.yaml`.
|
69
|
+
|
70
|
+
```yaml
|
71
|
+
# rbs_collection.yaml
|
72
|
+
|
73
|
+
# Download sources.
|
74
|
+
# You can add own collection git repository.
|
75
|
+
sources:
|
76
|
+
- name: ruby/gem_rbs_collection
|
77
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
78
|
+
revision: main
|
79
|
+
repo_dir: gems
|
80
|
+
|
81
|
+
# You can also add a local path as a collection source optionally.
|
82
|
+
- type: local
|
83
|
+
path: path/to/local/dir
|
84
|
+
|
85
|
+
# A directory to install the downloaded RBSs
|
86
|
+
path: .gem_rbs_collection
|
87
|
+
|
88
|
+
gems:
|
89
|
+
# If the Gemfile.lock doesn't contain csv gem but you use csv gem,
|
90
|
+
# you can write the gem name explicitly to install RBS of the gem.
|
91
|
+
- name: csv
|
92
|
+
|
93
|
+
# If the Gemfile.lock contains nokogiri gem but you don't want to use the RBS,
|
94
|
+
# you can ignore the gem.
|
95
|
+
# `rbs collection` avoids to install nokogiri gem's RBS by this change.
|
96
|
+
# It is useful if the nokogiri RBS has a problem, such as compatibility issue with other RBS.
|
97
|
+
- name: nokogiri
|
98
|
+
ignore: true
|
99
|
+
```
|
100
|
+
|
101
|
+
### Avoid installing RBS
|
102
|
+
|
103
|
+
There are two ways to avoid RBS installation.
|
104
|
+
|
105
|
+
#### `require: false` in `Gemfile`
|
106
|
+
|
107
|
+
First, you can specify `require: false` in `Gemfile`. It is the recommended way to avoid installing RBS.
|
108
|
+
For example:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
# Gemfile
|
112
|
+
|
113
|
+
gem 'GEM_NAME', require: false
|
114
|
+
```
|
115
|
+
|
116
|
+
In this case, `rbs collection` doesn't install the RBS of `GEM_NAME`.
|
117
|
+
We recommend to specify `require: false` for `rbs` gem itself because `rbs` gem's RBS file is not necessary in most cases.
|
118
|
+
|
119
|
+
#### `ignore: true` in `rbs_collection.yaml`
|
120
|
+
|
121
|
+
Second, you can write `ignore: true` in `rbs_collection.yaml`. It is useful if you want to avoid installing RBS but you need to require the gem.
|
122
|
+
|
123
|
+
```yaml
|
124
|
+
# rbs_collection.yaml
|
125
|
+
|
126
|
+
gems:
|
127
|
+
- name: GEM_NAME
|
128
|
+
ignore: true
|
129
|
+
```
|
130
|
+
|
131
|
+
#### Load RBS specified `require: false`
|
132
|
+
|
133
|
+
You can also use `ignore: false` if you want to install RBS for a gem which you specify `require: false` in `Gemfile`.
|
134
|
+
For example:
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
# Gemfile
|
138
|
+
|
139
|
+
gem 'GEM_NAME', require: false
|
140
|
+
```
|
141
|
+
|
142
|
+
```yaml
|
143
|
+
# rbs_collection.yaml
|
144
|
+
|
145
|
+
gems:
|
146
|
+
- name: GEM_NAME
|
147
|
+
ignore: false
|
148
|
+
```
|
149
|
+
|
150
|
+
In this case, `rbs collection` installs the RBS of `GEM_NAME`.
|
151
|
+
|
152
|
+
### `manifest.yaml`
|
153
|
+
|
154
|
+
If you are a gem maintainer, you can write `manifest.yaml`.
|
155
|
+
You need to put the file if the gem has implicit dependencies, which don't appear in `Gemfile.lock`. You have to write standard libraries' dependencies in most cases.
|
156
|
+
For example:
|
157
|
+
|
158
|
+
```yaml
|
159
|
+
# manifest.yaml
|
160
|
+
|
161
|
+
dependencies:
|
162
|
+
# If your gem depends on pathname but the gemspec doesn't include pathname,
|
163
|
+
# you need to write the following.
|
164
|
+
- name: pathname
|
165
|
+
```
|
166
|
+
|
167
|
+
If the gem's RBS is managed with [ruby/gem_rbs_collection](https://github.com/ruby/gem_rbs_collection), put it as `gems/GEM_NAME/VERSION/manifest.yaml`. For example, `gems/activesupport/6.0/manifest.yaml`.
|
168
|
+
If the gem's RBS is included in the gem package, put it as `sig/manifest.yaml`.
|
169
|
+
|
170
|
+
|
171
|
+
## Files / Directories
|
172
|
+
|
173
|
+
* `rbs_collection.yaml`
|
174
|
+
* The configuration file.
|
175
|
+
* You need to edit it if:
|
176
|
+
* You don't want to ignore gem's RBS.
|
177
|
+
* You want to add gem's RBS explicitly.
|
178
|
+
* You can change the file path with `--collection` option. e.g. `rbs --collection another_conf.yaml collection install`.
|
179
|
+
* `rbs_collection.lock.yaml`
|
180
|
+
* RBS installs and loads RBS files with this file.
|
181
|
+
* It is auto-generated file. Do not edit this file.
|
182
|
+
* I recommend to manage it with VCS such as git.
|
183
|
+
* `.gem_rbs_collection/`
|
184
|
+
* RBS installs third party RBS files to the directory.
|
185
|
+
* I recommend to ignore it from VCS.
|
186
|
+
* You can change the path with `path` option of `rbs_collection.yaml` file.
|
187
|
+
|
188
|
+
|
189
|
+
## How it works
|
190
|
+
|
191
|
+
`rbs collection` is integrated with Bundler.
|
192
|
+
`rbs collection install` command generates `gem_rbs_collection.lock.yaml` from `gem_rbs_collection.yaml` and `Gemfile.lock`. It uses `Gemfile.lock` to detects dependencies.
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# Using `Data` and `Struct`
|
2
|
+
|
3
|
+
`Data` and `Struct` are commonly used utilities to define simple *value* objects. The objects have attributes, and the equality between the two objects are defined by equality of the attributes. (Note that we can define additional methods and overwrite the equality definitions when we want.)
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
# Defines `Measure` class with `#amount` and `#unit` attributes
|
7
|
+
Measure = Data.define(:amount, :unit)
|
8
|
+
```
|
9
|
+
|
10
|
+
Unfortunately, supporting `Data` and `Struct` in RBS is not straightforward. You have to write down the attribute definitions and initializers in RBS.
|
11
|
+
|
12
|
+
```rbs
|
13
|
+
class Measure
|
14
|
+
# `attr_accessor amount: Integer` in the case of Struct
|
15
|
+
attr_reader amount: Integer
|
16
|
+
|
17
|
+
# `attr_accessor unit: String` in the case of Struct
|
18
|
+
attr_reader unit: String
|
19
|
+
|
20
|
+
def initialize: (Integer amount, String unit) -> void
|
21
|
+
| (amount: Integer, unit: String) -> void
|
22
|
+
end
|
23
|
+
```
|
24
|
+
|
25
|
+
This is simplified definition of the `Measure` class, for the case you only use the attributes and initializers. You can add more method definitions or inherit from `Data` class to make the definition more complete.
|
26
|
+
|
27
|
+
However, it's common that you don't need all of the `Data` and `Struct` methods, like `.members` and `.[]`. When you are using those utility classes just for the attributes methods, you can simply ignore other methods or skip specifying a super class.
|
28
|
+
|
29
|
+
> You may want to implement a generator that understands `Data.define` and `Struct.new`. But even with the generator, you need to edit the generated RBS files so that the attribute definitions have correct types.
|
30
|
+
|
31
|
+
## Type checking class definitions using `Data` and `Struct`
|
32
|
+
|
33
|
+
If you use Steep, you may need additional annotation in Ruby implementation.
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
# Type error because return type of `Data.define(...)` is not `singleton(Measure)`
|
37
|
+
Measure = Data.define(:amount, :unit)
|
38
|
+
```
|
39
|
+
|
40
|
+
You can please the type checker by adding a cast (`_`) or define the class inheriting from `Data.define(...)`.
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
# Skip type checking by assigning to `_`
|
44
|
+
Measure = _ = Data.define(:amount, :unit)
|
45
|
+
|
46
|
+
# Super class is not type checked by Steep
|
47
|
+
class Measure < Data.define(:amount, :unit)
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
@soutaro has prefered inheriting from `Data.define`, but you may find an extra annonymous class in `.ancestors` [^1].
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
Measure.ancestors #=> [Measure, #<Class:0xOOF>, Data, ...]
|
55
|
+
```
|
56
|
+
|
57
|
+
[^1]: [Shannon Skipper](https://github.com/havenwood) told me it in Discord
|
58
|
+
|
59
|
+
## Generate prototype for `Data` and `Struct`
|
60
|
+
|
61
|
+
RBS prototypes for classes using `Data` and `Struct` can be generated by `rbs prototype runtime`.
|
62
|
+
|
63
|
+
```rb
|
64
|
+
# t.rb
|
65
|
+
class Measure < Data.define(:amount, :unit)
|
66
|
+
end
|
67
|
+
```
|
68
|
+
|
69
|
+
```
|
70
|
+
$ bundle exec rbs prototype runtime -R t.rb Measure
|
71
|
+
class Measure < ::Data
|
72
|
+
def self.new: (untyped amount, untyped unit) -> instance
|
73
|
+
| (amount: untyped, unit: untyped) -> instance
|
74
|
+
|
75
|
+
def self.[]: (untyped amount, untyped unit) -> instance
|
76
|
+
| (amount: untyped, unit: untyped) -> instance
|
77
|
+
|
78
|
+
def self.members: () -> [ :amount, :unit ]
|
79
|
+
|
80
|
+
def members: () -> [ :amount, :unit ]
|
81
|
+
|
82
|
+
attr_reader amount: untyped
|
83
|
+
|
84
|
+
attr_reader unit: untyped
|
85
|
+
end
|
86
|
+
```
|
data/docs/gem.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Releasing a gem with RBS
|
2
|
+
|
3
|
+
You can release the RBS type definition of your gem included in the gem package. Just add your RBS files inside `/sig` directory, put them in your rubygem package, and release a new version. RBS gem will load the RBS files from your gem package automatically.
|
4
|
+
|
5
|
+
## `/sig` directory
|
6
|
+
|
7
|
+
RBS gem tries to load a type definition of a gem from gem package first. It checks if there is `/sig` directory in the gem package and loads `*.rbs` files from the directory. So, everything you have to do to make your type definition available are:
|
8
|
+
|
9
|
+
1. Add `/sig` directory in your gem package
|
10
|
+
2. Put your RBS files inside the directory
|
11
|
+
3. Make sure the RBS files are included in the gem package
|
12
|
+
|
13
|
+
### Hidden RBS files
|
14
|
+
|
15
|
+
If you have RBS files you don't want to export to the gem users, you can put the files under a directory that starts with `_``.
|
16
|
+
|
17
|
+
Assume you have three RBS files in your gem package:
|
18
|
+
|
19
|
+
* `/sig/foo.rbs`
|
20
|
+
* `/sig/bar/baz.rbs`
|
21
|
+
* `/sig/_private/internal.rbs`
|
22
|
+
|
23
|
+
`foo.rbs` and `baz.rbs` will be loaded from the gem package, but the `internal.rbs` will be skipped. This is only when you load RBS files of a *library*, for example through `-r` option given to `rbs` command. If you load RBS files as *source code*, for example through `-I` option given to `rbs` command, the hidden RBS files will be loaded too.
|
24
|
+
|
25
|
+
* `rbs -r your-gem` => Loading a library
|
26
|
+
* `rbs -I sig` => Loading RBS files as source code
|
27
|
+
|
28
|
+
### Adding `manifest.yaml`
|
29
|
+
|
30
|
+
`manifest.yaml` lets you declare dependencies to standard libraries. Here is an example, from [RBS gem](https://github.com/ruby/rbs/blob/6b3d0f976a50b3974d0bff26ea8fa9931053f38b/sig/manifest.yaml).
|
31
|
+
|
32
|
+
```yaml
|
33
|
+
dependencies:
|
34
|
+
- name: json
|
35
|
+
- name: logger
|
36
|
+
- name: optparse
|
37
|
+
- name: pathname
|
38
|
+
- name: rdoc
|
39
|
+
- name: tsort
|
40
|
+
```
|
41
|
+
|
42
|
+
Note that you don't have to write the dependencies that are included in your `.gemspec`. RBS will detect the dependencies between gems, declared in `.gemspec`. `manifest.yaml` is a material for undeclared dependencies, which usually is for standard libraries.
|
43
|
+
|
44
|
+
## Testing your type definition
|
45
|
+
|
46
|
+
If you develop your gem using a static type checker, like [Steep](https://github.com/soutaro/steep), your type definition will be (mostly) correct and reliable. If not, we strongly recommend adding extra tests focusing on the RBS type definitions.
|
47
|
+
|
48
|
+
`RBS::UnitTest` is a library to do that. `assert_send_type` is the most important assertion.
|
49
|
+
|
50
|
+
```rb
|
51
|
+
assert_send_type '(Regexp) { (String) -> String } -> String',
|
52
|
+
'hello', :gsub, /hello/, &proc { "foo" }
|
53
|
+
```
|
54
|
+
|
55
|
+
It calls `String#gsub` method and confirms if given arguments and the return value has correct types.
|
56
|
+
|
57
|
+
You can find examples under `test/stdlib` directory of [RBS repository](https://github.com/ruby/rbs/blob/6b3d0f976a50b3974d0bff26ea8fa9931053f38b/test/stdlib/String_test.rb).
|
@@ -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[Elem]
|
111
|
+
def *: (String) -> String
|
112
|
+
| (Integer) -> Array[Elem]
|
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 `Elem` (in our example case, `Elem` 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[Elem]
|
154
|
+
def first: () -> Elem?
|
155
|
+
| (Integer) -> Array[Elem]
|
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 `Elem`, 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 `(Elem | 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[Elem]
|
226
|
+
def filter: () { (Elem) -> boolish } -> ::Array[Elem]
|
227
|
+
| () -> ::Enumerator[Elem, ::Array[Elem]]
|
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[Elem]
|
268
|
+
def collect: [U] () { (Elem) -> U } -> Array[U]
|
269
|
+
| () -> Enumerator[Elem, 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 `Elem`, 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[Elem]
|
288
|
+
def partition: () { (Elem) -> boolish } -> [Array[Elem], Array[Elem]]
|
289
|
+
| () -> ::Enumerator[Elem, [Array[Elem], Array[Elem] ]]
|
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[Elem]
|
304
|
+
def to_h: () -> ::Hash[untyped, untyped]
|
305
|
+
| [T, U] () { (Elem) -> [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.
|