Skip to content

Instantly share code, notes, and snippets.

@apraditya
Last active August 6, 2021 09:58
Show Gist options
  • Save apraditya/c7dd8e06bba04e32a15e01183faf650b to your computer and use it in GitHub Desktop.
Save apraditya/c7dd8e06bba04e32a15e01183faf650b to your computer and use it in GitHub Desktop.
Regroup outdated gems into major, minor & patch verions. Run `bundle outdated | regroup_gems`
#!/usr/bin/env ruby
outdated_gems = ARGF.read
hash = { major: [], minor: [], patch: [] }
group_hash = {}
outdated_gems.split("\r").each do |line|
line.delete!("\n")
gem_name, installed, newest, _requested, group_name = line.split(/\s{2,}/)
if gem_name.nil? || gem_name == 'Gem' || newest.nil? || newest.scan(/\./).empty?
$stdout.puts line
next
end
newest_subversions = newest.split('.').map(&:to_i)
installed_subversions = installed.split('.').map(&:to_i)
top_version = newest_subversions.find do |v|
index = newest_subversions.index(v)
v > installed_subversions[index]
end
top_version_index = newest_subversions.index(top_version)
type = case top_version_index
when 0
:major
when 1
:minor
else
:patch
end
if group_name
group_hash[group_name] ||= { major: [], minor: [], patch: [] }
group_hash[group_name][type].push line
else
hash[type].push line
end
end
$stdout.puts "\n"
group_hash.each do |group_name, type_hash|
$stdout.puts "### In '#{group_name}' group\n"
$stdout.puts
type_hash.each do |type, gem_lines|
$stdout.puts "#### #{type} version\n" if gem_lines.any?
gem_lines.each do |line|
$stdout.puts line
end
$stdout.puts
end
$stdout.puts "---"
$stdout.puts
end
$stdout.puts "\n"
$stdout.puts "### In dependencies (without group)\n"
$stdout.puts
hash.each do |type, gem_lines|
$stdout.puts "### #{type}\n"
gem_lines.each do |line|
$stdout.puts line
end
$stdout.puts
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment