-
-
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.github.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 :)