rubygems-update 2.7.11 → 3.0.9
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/.rubocop.yml +67 -0
- data/.travis.yml +24 -18
- data/CODE_OF_CONDUCT.md +10 -8
- data/CONTRIBUTING.md +148 -0
- data/History.txt +458 -8
- data/MAINTAINERS.txt +1 -0
- data/Manifest.txt +16 -9
- data/POLICIES.md +92 -0
- data/README.md +53 -26
- data/Rakefile +77 -211
- data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
- data/appveyor.yml +20 -45
- data/bin/gem +1 -2
- data/bin/update_rubygems +2 -3
- data/bundler/CHANGELOG.md +65 -0
- data/bundler/bundler.gemspec +7 -1
- data/bundler/lib/bundler/build_metadata.rb +1 -1
- data/bundler/lib/bundler/cli/add.rb +15 -5
- data/bundler/lib/bundler/cli/binstubs.rb +8 -2
- data/bundler/lib/bundler/cli/doctor.rb +47 -1
- data/bundler/lib/bundler/cli/install.rb +8 -5
- data/bundler/lib/bundler/cli/list.rb +41 -5
- data/bundler/lib/bundler/cli/outdated.rb +7 -1
- data/bundler/lib/bundler/cli/pristine.rb +4 -0
- data/bundler/lib/bundler/cli/remove.rb +18 -0
- data/bundler/lib/bundler/cli.rb +63 -21
- data/bundler/lib/bundler/definition.rb +15 -16
- data/bundler/lib/bundler/dependency.rb +2 -2
- data/bundler/lib/bundler/dsl.rb +19 -3
- data/bundler/lib/bundler/feature_flag.rb +7 -0
- data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
- data/bundler/lib/bundler/injector.rb +168 -9
- data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
- data/bundler/lib/bundler/installer.rb +29 -6
- data/bundler/lib/bundler/plugin/events.rb +61 -0
- data/bundler/lib/bundler/plugin.rb +10 -3
- data/bundler/lib/bundler/resolver.rb +2 -2
- data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
- data/bundler/lib/bundler/runtime.rb +8 -2
- data/bundler/lib/bundler/settings/validator.rb +23 -0
- data/bundler/lib/bundler/settings.rb +24 -3
- data/bundler/lib/bundler/shared_helpers.rb +19 -3
- data/bundler/lib/bundler/source/metadata.rb +2 -3
- data/bundler/lib/bundler/source.rb +9 -9
- data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler.rb +26 -8
- data/bundler/man/bundle-add.ronn +13 -2
- data/bundler/man/bundle-config.ronn +21 -0
- data/bundler/man/bundle-install.ronn +1 -1
- data/bundler/man/bundle-list.ronn +19 -1
- data/bundler/man/bundle-outdated.ronn +4 -0
- data/bundler/man/bundle-remove.ronn +23 -0
- data/bundler/man/bundle-update.ronn +1 -1
- data/bundler/man/bundle.ronn +3 -0
- data/lib/rubygems/available_set.rb +1 -1
- data/lib/rubygems/basic_specification.rb +12 -12
- data/lib/rubygems/bundler_version_finder.rb +3 -3
- data/lib/rubygems/command.rb +22 -15
- data/lib/rubygems/command_manager.rb +22 -5
- data/lib/rubygems/commands/build_command.rb +41 -7
- data/lib/rubygems/commands/cert_command.rb +45 -24
- data/lib/rubygems/commands/check_command.rb +1 -1
- data/lib/rubygems/commands/cleanup_command.rb +14 -7
- data/lib/rubygems/commands/contents_command.rb +14 -15
- data/lib/rubygems/commands/dependency_command.rb +17 -17
- data/lib/rubygems/commands/environment_command.rb +20 -1
- data/lib/rubygems/commands/fetch_command.rb +2 -3
- data/lib/rubygems/commands/generate_index_command.rb +2 -3
- data/lib/rubygems/commands/help_command.rb +12 -13
- data/lib/rubygems/commands/info_command.rb +33 -0
- data/lib/rubygems/commands/install_command.rb +21 -17
- data/lib/rubygems/commands/list_command.rb +0 -1
- data/lib/rubygems/commands/lock_command.rb +3 -4
- data/lib/rubygems/commands/open_command.rb +16 -10
- data/lib/rubygems/commands/owner_command.rb +21 -7
- data/lib/rubygems/commands/pristine_command.rb +23 -16
- data/lib/rubygems/commands/push_command.rb +19 -8
- data/lib/rubygems/commands/query_command.rb +24 -24
- data/lib/rubygems/commands/rdoc_command.rb +3 -4
- data/lib/rubygems/commands/search_command.rb +0 -1
- data/lib/rubygems/commands/server_command.rb +1 -2
- data/lib/rubygems/commands/setup_command.rb +86 -48
- data/lib/rubygems/commands/signin_command.rb +2 -1
- data/lib/rubygems/commands/signout_command.rb +2 -2
- data/lib/rubygems/commands/sources_command.rb +11 -12
- data/lib/rubygems/commands/specification_command.rb +7 -7
- data/lib/rubygems/commands/uninstall_command.rb +50 -18
- data/lib/rubygems/commands/unpack_command.rb +16 -7
- data/lib/rubygems/commands/update_command.rb +28 -23
- data/lib/rubygems/commands/which_command.rb +5 -8
- data/lib/rubygems/commands/yank_command.rb +1 -2
- data/lib/rubygems/compatibility.rb +1 -21
- data/lib/rubygems/config_file.rb +36 -36
- data/lib/rubygems/core_ext/kernel_require.rb +6 -6
- data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
- data/lib/rubygems/defaults.rb +31 -19
- data/lib/rubygems/dependency.rb +15 -15
- data/lib/rubygems/dependency_installer.rb +30 -33
- data/lib/rubygems/dependency_list.rb +9 -10
- data/lib/rubygems/deprecate.rb +2 -3
- data/lib/rubygems/doctor.rb +5 -6
- data/lib/rubygems/errors.rb +3 -3
- data/lib/rubygems/exceptions.rb +11 -8
- data/lib/rubygems/ext/build_error.rb +0 -1
- data/lib/rubygems/ext/builder.rb +50 -23
- data/lib/rubygems/ext/cmake_builder.rb +2 -2
- data/lib/rubygems/ext/configure_builder.rb +2 -3
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
- data/lib/rubygems/ext/rake_builder.rb +16 -18
- data/lib/rubygems/ext.rb +0 -1
- data/lib/rubygems/gem_runner.rb +2 -2
- data/lib/rubygems/gemcutter_utilities.rb +46 -12
- data/lib/rubygems/indexer.rb +19 -12
- data/lib/rubygems/install_default_message.rb +0 -1
- data/lib/rubygems/install_message.rb +0 -1
- data/lib/rubygems/install_update_options.rb +3 -29
- data/lib/rubygems/installer.rb +97 -55
- data/lib/rubygems/installer_test_case.rb +2 -16
- data/lib/rubygems/local_remote_options.rb +5 -4
- data/lib/rubygems/mock_gem_ui.rb +3 -4
- data/lib/rubygems/name_tuple.rb +4 -4
- data/lib/rubygems/package/digest_io.rb +3 -4
- data/lib/rubygems/package/file_source.rb +3 -4
- data/lib/rubygems/package/io_source.rb +1 -2
- data/lib/rubygems/package/old.rb +8 -16
- data/lib/rubygems/package/source.rb +0 -1
- data/lib/rubygems/package/tar_header.rb +13 -4
- data/lib/rubygems/package/tar_reader/entry.rb +20 -4
- data/lib/rubygems/package/tar_reader.rb +2 -4
- data/lib/rubygems/package/tar_test_case.rb +2 -8
- data/lib/rubygems/package/tar_writer.rb +13 -15
- data/lib/rubygems/package.rb +90 -63
- data/lib/rubygems/package_task.rb +0 -1
- data/lib/rubygems/path_support.rb +16 -6
- data/lib/rubygems/platform.rb +4 -5
- data/lib/rubygems/psych_tree.rb +1 -1
- data/lib/rubygems/rdoc.rb +2 -313
- data/lib/rubygems/remote_fetcher.rb +29 -82
- data/lib/rubygems/request/connection_pools.rb +24 -13
- data/lib/rubygems/request/http_pool.rb +3 -4
- data/lib/rubygems/request/https_pool.rb +1 -3
- data/lib/rubygems/request.rb +17 -16
- data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
- data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
- data/lib/rubygems/request_set/lockfile.rb +12 -12
- data/lib/rubygems/request_set.rb +52 -25
- data/lib/rubygems/requirement.rb +32 -21
- data/lib/rubygems/resolver/activation_request.rb +6 -6
- data/lib/rubygems/resolver/api_set.rb +5 -6
- data/lib/rubygems/resolver/api_specification.rb +2 -3
- data/lib/rubygems/resolver/best_set.rb +5 -6
- data/lib/rubygems/resolver/composed_set.rb +5 -6
- data/lib/rubygems/resolver/conflict.rb +5 -5
- data/lib/rubygems/resolver/current_set.rb +1 -2
- data/lib/rubygems/resolver/dependency_request.rb +4 -4
- data/lib/rubygems/resolver/git_set.rb +5 -6
- data/lib/rubygems/resolver/git_specification.rb +4 -5
- data/lib/rubygems/resolver/index_set.rb +5 -6
- data/lib/rubygems/resolver/index_specification.rb +3 -4
- data/lib/rubygems/resolver/installed_specification.rb +3 -4
- data/lib/rubygems/resolver/installer_set.rb +12 -12
- data/lib/rubygems/resolver/local_specification.rb +1 -2
- data/lib/rubygems/resolver/lock_set.rb +5 -6
- data/lib/rubygems/resolver/lock_specification.rb +7 -8
- data/lib/rubygems/resolver/requirement_list.rb +1 -1
- data/lib/rubygems/resolver/set.rb +2 -2
- data/lib/rubygems/resolver/source_set.rb +4 -5
- data/lib/rubygems/resolver/spec_specification.rb +1 -2
- data/lib/rubygems/resolver/specification.rb +10 -7
- data/lib/rubygems/resolver/stats.rb +1 -1
- data/lib/rubygems/resolver/vendor_set.rb +4 -5
- data/lib/rubygems/resolver/vendor_specification.rb +2 -3
- data/lib/rubygems/resolver.rb +14 -16
- data/lib/rubygems/s3_uri_signer.rb +183 -0
- data/lib/rubygems/safe_yaml.rb +18 -10
- data/lib/rubygems/security/policies.rb +1 -2
- data/lib/rubygems/security/policy.rb +25 -25
- data/lib/rubygems/security/signer.rb +72 -24
- data/lib/rubygems/security/trust_dir.rb +10 -10
- data/lib/rubygems/security.rb +21 -22
- data/lib/rubygems/security_option.rb +0 -1
- data/lib/rubygems/server.rb +21 -21
- data/lib/rubygems/source/git.rb +9 -10
- data/lib/rubygems/source/installed.rb +3 -4
- data/lib/rubygems/source/local.rb +7 -7
- data/lib/rubygems/source/lock.rb +4 -4
- data/lib/rubygems/source/specific_file.rb +5 -5
- data/lib/rubygems/source/vendor.rb +2 -3
- data/lib/rubygems/source.rb +16 -25
- data/lib/rubygems/source_list.rb +2 -2
- data/lib/rubygems/source_local.rb +0 -1
- data/lib/rubygems/spec_fetcher.rb +5 -6
- data/lib/rubygems/specification.rb +219 -558
- data/lib/rubygems/specification_policy.rb +407 -0
- data/lib/rubygems/stub_specification.rb +12 -17
- data/lib/rubygems/test_case.rb +161 -75
- data/lib/rubygems/test_utilities.rb +20 -35
- data/lib/rubygems/text.rb +6 -6
- data/lib/rubygems/uninstaller.rb +38 -27
- data/lib/rubygems/uri_formatter.rb +1 -2
- data/lib/rubygems/user_interaction.rb +37 -89
- data/lib/rubygems/util/licenses.rb +27 -1
- data/lib/rubygems/util/list.rb +1 -1
- data/lib/rubygems/util.rb +32 -14
- data/lib/rubygems/validator.rb +4 -5
- data/lib/rubygems/version.rb +15 -15
- data/lib/rubygems/version_option.rb +2 -3
- data/lib/rubygems.rb +71 -102
- data/rubygems-update.gemspec +43 -0
- data/setup.rb +2 -8
- data/test/rubygems/ca_cert.pem +74 -65
- data/test/rubygems/client.pem +103 -45
- data/test/rubygems/rubygems_plugin.rb +0 -1
- data/test/rubygems/simple_gem.rb +1 -1
- data/test/rubygems/ssl_cert.pem +78 -17
- data/test/rubygems/ssl_key.pem +25 -13
- data/test/rubygems/test_bundled_ca.rb +1 -1
- data/test/rubygems/test_config.rb +7 -2
- data/test/rubygems/test_gem.rb +205 -132
- data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
- data/test/rubygems/test_gem_command.rb +0 -1
- data/test/rubygems/test_gem_command_manager.rb +18 -3
- data/test/rubygems/test_gem_commands_build_command.rb +220 -15
- data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
- data/test/rubygems/test_gem_commands_check_command.rb +1 -1
- data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
- data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
- data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
- data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
- data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
- data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
- data/test/rubygems/test_gem_commands_help_command.rb +7 -4
- data/test/rubygems/test_gem_commands_info_command.rb +44 -0
- data/test/rubygems/test_gem_commands_install_command.rb +79 -12
- data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
- data/test/rubygems/test_gem_commands_open_command.rb +29 -0
- data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
- data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
- data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
- data/test/rubygems/test_gem_commands_push_command.rb +54 -0
- data/test/rubygems/test_gem_commands_query_command.rb +102 -100
- data/test/rubygems/test_gem_commands_search_command.rb +0 -1
- data/test/rubygems/test_gem_commands_server_command.rb +0 -1
- data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
- data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
- data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
- data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
- data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
- data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
- data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
- data/test/rubygems/test_gem_commands_update_command.rb +19 -2
- data/test/rubygems/test_gem_commands_which_command.rb +0 -1
- data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
- data/test/rubygems/test_gem_config_file.rb +4 -2
- data/test/rubygems/test_gem_dependency.rb +0 -1
- data/test/rubygems/test_gem_dependency_installer.rb +8 -5
- data/test/rubygems/test_gem_dependency_list.rb +6 -7
- data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
- data/test/rubygems/test_gem_doctor.rb +1 -2
- data/test/rubygems/test_gem_ext_builder.rb +10 -23
- data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
- data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
- data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
- data/test/rubygems/test_gem_gem_runner.rb +0 -1
- data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
- data/test/rubygems/test_gem_indexer.rb +16 -10
- data/test/rubygems/test_gem_install_update_options.rb +1 -20
- data/test/rubygems/test_gem_installer.rb +154 -119
- data/test/rubygems/test_gem_local_remote_options.rb +3 -3
- data/test/rubygems/test_gem_name_tuple.rb +0 -1
- data/test/rubygems/test_gem_package.rb +77 -31
- data/test/rubygems/test_gem_package_old.rb +0 -1
- data/test/rubygems/test_gem_package_tar_header.rb +42 -2
- data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
- data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
- data/test/rubygems/test_gem_package_task.rb +2 -2
- data/test/rubygems/test_gem_path_support.rb +28 -11
- data/test/rubygems/test_gem_platform.rb +4 -5
- data/test/rubygems/test_gem_rdoc.rb +1 -136
- data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
- data/test/rubygems/test_gem_request.rb +9 -9
- data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
- data/test/rubygems/test_gem_request_set.rb +5 -5
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
- data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
- data/test/rubygems/test_gem_requirement.rb +24 -4
- data/test/rubygems/test_gem_resolver.rb +13 -17
- data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
- data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
- data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
- data/test/rubygems/test_gem_resolver_specification.rb +1 -2
- data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
- data/test/rubygems/test_gem_security.rb +1 -3
- data/test/rubygems/test_gem_security_policy.rb +5 -6
- data/test/rubygems/test_gem_security_signer.rb +4 -3
- data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
- data/test/rubygems/test_gem_server.rb +4 -4
- data/test/rubygems/test_gem_source.rb +0 -13
- data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
- data/test/rubygems/test_gem_source_git.rb +0 -1
- data/test/rubygems/test_gem_source_installed.rb +0 -1
- data/test/rubygems/test_gem_source_lock.rb +0 -1
- data/test/rubygems/test_gem_source_vendor.rb +0 -1
- data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
- data/test/rubygems/test_gem_specification.rb +366 -198
- data/test/rubygems/test_gem_stream_ui.rb +15 -32
- data/test/rubygems/test_gem_stub_specification.rb +0 -2
- data/test/rubygems/test_gem_text.rb +4 -0
- data/test/rubygems/test_gem_uninstaller.rb +42 -3
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
- data/test/rubygems/test_gem_uri_formatter.rb +0 -1
- data/test/rubygems/test_gem_util.rb +31 -11
- data/test/rubygems/test_gem_validator.rb +0 -1
- data/test/rubygems/test_gem_version.rb +11 -11
- data/test/rubygems/test_gem_version_option.rb +0 -1
- data/test/rubygems/test_remote_fetch_error.rb +0 -1
- data/test/rubygems/test_require.rb +67 -52
- data/util/CL2notes +1 -2
- data/util/ci +20 -12
- data/util/cops/deprecations.rb +52 -0
- data/util/create_certs.rb +6 -7
- data/util/create_certs.sh +27 -0
- data/util/create_encrypted_key.rb +4 -5
- data/util/patch_with_prs.rb +1 -1
- data/util/rubocop +8 -0
- data/util/update_bundled_ca_certificates.rb +12 -13
- data/util/update_changelog.rb +1 -1
- metadata +61 -51
- data/.autotest +0 -71
- data/.document +0 -5
- data/CONTRIBUTING.rdoc +0 -130
- data/CVE-2013-4287.txt +0 -35
- data/CVE-2013-4363.txt +0 -45
- data/CVE-2015-3900.txt +0 -40
- data/POLICIES.rdoc +0 -74
- data/test/rubygems/fix_openssl_warnings.rb +0 -13
@@ -29,6 +29,12 @@ class TestGemCommandManager < Gem::TestCase
|
|
29
29
|
e.message
|
30
30
|
end
|
31
31
|
|
32
|
+
def test_find_alias_command
|
33
|
+
command = @command_manager.find_command 'i'
|
34
|
+
|
35
|
+
assert_kind_of Gem::Commands::InstallCommand, command
|
36
|
+
end
|
37
|
+
|
32
38
|
def test_find_command_ambiguous_exact
|
33
39
|
ins_command = Class.new
|
34
40
|
Gem::Commands.send :const_set, :InsCommand, ins_command
|
@@ -97,6 +103,16 @@ class TestGemCommandManager < Gem::TestCase
|
|
97
103
|
assert_match(/invalid option: --bad-arg/i, @ui.error)
|
98
104
|
end
|
99
105
|
|
106
|
+
def test_process_args_bad_no_ri
|
107
|
+
use_ui @ui do
|
108
|
+
assert_raises Gem::MockGemUi::TermError do
|
109
|
+
@command_manager.process_args %w[--no-ri]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
assert_match(/invalid option: --no-ri. Use --no-document instead./i, @ui.error)
|
114
|
+
end
|
115
|
+
|
100
116
|
# HACK move to install command test
|
101
117
|
def test_process_args_install
|
102
118
|
#capture all install options
|
@@ -120,7 +136,7 @@ class TestGemCommandManager < Gem::TestCase
|
|
120
136
|
#check settings
|
121
137
|
check_options = nil
|
122
138
|
@command_manager.process_args %w[
|
123
|
-
install --force --local --rdoc --install-dir .
|
139
|
+
install --force --local --document=ri,rdoc --install-dir .
|
124
140
|
--version 3.0 --no-wrapper --bindir .
|
125
141
|
]
|
126
142
|
assert_equal %w[rdoc ri], check_options[:document].sort
|
@@ -254,11 +270,10 @@ class TestGemCommandManager < Gem::TestCase
|
|
254
270
|
|
255
271
|
#check settings
|
256
272
|
check_options = nil
|
257
|
-
@command_manager.process_args %w[update --force --
|
273
|
+
@command_manager.process_args %w[update --force --document=ri --install-dir .]
|
258
274
|
assert_includes check_options[:document], 'ri'
|
259
275
|
assert_equal true, check_options[:force]
|
260
276
|
assert_equal Dir.pwd, check_options[:install_dir]
|
261
277
|
end
|
262
278
|
|
263
279
|
end
|
264
|
-
|
@@ -6,16 +6,71 @@ require 'rubygems/package'
|
|
6
6
|
|
7
7
|
class TestGemCommandsBuildCommand < Gem::TestCase
|
8
8
|
|
9
|
+
CERT_FILE = cert_path 'public3072'
|
10
|
+
SIGNING_KEY = key_path 'private3072'
|
11
|
+
|
12
|
+
EXPIRED_CERT_FILE = cert_path 'expired'
|
13
|
+
PRIVATE_KEY_FILE = key_path 'private'
|
14
|
+
|
9
15
|
def setup
|
10
16
|
super
|
11
17
|
|
18
|
+
readme_file = File.join(@tempdir, 'README.md')
|
19
|
+
|
20
|
+
File.open readme_file, 'w' do |f|
|
21
|
+
f.write 'My awesome gem'
|
22
|
+
end
|
23
|
+
|
12
24
|
@gem = util_spec 'some_gem' do |s|
|
13
|
-
s.
|
25
|
+
s.license = 'AGPL-3.0'
|
26
|
+
s.files = ['README.md']
|
14
27
|
end
|
15
28
|
|
16
29
|
@cmd = Gem::Commands::BuildCommand.new
|
17
30
|
end
|
18
31
|
|
32
|
+
def test_handle_options
|
33
|
+
@cmd.handle_options %w[--force --strict]
|
34
|
+
|
35
|
+
assert @cmd.options[:force]
|
36
|
+
assert @cmd.options[:strict]
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_options_filename
|
40
|
+
gemspec_file = File.join(@tempdir, @gem.spec_name)
|
41
|
+
|
42
|
+
File.open gemspec_file, 'w' do |gs|
|
43
|
+
gs.write @gem.to_ruby
|
44
|
+
end
|
45
|
+
|
46
|
+
@cmd.options[:args] = [gemspec_file]
|
47
|
+
@cmd.options[:output] = "test.gem"
|
48
|
+
|
49
|
+
use_ui @ui do
|
50
|
+
Dir.chdir @tempdir do
|
51
|
+
@cmd.execute
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
file = File.join(@tempdir, File::SEPARATOR, "test.gem")
|
56
|
+
assert File.exist?(file)
|
57
|
+
|
58
|
+
output = @ui.output.split "\n"
|
59
|
+
assert_equal " Successfully built RubyGem", output.shift
|
60
|
+
assert_equal " Name: some_gem", output.shift
|
61
|
+
assert_equal " Version: 2", output.shift
|
62
|
+
assert_equal " File: test.gem", output.shift
|
63
|
+
assert_equal [], output
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_handle_options_defaults
|
67
|
+
@cmd.handle_options []
|
68
|
+
|
69
|
+
refute @cmd.options[:force]
|
70
|
+
refute @cmd.options[:strict]
|
71
|
+
assert_nil @cmd.options[:output]
|
72
|
+
end
|
73
|
+
|
19
74
|
def test_execute
|
20
75
|
gemspec_file = File.join(@tempdir, @gem.spec_name)
|
21
76
|
|
@@ -23,7 +78,80 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|
23
78
|
gs.write @gem.to_ruby
|
24
79
|
end
|
25
80
|
|
26
|
-
|
81
|
+
@cmd.options[:args] = [gemspec_file]
|
82
|
+
|
83
|
+
util_test_build_gem @gem
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_execute_bad_name
|
87
|
+
[".", "-", "_"].each do |special_char|
|
88
|
+
gem = util_spec 'some_gem_with_bad_name' do |s|
|
89
|
+
s.name = "#{special_char}bad_gem_name"
|
90
|
+
s.license = 'AGPL-3.0'
|
91
|
+
s.files = ['README.md']
|
92
|
+
end
|
93
|
+
|
94
|
+
gemspec_file = File.join(@tempdir, gem.spec_name)
|
95
|
+
|
96
|
+
File.open gemspec_file, 'w' do |gs|
|
97
|
+
gs.write gem.to_ruby
|
98
|
+
end
|
99
|
+
|
100
|
+
@cmd.options[:args] = [gemspec_file]
|
101
|
+
|
102
|
+
use_ui @ui do
|
103
|
+
Dir.chdir @tempdir do
|
104
|
+
assert_raises Gem::InvalidSpecificationException do
|
105
|
+
@cmd.execute
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_execute_strict_without_warnings
|
113
|
+
gemspec_file = File.join(@tempdir, @gem.spec_name)
|
114
|
+
|
115
|
+
File.open gemspec_file, 'w' do |gs|
|
116
|
+
gs.write @gem.to_ruby
|
117
|
+
end
|
118
|
+
|
119
|
+
@cmd.options[:strict] = true
|
120
|
+
@cmd.options[:args] = [gemspec_file]
|
121
|
+
|
122
|
+
util_test_build_gem @gem
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_execute_strict_with_warnings
|
126
|
+
bad_gem = util_spec 'some_bad_gem' do |s|
|
127
|
+
s.files = ['README.md']
|
128
|
+
end
|
129
|
+
|
130
|
+
gemspec_file = File.join(@tempdir, bad_gem.spec_name)
|
131
|
+
|
132
|
+
File.open gemspec_file, 'w' do |gs|
|
133
|
+
gs.write bad_gem.to_ruby
|
134
|
+
end
|
135
|
+
|
136
|
+
@cmd.options[:args] = [gemspec_file]
|
137
|
+
@cmd.options[:strict] = true
|
138
|
+
|
139
|
+
use_ui @ui do
|
140
|
+
Dir.chdir @tempdir do
|
141
|
+
assert_raises Gem::InvalidSpecificationException do
|
142
|
+
@cmd.execute
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
error = @ui.error.split "\n"
|
148
|
+
assert_equal "WARNING: licenses is empty, but is recommended. Use a license identifier from", error.shift
|
149
|
+
assert_equal "http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.", error.shift
|
150
|
+
assert_equal "WARNING: See http://guides.rubygems.org/specification-reference/ for help", error.shift
|
151
|
+
assert_equal [], error
|
152
|
+
|
153
|
+
gem_file = File.join @tempdir, File.basename(@gem.cache_file)
|
154
|
+
refute File.exist?(gem_file)
|
27
155
|
end
|
28
156
|
|
29
157
|
def test_execute_bad_spec
|
@@ -64,6 +192,44 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|
64
192
|
assert_equal "ERROR: Gemspec file not found: some_gem\n", @ui.error
|
65
193
|
end
|
66
194
|
|
195
|
+
def test_execute_outside_dir
|
196
|
+
gemspec_dir = File.join @tempdir, 'build_command_gem'
|
197
|
+
gemspec_file = File.join gemspec_dir, @gem.spec_name
|
198
|
+
readme_file = File.join gemspec_dir, 'README.md'
|
199
|
+
|
200
|
+
FileUtils.mkdir_p gemspec_dir
|
201
|
+
|
202
|
+
File.open readme_file, 'w' do |f|
|
203
|
+
f.write "My awesome gem"
|
204
|
+
end
|
205
|
+
|
206
|
+
File.open gemspec_file, 'w' do |gs|
|
207
|
+
gs.write @gem.to_ruby
|
208
|
+
end
|
209
|
+
|
210
|
+
@cmd.options[:build_path] = gemspec_dir
|
211
|
+
@cmd.options[:args] = [gemspec_file]
|
212
|
+
|
213
|
+
use_ui @ui do
|
214
|
+
@cmd.execute
|
215
|
+
end
|
216
|
+
|
217
|
+
output = @ui.output.split "\n"
|
218
|
+
assert_equal " Successfully built RubyGem", output.shift
|
219
|
+
assert_equal " Name: some_gem", output.shift
|
220
|
+
assert_equal " Version: 2", output.shift
|
221
|
+
assert_equal " File: some_gem-2.gem", output.shift
|
222
|
+
assert_equal [], output
|
223
|
+
|
224
|
+
gem_file = File.join gemspec_dir, File.basename(@gem.cache_file)
|
225
|
+
assert File.exist?(gem_file)
|
226
|
+
|
227
|
+
spec = Gem::Package.new(gem_file).spec
|
228
|
+
|
229
|
+
assert_equal "some_gem", spec.name
|
230
|
+
assert_equal "this is a summary", spec.summary
|
231
|
+
end
|
232
|
+
|
67
233
|
def test_can_find_gemspecs_without_dot_gemspec
|
68
234
|
gemspec_file = File.join(@tempdir, @gem.spec_name)
|
69
235
|
|
@@ -71,12 +237,12 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|
71
237
|
gs.write @gem.to_ruby
|
72
238
|
end
|
73
239
|
|
74
|
-
util_test_build_gem @gem, gemspec_file
|
75
|
-
end
|
76
|
-
|
77
|
-
def util_test_build_gem(gem, gemspec_file, check_licenses=true)
|
78
240
|
@cmd.options[:args] = [gemspec_file]
|
79
241
|
|
242
|
+
util_test_build_gem @gem
|
243
|
+
end
|
244
|
+
|
245
|
+
def util_test_build_gem(gem)
|
80
246
|
use_ui @ui do
|
81
247
|
Dir.chdir @tempdir do
|
82
248
|
@cmd.execute
|
@@ -90,10 +256,6 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|
90
256
|
assert_equal " File: some_gem-2.gem", output.shift
|
91
257
|
assert_equal [], output
|
92
258
|
|
93
|
-
if check_licenses
|
94
|
-
assert_match "WARNING: licenses is empty", @ui.error
|
95
|
-
end
|
96
|
-
|
97
259
|
gem_file = File.join @tempdir, File.basename(gem.cache_file)
|
98
260
|
assert File.exist?(gem_file)
|
99
261
|
|
@@ -115,12 +277,9 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|
115
277
|
@cmd.options[:args] = [gemspec_file]
|
116
278
|
@cmd.options[:force] = true
|
117
279
|
|
118
|
-
util_test_build_gem @gem
|
280
|
+
util_test_build_gem @gem
|
119
281
|
end
|
120
282
|
|
121
|
-
CERT_FILE = cert_path 'public3072'
|
122
|
-
SIGNING_KEY = key_path 'private3072'
|
123
|
-
|
124
283
|
def test_build_signed_gem
|
125
284
|
skip 'openssl is missing' unless defined?(OpenSSL::SSL)
|
126
285
|
|
@@ -137,7 +296,9 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|
137
296
|
gs.write spec.to_ruby
|
138
297
|
end
|
139
298
|
|
140
|
-
|
299
|
+
@cmd.options[:args] = [gemspec_file]
|
300
|
+
|
301
|
+
util_test_build_gem spec
|
141
302
|
|
142
303
|
trust_dir.trust_cert OpenSSL::X509::Certificate.new(File.read(CERT_FILE))
|
143
304
|
|
@@ -146,4 +307,48 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|
146
307
|
assert gem.verify
|
147
308
|
end
|
148
309
|
|
310
|
+
def test_build_signed_gem_with_cert_expiration_length_days
|
311
|
+
skip 'openssl is missing' unless defined?(OpenSSL::SSL)
|
312
|
+
|
313
|
+
gem_path = File.join Gem.user_home, ".gem"
|
314
|
+
Dir.mkdir gem_path
|
315
|
+
|
316
|
+
Gem::Security.trust_dir
|
317
|
+
|
318
|
+
tmp_expired_cert_file = File.join gem_path, "gem-public_cert.pem"
|
319
|
+
File.write(tmp_expired_cert_file, File.read(EXPIRED_CERT_FILE))
|
320
|
+
|
321
|
+
tmp_private_key_file = File.join gem_path, "gem-private_key.pem"
|
322
|
+
File.write(tmp_private_key_file, File.read(PRIVATE_KEY_FILE))
|
323
|
+
|
324
|
+
spec = util_spec 'some_gem' do |s|
|
325
|
+
s.signing_key = tmp_private_key_file
|
326
|
+
s.cert_chain = [tmp_expired_cert_file]
|
327
|
+
end
|
328
|
+
|
329
|
+
gemspec_file = File.join(@tempdir, spec.spec_name)
|
330
|
+
|
331
|
+
File.open gemspec_file, 'w' do |gs|
|
332
|
+
gs.write spec.to_ruby
|
333
|
+
end
|
334
|
+
|
335
|
+
@cmd.options[:args] = [gemspec_file]
|
336
|
+
|
337
|
+
Gem.configuration.cert_expiration_length_days = 28
|
338
|
+
|
339
|
+
use_ui @ui do
|
340
|
+
Dir.chdir @tempdir do
|
341
|
+
@cmd.execute
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file))
|
346
|
+
cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60)
|
347
|
+
|
348
|
+
gem_file = File.join @tempdir, File.basename(spec.cache_file)
|
349
|
+
|
350
|
+
assert File.exist?(gem_file)
|
351
|
+
assert_equal(28, cert_days_to_expire)
|
352
|
+
end
|
353
|
+
|
149
354
|
end
|
@@ -1,23 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'rubygems/test_case'
|
3
3
|
require 'rubygems/commands/cert_command'
|
4
|
-
require 'rubygems/fix_openssl_warnings' if RUBY_VERSION < "1.9"
|
5
4
|
|
6
|
-
unless defined?(OpenSSL::SSL)
|
5
|
+
unless defined?(OpenSSL::SSL)
|
7
6
|
warn 'Skipping `gem cert` tests. openssl not found.'
|
8
7
|
end
|
9
8
|
|
10
9
|
class TestGemCommandsCertCommand < Gem::TestCase
|
11
10
|
|
12
11
|
ALTERNATE_CERT = load_cert 'alternate'
|
12
|
+
EXPIRED_PUBLIC_CERT = load_cert 'expired'
|
13
13
|
|
14
14
|
ALTERNATE_KEY_FILE = key_path 'alternate'
|
15
15
|
PRIVATE_KEY_FILE = key_path 'private'
|
16
16
|
PUBLIC_KEY_FILE = key_path 'public'
|
17
17
|
|
18
|
-
ALTERNATE_CERT_FILE
|
19
|
-
CHILD_CERT_FILE
|
20
|
-
PUBLIC_CERT_FILE
|
18
|
+
ALTERNATE_CERT_FILE = cert_path 'alternate'
|
19
|
+
CHILD_CERT_FILE = cert_path 'child'
|
20
|
+
PUBLIC_CERT_FILE = cert_path 'public'
|
21
|
+
EXPIRED_PUBLIC_CERT_FILE = cert_path 'expired'
|
21
22
|
|
22
23
|
def setup
|
23
24
|
super
|
@@ -158,7 +159,7 @@ Added '/CN=alternate/DC=example'
|
|
158
159
|
@cmd.handle_options %W[
|
159
160
|
--build nobody@example.com
|
160
161
|
--days 26
|
161
|
-
|
162
|
+
]
|
162
163
|
|
163
164
|
@build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
|
164
165
|
|
@@ -191,7 +192,6 @@ Added '/CN=alternate/DC=example'
|
|
191
192
|
|
192
193
|
test = (cert.not_after - cert.not_before).to_i / (24 * 60 * 60)
|
193
194
|
assert_equal(test, 26)
|
194
|
-
|
195
195
|
end
|
196
196
|
|
197
197
|
def test_execute_build_bad_passphrase_confirmation
|
@@ -583,6 +583,68 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis
|
|
583
583
|
assert_equal expected, @ui.error
|
584
584
|
end
|
585
585
|
|
586
|
+
def test_execute_re_sign
|
587
|
+
gem_path = File.join Gem.user_home, ".gem"
|
588
|
+
Dir.mkdir gem_path
|
589
|
+
|
590
|
+
path = File.join @tempdir, 'cert.pem'
|
591
|
+
Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0600
|
592
|
+
|
593
|
+
assert_equal '/CN=nobody/DC=example', EXPIRED_PUBLIC_CERT.issuer.to_s
|
594
|
+
|
595
|
+
tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
|
596
|
+
File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
|
597
|
+
|
598
|
+
@cmd.handle_options %W[
|
599
|
+
--private-key #{PRIVATE_KEY_FILE}
|
600
|
+
--certificate #{tmp_expired_cert_file}
|
601
|
+
--re-sign
|
602
|
+
]
|
603
|
+
|
604
|
+
use_ui @ui do
|
605
|
+
@cmd.execute
|
606
|
+
end
|
607
|
+
|
608
|
+
expected_path = File.join(gem_path, "#{File.basename(tmp_expired_cert_file)}.expired")
|
609
|
+
|
610
|
+
assert_match(
|
611
|
+
/INFO: Your certificate #{tmp_expired_cert_file} has been re-signed\nINFO: Your expired certificate will be located at: #{expected_path}\.[0-9]+/,
|
612
|
+
@ui.output
|
613
|
+
)
|
614
|
+
assert_equal '', @ui.error
|
615
|
+
end
|
616
|
+
|
617
|
+
def test_execute_re_sign_with_cert_expiration_length_days
|
618
|
+
gem_path = File.join Gem.user_home, ".gem"
|
619
|
+
Dir.mkdir gem_path
|
620
|
+
|
621
|
+
path = File.join @tempdir, 'cert.pem'
|
622
|
+
Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0600
|
623
|
+
|
624
|
+
assert_equal '/CN=nobody/DC=example', EXPIRED_PUBLIC_CERT.issuer.to_s
|
625
|
+
|
626
|
+
tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
|
627
|
+
File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
|
628
|
+
|
629
|
+
@cmd.handle_options %W[
|
630
|
+
--private-key #{PRIVATE_KEY_FILE}
|
631
|
+
--certificate #{tmp_expired_cert_file}
|
632
|
+
--re-sign
|
633
|
+
]
|
634
|
+
|
635
|
+
Gem.configuration.cert_expiration_length_days = 28
|
636
|
+
|
637
|
+
use_ui @ui do
|
638
|
+
@cmd.execute
|
639
|
+
end
|
640
|
+
|
641
|
+
re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file))
|
642
|
+
cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60)
|
643
|
+
|
644
|
+
assert_equal(28, cert_days_to_expire)
|
645
|
+
assert_equal '', @ui.error
|
646
|
+
end
|
647
|
+
|
586
648
|
def test_handle_options
|
587
649
|
@cmd.handle_options %W[
|
588
650
|
--add #{PUBLIC_CERT_FILE}
|
@@ -732,4 +794,3 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis
|
|
732
794
|
end
|
733
795
|
|
734
796
|
end if defined?(OpenSSL::SSL)
|
735
|
-
|
@@ -236,5 +236,31 @@ class TestGemCommandsCleanupCommand < Gem::TestCase
|
|
236
236
|
refute_path_exists d_1.gem_dir
|
237
237
|
refute_path_exists e_1.gem_dir
|
238
238
|
end
|
239
|
-
end
|
240
239
|
|
240
|
+
def test_execute_user_install
|
241
|
+
c_1, = util_gem 'c', '1.0'
|
242
|
+
c_2, = util_gem 'c', '1.1'
|
243
|
+
|
244
|
+
d_1, = util_gem 'd', '1.0'
|
245
|
+
d_2, = util_gem 'd', '1.1'
|
246
|
+
|
247
|
+
c_1 = install_gem c_1, :user_install => true # pick up user install path
|
248
|
+
c_2 = install_gem c_2, :user_install => true # pick up user install path
|
249
|
+
|
250
|
+
d_1 = install_gem d_1
|
251
|
+
d_2 = install_gem d_2
|
252
|
+
|
253
|
+
Gem::Specification.dirs = [Gem.dir, Gem.user_dir]
|
254
|
+
|
255
|
+
@cmd.handle_options %w[--user-install]
|
256
|
+
@cmd.options[:args] = []
|
257
|
+
|
258
|
+
@cmd.execute
|
259
|
+
|
260
|
+
refute_path_exists c_1.gem_dir
|
261
|
+
assert_path_exists c_2.gem_dir
|
262
|
+
|
263
|
+
assert_path_exists d_1.gem_dir
|
264
|
+
assert_path_exists d_2.gem_dir
|
265
|
+
end
|
266
|
+
end
|
@@ -10,7 +10,7 @@ class TestGemCommandsContentsCommand < Gem::TestCase
|
|
10
10
|
@cmd = Gem::Commands::ContentsCommand.new
|
11
11
|
end
|
12
12
|
|
13
|
-
def gem
|
13
|
+
def gem(name, version = 2)
|
14
14
|
spec = quick_gem name, version do |gem|
|
15
15
|
gem.files = %W[lib/#{name}.rb Rakefile]
|
16
16
|
end
|
@@ -237,4 +237,3 @@ lib/foo.rb
|
|
237
237
|
end
|
238
238
|
|
239
239
|
end
|
240
|
-
|