yat 0.0.4 → 0.5.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.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/Rakefile +7 -0
- data/bin/yat +25 -46
- data/lib/parsers/json_parser.rb +14 -0
- data/lib/parsers/xml_parser.rb +40 -0
- data/lib/yat.rb +125 -1
- data/lib/yat/config.rb +6 -3
- data/lib/yat/connection.rb +29 -0
- data/lib/yat/errors.rb +2 -4
- data/lib/yat/medium.rb +79 -0
- data/test/yat_test.rb +88 -0
- metadata +41 -8
- data/lib/yat/generic_translator.rb +0 -65
- data/lib/yat/json_translator.rb +0 -33
- data/lib/yat/xml_translator.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbcc2afae3d9016de309bd5c26b1febb13866b39
|
4
|
+
data.tar.gz: abe84701ed8d460ffc85045291566834a61072d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20edee48855c245e26da299f55934097bb6ed3a6ffd0389eb7cfa06afc0f2fe163c96ecd9e7c4f2e7f9d926c7662e3d4a3336bd27a7bc55ba3f14562fdda9554
|
7
|
+
data.tar.gz: 1e60d5975dfb2419636611e01244108b7ba4690b929f52408f8a907a2b3e13baa75695c8c5e1a2584ef75cb3ef097f6686f7c26025b3b83f5f883a28ba809392
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/bin/yat
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
|
2
|
+
require 'yat.rb'
|
4
3
|
require 'yaml'
|
5
4
|
require 'getoptlong'
|
6
5
|
|
@@ -10,6 +9,8 @@ $EXIT_OK = 0
|
|
10
9
|
$EXIT_ECMDLINE = 3
|
11
10
|
$EXIT_EFAIL = 4
|
12
11
|
|
12
|
+
# Celluloid.logger = nil
|
13
|
+
|
13
14
|
def show_help
|
14
15
|
print File.basename(__FILE__, '.rb')
|
15
16
|
puts <<-HELP
|
@@ -30,7 +31,7 @@ def show_help
|
|
30
31
|
-k KEY
|
31
32
|
|
32
33
|
--make-config [FILE] generate YAML config
|
33
|
-
-m [FILE] if FILE not given, but -c option provided, it's
|
34
|
+
-m [FILE] if FILE not given, but -c option provided, it's argument
|
34
35
|
used instead
|
35
36
|
|
36
37
|
--config FILE read in config from FILE
|
@@ -47,22 +48,9 @@ def show_help
|
|
47
48
|
|
48
49
|
end
|
49
50
|
|
50
|
-
def
|
51
|
-
|
52
|
-
res = translator.getLangs(ui: to_lang || 'en')
|
53
|
-
|
54
|
-
unless quiet
|
55
|
-
puts <<-EOF
|
56
|
-
|
57
|
-
//====================\\\\
|
58
|
-
||Supported LANGUAGES ||
|
59
|
-
\\\\====================//
|
60
|
-
|
61
|
-
EOF
|
62
|
-
end
|
63
|
-
|
51
|
+
def get_languages(translator, quiet, to_lang)
|
52
|
+
res = translator.get_languages(ui: to_lang || 'en')
|
64
53
|
res["langs"].each { |short, long| puts "#{short}=>#{long} " }
|
65
|
-
exit($EXIT_OK)
|
66
54
|
end
|
67
55
|
|
68
56
|
begin
|
@@ -84,7 +72,7 @@ begin
|
|
84
72
|
config_file = nil
|
85
73
|
new_config = nil
|
86
74
|
|
87
|
-
opts.each { |opt, arg|
|
75
|
+
opts.each { |opt, arg|
|
88
76
|
case opt
|
89
77
|
when '--help'
|
90
78
|
show_help
|
@@ -110,53 +98,44 @@ begin
|
|
110
98
|
YandexTranslator.configuration.api_key = key unless key.nil?
|
111
99
|
else
|
112
100
|
YandexTranslator.configure.api_key = key
|
101
|
+
|
113
102
|
end
|
103
|
+
|
104
|
+
raise GetoptLong::MissingArgument, "Please, specify api key" if YandexTranslator.configuration.api_key.nil?
|
114
105
|
|
115
106
|
if make_config
|
116
107
|
Dir.mkdir(new_config_dir) unless new_config.nil? || Dir.exist?(new_config_dir = File.dirname(new_config))
|
117
|
-
|
108
|
+
|
109
|
+
new_config = config_file if new_config.nil? || new_config.empty?
|
110
|
+
|
118
111
|
File.open(new_config || config_file, "w") { |file|
|
119
112
|
file.write(YAML.dump(YandexTranslator.configuration))
|
120
113
|
}
|
121
114
|
end
|
122
115
|
|
123
|
-
|
124
|
-
|
125
|
-
if list_languages
|
126
|
-
list_languages(translator, quiet, to_lang)
|
127
|
-
end
|
128
|
-
|
129
|
-
if to_lang.nil?
|
116
|
+
if to_lang.nil? && !list_languages
|
130
117
|
raise GetoptLong::MissingArgument, "Please, specify language for output"
|
131
118
|
end
|
132
119
|
|
120
|
+
translator = YandexTranslator::Yat.new
|
121
|
+
if list_languages
|
122
|
+
get_languages(translator, quiet, to_lang)
|
123
|
+
exit($EXIT_OK)
|
124
|
+
end
|
125
|
+
|
133
126
|
str = String.new
|
134
127
|
|
135
128
|
ARGF.each_line do |line|
|
136
|
-
|
137
|
-
str, line = str + line[0, CHUNK_SIZE], line[CHUNK_SIZE - str.length, line.length]
|
138
|
-
$stdout << translator.translate(text: str, lang: to_lang)
|
139
|
-
str.clear
|
140
|
-
end
|
141
|
-
str += line
|
129
|
+
$stdout << translator.translate(text: line, lang: to_lang)["text"]
|
142
130
|
end
|
143
|
-
$stdout << translator.translate(text: str, lang: to_lang) unless str.empty?
|
144
131
|
|
145
|
-
rescue GetoptLong::MissingArgument, GetoptLong::InvalidOption
|
146
|
-
$stderr.puts
|
132
|
+
rescue GetoptLong::MissingArgument, GetoptLong::InvalidOption => exc
|
133
|
+
$stderr.puts exc.message
|
147
134
|
show_help
|
148
135
|
exit($EXIT_ECMDLINE)
|
149
136
|
|
150
|
-
rescue
|
151
|
-
$stderr.puts "Error: #{exc.message}"
|
152
|
-
exit($EXIT_EFAIL)
|
153
|
-
|
154
|
-
rescue YandexTranslator::ApiFunctionNotSupported => exc
|
155
|
-
$stderr.puts "Error: #{exc.message}"
|
156
|
-
exit($EXIT_EFAIL)
|
157
|
-
|
158
|
-
rescue YandexTranslator::NoApiKey => exc
|
159
|
-
$stderr.puts "Error: #{exc.message}"
|
137
|
+
rescue Celluloid::TaskTerminated => exc
|
138
|
+
$stderr.puts "!Error: #{exc.message}"
|
160
139
|
exit($EXIT_EFAIL)
|
161
140
|
|
162
141
|
rescue Errno::ENOENT => exc
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module YandexTranslator
|
4
|
+
class JSONParser
|
5
|
+
include Celluloid
|
6
|
+
include Celluloid::Notifications
|
7
|
+
|
8
|
+
def parse(text, index)
|
9
|
+
response = JSON.parse(text)
|
10
|
+
response["text"] = response["text"].inject {|elm, sum| elm + sum} if response["text"].is_a? Array
|
11
|
+
publish(:parsing_done, response, index)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
|
3
|
+
module YandexTranslator
|
4
|
+
class XMLParser
|
5
|
+
include Celluloid
|
6
|
+
include Celluloid::Notifications
|
7
|
+
include REXML
|
8
|
+
|
9
|
+
def parse(text, index)
|
10
|
+
xmldoc = REXML::Document.new(text)
|
11
|
+
response = Hash.new
|
12
|
+
|
13
|
+
if error = xmldoc.elements["Error"]
|
14
|
+
response["code"] = error.attributes['code'].to_i
|
15
|
+
response["message"] = error.attributes['message']
|
16
|
+
end
|
17
|
+
|
18
|
+
unless (element = xmldoc.elements["Langs/dirs"]).nil?
|
19
|
+
response["dirs"] = element.collect { |e|
|
20
|
+
e.text
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
unless (element = xmldoc.root.attributes["lang"]).nil?
|
25
|
+
response["lang"] = element
|
26
|
+
end
|
27
|
+
unless (element = xmldoc.elements["Langs/langs"]).nil?
|
28
|
+
response["langs"] = Hash.new
|
29
|
+
element.each { |e|
|
30
|
+
response["langs"][e.attributes["key"]] = e.attributes["value"]
|
31
|
+
}
|
32
|
+
end
|
33
|
+
unless (element = xmldoc.elements["Translation/text"]).nil?
|
34
|
+
response["text"] = element.text
|
35
|
+
end
|
36
|
+
|
37
|
+
publish(:parsing_done, response, index)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/yat.rb
CHANGED
@@ -1,5 +1,129 @@
|
|
1
1
|
TRANSLATOR_PATH = File.dirname(__FILE__) + "/yat/"
|
2
|
+
PARSER_PATH = File.dirname(__FILE__) + "/parsers/"
|
2
3
|
|
3
|
-
|
4
|
+
require TRANSLATOR_PATH + "medium"
|
4
5
|
require TRANSLATOR_PATH + "config"
|
5
6
|
require TRANSLATOR_PATH + "errors"
|
7
|
+
require TRANSLATOR_PATH + "connection"
|
8
|
+
require PARSER_PATH + "json_parser"
|
9
|
+
require PARSER_PATH + "xml_parser"
|
10
|
+
|
11
|
+
require 'celluloid/current'
|
12
|
+
require 'celluloid/logging'
|
13
|
+
|
14
|
+
module YandexTranslator
|
15
|
+
class Yat
|
16
|
+
include Celluloid
|
17
|
+
include Celluloid::Notifications
|
18
|
+
include Celluloid::Internals::Logger
|
19
|
+
|
20
|
+
finalizer :finalize
|
21
|
+
trap_exit :ambulance
|
22
|
+
|
23
|
+
def ambulance(actor, reason)
|
24
|
+
warn "#{actor.inspect} died because of #{reason.inspect}" unless reason.nil?
|
25
|
+
signal :return
|
26
|
+
end
|
27
|
+
|
28
|
+
def finalize
|
29
|
+
@parse_loop.terminate
|
30
|
+
@translator.terminate if @translator.alive?
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(format = :json)
|
34
|
+
subscribe(:translator_ready, :__receive_responses)
|
35
|
+
subscribe(:parsing_done, :__return_responses)
|
36
|
+
|
37
|
+
@format = format
|
38
|
+
@responses_num = 0
|
39
|
+
@counter = 0
|
40
|
+
@translator = YandexTranslator::Medium.new_link
|
41
|
+
@parse_loop = self.async.parse_loop
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_loop
|
45
|
+
loop do
|
46
|
+
responses = wait :got_responses
|
47
|
+
responses.each.with_index { |response, index| parser.async.parse(response.body, index) }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def translate(params)
|
52
|
+
unless params[:text]
|
53
|
+
error "wrong or missing parameters: ':text'"
|
54
|
+
return nil
|
55
|
+
end
|
56
|
+
unless params[:lang]
|
57
|
+
error "wrong or missing parameters: ':lang'"
|
58
|
+
return nil
|
59
|
+
end
|
60
|
+
|
61
|
+
@result = []
|
62
|
+
@translator.async.translate(@format, params)
|
63
|
+
wait :return
|
64
|
+
res = Hash.new("")
|
65
|
+
res = @result.shift
|
66
|
+
|
67
|
+
if @result
|
68
|
+
@result.each do |hash|
|
69
|
+
res["text"] += hash["text"]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
res
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_languages(params = nil)
|
76
|
+
@result = []
|
77
|
+
params ||= Hash.new
|
78
|
+
@translator.async.getLangs(@format, params)
|
79
|
+
wait :return
|
80
|
+
@result.shift
|
81
|
+
end
|
82
|
+
|
83
|
+
def detect(params)
|
84
|
+
unless params[:text]
|
85
|
+
error "text parameter missing"
|
86
|
+
return nil
|
87
|
+
end
|
88
|
+
|
89
|
+
@result = []
|
90
|
+
@translator.async.detect(@format, params)
|
91
|
+
wait :return
|
92
|
+
@result = @result.shift if @result.size == 1
|
93
|
+
@result
|
94
|
+
end
|
95
|
+
|
96
|
+
def parser
|
97
|
+
case @format
|
98
|
+
when :json
|
99
|
+
JSONParser.new_link
|
100
|
+
when :xml
|
101
|
+
XMLParser.new_link
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def __return_responses(topic, response, index)
|
106
|
+
|
107
|
+
if response["message"]
|
108
|
+
error response["message"]
|
109
|
+
@result.push nil
|
110
|
+
signal :return
|
111
|
+
return
|
112
|
+
end
|
113
|
+
|
114
|
+
@counter += 1
|
115
|
+
@result[index] = response
|
116
|
+
|
117
|
+
if @counter == @responses_num
|
118
|
+
@responses_num = @counter = 0
|
119
|
+
signal :return
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def __receive_responses(topic, responses)
|
124
|
+
@responses_num = responses.length
|
125
|
+
signal :got_responses, responses
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
data/lib/yat/config.rb
CHANGED
@@ -9,12 +9,15 @@ module YandexTranslator
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class Configuration
|
12
|
-
attr_accessor :api_key, :xml_path, :json_path
|
12
|
+
attr_accessor :api_key, :xml_path, :json_path, :host, :port, :chunk_size, :maximum_requests
|
13
13
|
|
14
14
|
def initialize
|
15
|
+
@chunk_size = 10000
|
16
|
+
@maximum_requests = 10
|
15
17
|
@api_key = nil
|
16
|
-
@
|
17
|
-
@
|
18
|
+
@host = "https://translate.yandex.net"
|
19
|
+
@json_path = '/api/v1.5/tr.json'
|
20
|
+
@xml_path = '/api/v1.5/tr'
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'celluloid/current'
|
3
|
+
|
4
|
+
module YandexTranslator
|
5
|
+
|
6
|
+
class Connection
|
7
|
+
include Celluloid
|
8
|
+
include Celluloid::Notifications
|
9
|
+
|
10
|
+
# finalizer :finalize
|
11
|
+
|
12
|
+
# def finalize
|
13
|
+
# p "connection dead!"
|
14
|
+
# end
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
uri = URI(YandexTranslator::configuration.host)
|
18
|
+
@session = Net::HTTP.start(uri.host, uri.port,
|
19
|
+
:use_ssl => uri.scheme == 'https')
|
20
|
+
end
|
21
|
+
|
22
|
+
def request(uri, request_index, params = nil)
|
23
|
+
response = @session.request(Net::HTTP::Post.new(uri),
|
24
|
+
req = URI.encode_www_form(params || {}))
|
25
|
+
|
26
|
+
publish(:connection_response, request_index, response)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/yat/errors.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module YandexTranslator
|
3
|
-
class ReturnCodeException <
|
4
|
-
class
|
5
|
-
class NoApiKey < Exception; end
|
2
|
+
class ReturnCodeException < StandardError; end
|
3
|
+
class NoApiKey < StandardError; end
|
6
4
|
end
|
data/lib/yat/medium.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'celluloid/current'
|
2
|
+
|
3
|
+
module YandexTranslator
|
4
|
+
class Medium
|
5
|
+
include Celluloid
|
6
|
+
include Celluloid::Notifications
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
subscribe(:connection_response, :stash_response)
|
10
|
+
|
11
|
+
@responses = Array.new
|
12
|
+
@response_num = 0
|
13
|
+
@request_index = 0
|
14
|
+
@request_max = YandexTranslator::configuration.maximum_requests
|
15
|
+
end
|
16
|
+
|
17
|
+
[:getLangs, :translate, :detect].each do |method|
|
18
|
+
define_method(method) do |format, params|
|
19
|
+
|
20
|
+
if params && params.has_key?(:text) && params[:text].length > 0
|
21
|
+
@request_estimate = (
|
22
|
+
Float(params[:text].length) /
|
23
|
+
YandexTranslator.configuration.chunk_size
|
24
|
+
).ceil
|
25
|
+
|
26
|
+
split_input(params[:text]).each { |chunk|
|
27
|
+
params[:text] = chunk
|
28
|
+
request(__method__, format, params)
|
29
|
+
}
|
30
|
+
else
|
31
|
+
@request_estimate = 1
|
32
|
+
request(__method__, format, params)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def stash_response(topic, index, response)
|
38
|
+
signal :continue
|
39
|
+
|
40
|
+
@responses[index] = response
|
41
|
+
@response_num += 1
|
42
|
+
|
43
|
+
if @response_num == @request_estimate
|
44
|
+
publish(:translator_ready, @responses)
|
45
|
+
@request_index = @response_num = 0
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
def request(function, format, params)
|
51
|
+
raise ArgumentError, "wrong format: #{format}" unless (YandexTranslator::configuration.instance_eval("#{format}_path") rescue nil)
|
52
|
+
raise NoApiKey, "provide api key" if (key = YandexTranslator::configuration.api_key).nil?
|
53
|
+
|
54
|
+
params[:key] = YandexTranslator::configuration.api_key
|
55
|
+
|
56
|
+
uri = URI(YandexTranslator::configuration.instance_eval("host + #{format}_path"))
|
57
|
+
uri.path += "/#{function}"
|
58
|
+
|
59
|
+
if @request_index - @response_num == @request_max
|
60
|
+
wait :continue
|
61
|
+
end
|
62
|
+
|
63
|
+
Connection.new_link.async.request(uri, @request_index, params)
|
64
|
+
@request_index += 1
|
65
|
+
end
|
66
|
+
|
67
|
+
def split_input(input)
|
68
|
+
str = String.new
|
69
|
+
chunks = Array.new
|
70
|
+
chunk_size = YandexTranslator::configuration.chunk_size
|
71
|
+
while str.length + input.length > chunk_size
|
72
|
+
str = input.slice!(0, chunk_size)
|
73
|
+
chunks << str.dup
|
74
|
+
str.clear
|
75
|
+
end
|
76
|
+
chunks << input.dup unless input.nil?
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/test/yat_test.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require_relative '../lib/yat'
|
2
|
+
require 'celluloid/test'
|
3
|
+
require 'rspec'
|
4
|
+
|
5
|
+
raise "provide api key through env variable TRANSLATOR_KEY" if ENV['TRANSLATOR_KEY'].nil?
|
6
|
+
|
7
|
+
Celluloid.logger = nil
|
8
|
+
UNSUPPORTED_LANGUAGE = 'zz'
|
9
|
+
|
10
|
+
YandexTranslator::configure { |config|
|
11
|
+
config.api_key = ENV['TRANSLATOR_KEY']
|
12
|
+
}
|
13
|
+
|
14
|
+
shared_examples 'failures' do |translator_format|
|
15
|
+
around(:each) do |example|
|
16
|
+
Celluloid.boot
|
17
|
+
@translator = YandexTranslator::Yat.new(translator_format)
|
18
|
+
example.run
|
19
|
+
@translator.terminate
|
20
|
+
Celluloid.shutdown
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should fail on wrong api key' do
|
24
|
+
key = 'worng_api_key'
|
25
|
+
key, YandexTranslator::configuration.api_key = YandexTranslator::configuration.api_key, key
|
26
|
+
|
27
|
+
expect(@translator.get_languages).to be_nil
|
28
|
+
expect(@translator.detect(text: "test")).to be_nil
|
29
|
+
expect(@translator.translate(text: "test", lang: "ru")).to be_nil
|
30
|
+
YandexTranslator::configuration.api_key = key
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should fail on #detect call without :text specified' do
|
34
|
+
expect(@translator.detect({})).to be_nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should fail on #translate call without :text specified' do
|
38
|
+
expect(@translator.translate(lang: "ru")).to be_nil
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should fail on #translate call without :lang specified' do
|
42
|
+
expect(@translator.translate(text: "test text")).to be_nil
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should return error on #translate if unsupported language given' do
|
46
|
+
expect(@translator.translate(text: "test text",
|
47
|
+
lang: UNSUPPORTED_LANGUAGE)).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
shared_examples 'expected behavior' do |translator_format|
|
53
|
+
# around(:each) do |ex|
|
54
|
+
# Celluloid.boot
|
55
|
+
# @translator = YandexTranslator::Yat.new(translator_format)
|
56
|
+
# ex.run
|
57
|
+
# @translator.terminate
|
58
|
+
# Celluloid.shutdown
|
59
|
+
# end
|
60
|
+
it 'should return translation directions array' do
|
61
|
+
expect((@translator.get_languages["dirs"])).to_not be_empty
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should return translation directions array along with langs hash' do
|
65
|
+
expect(@translator.get_languages(ui: "ru")["langs"]).to_not be_empty
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should return lang on #detect' do
|
69
|
+
expect(@translator.detect(text: "test")["lang"]).to eq('en')
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should return 'test text' on #translate" do
|
73
|
+
expect(@translator.translate(text: 'тестовый текст', lang: 'en')["text"]).to \
|
74
|
+
eq('test text')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "translator, xml format" do
|
79
|
+
translator_format = :xml
|
80
|
+
include_examples 'failures', translator_format
|
81
|
+
include_examples 'expected behavior', translator_format
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "translator, json format" do
|
85
|
+
translator_format = :json
|
86
|
+
include_examples 'failures', translator_format
|
87
|
+
include_examples 'expected behavior', translator_format
|
88
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,61 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- enoch0x5a
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 2015-08-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: celluloid
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.17.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.17.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.3.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 3.3.0
|
41
|
+
description: translates using yandex translator api
|
14
42
|
email:
|
15
43
|
executables:
|
16
44
|
- yat
|
17
45
|
extensions: []
|
18
46
|
extra_rdoc_files: []
|
19
47
|
files:
|
48
|
+
- Gemfile
|
49
|
+
- Rakefile
|
20
50
|
- bin/yat
|
51
|
+
- lib/parsers/json_parser.rb
|
52
|
+
- lib/parsers/xml_parser.rb
|
21
53
|
- lib/yat.rb
|
22
54
|
- lib/yat/config.rb
|
55
|
+
- lib/yat/connection.rb
|
23
56
|
- lib/yat/errors.rb
|
24
|
-
- lib/yat/
|
25
|
-
-
|
26
|
-
- lib/yat/xml_translator.rb
|
57
|
+
- lib/yat/medium.rb
|
58
|
+
- test/yat_test.rb
|
27
59
|
homepage:
|
28
60
|
licenses:
|
29
61
|
- MIT
|
@@ -48,4 +80,5 @@ rubygems_version: 2.4.5
|
|
48
80
|
signing_key:
|
49
81
|
specification_version: 4
|
50
82
|
summary: yet another yandex translator
|
51
|
-
test_files:
|
83
|
+
test_files:
|
84
|
+
- test/yat_test.rb
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
|
3
|
-
module YandexTranslator
|
4
|
-
|
5
|
-
class GenericTranslator
|
6
|
-
attr_reader :response
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@response = nil
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
def method_missing(api_function, *args)
|
14
|
-
@response = make_request(api_function, *args)
|
15
|
-
|
16
|
-
if @response.code == '404'
|
17
|
-
raise YandexTranslator::ApiFunctionNotSupported, "#{api_function}"
|
18
|
-
else
|
19
|
-
GenericTranslator.send(:define_method, api_function) do |*args|
|
20
|
-
make_request(__method__, *args)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
@response
|
24
|
-
end
|
25
|
-
|
26
|
-
protected
|
27
|
-
def make_request(function, format, params = nil)
|
28
|
-
raise ArgumentError, "wrong format: #{format}" if YandexTranslator::configuration.instance_eval("#{format}_path").nil?
|
29
|
-
|
30
|
-
raise NoApiKey, "provide api key" if (key = YandexTranslator::configuration.api_key).nil?
|
31
|
-
|
32
|
-
params[:key] = key
|
33
|
-
|
34
|
-
uri = URI(YandexTranslator::configuration.instance_eval("#{format}_path"))
|
35
|
-
uri.path += "/#{function}"
|
36
|
-
|
37
|
-
Net::HTTP.start(uri.host, uri.port,
|
38
|
-
:use_ssl => uri.scheme == 'https') do |https|
|
39
|
-
request = Net::HTTP::Post.new(uri)
|
40
|
-
@response = https.request(request, URI.encode_www_form(params))
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def error_check(return_code)
|
45
|
-
unless return_code.nil? || return_code == 200
|
46
|
-
raise YandexTranslator::ReturnCodeException, case return_code.to_i
|
47
|
-
when 401
|
48
|
-
"401: wrong api key"
|
49
|
-
when 402
|
50
|
-
"402: api key blocked"
|
51
|
-
when 403
|
52
|
-
"403: daily request limit exceeded"
|
53
|
-
when 404
|
54
|
-
"404: daily text volume limit exceeded"
|
55
|
-
when 413
|
56
|
-
"413: text size too big"
|
57
|
-
when 422
|
58
|
-
"422: unable to translate"
|
59
|
-
when 501
|
60
|
-
"501: translation direction is not supported"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end # class GenericTranslator
|
65
|
-
end
|
data/lib/yat/json_translator.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module YandexTranslator
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
class JSONTranslator < GenericTranslator
|
5
|
-
|
6
|
-
def getLangs(params = nil)
|
7
|
-
response = super(:json, params)
|
8
|
-
response = JSON.parse(response.body)
|
9
|
-
error_check(response["code"])
|
10
|
-
response
|
11
|
-
end
|
12
|
-
|
13
|
-
def detect(params)
|
14
|
-
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
15
|
-
|
16
|
-
response = super(:json, params)
|
17
|
-
response = JSON.parse(response.body)
|
18
|
-
error_check(response["code"])
|
19
|
-
response["lang"]
|
20
|
-
end
|
21
|
-
|
22
|
-
def translate(params)
|
23
|
-
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
24
|
-
raise ArgumentError, "lang parameter not specified" unless params.has_key?(:lang)
|
25
|
-
|
26
|
-
response = super(:json, params)
|
27
|
-
response = JSON.parse(response.body)
|
28
|
-
error_check(response["code"])
|
29
|
-
return response["text"].inject {|elm, sum| elm + sum} if response["text"].is_a? Array
|
30
|
-
response["text"]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/yat/xml_translator.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
module YandexTranslator
|
2
|
-
require 'rexml/document'
|
3
|
-
include REXML
|
4
|
-
|
5
|
-
class XMLTranslator < GenericTranslator
|
6
|
-
|
7
|
-
def getLangs(params = nil)
|
8
|
-
|
9
|
-
response = super(:xml, params)
|
10
|
-
|
11
|
-
xmldoc = REXML::Document.new(response.body)
|
12
|
-
|
13
|
-
if error = xmldoc.elements["Error"]
|
14
|
-
error_check(error.attributes['code'])
|
15
|
-
end
|
16
|
-
|
17
|
-
response = Hash.new
|
18
|
-
response["dirs"] = xmldoc.elements["Langs/dirs"].collect { |e|
|
19
|
-
e.text
|
20
|
-
}
|
21
|
-
unless (langs = xmldoc.elements["Langs/langs"]).nil?
|
22
|
-
response["langs"] = Hash.new
|
23
|
-
langs.each {|e|
|
24
|
-
response["langs"][e.attributes["key"]] = e.attributes["value"]
|
25
|
-
}
|
26
|
-
end
|
27
|
-
response
|
28
|
-
end
|
29
|
-
|
30
|
-
def detect(params)
|
31
|
-
|
32
|
-
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
33
|
-
|
34
|
-
response = super(:xml, params)
|
35
|
-
xmldoc = REXML::Document.new(response.body)
|
36
|
-
|
37
|
-
if error = xmldoc.elements["Error"]
|
38
|
-
error_check(error.attributes['code'])
|
39
|
-
end
|
40
|
-
|
41
|
-
xmldoc.root.attributes["lang"]
|
42
|
-
end
|
43
|
-
|
44
|
-
def translate(params)
|
45
|
-
|
46
|
-
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
47
|
-
raise ArgumentError, "lang parameter not specified" unless params.has_key?(:lang)
|
48
|
-
|
49
|
-
response = super(:xml, params)
|
50
|
-
xmldoc = REXML::Document.new(response.body)
|
51
|
-
|
52
|
-
if error = xmldoc.elements["Error"]
|
53
|
-
error_check(error.attributes['code'])
|
54
|
-
end
|
55
|
-
|
56
|
-
xmldoc.elements["Translation/text"].text
|
57
|
-
end
|
58
|
-
end # class XMLTranslator
|
59
|
-
end
|