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 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: []