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/core/fiber.rbs
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
# <!-- rdoc-file=cont.c -->
|
|
2
|
+
# Fibers are primitives for implementing light weight cooperative concurrency in
|
|
3
|
+
# Ruby. Basically they are a means of creating code blocks that can be paused
|
|
4
|
+
# and resumed, much like threads. The main difference is that they are never
|
|
5
|
+
# preempted and that the scheduling must be done by the programmer and not the
|
|
6
|
+
# VM.
|
|
7
|
+
#
|
|
8
|
+
# As opposed to other stackless light weight concurrency models, each fiber
|
|
9
|
+
# comes with a stack. This enables the fiber to be paused from deeply nested
|
|
10
|
+
# function calls within the fiber block. See the ruby(1) manpage to configure
|
|
11
|
+
# the size of the fiber stack(s).
|
|
12
|
+
#
|
|
13
|
+
# When a fiber is created it will not run automatically. Rather it must be
|
|
14
|
+
# explicitly asked to run using the Fiber#resume method. The code running inside
|
|
15
|
+
# the fiber can give up control by calling Fiber.yield in which case it yields
|
|
16
|
+
# control back to caller (the caller of the Fiber#resume).
|
|
17
|
+
#
|
|
18
|
+
# Upon yielding or termination the Fiber returns the value of the last executed
|
|
19
|
+
# expression
|
|
20
|
+
#
|
|
21
|
+
# For instance:
|
|
22
|
+
#
|
|
23
|
+
# fiber = Fiber.new do
|
|
24
|
+
# Fiber.yield 1
|
|
25
|
+
# 2
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# puts fiber.resume
|
|
29
|
+
# puts fiber.resume
|
|
30
|
+
# puts fiber.resume
|
|
31
|
+
#
|
|
32
|
+
# *produces*
|
|
33
|
+
#
|
|
34
|
+
# 1
|
|
35
|
+
# 2
|
|
36
|
+
# FiberError: dead fiber called
|
|
37
|
+
#
|
|
38
|
+
# The Fiber#resume method accepts an arbitrary number of parameters, if it is
|
|
39
|
+
# the first call to #resume then they will be passed as block arguments.
|
|
40
|
+
# Otherwise they will be the return value of the call to Fiber.yield
|
|
41
|
+
#
|
|
42
|
+
# Example:
|
|
43
|
+
#
|
|
44
|
+
# fiber = Fiber.new do |first|
|
|
45
|
+
# second = Fiber.yield first + 2
|
|
46
|
+
# end
|
|
47
|
+
#
|
|
48
|
+
# puts fiber.resume 10
|
|
49
|
+
# puts fiber.resume 1_000_000
|
|
50
|
+
# puts fiber.resume "The fiber will be dead before I can cause trouble"
|
|
51
|
+
#
|
|
52
|
+
# *produces*
|
|
53
|
+
#
|
|
54
|
+
# 12
|
|
55
|
+
# 1000000
|
|
56
|
+
# FiberError: dead fiber called
|
|
57
|
+
#
|
|
58
|
+
# ## Non-blocking Fibers
|
|
59
|
+
#
|
|
60
|
+
# The concept of *non-blocking fiber* was introduced in Ruby 3.0. A non-blocking
|
|
61
|
+
# fiber, when reaching a operation that would normally block the fiber (like
|
|
62
|
+
# `sleep`, or wait for another process or I/O) will yield control to other
|
|
63
|
+
# fibers and allow the *scheduler* to handle blocking and waking up (resuming)
|
|
64
|
+
# this fiber when it can proceed.
|
|
65
|
+
#
|
|
66
|
+
# For a Fiber to behave as non-blocking, it need to be created in Fiber.new with
|
|
67
|
+
# `blocking: false` (which is the default), and Fiber.scheduler should be set
|
|
68
|
+
# with Fiber.set_scheduler. If Fiber.scheduler is not set in the current thread,
|
|
69
|
+
# blocking and non-blocking fibers' behavior is identical.
|
|
70
|
+
#
|
|
71
|
+
# Ruby doesn't provide a scheduler class: it is expected to be implemented by
|
|
72
|
+
# the user and correspond to Fiber::Scheduler.
|
|
73
|
+
#
|
|
74
|
+
# There is also Fiber.schedule method, which is expected to immediately perform
|
|
75
|
+
# the given block in a non-blocking manner. Its actual implementation is up to
|
|
76
|
+
# the scheduler.
|
|
77
|
+
#
|
|
78
|
+
class Fiber < Object
|
|
79
|
+
# <!--
|
|
80
|
+
# rdoc-file=cont.c
|
|
81
|
+
# - Fiber[key] -> value
|
|
82
|
+
# -->
|
|
83
|
+
# Returns the value of the fiber storage variable identified by `key`.
|
|
84
|
+
#
|
|
85
|
+
# The `key` must be a symbol, and the value is set by Fiber#[]= or Fiber#store.
|
|
86
|
+
#
|
|
87
|
+
# See also Fiber::[]=.
|
|
88
|
+
#
|
|
89
|
+
def self.[]: (Symbol) -> untyped
|
|
90
|
+
|
|
91
|
+
# <!--
|
|
92
|
+
# rdoc-file=cont.c
|
|
93
|
+
# - Fiber[key] = value
|
|
94
|
+
# -->
|
|
95
|
+
# Assign `value` to the fiber storage variable identified by `key`. The variable
|
|
96
|
+
# is created if it doesn't exist.
|
|
97
|
+
#
|
|
98
|
+
# `key` must be a Symbol, otherwise a TypeError is raised.
|
|
99
|
+
#
|
|
100
|
+
# See also Fiber::[].
|
|
101
|
+
#
|
|
102
|
+
def self.[]=: [A] (Symbol, A) -> A
|
|
103
|
+
|
|
104
|
+
# <!--
|
|
105
|
+
# rdoc-file=cont.c
|
|
106
|
+
# - Fiber.blocking? -> false or 1
|
|
107
|
+
# -->
|
|
108
|
+
# Returns `false` if the current fiber is non-blocking. Fiber is non-blocking if
|
|
109
|
+
# it was created via passing `blocking: false` to Fiber.new, or via
|
|
110
|
+
# Fiber.schedule.
|
|
111
|
+
#
|
|
112
|
+
# If the current Fiber is blocking, the method returns 1. Future developments
|
|
113
|
+
# may allow for situations where larger integers could be returned.
|
|
114
|
+
#
|
|
115
|
+
# Note that, even if the method returns `false`, Fiber behaves differently only
|
|
116
|
+
# if Fiber.scheduler is set in the current thread.
|
|
117
|
+
#
|
|
118
|
+
# See the "Non-blocking fibers" section in class docs for details.
|
|
119
|
+
#
|
|
120
|
+
def self.blocking?: () -> untyped
|
|
121
|
+
|
|
122
|
+
# <!--
|
|
123
|
+
# rdoc-file=cont.c
|
|
124
|
+
# - Fiber.current -> fiber
|
|
125
|
+
# -->
|
|
126
|
+
# Returns the current fiber. If you are not running in the context of a fiber
|
|
127
|
+
# this method will return the root fiber.
|
|
128
|
+
#
|
|
129
|
+
def self.current: () -> Fiber
|
|
130
|
+
|
|
131
|
+
# <!--
|
|
132
|
+
# rdoc-file=cont.c
|
|
133
|
+
# - Fiber.current_scheduler -> obj or nil
|
|
134
|
+
# -->
|
|
135
|
+
# Returns the Fiber scheduler, that was last set for the current thread with
|
|
136
|
+
# Fiber.set_scheduler if and only if the current fiber is non-blocking.
|
|
137
|
+
#
|
|
138
|
+
def self.current_scheduler: () -> untyped?
|
|
139
|
+
|
|
140
|
+
# <!--
|
|
141
|
+
# rdoc-file=cont.c
|
|
142
|
+
# - Fiber.schedule { |*args| ... } -> fiber
|
|
143
|
+
# -->
|
|
144
|
+
# The method is *expected* to immediately run the provided block of code in a
|
|
145
|
+
# separate non-blocking fiber.
|
|
146
|
+
#
|
|
147
|
+
# puts "Go to sleep!"
|
|
148
|
+
#
|
|
149
|
+
# Fiber.set_scheduler(MyScheduler.new)
|
|
150
|
+
#
|
|
151
|
+
# Fiber.schedule do
|
|
152
|
+
# puts "Going to sleep"
|
|
153
|
+
# sleep(1)
|
|
154
|
+
# puts "I slept well"
|
|
155
|
+
# end
|
|
156
|
+
#
|
|
157
|
+
# puts "Wakey-wakey, sleepyhead"
|
|
158
|
+
#
|
|
159
|
+
# Assuming MyScheduler is properly implemented, this program will produce:
|
|
160
|
+
#
|
|
161
|
+
# Go to sleep!
|
|
162
|
+
# Going to sleep
|
|
163
|
+
# Wakey-wakey, sleepyhead
|
|
164
|
+
# ...1 sec pause here...
|
|
165
|
+
# I slept well
|
|
166
|
+
#
|
|
167
|
+
# ...e.g. on the first blocking operation inside the Fiber (`sleep(1)`), the
|
|
168
|
+
# control is yielded to the outside code (main fiber), and *at the end of that
|
|
169
|
+
# execution*, the scheduler takes care of properly resuming all the blocked
|
|
170
|
+
# fibers.
|
|
171
|
+
#
|
|
172
|
+
# Note that the behavior described above is how the method is *expected* to
|
|
173
|
+
# behave, actual behavior is up to the current scheduler's implementation of
|
|
174
|
+
# Fiber::Scheduler#fiber method. Ruby doesn't enforce this method to behave in
|
|
175
|
+
# any particular way.
|
|
176
|
+
#
|
|
177
|
+
# If the scheduler is not set, the method raises `RuntimeError (No scheduler is
|
|
178
|
+
# available!)`.
|
|
179
|
+
#
|
|
180
|
+
def self.schedule: () { () -> void } -> Fiber
|
|
181
|
+
|
|
182
|
+
# <!--
|
|
183
|
+
# rdoc-file=cont.c
|
|
184
|
+
# - Fiber.scheduler -> obj or nil
|
|
185
|
+
# -->
|
|
186
|
+
# Returns the Fiber scheduler, that was last set for the current thread with
|
|
187
|
+
# Fiber.set_scheduler. Returns `nil` if no scheduler is set (which is the
|
|
188
|
+
# default), and non-blocking fibers' behavior is the same as blocking. (see
|
|
189
|
+
# "Non-blocking fibers" section in class docs for details about the scheduler
|
|
190
|
+
# concept).
|
|
191
|
+
#
|
|
192
|
+
def self.scheduler: () -> untyped?
|
|
193
|
+
|
|
194
|
+
# <!--
|
|
195
|
+
# rdoc-file=cont.c
|
|
196
|
+
# - Fiber.set_scheduler(scheduler) -> scheduler
|
|
197
|
+
# -->
|
|
198
|
+
# Sets the Fiber scheduler for the current thread. If the scheduler is set,
|
|
199
|
+
# non-blocking fibers (created by Fiber.new with `blocking: false`, or by
|
|
200
|
+
# Fiber.schedule) call that scheduler's hook methods on potentially blocking
|
|
201
|
+
# operations, and the current thread will call scheduler's `close` method on
|
|
202
|
+
# finalization (allowing the scheduler to properly manage all non-finished
|
|
203
|
+
# fibers).
|
|
204
|
+
#
|
|
205
|
+
# `scheduler` can be an object of any class corresponding to Fiber::Scheduler.
|
|
206
|
+
# Its implementation is up to the user.
|
|
207
|
+
#
|
|
208
|
+
# See also the "Non-blocking fibers" section in class docs.
|
|
209
|
+
#
|
|
210
|
+
def self.set_scheduler: (untyped) -> untyped
|
|
211
|
+
|
|
212
|
+
# <!--
|
|
213
|
+
# rdoc-file=cont.c
|
|
214
|
+
# - Fiber.yield(args, ...) -> obj
|
|
215
|
+
# -->
|
|
216
|
+
# Yields control back to the context that resumed the fiber, passing along any
|
|
217
|
+
# arguments that were passed to it. The fiber will resume processing at this
|
|
218
|
+
# point when #resume is called next. Any arguments passed to the next #resume
|
|
219
|
+
# will be the value that this Fiber.yield expression evaluates to.
|
|
220
|
+
#
|
|
221
|
+
def self.yield: (*untyped) -> untyped
|
|
222
|
+
|
|
223
|
+
# <!--
|
|
224
|
+
# rdoc-file=cont.c
|
|
225
|
+
# - Fiber.new(blocking: false, storage: true) { |*args| ... } -> fiber
|
|
226
|
+
# -->
|
|
227
|
+
# Creates new Fiber. Initially, the fiber is not running and can be resumed with
|
|
228
|
+
# #resume. Arguments to the first #resume call will be passed to the block:
|
|
229
|
+
#
|
|
230
|
+
# f = Fiber.new do |initial|
|
|
231
|
+
# current = initial
|
|
232
|
+
# loop do
|
|
233
|
+
# puts "current: #{current.inspect}"
|
|
234
|
+
# current = Fiber.yield
|
|
235
|
+
# end
|
|
236
|
+
# end
|
|
237
|
+
# f.resume(100) # prints: current: 100
|
|
238
|
+
# f.resume(1, 2, 3) # prints: current: [1, 2, 3]
|
|
239
|
+
# f.resume # prints: current: nil
|
|
240
|
+
# # ... and so on ...
|
|
241
|
+
#
|
|
242
|
+
# If `blocking: false` is passed to `Fiber.new`, *and* current thread has a
|
|
243
|
+
# Fiber.scheduler defined, the Fiber becomes non-blocking (see "Non-blocking
|
|
244
|
+
# Fibers" section in class docs).
|
|
245
|
+
#
|
|
246
|
+
# If the `storage` is unspecified, the default is to inherit a copy of the
|
|
247
|
+
# storage from the current fiber. This is the same as specifying `storage:
|
|
248
|
+
# true`.
|
|
249
|
+
#
|
|
250
|
+
# Fiber[:x] = 1
|
|
251
|
+
# Fiber.new do
|
|
252
|
+
# Fiber[:x] # => 1
|
|
253
|
+
# Fiber[:x] = 2
|
|
254
|
+
# end.resume
|
|
255
|
+
# Fiber[:x] # => 1
|
|
256
|
+
#
|
|
257
|
+
# If the given `storage` is `nil`, this function will lazy initialize the
|
|
258
|
+
# internal storage, which starts as an empty hash.
|
|
259
|
+
#
|
|
260
|
+
# Fiber[:x] = "Hello World"
|
|
261
|
+
# Fiber.new(storage: nil) do
|
|
262
|
+
# Fiber[:x] # nil
|
|
263
|
+
# end
|
|
264
|
+
#
|
|
265
|
+
# Otherwise, the given `storage` is used as the new fiber's storage, and it must
|
|
266
|
+
# be an instance of Hash.
|
|
267
|
+
#
|
|
268
|
+
# Explicitly using `storage: true` is currently experimental and may change in
|
|
269
|
+
# the future.
|
|
270
|
+
#
|
|
271
|
+
def initialize: (?blocking: boolish, ?storage: true | Hash[interned, untyped] | nil) { (?) -> void } -> void
|
|
272
|
+
|
|
273
|
+
# <!--
|
|
274
|
+
# rdoc-file=cont.c
|
|
275
|
+
# - fiber.alive? -> true or false
|
|
276
|
+
# -->
|
|
277
|
+
# Returns true if the fiber can still be resumed (or transferred to). After
|
|
278
|
+
# finishing execution of the fiber block this method will always return `false`.
|
|
279
|
+
#
|
|
280
|
+
def alive?: () -> bool
|
|
281
|
+
|
|
282
|
+
# <!--
|
|
283
|
+
# rdoc-file=cont.c
|
|
284
|
+
# - fiber.backtrace -> array
|
|
285
|
+
# - fiber.backtrace(start) -> array
|
|
286
|
+
# - fiber.backtrace(start, count) -> array
|
|
287
|
+
# - fiber.backtrace(start..end) -> array
|
|
288
|
+
# -->
|
|
289
|
+
# Returns the current execution stack of the fiber. `start`, `count` and `end`
|
|
290
|
+
# allow to select only parts of the backtrace.
|
|
291
|
+
#
|
|
292
|
+
# def level3
|
|
293
|
+
# Fiber.yield
|
|
294
|
+
# end
|
|
295
|
+
#
|
|
296
|
+
# def level2
|
|
297
|
+
# level3
|
|
298
|
+
# end
|
|
299
|
+
#
|
|
300
|
+
# def level1
|
|
301
|
+
# level2
|
|
302
|
+
# end
|
|
303
|
+
#
|
|
304
|
+
# f = Fiber.new { level1 }
|
|
305
|
+
#
|
|
306
|
+
# # It is empty before the fiber started
|
|
307
|
+
# f.backtrace
|
|
308
|
+
# #=> []
|
|
309
|
+
#
|
|
310
|
+
# f.resume
|
|
311
|
+
#
|
|
312
|
+
# f.backtrace
|
|
313
|
+
# #=> ["test.rb:2:in `yield'", "test.rb:2:in `level3'", "test.rb:6:in `level2'", "test.rb:10:in `level1'", "test.rb:13:in `block in <main>'"]
|
|
314
|
+
# p f.backtrace(1) # start from the item 1
|
|
315
|
+
# #=> ["test.rb:2:in `level3'", "test.rb:6:in `level2'", "test.rb:10:in `level1'", "test.rb:13:in `block in <main>'"]
|
|
316
|
+
# p f.backtrace(2, 2) # start from item 2, take 2
|
|
317
|
+
# #=> ["test.rb:6:in `level2'", "test.rb:10:in `level1'"]
|
|
318
|
+
# p f.backtrace(1..3) # take items from 1 to 3
|
|
319
|
+
# #=> ["test.rb:2:in `level3'", "test.rb:6:in `level2'", "test.rb:10:in `level1'"]
|
|
320
|
+
#
|
|
321
|
+
# f.resume
|
|
322
|
+
#
|
|
323
|
+
# # It is nil after the fiber is finished
|
|
324
|
+
# f.backtrace
|
|
325
|
+
# #=> nil
|
|
326
|
+
#
|
|
327
|
+
def backtrace: (?Integer start, ?Integer count) -> Array[String]?
|
|
328
|
+
| (Range[Integer]) -> Array[String]?
|
|
329
|
+
|
|
330
|
+
# <!--
|
|
331
|
+
# rdoc-file=cont.c
|
|
332
|
+
# - fiber.backtrace_locations -> array
|
|
333
|
+
# - fiber.backtrace_locations(start) -> array
|
|
334
|
+
# - fiber.backtrace_locations(start, count) -> array
|
|
335
|
+
# - fiber.backtrace_locations(start..end) -> array
|
|
336
|
+
# -->
|
|
337
|
+
# Like #backtrace, but returns each line of the execution stack as a
|
|
338
|
+
# Thread::Backtrace::Location. Accepts the same arguments as #backtrace.
|
|
339
|
+
#
|
|
340
|
+
# f = Fiber.new { Fiber.yield }
|
|
341
|
+
# f.resume
|
|
342
|
+
# loc = f.backtrace_locations.first
|
|
343
|
+
# loc.label #=> "yield"
|
|
344
|
+
# loc.path #=> "test.rb"
|
|
345
|
+
# loc.lineno #=> 1
|
|
346
|
+
#
|
|
347
|
+
def backtrace_locations: (?Integer start, ?Integer count) -> Array[Thread::Backtrace::Location]?
|
|
348
|
+
| (Range[Integer]) -> Array[Thread::Backtrace::Location]?
|
|
349
|
+
|
|
350
|
+
# <!--
|
|
351
|
+
# rdoc-file=cont.c
|
|
352
|
+
# - fiber.blocking? -> true or false
|
|
353
|
+
# -->
|
|
354
|
+
# Returns `true` if `fiber` is blocking and `false` otherwise. Fiber is
|
|
355
|
+
# non-blocking if it was created via passing `blocking: false` to Fiber.new, or
|
|
356
|
+
# via Fiber.schedule.
|
|
357
|
+
#
|
|
358
|
+
# Note that, even if the method returns `false`, the fiber behaves differently
|
|
359
|
+
# only if Fiber.scheduler is set in the current thread.
|
|
360
|
+
#
|
|
361
|
+
# See the "Non-blocking fibers" section in class docs for details.
|
|
362
|
+
#
|
|
363
|
+
def blocking?: () -> bool
|
|
364
|
+
|
|
365
|
+
# <!--
|
|
366
|
+
# rdoc-file=cont.c
|
|
367
|
+
# - inspect()
|
|
368
|
+
# -->
|
|
369
|
+
#
|
|
370
|
+
alias inspect to_s
|
|
371
|
+
|
|
372
|
+
# <!--
|
|
373
|
+
# rdoc-file=cont.c
|
|
374
|
+
# - fiber.kill -> nil
|
|
375
|
+
# -->
|
|
376
|
+
# Terminates the fiber by raising an uncatchable exception. It only terminates
|
|
377
|
+
# the given fiber and no other fiber, returning `nil` to another fiber if that
|
|
378
|
+
# fiber was calling #resume or #transfer.
|
|
379
|
+
#
|
|
380
|
+
# `Fiber#kill` only interrupts another fiber when it is in Fiber.yield. If
|
|
381
|
+
# called on the current fiber then it raises that exception at the `Fiber#kill`
|
|
382
|
+
# call site.
|
|
383
|
+
#
|
|
384
|
+
# If the fiber has not been started, transition directly to the terminated
|
|
385
|
+
# state.
|
|
386
|
+
#
|
|
387
|
+
# If the fiber is already terminated, does nothing.
|
|
388
|
+
#
|
|
389
|
+
# Raises FiberError if called on a fiber belonging to another thread.
|
|
390
|
+
#
|
|
391
|
+
def kill: () -> nil
|
|
392
|
+
|
|
393
|
+
# <!--
|
|
394
|
+
# rdoc-file=cont.c
|
|
395
|
+
# - fiber.raise -> obj
|
|
396
|
+
# - fiber.raise(string) -> obj
|
|
397
|
+
# - fiber.raise(exception [, string [, array]]) -> obj
|
|
398
|
+
# -->
|
|
399
|
+
# Raises an exception in the fiber at the point at which the last `Fiber.yield`
|
|
400
|
+
# was called. If the fiber has not been started or has already run to
|
|
401
|
+
# completion, raises `FiberError`. If the fiber is yielding, it is resumed. If
|
|
402
|
+
# it is transferring, it is transferred into. But if it is resuming, raises
|
|
403
|
+
# `FiberError`.
|
|
404
|
+
#
|
|
405
|
+
# With no arguments, raises a `RuntimeError`. With a single `String` argument,
|
|
406
|
+
# raises a `RuntimeError` with the string as a message. Otherwise, the first
|
|
407
|
+
# parameter should be the name of an `Exception` class (or an object that
|
|
408
|
+
# returns an `Exception` object when sent an `exception` message). The optional
|
|
409
|
+
# second parameter sets the message associated with the exception, and the third
|
|
410
|
+
# parameter is an array of callback information. Exceptions are caught by the
|
|
411
|
+
# `rescue` clause of `begin...end` blocks.
|
|
412
|
+
#
|
|
413
|
+
# Raises `FiberError` if called on a Fiber belonging to another `Thread`.
|
|
414
|
+
#
|
|
415
|
+
# See Kernel#raise for more information.
|
|
416
|
+
#
|
|
417
|
+
def raise: (?string msg) -> untyped
|
|
418
|
+
| (_Exception, ?string msg, ?Array[string] | Array[Thread::Backtrace::Location] | nil backtrace) -> untyped
|
|
419
|
+
|
|
420
|
+
# <!--
|
|
421
|
+
# rdoc-file=cont.c
|
|
422
|
+
# - fiber.resume(args, ...) -> obj
|
|
423
|
+
# -->
|
|
424
|
+
# Resumes the fiber from the point at which the last Fiber.yield was called, or
|
|
425
|
+
# starts running it if it is the first call to #resume. Arguments passed to
|
|
426
|
+
# resume will be the value of the Fiber.yield expression or will be passed as
|
|
427
|
+
# block parameters to the fiber's block if this is the first #resume.
|
|
428
|
+
#
|
|
429
|
+
# Alternatively, when resume is called it evaluates to the arguments passed to
|
|
430
|
+
# the next Fiber.yield statement inside the fiber's block or to the block value
|
|
431
|
+
# if it runs to completion without any Fiber.yield
|
|
432
|
+
#
|
|
433
|
+
def resume: (*untyped) -> untyped
|
|
434
|
+
|
|
435
|
+
# <!--
|
|
436
|
+
# rdoc-file=cont.c
|
|
437
|
+
# - fiber.storage -> hash (dup)
|
|
438
|
+
# -->
|
|
439
|
+
# Returns a copy of the storage hash for the fiber. The method can only be
|
|
440
|
+
# called on the Fiber.current.
|
|
441
|
+
#
|
|
442
|
+
def storage: () -> Hash[interned, untyped]
|
|
443
|
+
|
|
444
|
+
# <!--
|
|
445
|
+
# rdoc-file=cont.c
|
|
446
|
+
# - fiber.storage = hash
|
|
447
|
+
# -->
|
|
448
|
+
# Sets the storage hash for the fiber. This feature is experimental and may
|
|
449
|
+
# change in the future. The method can only be called on the Fiber.current.
|
|
450
|
+
#
|
|
451
|
+
# You should be careful about using this method as you may inadvertently clear
|
|
452
|
+
# important fiber-storage state. You should mostly prefer to assign specific
|
|
453
|
+
# keys in the storage using Fiber::[]=.
|
|
454
|
+
#
|
|
455
|
+
# You can also use `Fiber.new(storage: nil)` to create a fiber with an empty
|
|
456
|
+
# storage.
|
|
457
|
+
#
|
|
458
|
+
# Example:
|
|
459
|
+
#
|
|
460
|
+
# while request = request_queue.pop
|
|
461
|
+
# # Reset the per-request state:
|
|
462
|
+
# Fiber.current.storage = nil
|
|
463
|
+
# handle_request(request)
|
|
464
|
+
# end
|
|
465
|
+
#
|
|
466
|
+
def storage=: (Hash[interned, untyped]) -> Hash[interned, untyped]
|
|
467
|
+
|
|
468
|
+
# <!--
|
|
469
|
+
# rdoc-file=cont.c
|
|
470
|
+
# - to_s()
|
|
471
|
+
# -->
|
|
472
|
+
#
|
|
473
|
+
def to_s: () -> untyped
|
|
474
|
+
|
|
475
|
+
# <!--
|
|
476
|
+
# rdoc-file=cont.c
|
|
477
|
+
# - fiber.transfer(args, ...) -> obj
|
|
478
|
+
# -->
|
|
479
|
+
# Transfer control to another fiber, resuming it from where it last stopped or
|
|
480
|
+
# starting it if it was not resumed before. The calling fiber will be suspended
|
|
481
|
+
# much like in a call to Fiber.yield.
|
|
482
|
+
#
|
|
483
|
+
# The fiber which receives the transfer call treats it much like a resume call.
|
|
484
|
+
# Arguments passed to transfer are treated like those passed to resume.
|
|
485
|
+
#
|
|
486
|
+
# The two style of control passing to and from fiber (one is #resume and
|
|
487
|
+
# Fiber::yield, another is #transfer to and from fiber) can't be freely mixed.
|
|
488
|
+
#
|
|
489
|
+
# * If the Fiber's lifecycle had started with transfer, it will never be able
|
|
490
|
+
# to yield or be resumed control passing, only finish or transfer back. (It
|
|
491
|
+
# still can resume other fibers that are allowed to be resumed.)
|
|
492
|
+
# * If the Fiber's lifecycle had started with resume, it can yield or transfer
|
|
493
|
+
# to another Fiber, but can receive control back only the way compatible
|
|
494
|
+
# with the way it was given away: if it had transferred, it only can be
|
|
495
|
+
# transferred back, and if it had yielded, it only can be resumed back.
|
|
496
|
+
# After that, it again can transfer or yield.
|
|
497
|
+
#
|
|
498
|
+
# If those rules are broken FiberError is raised.
|
|
499
|
+
#
|
|
500
|
+
# For an individual Fiber design, yield/resume is easier to use (the Fiber just
|
|
501
|
+
# gives away control, it doesn't need to think about who the control is given
|
|
502
|
+
# to), while transfer is more flexible for complex cases, allowing to build
|
|
503
|
+
# arbitrary graphs of Fibers dependent on each other.
|
|
504
|
+
#
|
|
505
|
+
# Example:
|
|
506
|
+
#
|
|
507
|
+
# manager = nil # For local var to be visible inside worker block
|
|
508
|
+
#
|
|
509
|
+
# # This fiber would be started with transfer
|
|
510
|
+
# # It can't yield, and can't be resumed
|
|
511
|
+
# worker = Fiber.new { |work|
|
|
512
|
+
# puts "Worker: starts"
|
|
513
|
+
# puts "Worker: Performed #{work.inspect}, transferring back"
|
|
514
|
+
# # Fiber.yield # this would raise FiberError: attempt to yield on a not resumed fiber
|
|
515
|
+
# # manager.resume # this would raise FiberError: attempt to resume a resumed fiber (double resume)
|
|
516
|
+
# manager.transfer(work.capitalize)
|
|
517
|
+
# }
|
|
518
|
+
#
|
|
519
|
+
# # This fiber would be started with resume
|
|
520
|
+
# # It can yield or transfer, and can be transferred
|
|
521
|
+
# # back or resumed
|
|
522
|
+
# manager = Fiber.new {
|
|
523
|
+
# puts "Manager: starts"
|
|
524
|
+
# puts "Manager: transferring 'something' to worker"
|
|
525
|
+
# result = worker.transfer('something')
|
|
526
|
+
# puts "Manager: worker returned #{result.inspect}"
|
|
527
|
+
# # worker.resume # this would raise FiberError: attempt to resume a transferring fiber
|
|
528
|
+
# Fiber.yield # this is OK, the fiber transferred from and to, now it can yield
|
|
529
|
+
# puts "Manager: finished"
|
|
530
|
+
# }
|
|
531
|
+
#
|
|
532
|
+
# puts "Starting the manager"
|
|
533
|
+
# manager.resume
|
|
534
|
+
# puts "Resuming the manager"
|
|
535
|
+
# # manager.transfer # this would raise FiberError: attempt to transfer to a yielding fiber
|
|
536
|
+
# manager.resume
|
|
537
|
+
#
|
|
538
|
+
# *produces*
|
|
539
|
+
#
|
|
540
|
+
# Starting the manager
|
|
541
|
+
# Manager: starts
|
|
542
|
+
# Manager: transferring 'something' to worker
|
|
543
|
+
# Worker: starts
|
|
544
|
+
# Worker: Performed "something", transferring back
|
|
545
|
+
# Manager: worker returned "Something"
|
|
546
|
+
# Resuming the manager
|
|
547
|
+
# Manager: finished
|
|
548
|
+
#
|
|
549
|
+
def transfer: (*untyped) -> untyped
|
|
550
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# <!-- rdoc-file=cont.c -->
|
|
2
|
+
# Raised when an invalid operation is attempted on a Fiber, in particular when
|
|
3
|
+
# attempting to call/resume a dead fiber, attempting to yield from the root
|
|
4
|
+
# fiber, or calling a fiber across threads.
|
|
5
|
+
#
|
|
6
|
+
# fiber = Fiber.new{}
|
|
7
|
+
# fiber.resume #=> nil
|
|
8
|
+
# fiber.resume #=> FiberError: dead fiber called
|
|
9
|
+
#
|
|
10
|
+
class FiberError < StandardError
|
|
11
|
+
end
|