yat 0.0.3
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 +7 -0
- data/bin/yat +117 -0
- data/lib/yat/config.rb +8 -0
- data/lib/yat/errors.rb +4 -0
- data/lib/yat/translator.rb +172 -0
- data/lib/yat.rb +5 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6d9ac485a32e21092023db6223824c31061853e7
|
4
|
+
data.tar.gz: ae447c73702dd6a023ef828382e62dee0e617cee
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cb0a7c7d198b66e41aefe49507c75972045c50ef794812aa3d2b0949e78650503bb55d3c4177c1b618a0085a6bf64b722607dc71eba38b0798029a7f2733c6f2
|
7
|
+
data.tar.gz: f426a61787f20eb9d313b7f07ad0b34c20dd77c7cc7b293cf96b6846cad9aea9d605707ede419cce113a0760fac28ca2c899317adf1fdd3be33170ad4dec21b6
|
data/bin/yat
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
require_relative "../lib/yat.rb"
|
4
|
+
|
5
|
+
require 'getoptlong'
|
6
|
+
|
7
|
+
$CHUNK_SIZE = 10000
|
8
|
+
|
9
|
+
$EXIT_OK = 0
|
10
|
+
$EXIT_CMDLINE = 3
|
11
|
+
$EXIT_FAIL = 4
|
12
|
+
|
13
|
+
raise "provide api key in lib/config.rb file" if YandexTranslator::Options[:key].nil?
|
14
|
+
|
15
|
+
def show_help
|
16
|
+
print File.basename(__FILE__, '.rb')
|
17
|
+
puts <<-HELP
|
18
|
+
[OPTIONS] file1 .. fileN
|
19
|
+
|
20
|
+
OPTIONS:
|
21
|
+
--help print this out
|
22
|
+
-h
|
23
|
+
|
24
|
+
--to LANGUAGE to translate to (e.g. "ru")
|
25
|
+
|
26
|
+
--list-languages prints list of supported languages
|
27
|
+
-l --to can be specified to get languages translations
|
28
|
+
|
29
|
+
NOTICE:
|
30
|
+
LANGUAGE must be one of https://translate.yandex.ru supported languages
|
31
|
+
abbreviations.
|
32
|
+
|
33
|
+
HELP
|
34
|
+
end
|
35
|
+
|
36
|
+
def list_languages(translator, quiet)
|
37
|
+
|
38
|
+
raise ArgumentError,
|
39
|
+
"list_languages: #{__FILE__}: #{__LINE__}" \
|
40
|
+
"wrong argument: #{translator}" \
|
41
|
+
unless translator.kind_of? YandexTranslator::GenericTranslator
|
42
|
+
|
43
|
+
res = translator.getLangs(ui: to_lang || 'en')
|
44
|
+
|
45
|
+
unless quiet
|
46
|
+
puts <<-EOF
|
47
|
+
|
48
|
+
//====================\\\\
|
49
|
+
||Supported LANGUAGES ||
|
50
|
+
\\\\====================//
|
51
|
+
|
52
|
+
EOF
|
53
|
+
end
|
54
|
+
|
55
|
+
res["langs"].each { |short, long| puts "#{short}=>#{long} " }
|
56
|
+
exit($EXIT_OK)
|
57
|
+
end
|
58
|
+
|
59
|
+
begin
|
60
|
+
opts = GetoptLong.new(
|
61
|
+
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
62
|
+
[ '--to', GetoptLong::REQUIRED_ARGUMENT],
|
63
|
+
[ '--list-languages', '-l', GetoptLong::NO_ARGUMENT],
|
64
|
+
[ '--quiet', '-q', GetoptLong::NO_ARGUMENT]
|
65
|
+
)
|
66
|
+
|
67
|
+
to_lang = nil
|
68
|
+
list_languages = false
|
69
|
+
quiet = false
|
70
|
+
|
71
|
+
opts.each { |opt, arg|
|
72
|
+
case opt
|
73
|
+
when '--help'
|
74
|
+
show_help
|
75
|
+
exit($EXIT_OK)
|
76
|
+
when '--list-languages'
|
77
|
+
list_languages = true
|
78
|
+
when '--to'
|
79
|
+
to_lang = arg
|
80
|
+
when '--quiet'
|
81
|
+
quiet = true
|
82
|
+
end
|
83
|
+
}
|
84
|
+
|
85
|
+
if to_lang.nil?
|
86
|
+
raise GetoptLong::MissingArgument, "Please, specify language for output"
|
87
|
+
end
|
88
|
+
|
89
|
+
translator = YandexTranslator::JSONTranslator.new
|
90
|
+
|
91
|
+
if list_languages
|
92
|
+
list_languages(translator, quiet)
|
93
|
+
end
|
94
|
+
|
95
|
+
str = String.new
|
96
|
+
ARGF.each_line do |line|
|
97
|
+
while str.length + line.length > $CHUNK_SIZE
|
98
|
+
str, line = str + line[0, $CHUNK_SIZE], line[$CHUNK_SIZE - str.length, line.length]
|
99
|
+
$stdout << translator.translate(text: str, lang: to_lang)
|
100
|
+
str.clear
|
101
|
+
end
|
102
|
+
str += line
|
103
|
+
end
|
104
|
+
$stdout << translator.translate(text: str, lang: to_lang) unless str.empty?
|
105
|
+
|
106
|
+
rescue GetoptLong::MissingArgument => exc
|
107
|
+
print "Error: "
|
108
|
+
puts exc.message
|
109
|
+
puts
|
110
|
+
show_help
|
111
|
+
exit($EXIT_CMDLINE)
|
112
|
+
|
113
|
+
rescue YandexTranslator::ReturnCodeException => exc
|
114
|
+
print "Error: "
|
115
|
+
puts exc.message
|
116
|
+
exit($EXIT_FAIL)
|
117
|
+
end
|
data/lib/yat/config.rb
ADDED
data/lib/yat/errors.rb
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
module YandexTranslator
|
5
|
+
FORMAT_ARRAY = [:xml, :json]
|
6
|
+
|
7
|
+
class GenericTranslator
|
8
|
+
attr_reader :response
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
require_relative 'config.rb'
|
12
|
+
end
|
13
|
+
|
14
|
+
def getLangs(return_as, params)
|
15
|
+
response = make_request(:getLangs, return_as, params)
|
16
|
+
@response = response.body
|
17
|
+
response
|
18
|
+
end
|
19
|
+
|
20
|
+
def detect(return_as, params)
|
21
|
+
response = make_request(:detect, return_as, params)
|
22
|
+
@response = response.body
|
23
|
+
response
|
24
|
+
end
|
25
|
+
|
26
|
+
def translate(return_as, params)
|
27
|
+
response = make_request(:translate, return_as, params)
|
28
|
+
@response = response.body
|
29
|
+
response
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
def make_request(function, format, params)
|
34
|
+
if not FORMAT_ARRAY.member? format
|
35
|
+
raise ArgumentError, "wrong format: #{format}"
|
36
|
+
end
|
37
|
+
key_hash = {:key => YandexTranslator::Options[:key]}
|
38
|
+
params = params.nil? ? key_hash : key_hash.merge(params)
|
39
|
+
uri = URI(Options["#{format}_path".to_sym])
|
40
|
+
uri.path += "/#{function}"
|
41
|
+
uri.query = URI.encode_www_form(params)
|
42
|
+
Net::HTTP.start(uri.host, uri.port,
|
43
|
+
:use_ssl => uri.scheme == 'https') do |https|
|
44
|
+
request = Net::HTTP::Post.new(uri)
|
45
|
+
response = https.request(request)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def error_check(return_code)
|
50
|
+
return_code = return_code.to_i if return_code.respond_to? :to_i
|
51
|
+
unless return_code.nil? && return_code == 200 #getLangs won't return 200:OK for now :_(
|
52
|
+
raise YandexTranslator::ReturnCodeException, case return_code
|
53
|
+
when 401
|
54
|
+
"401: wrong api key"
|
55
|
+
when 402
|
56
|
+
"402: api key blocked"
|
57
|
+
when 403
|
58
|
+
"403: daily request limit exceeded"
|
59
|
+
when 404
|
60
|
+
"404: daily text volume limit exceeded"
|
61
|
+
when 413
|
62
|
+
"413: text size too big"
|
63
|
+
when 422
|
64
|
+
"422: unable to translate"
|
65
|
+
when 501
|
66
|
+
"501: translation direction is not supported"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end # class GenericTranslator
|
72
|
+
|
73
|
+
require 'json'
|
74
|
+
|
75
|
+
class JSONTranslator < GenericTranslator
|
76
|
+
|
77
|
+
def getLangs(params = nil)
|
78
|
+
response = super(:json, params)
|
79
|
+
response = JSON.parse(response.body)
|
80
|
+
error_check(response["code"])
|
81
|
+
response
|
82
|
+
end
|
83
|
+
|
84
|
+
def detect(params)
|
85
|
+
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
86
|
+
|
87
|
+
response = super(:json, params)
|
88
|
+
response = JSON.parse(response.body)
|
89
|
+
error_check(response["code"])
|
90
|
+
response["lang"]
|
91
|
+
end
|
92
|
+
|
93
|
+
def translate(params)
|
94
|
+
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
95
|
+
raise ArgumentError, "lang parameter not specified" unless params.has_key?(:lang)
|
96
|
+
|
97
|
+
response = super(:json, params)
|
98
|
+
response = JSON.parse(response.body)
|
99
|
+
error_check(response["code"])
|
100
|
+
response["text"]
|
101
|
+
end
|
102
|
+
end # class JSONTranslator
|
103
|
+
|
104
|
+
require 'rexml/document'
|
105
|
+
include REXML
|
106
|
+
|
107
|
+
class XMLTranslator < GenericTranslator
|
108
|
+
|
109
|
+
def getLangs(params = nil)
|
110
|
+
|
111
|
+
response = super(:xml, params)
|
112
|
+
|
113
|
+
xmldoc = REXML::Document.new(response.body)
|
114
|
+
|
115
|
+
if error = xmldoc.elements["Error"]
|
116
|
+
error_check(error.attributes['code'])
|
117
|
+
end
|
118
|
+
|
119
|
+
response = Hash.new
|
120
|
+
response["dirs"] = xmldoc.elements["Langs/dirs"].collect { |e|
|
121
|
+
e.text
|
122
|
+
}
|
123
|
+
unless (langs = xmldoc.elements["Langs/langs"]).nil?
|
124
|
+
response["langs"] = Hash.new
|
125
|
+
langs.each {|e|
|
126
|
+
response["langs"][e.attributes["key"]] = e.attributes["value"]
|
127
|
+
}
|
128
|
+
end
|
129
|
+
response
|
130
|
+
end
|
131
|
+
|
132
|
+
def detect(params)
|
133
|
+
|
134
|
+
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
135
|
+
|
136
|
+
response = super(:xml, params)
|
137
|
+
xmldoc = REXML::Document.new(response.body)
|
138
|
+
|
139
|
+
if error = xmldoc.elements["Error"]
|
140
|
+
error_check(error.attributes['code'])
|
141
|
+
end
|
142
|
+
|
143
|
+
# response = Hash.new
|
144
|
+
# response["code"] = xmldoc.root.attributes["code"]
|
145
|
+
# response["lang"] = xmldoc.root.attributes["lang"]
|
146
|
+
|
147
|
+
# response
|
148
|
+
xmldoc.root.attributes["lang"]
|
149
|
+
end
|
150
|
+
|
151
|
+
def translate(params)
|
152
|
+
|
153
|
+
raise ArgumentError, "text parameter not specified" unless params.has_key?(:text)
|
154
|
+
raise ArgumentError, "lang parameter not specified" unless params.has_key?(:lang)
|
155
|
+
|
156
|
+
response = super(:xml, params)
|
157
|
+
xmldoc = REXML::Document.new(response.body)
|
158
|
+
|
159
|
+
if error = xmldoc.elements["Error"]
|
160
|
+
error_check(error.attributes['code'])
|
161
|
+
end
|
162
|
+
|
163
|
+
# response = Hash.new
|
164
|
+
# response["code"] = xmldoc.root.attributes["code"]
|
165
|
+
# response["lang"] = xmldoc.root.attributes["lang"]
|
166
|
+
# response["text"] = xmldoc.elements["Translation/text"].text
|
167
|
+
xmldoc.elements["Translation/text"].text
|
168
|
+
|
169
|
+
# response
|
170
|
+
end
|
171
|
+
end # class XMLTranslator
|
172
|
+
end # module YandexTranslator
|
data/lib/yat.rb
ADDED
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- enoch0x5a
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-10 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: translates text files using yandex translator api
|
14
|
+
email:
|
15
|
+
executables:
|
16
|
+
- yat
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/yat
|
21
|
+
- lib/yat.rb
|
22
|
+
- lib/yat/config.rb
|
23
|
+
- lib/yat/errors.rb
|
24
|
+
- lib/yat/translator.rb
|
25
|
+
homepage:
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.2.2
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: yet another yandex translator
|
49
|
+
test_files: []
|