howdy 0.0.3 → 0.1.0
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.
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/bin/how +7 -0
- data/howdy.gemspec +3 -3
- data/lib/howdy/base.rb +199 -0
- data/lib/howdy/core_ext/ruby/string/underscore.rb +9 -0
- data/lib/howdy/dictionaries/dict_pl.rb +2 -0
- data/lib/howdy/dictionaries/dictionary_com.rb +2 -0
- data/lib/howdy/dictionaries/ling_pl.rb +2 -0
- data/lib/howdy/dictionaries/urban_dictionary_com.rb +3 -0
- data/lib/howdy.rb +4 -13
- metadata +3 -3
- data/lib/howdy/dictionaries/base.rb +0 -80
- data/lib/howdy/pair.rb +0 -22
data/Rakefile
CHANGED
@@ -45,5 +45,6 @@ Rake::RDocTask.new do |rdoc|
|
|
45
45
|
rdoc.rdoc_dir = 'rdoc'
|
46
46
|
rdoc.title = "howdy #{version}"
|
47
47
|
rdoc.rdoc_files.include('README*')
|
48
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
48
|
+
rdoc.rdoc_files.include('lib/*/*.rb', 'lib/core/**/*.rb')
|
49
|
+
rdoc.options << "-c UTF-8"
|
49
50
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/bin/how
CHANGED
@@ -19,6 +19,13 @@ opts = OptionParser.new do |opts|
|
|
19
19
|
Howdy::Dictionary.set(dict)
|
20
20
|
end
|
21
21
|
|
22
|
+
opts.on("-l", "--list", "List available dictionaries") do |l|
|
23
|
+
Howdy::Dictionary.available.each do |dict|
|
24
|
+
puts " #{dict.dict_label} - #{dict.dict_description}"
|
25
|
+
end
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
|
22
29
|
opts.on_tail("-h", "--help", "Show this message") do |h|
|
23
30
|
puts opts
|
24
31
|
exit
|
data/howdy.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{howdy}
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["mlomnicki"]
|
@@ -28,12 +28,12 @@ Gem::Specification.new do |s|
|
|
28
28
|
"bin/how",
|
29
29
|
"howdy.gemspec",
|
30
30
|
"lib/howdy.rb",
|
31
|
-
"lib/howdy/
|
31
|
+
"lib/howdy/base.rb",
|
32
|
+
"lib/howdy/core_ext/ruby/string/underscore.rb",
|
32
33
|
"lib/howdy/dictionaries/dict_pl.rb",
|
33
34
|
"lib/howdy/dictionaries/dictionary_com.rb",
|
34
35
|
"lib/howdy/dictionaries/ling_pl.rb",
|
35
36
|
"lib/howdy/dictionaries/urban_dictionary_com.rb",
|
36
|
-
"lib/howdy/pair.rb",
|
37
37
|
"spec/howdy_spec.rb",
|
38
38
|
"spec/spec_helper.rb"
|
39
39
|
]
|
data/lib/howdy/base.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'uri'
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
module Howdy # :nodoc
|
6
|
+
|
7
|
+
# Standard Howdy exception
|
8
|
+
class HowdyError < Exception; end
|
9
|
+
|
10
|
+
# Howdy::Dictionary exposes accessors of dictionaries collection.
|
11
|
+
module Dictionary
|
12
|
+
|
13
|
+
# Returns current dictionary class
|
14
|
+
def self.current
|
15
|
+
@@dictionary ||= default
|
16
|
+
end
|
17
|
+
|
18
|
+
# Set current dictionary. Pass a class as an argument
|
19
|
+
# Howdy::Dictionary.set(DictionaryCom)
|
20
|
+
def self.set(dictionary)
|
21
|
+
@@dictionary = dictionary
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns default dictionary
|
25
|
+
def self.default
|
26
|
+
DictionaryCom
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns array of available dictionaries
|
30
|
+
def self.available
|
31
|
+
@@available_dictionaries ||= []
|
32
|
+
end
|
33
|
+
|
34
|
+
# Base class for all dictionaries. Inherit from it if you want to implement
|
35
|
+
# your own dictionary.
|
36
|
+
# Example:
|
37
|
+
#
|
38
|
+
# class AwesomeDictionary < Howdy::Dictionary::Base
|
39
|
+
#
|
40
|
+
# url 'http://awesome.example.com?word=#{user_query}'
|
41
|
+
# label 'example.com'
|
42
|
+
# description 'Most awesome dictionary you've ever seen'
|
43
|
+
#
|
44
|
+
# def parse
|
45
|
+
# document.css('table.results tr td.word') do |cell|
|
46
|
+
# result << cell.content
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
class Base
|
51
|
+
|
52
|
+
attr_reader :user_query
|
53
|
+
|
54
|
+
def self.inherited(base) # :nodoc
|
55
|
+
Howdy::Dictionary.available << base
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize(user_query) # :nodoc
|
59
|
+
@user_query = user_query
|
60
|
+
end
|
61
|
+
|
62
|
+
# Sets URL to query the web dictionary.
|
63
|
+
# You must pass protocol as well:
|
64
|
+
# http://dictionary.com is correct
|
65
|
+
# dictionary.com is incorrect
|
66
|
+
#
|
67
|
+
# URL is interpolated:
|
68
|
+
# 'http://dictionary.com/browse/#{user_query}'
|
69
|
+
#
|
70
|
+
# <tt>user_query</tt> is a string given by the user
|
71
|
+
#
|
72
|
+
# You may provide own interpolations easily:
|
73
|
+
# Example:
|
74
|
+
# class Dictionary < Howdy::Dictionary::Base
|
75
|
+
# url 'http://awesome.example.com?word=#{user_query}&language=#{lang}'
|
76
|
+
# label 'example.com'
|
77
|
+
# description 'Interpolations example'
|
78
|
+
#
|
79
|
+
# def lang
|
80
|
+
# File.read('/etc/howdy/language.conf')
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# def parse
|
84
|
+
# # implement parsing
|
85
|
+
# end
|
86
|
+
#
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# In that example #{lang} in url will be replaced with content of
|
90
|
+
# /etc/howdy/language.conf
|
91
|
+
#
|
92
|
+
# Indicate the url must be given using <b>SINGLE QUOTES</b>.
|
93
|
+
def self.url(dictionary_url)
|
94
|
+
@url = dictionary_url
|
95
|
+
end
|
96
|
+
|
97
|
+
# Returns URL of the dictionary
|
98
|
+
def self.dict_url
|
99
|
+
@url
|
100
|
+
end
|
101
|
+
|
102
|
+
# Sets a label of the dictionary. Label is used when listing available
|
103
|
+
# dictionaries
|
104
|
+
def self.label(human_name)
|
105
|
+
@name = human_name.to_s
|
106
|
+
end
|
107
|
+
|
108
|
+
# Sets a description of the dictionary. Description is used when listing
|
109
|
+
# available dictionaries.
|
110
|
+
def self.description(dictionary_description)
|
111
|
+
@description = dictionary_description
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns label of the dictionary.
|
115
|
+
def self.dict_label
|
116
|
+
@name ||= self.label.underscore
|
117
|
+
end
|
118
|
+
|
119
|
+
# Returns description of the dictionary.
|
120
|
+
def self.dict_description
|
121
|
+
@description ||= ""
|
122
|
+
end
|
123
|
+
|
124
|
+
# Sets an encoding of content returned by HTTP response.
|
125
|
+
def self.encoding(enc)
|
126
|
+
@encoding = enc.to_s
|
127
|
+
end
|
128
|
+
|
129
|
+
# Returns an encoding of HTTP response. UTF-8 by default.
|
130
|
+
def self.doc_encoding
|
131
|
+
@encoding ||= 'UTF-8'
|
132
|
+
end
|
133
|
+
|
134
|
+
# Method which transformates raw content received in HTTP response to
|
135
|
+
# human-friendly form. Usually you'll use +document+ which exposes
|
136
|
+
# the raw content wrapped by Nokogiri parser. Read to nokogiri
|
137
|
+
# documentation for details.
|
138
|
+
#
|
139
|
+
# Each human readable word goes to +result+ array.
|
140
|
+
#
|
141
|
+
# Example:
|
142
|
+
# def parse
|
143
|
+
# document.css('table.content tr td.word').each do |row|
|
144
|
+
# result << row.content
|
145
|
+
# end
|
146
|
+
# end
|
147
|
+
#
|
148
|
+
def parse
|
149
|
+
raise Howdy::HowdyError, "Implement parse in your Dictionary::Base subclass"
|
150
|
+
end
|
151
|
+
|
152
|
+
# Returns content of HTTP response wrapped in Nokogiri::HTML backend.
|
153
|
+
def document
|
154
|
+
@document ||= Nokogiri::HTML(open(URI.escape(interpolated_url)), nil, self.class.doc_encoding)
|
155
|
+
end
|
156
|
+
|
157
|
+
# Array which stores the answers for the user query. Used in +parse+ method.
|
158
|
+
# Example:
|
159
|
+
# result << 'Polyglot - a person who speaks, writes, or reads a number of languages'
|
160
|
+
def result
|
161
|
+
@result ||= []
|
162
|
+
end
|
163
|
+
|
164
|
+
# Prints the contents of +result+ array. You may ovveride it in subclass.
|
165
|
+
def print
|
166
|
+
if result.empty?
|
167
|
+
puts "Nothing found"
|
168
|
+
else
|
169
|
+
result.each do |item|
|
170
|
+
puts item.to_s
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
protected
|
176
|
+
# Returns url with interpolated literals. Literals are interpolated using
|
177
|
+
# corresponding instance methods.
|
178
|
+
# Example:
|
179
|
+
# url 'http://example.com/word/#{foo}'
|
180
|
+
#
|
181
|
+
# def foo
|
182
|
+
# 'bar'
|
183
|
+
# end
|
184
|
+
#
|
185
|
+
# <tt>interpolated_url</tt> will return:
|
186
|
+
# http://example/com/word/bar
|
187
|
+
def interpolated_url
|
188
|
+
@interpolated_url ||= self.class.dict_url.gsub(/#\{[^\}]+\}/) do |interpolation|
|
189
|
+
method = interpolation[2..-2].to_sym # drop leading '#{' and trailing '}'
|
190
|
+
raise Howdy::HowdyError.new("Dictionary has to respond to #{method} in order to use it in query") unless respond_to?(method)
|
191
|
+
send(method)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Stolen from Steam project by Sven Fuchs http://github.com/svenfuchs/steam
|
2
|
+
|
3
|
+
class String
|
4
|
+
|
5
|
+
# Returns underscored string
|
6
|
+
def underscore
|
7
|
+
self[0, 1].downcase + self[1..-1].gsub(/[A-Z]/) { |c| "_#{c.downcase}" }
|
8
|
+
end
|
9
|
+
end unless String.method_defined?(:underscore)
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module Howdy
|
2
2
|
module Dictionary
|
3
3
|
class UrbanDictionaryCom < Base
|
4
|
+
|
4
5
|
url 'http://www.urbandictionary.com/define.php?term=#{user_query}'
|
6
|
+
label 'urbandictionary.com'
|
7
|
+
description 'Slang dictionary'
|
5
8
|
|
6
9
|
def parse
|
7
10
|
document.css('table#entries tr td.text').each do |cell|
|
data/lib/howdy.rb
CHANGED
@@ -1,15 +1,6 @@
|
|
1
|
-
$: << File.join(File.dirname(__FILE__),'howdy')
|
1
|
+
$: << File.join(File.dirname(__FILE__), 'howdy')
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
|
6
|
-
require 'dictionaries/ling_pl'
|
7
|
-
require 'dictionaries/dictionary_com'
|
8
|
-
require 'dictionaries/urban_dictionary_com'
|
9
|
-
|
10
|
-
module Howdy
|
11
|
-
|
12
|
-
class HowdyError < Exception; end
|
13
|
-
|
14
|
-
end
|
3
|
+
require 'core_ext/ruby/string/underscore'
|
4
|
+
require 'base'
|
5
|
+
Dir[File.join(File.dirname(__FILE__), 'howdy', 'dictionaries', '*.rb')].each { |dict| require dict }
|
15
6
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: howdy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mlomnicki
|
@@ -51,12 +51,12 @@ files:
|
|
51
51
|
- bin/how
|
52
52
|
- howdy.gemspec
|
53
53
|
- lib/howdy.rb
|
54
|
-
- lib/howdy/
|
54
|
+
- lib/howdy/base.rb
|
55
|
+
- lib/howdy/core_ext/ruby/string/underscore.rb
|
55
56
|
- lib/howdy/dictionaries/dict_pl.rb
|
56
57
|
- lib/howdy/dictionaries/dictionary_com.rb
|
57
58
|
- lib/howdy/dictionaries/ling_pl.rb
|
58
59
|
- lib/howdy/dictionaries/urban_dictionary_com.rb
|
59
|
-
- lib/howdy/pair.rb
|
60
60
|
- spec/howdy_spec.rb
|
61
61
|
- spec/spec_helper.rb
|
62
62
|
has_rdoc: true
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
require 'uri'
|
3
|
-
require 'nokogiri'
|
4
|
-
|
5
|
-
module Howdy
|
6
|
-
|
7
|
-
module Dictionary
|
8
|
-
|
9
|
-
def self.current
|
10
|
-
@@dictionary ||= default_dictionary
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.set(dictionary)
|
14
|
-
@@dictionary = dictionary
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.default_dictionary
|
18
|
-
DictionaryCom
|
19
|
-
end
|
20
|
-
|
21
|
-
class Base
|
22
|
-
|
23
|
-
attr_reader :user_query
|
24
|
-
|
25
|
-
def initialize(user_query)
|
26
|
-
@user_query = user_query
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.url(dictionary_url)
|
30
|
-
@url = dictionary_url
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.dict_url
|
34
|
-
@url
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.encoding(enc)
|
38
|
-
@encoding = enc.to_s
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.doc_encoding
|
42
|
-
@encoding ||= 'UTF-8'
|
43
|
-
end
|
44
|
-
|
45
|
-
def parse
|
46
|
-
raise Howdy::HowdyError, "Implement parse in your Dictionary::Base subclass"
|
47
|
-
end
|
48
|
-
|
49
|
-
def document
|
50
|
-
@document ||= Nokogiri::HTML(open(URI.escape(interpolated_url)), nil, self.class.doc_encoding)
|
51
|
-
end
|
52
|
-
|
53
|
-
def result
|
54
|
-
@result ||= []
|
55
|
-
end
|
56
|
-
|
57
|
-
def print
|
58
|
-
if result.empty?
|
59
|
-
puts "Nothing found"
|
60
|
-
else
|
61
|
-
result.each do |item|
|
62
|
-
puts item.to_s
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
protected
|
68
|
-
def interpolated_url
|
69
|
-
@interpolated_url ||= self.class.dict_url.gsub(/#\{[^\}]+\}/) do |interpolation|
|
70
|
-
method = interpolation[2..-2].to_sym # drop leading '#{' and trailing '}'
|
71
|
-
raise Howdy::HowdyError.new("Dictionary has to respond to #{method} in order to use it in query") unless respond_to?(method)
|
72
|
-
send(method)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
data/lib/howdy/pair.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Howdy
|
2
|
-
|
3
|
-
class Pair
|
4
|
-
|
5
|
-
attr_accessor :left, :right
|
6
|
-
|
7
|
-
CENTER = 85
|
8
|
-
|
9
|
-
def initialize(left = nil, right = nil)
|
10
|
-
@left = left
|
11
|
-
@right = right
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_s
|
15
|
-
"#{@left.center(CENTER)} => #{@right.center(CENTER)}"
|
16
|
-
end
|
17
|
-
|
18
|
-
alias :inspect :to_s
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|