urban 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +10 -2
- data/HISTORY.rdoc +33 -18
- data/Manifest.txt +25 -0
- data/README.rdoc +16 -15
- data/Rakefile +14 -31
- data/bin/urban +1 -1
- data/lib/urban.rb +4 -1
- data/lib/urban/cli.rb +64 -74
- data/lib/urban/dictionary.rb +11 -11
- data/lib/urban/web.rb +27 -15
- data/script/test +10 -0
- data/test/fixtures/impromptu.html +1039 -0
- data/test/{data → fixtures}/missing.html +0 -0
- data/test/fixtures/screens/definition.txt +5 -0
- data/test/fixtures/screens/definition_with_url.txt +7 -0
- data/test/fixtures/screens/definitions.txt +9 -0
- data/test/fixtures/screens/help.txt +19 -0
- data/test/fixtures/screens/invalid_option_error.txt +2 -0
- data/test/fixtures/screens/missing_phrase_error.txt +1 -0
- data/test/fixtures/screens/no_internet_error.txt +1 -0
- data/test/test_helper.rb +27 -20
- data/test/urban/cli_test.rb +77 -135
- data/test/urban/dictionary_test.rb +29 -19
- data/test/urban/web_test.rb +27 -45
- metadata +113 -102
- data/.gitignore +0 -26
- data/Gemfile +0 -4
- data/lib/urban/version.rb +0 -3
- data/test/data/impromptu.html +0 -463
- data/test/minitest/stop_light.rb +0 -57
- data/urban.gemspec +0 -25
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 279344d172dfd0791a5c6d1bfa1bb08e46689562
|
4
|
+
data.tar.gz: 434a62d05989c3b064daa500a8af7e700d7016be
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6f11ea8f3569c5500380a8f478137b07a7c8c2955dfd87ed4859a439b6a50e7ab71e9828e3a0bdef8a8eefac767701f6d38d45d7480b236b6328e35f1c0b1a45
|
7
|
+
data.tar.gz: 3dd0ff3b40e0873901e50a38b9f4f0997028dbea37a4ea7e129db8a490ce5890d6cf85e8710fbf1374b1300b4285a9dbb0d61f263066948edb6f3287dc60a407
|
data/.travis.yml
CHANGED
data/HISTORY.rdoc
CHANGED
@@ -1,25 +1,40 @@
|
|
1
|
+
=== 2.0.0
|
2
|
+
|
3
|
+
* Major enhancements:
|
4
|
+
|
5
|
+
* Remove deperecated `--list` and `-l` flags.
|
6
|
+
* Remove official support for Ruby 1.8.6.
|
7
|
+
|
8
|
+
* Bug fixes
|
9
|
+
|
10
|
+
* Urban Dictionary redesigned the website. Xpath selectors were out of date
|
11
|
+
and would not return results properly.
|
12
|
+
* Undefined words now show a cleaner error. This was apparently not fixed
|
13
|
+
in the prior release.
|
14
|
+
|
1
15
|
=== 1.0.0
|
2
16
|
|
3
17
|
* Major enhancements:
|
4
18
|
|
5
|
-
* Change
|
6
|
-
*
|
7
|
-
*
|
19
|
+
* Change `--list` flag to the `--all` flag for more clarity.
|
20
|
+
* Deprecate `--list` flag.
|
21
|
+
* Remove query from Urban::Web replace with random and search.
|
22
|
+
* Add `url` flag to print the url of the definition.
|
8
23
|
|
9
24
|
* Minor enhancements:
|
10
25
|
|
11
|
-
* Add this history file
|
12
|
-
* Add Urban::Web#fetch for fetching pages from urban dictionary
|
13
|
-
* Add examples to help
|
14
|
-
* Remove require 'rubygems' from program and lib
|
15
|
-
* Test now only stubs singleton instead of class
|
16
|
-
* Use ~> instead of >= on dependencies
|
17
|
-
* Replace OpenStruct in Urban::Dictionary with plain Struct
|
18
|
-
* Move Nokogiri call to Dictionary#process
|
19
|
-
|
20
|
-
* Bug
|
21
|
-
|
22
|
-
* Passing -v or --version no longer prints help
|
23
|
-
* Undefined words now show a clean error
|
24
|
-
* No internet connection now shows a clean error
|
25
|
-
* Invalid options now show a clean error
|
26
|
+
* Add this history file.
|
27
|
+
* Add Urban::Web#fetch for fetching pages from urban dictionary.
|
28
|
+
* Add examples to help.
|
29
|
+
* Remove require 'rubygems' from program and lib.
|
30
|
+
* Test now only stubs singleton instead of class.
|
31
|
+
* Use ~> instead of >= on dependencies.
|
32
|
+
* Replace OpenStruct in Urban::Dictionary with plain Struct.
|
33
|
+
* Move Nokogiri call to Dictionary#process.
|
34
|
+
|
35
|
+
* Bug fixs:
|
36
|
+
|
37
|
+
* Passing -v or --version no longer prints help.
|
38
|
+
* Undefined words now show a clean error.
|
39
|
+
* No internet connection now shows a clean error.
|
40
|
+
* Invalid options now show a clean error.
|
data/Manifest.txt
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
.travis.yml
|
2
|
+
HISTORY.rdoc
|
3
|
+
LICENSE
|
4
|
+
Manifest.txt
|
5
|
+
README.rdoc
|
6
|
+
Rakefile
|
7
|
+
bin/urban
|
8
|
+
lib/urban.rb
|
9
|
+
lib/urban/cli.rb
|
10
|
+
lib/urban/dictionary.rb
|
11
|
+
lib/urban/web.rb
|
12
|
+
script/test
|
13
|
+
test/fixtures/impromptu.html
|
14
|
+
test/fixtures/missing.html
|
15
|
+
test/fixtures/screens/definition.txt
|
16
|
+
test/fixtures/screens/definition_with_url.txt
|
17
|
+
test/fixtures/screens/definitions.txt
|
18
|
+
test/fixtures/screens/help.txt
|
19
|
+
test/fixtures/screens/invalid_option_error.txt
|
20
|
+
test/fixtures/screens/missing_phrase_error.txt
|
21
|
+
test/fixtures/screens/no_internet_error.txt
|
22
|
+
test/test_helper.rb
|
23
|
+
test/urban/cli_test.rb
|
24
|
+
test/urban/dictionary_test.rb
|
25
|
+
test/urban/web_test.rb
|
data/README.rdoc
CHANGED
@@ -1,17 +1,22 @@
|
|
1
1
|
= Urban
|
2
|
-
{<img src="https://secure.travis-ci.org/tmiller/urban.png"/>}[http://travis-ci.org/tmiller/urban]
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
* Home :: http://github.com/tmiller/urban
|
4
|
+
* Bug Tracker :: http://github.com/tmiller/urban/issues
|
6
5
|
|
7
|
-
|
8
|
-
* {Bug Tracker}[http://github.com/tmiller/urban/issues]
|
6
|
+
== Description:
|
9
7
|
|
10
|
-
|
8
|
+
Urban is a command line utility with an API to query definitions from Urban
|
9
|
+
Dictionary.
|
11
10
|
|
12
|
-
|
11
|
+
== BADGES
|
13
12
|
|
14
|
-
|
13
|
+
{<img src="https://secure.travis-ci.org/tmiller/urban.png"/>}[http://travis-ci.org/tmiller/urban] {<img src="https://codeclimate.com/github/tmiller/urban.png" />}[https://codeclimate.com/github/tmiller/urban]
|
14
|
+
|
15
|
+
== REQUIREMENTS
|
16
|
+
|
17
|
+
* Ruby >= 1.8.7
|
18
|
+
|
19
|
+
== INSTALLATION
|
15
20
|
|
16
21
|
With Rubygems:
|
17
22
|
|
@@ -23,7 +28,7 @@ With git and local working copy
|
|
23
28
|
$ cd urban
|
24
29
|
$ sudo rake install
|
25
30
|
|
26
|
-
== CLI
|
31
|
+
== CLI USAGE
|
27
32
|
|
28
33
|
=== 1. Look up a definition
|
29
34
|
|
@@ -49,9 +54,9 @@ With git and local working copy
|
|
49
54
|
$ urban --help
|
50
55
|
$ urban --version
|
51
56
|
|
52
|
-
== API
|
57
|
+
== API USAGE
|
53
58
|
|
54
|
-
|
59
|
+
require 'urban'
|
55
60
|
|
56
61
|
# Search for a word
|
57
62
|
entry = Urban::Dictionary.search('impromtpu')
|
@@ -68,10 +73,6 @@ With git and local working copy
|
|
68
73
|
puts definition
|
69
74
|
end
|
70
75
|
|
71
|
-
== To Do
|
72
|
-
|
73
|
-
* Add YARD documentation for API
|
74
|
-
|
75
76
|
---
|
76
77
|
|
77
78
|
Copyright (c) 2011 Thomas Miller. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,38 +1,21 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
|
1
|
+
# -*- ruby -*-
|
2
|
+
require "rubygems"
|
3
|
+
require "hoe"
|
4
4
|
|
5
|
+
Hoe.plugin :minitest
|
6
|
+
Hoe.plugin :git
|
5
7
|
|
6
|
-
|
8
|
+
Hoe.spec "urban" do
|
9
|
+
self.readme_file = "README.rdoc"
|
10
|
+
self.history_file = "History.rdoc"
|
7
11
|
|
8
|
-
|
9
|
-
|
10
|
-
t.libs << "test"
|
11
|
-
t.test_files = FileList['test/**/*_test.rb']
|
12
|
-
t.verbose = true
|
13
|
-
t.warning = true
|
14
|
-
end
|
12
|
+
license "MIT"
|
13
|
+
developer("Tom Miller", "jackerran@gmail.com")
|
15
14
|
|
16
|
-
|
17
|
-
t.name = 'test:cli'
|
18
|
-
t.libs << "test"
|
19
|
-
t.test_files = FileList['test/**/cli_test.rb']
|
20
|
-
t.verbose = true
|
21
|
-
t.warning = true
|
22
|
-
end
|
15
|
+
dependency 'nokogiri', '~> 1.5.0'
|
23
16
|
|
24
|
-
|
25
|
-
|
26
|
-
t.libs << "test"
|
27
|
-
t.test_files = FileList['test/**/dictionary_test.rb']
|
28
|
-
t.verbose = true
|
29
|
-
t.warning = true
|
17
|
+
dependency 'rake', '~> 10.0', :development
|
18
|
+
dependency 'minitest', '~> 5.0', :development
|
30
19
|
end
|
31
20
|
|
32
|
-
|
33
|
-
t.name = 'test:web'
|
34
|
-
t.libs << "test"
|
35
|
-
t.test_files = FileList['test/**/web_test.rb']
|
36
|
-
t.verbose = true
|
37
|
-
t.warning = true
|
38
|
-
end
|
21
|
+
# vim: syntax=ruby
|
data/bin/urban
CHANGED
data/lib/urban.rb
CHANGED
data/lib/urban/cli.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require 'urban/dictionary'
|
1
|
+
require "optparse"
|
2
|
+
require "ostruct"
|
3
|
+
require "socket"
|
5
4
|
|
6
5
|
module Urban
|
7
6
|
class CLI
|
@@ -9,94 +8,89 @@ module Urban
|
|
9
8
|
attr_accessor :dictionary
|
10
9
|
|
11
10
|
def initialize
|
12
|
-
@dictionary = Urban::Dictionary
|
11
|
+
@dictionary = Urban::Dictionary.new
|
13
12
|
end
|
14
13
|
|
15
14
|
def run(args = ARGV)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
if output.definitions
|
28
|
-
print_entry(output, options)
|
29
|
-
else
|
30
|
-
$stderr.puts "urban: no definitions found for #{entry.phrase.upcase}."
|
31
|
-
end
|
32
|
-
else
|
33
|
-
puts output
|
34
|
-
end
|
35
|
-
|
36
|
-
rescue SocketError
|
37
|
-
$stderr.puts 'urban: no internet connection available.'
|
38
|
-
rescue OptionParser::InvalidOption => e
|
39
|
-
$stderr.puts "urban: #{e.message}\nTry `urban --help' for more information."
|
40
|
-
rescue Exception => e
|
41
|
-
$stderr.puts e.message
|
15
|
+
|
16
|
+
options = parse(args)
|
17
|
+
results = lookup(options)
|
18
|
+
|
19
|
+
case
|
20
|
+
when results.definitions
|
21
|
+
generate_output results, options
|
22
|
+
when results.phrase
|
23
|
+
error "no definitions found for #{results.phrase.upcase}."
|
24
|
+
else
|
25
|
+
$stdout.puts options.version ? version : usage
|
42
26
|
end
|
27
|
+
|
28
|
+
rescue SocketError
|
29
|
+
error "no internet connection available."
|
30
|
+
rescue OptionParser::InvalidOption => e
|
31
|
+
error "#{e.message}\nTry `urban --help' for more information."
|
32
|
+
rescue Object => e
|
33
|
+
error e.message
|
43
34
|
end
|
44
35
|
|
45
36
|
private
|
46
37
|
|
47
|
-
def
|
38
|
+
def error(message)
|
39
|
+
$stderr.puts "urban: #{message}"
|
48
40
|
end
|
49
41
|
|
50
|
-
def
|
51
|
-
|
52
|
-
puts "\n#{entry.phrase.upcase}\n\n"
|
42
|
+
def generate_output(entry, options)
|
43
|
+
output = "\n#{entry.phrase.upcase}\n\n"
|
53
44
|
if options.all
|
54
|
-
entry.definitions.
|
45
|
+
output << "#{entry.definitions.join("\n\n")}\n\n"
|
55
46
|
else
|
56
|
-
|
47
|
+
output << "#{entry.definitions.first}\n\n"
|
57
48
|
end
|
58
|
-
|
49
|
+
output << "URL: #{entry.url}\n\n" if options.url
|
50
|
+
|
51
|
+
$stdout.puts output
|
59
52
|
end
|
60
53
|
|
61
54
|
def parse(args)
|
62
55
|
options = OpenStruct.new
|
63
|
-
options.random = options.all = options.version = options.help = false
|
64
|
-
|
65
|
-
opts = OptionParser.new do |o|
|
66
|
-
o.banner = <<-EOB
|
67
|
-
Usage: urban [OPTION]... [PHRASE]
|
68
|
-
Search http://urbandictionary.com for definitions of phrases
|
69
|
-
|
70
|
-
EOB
|
71
|
-
|
72
|
-
o.separator "Options:"
|
73
|
-
o.on('-a', '--all', 'List all definitions') do
|
74
|
-
options.all = true
|
75
|
-
end
|
76
56
|
|
77
|
-
|
78
|
-
|
79
|
-
|
57
|
+
options_parser = OptionParser.new do |o|
|
58
|
+
o.on("-a", "--all") { options.all = true }
|
59
|
+
o.on("-r", "--random") { options.random = true }
|
60
|
+
o.on("-u", "--url") { options.url = true }
|
61
|
+
o.on("-h", "--help")
|
62
|
+
o.on("-v", "--version") { options.version = true }
|
63
|
+
end
|
80
64
|
|
81
|
-
|
82
|
-
|
83
|
-
|
65
|
+
options_parser.parse!(args)
|
66
|
+
options.phrase = args.join(" ")
|
67
|
+
options.search = !options.phrase.empty?
|
68
|
+
options
|
69
|
+
end
|
84
70
|
|
85
|
-
|
86
|
-
|
87
|
-
|
71
|
+
def lookup(options)
|
72
|
+
case
|
73
|
+
when options.random then dictionary.random
|
74
|
+
when options.search then dictionary.search(options.phrase)
|
75
|
+
else OpenStruct.new
|
76
|
+
end
|
77
|
+
end
|
88
78
|
|
89
|
-
|
90
|
-
|
91
|
-
|
79
|
+
def version
|
80
|
+
"Urban #{Urban::VERSION} (c) Thomas Miller"
|
81
|
+
end
|
92
82
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
83
|
+
def usage
|
84
|
+
<<-EOS
|
85
|
+
Usage: urban [OPTION]... [PHRASE]
|
86
|
+
Search http://urbandictionary.com for definitions of phrases
|
98
87
|
|
99
|
-
|
88
|
+
Options:
|
89
|
+
-a, --all List all definitions
|
90
|
+
-r, --random Return a random phrase and definition
|
91
|
+
-u, --url Print the definition's url after the definition
|
92
|
+
-h, --help Show this message
|
93
|
+
-v, --version Show version information
|
100
94
|
|
101
95
|
Examples:
|
102
96
|
urban cookie monster Search for "cookie monster" and print its
|
@@ -107,11 +101,7 @@ Examples:
|
|
107
101
|
urban -ra Print a random phrase and all of its available
|
108
102
|
definitions
|
109
103
|
|
110
|
-
|
111
|
-
opts.parse!(args)
|
112
|
-
options.phrase = args.join(' ')
|
113
|
-
options.help_screen = opts.help + examples
|
114
|
-
options
|
104
|
+
EOS
|
115
105
|
end
|
116
106
|
end
|
117
107
|
end
|
data/lib/urban/dictionary.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require 'urban/version'
|
3
|
-
require 'urban/web'
|
1
|
+
require "nokogiri"
|
4
2
|
|
5
3
|
module Urban
|
6
|
-
|
7
|
-
extend self
|
4
|
+
class Dictionary
|
8
5
|
|
9
6
|
Entry = Struct.new(:phrase, :definitions, :url)
|
7
|
+
|
10
8
|
attr_writer :web_service
|
11
9
|
|
12
10
|
def random
|
@@ -18,7 +16,7 @@ module Urban
|
|
18
16
|
end
|
19
17
|
|
20
18
|
def web_service
|
21
|
-
@web_service ||= Urban::Web
|
19
|
+
@web_service ||= Urban::Web.new
|
22
20
|
end
|
23
21
|
|
24
22
|
private
|
@@ -28,15 +26,17 @@ module Urban
|
|
28
26
|
if not_defined = document.at_xpath('//div[@id="not_defined_yet"]/i')
|
29
27
|
Entry.new(not_defined.content.strip, nil, nil)
|
30
28
|
else
|
31
|
-
Entry.new(
|
32
|
-
|
33
|
-
|
29
|
+
Entry.new(
|
30
|
+
document.at_xpath('//a[@class="word"][1]').content.strip,
|
31
|
+
parse_definitions(document),
|
32
|
+
response.url
|
33
|
+
)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
def parse_definitions(document)
|
38
|
-
|
39
|
-
node.xpath(
|
38
|
+
document.xpath('//div[@class="def-panel"]/div[@class="meaning"]').map do |node|
|
39
|
+
node.xpath("//br").each { |br| br.replace(Nokogiri::XML::Text.new("\n", node.document)) };
|
40
40
|
node.content.strip
|
41
41
|
end
|
42
42
|
end
|