yat 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,8 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module YandexTranslator
3
+ Options = {
4
+ :key => nil, #provide api key here
5
+ :json_path => 'https://translate.yandex.net/api/v1.5/tr.json',
6
+ :xml_path => 'https://translate.yandex.net/api/v1.5/tr'
7
+ }
8
+ end
data/lib/yat/errors.rb ADDED
@@ -0,0 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module YandexTranslator
3
+ class ReturnCodeException < Exception; end
4
+ end
@@ -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
@@ -0,0 +1,5 @@
1
+ TRANSLATOR_PATH = File.dirname(__FILE__) + "/yat/"
2
+
3
+ require TRANSLATOR_PATH + "translator"
4
+ require TRANSLATOR_PATH + "config"
5
+ require TRANSLATOR_PATH + "errors"
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: []