Skip to content

Commit

Permalink
Show funding information post-install/update
Browse files Browse the repository at this point in the history
  • Loading branch information
gjtorikian committed Sep 30, 2020
1 parent 8e9c31b commit 5aac6f8
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 0 deletions.
14 changes: 14 additions & 0 deletions bundler/lib/bundler/cli/common.rb
Expand Up @@ -14,6 +14,20 @@ def self.print_post_install_message(name, msg)
Bundler.ui.info msg
end

def self.output_fund_metadata_summary
definition = Bundler.definition
current_dependencies = definition.requested_dependencies
current_specs = definition.specs

count = current_dependencies.count {|dep| current_specs[dep.name].first.metadata.key?("funding_uri") }

return if count.zero?

intro = count > 1 ? "#{count} installed gems you directly depend on are" : "#{count} installed gem you directly depend on is"
message = "#{intro} looking for funding.\n Run `bundle fund` for details"
Bundler.ui.info message
end

def self.output_without_groups_message(command)
return if Bundler.settings[:without].empty?
Bundler.ui.confirm without_groups_message(command)
Expand Down
2 changes: 2 additions & 0 deletions bundler/lib/bundler/cli/install.rb
Expand Up @@ -82,6 +82,8 @@ def run
require_relative "clean"
Bundler::CLI::Clean.new(options).run
end

Bundler::CLI::Common.output_fund_metadata_summary
rescue GemNotFound, VersionConflict => e
if options[:local] && Bundler.app_cache.exist?
Bundler.ui.warn "Some gems seem to be missing from your #{Bundler.settings.app_cache_path} directory."
Expand Down
2 changes: 2 additions & 0 deletions bundler/lib/bundler/cli/update.rb
Expand Up @@ -106,6 +106,8 @@ def run
Bundler.ui.confirm "Bundle updated!"
Bundler::CLI::Common.output_without_groups_message(:update)
Bundler::CLI::Common.output_post_install_messages installer.post_install_messages

Bundler::CLI::Common.output_fund_metadata_summary
end
end
end
110 changes: 110 additions & 0 deletions bundler/spec/install/gems/fund_spec.rb
@@ -0,0 +1,110 @@
# frozen_string_literal: true

RSpec.describe "bundle install" do
context "with gem sources" do
context "when gems include a fund URI" do
it "displays the plural fund message after installing" do
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'has_metadata'
gem 'has_funding'
gem 'rack-obama'
G

expect(out).to include("2 installed gems you directly depend on are looking for funding.")
end

it "displays the singular fund message after installing" do
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'has_funding'
gem 'rack-obama'
G

expect(out).to include("1 installed gem you directly depend on is looking for funding.")
end
end

context "when gems do not include fund messages" do
it "does not display any fund messages" do
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem "activesupport"
G

expect(out).not_to include("gem you depend on")
end
end

context "when a dependency includes a fund message" do
it "does not display the fund message" do
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'gem_with_dependent_funding'
G

expect(out).not_to include("gem you depend on")
end
end
end

context "with git sources" do
context "when gems include fund URI" do
it "displays the fund message after installing" do
build_git "also_has_funding" do |s|
s.metadata = {
"funding_uri" => "https://example.com/also_has_funding/funding",
}
end
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'also_has_funding', :git => '#{lib_path("also_has_funding-1.0")}'
G

expect(out).to include("1 installed gem you directly depend on is looking for funding.")
end

it "displays the fund message if repo is updated" do
build_git "also_has_funding" do |s|
s.metadata = {
"funding_uri" => "https://example.com/also_has_funding/funding",
}
end
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'also_has_funding', :git => '#{lib_path("also_has_funding-1.0")}'
G

build_git "also_has_funding", "1.1" do |s|
s.metadata = {
"funding_uri" => "https://example.com/also_has_funding/funding",
}
end
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'also_has_funding', :git => '#{lib_path("also_has_funding-1.1")}'
G

expect(out).to include("1 installed gem you directly depend on is looking for funding.")
end

it "displays the fund message if repo is not updated" do
build_git "also_has_funding" do |s|
s.metadata = {
"funding_uri" => "https://example.com/also_has_funding/funding",
}
end
gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'also_has_funding', :git => '#{lib_path("also_has_funding-1.0")}'
G

bundle :install
expect(out).to include("1 installed gem you directly depend on is looking for funding.")

bundle :install
expect(out).to include("1 installed gem you directly depend on is looking for funding.")
end
end
end
end
29 changes: 29 additions & 0 deletions bundler/spec/update/gems/fund_spec.rb
@@ -0,0 +1,29 @@
# frozen_string_literal: true

RSpec.describe "bundle update" do
before do
gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'has_metadata'
gem 'has_funding', '< 2.0'
G

bundle :install
end

context "when listed gems are updated" do
before do
gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem 'has_metadata'
gem 'has_funding'
G

bundle :update, :all => true
end

it "displays fund message" do
expect(out).to include("2 installed gems you directly depend on are looking for funding.")
end
end
end

0 comments on commit 5aac6f8

Please sign in to comment.