rubygems-update 3.3.18 → 3.4.19
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 +4 -4
- data/CHANGELOG.md +1429 -1064
- data/CONTRIBUTING.md +31 -8
- data/Manifest.txt +61 -36
- data/POLICIES.md +55 -20
- data/README.md +19 -6
- data/bundler/CHANGELOG.md +457 -1
- data/bundler/README.md +3 -6
- data/bundler/UPGRADING.md +11 -4
- data/bundler/bundler.gemspec +8 -10
- data/bundler/exe/bundle +5 -16
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli/add.rb +1 -1
- data/bundler/lib/bundler/cli/binstubs.rb +6 -2
- data/bundler/lib/bundler/cli/check.rb +1 -1
- data/bundler/lib/bundler/cli/common.rb +2 -0
- data/bundler/lib/bundler/cli/console.rb +2 -2
- data/bundler/lib/bundler/cli/doctor.rb +4 -6
- data/bundler/lib/bundler/cli/gem.rb +62 -40
- data/bundler/lib/bundler/cli/info.rb +1 -1
- data/bundler/lib/bundler/cli/init.rb +6 -2
- data/bundler/lib/bundler/cli/install.rb +8 -6
- data/bundler/lib/bundler/cli/lock.rb +8 -5
- data/bundler/lib/bundler/cli/open.rb +6 -4
- data/bundler/lib/bundler/cli/outdated.rb +14 -7
- data/bundler/lib/bundler/cli/platform.rb +7 -5
- data/bundler/lib/bundler/cli/viz.rb +1 -1
- data/bundler/lib/bundler/cli.rb +53 -7
- data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
- data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
- data/bundler/lib/bundler/constants.rb +1 -1
- data/bundler/lib/bundler/current_ruby.rb +16 -5
- data/bundler/lib/bundler/definition.rb +262 -133
- data/bundler/lib/bundler/dependency.rb +20 -86
- data/bundler/lib/bundler/digest.rb +1 -1
- data/bundler/lib/bundler/dsl.rb +6 -7
- data/bundler/lib/bundler/endpoint_specification.rb +2 -13
- data/bundler/lib/bundler/env.rb +2 -2
- data/bundler/lib/bundler/environment_preserver.rb +3 -2
- data/bundler/lib/bundler/errors.rb +1 -11
- data/bundler/lib/bundler/feature_flag.rb +0 -2
- data/bundler/lib/bundler/fetcher/compact_index.rb +11 -13
- data/bundler/lib/bundler/fetcher/dependency.rb +2 -6
- data/bundler/lib/bundler/fetcher/downloader.rb +4 -5
- data/bundler/lib/bundler/fetcher/index.rb +1 -2
- data/bundler/lib/bundler/fetcher.rb +21 -15
- data/bundler/lib/bundler/force_platform.rb +18 -0
- data/bundler/lib/bundler/friendly_errors.rb +1 -4
- data/bundler/lib/bundler/gem_helper.rb +3 -4
- data/bundler/lib/bundler/gem_helpers.rb +7 -2
- data/bundler/lib/bundler/gem_version_promoter.rb +53 -98
- data/bundler/lib/bundler/graph.rb +3 -3
- data/bundler/lib/bundler/index.rb +13 -47
- data/bundler/lib/bundler/injector.rb +5 -4
- data/bundler/lib/bundler/inline.rb +9 -11
- data/bundler/lib/bundler/installer/parallel_installer.rb +4 -34
- data/bundler/lib/bundler/installer/standalone.rb +13 -9
- data/bundler/lib/bundler/installer.rb +17 -29
- data/bundler/lib/bundler/lazy_specification.rb +54 -53
- data/bundler/lib/bundler/lockfile_generator.rb +3 -3
- data/bundler/lib/bundler/lockfile_parser.rb +17 -16
- data/bundler/lib/bundler/man/bundle-add.1 +6 -2
- data/bundler/lib/bundler/man/bundle-add.1.ronn +4 -1
- data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/bundler/lib/bundler/man/bundle-cache.1 +9 -3
- data/bundler/lib/bundler/man/bundle-cache.1.ronn +9 -2
- data/bundler/lib/bundler/man/bundle-check.1 +1 -1
- data/bundler/lib/bundler/man/bundle-clean.1 +2 -2
- data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-config.1 +26 -10
- data/bundler/lib/bundler/man/bundle-config.1.ronn +17 -10
- data/bundler/lib/bundler/man/bundle-console.1 +53 -0
- data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
- data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
- data/bundler/lib/bundler/man/bundle-exec.1 +6 -6
- data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -6
- data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
- data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
- data/bundler/lib/bundler/man/bundle-help.1 +13 -0
- data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/bundler/lib/bundler/man/bundle-info.1 +3 -3
- data/bundler/lib/bundler/man/bundle-info.1.ronn +3 -3
- data/bundler/lib/bundler/man/bundle-init.1 +5 -1
- data/bundler/lib/bundler/man/bundle-init.1.ronn +2 -0
- data/bundler/lib/bundler/man/bundle-inject.1 +5 -2
- data/bundler/lib/bundler/man/bundle-inject.1.ronn +3 -1
- data/bundler/lib/bundler/man/bundle-install.1 +5 -30
- data/bundler/lib/bundler/man/bundle-install.1.ronn +6 -29
- data/bundler/lib/bundler/man/bundle-list.1 +1 -1
- data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
- data/bundler/lib/bundler/man/bundle-open.1 +22 -2
- data/bundler/lib/bundler/man/bundle-open.1.ronn +9 -1
- data/bundler/lib/bundler/man/bundle-outdated.1 +13 -9
- data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -9
- data/bundler/lib/bundler/man/bundle-platform.1 +16 -6
- data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
- data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
- data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
- data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
- data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
- data/bundler/lib/bundler/man/bundle-show.1 +1 -1
- data/bundler/lib/bundler/man/bundle-update.1 +1 -1
- data/bundler/lib/bundler/man/bundle-version.1 +35 -0
- data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/bundler/lib/bundler/man/bundle-viz.1 +4 -1
- data/bundler/lib/bundler/man/bundle-viz.1.ronn +2 -0
- data/bundler/lib/bundler/man/bundle.1 +15 -10
- data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
- data/bundler/lib/bundler/man/gemfile.5 +55 -55
- data/bundler/lib/bundler/man/gemfile.5.ronn +57 -53
- data/bundler/lib/bundler/man/index.txt +4 -0
- data/bundler/lib/bundler/match_metadata.rb +13 -0
- data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
- data/bundler/lib/bundler/mirror.rb +5 -7
- data/bundler/lib/bundler/plugin/index.rb +5 -5
- data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
- data/bundler/lib/bundler/plugin/installer.rb +5 -2
- data/bundler/lib/bundler/plugin.rb +3 -1
- data/bundler/lib/bundler/remote_specification.rb +7 -12
- data/bundler/lib/bundler/resolver/base.rb +107 -0
- data/bundler/lib/bundler/resolver/candidate.rb +94 -0
- data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
- data/bundler/lib/bundler/resolver/package.rb +72 -0
- data/bundler/lib/bundler/resolver/root.rb +25 -0
- data/bundler/lib/bundler/resolver/spec_group.rb +42 -71
- data/bundler/lib/bundler/resolver.rb +335 -328
- data/bundler/lib/bundler/ruby_dsl.rb +7 -1
- data/bundler/lib/bundler/ruby_version.rb +8 -8
- data/bundler/lib/bundler/rubygems_ext.rb +100 -9
- data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -14
- data/bundler/lib/bundler/rubygems_integration.rb +11 -15
- data/bundler/lib/bundler/runtime.rb +2 -6
- data/bundler/lib/bundler/safe_marshal.rb +31 -0
- data/bundler/lib/bundler/settings.rb +5 -11
- data/bundler/lib/bundler/setup.rb +4 -1
- data/bundler/lib/bundler/shared_helpers.rb +3 -3
- data/bundler/lib/bundler/source/git/git_proxy.rb +237 -74
- data/bundler/lib/bundler/source/git.rb +55 -30
- data/bundler/lib/bundler/source/metadata.rb +1 -2
- data/bundler/lib/bundler/source/path/installer.rb +1 -22
- data/bundler/lib/bundler/source/path.rb +6 -6
- data/bundler/lib/bundler/source/rubygems.rb +26 -81
- data/bundler/lib/bundler/source.rb +1 -1
- data/bundler/lib/bundler/source_list.rb +8 -2
- data/bundler/lib/bundler/spec_set.rb +60 -37
- data/bundler/lib/bundler/templates/Executable +1 -1
- data/bundler/lib/bundler/templates/Executable.bundler +5 -10
- data/bundler/lib/bundler/templates/Executable.standalone +2 -0
- data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
- data/bundler/lib/bundler/templates/newgem/Rakefile.tt +12 -1
- data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
- data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
- data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
- data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +9 -2
- data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
- data/bundler/lib/bundler/ui/shell.rb +35 -12
- data/bundler/lib/bundler/ui/silent.rb +21 -5
- data/bundler/lib/bundler/uri_normalizer.rb +23 -0
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1351 -409
- data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
- data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +15 -9
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +11 -6
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
- data/bundler/lib/bundler/vendored_persistent.rb +1 -33
- data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
- data/bundler/lib/bundler/version.rb +5 -1
- data/bundler/lib/bundler/worker.rb +5 -7
- data/bundler/lib/bundler.rb +25 -77
- data/{bin → exe}/gem +4 -5
- data/{bin → exe}/update_rubygems +12 -10
- data/lib/rubygems/available_set.rb +4 -3
- data/lib/rubygems/basic_specification.rb +5 -4
- data/lib/rubygems/bundler_version_finder.rb +2 -2
- data/lib/rubygems/command.rb +41 -32
- data/lib/rubygems/command_manager.rb +30 -15
- data/lib/rubygems/commands/build_command.rb +12 -8
- data/lib/rubygems/commands/cert_command.rb +34 -33
- data/lib/rubygems/commands/check_command.rb +21 -20
- data/lib/rubygems/commands/cleanup_command.rb +18 -17
- data/lib/rubygems/commands/contents_command.rb +14 -13
- data/lib/rubygems/commands/dependency_command.rb +17 -16
- data/lib/rubygems/commands/environment_command.rb +6 -5
- data/lib/rubygems/commands/exec_command.rb +249 -0
- data/lib/rubygems/commands/fetch_command.rb +10 -9
- data/lib/rubygems/commands/generate_index_command.rb +18 -17
- data/lib/rubygems/commands/help_command.rb +7 -6
- data/lib/rubygems/commands/info_command.rb +3 -3
- data/lib/rubygems/commands/install_command.rb +28 -23
- data/lib/rubygems/commands/list_command.rb +4 -3
- data/lib/rubygems/commands/lock_command.rb +5 -4
- data/lib/rubygems/commands/mirror_command.rb +4 -3
- data/lib/rubygems/commands/open_command.rb +10 -9
- data/lib/rubygems/commands/outdated_command.rb +6 -5
- data/lib/rubygems/commands/owner_command.rb +17 -14
- data/lib/rubygems/commands/pristine_command.rb +46 -36
- data/lib/rubygems/commands/push_command.rb +9 -8
- data/lib/rubygems/commands/query_command.rb +9 -8
- data/lib/rubygems/commands/rdoc_command.rb +21 -19
- data/lib/rubygems/commands/search_command.rb +4 -3
- data/lib/rubygems/commands/server_command.rb +4 -3
- data/lib/rubygems/commands/setup_command.rb +97 -106
- data/lib/rubygems/commands/signin_command.rb +10 -9
- data/lib/rubygems/commands/signout_command.rb +8 -7
- data/lib/rubygems/commands/sources_command.rb +22 -21
- data/lib/rubygems/commands/specification_command.rb +14 -13
- data/lib/rubygems/commands/stale_command.rb +3 -2
- data/lib/rubygems/commands/uninstall_command.rb +44 -40
- data/lib/rubygems/commands/unpack_command.rb +14 -13
- data/lib/rubygems/commands/update_command.rb +42 -63
- data/lib/rubygems/commands/which_command.rb +8 -7
- data/lib/rubygems/commands/yank_command.rb +12 -11
- data/lib/rubygems/config_file.rb +55 -21
- data/lib/rubygems/core_ext/kernel_gem.rb +1 -6
- data/lib/rubygems/core_ext/kernel_require.rb +109 -115
- data/lib/rubygems/core_ext/kernel_warn.rb +33 -37
- data/lib/rubygems/core_ext/tcpsocket_init.rb +3 -1
- data/lib/rubygems/defaults.rb +33 -18
- data/lib/rubygems/dependency.rb +15 -11
- data/lib/rubygems/dependency_installer.rb +38 -37
- data/lib/rubygems/dependency_list.rb +7 -6
- data/lib/rubygems/deprecate.rb +3 -2
- data/lib/rubygems/doctor.rb +19 -18
- data/lib/rubygems/errors.rb +3 -2
- data/lib/rubygems/exceptions.rb +16 -8
- data/lib/rubygems/ext/build_error.rb +2 -1
- data/lib/rubygems/ext/builder.rb +37 -21
- data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
- data/lib/rubygems/ext/cargo_builder.rb +150 -111
- data/lib/rubygems/ext/cmake_builder.rb +2 -2
- data/lib/rubygems/ext/configure_builder.rb +2 -1
- data/lib/rubygems/ext/ext_conf_builder.rb +11 -9
- data/lib/rubygems/ext/rake_builder.rb +7 -5
- data/lib/rubygems/ext.rb +8 -7
- data/lib/rubygems/gem_runner.rb +6 -5
- data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
- data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
- data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
- data/lib/rubygems/gemcutter_utilities.rb +90 -34
- data/lib/rubygems/indexer.rb +29 -28
- data/lib/rubygems/install_default_message.rb +3 -2
- data/lib/rubygems/install_message.rb +3 -2
- data/lib/rubygems/install_update_options.rb +56 -55
- data/lib/rubygems/installer.rb +54 -46
- data/lib/rubygems/installer_uninstaller_utils.rb +2 -2
- data/lib/rubygems/local_remote_options.rb +19 -20
- data/lib/rubygems/mock_gem_ui.rb +3 -2
- data/lib/rubygems/name_tuple.rb +5 -4
- data/lib/rubygems/optparse/lib/optparse.rb +20 -15
- data/lib/rubygems/optparse.rb +1 -1
- data/lib/rubygems/package/digest_io.rb +1 -0
- data/lib/rubygems/package/file_source.rb +3 -2
- data/lib/rubygems/package/io_source.rb +1 -0
- data/lib/rubygems/package/old.rb +9 -8
- data/lib/rubygems/package/source.rb +1 -0
- data/lib/rubygems/package/tar_header.rb +63 -62
- data/lib/rubygems/package/tar_reader/entry.rb +91 -9
- data/lib/rubygems/package/tar_reader.rb +2 -29
- data/lib/rubygems/package/tar_writer.rb +8 -7
- data/lib/rubygems/package.rb +64 -48
- data/lib/rubygems/package_task.rb +5 -4
- data/lib/rubygems/path_support.rb +1 -0
- data/lib/rubygems/platform.rb +79 -53
- data/lib/rubygems/psych_tree.rb +2 -1
- data/lib/rubygems/query_utils.rb +35 -35
- data/lib/rubygems/rdoc.rb +3 -2
- data/lib/rubygems/remote_fetcher.rb +23 -22
- data/lib/rubygems/request/connection_pools.rb +4 -4
- data/lib/rubygems/request/http_pool.rb +2 -1
- data/lib/rubygems/request/https_pool.rb +1 -0
- data/lib/rubygems/request.rb +23 -22
- data/lib/rubygems/request_set/gem_dependency_api.rb +123 -123
- data/lib/rubygems/request_set/lockfile/parser.rb +28 -27
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +5 -3
- data/lib/rubygems/request_set/lockfile.rb +6 -5
- data/lib/rubygems/request_set.rb +20 -19
- data/lib/rubygems/requirement.rb +15 -14
- data/lib/rubygems/resolver/activation_request.rb +4 -3
- data/lib/rubygems/resolver/api_set.rb +5 -4
- data/lib/rubygems/resolver/api_specification.rb +7 -6
- data/lib/rubygems/resolver/best_set.rb +6 -5
- data/lib/rubygems/resolver/composed_set.rb +1 -0
- data/lib/rubygems/resolver/conflict.rb +11 -10
- data/lib/rubygems/resolver/current_set.rb +1 -0
- data/lib/rubygems/resolver/dependency_request.rb +3 -2
- data/lib/rubygems/resolver/git_set.rb +3 -2
- data/lib/rubygems/resolver/git_specification.rb +7 -6
- data/lib/rubygems/resolver/index_set.rb +4 -3
- data/lib/rubygems/resolver/index_specification.rb +7 -5
- data/lib/rubygems/resolver/installed_specification.rb +5 -4
- data/lib/rubygems/resolver/installer_set.rb +15 -17
- data/lib/rubygems/resolver/local_specification.rb +3 -2
- data/lib/rubygems/resolver/lock_set.rb +5 -4
- data/lib/rubygems/resolver/lock_specification.rb +5 -4
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
- data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/rubygems/resolver/molinillo.rb +2 -1
- data/lib/rubygems/resolver/requirement_list.rb +1 -0
- data/lib/rubygems/resolver/set.rb +1 -0
- data/lib/rubygems/resolver/source_set.rb +2 -0
- data/lib/rubygems/resolver/spec_specification.rb +1 -0
- data/lib/rubygems/resolver/specification.rb +2 -1
- data/lib/rubygems/resolver/stats.rb +2 -1
- data/lib/rubygems/resolver/vendor_set.rb +2 -1
- data/lib/rubygems/resolver/vendor_specification.rb +4 -3
- data/lib/rubygems/resolver.rb +41 -40
- data/lib/rubygems/s3_uri_signer.rb +10 -8
- data/lib/rubygems/safe_yaml.rb +4 -2
- data/lib/rubygems/security/policies.rb +48 -47
- data/lib/rubygems/security/policy.rb +19 -18
- data/lib/rubygems/security/signer.rb +6 -5
- data/lib/rubygems/security/trust_dir.rb +5 -4
- data/lib/rubygems/security.rb +30 -42
- data/lib/rubygems/security_option.rb +6 -5
- data/lib/rubygems/shellwords.rb +3 -0
- data/lib/rubygems/source/git.rb +22 -22
- data/lib/rubygems/source/installed.rb +2 -1
- data/lib/rubygems/source/local.rb +3 -2
- data/lib/rubygems/source/lock.rb +1 -0
- data/lib/rubygems/source/specific_file.rb +2 -1
- data/lib/rubygems/source/vendor.rb +1 -0
- data/lib/rubygems/source.rb +16 -16
- data/lib/rubygems/spec_fetcher.rb +10 -9
- data/lib/rubygems/specification.rb +121 -114
- data/lib/rubygems/specification_policy.rb +36 -15
- data/lib/rubygems/stub_specification.rb +11 -9
- data/lib/rubygems/text.rb +2 -2
- data/lib/rubygems/tsort/lib/tsort.rb +308 -310
- data/lib/rubygems/tsort.rb +1 -1
- data/lib/rubygems/uninstaller.rb +19 -18
- data/lib/rubygems/update_suggestion.rb +69 -0
- data/lib/rubygems/uri.rb +4 -4
- data/lib/rubygems/uri_formatter.rb +1 -1
- data/lib/rubygems/user_interaction.rb +37 -21
- data/lib/rubygems/util/licenses.rb +4 -3
- data/lib/rubygems/util/list.rb +1 -0
- data/lib/rubygems/util.rb +12 -15
- data/lib/rubygems/validator.rb +7 -6
- data/lib/rubygems/version.rb +17 -11
- data/lib/rubygems/version_option.rb +4 -3
- data/lib/rubygems.rb +89 -68
- data/rubygems-update.gemspec +10 -8
- data/setup.rb +10 -9
- data/test/rubygems/alternate_cert.pem +14 -14
- data/test/rubygems/alternate_cert_32.pem +15 -15
- data/test/rubygems/alternate_key.pem +25 -25
- data/test/rubygems/bad_rake.rb +1 -0
- data/test/rubygems/bundler_test_gem.rb +421 -0
- data/test/rubygems/child_cert.pem +15 -16
- data/test/rubygems/child_cert_32.pem +15 -16
- data/test/rubygems/child_key.pem +25 -25
- data/test/rubygems/encrypted_private_key.pem +26 -26
- data/test/rubygems/expired_cert.pem +15 -15
- data/test/rubygems/fake_certlib/openssl.rb +1 -0
- data/test/rubygems/future_cert.pem +15 -15
- data/test/rubygems/future_cert_32.pem +15 -15
- data/test/rubygems/good_rake.rb +1 -0
- data/test/rubygems/grandchild_cert.pem +15 -16
- data/test/rubygems/grandchild_cert_32.pem +15 -16
- data/test/rubygems/grandchild_key.pem +25 -25
- data/test/rubygems/helper.rb +172 -151
- data/test/rubygems/installer_test_case.rb +14 -13
- data/test/rubygems/invalid_issuer_cert.pem +16 -16
- data/test/rubygems/invalid_issuer_cert_32.pem +16 -16
- data/test/rubygems/invalid_key.pem +25 -25
- data/test/rubygems/invalid_signer_cert.pem +15 -15
- data/test/rubygems/invalid_signer_cert_32.pem +15 -15
- data/test/rubygems/invalidchild_cert.pem +15 -16
- data/test/rubygems/invalidchild_cert_32.pem +15 -16
- data/test/rubygems/invalidchild_key.pem +25 -25
- data/test/rubygems/multifactor_auth_utilities.rb +111 -0
- data/test/rubygems/package/tar_test_case.rb +53 -17
- data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +2 -1
- data/test/rubygems/plugin/load/rubygems_plugin.rb +1 -0
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +2 -1
- data/test/rubygems/private_key.pem +25 -25
- data/test/rubygems/public_cert.pem +16 -16
- data/test/rubygems/public_cert_32.pem +15 -15
- data/test/rubygems/public_key.pem +7 -7
- data/test/rubygems/rubygems/commands/crash_command.rb +1 -0
- data/test/rubygems/rubygems_plugin.rb +3 -2
- data/test/rubygems/simple_gem.rb +2 -1
- data/test/rubygems/specifications/bar-0.0.2.gemspec +2 -0
- data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +6 -4
- data/test/rubygems/test_bundled_ca.rb +13 -12
- data/test/rubygems/test_config.rb +5 -4
- data/test/rubygems/test_deprecate.rb +5 -4
- data/test/rubygems/test_exit.rb +9 -3
- data/test/rubygems/test_gem.rb +339 -677
- data/test/rubygems/test_gem_available_set.rb +22 -21
- data/test/rubygems/test_gem_bundler_version_finder.rb +6 -4
- data/test/rubygems/test_gem_command.rb +45 -44
- data/test/rubygems/test_gem_command_manager.rb +96 -30
- data/test/rubygems/test_gem_commands_build_command.rb +74 -63
- data/test/rubygems/test_gem_commands_cert_command.rb +98 -99
- data/test/rubygems/test_gem_commands_check_command.rb +5 -4
- data/test/rubygems/test_gem_commands_cleanup_command.rb +41 -40
- data/test/rubygems/test_gem_commands_contents_command.rb +28 -27
- data/test/rubygems/test_gem_commands_dependency_command.rb +37 -36
- data/test/rubygems/test_gem_commands_environment_command.rb +17 -16
- data/test/rubygems/test_gem_commands_exec_command.rb +853 -0
- data/test/rubygems/test_gem_commands_fetch_command.rb +38 -37
- data/test/rubygems/test_gem_commands_generate_index_command.rb +8 -7
- data/test/rubygems/test_gem_commands_help_command.rb +14 -13
- data/test/rubygems/test_gem_commands_info_command.rb +29 -2
- data/test/rubygems/test_gem_commands_install_command.rb +152 -132
- data/test/rubygems/test_gem_commands_list_command.rb +5 -4
- data/test/rubygems/test_gem_commands_lock_command.rb +11 -10
- data/test/rubygems/test_gem_commands_mirror.rb +3 -2
- data/test/rubygems/test_gem_commands_open_command.rb +5 -4
- data/test/rubygems/test_gem_commands_outdated_command.rb +10 -9
- data/test/rubygems/test_gem_commands_owner_command.rb +227 -50
- data/test/rubygems/test_gem_commands_pristine_command.rb +142 -93
- data/test/rubygems/test_gem_commands_push_command.rb +189 -64
- data/test/rubygems/test_gem_commands_query_command.rb +74 -73
- data/test/rubygems/test_gem_commands_search_command.rb +3 -2
- data/test/rubygems/test_gem_commands_server_command.rb +3 -2
- data/test/rubygems/test_gem_commands_setup_command.rb +123 -96
- data/test/rubygems/test_gem_commands_signin_command.rb +71 -31
- data/test/rubygems/test_gem_commands_signout_command.rb +3 -3
- data/test/rubygems/test_gem_commands_sources_command.rb +29 -29
- data/test/rubygems/test_gem_commands_specification_command.rb +33 -32
- data/test/rubygems/test_gem_commands_stale_command.rb +5 -4
- data/test/rubygems/test_gem_commands_uninstall_command.rb +99 -81
- data/test/rubygems/test_gem_commands_unpack_command.rb +32 -31
- data/test/rubygems/test_gem_commands_update_command.rb +96 -95
- data/test/rubygems/test_gem_commands_which_command.rb +7 -6
- data/test/rubygems/test_gem_commands_yank_command.rb +162 -43
- data/test/rubygems/test_gem_config_file.rb +94 -81
- data/test/rubygems/test_gem_dependency.rb +76 -73
- data/test/rubygems/test_gem_dependency_installer.rb +200 -165
- data/test/rubygems/test_gem_dependency_list.rb +48 -47
- data/test/rubygems/test_gem_dependency_resolution_error.rb +5 -4
- data/test/rubygems/test_gem_doctor.rb +27 -26
- data/test/rubygems/test_gem_ext_builder.rb +60 -61
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +4 -4
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.lock → ext/custom_name_lib/Cargo.lock} +23 -33
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.toml → ext/custom_name_lib/Cargo.toml} +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{src → ext/custom_name_lib/src}/lib.rs +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +3 -0
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +37 -33
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +2 -0
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
- data/test/rubygems/test_gem_ext_cargo_builder.rb +48 -59
- data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +20 -19
- data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +21 -36
- data/test/rubygems/test_gem_ext_cmake_builder.rb +16 -15
- data/test/rubygems/test_gem_ext_configure_builder.rb +14 -13
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +51 -52
- data/test/rubygems/test_gem_ext_rake_builder.rb +16 -15
- data/test/rubygems/test_gem_gem_runner.rb +15 -9
- data/test/rubygems/test_gem_gemcutter_utilities.rb +170 -84
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +5 -4
- data/test/rubygems/test_gem_indexer.rb +87 -67
- data/test/rubygems/test_gem_install_update_options.rb +17 -16
- data/test/rubygems/test_gem_installer.rb +422 -304
- data/test/rubygems/test_gem_local_remote_options.rb +11 -10
- data/test/rubygems/test_gem_name_tuple.rb +5 -4
- data/test/rubygems/test_gem_package.rb +243 -231
- data/test/rubygems/test_gem_package_old.rb +14 -13
- data/test/rubygems/test_gem_package_tar_header.rb +48 -47
- data/test/rubygems/test_gem_package_tar_reader.rb +56 -8
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +162 -16
- data/test/rubygems/test_gem_package_tar_writer.rb +77 -76
- data/test/rubygems/test_gem_package_task.rb +19 -18
- data/test/rubygems/test_gem_path_support.rb +15 -14
- data/test/rubygems/test_gem_platform.rb +333 -227
- data/test/rubygems/test_gem_rdoc.rb +15 -14
- data/test/rubygems/test_gem_remote_fetcher.rb +155 -154
- data/test/rubygems/test_gem_request.rb +64 -58
- data/test/rubygems/test_gem_request_connection_pools.rb +30 -29
- data/test/rubygems/test_gem_request_set.rb +101 -100
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +210 -211
- data/test/rubygems/test_gem_request_set_lockfile.rb +87 -86
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +58 -57
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +63 -62
- data/test/rubygems/test_gem_requirement.rb +48 -41
- data/test/rubygems/test_gem_resolver.rb +167 -99
- data/test/rubygems/test_gem_resolver_activation_request.rb +7 -6
- data/test/rubygems/test_gem_resolver_api_set.rb +34 -33
- data/test/rubygems/test_gem_resolver_api_specification.rb +48 -47
- data/test/rubygems/test_gem_resolver_best_set.rb +23 -22
- data/test/rubygems/test_gem_resolver_composed_set.rb +2 -1
- data/test/rubygems/test_gem_resolver_conflict.rb +13 -12
- data/test/rubygems/test_gem_resolver_dependency_request.rb +16 -15
- data/test/rubygems/test_gem_resolver_git_set.rb +22 -21
- data/test/rubygems/test_gem_resolver_git_specification.rb +22 -21
- data/test/rubygems/test_gem_resolver_index_set.rb +13 -12
- data/test/rubygems/test_gem_resolver_index_specification.rb +17 -16
- data/test/rubygems/test_gem_resolver_installed_specification.rb +6 -5
- data/test/rubygems/test_gem_resolver_installer_set.rb +79 -34
- data/test/rubygems/test_gem_resolver_local_specification.rb +8 -7
- data/test/rubygems/test_gem_resolver_lock_set.rb +13 -12
- data/test/rubygems/test_gem_resolver_lock_specification.rb +18 -17
- data/test/rubygems/test_gem_resolver_requirement_list.rb +2 -1
- data/test/rubygems/test_gem_resolver_specification.rb +9 -8
- data/test/rubygems/test_gem_resolver_vendor_set.rb +7 -6
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +11 -10
- data/test/rubygems/test_gem_security.rb +69 -68
- data/test/rubygems/test_gem_security_policy.rb +72 -72
- data/test/rubygems/test_gem_security_signer.rb +35 -34
- data/test/rubygems/test_gem_security_trust_dir.rb +7 -6
- data/test/rubygems/test_gem_silent_ui.rb +39 -32
- data/test/rubygems/test_gem_source.rb +45 -44
- data/test/rubygems/test_gem_source_fetch_problem.rb +10 -9
- data/test/rubygems/test_gem_source_git.rb +69 -62
- data/test/rubygems/test_gem_source_installed.rb +17 -16
- data/test/rubygems/test_gem_source_list.rb +6 -5
- data/test/rubygems/test_gem_source_local.rb +15 -14
- data/test/rubygems/test_gem_source_lock.rb +32 -31
- data/test/rubygems/test_gem_source_specific_file.rb +18 -17
- data/test/rubygems/test_gem_source_subpath_problem.rb +8 -7
- data/test/rubygems/test_gem_source_vendor.rb +14 -13
- data/test/rubygems/test_gem_spec_fetcher.rb +73 -72
- data/test/rubygems/test_gem_specification.rb +533 -469
- data/test/rubygems/test_gem_stream_ui.rb +53 -22
- data/test/rubygems/test_gem_stub_specification.rb +33 -32
- data/test/rubygems/test_gem_text.rb +2 -1
- data/test/rubygems/test_gem_uninstaller.rb +118 -117
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +4 -3
- data/test/rubygems/test_gem_update_suggestion.rb +209 -0
- data/test/rubygems/test_gem_uri.rb +6 -4
- data/test/rubygems/test_gem_uri_formatter.rb +15 -14
- data/test/rubygems/test_gem_util.rb +24 -23
- data/test/rubygems/test_gem_validator.rb +8 -8
- data/test/rubygems/test_gem_version.rb +24 -16
- data/test/rubygems/test_gem_version_option.rb +16 -15
- data/test/rubygems/test_kernel.rb +43 -48
- data/test/rubygems/test_project_sanity.rb +32 -3
- data/test/rubygems/test_remote_fetch_error.rb +8 -7
- data/test/rubygems/test_require.rb +118 -103
- data/test/rubygems/test_rubygems.rb +10 -8
- data/test/rubygems/test_webauthn_listener.rb +143 -0
- data/test/rubygems/test_webauthn_listener_response.rb +93 -0
- data/test/rubygems/test_webauthn_poller.rb +124 -0
- data/test/rubygems/utilities.rb +98 -34
- data/test/rubygems/wrong_key_cert.pem +15 -15
- data/test/rubygems/wrong_key_cert_32.pem +15 -15
- data/test/test_changelog_generator.rb +1 -1
- metadata +99 -46
- data/bundler/lib/bundler/dep_proxy.rb +0 -55
- data/bundler/lib/bundler/templates/gems.rb +0 -5
- data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
- data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
- data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
- data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
- data/bundler/lib/bundler/version_ranges.rb +0 -122
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
2
|
+
|
3
|
+
require_relative "helper"
|
4
|
+
require "rubygems"
|
4
5
|
|
5
6
|
class TestGemRequire < Gem::TestCase
|
6
7
|
class Latch
|
@@ -35,26 +36,26 @@ class TestGemRequire < Gem::TestCase
|
|
35
36
|
def test_respect_loaded_features_caching_like_standard_require
|
36
37
|
dir = Dir.mktmpdir("test_require", @tempdir)
|
37
38
|
|
38
|
-
lp1 = File.join dir,
|
39
|
-
foo1 = File.join lp1,
|
39
|
+
lp1 = File.join dir, "foo1"
|
40
|
+
foo1 = File.join lp1, "foo.rb"
|
40
41
|
|
41
42
|
FileUtils.mkdir_p lp1
|
42
|
-
File.open(foo1,
|
43
|
+
File.open(foo1, "w") {|f| f.write "class Object; HELLO = 'foo1' end" }
|
43
44
|
|
44
45
|
lp = $LOAD_PATH.dup
|
45
46
|
|
46
47
|
$LOAD_PATH.unshift lp1
|
47
|
-
assert_require
|
48
|
+
assert_require "foo"
|
48
49
|
assert_equal "foo1", ::Object::HELLO
|
49
50
|
|
50
|
-
lp2 = File.join dir,
|
51
|
-
foo2 = File.join lp2,
|
51
|
+
lp2 = File.join dir, "foo2"
|
52
|
+
foo2 = File.join lp2, "foo.rb"
|
52
53
|
|
53
54
|
FileUtils.mkdir_p lp2
|
54
|
-
File.open(foo2,
|
55
|
+
File.open(foo2, "w") {|f| f.write "class Object; HELLO = 'foo2' end" }
|
55
56
|
|
56
57
|
$LOAD_PATH.unshift lp2
|
57
|
-
refute_require
|
58
|
+
refute_require "foo"
|
58
59
|
assert_equal "foo1", ::Object::HELLO
|
59
60
|
ensure
|
60
61
|
$LOAD_PATH.replace lp
|
@@ -71,18 +72,18 @@ class TestGemRequire < Gem::TestCase
|
|
71
72
|
install_specs c1, c2, b1, a1
|
72
73
|
|
73
74
|
dir = Dir.mktmpdir("test_require", @tempdir)
|
74
|
-
dash_i_arg = File.join dir,
|
75
|
+
dash_i_arg = File.join dir, "lib"
|
75
76
|
|
76
|
-
c_rb = File.join dash_i_arg,
|
77
|
+
c_rb = File.join dash_i_arg, "b", "c.rb"
|
77
78
|
|
78
79
|
FileUtils.mkdir_p File.dirname c_rb
|
79
|
-
File.open(c_rb,
|
80
|
+
File.open(c_rb, "w") {|f| f.write "class Object; HELLO = 'world' end" }
|
80
81
|
|
81
82
|
# Pretend to provide a commandline argument that overrides a file in gem b
|
82
83
|
$LOAD_PATH.unshift dash_i_arg
|
83
84
|
|
84
|
-
assert_require
|
85
|
-
assert_require
|
85
|
+
assert_require "test_gem_require_a"
|
86
|
+
assert_require "b/c" # this should be required from -I
|
86
87
|
assert_equal "world", ::Object::HELLO
|
87
88
|
assert_equal %w[a-1 b-1], loaded_spec_names
|
88
89
|
ensure
|
@@ -110,20 +111,20 @@ class TestGemRequire < Gem::TestCase
|
|
110
111
|
install_default_gems c1, c2, b1, a1
|
111
112
|
|
112
113
|
dir = Dir.mktmpdir("test_require", @tempdir)
|
113
|
-
dash_i_arg = File.join dir,
|
114
|
+
dash_i_arg = File.join dir, "lib"
|
114
115
|
|
115
|
-
c_rb = File.join dash_i_arg,
|
116
|
+
c_rb = File.join dash_i_arg, "c", "c.rb"
|
116
117
|
|
117
118
|
FileUtils.mkdir_p File.dirname c_rb
|
118
|
-
File.open(c_rb,
|
119
|
+
File.open(c_rb, "w") {|f| f.write "class Object; HELLO = 'world' end" }
|
119
120
|
|
120
|
-
assert_require
|
121
|
+
assert_require "test_gem_require_a"
|
121
122
|
|
122
123
|
# Pretend to provide a commandline argument that overrides a file in gem b
|
123
124
|
$LOAD_PATH.unshift dash_i_arg
|
124
125
|
|
125
|
-
assert_require
|
126
|
-
assert_require
|
126
|
+
assert_require "b/c"
|
127
|
+
assert_require "c/c" # this should be required from -I
|
127
128
|
assert_equal "world", ::Object::HELLO
|
128
129
|
assert_equal %w[a-1 b-1], loaded_spec_names
|
129
130
|
ensure
|
@@ -134,12 +135,12 @@ class TestGemRequire < Gem::TestCase
|
|
134
135
|
pend "extensions don't quite work on jruby" if Gem.java_platform?
|
135
136
|
pend "not installed yet" unless RbConfig::TOPDIR
|
136
137
|
|
137
|
-
dash_i_ext_arg = util_install_extension_file(
|
138
|
-
dash_i_lib_arg = util_install_ruby_file(
|
138
|
+
dash_i_ext_arg = util_install_extension_file("a")
|
139
|
+
dash_i_lib_arg = util_install_ruby_file("a")
|
139
140
|
|
140
141
|
$LOAD_PATH.unshift dash_i_lib_arg
|
141
142
|
$LOAD_PATH.unshift dash_i_ext_arg
|
142
|
-
assert_require
|
143
|
+
assert_require "a"
|
143
144
|
assert_match(/a\.rb$/, $LOADED_FEATURES.last)
|
144
145
|
end
|
145
146
|
|
@@ -175,7 +176,7 @@ class TestGemRequire < Gem::TestCase
|
|
175
176
|
|
176
177
|
install_specs b1, b2, a1
|
177
178
|
|
178
|
-
assert_require
|
179
|
+
assert_require "test_gem_require_a"
|
179
180
|
assert_equal %w[a-1 b-1], loaded_spec_names
|
180
181
|
assert_equal unresolved_names, []
|
181
182
|
|
@@ -190,7 +191,7 @@ class TestGemRequire < Gem::TestCase
|
|
190
191
|
|
191
192
|
install_specs b1, b2, a1
|
192
193
|
|
193
|
-
assert_require
|
194
|
+
assert_require "test_gem_require_a"
|
194
195
|
assert_equal %w[a-1], loaded_spec_names
|
195
196
|
assert_equal unresolved_names, ["b (>= 1)"]
|
196
197
|
|
@@ -204,7 +205,7 @@ class TestGemRequire < Gem::TestCase
|
|
204
205
|
|
205
206
|
install_specs b1, a1
|
206
207
|
|
207
|
-
assert_require
|
208
|
+
assert_require "test_gem_require_a"
|
208
209
|
assert_equal %w[a-1 b-1], loaded_spec_names
|
209
210
|
assert_equal unresolved_names, []
|
210
211
|
|
@@ -217,7 +218,7 @@ class TestGemRequire < Gem::TestCase
|
|
217
218
|
|
218
219
|
install_specs a1
|
219
220
|
|
220
|
-
assert_require Pathname.new
|
221
|
+
assert_require Pathname.new "test_gem_require_a"
|
221
222
|
assert_equal %w[a-1], loaded_spec_names
|
222
223
|
assert_equal unresolved_names, []
|
223
224
|
end
|
@@ -241,7 +242,7 @@ class TestGemRequire < Gem::TestCase
|
|
241
242
|
load_path_changed = true
|
242
243
|
end
|
243
244
|
|
244
|
-
require
|
245
|
+
require "benchmark" # the stdlib
|
245
246
|
|
246
247
|
a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb"
|
247
248
|
b1 = util_spec "b", "1", nil, "lib/benchmark.rb"
|
@@ -250,11 +251,11 @@ class TestGemRequire < Gem::TestCase
|
|
250
251
|
install_specs b1, b2, a1
|
251
252
|
|
252
253
|
# Activates a-1, but not b-1 and b-2
|
253
|
-
assert_require
|
254
|
+
assert_require "test_gem_require_a"
|
254
255
|
assert_equal %w[a-1], loaded_spec_names
|
255
|
-
assert $LOAD_PATH.include? a1.
|
256
|
-
refute $LOAD_PATH.include? b1.
|
257
|
-
refute $LOAD_PATH.include? b2.
|
256
|
+
assert $LOAD_PATH.include? a1.full_require_paths[0]
|
257
|
+
refute $LOAD_PATH.include? b1.full_require_paths[0]
|
258
|
+
refute $LOAD_PATH.include? b2.full_require_paths[0]
|
258
259
|
|
259
260
|
assert_equal unresolved_names, ["b (>= 1)"]
|
260
261
|
|
@@ -263,15 +264,15 @@ class TestGemRequire < Gem::TestCase
|
|
263
264
|
# though b-2 is earlier in $LOAD_PATH it already loaded a benchmark.rb file
|
264
265
|
# and that still exists in $LOAD_PATH (further down),
|
265
266
|
# and as a result #gem_original_require returns false.
|
266
|
-
refute require(
|
267
|
+
refute require("benchmark"), "the benchmark stdlib should be recognized as already loaded"
|
267
268
|
|
268
|
-
assert_includes $LOAD_PATH, b2.
|
269
|
+
assert_includes $LOAD_PATH, b2.full_require_paths[0]
|
269
270
|
assert_includes $LOAD_PATH, rubylibdir
|
270
271
|
message = proc {
|
271
272
|
"this test relies on the b-2 gem lib/ to be before stdlib to make sense\n" +
|
272
|
-
|
273
|
+
$LOAD_PATH.pretty_inspect
|
273
274
|
}
|
274
|
-
assert_operator $LOAD_PATH.index(b2.
|
275
|
+
assert_operator $LOAD_PATH.index(b2.full_require_paths[0]), :<, $LOAD_PATH.index(rubylibdir), message
|
275
276
|
|
276
277
|
# We detected that we should activate b-2, so we did so, but
|
277
278
|
# then #gem_original_require decided "I've already got some benchmark.rb" loaded.
|
@@ -296,7 +297,7 @@ class TestGemRequire < Gem::TestCase
|
|
296
297
|
|
297
298
|
install_specs a2
|
298
299
|
|
299
|
-
refute_require
|
300
|
+
refute_require "a"
|
300
301
|
|
301
302
|
assert_equal %w[a-1], loaded_spec_names
|
302
303
|
end
|
@@ -378,7 +379,7 @@ class TestGemRequire < Gem::TestCase
|
|
378
379
|
|
379
380
|
# Load default ruby gems fresh as if we've just started a ruby script.
|
380
381
|
Gem::Specification.reset
|
381
|
-
require
|
382
|
+
require "rubygems"
|
382
383
|
Gem::Specification.stubs
|
383
384
|
|
384
385
|
# Remove an old default gem version directly from disk as if someone ran
|
@@ -387,9 +388,9 @@ class TestGemRequire < Gem::TestCase
|
|
387
388
|
FileUtils.rm_rf(File.join @gemhome, "specifications", "default", "#{b1.full_name}.gemspec")
|
388
389
|
|
389
390
|
# Require gems that have not been removed.
|
390
|
-
assert_require
|
391
|
+
assert_require "a/b"
|
391
392
|
assert_equal %w[a-1.0], loaded_spec_names
|
392
|
-
assert_require
|
393
|
+
assert_require "b/d"
|
393
394
|
assert_equal %w[a-1.0 b-2.0], loaded_spec_names
|
394
395
|
end
|
395
396
|
|
@@ -471,7 +472,7 @@ class TestGemRequire < Gem::TestCase
|
|
471
472
|
RUBY
|
472
473
|
File.write(path, code)
|
473
474
|
|
474
|
-
output = Gem::Util.popen({
|
475
|
+
output = Gem::Util.popen({ "GEM_HOME" => @gemhome }, *ruby_with_rubygems_in_load_path, path).strip
|
475
476
|
assert $?.success?
|
476
477
|
refute_empty output
|
477
478
|
assert_equal "999.99.9", output.lines[0].chomp
|
@@ -542,11 +543,11 @@ class TestGemRequire < Gem::TestCase
|
|
542
543
|
silence_warnings do
|
543
544
|
class << ::Gem
|
544
545
|
alias old_try_activate try_activate
|
545
|
-
def try_activate(*); raise
|
546
|
+
def try_activate(*); raise "raised from try_activate"; end
|
546
547
|
end
|
547
548
|
end
|
548
549
|
|
549
|
-
require
|
550
|
+
require "does_not_exist_for_try_activate_test"
|
550
551
|
rescue RuntimeError => e
|
551
552
|
assert_match(/raised from try_activate/, e.message)
|
552
553
|
assert Kernel::RUBYGEMS_ACTIVATION_MONITOR.try_enter, "require monitor was not unlocked when try_activate raised"
|
@@ -585,90 +586,104 @@ class TestGemRequire < Gem::TestCase
|
|
585
586
|
end
|
586
587
|
|
587
588
|
def test_require_bundler
|
588
|
-
b1 = util_spec(
|
589
|
-
b2a = util_spec(
|
589
|
+
b1 = util_spec("bundler", "1", nil, "lib/bundler/setup.rb")
|
590
|
+
b2a = util_spec("bundler", "2.a", nil, "lib/bundler/setup.rb")
|
590
591
|
install_specs b1, b2a
|
591
592
|
|
592
593
|
require "rubygems/bundler_version_finder"
|
593
594
|
$:.clear
|
594
|
-
assert_require
|
595
|
+
assert_require "bundler/setup"
|
595
596
|
assert_equal %w[bundler-2.a], loaded_spec_names
|
596
597
|
assert_empty unresolved_names
|
597
598
|
end
|
598
599
|
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
_, err = capture_subprocess_io do
|
607
|
-
system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
|
608
|
-
end
|
609
|
-
assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
|
610
|
-
_, err = capture_subprocess_io do
|
611
|
-
system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
|
612
|
-
end
|
613
|
-
assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
|
600
|
+
["", "Kernel."].each do |prefix|
|
601
|
+
define_method "test_no_kernel_require_in_#{prefix.tr(".", "_")}warn_with_uplevel" do
|
602
|
+
Dir.mktmpdir("warn_test") do |dir|
|
603
|
+
File.write(dir + "/sub.rb", "#{prefix}warn 'uplevel', 'test', uplevel: 1\n")
|
604
|
+
File.write(dir + "/main.rb", "require 'sub'\n")
|
605
|
+
_, err = capture_subprocess_io do
|
606
|
+
system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
|
614
607
|
end
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
Dir.mktmpdir("warn_test") do |dir|
|
619
|
-
File.write(dir + "/main.rb", "#{prefix}warn({x:1}, {y:2}, [])\n")
|
620
|
-
_, err = capture_subprocess_io do
|
621
|
-
system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
|
622
|
-
end
|
623
|
-
assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
|
624
|
-
_, err = capture_subprocess_io do
|
625
|
-
system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
|
626
|
-
end
|
627
|
-
assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
|
608
|
+
assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
|
609
|
+
_, err = capture_subprocess_io do
|
610
|
+
system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
|
628
611
|
end
|
612
|
+
assert_match(/main\.rb:1: warning: uplevel\ntest\n$/, err)
|
629
613
|
end
|
630
614
|
end
|
631
615
|
|
632
|
-
|
616
|
+
define_method "test_no_other_behavioral_changes_with_#{prefix.tr(".", "_")}warn" do
|
633
617
|
Dir.mktmpdir("warn_test") do |dir|
|
634
|
-
File.write(dir + "/main.rb", "
|
618
|
+
File.write(dir + "/main.rb", "#{prefix}warn({x:1}, {y:2}, [])\n")
|
635
619
|
_, err = capture_subprocess_io do
|
636
620
|
system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
|
637
621
|
end
|
638
|
-
assert_match(/
|
622
|
+
assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
|
639
623
|
_, err = capture_subprocess_io do
|
640
624
|
system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
|
641
625
|
end
|
642
|
-
assert_match(/
|
626
|
+
assert_match(/{:x=>1}\n{:y=>2}\n$/, err)
|
643
627
|
end
|
644
628
|
end
|
629
|
+
end
|
645
630
|
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
631
|
+
def test_no_crash_when_overriding_warn_with_warning_module
|
632
|
+
Dir.mktmpdir("warn_test") do |dir|
|
633
|
+
File.write(dir + "/main.rb", "module Warning; def warn(str); super; end; end; warn 'Foo Bar'")
|
634
|
+
_, err = capture_subprocess_io do
|
635
|
+
system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb")
|
636
|
+
end
|
637
|
+
assert_match(/Foo Bar\n$/, err)
|
638
|
+
_, err = capture_subprocess_io do
|
639
|
+
system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb")
|
640
|
+
end
|
641
|
+
assert_match(/Foo Bar\n$/, err)
|
642
|
+
end
|
643
|
+
end
|
659
644
|
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
645
|
+
def test_expected_backtrace_location_when_inheriting_from_basic_object_and_including_kernel
|
646
|
+
Dir.mktmpdir("warn_test") do |dir|
|
647
|
+
File.write(dir + "/main.rb", "\nrequire 'sub'\n")
|
648
|
+
File.write(dir + "/sub.rb", <<-'RUBY')
|
649
|
+
require 'rubygems'
|
650
|
+
class C < BasicObject
|
651
|
+
include ::Kernel
|
652
|
+
def deprecated
|
653
|
+
warn "This is a deprecated method", uplevel: 2
|
654
|
+
end
|
666
655
|
end
|
667
|
-
|
656
|
+
C.new.deprecated
|
657
|
+
RUBY
|
658
|
+
|
659
|
+
_, err = capture_subprocess_io do
|
660
|
+
system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "-I", dir, "main.rb")
|
661
|
+
end
|
662
|
+
assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
|
663
|
+
_, err = capture_subprocess_io do
|
664
|
+
system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "-I", dir, "main.rb")
|
668
665
|
end
|
666
|
+
assert_match(/main\.rb:2: warning: This is a deprecated method$/, err)
|
669
667
|
end
|
670
668
|
end
|
671
669
|
|
670
|
+
def test_require_does_not_crash_when_utilizing_bundler_version_finder
|
671
|
+
a1 = util_spec "a", "1.1", { "bundler" => ">= 0" }
|
672
|
+
a2 = util_spec "a", "1.2", { "bundler" => ">= 0" }
|
673
|
+
b1 = util_spec "bundler", "2.3.7"
|
674
|
+
b2 = util_spec "bundler", "2.3.24"
|
675
|
+
c = util_spec "c", "1", { "a" => [">= 1.1", "< 99.0"] }, "lib/test_gem_require_c.rb"
|
676
|
+
|
677
|
+
install_specs a1, a2, b1, b2, c
|
678
|
+
|
679
|
+
cmd = <<-RUBY
|
680
|
+
require "test_gem_require_c"
|
681
|
+
require "json"
|
682
|
+
RUBY
|
683
|
+
out = Gem::Util.popen({ "GEM_HOME" => @gemhome }, *ruby_with_rubygems_in_load_path, "-e", cmd)
|
684
|
+
assert_predicate $?, :success?, "Require failed due to #{out}"
|
685
|
+
end
|
686
|
+
|
672
687
|
private
|
673
688
|
|
674
689
|
def util_install_extension_file(name)
|
@@ -694,13 +709,13 @@ class TestGemRequire < Gem::TestCase
|
|
694
709
|
|
695
710
|
spec.files += ["extconf.rb", "depend", "#{name}.c"]
|
696
711
|
|
697
|
-
|
698
|
-
assert_path_not_exist
|
712
|
+
extension_file = File.join(spec.extension_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
|
713
|
+
assert_path_not_exist extension_file
|
699
714
|
|
700
715
|
path = Gem::Package.build spec
|
701
716
|
installer = Gem::Installer.at path
|
702
717
|
installer.install
|
703
|
-
assert_path_exist
|
718
|
+
assert_path_exist extension_file
|
704
719
|
|
705
720
|
spec.gem_dir
|
706
721
|
end
|
@@ -712,7 +727,7 @@ class TestGemRequire < Gem::TestCase
|
|
712
727
|
a_rb = File.join dash_i_lib_arg, "#{name}.rb"
|
713
728
|
|
714
729
|
FileUtils.mkdir_p File.dirname a_rb
|
715
|
-
File.open(a_rb,
|
730
|
+
File.open(a_rb, "w") {|f| f.write "# #{name}.rb" }
|
716
731
|
|
717
732
|
dash_i_lib_arg
|
718
733
|
end
|
@@ -1,19 +1,21 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "helper"
|
2
4
|
|
3
5
|
class GemTest < Gem::TestCase
|
4
6
|
def test_rubygems_normal_behaviour
|
5
|
-
_ = Gem::Util.popen(*ruby_with_rubygems_in_load_path,
|
7
|
+
_ = Gem::Util.popen(*ruby_with_rubygems_in_load_path, "-e", "'require \"rubygems\"'", { :err => [:child, :out] }).strip
|
6
8
|
assert $?.success?
|
7
9
|
end
|
8
10
|
|
9
11
|
def test_operating_system_other_exceptions
|
10
|
-
pend "does not apply to truffleruby" if RUBY_ENGINE ==
|
12
|
+
pend "does not apply to truffleruby" if RUBY_ENGINE == "truffleruby"
|
11
13
|
|
12
14
|
path = util_install_operating_system_rb <<-RUBY
|
13
15
|
intentionally_not_implemented_method
|
14
16
|
RUBY
|
15
17
|
|
16
|
-
output = Gem::Util.popen(*ruby_with_rubygems_and_fake_operating_system_in_load_path(path),
|
18
|
+
output = Gem::Util.popen(*ruby_with_rubygems_and_fake_operating_system_in_load_path(path), "-e", "'require \"rubygems\"'", { :err => [:child, :out] }).strip
|
17
19
|
assert !$?.success?
|
18
20
|
assert_includes output, "undefined local variable or method `intentionally_not_implemented_method'"
|
19
21
|
assert_includes output, "Loading the #{operating_system_rb_at(path)} file caused an error. " \
|
@@ -23,8 +25,8 @@ class GemTest < Gem::TestCase
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def test_operating_system_customizing_default_dir
|
26
|
-
pend "does not apply to truffleruby" if RUBY_ENGINE ==
|
27
|
-
pend "loads a custom defaults/jruby file that gets in the middle" if RUBY_ENGINE ==
|
28
|
+
pend "does not apply to truffleruby" if RUBY_ENGINE == "truffleruby"
|
29
|
+
pend "loads a custom defaults/jruby file that gets in the middle" if RUBY_ENGINE == "jruby"
|
28
30
|
|
29
31
|
# On a non existing default dir, there should be no gems
|
30
32
|
|
@@ -38,7 +40,7 @@ class GemTest < Gem::TestCase
|
|
38
40
|
|
39
41
|
output = Gem::Util.popen(
|
40
42
|
*ruby_with_rubygems_and_fake_operating_system_in_load_path(path),
|
41
|
-
|
43
|
+
"-e",
|
42
44
|
"require \"rubygems\"; puts Gem::Specification.stubs.map(&:full_name)",
|
43
45
|
{ :err => [:child, :out] }
|
44
46
|
).strip
|
@@ -59,7 +61,7 @@ class GemTest < Gem::TestCase
|
|
59
61
|
|
60
62
|
FileUtils.mkdir_p File.dirname(operating_system_rb)
|
61
63
|
|
62
|
-
File.open(operating_system_rb,
|
64
|
+
File.open(operating_system_rb, "w") {|f| f.write content }
|
63
65
|
|
64
66
|
dir_lib_arg
|
65
67
|
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "helper"
|
4
|
+
require "rubygems/gemcutter_utilities/webauthn_listener"
|
5
|
+
require "rubygems/gemcutter_utilities"
|
6
|
+
|
7
|
+
class WebauthnListenerTest < Gem::TestCase
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
@server = TCPServer.new 0
|
11
|
+
@port = @server.addr[1].to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
@thread.kill.join if @thread
|
16
|
+
@server&.close
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_listener_thread_retreives_otp_code
|
21
|
+
thread = Gem::GemcutterUtilities::WebauthnListener.listener_thread(Gem.host, @server)
|
22
|
+
Gem::MockBrowser.get URI("http://localhost:#{@port}?code=xyz")
|
23
|
+
|
24
|
+
thread.join
|
25
|
+
assert_equal "xyz", thread[:otp]
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_listener_thread_sets_error
|
29
|
+
thread = Gem::GemcutterUtilities::WebauthnListener.listener_thread(Gem.host, @server)
|
30
|
+
Gem::MockBrowser.post URI("http://localhost:#{@port}?code=xyz")
|
31
|
+
|
32
|
+
thread.join
|
33
|
+
assert_equal "Security device verification failed: Invalid HTTP method POST received.", thread[:error].message
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_wait_for_otp_code_get_follows_options
|
37
|
+
wait_for_otp_code
|
38
|
+
assert Gem::MockBrowser.options(URI("http://localhost:#{@port}?code=xyz")).is_a? Net::HTTPNoContent
|
39
|
+
assert Gem::MockBrowser.get(URI("http://localhost:#{@port}?code=xyz")).is_a? Net::HTTPOK
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_wait_for_otp_code_options_request
|
43
|
+
wait_for_otp_code
|
44
|
+
response = Gem::MockBrowser.options URI("http://localhost:#{@port}?code=xyz")
|
45
|
+
|
46
|
+
assert response.is_a? Net::HTTPNoContent
|
47
|
+
assert_equal Gem.host, response["access-control-allow-origin"]
|
48
|
+
assert_equal "POST", response["access-control-allow-methods"]
|
49
|
+
assert_equal "Content-Type, Authorization, x-csrf-token", response["access-control-allow-headers"]
|
50
|
+
assert_equal "close", response["Connection"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_wait_for_otp_code_get_request
|
54
|
+
wait_for_otp_code
|
55
|
+
response = Gem::MockBrowser.get URI("http://localhost:#{@port}?code=xyz")
|
56
|
+
|
57
|
+
assert response.is_a? Net::HTTPOK
|
58
|
+
assert_equal "text/plain; charset=utf-8", response["Content-Type"]
|
59
|
+
assert_equal "7", response["Content-Length"]
|
60
|
+
assert_equal Gem.host, response["access-control-allow-origin"]
|
61
|
+
assert_equal "POST", response["access-control-allow-methods"]
|
62
|
+
assert_equal "Content-Type, Authorization, x-csrf-token", response["access-control-allow-headers"]
|
63
|
+
assert_equal "close", response["Connection"]
|
64
|
+
assert_equal "success", response.body
|
65
|
+
|
66
|
+
@thread.join
|
67
|
+
assert_equal "xyz", @thread[:otp]
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_wait_for_otp_code_invalid_post_req_method
|
71
|
+
wait_for_otp_code_expect_error_with_message("Security device verification failed: Invalid HTTP method POST received.")
|
72
|
+
response = Gem::MockBrowser.post URI("http://localhost:#{@port}?code=xyz")
|
73
|
+
|
74
|
+
assert response
|
75
|
+
assert response.is_a? Net::HTTPMethodNotAllowed
|
76
|
+
assert_equal "GET, OPTIONS", response["allow"]
|
77
|
+
assert_equal "close", response["Connection"]
|
78
|
+
|
79
|
+
@thread.join
|
80
|
+
assert_nil @thread[:otp]
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_wait_for_otp_code_incorrect_path
|
84
|
+
wait_for_otp_code_expect_error_with_message("Security device verification failed: Page at /path not found.")
|
85
|
+
response = Gem::MockBrowser.post URI("http://localhost:#{@port}/path?code=xyz")
|
86
|
+
|
87
|
+
assert response.is_a? Net::HTTPNotFound
|
88
|
+
assert_equal "close", response["Connection"]
|
89
|
+
|
90
|
+
@thread.join
|
91
|
+
assert_nil @thread[:otp]
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_wait_for_otp_code_no_params_response
|
95
|
+
wait_for_otp_code_expect_error_with_message("Security device verification failed: Did not receive OTP from https://rubygems.org.")
|
96
|
+
response = Gem::MockBrowser.get URI("http://localhost:#{@port}")
|
97
|
+
|
98
|
+
assert response.is_a? Net::HTTPBadRequest
|
99
|
+
assert_equal "text/plain; charset=utf-8", response["Content-Type"]
|
100
|
+
assert_equal "22", response["Content-Length"]
|
101
|
+
assert_equal "close", response["Connection"]
|
102
|
+
assert_equal "missing code parameter", response.body
|
103
|
+
|
104
|
+
@thread.join
|
105
|
+
assert_nil @thread[:otp]
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_wait_for_otp_code_incorrect_params
|
109
|
+
wait_for_otp_code_expect_error_with_message("Security device verification failed: Did not receive OTP from https://rubygems.org.")
|
110
|
+
response = Gem::MockBrowser.get URI("http://localhost:#{@port}?param=xyz")
|
111
|
+
|
112
|
+
assert response.is_a? Net::HTTPBadRequest
|
113
|
+
assert_equal "text/plain; charset=utf-8", response["Content-Type"]
|
114
|
+
assert_equal "22", response["Content-Length"]
|
115
|
+
assert_equal "close", response["Connection"]
|
116
|
+
assert_equal "missing code parameter", response.body
|
117
|
+
|
118
|
+
@thread.join
|
119
|
+
assert_nil @thread[:otp]
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
def wait_for_otp_code
|
125
|
+
@thread = Thread.new do
|
126
|
+
Thread.current[:otp] = Gem::GemcutterUtilities::WebauthnListener.new(Gem.host).wait_for_otp_code(@server)
|
127
|
+
end
|
128
|
+
@thread.abort_on_exception = true
|
129
|
+
@thread.report_on_exception = false
|
130
|
+
end
|
131
|
+
|
132
|
+
def wait_for_otp_code_expect_error_with_message(message)
|
133
|
+
@thread = Thread.new do
|
134
|
+
error = assert_raise Gem::WebauthnVerificationError do
|
135
|
+
Thread.current[:otp] = Gem::GemcutterUtilities::WebauthnListener.new(Gem.host).wait_for_otp_code(@server)
|
136
|
+
end
|
137
|
+
|
138
|
+
assert_equal message, error.message
|
139
|
+
end
|
140
|
+
@thread.abort_on_exception = true
|
141
|
+
@thread.report_on_exception = false
|
142
|
+
end
|
143
|
+
end
|