Skip to content

Instantly share code, notes, and snippets.

@liijunwei
Last active September 14, 2024 02:09
Show Gist options
  • Save liijunwei/de1cb08a570ed10fac9ccf9b35cd499b to your computer and use it in GitHub Desktop.
Save liijunwei/de1cb08a570ed10fac9ccf9b35cd499b to your computer and use it in GitHub Desktop.
analyse gem disk usage
def gems(group = nil)
require 'bundler'
groups = Bundler.load.current_dependencies.map {|d| d.groups }.uniq.flatten.uniq.sort
return groups if group.nil?
raise "unsupported gem group: #{group}" if !groups.include?(group.to_sym)
Bundler.load.current_dependencies.select{ |dep| dep.groups.include?(group.to_sym) }
end
def parse(line)
disk_size_in_kb, gem_name = line.split("\t")
name, _delimiter, version = gem_name.rpartition('-') # good enough
require 'filesize' # https://rubygems.org/gems/filesize
{
'name' => name,
'version' => version,
'full_name' => gem_name,
'disk_size_in_kb' => disk_size_in_kb.to_i,
'disk_size_in_human' => Filesize.from("#{disk_size_in_kb} K").pretty
}
end
def get_gem_details(default_only: true)
default_gems = gems(:default).map {|gem| gem.name}.sort.to_set
all_gems = `cd #{Gem.dir}/gems && du -s * | sort -hr`.split("\n").map {|line| parse(line) }
all_gems = all_gems.select {|detail| default_gems.include?(detail['name'])} if default_only
disk_size_sum_in_kb = all_gems.pluck('disk_size_in_kb').sum
result = all_gems.map do |gem_detail|
percentage = (gem_detail['disk_size_in_kb'].to_f/disk_size_sum_in_kb)*100
gem_detail.merge('percentage' => percentage.round(2))
end
result
end
# core ext
class Array
def pluck(*keys)
if keys.count > 1
map { |element| keys.map { |key| element[key] } }
else
key = keys.first
map { |element| element[key] }
end
end
end
get_gem_details(default_only: true)
get_gem_details(default_only: true).first(10).pluck('name','percentage','disk_size_in_human')
get_gem_details(default_only: true).first(100).pluck('name','percentage','disk_size_in_human')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment