summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHomu <homu@barosl.com>2016-10-06 23:37:36 +0900
committerHomu <homu@barosl.com>2016-10-06 23:37:36 +0900
commitc0f7f128a55ef3165da52b44f1b82fca80de3238 (patch)
tree3ef1666bbca8c519b0e41f141823b688ee207e5e
parentb430c478a25519348106cc94229b4248e4f8974e (diff)
parent3725a230fa5b4202ee0b026707400d3a998b252e (diff)
downloadbundler-c0f7f128a55ef3165da52b44f1b82fca80de3238.tar.gz
Auto merge of #4841 - AirRefund:master, r=chrismo
Better gem outdated list Hi, the current version of bundler is listing all gems with the group, I improve these list grouping the gems by group and not repeat the group every line. Current: ``` Outdated gems included in the bundle: * aasm (newest 4.11.0, installed 3.4.0, requested = 3.4.0) in group "default" * activerecord-import (newest 0.15.0, installed 0.13.0) in group "default" * annotate (newest 2.7.1, installed 2.7.0) in group "development" * authority (newest 3.2.0, installed 3.0.0, requested ~> 3.0.0) in group "default" * awesome_print (newest 1.7.0, installed 1.2.0, requested ~> 1.2.0) in groups "development, test" * aws-sdk (newest 2.5.1, installed 1.60.2, requested ~> 1.60.2) in group "default" * bootstrap-sass (newest 3.3.7, installed 3.3.5.1, requested ~> 3.3.5.1) in group "default" * capybara (newest 2.7.1, installed 2.5.0, requested ~> 2.4) in group "test" * capybara-email (newest 2.5.0, installed 2.4.0) in group "test" * codeclimate-test-reporter (newest 0.6.0, installed 0.4.7) in group "test" * coffee-rails (newest 4.2.1, installed 4.0.1, requested ~> 4.0.0) in group "default" * countries (newest 1.2.5, installed 0.9.3, requested ~> 0.9.3) in group "default" * country_select (newest 2.5.2, installed 2.1.1) in group "default" * dalli (newest 2.7.6, installed 2.7.4) in group "default" ``` Better group: ``` $ bundle outdated ===== Group default ===== * addressable (newest 2.4.0, installed 2.3.8) * puma (newest 3.6.0, installed 2.10.2, requested ~> 2.10.2) * rails-assets-Sortable (newest 1.4.2, installed 0.7.1, requested ~> 0.7.1) * rails-assets-jquery-file-upload (newest 9.12.5, installed 9.7.0, requested = 9.7.0) * rails-assets-jquery-ui (newest 1.12.0, installed 1.11.0, requested = 1.11.0) * rails-assets-superagent (newest 2.1.0, installed 0.21.0, requested ~> 0.21.0) * rollbar (newest 2.12.0, installed 2.7.1, requested ~> 2.0) * sidekiq-pro (newest 3.3.2, installed 3.3.1) ===== Group development ===== * brakeman (newest 3.3.3, installed 3.1.0) ===== Group development, test ===== * pry (newest 0.10.4, installed 0.10.3) * pry-doc (newest 0.9.0, installed 0.8.0) * rspec (newest 3.5.0, installed 3.3.0, requested ~> 3.0) * rspec-support (newest 3.5.0, installed 3.3.0) * rubocop-rspec (newest 1.4.0, installed 1.3.1) ===== Without group ===== * babel-source (newest 5.8.35, installed 5.8.34) * execjs (newest 2.7.0, installed 2.6.0) * hashie (newest 3.4.4, installed 3.3.1) * ice_nine (newest 0.11.2, installed 0.11.1) * mini_portile2 (newest 2.1.0, installed 2.0.0) * minitest (newest 5.9.0, installed 5.8.4) * multi_json (newest 1.12.1, installed 1.11.2) * multipart-post (newest 2.0.0, installed 1.2.0) * rails-assets-blueimp-canvas-to-blob (newest 3.3.0, installed 2.1.1) * rails-assets-blueimp-load-image (newest 2.6.1, installed 1.13.0) * rails-assets-blueimp-tmpl (newest 3.4.0, installed 2.5.4) * rails-assets-jquery (newest 3.1.0, installed 2.1.4) * rake (newest 11.2.2, installed 10.5.0) * rdoc (newest 4.2.2, installed 4.2.0) ``` Regards
-rw-r--r--lib/bundler/cli.rb2
-rw-r--r--lib/bundler/cli/outdated.rb99
-rw-r--r--spec/commands/outdated_spec.rb114
3 files changed, 187 insertions, 28 deletions
diff --git a/lib/bundler/cli.rb b/lib/bundler/cli.rb
index e27f498f94..f92ecb1c33 100644
--- a/lib/bundler/cli.rb
+++ b/lib/bundler/cli.rb
@@ -269,6 +269,8 @@ module Bundler
versions of the given gems. Prerelease gems are ignored by default. If your gems
are up to date, Bundler will exit with a status of 0. Otherwise, it will exit 1.
D
+ method_option "group", :aliases => "--group", :type => :string, :banner => "List gems from a specific group"
+ method_option "groups", :aliases => "--groups", :type => :boolean, :banner => "List gems organized by groups"
method_option "local", :type => :boolean, :banner =>
"Do not attempt to fetch gems remotely and use the gem cache instead"
method_option "pre", :type => :boolean, :banner => "Check for newer pre-release gems"
diff --git a/lib/bundler/cli/outdated.rb b/lib/bundler/cli/outdated.rb
index de71075522..5729c07ffe 100644
--- a/lib/bundler/cli/outdated.rb
+++ b/lib/bundler/cli/outdated.rb
@@ -4,6 +4,7 @@ require "bundler/cli/common"
module Bundler
class CLI::Outdated
attr_reader :options, :gems
+
def initialize(options, gems)
@options = options
@gems = gems
@@ -30,7 +31,7 @@ module Bundler
Bundler.definition(:gems => gems, :sources => sources)
end
- definition_resolution = proc { options["local"] ? definition.resolve_with_cache! : definition.resolve_remotely! }
+ definition_resolution = proc { options[:local] ? definition.resolve_with_cache! : definition.resolve_remotely! }
if options[:parseable]
Bundler.ui.silence(&definition_resolution)
else
@@ -38,8 +39,9 @@ module Bundler
end
Bundler.ui.info ""
+ outdated_gems_by_groups = {}
+ outdated_gems_list = []
- out_count = 0
# Loop through the current specs
gemfile_specs, dependency_specs = current_specs.partition {|spec| current_dependencies.key? spec.name }
[gemfile_specs.sort_by(&:name), dependency_specs.sort_by(&:name)].flatten.each do |current_spec|
@@ -47,7 +49,7 @@ module Bundler
dependency = current_dependencies[current_spec.name]
- if options["strict"]
+ if options[:strict]
active_spec = definition.specs.detect {|spec| spec.name == current_spec.name && spec.platform == current_spec.platform }
else
active_specs = definition.index[current_spec.name].select {|spec| spec.platform == current_spec.platform }.sort_by(&:version)
@@ -67,47 +69,89 @@ module Bundler
gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version)
git_outdated = current_spec.git_version != active_spec.git_version
if gem_outdated || git_outdated
- unless options[:parseable]
- if out_count == 0
- if options["pre"]
- Bundler.ui.info "Outdated gems included in the bundle (including pre-releases):"
- else
- Bundler.ui.info "Outdated gems included in the bundle:"
- end
- end
- end
-
- spec_version = "#{active_spec.version}#{active_spec.git_version}"
- current_version = "#{current_spec.version}#{current_spec.git_version}"
- dependency_version = %(, requested #{dependency.requirement}) if dependency && dependency.specific?
-
+ groups = nil
if dependency && !options[:parseable]
groups = dependency.groups.join(", ")
- pl = (dependency.groups.length > 1) ? "s" : ""
- groups = " in group#{pl} \"#{groups}\""
end
- spec_outdated_info = "#{active_spec.name} (newest #{spec_version}, installed #{current_version}#{dependency_version})"
- if options[:parseable]
- Bundler.ui.info spec_outdated_info.to_s.rstrip
- else
- Bundler.ui.info " * #{spec_outdated_info}#{groups}".rstrip
- end
+ outdated_gems_list << { :active_spec => active_spec,
+ :current_spec => current_spec,
+ :dependency => dependency,
+ :groups => groups }
- out_count += 1
+ outdated_gems_by_groups[groups] ||= []
+ outdated_gems_by_groups[groups] << { :active_spec => active_spec,
+ :current_spec => current_spec,
+ :dependency => dependency,
+ :groups => groups }
end
+
Bundler.ui.debug "from #{active_spec.loaded_from}"
end
- if out_count.zero?
+ if outdated_gems_list.empty?
Bundler.ui.info "Bundle up to date!\n" unless options[:parseable]
else
+ unless options[:parseable]
+ if options[:pre]
+ Bundler.ui.info "Outdated gems included in the bundle (including pre-releases):"
+ else
+ Bundler.ui.info "Outdated gems included in the bundle:"
+ end
+ end
+
+ options_include_groups = [:group, :groups].select {|v| options.keys.include?(v.to_s) }
+ if options_include_groups.any?
+ ordered_groups = outdated_gems_by_groups.keys.compact.sort
+ [nil, ordered_groups].flatten.each do |groups|
+ gems = outdated_gems_by_groups[groups]
+ contains_group = if groups
+ groups.split(",").include?(options[:group])
+ else
+ options[:group] == "group"
+ end
+
+ next if (!options[:groups] && !contains_group) || gems.nil?
+
+ unless options[:parseable]
+ if groups
+ Bundler.ui.info "===== Group #{groups} ====="
+ else
+ Bundler.ui.info "===== Without group ====="
+ end
+ end
+
+ gems.each do |gem|
+ print_gem(gem[:current_spec], gem[:active_spec], gem[:dependency], groups, options_include_groups.any?)
+ end
+ end
+ else
+ outdated_gems_list.each do |gem|
+ print_gem(gem[:current_spec], gem[:active_spec], gem[:dependency], gem[:groups], options_include_groups.any?)
+ end
+ end
+
exit 1
end
end
private
+ def print_gem(current_spec, active_spec, dependency, groups, options_include_groups)
+ spec_version = "#{active_spec.version}#{active_spec.git_version}"
+ current_version = "#{current_spec.version}#{current_spec.git_version}"
+ dependency_version = %(, requested #{dependency.requirement}) if dependency && dependency.specific?
+
+ spec_outdated_info = "#{active_spec.name} (newest #{spec_version}, installed #{current_version}#{dependency_version})"
+ if options[:parseable]
+ Bundler.ui.info spec_outdated_info.to_s.rstrip
+ elsif options_include_groups || !groups
+ Bundler.ui.info " * #{spec_outdated_info}".rstrip
+ else
+ Bundler.ui.info " * #{spec_outdated_info} in groups \"#{groups}\"".rstrip
+ end
+ end
+
def check_for_deployment_mode
if Bundler.settings[:frozen]
error_message = "You are trying to check outdated gems in deployment mode. " \
@@ -123,7 +167,6 @@ module Bundler
active_major = active_spec.version.segments.first
update_present = false
-
update_present = active_major > current_major if options[:major]
if !update_present && (options[:minor] || options[:patch]) && current_major == active_major
diff --git a/spec/commands/outdated_spec.rb b/spec/commands/outdated_spec.rb
index 6420c28ac7..ab00e64b9d 100644
--- a/spec/commands/outdated_spec.rb
+++ b/spec/commands/outdated_spec.rb
@@ -72,6 +72,120 @@ describe "bundle outdated" do
end
end
+ describe "with --group option" do
+ def test_group_option(group = nil, gems_list_size = 1)
+ install_gemfile <<-G
+ source "file://#{gem_repo2}"
+
+ gem "weakling", "~> 0.0.1"
+ gem "terranova", '8'
+ group :development, :test do
+ gem "duradura", '7.0'
+ gem 'activesupport', '2.3.5'
+ end
+ G
+
+ update_repo2 do
+ build_gem "activesupport", "3.0"
+ build_gem "terranova", "9"
+ build_gem "duradura", "8.0"
+ end
+
+ bundle "outdated --group #{group}"
+
+ # Gem names are one per-line, between "*" and their parenthesized version.
+ gem_list = out.split("\n").map {|g| g[/\* (.*) \(/, 1] }.compact
+ expect(gem_list).to eq(gem_list.sort)
+ expect(gem_list.size).to eq gems_list_size
+ end
+
+ it "not outdated gems" do
+ install_gemfile <<-G
+ source "file://#{gem_repo2}"
+
+ gem "weakling", "~> 0.0.1"
+ gem "terranova", '8'
+ group :development, :test do
+ gem 'activesupport', '2.3.5'
+ gem "duradura", '7.0'
+ end
+ G
+
+ bundle "outdated --group"
+ expect(out).to include("Bundle up to date!")
+ end
+
+ it "returns a sorted list of outdated gems from one group => 'default'" do
+ test_group_option("default")
+
+ expect(out).to include("===== Group default =====")
+ expect(out).to include("terranova (")
+
+ expect(out).not_to include("===== Group development, test =====")
+ expect(out).not_to include("activesupport")
+ expect(out).not_to include("duradura")
+ end
+
+ it "returns a sorted list of outdated gems from one group => 'development'" do
+ test_group_option("development", 2)
+
+ expect(out).not_to include("===== Group default =====")
+ expect(out).not_to include("terranova (")
+
+ expect(out).to include("===== Group development, test =====")
+ expect(out).to include("activesupport")
+ expect(out).to include("duradura")
+ end
+ end
+
+ describe "with --groups option" do
+ it "not outdated gems" do
+ install_gemfile <<-G
+ source "file://#{gem_repo2}"
+
+ gem "weakling", "~> 0.0.1"
+ gem "terranova", '8'
+ group :development, :test do
+ gem 'activesupport', '2.3.5'
+ gem "duradura", '7.0'
+ end
+ G
+
+ bundle "outdated --groups"
+ expect(out).to include("Bundle up to date!")
+ end
+
+ it "returns a sorted list of outdated gems by groups" do
+ install_gemfile <<-G
+ source "file://#{gem_repo2}"
+
+ gem "weakling", "~> 0.0.1"
+ gem "terranova", '8'
+ group :development, :test do
+ gem 'activesupport', '2.3.5'
+ gem "duradura", '7.0'
+ end
+ G
+
+ update_repo2 do
+ build_gem "activesupport", "3.0"
+ build_gem "terranova", "9"
+ build_gem "duradura", "8.0"
+ end
+
+ bundle "outdated --groups"
+ expect(out).to include("===== Group default =====")
+ expect(out).to include("terranova (newest 9, installed 8, requested = 8)")
+ expect(out).to include("===== Group development, test =====")
+ expect(out).to include("activesupport (newest 3.0, installed 2.3.5, requested = 2.3.5)")
+ expect(out).to include("duradura (newest 8.0, installed 7.0, requested = 7.0)")
+
+ expect(out).not_to include("weakling (")
+
+ # TODO: check gems order inside the group
+ end
+ end
+
describe "with --local option" do
it "doesn't hit repo2" do
FileUtils.rm_rf(gem_repo2)