dict 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/lib/dict/cli/runner.rb +3 -0
- data/lib/dict/dict.rb +13 -9
- data/lib/dict/dictionary.rb +5 -3
- data/lib/dict/glosbe.rb +66 -0
- data/lib/dict/result.rb +3 -0
- data/lib/dict/version.rb +1 -1
- data/lib/dict/wiktionary.rb +3 -1
- data/spec/dict/lib_dict_cli_runner_spec.rb +10 -8
- data/spec/dict/lib_dict_spec.rb +12 -3
- data/spec/dict/lib_glosbe_spec.rb +34 -0
- data/spec/dict/lib_wiktionary_spec.rb +3 -1
- data/spec/dict/vcr_cassettes/glosbe_translations_atomic_cassette.yml +2794 -0
- data/spec/dict/vcr_cassettes/glosbe_translations_woda_cassette.yml +1949 -0
- data/spec/dict/vcr_cassettes/slowik_runner_cassette.yml +2336 -0
- data/spec/dict/vcr_cassettes/translations_dragon_cassette.yml +8659 -0
- data/spec/dict/vcr_cassettes/translations_slownik_cassette.yml +1070 -54
- metadata +13 -2
data/Gemfile.lock
CHANGED
data/lib/dict/cli/runner.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
+
# Class, which provides using application in Command Line Interface.
|
4
|
+
|
3
5
|
require 'dict/dict'
|
4
6
|
require 'dict/version'
|
5
7
|
require 'slop'
|
@@ -54,6 +56,7 @@ Search WORD in dict, an open source dictionary aggregator.
|
|
54
56
|
MSG = "Usage: dict WORD [OPTIONS]\nTry `dict --help for more information.\n"
|
55
57
|
VERSION = "dict version #{Dict::VERSION}\nSearch WORD in dict, an open source dictionary aggregator.\nCopyright (C) 2012 by Mateusz Czerwiński, Michał Podlecki,\nAleksander Gozdek, Rafał Ośko, Jan Borwin, Kosma Dunikowski\nMentors: Grzegorz Kołodziejski, Michał Kwiatkowski\nMade during intership at Ragnarson http://ragnarson.com\nHosted by Shelly Cloud https://shellycloud.com\nLicense: MIT\nHomepage: https://github.com/Ragnarson/dict-gem\nSources dictionaries: http://dict.pl, http://pl.wiktionary.org"
|
56
58
|
|
59
|
+
# Returns only translations of the given word, without example sentences.
|
57
60
|
def clean_translation(opts, word)
|
58
61
|
translation = get_translations(opts, word)
|
59
62
|
string = String.new
|
data/lib/dict/dict.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'dict/wiktionary'
|
4
|
+
require 'dict/glosbe'
|
5
|
+
|
4
6
|
require "yaml"
|
5
7
|
|
6
8
|
module Dict
|
7
9
|
class << self
|
8
|
-
#
|
10
|
+
# Returns hash with structure as showed below
|
9
11
|
# { 'DICTIONARY_NAME' => { 'TRANSLATION' => ['EXAMPLE', ...], ... }, ... }
|
10
12
|
def get_all_dictionaries_translations(word)
|
11
13
|
dictionaries = Hash.new
|
@@ -16,34 +18,36 @@ module Dict
|
|
16
18
|
dictionaries
|
17
19
|
end
|
18
20
|
|
19
|
-
#
|
21
|
+
# Prints translations from all dictionaries.
|
20
22
|
def print_all_dictionaries_translations(word)
|
21
23
|
available_dictionaries.each do |dictionary|
|
22
24
|
print_single_dictionary_translations(word, dictionary)
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
|
-
#
|
28
|
+
# Returns hash with structure as showed below
|
27
29
|
# { 'TRANSLATION' => ['EXAMPLE', ...], ... }
|
28
30
|
def get_single_dictionary_translations(word, dictionary)
|
29
31
|
case dictionary
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
when 'wiktionary'
|
33
|
+
Wiktionary.new(word).translate.translations
|
34
|
+
when 'glosbe'
|
35
|
+
Glosbe.new(word).translate.translations
|
36
|
+
else Dictionary.message
|
33
37
|
end
|
34
38
|
rescue Dictionary::ConnectError
|
35
39
|
"Couldn't connect to the dictionary."
|
36
40
|
end
|
37
41
|
|
38
|
-
#
|
42
|
+
# Prints translations from single dictionary.
|
39
43
|
def print_single_dictionary_translations(word, dictionary)
|
40
44
|
puts "Word '#{word.upcase}' translations from #{dictionary.upcase} dictionary."
|
41
45
|
puts get_single_dictionary_translations(word, dictionary).to_yaml
|
42
46
|
end
|
43
47
|
|
44
|
-
#
|
48
|
+
# Returns array of currently available dictionaries.
|
45
49
|
def available_dictionaries
|
46
|
-
['wiktionary']
|
50
|
+
['wiktionary', 'glosbe']
|
47
51
|
end
|
48
52
|
end
|
49
53
|
end
|
data/lib/dict/dictionary.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
+
# It is a base class for classes fetching results from Web dictionaries.
|
4
|
+
|
3
5
|
require 'open-uri'
|
4
6
|
require 'dict/result'
|
5
7
|
|
@@ -15,7 +17,7 @@ module Dict
|
|
15
17
|
@result = Dict::Result.new(@word)
|
16
18
|
end
|
17
19
|
|
18
|
-
#
|
20
|
+
# Returns hash with structure as showed below
|
19
21
|
# { 'TRANSLATION' => ['EXAMPLE', ...], ... }
|
20
22
|
def make_hash_results(arr)
|
21
23
|
hash = arr.each_slice(2).inject({}) do |h, (key, value)|
|
@@ -29,12 +31,12 @@ module Dict
|
|
29
31
|
hash
|
30
32
|
end
|
31
33
|
|
32
|
-
#
|
34
|
+
# Returns an instance of URI::HTTP class.
|
33
35
|
def uri(url, word = nil)
|
34
36
|
word == nil ? URI(URI.escape(url)) : URI(URI.escape(url + word.downcase.tr(' ', '_')))
|
35
37
|
end
|
36
38
|
|
37
|
-
#
|
39
|
+
# Checks if word was given correctly.
|
38
40
|
def check_arguments(word)
|
39
41
|
raise ArgumentError.new("No given word") if word.empty?
|
40
42
|
end
|
data/lib/dict/glosbe.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'dict/dictionary'
|
5
|
+
|
6
|
+
GLOSBE_PL = 'http://glosbe.com/pl/en/' # polish - english
|
7
|
+
GLOSBE_EN = 'http://glosbe.com/en/pl/' # english - polish
|
8
|
+
|
9
|
+
module Dict
|
10
|
+
class Glosbe < Dictionary
|
11
|
+
# returns an Dict::Result object
|
12
|
+
def translate
|
13
|
+
begin
|
14
|
+
if is_polish?(doc = get_content(GLOSBE_PL, @word))
|
15
|
+
add_translations(get_translations(doc))
|
16
|
+
add_examples(get_examples(doc, 'en'))
|
17
|
+
else
|
18
|
+
doc = get_content(GLOSBE_EN, @word)
|
19
|
+
add_translations(get_translations(doc))
|
20
|
+
add_examples(get_examples(doc, 'pl'))
|
21
|
+
end
|
22
|
+
|
23
|
+
@result
|
24
|
+
rescue OpenURI::HTTPError
|
25
|
+
raise Dictionary::ConnectError
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# checks if given word is polish
|
32
|
+
def is_polish?(doc)
|
33
|
+
doc.at_css('.content_box_rounded p').nil?
|
34
|
+
end
|
35
|
+
|
36
|
+
# returns a html structure of visited site
|
37
|
+
def get_content(url, word)
|
38
|
+
Nokogiri::HTML(open(uri(url, word))).css('.wordDetails')
|
39
|
+
end
|
40
|
+
|
41
|
+
# returns array with structure as shown below from the given dictionary link
|
42
|
+
# ['TRANSLATION1', 'TRANSLATION2', ...]
|
43
|
+
def get_translations(doc)
|
44
|
+
doc.css('.phrase-container > .translation').each { |translation| translations.push(translation.text.downcase) }
|
45
|
+
translations
|
46
|
+
end
|
47
|
+
|
48
|
+
# add obtained translations to Dict::Result object
|
49
|
+
def add_translations(translations)
|
50
|
+
translations.each { |translation| @result.add_translation(@result.term, translation) }
|
51
|
+
end
|
52
|
+
|
53
|
+
# returns array with structure as shown below from the given dictionary link
|
54
|
+
# ['EXAMPLE1', 'EXAMPLE2', ...]
|
55
|
+
# the default length of given example is 60 characters
|
56
|
+
def get_examples(doc, lang, length = 60)
|
57
|
+
doc.css(".tranlastionMemory td[lang=#{lang}]").each { |example| examples.push(example.text.capitalize) if example.text.length < length }
|
58
|
+
examples
|
59
|
+
end
|
60
|
+
|
61
|
+
# add obtained examples to Dict::Result object
|
62
|
+
def add_examples(examples)
|
63
|
+
examples.each { |example| @result.add_example(@result.term, example) }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/dict/result.rb
CHANGED
data/lib/dict/version.rb
CHANGED
data/lib/dict/wiktionary.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
+
# Class fetching translations of given word from wiktionary.org.
|
4
|
+
|
3
5
|
require 'nokogiri'
|
4
6
|
require 'dict/dictionary'
|
5
7
|
|
6
8
|
module Dict
|
7
9
|
class Wiktionary < Dictionary
|
8
10
|
|
9
|
-
# Returns an Dict::Result object
|
11
|
+
# Returns an Dict::Result object.
|
10
12
|
def translate
|
11
13
|
translations.each { |item| @result.add_translation(@result.term, item) }
|
12
14
|
|
@@ -36,12 +36,12 @@ end
|
|
36
36
|
|
37
37
|
|
38
38
|
describe "get_translations" do
|
39
|
-
it "should return results from wiktionary and
|
39
|
+
it "should return results from wiktionary and glosbe for word 'słowik'" do
|
40
40
|
VCR.use_cassette('translations_slownik_cassette') do
|
41
41
|
stub_const("ARGV", ["słowik"])
|
42
42
|
runner = Dict::CLI::Runner.new
|
43
43
|
opts = runner.parse_parameters
|
44
|
-
runner.get_translations(opts, "słowik").should == {"wiktionary"=>{"słowik"=>["nightingale"]}}
|
44
|
+
runner.get_translations(opts, "słowik").should == {"wiktionary" => {"słowik" => ["nightingale"]}, "glosbe" => {"słowik" => ["nightingale", "bulbul"]}}
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -65,8 +65,8 @@ describe "get_translations" do
|
|
65
65
|
end
|
66
66
|
|
67
67
|
describe "CLI::Runner" do
|
68
|
-
HELP_MSG = "Usage: dict WORD [OPTIONS]\nSearch WORD in dict, an open source dictionary aggregator.\n\n -h, --help Display this help message\n -t, --time Set timeout in seconds. Default: 300\n -d, --dict Select desired dictionary. Available options: wiktionary\n -v, --version Information about gem, authors, license\n -c, --clean Remove examples from translation"
|
69
|
-
DICT_MSG = "Missing argument. Expected: wiktionary"
|
68
|
+
HELP_MSG = "Usage: dict WORD [OPTIONS]\nSearch WORD in dict, an open source dictionary aggregator.\n\n -h, --help Display this help message\n -t, --time Set timeout in seconds. Default: 300\n -d, --dict Select desired dictionary. Available options: wiktionary, glosbe\n -v, --version Information about gem, authors, license\n -c, --clean Remove examples from translation"
|
69
|
+
DICT_MSG = "Missing argument. Expected: wiktionary, glosbe"
|
70
70
|
TIME_MSG = "Missing argument. Expected: number of seconds"
|
71
71
|
T_MSG = "Wrong time value."
|
72
72
|
|
@@ -108,10 +108,12 @@ describe "CLI::Runner" do
|
|
108
108
|
end
|
109
109
|
|
110
110
|
it "should return string when you use --clean parameter" do
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
111
|
+
VCR.use_cassette('slowik_runner_cassette') do
|
112
|
+
stub_const("ARGV",["słowik","--clean"])
|
113
|
+
runner = Dict::CLI::Runner.new
|
114
|
+
opts = runner.parse_parameters
|
115
|
+
runner.clean_translation(opts, ARGV[0]).should == "słowik : nightingale, nightingale, bulbul"
|
116
|
+
end
|
115
117
|
end
|
116
118
|
|
117
119
|
|
data/spec/dict/lib_dict_spec.rb
CHANGED
@@ -10,16 +10,19 @@ describe Dict do
|
|
10
10
|
arr.size.should_not == 0
|
11
11
|
end
|
12
12
|
|
13
|
-
it "should return array of available services, which contains wiktionary and
|
14
|
-
Dict.available_dictionaries.should == ['wiktionary']
|
13
|
+
it "should return array of available services, which contains wiktionary and glosbe" do
|
14
|
+
Dict.available_dictionaries.should == ['wiktionary', 'glosbe']
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should return hash with translations from all dictionaries" do
|
18
18
|
wiktionary = stub(:translate => stub(:translations => {'WORD' => 'WIKTIONARY_RESULTS'}))
|
19
19
|
Dict::Wiktionary.should_receive(:new).with('WORD').and_return(wiktionary)
|
20
20
|
|
21
|
+
glosbe = stub(:translate => stub(:translations => {'WORD' => 'GLOSBE_RESULTS'}))
|
22
|
+
Dict::Glosbe.should_receive(:new).with('WORD').and_return(glosbe)
|
23
|
+
|
21
24
|
results = Dict::get_all_dictionaries_translations('WORD')
|
22
|
-
results.should == {'wiktionary' => {'WORD' => 'WIKTIONARY_RESULTS'}}
|
25
|
+
results.should == {'wiktionary' => {'WORD' => 'WIKTIONARY_RESULTS'}, 'glosbe' => {'WORD' => 'GLOSBE_RESULTS'}}
|
23
26
|
end
|
24
27
|
|
25
28
|
it "should return whatever Wiktionary returns embedded in a hash" do
|
@@ -27,4 +30,10 @@ describe Dict do
|
|
27
30
|
Dict::Wiktionary.should_receive(:new).with('WORD').and_return(wiktionary)
|
28
31
|
Dict.get_single_dictionary_translations('WORD', 'wiktionary').should == 'WIKTIONARY_RESULTS'
|
29
32
|
end
|
33
|
+
|
34
|
+
it "should return whatever Glosbe returns embedded in a hash" do
|
35
|
+
glosbe = stub(:translate => stub( :translations => 'GLOSBE_RESULTS'))
|
36
|
+
Dict::Glosbe.should_receive(:new).with('WORD').and_return(glosbe)
|
37
|
+
Dict.get_single_dictionary_translations('WORD', 'glosbe').should == 'GLOSBE_RESULTS'
|
38
|
+
end
|
30
39
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*
|
2
|
+
|
3
|
+
require_relative './vcr_setup'
|
4
|
+
require 'dict/glosbe'
|
5
|
+
|
6
|
+
describe Dict::Glosbe do
|
7
|
+
|
8
|
+
it "should raise no given word exception" do
|
9
|
+
expect { Dict::Glosbe.new }.to raise_error ArgumentError
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return a Result object" do
|
13
|
+
VCR.use_cassette('glosbe_translations_woda_cassette') do
|
14
|
+
g = Dict::Glosbe.new('woda').translate
|
15
|
+
g.should be_a(Dict::Result)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should return translations of polish word 'woda' to english with its examples" do
|
20
|
+
VCR.use_cassette('glosbe_translations_woda_cassette') do
|
21
|
+
g = Dict::Glosbe.new('woda').translate
|
22
|
+
g.translations.should == {"woda"=>["water", "aqua"]}
|
23
|
+
g.examples.should == {"woda"=>["Details of food and water quality", "Mineral waters, soft drinks and juices (nd", "Fishing for herring in area iia (ec waters", "Bind him, cast him into the slop- pool at low tide!"]}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return translations of english word 'atomic' to polish with its examples" do
|
28
|
+
VCR.use_cassette('glosbe_translations_atomic_cassette') do
|
29
|
+
g = Dict::Glosbe.new('atomic').translate
|
30
|
+
g.translations.should == {"atomic"=>["atomowy", "niepodzielny", "atomistyczny", "jednolity"]}
|
31
|
+
g.examples.should == {"atomic"=>["Spektrofotometr absorpcji atomowej", "Atom w lewo", "Pomiary metodą absorpcji atomowej"]}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -38,6 +38,8 @@ describe Dict::Wiktionary do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should remove html tags from translations of 'dragon' word" do
|
41
|
-
|
41
|
+
VCR.use_cassette('translations_dragon_cassette') do
|
42
|
+
Dict::Wiktionary.new("dragon").translate.translations.should eq({'dragon' => ['smok']})
|
43
|
+
end
|
42
44
|
end
|
43
45
|
end
|