1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/bundler/realworld/edgecases_spec.rb
David Rodríguez d0bf31e6cf [rubygems/rubygems] Don't on gemspecs with invalid require_paths, just warn
These gemspecs already work most of the times. When they are installed
normally, the require_paths in the gemspec stub line becomes actually
correct, and the incorrect value in the real gemspec is ignored. It only
becomes an issue in standalone mode.

In Ruby 3.2, `Kernel#=~` has been removed, and that means that it
becomes harder for us to gracefully deal with this error in standalone
mode, because it now happens earlier due to calling `Array#=~` for this
invalid gemspec (since require_paths is incorrectly an array of arrays).

The easiest way to fix this is to actually make this just work instead
by automatically fixing the issue when reading the packaged gemspec.

https://github.com/rubygems/rubygems/commit/d3f2fe6d26
2022-06-12 02:02:20 +09:00

537 lines
15 KiB
Ruby

# frozen_string_literal: true
RSpec.describe "real world edgecases", :realworld => true do
def rubygems_version(name, requirement)
ruby <<-RUBY
require "#{spec_dir}/support/artifice/vcr"
require "#{entrypoint}"
require "#{entrypoint}/source/rubygems/remote"
require "#{entrypoint}/fetcher"
rubygem = Bundler.ui.silence do
source = Bundler::Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org"))
fetcher = Bundler::Fetcher.new(source)
index = fetcher.specs([#{name.dump}], nil)
index.search(Gem::Dependency.new(#{name.dump}, #{requirement.dump})).last
end
if rubygem.nil?
raise "Could not find #{name} (#{requirement}) on rubygems.org!\n" \
"Found specs:\n\#{index.send(:specs).inspect}"
end
puts "#{name} (\#{rubygem.version})"
RUBY
end
it "resolves dependencies correctly" do
gemfile <<-G
source "https://rubygems.org"
gem 'rails', '~> 5.0'
gem 'capybara', '~> 2.2.0'
gem 'rack-cache', '1.2.0' # last version that works on Ruby 1.9
G
bundle :lock
expect(lockfile).to include(rubygems_version("rails", "~> 5.0"))
expect(lockfile).to include("capybara (2.2.1)")
end
it "installs the latest version of gxapi_rails" do
gemfile <<-G
source "https://rubygems.org"
gem "sass-rails"
gem "rails", "~> 5"
gem "gxapi_rails", "< 0.1.0" # 0.1.0 was released way after the test was written
gem 'rack-cache', '1.2.0' # last version that works on Ruby 1.9
G
bundle :lock
expect(lockfile).to include("gxapi_rails (0.0.6)")
end
it "installs the latest version of i18n" do
gemfile <<-G
source "https://rubygems.org"
gem "i18n", "~> 0.6.0"
gem "activesupport", "~> 3.0"
gem "activerecord", "~> 3.0"
gem "builder", "~> 2.1.2"
G
bundle :lock
expect(lockfile).to include(rubygems_version("i18n", "~> 0.6.0"))
expect(lockfile).to include(rubygems_version("activesupport", "~> 3.0"))
end
it "is able to update a top-level dependency when there is a conflict on a shared transitive child" do
# from https://github.com/rubygems/bundler/issues/5031
system_gems "bundler-2.99.0"
gemfile <<-G
source "https://rubygems.org"
gem 'rails', '~> 4.2.7.1'
gem 'paperclip', '~> 5.1.0'
G
lockfile <<-L
GEM
remote: https://rubygems.org/
specs:
actionmailer (4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.7.1)
actionview (= 4.2.7.1)
activesupport (= 4.2.7.1)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.7.1)
activesupport (= 4.2.7.1)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
activejob (4.2.7.1)
activesupport (= 4.2.7.1)
globalid (>= 0.3.0)
activemodel (4.2.7.1)
activesupport (= 4.2.7.1)
builder (~> 3.1)
activerecord (4.2.7.1)
activemodel (= 4.2.7.1)
activesupport (= 4.2.7.1)
arel (~> 6.0)
activesupport (4.2.7.1)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
arel (6.0.3)
builder (3.2.2)
climate_control (0.0.3)
activesupport (>= 3.0)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
concurrent-ruby (1.0.2)
erubis (2.7.0)
globalid (0.3.7)
activesupport (>= 4.1.0)
i18n (0.7.0)
json (1.8.3)
loofah (2.0.3)
nokogiri (>= 1.5.9)
mail (2.6.4)
mime-types (>= 1.16, < 4)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.1.0)
minitest (5.9.1)
nokogiri (1.6.8)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
paperclip (5.1.0)
activemodel (>= 4.2.0)
activesupport (>= 4.2.0)
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
pkg-config (1.1.7)
rack (1.6.4)
rack-test (0.6.3)
rack (>= 1.0)
rails (4.2.7.1)
actionmailer (= 4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
activemodel (= 4.2.7.1)
activerecord (= 4.2.7.1)
activesupport (= 4.2.7.1)
bundler (>= 1.3.0, < 3.0)
railties (= 4.2.7.1)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.7)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
railties (4.2.7.1)
actionpack (= 4.2.7.1)
activesupport (= 4.2.7.1)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (11.3.0)
sprockets (3.7.0)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.0)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
thor (0.19.1)
thread_safe (0.3.5)
tzinfo (1.2.2)
thread_safe (~> 0.1)
PLATFORMS
ruby
DEPENDENCIES
paperclip (~> 5.1.0)
rails (~> 4.2.7.1)
L
bundle "lock --update paperclip", :env => { "BUNDLER_VERSION" => "2.99.0" }
expect(lockfile).to include(rubygems_version("paperclip", "~> 5.1.0"))
end
it "outputs a helpful error message when gems have invalid gemspecs", :rubygems => "< 3.3.16" do
install_gemfile <<-G, :standalone => true, :raise_on_error => false, :env => { "BUNDLE_FORCE_RUBY_PLATFORM" => "1" }
source 'https://rubygems.org'
gem "resque-scheduler", "2.2.0"
gem "redis-namespace", "1.6.0" # for a consistent resolution including ruby 2.3.0
gem "ruby2_keywords", "0.0.5"
G
expect(err).to include("You have one or more invalid gemspecs that need to be fixed.")
expect(err).to include("resque-scheduler 2.2.0 has an invalid gemspec")
end
it "outputs a helpful warning when gems have a gemspec with invalid `require_paths`", :rubygems => ">= 3.3.16" do
install_gemfile <<-G, :standalone => true, :env => { "BUNDLE_FORCE_RUBY_PLATFORM" => "1" }
source 'https://rubygems.org'
gem "resque-scheduler", "2.2.0"
gem "redis-namespace", "1.6.0" # for a consistent resolution including ruby 2.3.0
gem "ruby2_keywords", "0.0.5"
G
expect(err).to include("resque-scheduler 2.2.0 includes a gemspec with `require_paths` set to an array of arrays. Newer versions of this gem might've already fixed this").once
end
it "doesn't hang on big gemfile" do
skip "Only for ruby 2.7.3" if RUBY_VERSION != "2.7.3" || RUBY_PLATFORM =~ /darwin/
gemfile <<~G
# frozen_string_literal: true
source "https://rubygems.org"
ruby "2.7.3"
gem "rails"
gem "pg", ">= 0.18", "< 2.0"
gem "goldiloader"
gem "awesome_nested_set"
gem "circuitbox"
gem "passenger"
gem "globalid"
gem "rack-cors"
gem "rails-pg-extras"
gem "linear_regression_trend"
gem "rack-protection"
gem "pundit"
gem "remote_ip_proxy_scrubber"
gem "bcrypt"
gem "searchkick"
gem "excon"
gem "faraday_middleware-aws-sigv4"
gem "typhoeus"
gem "sidekiq"
gem "sidekiq-undertaker"
gem "sidekiq-cron"
gem "storext"
gem "appsignal"
gem "fcm"
gem "business_time"
gem "tzinfo"
gem "holidays"
gem "bigdecimal"
gem "progress_bar"
gem "redis"
gem "hiredis"
gem "state_machines"
gem "state_machines-audit_trail"
gem "state_machines-activerecord"
gem "interactor"
gem "ar_transaction_changes"
gem "redis-rails"
gem "seed_migration"
gem "lograge"
gem "graphiql-rails", group: :development
gem "graphql"
gem "pusher"
gem "rbnacl"
gem "jwt"
gem "json-schema"
gem "discard"
gem "money"
gem "strip_attributes"
gem "validates_email_format_of"
gem "audited"
gem "concurrent-ruby"
gem "with_advisory_lock"
group :test do
gem "rspec-sidekiq"
gem "simplecov", require: false
end
group :development, :test do
gem "byebug", platform: :mri
gem "guard"
gem "guard-bundler"
gem "guard-rspec"
gem "rb-fsevent"
gem "rspec_junit_formatter"
gem "rspec-collection_matchers"
gem "rspec-rails"
gem "rspec-retry"
gem "state_machines-rspec"
gem "dotenv-rails"
gem "database_cleaner-active_record"
gem "database_cleaner-redis"
gem "timecop"
end
gem "factory_bot_rails"
gem "faker"
group :development do
gem "listen"
gem "sql_queries_count"
gem "rubocop"
gem "rubocop-performance"
gem "rubocop-rspec"
gem "rubocop-rails"
gem "brakeman"
gem "bundler-audit"
gem "solargraph"
gem "annotate"
end
G
if Bundler.feature_flag.bundler_3_mode?
# Conflicts on bundler version, so fails earlier
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }, :raise_on_error => false
expect(out).to display_total_steps_of(435)
else
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }
expect(out).to display_total_steps_of(1025)
end
end
it "doesn't hang on tricky gemfile" do
skip "Only for ruby 2.7.3" if RUBY_VERSION != "2.7.3" || RUBY_PLATFORM =~ /darwin/
gemfile <<~G
source 'https://rubygems.org'
group :development do
gem "puppet-module-posix-default-r2.7", '~> 0.3'
gem "puppet-module-posix-dev-r2.7", '~> 0.3'
gem "beaker-rspec"
gem "beaker-puppet"
gem "beaker-docker"
gem "beaker-puppet_install_helper"
gem "beaker-module_install_helper"
end
G
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }
if Bundler.feature_flag.bundler_3_mode?
expect(out).to display_total_steps_of(890)
else
expect(out).to display_total_steps_of(891)
end
end
it "doesn't hang on nix gemfile" do
skip "Only for ruby 3.0.1" if RUBY_VERSION != "3.0.1" || RUBY_PLATFORM =~ /darwin/
gemfile <<~G
source "https://rubygems.org" do
gem "addressable"
gem "atk"
gem "awesome_print"
gem "bacon"
gem "byebug"
gem "cairo"
gem "cairo-gobject"
gem "camping"
gem "charlock_holmes"
gem "cld3"
gem "cocoapods"
gem "cocoapods-acknowledgements"
gem "cocoapods-art"
gem "cocoapods-bin"
gem "cocoapods-browser"
gem "cocoapods-bugsnag"
gem "cocoapods-check"
gem "cocoapods-clean"
gem "cocoapods-clean_build_phases_scripts"
gem "cocoapods-core"
gem "cocoapods-coverage"
gem "cocoapods-deintegrate"
gem "cocoapods-dependencies"
gem "cocoapods-deploy"
gem "cocoapods-downloader"
gem "cocoapods-expert-difficulty"
gem "cocoapods-fix-react-native"
gem "cocoapods-generate"
gem "cocoapods-git_url_rewriter"
gem "cocoapods-keys"
gem "cocoapods-no-dev-schemes"
gem "cocoapods-open"
gem "cocoapods-packager"
gem "cocoapods-playgrounds"
gem "cocoapods-plugins"
gem "cocoapods-prune-localizations"
gem "cocoapods-rome"
gem "cocoapods-search"
gem "cocoapods-sorted-search"
gem "cocoapods-static-swift-framework"
gem "cocoapods-stats"
gem "cocoapods-tdfire-binary"
gem "cocoapods-testing"
gem "cocoapods-trunk"
gem "cocoapods-try"
gem "cocoapods-try-release-fix"
gem "cocoapods-update-if-you-dare"
gem "cocoapods-whitelist"
gem "cocoapods-wholemodule"
gem "coderay"
gem "concurrent-ruby"
gem "curb"
gem "curses"
gem "daemons"
gem "dep-selector-libgecode"
gem "digest-sha3"
gem "domain_name"
gem "do_sqlite3"
gem "ethon"
gem "eventmachine"
gem "excon"
gem "faraday"
gem "ffi"
gem "ffi-rzmq-core"
gem "fog-dnsimple"
gem "gdk_pixbuf2"
gem "gio2"
gem "gitlab-markup"
gem "glib2"
gem "gpgme"
gem "gtk2"
gem "hashie"
gem "highline"
gem "hike"
gem "hitimes"
gem "hpricot"
gem "httpclient"
gem "http-cookie"
gem "iconv"
gem "idn-ruby"
gem "jbuilder"
gem "jekyll"
gem "jmespath"
gem "jwt"
gem "libv8"
gem "libxml-ruby"
gem "magic"
gem "markaby"
gem "method_source"
gem "mini_magick"
gem "msgpack"
gem "mysql2"
gem "ncursesw"
gem "netrc"
gem "net-scp"
gem "net-ssh"
gem "nokogiri"
gem "opus-ruby"
gem "ovirt-engine-sdk"
gem "pango"
gem "patron"
gem "pcaprub"
gem "pg"
gem "pry"
gem "pry-byebug"
gem "pry-doc"
gem "public_suffix"
gem "puma"
gem "rails"
gem "rainbow"
gem "rbnacl"
gem "rb-readline"
gem "re2"
gem "redis"
gem "redis-rack"
gem "rest-client"
gem "rmagick"
gem "rpam2"
gem "rspec"
gem "rubocop"
gem "rubocop-performance"
gem "ruby-libvirt"
gem "ruby-lxc"
gem "ruby-progressbar"
gem "ruby-terminfo"
gem "ruby-vips"
gem "rubyzip"
gem "rugged"
gem "sassc"
gem "scrypt"
gem "semian"
gem "sequel"
gem "sequel_pg"
gem "simplecov"
gem "sinatra"
gem "slop"
gem "snappy"
gem "sqlite3"
gem "taglib-ruby"
gem "thrift"
gem "tilt"
gem "tiny_tds"
gem "treetop"
gem "typhoeus"
gem "tzinfo"
gem "unf_ext"
gem "uuid4r"
gem "whois"
gem "zookeeper"
end
G
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }
if Bundler.feature_flag.bundler_3_mode?
expect(out).to display_total_steps_of(1874)
else
expect(out).to display_total_steps_of(1922)
end
end
private
RSpec::Matchers.define :display_total_steps_of do |expected_steps|
match do |out|
out.include?("BUNDLER: Finished resolution (#{expected_steps} steps)")
end
failure_message do |out|
actual_steps = out.scan(/BUNDLER: Finished resolution \((\d+) steps\)/).first.first
"Expected resolution to finish in #{expected_steps} steps, but took #{actual_steps}"
end
end
end