howdoi 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README.md +66 -0
  2. data/bin/howdoi +22 -0
  3. data/lib/howdoi.rb +81 -0
  4. metadata +49 -0
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+ howdoi - a code search tool
2
+ ===========================
3
+
4
+ This is a ruby clone of original Python [howdoi][1] by gleitz.
5
+
6
+ Are you a hack programmer? Do you find yourself constantly Googling for
7
+ how to do basic programing tasks?
8
+
9
+ Suppose you want to know how to format a date in bash. Why open your
10
+ browser and read through blogs when you can just...
11
+
12
+ $ howdoi format string bash
13
+ > http://stackoverflow.com/questions/9832393/how-to-bash-script-format-unix-time-to-string
14
+ >
15
+ > [foo@bar ~]$date --date "2012-02-13" +%s
16
+ > 1329055200
17
+ > [foo@bar ~]$date --date @1329055200
18
+ > Mon Feb 13 00:00:00 EST 2012
19
+ > [foo@bar ~]$date --date @1329055200 +"%Y-%m-%d"
20
+ > 2012-02-13
21
+
22
+ howdoi will answer all sorts of queries
23
+
24
+ $ howdoi print stack trace python
25
+ > http://stackoverflow.com/questions/7901238/javas-printstacktrace-equivalent-in-python
26
+ >
27
+ > import traceback
28
+ >
29
+ > try:
30
+ > 1/0
31
+ > except:
32
+ > print '>>> traceback <<<'
33
+ > traceback.print_exc()
34
+ > print '>>> end of traceback <<<'
35
+ > traceback.print_exc()
36
+
37
+ Installation
38
+ ------------
39
+
40
+ gem install howdoi
41
+
42
+ Usage
43
+ -----
44
+
45
+ ::
46
+
47
+ Usage: bin/howdoi [options] QUERY ...
48
+
49
+ -p, --pos N select answer in specified position (default: 1)
50
+ -a, --all display the full text of the answer
51
+
52
+ Author
53
+ ------
54
+
55
+ - Roy Zuo ([@roylez][2])
56
+
57
+ Notes
58
+ -----
59
+
60
+ - Requires Nokogiri
61
+ - Special thanks to Rich Jones ([@miserlou][3]) for the idea, and Benjamin Gleitzman ([@gleitz][4]) for original Python implementation
62
+
63
+ [1]: https://github.com/gleitz/howdoi/tree/master/howdoi
64
+ [2]: http://roylez.heroku.com
65
+ [3]: https://github.com/miserlou
66
+ [4]: https://github.com/gleitz
data/bin/howdoi ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+ #Author: Roy L Zuo (roylzuo at gmail dot com)
4
+ #Description:
5
+
6
+ require 'optparse'
7
+ require 'howdoi'
8
+ options = {}
9
+
10
+ OptionParser.new do |opts|
11
+ opts.banner = "Usage: #{$0} [options] QUERY ..."
12
+ opts.separator " "
13
+ options[:pos] = 1
14
+ opts.on("-p", "--pos N", Integer, "select answer in specified position (default: 1)") do |pos|
15
+ options[:pos] = pos
16
+ end
17
+ opts.on("-a", "--all", 'display the full text of the answer') do
18
+ option[:all] = true
19
+ end
20
+ end.parse!
21
+
22
+ how_do_i(ARGV, options)
data/lib/howdoi.rb ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+ #Author: Roy L Zuo (roylzuo at gmail dot com)
4
+ #Description:
5
+
6
+ require 'uri'
7
+ require 'net/http'
8
+ require 'rubygems'
9
+ require 'nokogiri'
10
+
11
+ GOOGLE_SEARCH_URL = "http://www.google.com/search?q=site:stackoverflow.com+"
12
+ USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17"
13
+
14
+ def get_url(url)
15
+ uri = URI.parse url
16
+ http = Net::HTTP.new(uri.host, uri.port)
17
+ http.get(uri.request_uri, 'User-Agent' => USER_AGENT).body
18
+ end
19
+
20
+ def is_question?(stackoverflow_url)
21
+ stackoverflow_url =~ %r(/questions/\d+/)
22
+ end
23
+
24
+ def get_google_links(args)
25
+ page = get_url(URI.escape(GOOGLE_SEARCH_URL + args.join("+")))
26
+ html = Nokogiri.HTML(page)
27
+ posts = []
28
+ html.css('a.l').each{|l| posts << l[:href] if is_question?(l[:href]) }
29
+ posts
30
+ end
31
+
32
+ def get_link_at_pos(links, pos)
33
+ link = nil
34
+ pos.times do |i|
35
+ break if i > links.size
36
+ link = links[i]
37
+ end
38
+ link
39
+ end
40
+
41
+ def how_do_i(args, opts = {})
42
+ links = get_google_links(args)
43
+ link = get_link_at_pos(links, opts[:pos])
44
+ if link
45
+ puts "\e[32m" + link + "\e[m"
46
+ puts
47
+ page = get_url link
48
+ html = Nokogiri.HTML page
49
+ ans = html.at_css(".answer")
50
+ instruction = ans.css("pre").children.
51
+ collect(&:content).
52
+ join(" " * 5 + '-' * 50 + "\n") ||
53
+ ans.at_css("code").content
54
+ unless opts[:all] or instruction.empty?
55
+ puts instruction
56
+ else
57
+ puts ans.at('.post-text').content
58
+ end
59
+ else
60
+ puts "Sorry, couldn't find any help with that topic"
61
+ end
62
+ end
63
+
64
+ if __FILE__ == $0
65
+ require 'optparse'
66
+ options = {}
67
+
68
+ OptionParser.new do |opts|
69
+ opts.banner = "Usage: #{$0} [options] QUERY ..."
70
+ opts.separator " "
71
+ options[:pos] = 1
72
+ opts.on("-p", "--pos N", Integer, "select answer in specified position (default: 1)") do |pos|
73
+ options[:pos] = pos
74
+ end
75
+ opts.on("-a", "--all", 'display the full text of the answer') do
76
+ option[:all] = true
77
+ end
78
+ end.parse!
79
+
80
+ how_do_i(ARGV, options)
81
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: howdoi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Roy Zuo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-09 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: This is ruby clone of original Python howdoi by Benjamin Gleitzman (@gleitz)
15
+ email: roylzuo@gmail.com
16
+ executables:
17
+ - howdoi
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/howdoi.rb
22
+ - bin/howdoi
23
+ - README.md
24
+ homepage: http://rubygems.org/gems/howdoi
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.11
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: a code search tool
48
+ test_files: []
49
+ has_rdoc: