yat 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6d9ac485a32e21092023db6223824c31061853e7
4
- data.tar.gz: ae447c73702dd6a023ef828382e62dee0e617cee
3
+ metadata.gz: c4e9cfdb16b8ab275ceff26d62dfcfb194862c84
4
+ data.tar.gz: cb74a19f8be0afe8980dcafa991dab706b90ac4c
5
5
  SHA512:
6
- metadata.gz: cb0a7c7d198b66e41aefe49507c75972045c50ef794812aa3d2b0949e78650503bb55d3c4177c1b618a0085a6bf64b722607dc71eba38b0798029a7f2733c6f2
7
- data.tar.gz: f426a61787f20eb9d313b7f07ad0b34c20dd77c7cc7b293cf96b6846cad9aea9d605707ede419cce113a0760fac28ca2c899317adf1fdd3be33170ad4dec21b6
6
+ metadata.gz: 8a6350dd4f6341b648dbdfb2bee403f87050bcb97f42db42b26a3aeb3cb7b8f79c2514c6c74d2597492df58e431f8d087e31b6dd6906113c4500094793b040cd
7
+ data.tar.gz: 41abbaef831db0abe1f688807684703dc999e63c354fc67a2ea50c47dd28ecf90884c90bf57f1cad92a301307a236952136256f5bd9d5ecd6ebfd09d33fa3b52
data/bin/yat CHANGED
@@ -1,44 +1,53 @@
1
1
  #!/usr/bin/env ruby
2
- # -*- encoding: utf-8 -*-
3
2
  require_relative "../lib/yat.rb"
4
3
 
4
+ require 'yaml'
5
5
  require 'getoptlong'
6
6
 
7
- $CHUNK_SIZE = 10000
7
+ CHUNK_SIZE = 10000
8
8
 
9
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?
10
+ $EXIT_ECMDLINE = 3
11
+ $EXIT_EFAIL = 4
14
12
 
15
13
  def show_help
16
14
  print File.basename(__FILE__, '.rb')
17
15
  puts <<-HELP
18
- [OPTIONS] file1 .. fileN
16
+ --to LANGUAGE [OPTIONS] [file1 .. fileN]
19
17
 
20
18
  OPTIONS:
21
- --help print this out
19
+ --help print this out
22
20
  -h
23
21
 
24
- --to LANGUAGE to translate to (e.g. "ru")
22
+ --quiet turns off additional output
23
+
24
+ --to LANGUAGE 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
+ --key KEY yandex translator api key
30
+ -k KEY
31
+
32
+ --make-config [FILE] generate YAML config
33
+ -m [FILE] if FILE not given, but -c option provided, it's MissingArgument
34
+ used instead
25
35
 
26
- --list-languages prints list of supported languages
27
- -l --to can be specified to get languages translations
36
+ --config FILE read in config from FILE
37
+ -c FILE
38
+
39
+ Files are optional: if none given text grabbed from standard input.
40
+ Text can be provided through piped input (e.g. `echo "test" | yat --to af`)
28
41
 
29
42
  NOTICE:
30
43
  LANGUAGE must be one of https://translate.yandex.ru supported languages
31
- abbreviations.
44
+ abbreviations. See --list-languages option.
32
45
 
33
46
  HELP
34
- end
35
47
 
36
- def list_languages(translator, quiet)
48
+ end
37
49
 
38
- raise ArgumentError,
39
- "list_languages: #{__FILE__}: #{__LINE__}" \
40
- "wrong argument: #{translator}" \
41
- unless translator.kind_of? YandexTranslator::GenericTranslator
50
+ def list_languages(translator, quiet, to_lang)
42
51
 
43
52
  res = translator.getLangs(ui: to_lang || 'en')
44
53
 
@@ -61,18 +70,32 @@ begin
61
70
  [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
62
71
  [ '--to', GetoptLong::REQUIRED_ARGUMENT],
63
72
  [ '--list-languages', '-l', GetoptLong::NO_ARGUMENT],
64
- [ '--quiet', '-q', GetoptLong::NO_ARGUMENT]
73
+ [ '--quiet', '-q', GetoptLong::NO_ARGUMENT],
74
+ [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
75
+ [ '--make-config', '-m', GetoptLong::OPTIONAL_ARGUMENT],
76
+ [ '--config', '-c', GetoptLong::REQUIRED_ARGUMENT]
65
77
  )
66
78
 
67
79
  to_lang = nil
68
80
  list_languages = false
69
81
  quiet = false
82
+ key = nil
83
+ make_config = false
84
+ config_file = nil
85
+ new_config = nil
70
86
 
71
87
  opts.each { |opt, arg|
72
88
  case opt
73
89
  when '--help'
74
90
  show_help
75
91
  exit($EXIT_OK)
92
+ when '--key'
93
+ key = arg
94
+ when '--make-config'
95
+ make_config = true
96
+ new_config = arg
97
+ when '--config'
98
+ config_file = arg
76
99
  when '--list-languages'
77
100
  list_languages = true
78
101
  when '--to'
@@ -82,20 +105,36 @@ begin
82
105
  end
83
106
  }
84
107
 
85
- if to_lang.nil?
86
- raise GetoptLong::MissingArgument, "Please, specify language for output"
108
+ unless config_file.nil?
109
+ YandexTranslator.configuration = YAML.load(File.read(config_file))
110
+ YandexTranslator.configuration.api_key = key unless key.nil?
111
+ else
112
+ YandexTranslator.configure.api_key = key
113
+ end
114
+
115
+ if make_config
116
+ Dir.mkdir(new_config_dir) unless new_config.nil? || Dir.exist?(new_config_dir = File.dirname(new_config))
117
+ new_config == '-' || new_config = config_file
118
+ File.open(new_config || config_file, "w") { |file|
119
+ file.write(YAML.dump(YandexTranslator.configuration))
120
+ }
87
121
  end
88
122
 
89
123
  translator = YandexTranslator::JSONTranslator.new
90
124
 
91
125
  if list_languages
92
- list_languages(translator, quiet)
126
+ list_languages(translator, quiet, to_lang)
93
127
  end
94
128
 
129
+ if to_lang.nil?
130
+ raise GetoptLong::MissingArgument, "Please, specify language for output"
131
+ end
132
+
95
133
  str = String.new
134
+
96
135
  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]
