rbs 2.8.4 → 3.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +12 -4
- data/.github/workflows/comments.yml +11 -11
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/ruby.yml +40 -49
- data/.github/workflows/typecheck.yml +36 -0
- data/.github/workflows/windows.yml +28 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +42 -2
- data/CHANGELOG.md +845 -1
- data/README.md +64 -4
- data/Rakefile +198 -18
- data/Steepfile +11 -11
- data/config.yml +311 -0
- data/core/array.rbs +2189 -1914
- data/core/basic_object.rbs +59 -84
- data/core/binding.rbs +7 -69
- data/core/builtin.rbs +210 -11
- data/core/class.rbs +37 -0
- data/core/comparable.rbs +23 -25
- data/core/complex.rbs +449 -227
- data/core/constants.rbs +29 -21
- data/core/data.rbs +415 -0
- data/core/dir.rbs +698 -415
- data/core/encoding.rbs +468 -843
- data/core/enumerable.rbs +495 -455
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +106 -9
- data/core/env.rbs +1 -1
- data/core/errno.rbs +506 -605
- data/core/errors.rbs +15 -17
- data/core/exception.rbs +361 -145
- data/core/false_class.rbs +39 -26
- data/core/fiber.rbs +121 -14
- data/core/file.rbs +1262 -320
- data/core/file_test.rbs +62 -45
- data/core/float.rbs +187 -208
- data/core/gc.rbs +446 -196
- data/core/global_variables.rbs +29 -29
- data/core/hash.rbs +242 -349
- data/core/integer.rbs +246 -308
- data/core/io/buffer.rbs +373 -122
- data/core/io/wait.rbs +29 -17
- data/core/io.rbs +1881 -1518
- data/core/kernel.rbs +2116 -1538
- data/core/marshal.rbs +24 -14
- data/core/match_data.rbs +413 -166
- data/core/math.rbs +531 -291
- data/core/method.rbs +101 -32
- data/core/module.rbs +228 -64
- data/core/nil_class.rbs +106 -47
- data/core/numeric.rbs +206 -292
- data/core/object.rbs +73 -1168
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +5 -3
- data/core/proc.rbs +280 -39
- data/core/process.rbs +1318 -658
- data/core/ractor.rbs +200 -134
- data/core/random.rbs +21 -4
- data/core/range.rbs +309 -153
- data/core/rational.rbs +4 -12
- data/core/rb_config.rbs +64 -43
- data/core/rbs/unnamed/argf.rbs +411 -147
- data/core/rbs/unnamed/env_class.rbs +137 -253
- data/core/rbs/unnamed/random.rbs +49 -26
- data/core/refinement.rbs +16 -1
- data/core/regexp.rbs +1568 -862
- data/core/ruby_vm.rbs +719 -7
- data/core/rubygems/config_file.rbs +3 -0
- data/core/rubygems/errors.rbs +69 -6
- data/core/rubygems/rubygems.rbs +71 -17
- data/core/rubygems/version.rbs +11 -7
- data/{stdlib/set/0 → core}/set.rbs +80 -91
- data/core/signal.rbs +14 -8
- data/core/string.rbs +1732 -1607
- data/core/struct.rbs +467 -95
- data/core/symbol.rbs +215 -245
- data/core/thread.rbs +133 -89
- data/core/thread_group.rbs +9 -9
- data/core/time.rbs +1141 -841
- data/core/trace_point.rbs +181 -121
- data/core/true_class.rbs +58 -32
- data/core/unbound_method.rbs +103 -30
- data/core/warning.rbs +50 -5
- data/docs/CONTRIBUTING.md +1 -1
- data/docs/architecture.md +110 -0
- data/docs/collection.md +59 -5
- data/docs/data_and_struct.md +86 -0
- data/docs/gem.md +57 -0
- data/docs/rbs_by_example.md +16 -35
- data/docs/repo.md +1 -1
- data/docs/sigs.md +7 -7
- data/docs/stdlib.md +63 -5
- data/docs/syntax.md +255 -61
- data/docs/tools.md +1 -0
- data/ext/rbs_extension/extconf.rb +10 -0
- data/ext/rbs_extension/lexer.c +1741 -1548
- data/ext/rbs_extension/lexer.h +11 -1
- data/ext/rbs_extension/lexer.re +12 -6
- data/ext/rbs_extension/lexstate.c +26 -3
- data/ext/rbs_extension/location.c +119 -111
- data/ext/rbs_extension/location.h +32 -7
- data/ext/rbs_extension/main.c +3 -0
- data/ext/rbs_extension/parser.c +883 -481
- data/ext/rbs_extension/parserstate.c +65 -25
- data/ext/rbs_extension/parserstate.h +13 -3
- data/ext/rbs_extension/rbs_extension.h +1 -10
- data/ext/rbs_extension/unescape.c +7 -47
- data/goodcheck.yml +2 -2
- data/{ext/rbs_extension → include/rbs}/constants.h +26 -15
- data/include/rbs/ruby_objs.h +72 -0
- data/include/rbs.h +7 -0
- data/lib/rbs/annotate/annotations.rb +3 -3
- data/lib/rbs/annotate/formatter.rb +13 -3
- data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
- data/lib/rbs/annotate/rdoc_source.rb +12 -3
- data/lib/rbs/ast/declarations.rb +85 -2
- data/lib/rbs/ast/directives.rb +39 -0
- data/lib/rbs/ast/members.rb +49 -15
- data/lib/rbs/ast/type_param.rb +104 -15
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +5 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +83 -0
- data/lib/rbs/cli/validate.rb +356 -0
- data/lib/rbs/cli.rb +253 -143
- data/lib/rbs/collection/cleaner.rb +8 -1
- data/lib/rbs/collection/config/lockfile.rb +92 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +154 -65
- data/lib/rbs/collection/config.rb +19 -46
- data/lib/rbs/collection/installer.rb +12 -13
- data/lib/rbs/collection/sources/base.rb +2 -2
- data/lib/rbs/collection/sources/git.rb +146 -69
- data/lib/rbs/collection/sources/local.rb +81 -0
- data/lib/rbs/collection/sources/rubygems.rb +10 -12
- data/lib/rbs/collection/sources/stdlib.rb +14 -13
- data/lib/rbs/collection/sources.rb +15 -2
- data/lib/rbs/collection.rb +2 -1
- data/lib/rbs/definition.rb +13 -16
- data/lib/rbs/definition_builder/ancestor_builder.rb +100 -24
- data/lib/rbs/definition_builder/method_builder.rb +4 -4
- data/lib/rbs/definition_builder.rb +489 -584
- data/lib/rbs/diff.rb +125 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +406 -105
- data/lib/rbs/environment_loader.rb +48 -44
- data/lib/rbs/environment_walker.rb +1 -1
- data/lib/rbs/errors.rb +175 -56
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/location_aux.rb +8 -7
- data/lib/rbs/locator.rb +37 -15
- data/lib/rbs/method_type.rb +23 -0
- data/lib/rbs/namespace.rb +1 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +22 -13
- data/lib/rbs/prototype/helpers.rb +48 -22
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +125 -31
- data/lib/rbs/prototype/rbi.rb +49 -36
- 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 +273 -159
- data/lib/rbs/resolver/constant_resolver.rb +24 -8
- data/lib/rbs/resolver/type_name_resolver.rb +41 -7
- data/lib/rbs/sorter.rb +153 -123
- data/lib/rbs/substitution.rb +19 -0
- data/lib/rbs/subtractor.rb +201 -0
- data/lib/rbs/test/errors.rb +24 -11
- data/lib/rbs/test/guaranteed.rb +30 -0
- data/lib/rbs/test/hook.rb +45 -40
- data/lib/rbs/test/setup.rb +1 -1
- data/lib/rbs/test/tester.rb +1 -1
- data/lib/rbs/test/type_check.rb +120 -23
- data/lib/rbs/test.rb +6 -3
- data/lib/rbs/type_alias_dependency.rb +13 -3
- data/lib/rbs/type_alias_regularity.rb +21 -14
- data/lib/rbs/type_name.rb +18 -13
- data/lib/rbs/types.rb +352 -18
- data/lib/rbs/unit_test/convertibles.rb +176 -0
- data/lib/rbs/unit_test/spy.rb +136 -0
- data/lib/rbs/unit_test/type_assertions.rb +341 -0
- data/lib/rbs/unit_test/with_aliases.rb +143 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/validator.rb +55 -30
- data/lib/rbs/variance_calculator.rb +26 -23
- data/lib/rbs/vendorer.rb +3 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +69 -22
- data/lib/rbs.rb +7 -2
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +5 -5
- data/rbs.gemspec +12 -2
- data/schema/decls.json +1 -1
- data/schema/members.json +15 -10
- data/sig/ancestor_builder.rbs +4 -0
- data/sig/ancestor_graph.rbs +22 -2
- data/sig/annotate/formatter.rbs +2 -2
- data/sig/annotate/rdoc_annotater.rbs +1 -1
- 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 +4 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +66 -0
- data/sig/collection/config.rbs +5 -48
- data/sig/collection/installer.rbs +1 -1
- data/sig/collection/sources.rbs +105 -33
- data/sig/constant.rbs +1 -1
- data/sig/declarations.rbs +42 -3
- data/sig/definition.rbs +26 -10
- data/sig/definition_builder.rbs +103 -81
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +61 -0
- data/sig/environment.rbs +175 -29
- data/sig/environment_loader.rbs +20 -18
- data/sig/errors.rbs +123 -2
- data/sig/file_finder.rbs +28 -0
- data/sig/location.rbs +0 -3
- data/sig/locator.rbs +14 -2
- data/sig/manifest.yaml +0 -1
- data/sig/members.rbs +32 -9
- data/sig/method_types.rbs +10 -4
- data/sig/namespace.rbs +2 -3
- data/sig/parser.rbs +55 -16
- data/sig/prototype/helpers.rbs +4 -0
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/prototype/rb.rbs +10 -2
- data/sig/prototype/rbi.rbs +2 -0
- data/sig/prototype/runtime.rbs +182 -0
- data/sig/rbs.rbs +1 -1
- data/sig/rdoc/rbs.rbs +4 -0
- data/sig/repository.rbs +7 -5
- data/sig/resolver/constant_resolver.rbs +3 -4
- data/sig/resolver/context.rbs +1 -1
- data/sig/resolver/type_name_resolver.rbs +5 -1
- data/sig/shims/bundler.rbs +38 -0
- data/sig/shims/rubygems.rbs +19 -0
- data/sig/sorter.rbs +23 -5
- data/sig/substitution.rbs +6 -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 +31 -0
- data/sig/type_alias_regularity.rbs +12 -6
- data/sig/type_param.rbs +45 -9
- data/sig/typename.rbs +8 -5
- data/sig/types.rbs +119 -12
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +28 -0
- data/sig/unit_test/type_assertions.rbs +194 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/sig/use_map.rbs +35 -0
- data/sig/validator.rbs +12 -5
- data/sig/variance_calculator.rbs +3 -1
- data/sig/vendorer.rbs +1 -1
- data/sig/visitor.rbs +47 -0
- data/sig/writer.rbs +6 -2
- data/src/constants.c +153 -0
- data/src/ruby_objs.c +793 -0
- data/stdlib/base64/0/base64.rbs +298 -45
- data/stdlib/benchmark/0/benchmark.rbs +12 -3
- data/stdlib/bigdecimal/0/big_decimal.rbs +62 -198
- data/stdlib/cgi/0/core.rbs +68 -15
- data/stdlib/cgi/0/manifest.yaml +1 -0
- data/stdlib/coverage/0/coverage.rbs +50 -11
- data/stdlib/csv/0/csv.rbs +90 -119
- data/stdlib/csv/0/manifest.yaml +1 -0
- data/stdlib/date/0/date.rbs +806 -735
- data/stdlib/date/0/date_time.rbs +70 -211
- data/stdlib/dbm/0/dbm.rbs +0 -2
- 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 +3 -8
- data/stdlib/digest/0/digest.rbs +48 -35
- data/stdlib/erb/0/erb.rbs +15 -39
- data/stdlib/etc/0/etc.rbs +174 -54
- data/stdlib/fileutils/0/fileutils.rbs +1234 -385
- data/stdlib/forwardable/0/forwardable.rbs +4 -4
- data/stdlib/io-console/0/io-console.rbs +82 -17
- data/stdlib/ipaddr/0/ipaddr.rbs +11 -6
- data/stdlib/json/0/json.rbs +434 -151
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/logger/0/formatter.rbs +0 -2
- data/stdlib/logger/0/log_device.rbs +1 -3
- data/stdlib/logger/0/logger.rbs +465 -328
- data/stdlib/minitest/0/kernel.rbs +2 -2
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +4 -1
- data/stdlib/minitest/0/minitest/assertion.rbs +1 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +58 -13
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +7 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +8 -8
- data/stdlib/minitest/0/minitest/benchmark.rbs +17 -16
- 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/mock.rbs +9 -5
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +4 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +0 -1
- data/stdlib/minitest/0/minitest/pride_io.rbs +8 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +2 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +1 -1
- data/stdlib/minitest/0/minitest/reportable.rbs +2 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +33 -1
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +1 -1
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +10 -6
- data/stdlib/minitest/0/minitest/spec.rbs +1 -1
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +0 -7
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +7 -7
- data/stdlib/minitest/0/minitest/test.rbs +7 -14
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +2 -0
- data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/stdlib/minitest/0/minitest/unit.rbs +1 -2
- data/stdlib/minitest/0/minitest.rbs +41 -892
- data/stdlib/monitor/0/monitor.rbs +91 -10
- data/stdlib/mutex_m/0/mutex_m.rbs +0 -2
- data/stdlib/net-http/0/manifest.yaml +1 -1
- data/stdlib/net-http/0/net-http.rbs +3858 -964
- 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 +35 -5
- data/stdlib/objspace/0/objspace.rbs +40 -18
- 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 +1 -0
- data/stdlib/openssl/0/openssl.rbs +681 -316
- data/stdlib/optparse/0/optparse.rbs +100 -65
- data/stdlib/pathname/0/pathname.rbs +24 -15
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +300 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +2 -6
- data/stdlib/pstore/0/pstore.rbs +370 -156
- data/stdlib/psych/0/core_ext.rbs +12 -0
- data/stdlib/{yaml → psych}/0/dbm.rbs +3 -3
- data/stdlib/psych/0/manifest.yaml +3 -0
- data/stdlib/psych/0/psych.rbs +402 -0
- data/stdlib/{yaml → psych}/0/store.rbs +2 -2
- data/stdlib/pty/0/pty.rbs +63 -11
- 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 +13 -380
- 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/resolv.rbs +16 -79
- data/stdlib/ripper/0/ripper.rbs +1648 -0
- data/stdlib/securerandom/0/securerandom.rbs +7 -2
- data/stdlib/shellwords/0/shellwords.rbs +11 -12
- data/stdlib/singleton/0/singleton.rbs +0 -3
- data/stdlib/socket/0/addrinfo.rbs +13 -18
- data/stdlib/socket/0/basic_socket.rbs +5 -10
- data/stdlib/socket/0/ip_socket.rbs +0 -2
- data/stdlib/socket/0/socket.rbs +77 -46
- data/stdlib/socket/0/tcp_server.rbs +0 -5
- data/stdlib/socket/0/tcp_socket.rbs +36 -3
- data/stdlib/socket/0/udp_socket.rbs +4 -5
- data/stdlib/socket/0/unix_server.rbs +0 -5
- data/stdlib/socket/0/unix_socket.rbs +2 -4
- data/{core/string_io.rbs → stdlib/stringio/0/stringio.rbs} +188 -107
- data/stdlib/strscan/0/string_scanner.rbs +1269 -425
- data/stdlib/tempfile/0/tempfile.rbs +224 -61
- data/stdlib/time/0/time.rbs +48 -35
- data/stdlib/timeout/0/timeout.rbs +17 -8
- data/stdlib/tmpdir/0/tmpdir.rbs +10 -3
- data/stdlib/tsort/0/tsort.rbs +0 -4
- data/stdlib/uri/0/common.rbs +271 -144
- data/stdlib/uri/0/file.rbs +5 -0
- data/stdlib/uri/0/ftp.rbs +1 -1
- data/stdlib/uri/0/generic.rbs +26 -22
- data/stdlib/uri/0/http.rbs +4 -4
- data/stdlib/uri/0/ldap.rbs +1 -1
- data/stdlib/uri/0/mailto.rbs +84 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
- data/stdlib/yaml/0/manifest.yaml +1 -2
- data/stdlib/yaml/0/yaml.rbs +1 -199
- 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 +1 -3
- data/stdlib/zlib/0/zstream.rbs +200 -0
- data/templates/include/rbs/constants.h.erb +20 -0
- data/templates/include/rbs/ruby_objs.h.erb +10 -0
- data/templates/src/constants.c.erb +36 -0
- data/templates/src/ruby_objs.c.erb +27 -0
- data/templates/template.rb +122 -0
- metadata +136 -36
- data/Gemfile +0 -33
- data/Gemfile.lock +0 -118
- data/core/deprecated.rbs +0 -9
- data/ext/rbs_extension/constants.c +0 -135
- data/ext/rbs_extension/ruby_objs.c +0 -525
- data/ext/rbs_extension/ruby_objs.h +0 -43
- data/lib/rbs/constant_table.rb +0 -167
- data/lib/rbs/parser_compat/lexer_error.rb +0 -6
- data/lib/rbs/parser_compat/located_value.rb +0 -7
- data/lib/rbs/parser_compat/semantics_error.rb +0 -6
- data/lib/rbs/parser_compat/syntax_error.rb +0 -6
- data/lib/rbs/test/spy.rb +0 -6
- data/lib/rbs/type_name_resolver.rb +0 -67
- data/sig/constant_table.rbs +0 -30
- data/sig/shims/abstract_syntax_tree.rbs +0 -25
- data/sig/shims/pp.rbs +0 -3
- data/sig/shims/ripper.rbs +0 -8
- data/sig/shims.rbs +0 -69
- data/sig/type_name_resolver.rbs +0 -26
- data/stdlib/minitest/0/manifest.yaml +0 -2
- data/stdlib/prime/0/integer-extension.rbs +0 -41
- data/stdlib/prime/0/manifest.yaml +0 -2
- data/stdlib/prime/0/prime.rbs +0 -372
data/core/true_class.rbs
CHANGED
@@ -1,72 +1,98 @@
|
|
1
1
|
# <!-- rdoc-file=object.c -->
|
2
|
-
# The
|
3
|
-
#
|
4
|
-
#
|
2
|
+
# The class of the singleton object `true`.
|
3
|
+
#
|
4
|
+
# Several of its methods act as operators:
|
5
|
+
#
|
6
|
+
# * #&
|
7
|
+
# * #|
|
8
|
+
# * #===
|
9
|
+
# * #^
|
10
|
+
#
|
11
|
+
# One other method:
|
12
|
+
#
|
13
|
+
# * #to_s and its alias #inspect.
|
5
14
|
#
|
6
15
|
class TrueClass
|
7
|
-
public
|
8
|
-
|
9
16
|
def !: () -> false
|
10
17
|
|
11
18
|
# <!--
|
12
19
|
# rdoc-file=object.c
|
13
|
-
# - true &
|
20
|
+
# - true & object -> true or false
|
14
21
|
# -->
|
15
|
-
#
|
22
|
+
# Returns `false` if `object` is `false` or `nil`, `true` otherwise:
|
23
|
+
#
|
24
|
+
# true & Object.new # => true true & false # => false true & nil #
|
25
|
+
# => false
|
16
26
|
#
|
17
|
-
def &: (nil) -> false
|
18
|
-
| (
|
19
|
-
| (untyped obj) -> true
|
27
|
+
def &: (false | nil) -> false
|
28
|
+
| (untyped obj) -> bool
|
20
29
|
|
21
30
|
# <!--
|
22
31
|
# rdoc-file=object.c
|
23
|
-
# -
|
32
|
+
# - true === other -> true or false
|
33
|
+
# - false === other -> true or false
|
34
|
+
# - nil === other -> true or false
|
24
35
|
# -->
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
36
|
+
# Returns `true` or `false`.
|
37
|
+
#
|
38
|
+
# Like Object#==, if `object` is an instance of Object (and not an instance of
|
39
|
+
# one of its many subclasses).
|
40
|
+
#
|
41
|
+
# This method is commonly overridden by those subclasses, to provide meaningful
|
42
|
+
# semantics in `case` statements.
|
28
43
|
#
|
29
44
|
def ===: (true) -> true
|
30
|
-
| (untyped obj) ->
|
45
|
+
| (untyped obj) -> bool
|
31
46
|
|
32
47
|
# <!--
|
33
48
|
# rdoc-file=object.c
|
34
|
-
# - true ^
|
49
|
+
# - true ^ object -> !object
|
35
50
|
# -->
|
36
|
-
#
|
51
|
+
# Returns `true` if `object` is `false` or `nil`, `false` otherwise:
|
52
|
+
#
|
53
|
+
# true ^ Object.new # => false
|
54
|
+
# true ^ false # => true
|
55
|
+
# true ^ nil # => true
|
37
56
|
#
|
38
|
-
def ^: (nil) -> true
|
39
|
-
| (
|
40
|
-
| (untyped obj) -> false
|
57
|
+
def ^: (false | nil) -> true
|
58
|
+
| (untyped obj) -> bool
|
41
59
|
|
42
60
|
# <!-- rdoc-file=object.c -->
|
43
|
-
#
|
61
|
+
# Returns string `'true'`:
|
62
|
+
#
|
63
|
+
# true.to_s # => "true"
|
64
|
+
#
|
65
|
+
# TrueClass#inspect is an alias for TrueClass#to_s.
|
44
66
|
#
|
45
67
|
alias inspect to_s
|
46
68
|
|
47
69
|
# <!--
|
48
70
|
# rdoc-file=object.c
|
49
|
-
# - true.to_s
|
71
|
+
# - true.to_s -> 'true'
|
50
72
|
# -->
|
51
|
-
#
|
73
|
+
# Returns string `'true'`:
|
74
|
+
#
|
75
|
+
# true.to_s # => "true"
|
76
|
+
#
|
77
|
+
# TrueClass#inspect is an alias for TrueClass#to_s.
|
52
78
|
#
|
53
79
|
def to_s: () -> "true"
|
54
80
|
|
55
81
|
# <!--
|
56
82
|
# rdoc-file=object.c
|
57
|
-
# - true |
|
83
|
+
# - true | object -> true
|
58
84
|
# -->
|
59
|
-
#
|
60
|
-
# evaluated; there is no short-circuit evaluation in this case.
|
85
|
+
# Returns `true`:
|
61
86
|
#
|
62
|
-
# true |
|
63
|
-
# true
|
87
|
+
# true | Object.new # => true
|
88
|
+
# true | false # => true
|
89
|
+
# true | nil # => true
|
64
90
|
#
|
65
|
-
#
|
91
|
+
# Argument `object` is evaluated. This is different from `true` with the
|
92
|
+
# short-circuit operator, whose operand is evaluated only if necessary:
|
66
93
|
#
|
67
|
-
#
|
94
|
+
# true | raise # => Raises RuntimeError.
|
95
|
+
# true || raise # => true
|
68
96
|
#
|
69
97
|
def |: (untyped obj) -> true
|
70
|
-
|
71
|
-
def clone: (?freeze: true?) -> self
|
72
98
|
end
|
data/core/unbound_method.rbs
CHANGED
@@ -46,6 +46,44 @@
|
|
46
46
|
# um.bind(t).call #=> :original
|
47
47
|
#
|
48
48
|
class UnboundMethod
|
49
|
+
# <!--
|
50
|
+
# rdoc-file=proc.c
|
51
|
+
# - meth.eql?(other_meth) -> true or false
|
52
|
+
# - meth == other_meth -> true or false
|
53
|
+
# -->
|
54
|
+
# Two unbound method objects are equal if they refer to the same method
|
55
|
+
# definition.
|
56
|
+
#
|
57
|
+
# Array.instance_method(:each_slice) == Enumerable.instance_method(:each_slice)
|
58
|
+
# #=> true
|
59
|
+
#
|
60
|
+
# Array.instance_method(:sum) == Enumerable.instance_method(:sum)
|
61
|
+
# #=> false, Array redefines the method for efficiency
|
62
|
+
#
|
63
|
+
def ==: (untyped other) -> bool
|
64
|
+
|
65
|
+
# <!-- rdoc-file=proc.c -->
|
66
|
+
# Two unbound method objects are equal if they refer to the same method
|
67
|
+
# definition.
|
68
|
+
#
|
69
|
+
# Array.instance_method(:each_slice) == Enumerable.instance_method(:each_slice)
|
70
|
+
# #=> true
|
71
|
+
#
|
72
|
+
# Array.instance_method(:sum) == Enumerable.instance_method(:sum)
|
73
|
+
# #=> false, Array redefines the method for efficiency
|
74
|
+
#
|
75
|
+
alias eql? ==
|
76
|
+
|
77
|
+
# <!--
|
78
|
+
# rdoc-file=proc.c
|
79
|
+
# - meth.hash -> integer
|
80
|
+
# -->
|
81
|
+
# Returns a hash value corresponding to the method object.
|
82
|
+
#
|
83
|
+
# See also Object#hash.
|
84
|
+
#
|
85
|
+
def hash: () -> Integer
|
86
|
+
|
49
87
|
# <!--
|
50
88
|
# rdoc-file=proc.c
|
51
89
|
# - method.clone -> new_method
|
@@ -62,7 +100,7 @@ class UnboundMethod
|
|
62
100
|
# m.call # => "bar"
|
63
101
|
# n = m.clone.call # => "bar"
|
64
102
|
#
|
65
|
-
def clone: () ->
|
103
|
+
def clone: () -> instance
|
66
104
|
|
67
105
|
# <!--
|
68
106
|
# rdoc-file=proc.c
|
@@ -141,6 +179,66 @@ class UnboundMethod
|
|
141
179
|
#
|
142
180
|
def bind: (untyped obj) -> Method
|
143
181
|
|
182
|
+
# <!--
|
183
|
+
# rdoc-file=proc.c
|
184
|
+
# - meth.to_s -> string
|
185
|
+
# - meth.inspect -> string
|
186
|
+
# -->
|
187
|
+
# Returns a human-readable description of the underlying method.
|
188
|
+
#
|
189
|
+
# "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
|
190
|
+
# (1..3).method(:map).inspect #=> "#<Method: Range(Enumerable)#map()>"
|
191
|
+
#
|
192
|
+
# In the latter case, the method description includes the "owner" of the
|
193
|
+
# original method (`Enumerable` module, which is included into `Range`).
|
194
|
+
#
|
195
|
+
# `inspect` also provides, when possible, method argument names (call sequence)
|
196
|
+
# and source location.
|
197
|
+
#
|
198
|
+
# require 'net/http'
|
199
|
+
# Net::HTTP.method(:get).inspect
|
200
|
+
# #=> "#<Method: Net::HTTP.get(uri_or_host, path=..., port=...) <skip>/lib/ruby/2.7.0/net/http.rb:457>"
|
201
|
+
#
|
202
|
+
# `...` in argument definition means argument is optional (has some default
|
203
|
+
# value).
|
204
|
+
#
|
205
|
+
# For methods defined in C (language core and extensions), location and argument
|
206
|
+
# names can't be extracted, and only generic information is provided in form of
|
207
|
+
# `*` (any number of arguments) or `_` (some positional argument).
|
208
|
+
#
|
209
|
+
# "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
|
210
|
+
# "cat".method(:+).inspect #=> "#<Method: String#+(_)>""
|
211
|
+
#
|
212
|
+
def inspect: () -> String
|
213
|
+
|
214
|
+
# <!-- rdoc-file=proc.c -->
|
215
|
+
# Returns a human-readable description of the underlying method.
|
216
|
+
#
|
217
|
+
# "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
|
218
|
+
# (1..3).method(:map).inspect #=> "#<Method: Range(Enumerable)#map()>"
|
219
|
+
#
|
220
|
+
# In the latter case, the method description includes the "owner" of the
|
221
|
+
# original method (`Enumerable` module, which is included into `Range`).
|
222
|
+
#
|
223
|
+
# `inspect` also provides, when possible, method argument names (call sequence)
|
224
|
+
# and source location.
|
225
|
+
#
|
226
|
+
# require 'net/http'
|
227
|
+
# Net::HTTP.method(:get).inspect
|
228
|
+
# #=> "#<Method: Net::HTTP.get(uri_or_host, path=..., port=...) <skip>/lib/ruby/2.7.0/net/http.rb:457>"
|
229
|
+
#
|
230
|
+
# `...` in argument definition means argument is optional (has some default
|
231
|
+
# value).
|
232
|
+
#
|
233
|
+
# For methods defined in C (language core and extensions), location and argument
|
234
|
+
# names can't be extracted, and only generic information is provided in form of
|
235
|
+
# `*` (any number of arguments) or `_` (some positional argument).
|
236
|
+
#
|
237
|
+
# "cat".method(:count).inspect #=> "#<Method: String#count(*)>"
|
238
|
+
# "cat".method(:+).inspect #=> "#<Method: String#+(_)>""
|
239
|
+
#
|
240
|
+
alias to_s inspect
|
241
|
+
|
144
242
|
# <!--
|
145
243
|
# rdoc-file=proc.c
|
146
244
|
# - meth.name -> symbol
|
@@ -165,7 +263,7 @@ class UnboundMethod
|
|
165
263
|
#
|
166
264
|
# (1..3).method(:map).owner #=> Enumerable
|
167
265
|
#
|
168
|
-
def owner: () -> Module
|
266
|
+
def owner: () -> (Class | Module)
|
169
267
|
|
170
268
|
# <!--
|
171
269
|
# rdoc-file=proc.c
|
@@ -185,32 +283,7 @@ class UnboundMethod
|
|
185
283
|
# def foo(bar, baz, *args, &blk); end
|
186
284
|
# method(:foo).parameters #=> [[:req, :bar], [:req, :baz], [:rest, :args], [:block, :blk]]
|
187
285
|
#
|
188
|
-
def parameters: () -> ::
|
189
|
-
| () -> ::Array[[ Symbol ]]
|
190
|
-
|
191
|
-
# <!--
|
192
|
-
# rdoc-file=proc.c
|
193
|
-
# - meth.private? -> true or false
|
194
|
-
# -->
|
195
|
-
# Returns whether the method is private.
|
196
|
-
#
|
197
|
-
def private?: () -> bool
|
198
|
-
|
199
|
-
# <!--
|
200
|
-
# rdoc-file=proc.c
|
201
|
-
# - meth.protected? -> true or false
|
202
|
-
# -->
|
203
|
-
# Returns whether the method is protected.
|
204
|
-
#
|
205
|
-
def protected?: () -> bool
|
206
|
-
|
207
|
-
# <!--
|
208
|
-
# rdoc-file=proc.c
|
209
|
-
# - meth.public? -> true or false
|
210
|
-
# -->
|
211
|
-
# Returns whether the method is public.
|
212
|
-
#
|
213
|
-
def public?: () -> bool
|
286
|
+
def parameters: () -> Method::param_types
|
214
287
|
|
215
288
|
# <!--
|
216
289
|
# rdoc-file=proc.c
|
@@ -219,7 +292,7 @@ class UnboundMethod
|
|
219
292
|
# Returns the Ruby source filename and line number containing this method or nil
|
220
293
|
# if this method was not defined in Ruby (i.e. native).
|
221
294
|
#
|
222
|
-
def source_location: () -> [
|
295
|
+
def source_location: () -> [String, Integer]?
|
223
296
|
|
224
297
|
# <!--
|
225
298
|
# rdoc-file=proc.c
|
@@ -252,5 +325,5 @@ class UnboundMethod
|
|
252
325
|
# arguments. This is semantically equivalent to `umeth.bind(recv).call(args,
|
253
326
|
# ...)`.
|
254
327
|
#
|
255
|
-
def bind_call: (untyped recv, *untyped
|
328
|
+
def bind_call: (untyped recv, *untyped, **untyped) ?{ (?) -> untyped } -> untyped
|
256
329
|
end
|
data/core/warning.rbs
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
#
|
6
6
|
# Changing the behavior of Warning.warn is useful to customize how warnings are
|
7
7
|
# handled by Ruby, for instance by filtering some warnings, and/or outputting
|
8
|
-
# warnings somewhere other than
|
8
|
+
# warnings somewhere other than `$stderr`.
|
9
9
|
#
|
10
10
|
# If you want to change the behavior of Warning.warn you should use
|
11
|
-
#
|
12
|
-
# default behavior of printing the warning to
|
11
|
+
# `Warning.extend(MyNewModuleWithWarnMethod)` and you can use `super` to get the
|
12
|
+
# default behavior of printing the warning to `$stderr`.
|
13
13
|
#
|
14
14
|
# Example:
|
15
15
|
# module MyWarningFilter
|
@@ -26,9 +26,54 @@
|
|
26
26
|
# You should never redefine Warning#warn (the instance method), as that will
|
27
27
|
# then no longer provide a way to use the default behavior.
|
28
28
|
#
|
29
|
-
# The
|
29
|
+
# The [warning](https://rubygems.org/gems/warning) gem provides convenient ways
|
30
|
+
# to customize Warning.warn.
|
30
31
|
#
|
31
32
|
module Warning
|
33
|
+
# The types of categories the `Warning` module understands.
|
34
|
+
#
|
35
|
+
type category = :deprecated | :experimental | :performance
|
36
|
+
|
37
|
+
# <!--
|
38
|
+
# rdoc-file=error.c
|
39
|
+
# - Warning[category] -> true or false
|
40
|
+
# -->
|
41
|
+
# Returns the flag to show the warning messages for `category`. Supported
|
42
|
+
# categories are:
|
43
|
+
#
|
44
|
+
# `:deprecated`
|
45
|
+
# : deprecation warnings
|
46
|
+
# * assignment of non-nil value to `$,` and `$;`
|
47
|
+
# * keyword arguments
|
48
|
+
# etc.
|
49
|
+
#
|
50
|
+
#
|
51
|
+
# `:experimental`
|
52
|
+
# : experimental features
|
53
|
+
#
|
54
|
+
#
|
55
|
+
# `:performance`
|
56
|
+
# : performance hints
|
57
|
+
# * Shape variation limit
|
58
|
+
#
|
59
|
+
def self.[]: (category) -> bool
|
60
|
+
|
61
|
+
# <!--
|
62
|
+
# rdoc-file=error.c
|
63
|
+
# - Warning[category] = flag -> flag
|
64
|
+
# -->
|
65
|
+
# Sets the warning flags for `category`. See Warning.[] for the categories.
|
66
|
+
#
|
67
|
+
def self.[]=: [T] (category, T flag) -> T
|
68
|
+
|
69
|
+
# <!--
|
70
|
+
# rdoc-file=error.c
|
71
|
+
# - categories -> array
|
72
|
+
# -->
|
73
|
+
# Returns a list of the supported category symbols.
|
74
|
+
#
|
75
|
+
def self.categories: () -> Array[Symbol]
|
76
|
+
|
32
77
|
# <!--
|
33
78
|
# rdoc-file=error.c
|
34
79
|
# - warn(msg, category: nil) -> nil
|
@@ -38,5 +83,5 @@ module Warning
|
|
38
83
|
#
|
39
84
|
# See the documentation of the Warning module for how to customize this.
|
40
85
|
#
|
41
|
-
def self?.warn: (String message, ?category:
|
86
|
+
def self?.warn: (String message, ?category: category?) -> nil
|
42
87
|
end
|
data/docs/CONTRIBUTING.md
CHANGED
@@ -69,7 +69,7 @@ We define the standard members order so that ordering doesn't bother reading dif
|
|
69
69
|
5. `public` & public instance methods
|
70
70
|
6. `private` & private instance methods
|
71
71
|
|
72
|
-
```
|
72
|
+
```rbs
|
73
73
|
class HelloWorld[X]
|
74
74
|
def self.new: [A] () { (void) -> A } -> HelloWorld[A] # new or initialize comes first
|
75
75
|
def initialize: () -> void
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# Architecture
|
2
|
+
|
3
|
+
This guide describes the outline of the architecture of RBS library. It helps you to understand the structure and key features of the library to start contributing to the library.
|
4
|
+
|
5
|
+
## Bird's Eye View
|
6
|
+
|
7
|
+
The goal of the library is simple: Read RBS files and generate the structure of Ruby programs.
|
8
|
+
|
9
|
+
```
|
10
|
+
RBS files
|
11
|
+
↓ -- RBS::Parser
|
12
|
+
Syntax tree
|
13
|
+
↓
|
14
|
+
Environment
|
15
|
+
↓ -- Definition builder
|
16
|
+
Definition
|
17
|
+
```
|
18
|
+
|
19
|
+
The input is RBS files. The gem ships with RBS type definitions of Ruby core library and some of the standard libraries. You write RBS files for your applications or gems.
|
20
|
+
|
21
|
+
Syntax tree is the next representation. `RBS::Parser` transforms the sequence of characters in RBS files into syntax trees.
|
22
|
+
|
23
|
+
Syntax tree objects are loaded to `RBS::Environment`. It collects loaded RBS objects, organizes the definitions, and provides some utilities, like resolving type names and finding the declarations.
|
24
|
+
|
25
|
+
`RBS::Definition` is the goal of the transformation steps. It is associated with a class singleton, a class object, or an interface. You can find the list of available methods and their types, instance variables, and class hierarchies.
|
26
|
+
|
27
|
+
## Core classes
|
28
|
+
|
29
|
+
### Types
|
30
|
+
|
31
|
+
Types are defined under `RBS::Types`, like `RBS::Types::ClassInstance` or `RBS::Types::Union`. You will find the definition of each type supported in RBS.
|
32
|
+
|
33
|
+
### Parsing RBS files
|
34
|
+
|
35
|
+
The RBS source code is loaded into `RBS::Buffer`, and `RBS::Parser` is the parser. The parser is implemented in C extension.
|
36
|
+
|
37
|
+
`RBS::Parser` provides three entrypoints.
|
38
|
+
|
39
|
+
- `RBS::Parser.parse_method_type` parsers a *method type*. (`[T] (String) { (IO) -> T } -> Array[T]`)
|
40
|
+
- `RBS::Parser.parse_type` parses a *type*. (`Hash[Symbol, untyped]`)
|
41
|
+
- `RBS::Parser.parse_signature` parses the whole RBS file.
|
42
|
+
|
43
|
+
### Environment
|
44
|
+
|
45
|
+
RBS AST is loaded to `RBS::Environment` by `RBS::EnvironmentLoader`. `Environment` gives *absolute names* to the declarations, and provides an index from the *absolute name* to their declarations.
|
46
|
+
|
47
|
+
Assume we have the following nested RBS declarations:
|
48
|
+
|
49
|
+
```rbs
|
50
|
+
module Hello
|
51
|
+
class World
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class Hello::World
|
56
|
+
end
|
57
|
+
```
|
58
|
+
|
59
|
+
And the environment organizes the definitions as follows:
|
60
|
+
|
61
|
+
- There are two classes `::Hello` and `::Hello::World`
|
62
|
+
- It provides a mapping from `::Hello` to it's `module` declaration and `::Hello::World` to it's two `class` declarations
|
63
|
+
|
64
|
+
### Definition and DefinitionBuilder
|
65
|
+
|
66
|
+
`RBS::Definition` tells you:
|
67
|
+
|
68
|
+
- The set of available methods in a class/module/interface
|
69
|
+
- The set of instance variables in a class/module
|
70
|
+
- The ancestors in a class/module
|
71
|
+
|
72
|
+
Definition is constructed for:
|
73
|
+
|
74
|
+
- A singleton class of a class/module -- `singleton(String)`, `singleton(Array)`,
|
75
|
+
- An instance of a class -- `String`, `Array[T]`, or
|
76
|
+
- An interface -- `_ToS`
|
77
|
+
|
78
|
+
Note that generic class instances/interfaces are kept generic. We don't have a definition of `Array[String]` but of `Array[T]`.
|
79
|
+
|
80
|
+
`DefinitionBuilder` constructs `Definition` of given type names.
|
81
|
+
|
82
|
+
- `DefinitionBuilder#build_singleton` returns a definition of singleton classes of given class/module.
|
83
|
+
- `DefinitionBuilder#build_instance` returns a definition of instances of given class/module.
|
84
|
+
- `DefinitionBuilder#build_interface` returns a definition of interfaces.
|
85
|
+
|
86
|
+
It uses `AncestorBuilder` to construct ancestor chains of the type. `MethodBuilder` constructs sets of available methods based on the ancestor chains.
|
87
|
+
|
88
|
+
The `#build_singleton` calculates the type of `.new` methods based on the definition of `#initialize` method. This is different from Ruby's implementation -- it reused `Class#new` method but we need the custom implementation to give precise `.new` method type of each class.
|
89
|
+
|
90
|
+
#### Working with type aliases
|
91
|
+
|
92
|
+
`DefinitionBuilder#expand_alias` and its variants provide one step *unfold* operation of type aliases.
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
builder.expand_alias2(RBS::TypeName.parse("::int"), []) # => returns `::Integer | ::_ToInt`
|
96
|
+
```
|
97
|
+
|
98
|
+
We don't have *normalize* operation for type aliases, because RBS allows recursive type alias definition, which cannot be *fully* unfolded.
|
99
|
+
|
100
|
+
### Other utilities
|
101
|
+
|
102
|
+
`RBS::Validator` provides validation of RBS type declaration. It validates that all of the type name references can be resolved, all type applications have correct arity, and so on.
|
103
|
+
|
104
|
+
`RBS::Test` provides runtime type checking, which confirms if a Ruby object can have an RBS type. It also provides an integration to existing Ruby code so that we run Ruby code, assuming unit tests, with runtime type checking.
|
105
|
+
|
106
|
+
`RBS::UnitTest` provides utilities to help write unit tests for RBS type definitions. Use the tool to make sure your RBS type definition is consistent with implementation.
|
107
|
+
|
108
|
+
`RBS::Prototype` is the core of `rbs prototype` feature. It scans Ruby source code or uses reflection features, and it generates the prototype of RBS files.
|
109
|
+
|
110
|
+
`RBS::Collection` includes `rbs collection` features.
|
data/docs/collection.md
CHANGED
@@ -28,11 +28,10 @@ sources:
|
|
28
28
|
# A directory to install the downloaded RBSs
|
29
29
|
path: .gem_rbs_collection
|
30
30
|
|
31
|
-
gems:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
ignore: true
|
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
|
36
35
|
```
|
37
36
|
|
38
37
|
I also recommend updating `.gitignore`.
|
@@ -79,6 +78,10 @@ sources:
|
|
79
78
|
revision: main
|
80
79
|
repo_dir: gems
|
81
80
|
|
81
|
+
# You can also add a local path as a collection source optionally.
|
82
|
+
- type: local
|
83
|
+
path: path/to/local/dir
|
84
|
+
|
82
85
|
# A directory to install the downloaded RBSs
|
83
86
|
path: .gem_rbs_collection
|
84
87
|
|
@@ -95,6 +98,57 @@ gems:
|
|
95
98
|
ignore: true
|
96
99
|
```
|
97
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
|
+
|
98
152
|
### `manifest.yaml`
|
99
153
|
|
100
154
|
If you are a gem maintainer, you can write `manifest.yaml`.
|
@@ -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
|
+
```
|