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
@@ -3,7 +3,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
3
3
|
###
|
4
4
|
# Parses lockfiles
|
5
5
|
|
6
|
-
def initialize
|
6
|
+
def initialize(tokenizer, set, platforms, filename = nil)
|
7
7
|
@tokens = tokenizer
|
8
8
|
@filename = filename
|
9
9
|
@set = set
|
@@ -41,10 +41,10 @@ class Gem::RequestSet::Lockfile::Parser
|
|
41
41
|
##
|
42
42
|
# Gets the next token for a Lockfile
|
43
43
|
|
44
|
-
def get
|
44
|
+
def get(expected_types = nil, expected_value = nil) # :nodoc:
|
45
45
|
token = @tokens.shift
|
46
46
|
|
47
|
-
if expected_types and not Array(expected_types).include? token.type
|
47
|
+
if expected_types and not Array(expected_types).include? token.type
|
48
48
|
unget token
|
49
49
|
|
50
50
|
message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
|
@@ -53,7 +53,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
53
53
|
raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename
|
54
54
|
end
|
55
55
|
|
56
|
-
if expected_value and expected_value != token.value
|
56
|
+
if expected_value and expected_value != token.value
|
57
57
|
unget token
|
58
58
|
|
59
59
|
message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
|
@@ -93,7 +93,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
93
93
|
|
94
94
|
get :r_paren
|
95
95
|
|
96
|
-
if peek[0] == :bang
|
96
|
+
if peek[0] == :bang
|
97
97
|
requirements.clear
|
98
98
|
requirements << pinned_requirement(token.value)
|
99
99
|
|
@@ -144,7 +144,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
144
144
|
type = token.type
|
145
145
|
data = token.value
|
146
146
|
|
147
|
-
if type == :text and column == 4
|
147
|
+
if type == :text and column == 4
|
148
148
|
version, platform = data.split '-', 2
|
149
149
|
|
150
150
|
platform =
|
@@ -183,7 +183,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
183
183
|
|
184
184
|
type = peek.type
|
185
185
|
value = peek.value
|
186
|
-
if type == :entry and %w[branch ref tag].include? value
|
186
|
+
if type == :entry and %w[branch ref tag].include? value
|
187
187
|
get
|
188
188
|
get :text
|
189
189
|
|
@@ -214,7 +214,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
214
214
|
type = token.type
|
215
215
|
data = token.value
|
216
216
|
|
217
|
-
if type == :text and column == 4
|
217
|
+
if type == :text and column == 4
|
218
218
|
last_spec = set.add_git_spec name, data, repository, revision, true
|
219
219
|
else
|
220
220
|
dependency = parse_dependency name, data
|
@@ -261,7 +261,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
261
261
|
type = token.type
|
262
262
|
data = token.value
|
263
263
|
|
264
|
-
if type == :text and column == 4
|
264
|
+
if type == :text and column == 4
|
265
265
|
last_spec = set.add_vendor_gem name, directory
|
266
266
|
else
|
267
267
|
dependency = parse_dependency name, data
|
@@ -294,7 +294,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
294
294
|
# Parses the requirements following the dependency +name+ and the +op+ for
|
295
295
|
# the first token of the requirements and returns a Gem::Dependency object.
|
296
296
|
|
297
|
-
def parse_dependency
|
297
|
+
def parse_dependency(name, op) # :nodoc:
|
298
298
|
return Gem::Dependency.new name, op unless peek[0] == :text
|
299
299
|
|
300
300
|
version = get(:text).value
|
@@ -314,7 +314,7 @@ class Gem::RequestSet::Lockfile::Parser
|
|
314
314
|
|
315
315
|
private
|
316
316
|
|
317
|
-
def skip
|
317
|
+
def skip(type) # :nodoc:
|
318
318
|
@tokens.skip type
|
319
319
|
end
|
320
320
|
|
@@ -325,30 +325,19 @@ class Gem::RequestSet::Lockfile::Parser
|
|
325
325
|
@tokens.peek
|
326
326
|
end
|
327
327
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
}.compact.first
|
328
|
+
def pinned_requirement(name) # :nodoc:
|
329
|
+
requirement = Gem::Dependency.new name
|
330
|
+
specification = @set.sets.flat_map { |set|
|
331
|
+
set.find_all(requirement)
|
332
|
+
}.compact.first
|
334
333
|
|
335
|
-
|
336
|
-
end
|
337
|
-
else # FIXME: remove when 1.8 is dropped
|
338
|
-
def pinned_requirement name # :nodoc:
|
339
|
-
requirement = Gem::Dependency.new name
|
340
|
-
specification = @set.sets.map { |set|
|
341
|
-
set.find_all(requirement)
|
342
|
-
}.flatten(1).compact.first
|
343
|
-
|
344
|
-
specification && specification.version
|
345
|
-
end
|
334
|
+
specification && specification.version
|
346
335
|
end
|
347
336
|
|
348
337
|
##
|
349
338
|
# Ungets the last token retrieved by #get
|
350
339
|
|
351
|
-
def unget
|
340
|
+
def unget(token) # :nodoc:
|
352
341
|
@tokens.unshift token
|
353
342
|
end
|
354
343
|
end
|
@@ -5,11 +5,11 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
5
5
|
Token = Struct.new :type, :value, :column, :line
|
6
6
|
EOF = Token.new :EOF
|
7
7
|
|
8
|
-
def self.from_file
|
8
|
+
def self.from_file(file)
|
9
9
|
new File.read(file), file
|
10
10
|
end
|
11
11
|
|
12
|
-
def initialize
|
12
|
+
def initialize(input, filename = nil, line = 0, pos = 0)
|
13
13
|
@line = line
|
14
14
|
@line_pos = pos
|
15
15
|
@tokens = []
|
@@ -17,7 +17,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
17
17
|
tokenize input
|
18
18
|
end
|
19
19
|
|
20
|
-
def make_parser
|
20
|
+
def make_parser(set, platforms)
|
21
21
|
Gem::RequestSet::Lockfile::Parser.new self, set, platforms, @filename
|
22
22
|
end
|
23
23
|
|
@@ -25,7 +25,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
25
25
|
@tokens.map { |token| [token.type, token.value, token.column, token.line] }
|
26
26
|
end
|
27
27
|
|
28
|
-
def skip
|
28
|
+
def skip(type)
|
29
29
|
@tokens.shift while not @tokens.empty? and peek.type == type
|
30
30
|
end
|
31
31
|
|
@@ -33,7 +33,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
33
33
|
# Calculates the column (by byte) and the line of the current token based on
|
34
34
|
# +byte_offset+.
|
35
35
|
|
36
|
-
def token_pos
|
36
|
+
def token_pos(byte_offset) # :nodoc:
|
37
37
|
[byte_offset - @line_pos, @line]
|
38
38
|
end
|
39
39
|
|
@@ -41,7 +41,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
41
41
|
@tokens.empty?
|
42
42
|
end
|
43
43
|
|
44
|
-
def unshift
|
44
|
+
def unshift(token)
|
45
45
|
@tokens.unshift token
|
46
46
|
end
|
47
47
|
|
@@ -56,7 +56,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
56
56
|
|
57
57
|
private
|
58
58
|
|
59
|
-
def tokenize
|
59
|
+
def tokenize(input)
|
60
60
|
require 'strscan'
|
61
61
|
s = StringScanner.new input
|
62
62
|
|
@@ -65,7 +65,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
65
65
|
|
66
66
|
pos = s.pos if leading_whitespace = s.scan(/ +/)
|
67
67
|
|
68
|
-
if s.scan(/[<|=>]{7}/)
|
68
|
+
if s.scan(/[<|=>]{7}/)
|
69
69
|
message = "your #{@filename} contains merge conflict markers"
|
70
70
|
column, line = token_pos pos
|
71
71
|
|
@@ -80,7 +80,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
|
|
80
80
|
@line += 1
|
81
81
|
token
|
82
82
|
when s.scan(/[A-Z]+/) then
|
83
|
-
if leading_whitespace
|
83
|
+
if leading_whitespace
|
84
84
|
text = s.matched
|
85
85
|
text += s.scan(/[^\s)]*/).to_s # in case of no match
|
86
86
|
Token.new(:text, text, *token_pos(pos))
|
@@ -29,7 +29,7 @@ class Gem::RequestSet::Lockfile
|
|
29
29
|
# Raises a ParseError with the given +message+ which was encountered at a
|
30
30
|
# +line+ and +column+ while parsing.
|
31
31
|
|
32
|
-
def initialize
|
32
|
+
def initialize(message, column, line, path)
|
33
33
|
@line = line
|
34
34
|
@column = column
|
35
35
|
@path = path
|
@@ -41,13 +41,13 @@ class Gem::RequestSet::Lockfile
|
|
41
41
|
# Creates a new Lockfile for the given +request_set+ and +gem_deps_file+
|
42
42
|
# location.
|
43
43
|
|
44
|
-
def self.build
|
44
|
+
def self.build(request_set, gem_deps_file, dependencies = nil)
|
45
45
|
request_set.resolve
|
46
46
|
dependencies ||= requests_to_deps request_set.sorted_requests
|
47
47
|
new request_set, gem_deps_file, dependencies
|
48
48
|
end
|
49
49
|
|
50
|
-
def self.requests_to_deps
|
50
|
+
def self.requests_to_deps(requests) # :nodoc:
|
51
51
|
deps = {}
|
52
52
|
|
53
53
|
requests.each do |request|
|
@@ -56,7 +56,7 @@ class Gem::RequestSet::Lockfile
|
|
56
56
|
requirement = request.request.dependency.requirement
|
57
57
|
|
58
58
|
deps[name] = if [Gem::Resolver::VendorSpecification,
|
59
|
-
Gem::Resolver::GitSpecification].include? spec.class
|
59
|
+
Gem::Resolver::GitSpecification].include? spec.class
|
60
60
|
Gem::Requirement.source_set
|
61
61
|
else
|
62
62
|
requirement
|
@@ -71,7 +71,7 @@ class Gem::RequestSet::Lockfile
|
|
71
71
|
|
72
72
|
attr_reader :platforms
|
73
73
|
|
74
|
-
def initialize
|
74
|
+
def initialize(request_set, gem_deps_file, dependencies)
|
75
75
|
@set = request_set
|
76
76
|
@dependencies = dependencies
|
77
77
|
@gem_deps_file = File.expand_path(gem_deps_file)
|
@@ -82,7 +82,7 @@ class Gem::RequestSet::Lockfile
|
|
82
82
|
@platforms = []
|
83
83
|
end
|
84
84
|
|
85
|
-
def add_DEPENDENCIES
|
85
|
+
def add_DEPENDENCIES(out) # :nodoc:
|
86
86
|
out << "DEPENDENCIES"
|
87
87
|
|
88
88
|
out.concat @dependencies.sort_by { |name,| name }.map { |name, requirement|
|
@@ -92,7 +92,7 @@ class Gem::RequestSet::Lockfile
|
|
92
92
|
out << nil
|
93
93
|
end
|
94
94
|
|
95
|
-
def add_GEM
|
95
|
+
def add_GEM(out, spec_groups) # :nodoc:
|
96
96
|
return if spec_groups.empty?
|
97
97
|
|
98
98
|
source_groups = spec_groups.values.flatten.group_by do |request|
|
@@ -122,7 +122,7 @@ class Gem::RequestSet::Lockfile
|
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
|
-
def add_GIT
|
125
|
+
def add_GIT(out, git_requests)
|
126
126
|
return if git_requests.empty?
|
127
127
|
|
128
128
|
by_repository_revision = git_requests.group_by do |request|
|
@@ -148,11 +148,11 @@ class Gem::RequestSet::Lockfile
|
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
151
|
-
def relative_path_from
|
151
|
+
def relative_path_from(dest, base) # :nodoc:
|
152
152
|
dest = File.expand_path(dest)
|
153
153
|
base = File.expand_path(base)
|
154
154
|
|
155
|
-
if dest.index(base) == 0
|
155
|
+
if dest.index(base) == 0
|
156
156
|
offset = dest[base.size+1..-1]
|
157
157
|
|
158
158
|
return '.' unless offset
|
@@ -163,7 +163,7 @@ class Gem::RequestSet::Lockfile
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
-
def add_PATH
|
166
|
+
def add_PATH(out, path_requests) # :nodoc:
|
167
167
|
return if path_requests.empty?
|
168
168
|
|
169
169
|
out << "PATH"
|
@@ -178,7 +178,7 @@ class Gem::RequestSet::Lockfile
|
|
178
178
|
out << nil
|
179
179
|
end
|
180
180
|
|
181
|
-
def add_PLATFORMS
|
181
|
+
def add_PLATFORMS(out) # :nodoc:
|
182
182
|
out << "PLATFORMS"
|
183
183
|
|
184
184
|
platforms = requests.map { |request| request.spec.platform }.uniq
|
data/lib/rubygems/request_set.rb
CHANGED
@@ -91,7 +91,7 @@ class Gem::RequestSet
|
|
91
91
|
#
|
92
92
|
# set = Gem::RequestSet.new nokogiri, pg
|
93
93
|
|
94
|
-
def initialize
|
94
|
+
def initialize(*deps)
|
95
95
|
@dependencies = deps
|
96
96
|
|
97
97
|
@always_install = []
|
@@ -119,8 +119,8 @@ class Gem::RequestSet
|
|
119
119
|
##
|
120
120
|
# Declare that a gem of name +name+ with +reqs+ requirements is needed.
|
121
121
|
|
122
|
-
def gem
|
123
|
-
if dep = @dependency_names[name]
|
122
|
+
def gem(name, *reqs)
|
123
|
+
if dep = @dependency_names[name]
|
124
124
|
dep.requirement.concat reqs
|
125
125
|
else
|
126
126
|
dep = Gem::Dependency.new name, *reqs
|
@@ -132,7 +132,7 @@ class Gem::RequestSet
|
|
132
132
|
##
|
133
133
|
# Add +deps+ Gem::Dependency objects to the set.
|
134
134
|
|
135
|
-
def import
|
135
|
+
def import(deps)
|
136
136
|
@dependencies.concat deps
|
137
137
|
end
|
138
138
|
|
@@ -143,7 +143,7 @@ class Gem::RequestSet
|
|
143
143
|
# The +installer+ will be +nil+ if a gem matching the request was already
|
144
144
|
# installed.
|
145
145
|
|
146
|
-
def install
|
146
|
+
def install(options, &block) # :yields: request, installer
|
147
147
|
if dir = options[:install_dir]
|
148
148
|
requests = install_into dir, false, options, &block
|
149
149
|
return requests
|
@@ -152,12 +152,39 @@ class Gem::RequestSet
|
|
152
152
|
@prerelease = options[:prerelease]
|
153
153
|
|
154
154
|
requests = []
|
155
|
+
download_queue = Queue.new
|
155
156
|
|
157
|
+
# Create a thread-safe list of gems to download
|
156
158
|
sorted_requests.each do |req|
|
157
|
-
|
159
|
+
download_queue << req
|
160
|
+
end
|
161
|
+
|
162
|
+
# Create N threads in a pool, have them download all the gems
|
163
|
+
threads = Gem.configuration.concurrent_downloads.times.map do
|
164
|
+
# When a thread pops this item, it knows to stop running. The symbol
|
165
|
+
# is queued here so that there will be one symbol per thread.
|
166
|
+
download_queue << :stop
|
167
|
+
|
168
|
+
Thread.new do
|
169
|
+
# The pop method will block waiting for items, so the only way
|
170
|
+
# to stop a thread from running is to provide a final item that
|
171
|
+
# means the thread should stop.
|
172
|
+
while req = download_queue.pop
|
173
|
+
break if req == :stop
|
174
|
+
req.spec.download options unless req.installed?
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# Wait for all the downloads to finish before continuing
|
180
|
+
threads.each(&:value)
|
181
|
+
|
182
|
+
# Install requested gems after they have been downloaded
|
183
|
+
sorted_requests.each do |req|
|
184
|
+
if req.installed?
|
158
185
|
req.spec.spec.build_extensions
|
159
186
|
|
160
|
-
if @always_install.none? { |spec| spec == req.spec.spec }
|
187
|
+
if @always_install.none? { |spec| spec == req.spec.spec }
|
161
188
|
yield req, nil if block_given?
|
162
189
|
next
|
163
190
|
end
|
@@ -203,7 +230,7 @@ class Gem::RequestSet
|
|
203
230
|
# If +:without_groups+ is given in the +options+, those groups in the gem
|
204
231
|
# dependencies file are not used. See Gem::Installer for other +options+.
|
205
232
|
|
206
|
-
def install_from_gemdeps
|
233
|
+
def install_from_gemdeps(options, &block)
|
207
234
|
gemdeps = options[:gemdeps]
|
208
235
|
|
209
236
|
@install_dir = options[:install_dir] || Gem.dir
|
@@ -228,7 +255,7 @@ class Gem::RequestSet
|
|
228
255
|
else
|
229
256
|
installed = install options, &block
|
230
257
|
|
231
|
-
if options.fetch :lock, true
|
258
|
+
if options.fetch :lock, true
|
232
259
|
lockfile =
|
233
260
|
Gem::RequestSet::Lockfile.build self, gemdeps, gem_deps_api.dependencies
|
234
261
|
lockfile.write
|
@@ -238,7 +265,7 @@ class Gem::RequestSet
|
|
238
265
|
end
|
239
266
|
end
|
240
267
|
|
241
|
-
def install_into
|
268
|
+
def install_into(dir, force = true, options = {})
|
242
269
|
gem_home, ENV['GEM_HOME'] = ENV['GEM_HOME'], dir
|
243
270
|
|
244
271
|
existing = force ? [] : specs_in(dir)
|
@@ -256,7 +283,7 @@ class Gem::RequestSet
|
|
256
283
|
sorted_requests.each do |request|
|
257
284
|
spec = request.spec
|
258
285
|
|
259
|
-
if existing.find { |s| s.full_name == spec.full_name }
|
286
|
+
if existing.find { |s| s.full_name == spec.full_name }
|
260
287
|
yield request, nil if block_given?
|
261
288
|
next
|
262
289
|
end
|
@@ -278,7 +305,7 @@ class Gem::RequestSet
|
|
278
305
|
##
|
279
306
|
# Call hooks on installed gems
|
280
307
|
|
281
|
-
def install_hooks
|
308
|
+
def install_hooks(requests, options)
|
282
309
|
specs = requests.map do |request|
|
283
310
|
case request
|
284
311
|
when Gem::Resolver::ActivationRequest then
|
@@ -300,7 +327,7 @@ class Gem::RequestSet
|
|
300
327
|
##
|
301
328
|
# Load a dependency management file.
|
302
329
|
|
303
|
-
def load_gemdeps
|
330
|
+
def load_gemdeps(path, without_groups = [], installing = false)
|
304
331
|
@git_set = Gem::Resolver::GitSet.new
|
305
332
|
@vendor_set = Gem::Resolver::VendorSet.new
|
306
333
|
@source_set = Gem::Resolver::SourceSet.new
|
@@ -321,29 +348,29 @@ class Gem::RequestSet
|
|
321
348
|
gf.load
|
322
349
|
end
|
323
350
|
|
324
|
-
def pretty_print
|
351
|
+
def pretty_print(q) # :nodoc:
|
325
352
|
q.group 2, '[RequestSet:', ']' do
|
326
353
|
q.breakable
|
327
354
|
|
328
|
-
if @remote
|
355
|
+
if @remote
|
329
356
|
q.text 'remote'
|
330
357
|
q.breakable
|
331
358
|
end
|
332
359
|
|
333
|
-
if @prerelease
|
360
|
+
if @prerelease
|
334
361
|
q.text 'prerelease'
|
335
362
|
q.breakable
|
336
363
|
end
|
337
364
|
|
338
|
-
if @development_shallow
|
365
|
+
if @development_shallow
|
339
366
|
q.text 'shallow development'
|
340
367
|
q.breakable
|
341
|
-
elsif @development
|
368
|
+
elsif @development
|
342
369
|
q.text 'development'
|
343
370
|
q.breakable
|
344
371
|
end
|
345
372
|
|
346
|
-
if @soft_missing
|
373
|
+
if @soft_missing
|
347
374
|
q.text 'soft missing'
|
348
375
|
end
|
349
376
|
|
@@ -367,7 +394,7 @@ class Gem::RequestSet
|
|
367
394
|
# Resolve the requested dependencies and return an Array of Specification
|
368
395
|
# objects to be activated.
|
369
396
|
|
370
|
-
def resolve
|
397
|
+
def resolve(set = Gem::Resolver::BestSet.new)
|
371
398
|
@sets << set
|
372
399
|
@sets << @git_set
|
373
400
|
@sets << @vendor_set
|
@@ -416,17 +443,17 @@ class Gem::RequestSet
|
|
416
443
|
@specs ||= @requests.map { |r| r.full_spec }
|
417
444
|
end
|
418
445
|
|
419
|
-
def specs_in
|
420
|
-
|
446
|
+
def specs_in(dir)
|
447
|
+
Gem::Util.glob_files_in_dir("*.gemspec", File.join(dir, "specifications")).map do |g|
|
421
448
|
Gem::Specification.load g
|
422
449
|
end
|
423
450
|
end
|
424
451
|
|
425
|
-
def tsort_each_node
|
452
|
+
def tsort_each_node(&block) # :nodoc:
|
426
453
|
@requests.each(&block)
|
427
454
|
end
|
428
455
|
|
429
|
-
def tsort_each_child
|
456
|
+
def tsort_each_child(node) # :nodoc:
|
430
457
|
node.spec.dependencies.each do |dep|
|
431
458
|
next if dep.type == :development and not @development
|
432
459
|
|
@@ -434,7 +461,7 @@ class Gem::RequestSet
|
|
434
461
|
dep.match? r.spec.name, r.spec.version, @prerelease
|
435
462
|
}
|
436
463
|
|
437
|
-
unless match
|
464
|
+
unless match
|
438
465
|
next if dep.type == :development and @development_shallow
|
439
466
|
next if @soft_missing
|
440
467
|
raise Gem::DependencyError,
|
data/lib/rubygems/requirement.rb
CHANGED
@@ -2,10 +2,6 @@
|
|
2
2
|
require "rubygems/version"
|
3
3
|
require "rubygems/deprecate"
|
4
4
|
|
5
|
-
# If we're being loaded after yaml was already required, then
|
6
|
-
# load our yaml + workarounds now.
|
7
|
-
Gem.load_yaml if defined? ::YAML
|
8
|
-
|
9
5
|
##
|
10
6
|
# A Requirement is a set of one or more version restrictions. It supports a
|
11
7
|
# few (<tt>=, !=, >, <, >=, <=, ~></tt>) different restriction operators.
|
@@ -22,22 +18,22 @@ class Gem::Requirement
|
|
22
18
|
">=" => lambda { |v, r| v >= r },
|
23
19
|
"<=" => lambda { |v, r| v <= r },
|
24
20
|
"~>" => lambda { |v, r| v >= r && v.release < r.bump }
|
25
|
-
}
|
21
|
+
}.freeze
|
26
22
|
|
27
23
|
SOURCE_SET_REQUIREMENT = Struct.new(:for_lockfile).new "!" # :nodoc:
|
28
24
|
|
29
25
|
quoted = OPS.keys.map { |k| Regexp.quote k }.join "|"
|
30
|
-
PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*" # :nodoc:
|
26
|
+
PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*".freeze # :nodoc:
|
31
27
|
|
32
28
|
##
|
33
29
|
# A regular expression that matches a requirement
|
34
30
|
|
35
|
-
PATTERN = /\A#{PATTERN_RAW}\z
|
31
|
+
PATTERN = /\A#{PATTERN_RAW}\z/.freeze
|
36
32
|
|
37
33
|
##
|
38
34
|
# The default requirement matches any version
|
39
35
|
|
40
|
-
DefaultRequirement = [">=", Gem::Version.new(0)]
|
36
|
+
DefaultRequirement = [">=", Gem::Version.new(0)].freeze
|
41
37
|
|
42
38
|
##
|
43
39
|
# Raised when a bad requirement is encountered
|
@@ -51,7 +47,7 @@ class Gem::Requirement
|
|
51
47
|
# If the input is "weird", the default version requirement is
|
52
48
|
# returned.
|
53
49
|
|
54
|
-
def self.create
|
50
|
+
def self.create(*inputs)
|
55
51
|
return new inputs if inputs.length > 1
|
56
52
|
|
57
53
|
input = inputs.shift
|
@@ -64,7 +60,7 @@ class Gem::Requirement
|
|
64
60
|
when '!' then
|
65
61
|
source_set
|
66
62
|
else
|
67
|
-
if input.respond_to? :to_str
|
63
|
+
if input.respond_to? :to_str
|
68
64
|
new [input.to_str]
|
69
65
|
else
|
70
66
|
default
|
@@ -98,7 +94,7 @@ class Gem::Requirement
|
|
98
94
|
# parse("1.0") # => ["=", Gem::Version.new("1.0")]
|
99
95
|
# parse(Gem::Version.new("1.0")) # => ["=, Gem::Version.new("1.0")]
|
100
96
|
|
101
|
-
def self.parse
|
97
|
+
def self.parse(obj)
|
102
98
|
return ["=", obj] if Gem::Version === obj
|
103
99
|
|
104
100
|
unless PATTERN =~ obj.to_s
|
@@ -124,7 +120,7 @@ class Gem::Requirement
|
|
124
120
|
# requirements are ignored. An empty set of +requirements+ is the
|
125
121
|
# same as <tt>">= 0"</tt>.
|
126
122
|
|
127
|
-
def initialize
|
123
|
+
def initialize(*requirements)
|
128
124
|
requirements = requirements.flatten
|
129
125
|
requirements.compact!
|
130
126
|
requirements.uniq!
|
@@ -140,7 +136,7 @@ class Gem::Requirement
|
|
140
136
|
##
|
141
137
|
# Concatenates the +new+ requirements onto this requirement.
|
142
138
|
|
143
|
-
def concat
|
139
|
+
def concat(new)
|
144
140
|
new = new.flatten
|
145
141
|
new.compact!
|
146
142
|
new.uniq!
|
@@ -198,7 +194,7 @@ class Gem::Requirement
|
|
198
194
|
[@requirements]
|
199
195
|
end
|
200
196
|
|
201
|
-
def marshal_load
|
197
|
+
def marshal_load(array) # :nodoc:
|
202
198
|
@requirements = array[0]
|
203
199
|
|
204
200
|
fix_syck_default_key_in_requirements
|
@@ -213,7 +209,7 @@ class Gem::Requirement
|
|
213
209
|
fix_syck_default_key_in_requirements
|
214
210
|
end
|
215
211
|
|
216
|
-
def init_with
|
212
|
+
def init_with(coder) # :nodoc:
|
217
213
|
yaml_initialize coder.tag, coder.map
|
218
214
|
end
|
219
215
|
|
@@ -221,7 +217,7 @@ class Gem::Requirement
|
|
221
217
|
["@requirements"]
|
222
218
|
end
|
223
219
|
|
224
|
-
def encode_with
|
220
|
+
def encode_with(coder) # :nodoc:
|
225
221
|
coder.add 'requirements', @requirements
|
226
222
|
end
|
227
223
|
|
@@ -233,7 +229,7 @@ class Gem::Requirement
|
|
233
229
|
requirements.any? { |r| r.last.prerelease? }
|
234
230
|
end
|
235
231
|
|
236
|
-
def pretty_print
|
232
|
+
def pretty_print(q) # :nodoc:
|
237
233
|
q.group 1, 'Gem::Requirement.new(', ')' do
|
238
234
|
q.pp as_list
|
239
235
|
end
|
@@ -242,7 +238,7 @@ class Gem::Requirement
|
|
242
238
|
##
|
243
239
|
# True if +version+ satisfies this Requirement.
|
244
240
|
|
245
|
-
def satisfied_by?
|
241
|
+
def satisfied_by?(version)
|
246
242
|
raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless
|
247
243
|
Gem::Version === version
|
248
244
|
# #28965: syck has a bug with unquoted '=' YAML.loading as YAML::DefaultKey
|
@@ -265,9 +261,24 @@ class Gem::Requirement
|
|
265
261
|
as_list.join ", "
|
266
262
|
end
|
267
263
|
|
268
|
-
def ==
|
264
|
+
def ==(other) # :nodoc:
|
269
265
|
return unless Gem::Requirement === other
|
270
|
-
|
266
|
+
|
267
|
+
# An == check is always necessary
|
268
|
+
return false unless requirements == other.requirements
|
269
|
+
|
270
|
+
# An == check is sufficient unless any requirements use ~>
|
271
|
+
return true unless _tilde_requirements.any?
|
272
|
+
|
273
|
+
# If any requirements use ~> we use the stricter `#eql?` that also checks
|
274
|
+
# that version precision is the same
|
275
|
+
_tilde_requirements.eql?(other._tilde_requirements)
|
276
|
+
end
|
277
|
+
|
278
|
+
protected
|
279
|
+
|
280
|
+
def _tilde_requirements
|
281
|
+
requirements.select { |r| r.first == "~>" }
|
271
282
|
end
|
272
283
|
|
273
284
|
private
|
@@ -284,7 +295,7 @@ class Gem::Requirement
|
|
284
295
|
end
|
285
296
|
|
286
297
|
def sort_requirements! # :nodoc:
|
287
|
-
@requirements.sort! do |l, r|
|
298
|
+
@requirements.sort! do |l, r|
|
288
299
|
comp = l.last <=> r.last # first, sort by the requirement's version
|
289
300
|
next comp unless comp == 0
|
290
301
|
l.first <=> r.first # then, sort by the operator (for stability)
|