Skip to content
This repository has been archived by the owner on Apr 14, 2021. It is now read-only.

Commit

Permalink
Merge #7026
Browse files Browse the repository at this point in the history
7026: Add missing `bundle info` feature, bug fix, and specs r=indirect a=deivid-rodriguez

### What was the end-user problem that led to this PR?

The problem was that `bundler info GEM` did not have feature parity with `bundle show GEM`, and it should because it's the recommended alternative. Also, `bundle info bundler` was showing an incorrect path while `bundle show bundler` was correct.

### What was your diagnosis of the problem?

My diagnosis was that some code should be pulled from `bundle show`.

### What is your fix for the problem, implemented in this PR?

My fix is to port the missing feature, bug fix, and specs to `bundle info` from `bundle show`.

### Why did you choose this fix out of the possible options?

I chose this fix because it guarantees that the recommended alternative will work similarly to the current show command.

Co-authored-by: David Rodríguez <[email protected]>
  • Loading branch information
bundlerbot and deivid-rodriguez committed Mar 31, 2019
2 parents 52e329f + 83d22e7 commit 61a5657
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 22 deletions.
4 changes: 0 additions & 4 deletions lib/bundler/cli/common.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,6 @@ def self.select_spec(name, regex_match = nil)
end

def self.ask_for_spec_from(specs)
if !$stdout.tty? && ENV["BUNDLE_SPEC_RUN"].nil?
raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
end

specs.each_with_index do |spec, index|
Bundler.ui.info "#{index.succ} : #{spec.name}", true
end
Expand Down
22 changes: 17 additions & 5 deletions lib/bundler/cli/info.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,24 @@ def initialize(options, gem_name)
end

def run
Bundler.ui.silence do
Bundler.definition.validate_runtime!
Bundler.load.lock
end

spec = spec_for_gem(gem_name)

spec_not_found(gem_name) unless spec
return print_gem_path(spec) if @options[:path]
print_gem_info(spec)
if spec
return print_gem_path(spec) if @options[:path]
print_gem_info(spec)
end
end

private

def spec_for_gem(gem_name)
spec = Bundler.definition.specs.find {|s| s.name == gem_name }
spec || default_gem_spec(gem_name)
spec || default_gem_spec(gem_name) || Bundler::CLI::Common.select_spec(gem_name, :regex_match)
end

def default_gem_spec(gem_name)
Expand All @@ -34,7 +40,13 @@ def spec_not_found(gem_name)
end

def print_gem_path(spec)
Bundler.ui.info spec.full_gem_path
path = if spec.name == "bundler"
File.expand_path("../../../..", __FILE__)
else
spec.full_gem_path
end

Bundler.ui.info path
end

def print_gem_info(spec)
Expand Down
114 changes: 101 additions & 13 deletions spec/commands/info_spec.rb
Original file line number Diff line number Diff line change
@@ -1,27 +1,43 @@
# frozen_string_literal: true

RSpec.describe "bundle info" do
context "info from specific gem in gemfile" do
context "with a standard Gemfile" do
before do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rails"
G
end

it "prints information about the current gem" do
it "creates a Gemfile.lock when invoked with a gem name" do
FileUtils.rm("Gemfile.lock")

bundle "info rails"

expect(bundled_app("Gemfile.lock")).to exist
end

it "prints information if gem exists in bundle" do
bundle "info rails"
expect(out).to include "* rails (2.3.2)
\tSummary: This is just a fake gem for testing
\tHomepage: http://example.com"
expect(out).to match(%r{Path\: .*\/rails\-2\.3\.2})
\tHomepage: http://example.com
\tPath: #{default_bundle_path("gems", "rails-2.3.2")}"
end

context "given a gem that is not installed" do
it "prints missing gem error" do
bundle "info foo"
expect(err).to eq "Could not find gem 'foo'."
end
it "prints path if gem exists in bundle" do
bundle "info rails --path"
expect(out).to eq(default_bundle_path("gems", "rails-2.3.2").to_s)
end

it "prints the path to the running bundler" do
bundle "info bundler --path"
expect(out).to eq(root.to_s)
end

it "complains if gem not in bundle" do
bundle "info missing"
expect(err).to eq("Could not find gem 'missing'.")
end

context "given a default gem shippped in ruby", :ruby_repo do
Expand All @@ -46,12 +62,84 @@
expect(out).to_not include("Homepage:")
end
end
end

context "with a git repo in the Gemfile" do
before :each do
@git = build_git "foo", "1.0"
end

it "prints out git info" do
install_gemfile <<-G
gem "foo", :git => "#{lib_path("foo-1.0")}"
G
expect(the_bundle).to include_gems "foo 1.0"

bundle "info foo"
expect(out).to include("foo (1.0 #{@git.ref_for("master", 6)}")
end

context "given --path option" do
it "prints the path to the gem" do
bundle "info rails"
expect(out).to match(%r{.*\/rails\-2\.3\.2})
it "prints out branch names other than master" do
update_git "foo", :branch => "omg" do |s|
s.write "lib/foo.rb", "FOO = '1.0.omg'"
end
@revision = revision_for(lib_path("foo-1.0"))[0...6]

install_gemfile <<-G
gem "foo", :git => "#{lib_path("foo-1.0")}", :branch => "omg"
G
expect(the_bundle).to include_gems "foo 1.0.omg"

bundle "info foo"
expect(out).to include("foo (1.0 #{@git.ref_for("omg", 6)}")
end

it "doesn't print the branch when tied to a ref" do
sha = revision_for(lib_path("foo-1.0"))
install_gemfile <<-G
gem "foo", :git => "#{lib_path("foo-1.0")}", :ref => "#{sha}"
G

bundle "info foo"
expect(out).to include("foo (1.0 #{sha[0..6]})")
end

it "handles when a version is a '-' prerelease", :rubygems => "2.1" do
@git = build_git("foo", "1.0.0-beta.1", :path => lib_path("foo"))
install_gemfile <<-G
gem "foo", "1.0.0-beta.1", :git => "#{lib_path("foo")}"
G
expect(the_bundle).to include_gems "foo 1.0.0.pre.beta.1"

bundle! "info foo"
expect(out).to include("foo (1.0.0.pre.beta.1")
end
end

context "with a valid regexp for gem name" do
it "presents alternatives" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rack"
gem "rack-obama"
G

bundle "info rac"
expect(out).to eq "1 : rack\n2 : rack-obama\n0 : - exit -\n>"
end
end

context "with an invalid regexp for gem name" do
it "does not find the gem" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rails"
G

invalid_regexp = "[]"

bundle "show #{invalid_regexp}"
expect(err).to include("Could not find gem '#{invalid_regexp}'.")
end
end
end
13 changes: 13 additions & 0 deletions spec/commands/show_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,19 @@
expect(out).to include("Installing foo 1.0")
end

context "with a valid regexp for gem name" do
it "presents alternatives" do
install_gemfile <<-G
source "file://#{gem_repo1}"
gem "rack"
gem "rack-obama"
G

bundle "show rac"
expect(out).to eq "1 : rack\n2 : rack-obama\n0 : - exit -\n>"
end
end

context "with an invalid regexp for gem name" do
it "does not find the gem" do
install_gemfile <<-G
Expand Down

0 comments on commit 61a5657

Please sign in to comment.