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

Commit

Permalink
Improve readability of outdated
Browse files Browse the repository at this point in the history
  • Loading branch information
tlynam committed Oct 28, 2016
1 parent 72f9a4d commit 73fe587
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 2 deletions.
1 change: 1 addition & 0 deletions lib/bundler/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ def binstubs(*gems)
method_option "filter-patch", :type => :boolean, :banner => "Only list patch newer versions"
method_option "parseable", :aliases => "--porcelain", :type => :boolean, :banner =>
"Use minimal formatting for more parseable output"
method_option "pretty", :type => :boolean, :banner => "Use pretty formatting"
def outdated(*gems)
require "bundler/cli/outdated"
Outdated.new(options, gems).run
Expand Down
63 changes: 61 additions & 2 deletions lib/bundler/cli/outdated.rb
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,14 @@ def run
print_gem(gem[:current_spec], gem[:active_spec], gem[:dependency], groups, options_include_groups.any?)
end
end
elsif options[:pretty]
offsets = calc_offsets(outdated_gems_list)

print_pretty_header(offsets)

outdated_gems_list.sort_by { |gem| gem[:active_spec].name }.each do |gem|
print_gem(gem[:current_spec], gem[:active_spec], gem[:dependency], gem[:groups], options_include_groups.any?, offsets)
end
else
outdated_gems_list.each do |gem|
print_gem(gem[:current_spec], gem[:active_spec], gem[:dependency], gem[:groups], options_include_groups.any?)
Expand All @@ -153,21 +161,72 @@ def display_nothing_outdated_message
end
end

def print_gem(current_spec, active_spec, dependency, groups, options_include_groups)
def print_gem(current_spec, active_spec, dependency, groups, options_include_groups, offsets=nil)
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[:pretty]
line = active_spec.name.to_s.ljust(offsets[:name]) + spec_version.to_s.ljust(offsets[:new_version]) +
current_version.to_s.ljust(offsets[:installed_version]) +
dependency&.requirement.to_s.ljust(offsets[:requested_version]) +
groups.to_s.ljust(offsets[:groups])

line << active_spec.loaded_from.to_s if options[:verbose]
line << "\n"

Bundler.ui.info line
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 print_pretty_header(offsets)
header = "Gem Name".ljust(offsets[:name]) + "New".ljust(offsets[:new_version]) +
"Installed".ljust(offsets[:installed_version]) +
"Requested".ljust(offsets[:requested_version]) +
"Groups".ljust(offsets[:groups])

header << "Load Path" if options[:verbose]
header << "\n"

Bundler.ui.info header
end

def calc_offsets(gems)
name_offset = calc_offset(gems) { |gem| gem[:active_spec].name.length }
name_offset = [name_offset, "Gem Name".length].max + 1

new_version_offset = calc_offset(gems) { |gem| "#{gem[:active_spec].version}#{gem[:active_spec].git_version}".length }
new_version_offset = [new_version_offset, "New".length].max + 1

installed_version_offset = calc_offset(gems) { |gem| "#{gem[:current_spec].version}#{gem[:current_spec].git_version}".length }
installed_version_offset = [installed_version_offset, "Installed".length].max + 1

requested_version_offset = calc_offset(gems) { |gem| gem[:dependency]&.requirement.to_s.length }
requested_version_offset = [requested_version_offset, "Requested".length].max + 1

groups_offset = calc_offset(gems) { |gem| gem[:groups].to_s.length }
groups_offset = [groups_offset, "Groups".length].max + 1

{
name: name_offset,
new_version: new_version_offset,
installed_version: installed_version_offset,
requested_version: requested_version_offset,
groups: groups_offset
}
end

def calc_offset(gems, &block)
block.call gems.max_by {|gem| block.call(gem) }
end

def check_for_deployment_mode
if Bundler.settings[:frozen]
error_message = "You are trying to check outdated gems in deployment mode. " \
Expand Down

0 comments on commit 73fe587

Please sign in to comment.