136
+ while str.length + line.length > CHUNK_SIZE
137
+ str, line = str + line[0, CHUNK_SIZE], line[CHUNK_SIZE - str.length, line.length]
99
138
  $stdout << translator.translate(text: str, lang: to_lang)
100
139
  str.clear
101
140
  end
@@ -103,15 +142,24 @@ begin
103
142
  end
104
143
  $stdout << translator.translate(text: str, lang: to_lang) unless str.empty?
105
144
 
106
- rescue GetoptLong::MissingArgument => exc
107
- print "Error: "
108
- puts exc.message
109
- puts
145
+ rescue GetoptLong::MissingArgument, GetoptLong::InvalidOption
146
+ $stderr.puts
110
147
  show_help
111
- exit($EXIT_CMDLINE)
148
+ exit($EXIT_ECMDLINE)
112
149
 
113
150
  rescue YandexTranslator::ReturnCodeException => exc
114
- print "Error: "
115
- puts exc.message
116
- exit($EXIT_FAIL)
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}"
160
+ exit($EXIT_EFAIL)
161
+
162
+ rescue Errno::ENOENT => exc
163
+ $stderr.puts exc.message
164
+ exit($EXIT_ECMDLINE)
117
165
  end
data/lib/yat.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  TRANSLATOR_PATH = File.dirname(__FILE__) + "/yat/"
2
2
 
3
- require TRANSLATOR_PATH + "translator"
3
+ ['generic', 'json', 'xml'].each { |f| require TRANSLATOR_PATH + "#{f}_translator" }
4
4
  require TRANSLATOR_PATH + "config"
5
5
  require TRANSLATOR_PATH + "errors"
data/lib/yat/config.rb CHANGED
@@ -1,8 +1,21 @@
1
- # -*- encoding: utf-8 -*-
2
1
  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
- }
2
+ class << self
3
+ attr_accessor :configuration
4
+ end
5
+
6
+ def self.configure
7
+ self.configuration ||= Configuration.new
8
+ yield(self.configuration) rescue self.configuration
9
+ end
10
+
11
+ class Configuration
12
+ attr_accessor :api_key, :xml_path, :json_path
13
+
14
+ def initialize
15
+ @api_key = nil
16
+ @json_path = 'https://translate.yandex.net/api/v1.5/tr.json'
17
+ @xml_path = 'https://translate.yandex.net/api/v1.5/tr'
18
+ end
19
+ end
20
+
8
21
  end
data/lib/yat/errors.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module YandexTranslator
3
3
  class ReturnCodeException < Exception; end
4
+ class ApiFunctionNotSupported < Exception; end
5
+ class NoApiKey < Exception; end
4
6
  end
@@ -0,0 +1,65 @@
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
@@ -0,0 +1,33 @@
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
@@ -0,0 +1,59 @@
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
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
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-10 00:00:00.000000000 Z
11
+ date: 2015-08-17 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: translates text files using yandex translator api
14
14
  email:
@@ -21,7 +21,9 @@ files:
21
21
  - lib/yat.rb
22
22
  - lib/yat/config.rb
23
23
  - lib/yat/errors.rb
24
- - lib/yat/translator.rb
24
+ - lib/yat/generic_translator.rb
25
+ - lib/yat/json_translator.rb
26
+ - lib/yat/xml_translator.rb
25
27
  homepage:
26
28
  licenses:
27
29
  - MIT
@@ -42,7 +44,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
42
44
  version: '0'
43
45
  requirements: []
44
46
  rubyforge_project:
45
- rubygems_version: 2.2.2
47
+ rubygems_version: 2.4.5
46
48
  signing_key:
47
49
  specification_version: 4
48
50
  summary: yet another yandex translator
@@ -1,172 +0,0 @@
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