-
-
Save lwe/475200 to your computer and use it in GitHub Desktop.
# Small utility which uses the homepage and nokogori to get a description from the formula's homepage. | |
# | |
# As written in the homebrew wiki: | |
# > Homebrew doesn’t have a description field because the homepage is always up to date, | |
# > and Homebrew is not. Thus it’s less maintenance for us. To satisfy the description | |
# > we’re going to invent a new packaging microformat and persuade everyone to publish | |
# > it on their homepage. | |
# | |
# Too bad no packaging microformat has yet been invented, but brew-more just first looks for a | |
# `<meta name="description">` tag, then for an `a#project_summary_link` tag (which is used in | |
# While this does not lead to a good description for all formulas, it works for quiet a few, | |
# try e.g. `brew more rubinius`. | |
# | |
# Note: this command depends on `nokogori`, `json` and `rubygems` | |
# | |
# Edit: non-sudo gem install works fine (by adamv) | |
# Edit: use google search instead of title as fallback - returns pretty good results :) | |
# Edit: ensure error contains json & nokogiri gem | |
# | |
require 'formula' | |
require 'uri' | |
require 'open-uri' | |
require 'rubygems' | |
begin | |
require 'json' | |
require 'nokogiri' | |
rescue LoadError | |
onoe "command requires 'json' and 'nokogiri' gem..." | |
exit 2 | |
end | |
# split description at 80 chars | |
MAX_CHARS = 120 | |
class Object | |
# Define try() method to simplify Nokogori scrape-ing | |
def try(method, *args); self.nil? ? nil : self.send(method, *args) end | |
end | |
# Print usage | |
def usage(code = 0) | |
puts "Usage: brew more [formula] ... (formula description scraper)" | |
exit(code) | |
end | |
def scrape_info(formula) | |
more = "<No description>" | |
google = false | |
if doc = Nokogiri::HTML(open(formula.homepage)) | |
part = doc.xpath('/html/head/meta[@name="description"]').first.try(:[], 'content') || doc.css('a#project_summary_link').first.try(:text) | |
unless part | |
# try a google search :) | |
if hash = JSON.load(open("http://www.google.com/uds/GwebSearch?q=#{URI.escape(formula.homepage)}&v=1.0")).try(:[], 'responseData').try(:[], 'results').try(:first) | |
part = Nokogiri::HTML(hash['title']).text + ' ' + Nokogiri::HTML(hash['content']).text | |
google = true | |
end | |
end | |
more,c = part.split(/ +/).inject([' ',1]) do |res, i| | |
if (i.length + 1 + res[1]) > MAX_CHARS | |
res[0] << "\n " | |
res[1] = 1 | |
end | |
[res[0] << " " << i, res[1] + 1 + i.length] | |
end if part | |
more = "(Description via Google) \n" << more if google | |
end | |
morebody = formula.homepage.to_s, more, "\n" | |
ohai "#{formula.name} #{formula.version}" + (formula.prefix.parent.directory? ? " (installed)" : ""), morebody | |
end | |
if ARGV.include?('-h') || ARGV.include?('--help') | |
usage | |
elsif ARGV.named.empty? | |
onoe "please specifiy a formula" | |
usage(1) | |
end | |
ARGV.formulae.each { |formula| scrape_info(formula) } |
(…I didn’t know you can’t make pull requests for Gists!)
Hey, I made a couple of changes to the output for brew more
. Basically it makes each formula stand out better (using ohai()
), and puts the “via Google” disclaimer up front.
I made the changes for readability, and also because when using brew more
on multiple formulae, the “via Google” disclaimer made it harder to read because it was always in a different place. Now, when the disclaimer appears, it is in a predictable place, and also lets you know before reading the description that it’s the second-choice source for grabbing a formula’s description.
Would you consider copying it? It’s here:
Hey, jep, too bad it's not possible to bring in changes from other gists... well anyway, copied your changes, thx!
I just spent 20 minutes trying to figure out why brew-more.rb couldn't find nokogiri, though I installed it....It turns out that I didn't have json installed (line 26), and THIS was falsely causing the nokogiri error. Annoying.
good catch, thanks :)
How does one install this command?
Sorry for maybe stupid question, but could someone explain how to install this formula. Thank you!
May I suggest storing this in a regular repo ("homebrew-more") so it can be tapped and installed easily?
Note that brew-desc
is now part of the core and all formulae have a desc
field (at least in the core).
@Drewshg312 Assuming ~/bin
exists and is in your PATH
this should work:
cd ~/bin
wget https://gist.githubusercontent.com/lwe/475200/raw/a28c407438a6e0a88c63055a768c7eeff3670b88/brew-more.rb
chmod u+x brew-more.rb
Mhh, sounds interesting, though the main issue is probably discovery of these resources. DOAP as sometimes linked with a
<link rel="meta" title="DOAP" .../>
, but no idea if that's standard :)