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 "installer_test_case"
|
4
|
+
require "rubygems/uninstaller"
|
4
5
|
|
5
6
|
class TestGemUninstaller < Gem::InstallerTestCase
|
6
7
|
def setup
|
@@ -23,14 +24,14 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def test_initialize_expand_path
|
26
|
-
FileUtils.mkdir_p
|
27
|
-
uninstaller = Gem::Uninstaller.new nil, :install_dir =>
|
27
|
+
FileUtils.mkdir_p "foo/bar"
|
28
|
+
uninstaller = Gem::Uninstaller.new nil, :install_dir => "foo//bar"
|
28
29
|
|
29
30
|
assert_match %r{foo/bar$}, uninstaller.instance_variable_get(:@gem_home)
|
30
31
|
end
|
31
32
|
|
32
33
|
def test_ask_if_ok
|
33
|
-
c = util_spec
|
34
|
+
c = util_spec "c"
|
34
35
|
|
35
36
|
uninstaller = Gem::Uninstaller.new nil
|
36
37
|
|
@@ -60,8 +61,8 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
60
61
|
def test_remove_executables_force_keep
|
61
62
|
uninstaller = Gem::Uninstaller.new nil, :executables => false
|
62
63
|
|
63
|
-
executable = File.join Gem.bindir(@user_spec.base_dir),
|
64
|
-
assert File.exist?(executable),
|
64
|
+
executable = File.join Gem.bindir(@user_spec.base_dir), "executable"
|
65
|
+
assert File.exist?(executable), "executable not written"
|
65
66
|
|
66
67
|
use_ui @ui do
|
67
68
|
uninstaller.remove_executables @user_spec
|
@@ -75,8 +76,8 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
75
76
|
def test_remove_executables_force_remove
|
76
77
|
uninstaller = Gem::Uninstaller.new nil, :executables => true
|
77
78
|
|
78
|
-
executable = File.join Gem.bindir(@user_spec.base_dir),
|
79
|
-
assert File.exist?(executable),
|
79
|
+
executable = File.join Gem.bindir(@user_spec.base_dir), "executable"
|
80
|
+
assert File.exist?(executable), "executable not written"
|
80
81
|
|
81
82
|
use_ui @ui do
|
82
83
|
uninstaller.remove_executables @user_spec
|
@@ -94,14 +95,14 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
94
95
|
uninstaller.remove_executables @user_spec
|
95
96
|
end
|
96
97
|
|
97
|
-
exec_path = File.join Gem.user_dir,
|
98
|
-
refute File.exist?(exec_path),
|
98
|
+
exec_path = File.join Gem.user_dir, "bin", "executable"
|
99
|
+
refute File.exist?(exec_path), "exec still exists in user bin dir"
|
99
100
|
|
100
101
|
assert_equal "Removing executable\n", @ui.output
|
101
102
|
end
|
102
103
|
|
103
104
|
def test_remove_executables_user_format
|
104
|
-
Gem::Installer.exec_format =
|
105
|
+
Gem::Installer.exec_format = "foo-%s-bar"
|
105
106
|
|
106
107
|
uninstaller = Gem::Uninstaller.new nil, :executables => true, :format_executable => true
|
107
108
|
|
@@ -109,8 +110,8 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
109
110
|
uninstaller.remove_executables @user_spec
|
110
111
|
end
|
111
112
|
|
112
|
-
exec_path = File.join Gem.user_dir,
|
113
|
-
assert_equal false, File.exist?(exec_path),
|
113
|
+
exec_path = File.join Gem.user_dir, "bin", "foo-executable-bar"
|
114
|
+
assert_equal false, File.exist?(exec_path), "removed exec from bin dir"
|
114
115
|
|
115
116
|
assert_equal "Removing foo-executable-bar\n", @ui.output
|
116
117
|
ensure
|
@@ -118,7 +119,7 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
118
119
|
end
|
119
120
|
|
120
121
|
def test_remove_executables_user_format_disabled
|
121
|
-
Gem::Installer.exec_format =
|
122
|
+
Gem::Installer.exec_format = "foo-%s-bar"
|
122
123
|
|
123
124
|
uninstaller = Gem::Uninstaller.new nil, :executables => true
|
124
125
|
|
@@ -126,8 +127,8 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
126
127
|
uninstaller.remove_executables @user_spec
|
127
128
|
end
|
128
129
|
|
129
|
-
exec_path = File.join Gem.user_dir,
|
130
|
-
refute File.exist?(exec_path),
|
130
|
+
exec_path = File.join Gem.user_dir, "bin", "executable"
|
131
|
+
refute File.exist?(exec_path), "removed exec from bin dir"
|
131
132
|
|
132
133
|
assert_equal "Removing executable\n", @ui.output
|
133
134
|
ensure
|
@@ -171,56 +172,56 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
171
172
|
end
|
172
173
|
|
173
174
|
def test_remove_plugins
|
174
|
-
write_file File.join(@tempdir,
|
175
|
-
io.write "
|
175
|
+
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
|
176
|
+
io.write "# do nothing"
|
176
177
|
end
|
177
178
|
|
178
179
|
@spec.files += %w[lib/rubygems_plugin.rb]
|
179
180
|
|
180
181
|
Gem::Installer.at(Gem::Package.build(@spec), :force => true).install
|
181
182
|
|
182
|
-
plugin_path = File.join Gem.plugindir,
|
183
|
-
assert File.exist?(plugin_path),
|
183
|
+
plugin_path = File.join Gem.plugindir, "a_plugin.rb"
|
184
|
+
assert File.exist?(plugin_path), "plugin not written"
|
184
185
|
|
185
186
|
Gem::Uninstaller.new(nil).remove_plugins @spec
|
186
187
|
|
187
|
-
refute File.exist?(plugin_path),
|
188
|
+
refute File.exist?(plugin_path), "plugin not removed"
|
188
189
|
end
|
189
190
|
|
190
191
|
def test_remove_plugins_with_install_dir
|
191
|
-
write_file File.join(@tempdir,
|
192
|
-
io.write "
|
192
|
+
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
|
193
|
+
io.write "# do nothing"
|
193
194
|
end
|
194
195
|
|
195
196
|
@spec.files += %w[lib/rubygems_plugin.rb]
|
196
197
|
|
197
198
|
Gem::Installer.at(Gem::Package.build(@spec), :force => true).install
|
198
199
|
|
199
|
-
plugin_path = File.join Gem.plugindir,
|
200
|
-
assert File.exist?(plugin_path),
|
200
|
+
plugin_path = File.join Gem.plugindir, "a_plugin.rb"
|
201
|
+
assert File.exist?(plugin_path), "plugin not written"
|
201
202
|
|
202
203
|
Dir.mkdir "#{@gemhome}2"
|
203
204
|
Gem::Uninstaller.new(nil, :install_dir => "#{@gemhome}2").remove_plugins @spec
|
204
205
|
|
205
|
-
assert File.exist?(plugin_path),
|
206
|
+
assert File.exist?(plugin_path), "plugin unintentionally removed"
|
206
207
|
end
|
207
208
|
|
208
209
|
def test_regenerate_plugins_for
|
209
|
-
write_file File.join(@tempdir,
|
210
|
-
io.write "
|
210
|
+
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
|
211
|
+
io.write "# do nothing"
|
211
212
|
end
|
212
213
|
|
213
214
|
@spec.files += %w[lib/rubygems_plugin.rb]
|
214
215
|
|
215
216
|
Gem::Installer.at(Gem::Package.build(@spec), :force => true).install
|
216
217
|
|
217
|
-
plugin_path = File.join Gem.plugindir,
|
218
|
-
assert File.exist?(plugin_path),
|
218
|
+
plugin_path = File.join Gem.plugindir, "a_plugin.rb"
|
219
|
+
assert File.exist?(plugin_path), "plugin not written"
|
219
220
|
|
220
221
|
FileUtils.rm plugin_path
|
221
222
|
Gem::Uninstaller.new(nil).regenerate_plugins_for @spec, Gem.plugindir
|
222
223
|
|
223
|
-
assert File.exist?(plugin_path),
|
224
|
+
assert File.exist?(plugin_path), "plugin not regenerated"
|
224
225
|
end
|
225
226
|
|
226
227
|
def test_path_ok_eh
|
@@ -234,7 +235,7 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
234
235
|
|
235
236
|
@spec.loaded_from = @spec.loaded_from.gsub @spec.full_name, '\&-legacy'
|
236
237
|
@spec.internal_init # blow out cache. but why did ^^ depend on cache?
|
237
|
-
@spec.platform =
|
238
|
+
@spec.platform = "legacy"
|
238
239
|
|
239
240
|
assert_equal true, uninstaller.path_ok?(@gemhome, @spec)
|
240
241
|
end
|
@@ -248,16 +249,16 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
248
249
|
def test_uninstall
|
249
250
|
uninstaller = Gem::Uninstaller.new @spec.name, :executables => true
|
250
251
|
|
251
|
-
gem_dir = File.join @gemhome,
|
252
|
+
gem_dir = File.join @gemhome, "gems", @spec.full_name
|
252
253
|
|
253
254
|
Gem.pre_uninstall do
|
254
255
|
sleep(0.1) if win_platform?
|
255
|
-
assert File.exist?(gem_dir),
|
256
|
+
assert File.exist?(gem_dir), "gem_dir should exist"
|
256
257
|
end
|
257
258
|
|
258
259
|
Gem.post_uninstall do
|
259
260
|
sleep(0.1) if win_platform?
|
260
|
-
refute File.exist?(gem_dir),
|
261
|
+
refute File.exist?(gem_dir), "gem_dir should not exist"
|
261
262
|
end
|
262
263
|
|
263
264
|
uninstaller.uninstall
|
@@ -269,7 +270,7 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
269
270
|
end
|
270
271
|
|
271
272
|
def test_uninstall_default_gem
|
272
|
-
spec = new_default_spec
|
273
|
+
spec = new_default_spec "default", "2"
|
273
274
|
|
274
275
|
install_default_gems spec
|
275
276
|
|
@@ -281,14 +282,14 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
281
282
|
|
282
283
|
lines = @ui.output.split("\n")
|
283
284
|
|
284
|
-
assert_equal
|
285
|
+
assert_equal "Gem default-2 cannot be uninstalled because it is a default gem", lines.shift
|
285
286
|
end
|
286
287
|
|
287
288
|
def test_uninstall_default_gem_with_same_version
|
288
|
-
default_spec = new_default_spec
|
289
|
+
default_spec = new_default_spec "default", "2"
|
289
290
|
install_default_gems default_spec
|
290
291
|
|
291
|
-
spec = util_spec
|
292
|
+
spec = util_spec "default", "2"
|
292
293
|
install_gem spec
|
293
294
|
|
294
295
|
Gem::Specification.reset
|
@@ -308,8 +309,8 @@ class TestGemUninstaller < Gem::InstallerTestCase
|
|
308
309
|
end
|
309
310
|
|
310
311
|
def test_uninstall_extension
|
311
|
-
@spec.extensions <<
|
312
|
-
write_file File.join(@tempdir,
|
312
|
+
@spec.extensions << "extconf.rb"
|
313
|
+
write_file File.join(@tempdir, "extconf.rb") do |io|
|
313
314
|
io.write <<-RUBY
|
314
315
|
require 'mkmf'
|
315
316
|
create_makefile '#{@spec.name}'
|
@@ -325,7 +326,7 @@ create_makefile '#{@spec.name}'
|
|
325
326
|
installer.install
|
326
327
|
end
|
327
328
|
|
328
|
-
assert_path_exist @spec.extension_dir,
|
329
|
+
assert_path_exist @spec.extension_dir, "sanity check"
|
329
330
|
|
330
331
|
uninstaller = Gem::Uninstaller.new @spec.name, :executables => true
|
331
332
|
uninstaller.uninstall
|
@@ -334,7 +335,7 @@ create_makefile '#{@spec.name}'
|
|
334
335
|
end
|
335
336
|
|
336
337
|
def test_uninstall_nonexistent
|
337
|
-
uninstaller = Gem::Uninstaller.new
|
338
|
+
uninstaller = Gem::Uninstaller.new "bogus", :executables => true
|
338
339
|
|
339
340
|
e = assert_raise Gem::InstallError do
|
340
341
|
uninstaller.uninstall
|
@@ -344,17 +345,17 @@ create_makefile '#{@spec.name}'
|
|
344
345
|
end
|
345
346
|
|
346
347
|
def test_uninstall_not_ok
|
347
|
-
quick_gem
|
348
|
+
quick_gem "z" do |s|
|
348
349
|
s.add_runtime_dependency @spec.name
|
349
350
|
end
|
350
351
|
|
351
352
|
uninstaller = Gem::Uninstaller.new @spec.name
|
352
353
|
|
353
|
-
gem_dir = File.join @gemhome,
|
354
|
-
executable = File.join @gemhome,
|
354
|
+
gem_dir = File.join @gemhome, "gems", @spec.full_name
|
355
|
+
executable = File.join @gemhome, "bin", "executable"
|
355
356
|
|
356
|
-
assert File.exist?(gem_dir),
|
357
|
-
assert File.exist?(executable),
|
357
|
+
assert File.exist?(gem_dir), "gem_dir must exist"
|
358
|
+
assert File.exist?(executable), "executable must exist"
|
358
359
|
|
359
360
|
ui = Gem::MockGemUi.new "n\n"
|
360
361
|
|
@@ -364,15 +365,15 @@ create_makefile '#{@spec.name}'
|
|
364
365
|
end
|
365
366
|
end
|
366
367
|
|
367
|
-
assert File.exist?(gem_dir),
|
368
|
-
assert File.exist?(executable),
|
368
|
+
assert File.exist?(gem_dir), "gem_dir must still exist"
|
369
|
+
assert File.exist?(executable), "executable must still exist"
|
369
370
|
end
|
370
371
|
|
371
372
|
def test_uninstall_user_install
|
372
|
-
@user_spec = Gem::Specification.find_by_name
|
373
|
+
@user_spec = Gem::Specification.find_by_name "b"
|
373
374
|
|
374
375
|
uninstaller = Gem::Uninstaller.new(@user_spec.name,
|
375
|
-
:executables
|
376
|
+
:executables => true,
|
376
377
|
:user_install => true)
|
377
378
|
|
378
379
|
gem_dir = File.join @user_spec.gem_dir
|
@@ -414,9 +415,9 @@ create_makefile '#{@spec.name}'
|
|
414
415
|
def test_uninstall_selection
|
415
416
|
util_make_gems
|
416
417
|
|
417
|
-
list = Gem::Specification.find_all_by_name
|
418
|
+
list = Gem::Specification.find_all_by_name "a"
|
418
419
|
|
419
|
-
uninstaller = Gem::Uninstaller.new
|
420
|
+
uninstaller = Gem::Uninstaller.new "a"
|
420
421
|
|
421
422
|
ui = Gem::MockGemUi.new "1\ny\n"
|
422
423
|
|
@@ -424,39 +425,39 @@ create_makefile '#{@spec.name}'
|
|
424
425
|
uninstaller.uninstall
|
425
426
|
end
|
426
427
|
|
427
|
-
updated_list = Gem::Specification.find_all_by_name(
|
428
|
+
updated_list = Gem::Specification.find_all_by_name("a")
|
428
429
|
assert_equal list.length - 1, updated_list.length
|
429
430
|
|
430
|
-
assert_match
|
431
|
-
assert_match
|
432
|
-
assert_match
|
433
|
-
assert_match
|
434
|
-
assert_match
|
431
|
+
assert_match " 1. a-1", ui.output
|
432
|
+
assert_match " 2. a-2", ui.output
|
433
|
+
assert_match " 3. a-3.a", ui.output
|
434
|
+
assert_match " 4. All versions", ui.output
|
435
|
+
assert_match "uninstalled a-1", ui.output
|
435
436
|
end
|
436
437
|
|
437
438
|
def test_uninstall_selection_greater_than_one
|
438
439
|
util_make_gems
|
439
440
|
|
440
|
-
list = Gem::Specification.find_all_by_name(
|
441
|
+
list = Gem::Specification.find_all_by_name("a")
|
441
442
|
|
442
|
-
uninstaller = Gem::Uninstaller.new(
|
443
|
+
uninstaller = Gem::Uninstaller.new("a")
|
443
444
|
|
444
445
|
use_ui Gem::MockGemUi.new("2\ny\n") do
|
445
446
|
uninstaller.uninstall
|
446
447
|
end
|
447
448
|
|
448
|
-
updated_list = Gem::Specification.find_all_by_name(
|
449
|
+
updated_list = Gem::Specification.find_all_by_name("a")
|
449
450
|
assert_equal list.length - 1, updated_list.length
|
450
451
|
end
|
451
452
|
|
452
453
|
def test_uninstall_prompts_about_broken_deps
|
453
|
-
quick_gem
|
454
|
-
s.add_dependency
|
454
|
+
quick_gem "r", "1" do |s|
|
455
|
+
s.add_dependency "q", "= 1"
|
455
456
|
end
|
456
457
|
|
457
|
-
quick_gem
|
458
|
+
quick_gem "q", "1"
|
458
459
|
|
459
|
-
un = Gem::Uninstaller.new(
|
460
|
+
un = Gem::Uninstaller.new("q")
|
460
461
|
ui = Gem::MockGemUi.new("y\n")
|
461
462
|
|
462
463
|
use_ui ui do
|
@@ -475,18 +476,18 @@ create_makefile '#{@spec.name}'
|
|
475
476
|
end
|
476
477
|
|
477
478
|
def test_uninstall_only_lists_unsatisfied_deps
|
478
|
-
quick_gem
|
479
|
-
s.add_dependency
|
479
|
+
quick_gem "r", "1" do |s|
|
480
|
+
s.add_dependency "q", "~> 1.0"
|
480
481
|
end
|
481
482
|
|
482
|
-
quick_gem
|
483
|
-
s.add_dependency
|
483
|
+
quick_gem "x", "1" do |s|
|
484
|
+
s.add_dependency "q", "= 1.0"
|
484
485
|
end
|
485
486
|
|
486
|
-
quick_gem
|
487
|
-
quick_gem
|
487
|
+
quick_gem "q", "1.0"
|
488
|
+
quick_gem "q", "1.1"
|
488
489
|
|
489
|
-
un = Gem::Uninstaller.new(
|
490
|
+
un = Gem::Uninstaller.new("q", :version => "1.0")
|
490
491
|
ui = Gem::MockGemUi.new("y\n")
|
491
492
|
|
492
493
|
use_ui ui do
|
@@ -505,14 +506,14 @@ create_makefile '#{@spec.name}'
|
|
505
506
|
end
|
506
507
|
|
507
508
|
def test_uninstall_doesnt_prompt_when_other_gem_satisfies_requirement
|
508
|
-
quick_gem
|
509
|
-
s.add_dependency
|
509
|
+
quick_gem "r", "1" do |s|
|
510
|
+
s.add_dependency "q", "~> 1.0"
|
510
511
|
end
|
511
512
|
|
512
|
-
quick_gem
|
513
|
-
quick_gem
|
513
|
+
quick_gem "q", "1.0"
|
514
|
+
quick_gem "q", "1.1"
|
514
515
|
|
515
|
-
un = Gem::Uninstaller.new(
|
516
|
+
un = Gem::Uninstaller.new("q", :version => "1.0")
|
516
517
|
ui = Gem::MockGemUi.new("y\n")
|
517
518
|
|
518
519
|
use_ui ui do
|
@@ -525,13 +526,13 @@ create_makefile '#{@spec.name}'
|
|
525
526
|
end
|
526
527
|
|
527
528
|
def test_uninstall_doesnt_prompt_when_removing_a_dev_dep
|
528
|
-
quick_gem
|
529
|
-
s.add_development_dependency
|
529
|
+
quick_gem "r", "1" do |s|
|
530
|
+
s.add_development_dependency "q", "= 1.0"
|
530
531
|
end
|
531
532
|
|
532
|
-
quick_gem
|
533
|
+
quick_gem "q", "1.0"
|
533
534
|
|
534
|
-
un = Gem::Uninstaller.new(
|
535
|
+
un = Gem::Uninstaller.new("q", :version => "1.0")
|
535
536
|
ui = Gem::MockGemUi.new("y\n")
|
536
537
|
|
537
538
|
use_ui ui do
|
@@ -544,13 +545,13 @@ create_makefile '#{@spec.name}'
|
|
544
545
|
end
|
545
546
|
|
546
547
|
def test_uninstall_doesnt_prompt_and_raises_when_abort_on_dependent_set
|
547
|
-
quick_gem
|
548
|
-
s.add_dependency
|
548
|
+
quick_gem "r", "1" do |s|
|
549
|
+
s.add_dependency "q", "= 1"
|
549
550
|
end
|
550
551
|
|
551
|
-
quick_gem
|
552
|
+
quick_gem "q", "1"
|
552
553
|
|
553
|
-
un = Gem::Uninstaller.new(
|
554
|
+
un = Gem::Uninstaller.new("q", :abort_on_dependent => true)
|
554
555
|
ui = Gem::MockGemUi.new("y\n")
|
555
556
|
|
556
557
|
assert_raise Gem::DependencyRemovalException do
|
@@ -561,13 +562,13 @@ create_makefile '#{@spec.name}'
|
|
561
562
|
end
|
562
563
|
|
563
564
|
def test_uninstall_prompt_includes_dep_type
|
564
|
-
quick_gem
|
565
|
-
s.add_development_dependency
|
565
|
+
quick_gem "r", "1" do |s|
|
566
|
+
s.add_development_dependency "q", "= 1"
|
566
567
|
end
|
567
568
|
|
568
|
-
quick_gem
|
569
|
+
quick_gem "q", "1"
|
569
570
|
|
570
|
-
un = Gem::Uninstaller.new(
|
571
|
+
un = Gem::Uninstaller.new("q", :check_dev => true)
|
571
572
|
ui = Gem::MockGemUi.new("y\n")
|
572
573
|
|
573
574
|
use_ui ui do
|
@@ -586,17 +587,17 @@ create_makefile '#{@spec.name}'
|
|
586
587
|
end
|
587
588
|
|
588
589
|
def test_uninstall_prompt_only_lists_the_dependents_that_prevented_uninstallation
|
589
|
-
quick_gem
|
590
|
-
s.add_development_dependency
|
590
|
+
quick_gem "r", "1" do |s|
|
591
|
+
s.add_development_dependency "q", "= 1"
|
591
592
|
end
|
592
593
|
|
593
|
-
quick_gem
|
594
|
-
s.add_dependency
|
594
|
+
quick_gem "s", "1" do |s|
|
595
|
+
s.add_dependency "q", "= 1"
|
595
596
|
end
|
596
597
|
|
597
|
-
quick_gem
|
598
|
+
quick_gem "q", "1"
|
598
599
|
|
599
|
-
un = Gem::Uninstaller.new(
|
600
|
+
un = Gem::Uninstaller.new("q", :check_dev => false)
|
600
601
|
ui = Gem::MockGemUi.new("y\n")
|
601
602
|
|
602
603
|
use_ui ui do
|
@@ -633,42 +634,42 @@ create_makefile '#{@spec.name}'
|
|
633
634
|
end
|
634
635
|
|
635
636
|
def test_uninstall_keeps_plugins_up_to_date
|
636
|
-
write_file File.join(@tempdir,
|
637
|
-
io.write "
|
637
|
+
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
|
638
|
+
io.write "# do nothing"
|
638
639
|
end
|
639
640
|
|
640
|
-
plugin_path = File.join Gem.plugindir,
|
641
|
+
plugin_path = File.join Gem.plugindir, "a_plugin.rb"
|
641
642
|
|
642
|
-
@spec.version =
|
643
|
+
@spec.version = "1"
|
643
644
|
Gem::Installer.at(Gem::Package.build(@spec), :force => true).install
|
644
645
|
|
645
|
-
refute File.exist?(plugin_path),
|
646
|
+
refute File.exist?(plugin_path), "version without plugin installed, but plugin written"
|
646
647
|
|
647
648
|
@spec.files += %w[lib/rubygems_plugin.rb]
|
648
|
-
@spec.version =
|
649
|
+
@spec.version = "2"
|
649
650
|
Gem::Installer.at(Gem::Package.build(@spec), :force => true).install
|
650
651
|
|
651
|
-
assert File.exist?(plugin_path),
|
652
|
-
assert_match %r{\Arequire.*a-2/lib/rubygems_plugin\.rb}, File.read(plugin_path),
|
652
|
+
assert File.exist?(plugin_path), "version with plugin installed, but plugin not written"
|
653
|
+
assert_match %r{\Arequire.*a-2/lib/rubygems_plugin\.rb}, File.read(plugin_path), "written plugin has incorrect content"
|
653
654
|
|
654
|
-
@spec.version =
|
655
|
+
@spec.version = "3"
|
655
656
|
Gem::Installer.at(Gem::Package.build(@spec), :force => true).install
|
656
657
|
|
657
|
-
assert File.exist?(plugin_path),
|
658
|
-
assert_match %r{\Arequire.*a-3/lib/rubygems_plugin\.rb}, File.read(plugin_path),
|
658
|
+
assert File.exist?(plugin_path), "version with plugin installed, but plugin removed"
|
659
|
+
assert_match %r{\Arequire.*a-3/lib/rubygems_plugin\.rb}, File.read(plugin_path), "old version installed, but plugin updated"
|
659
660
|
|
660
|
-
Gem::Uninstaller.new(
|
661
|
+
Gem::Uninstaller.new("a", :version => "1", :executables => true).uninstall
|
661
662
|
|
662
|
-
assert File.exist?(plugin_path),
|
663
|
-
assert_match %r{\Arequire.*a-3/lib/rubygems_plugin\.rb}, File.read(plugin_path),
|
663
|
+
assert File.exist?(plugin_path), "plugin removed when old version uninstalled"
|
664
|
+
assert_match %r{\Arequire.*a-3/lib/rubygems_plugin\.rb}, File.read(plugin_path), "old version uninstalled, but plugin updated"
|
664
665
|
|
665
|
-
Gem::Uninstaller.new(
|
666
|
+
Gem::Uninstaller.new("a", version: "3", :executables => true).uninstall
|
666
667
|
|
667
|
-
assert File.exist?(plugin_path),
|
668
|
-
assert_match %r{\Arequire.*a-2/lib/rubygems_plugin\.rb}, File.read(plugin_path),
|
668
|
+
assert File.exist?(plugin_path), "plugin removed when old version uninstalled and another version with plugin still present"
|
669
|
+
assert_match %r{\Arequire.*a-2/lib/rubygems_plugin\.rb}, File.read(plugin_path), "latest version uninstalled, but plugin not updated to previous version"
|
669
670
|
|
670
|
-
Gem::Uninstaller.new(
|
671
|
+
Gem::Uninstaller.new("a", version: "2", :executables => true).uninstall
|
671
672
|
|
672
|
-
refute File.exist?(plugin_path),
|
673
|
+
refute File.exist?(plugin_path), "last version uninstalled, but plugin still present"
|
673
674
|
end
|
674
675
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require_relative "helper"
|
3
4
|
|
4
5
|
class TestGemUnsatisfiableDependencyError < Gem::TestCase
|
5
6
|
def setup
|
6
7
|
super
|
7
8
|
|
8
|
-
@a_dep = dep
|
9
|
+
@a_dep = dep "a", "~> 1"
|
9
10
|
|
10
11
|
@req = Gem::Resolver::DependencyRequest.new @a_dep, nil
|
11
12
|
|
@@ -21,7 +22,7 @@ class TestGemUnsatisfiableDependencyError < Gem::TestCase
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def test_name
|
24
|
-
assert_equal
|
25
|
+
assert_equal "a", @e.name
|
25
26
|
end
|
26
27
|
|
27
28
|
def test_version
|