Skip to content

Instantly share code, notes, and snippets.

@saturnflyer
Created January 31, 2009 14:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saturnflyer/55556 to your computer and use it in GitHub Desktop.
Save saturnflyer/55556 to your computer and use it in GitHub Desktop.
task :census => ['census:snippets', 'census:layouts']
namespace :census do
desc "Show usage stats for Snippets"
task :snippets => :environment do
snippets, missing_snippets = snippet_usage
longest_name = snippets.keys.inject(0) do |max, name|
max = name.to_s.size > max ? name.to_s.size : max
end
puts print_snippet_headings(longest_name)
if ENV['ORDER'] == "name"
sorted_snippets = snippets.to_a.sort {|a,b| a.first.to_s <=> b.first.to_s }
else
sorted_snippets = snippets.to_a.sort {|a,b| b.last[:total] <=> a.last[:total] }
end
sorted_snippets.each do |snippet|
puts print_row(snippet, longest_name)
end
unless missing_snippets.empty?
puts "\nThe following snippets have been called, but they do not exist!"
missing_snippets.to_a.sort {|a,b| a.first.to_s <=> b.first.to_s }.each do |snippet|
puts print_row(snippet, longest_name)
end
end
end
desc "Show usage stats for Layouts"
task :layouts => :environment do
layouts = {}
Layout.find(:all).each { |l| layouts[l.name] = 0 }
Page.find(:all).each do |page|
layouts[page.layout.name] += 1
end
longest_name = layouts.keys.inject(0) { |max, name| max = name.size > max ? name.size : max }
puts "Layout".ljust(longest_name) + "Usage".rjust(5)
puts "------".ljust(longest_name) + "-----".rjust(5)
layouts.to_a.sort {|a,b| b.last <=> a.last }.each do |layout|
puts layout.first.ljust(longest_name) + layout.last.to_s.rjust(5)
end
end
end
task :usage => ['usage:snippets','usage:layouts']
namespace :usage do
desc "Show usage stats for Snippets"
task :snippets => :environment do
snippets, missing_snippets = snippet_usage
longest_name = snippets.keys.inject(0) do |max, name|
max = name.to_s.size > max ? name.to_s.size : max
end
if ENV['ORDER'] == "name"
sorted_snippets = snippets.to_a.sort {|a,b| a.first.to_s <=> b.first.to_s }
else
sorted_snippets = snippets.to_a.sort {|a,b| b.last[:total] <=> a.last[:total] }
end
padding = 3
sp = " " * padding
sorted_snippets.to_a.each do |snippet|
layouts = snippet.last[:layouts]; snippets = snippet.last[:snippets]; pages = snippet.last[:pages]
next if layouts.empty? and snippets.empty? and pages.empty?
puts snippet.first
puts "-" * longest_name
unless layouts.empty?
puts "\n#{sp}layouts:"
layouts.each{ |l| puts "#{sp*2}#{l.name}" }
end
unless snippets.empty?
puts "\n#{sp}snippets:"
snippets.each{ |s| puts "#{sp*2}#{s.name}" }
end
unless pages.empty?
puts "\n#{sp}pages"
pages.each{ |p| puts "#{sp*2}#{p.url}"}
end
puts "\n\n"
end
end
desc "List all layouts, with each page that uses the layout"
task :layouts => :environment do
layouts = {}
Layout.find(:all).each { |l| layouts[l.name] = [] }
Page.find(:all).each do |page|
layouts[page.layout.name] << page
end
layouts.to_a.sort {|a,b| b.last.size <=> a.last.size }.each do |layout|
next if layout.last.empty?
puts layout.first
layout.last.each do |page|
puts "#{page.id.to_s.rjust(4)} #{page.url}"
end
puts ''
end
end
end
def snippet_usage
snippets = {}; missing_snippets = {}
Snippet.find(:all).each do |s|
snippets[s.name.to_sym] = snippet_statistic_hash
end
pattern = /<r\:snippet\s+name\=[\"|\'](\S+)[\"\']/
[Layout, Snippet, PagePart].each do |model|
model.find(:all).each do |item|
item.content.grep(pattern).each do |match|
match =~ pattern
snippet_name = $1
if model == PagePart
model_name = item.page
model_type = :pages
else
model_name = item
model_type = model.to_s.downcase.pluralize.to_sym
end
if snippets.has_key?(snippet_name.to_sym)
snippets[snippet_name.to_sym][model_type] << model_name
snippets[snippet_name.to_sym][:total] += 1
else
unless missing_snippets.has_key?(snippet_name.to_sym)
missing_snippets[snippet_name.to_sym] = snippet_statistic_hash
end
missing_snippets[snippet_name.to_sym][model_type] << model_name
missing_snippets[snippet_name.to_sym][:total] += 1
end
end
end
end
[snippets, missing_snippets]
end
def snippet_statistic_hash
{
:pages => [],
:layouts => [],
:snippets => [],
:total => 0
}
end
def print_row(snippet, longest_name, padding=3)
row = snippet.first.to_s.ljust(longest_name)
total_pages = snippet.last[:pages].size
row += total_pages.to_s.rjust("pages".length + padding)
total_layouts = snippet.last[:layouts].size
row += total_layouts.to_s.rjust("layouts".length + padding)
total_snippets = snippet.last[:snippets].size
row += total_snippets.to_s.rjust("snippets".length + padding)
total = snippet.last[:total]
row += total.to_s.rjust("total".length + padding)
end
def print_snippet_headings(longest_name, padding=3)
sp = " " * padding
s = "Snippet".ljust(longest_name) + "#{sp}Pages#{sp}Layouts#{sp}Snippets#{sp}Total\n"
s += "-------".ljust(longest_name) + "#{sp}-----#{sp}-------#{sp}--------#{sp}-----"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment