google-translate 0.7.2 → 0.8.0

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.
data/CHANGES CHANGED
@@ -39,4 +39,8 @@
39
39
 
40
40
  == Version 0.7.1
41
41
 
42
- * Ruby 1.9.2 ready
42
+ * Ruby 1.9.2 ready
43
+
44
+ == Version 0.8.0
45
+
46
+ * Stop using translate API, start using scraping google translate
data/Rakefile CHANGED
@@ -1,9 +1,10 @@
1
1
  # Rakefile for google-translate
2
2
 
3
- require 'rubygems'
3
+ require 'rubygems' unless RUBY_VERSION =~ /1.9.*/
4
+
4
5
  require 'rake/gempackagetask'
5
6
  require 'rake/testtask'
6
- require 'spec/rake/spectask'
7
+ require 'rspec/core/rake_task'
7
8
  require 'rake/rdoctask'
8
9
  require 'rcov/rcovtask'
9
10
 
@@ -67,8 +68,13 @@ task :"run:gem" do
67
68
  puts ruby("#{command}")
68
69
  end
69
70
 
70
- Spec::Rake::SpecTask.new do |task|
71
- task.libs << 'lib'
71
+ #Spec::Rake::SpecTask.new do |task|
72
+ # task.libs << 'lib'
73
+ # task.pattern = 'spec/**/*_spec.rb'
74
+ # task.verbose = false
75
+ #end
76
+
77
+ RSpec::Core::RakeTask.new do |task|
72
78
  task.pattern = 'spec/**/*_spec.rb'
73
79
  task.verbose = false
74
80
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.2
1
+ 0.8.0
@@ -1,60 +1,67 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{google-translate}
8
- s.version = "0.7.2"
8
+ s.version = "0.8.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Alexander Shvets"]
12
- s.date = %q{2010-09-16}
11
+ s.authors = [%q{Alexander Shvets}]
12
+ s.date = %q{2011-10-12}
13
13
  s.description = %q{Simple client for Google Translate API.}
14
14
  s.email = %q{alexander.shvets@gmail.com}
15
- s.executables = ["translate", "t"]
15
+ s.executables = [%q{translate}, %q{t}]
16
16
  s.extra_rdoc_files = [
17
17
  "README"
18
18
  ]
19
19
  s.files = [
20
20
  "CHANGES",
21
- "README",
22
- "Rakefile",
23
- "VERSION",
24
- "bin/t",
25
- "bin/t.bat",
26
- "bin/translate",
27
- "bin/translate.bat",
28
- "google-translate.gemspec",
29
- "lib/google_translate.rb"
21
+ "README",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "bin/t",
25
+ "bin/t.bat",
26
+ "bin/translate",
27
+ "bin/translate.bat",
28
+ "google-translate.gemspec",
29
+ "lib/google_translate.rb"
30
30
  ]
31
31
  s.homepage = %q{http://github.com/shvets/google-translate}
32
- s.rdoc_options = ["--charset=UTF-8"]
33
- s.require_paths = ["lib"]
34
- s.requirements = ["none"]
35
- s.rubygems_version = %q{1.3.7}
32
+ s.require_paths = [%q{lib}]
33
+ s.requirements = [%q{none}]
34
+ s.rubygems_version = %q{1.8.6}
36
35
  s.summary = %q{Simple client for Google Translate API (Summary).}
37
36
  s.test_files = [
38
37
  "spec/spec_helper.rb",
39
- "spec/translate_spec.rb"
38
+ "spec/translate_spec.rb"
40
39
  ]
41
40
 
42
41
  if s.respond_to? :specification_version then
43
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
42
  s.specification_version = 3
45
43
 
46
44
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
+ s.add_runtime_dependency(%q<json_pure>, [">= 0"])
46
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
47
+ s.add_development_dependency(%q<gemcutter>, [">= 0"])
47
48
  s.add_runtime_dependency(%q<json_pure>, [">= 1.1.4"])
48
49
  s.add_runtime_dependency(%q<json_pure>, [">= 0"])
49
50
  s.add_development_dependency(%q<jeweler>, [">= 0"])
50
51
  s.add_development_dependency(%q<gemcutter>, [">= 0"])
51
52
  else
53
+ s.add_dependency(%q<json_pure>, [">= 0"])
54
+ s.add_dependency(%q<jeweler>, [">= 0"])
55
+ s.add_dependency(%q<gemcutter>, [">= 0"])
52
56
  s.add_dependency(%q<json_pure>, [">= 1.1.4"])
53
57
  s.add_dependency(%q<json_pure>, [">= 0"])
54
58
  s.add_dependency(%q<jeweler>, [">= 0"])
55
59
  s.add_dependency(%q<gemcutter>, [">= 0"])
56
60
  end
57
61
  else
62
+ s.add_dependency(%q<json_pure>, [">= 0"])
63
+ s.add_dependency(%q<jeweler>, [">= 0"])
64
+ s.add_dependency(%q<gemcutter>, [">= 0"])
58
65
  s.add_dependency(%q<json_pure>, [">= 1.1.4"])
59
66
  s.add_dependency(%q<json_pure>, [">= 0"])
60
67
  s.add_dependency(%q<jeweler>, [">= 0"])
@@ -5,6 +5,7 @@ require 'cgi'
5
5
  require 'json'
6
6
 
7
7
  module Google
8
+
8
9
  Language = Struct.new(:name, :code) do
9
10
  def to_s
10
11
  "(" + code + ": " + name + ")"
@@ -12,6 +13,8 @@ module Google
12
13
  end
13
14
 
14
15
  class Translator
16
+ GOOGLE_TRANSLATE_SERVICE_URL = "http://translate.google.com"
17
+
15
18
  def self.Exception(*names)
16
19
  cl = Module === self ? self : Object
17
20
  names.each {|n| cl.const_set(n, Class.new(Exception))}
@@ -20,79 +23,57 @@ module Google
20
23
  Exception :MissingFromLanguage, :MissingToLanguage, :MissingTextLanguage,
21
24
  :TranslateServerIsDown, :InvalidResponse, :MissingText, :MissingTestText
22
25
 
23
- URL_STRING = "http://ajax.googleapis.com/ajax/services/language/"
24
- URL2_STRING = "http://translate.google.com"
25
-
26
26
  def translate(from, to, from_text, options={})
27
27
  raise(MissingFromLanguage) if from.nil?
28
28
  raise(MissingToLanguage) if to.nil?
29
29
  raise(MissingTextLanguage) if from_text.nil?
30
30
 
31
- request = URL_STRING + "translate?v=1.0&langpair=#{from}%7C#{to}&q=" + CGI.escape(from_text)
32
-
33
31
  begin
34
- response = call_service(request, [:response_status, :response_details, :response_data])
32
+ url = GOOGLE_TRANSLATE_SERVICE_URL + "/translate_a/t?client=t&text=#{from_text}&hl=#{from}&tl=#{to}"
33
+ # &sl=auto&multires=1&prev=btn&ssel=0&tsel=4&uptl=ru&alttl=en&sc=1
35
34
 
36
- raise(TranslateServerIsDown) if response.empty?
35
+ open(URI.escape(url)) do |stream|
36
+ content = stream.read
37
37
 
38
- raise(InvalidResponse, response[:response_details]) if response[:response_status] != 200 # success
38
+ s = content.split(',').collect {|s| s == '' ? "\"\"" : s}.join(",")
39
39
 
40
- to_text = response[:response_data]['translatedText']
40
+ result = JSON.parse(s)
41
41
 
42
- (options[:html]) ? CGI.unescapeHTML(to_text) : to_text
43
- rescue OpenURI::HTTPError
44
- raise(TranslateServerIsDown)
45
- end
46
- end
42
+ raise(TranslateServerIsDown) if (!result || result.empty?)
47
43
 
48
- def detect_language(test_text)
49
- raise(MissingTestText) if test_text.nil?
44
+ # raise(InvalidResponse, result["responseDetails"]) if response.code.to_i != 200 # success
50
45
 
51
- request = URL_STRING + "detect?v=1.0&q=" + CGI.escape(test_text)
52
-
53
- begin
54
- response = call_service(request, [:response_data])
55
- response_data = response[:response_data]
56
-
57
- raise(TranslateServerIsDown) if response.empty?
58
-
59
- response_data
60
- rescue OpenURI::HTTPError
61
- raise(TranslateServerIsDown)
46
+ to_text = result[0][0][0]
47
+ translit = result[0][0][2]
48
+ (options[:html]) ? CGI.unescapeHTML(translit) : translit
49
+ end
50
+ rescue Exception => e
51
+ raise(TranslateServerIsDown)
62
52
  end
63
53
  end
54
+
55
+ # def detect_language(test_text)
56
+
57
+ # raise(MissingTestText) if test_text.nil?
58
+
59
+ # begin
60
+ # response = self.class.get("/detect", :query => {:q => test_text})
61
+ # response = (response && response.parsed_response) ? response.parsed_response : nil
62
+ # raise(TranslateServerIsDown) if (!response || response.empty?)
63
+ # response_data = response["responseData"]
64
+ # return response_data
65
+ # rescue HTTParty::ResponseError
66
+ # raise(TranslateServerIsDown)
67
+ # end
68
+ #end
64
69
 
65
70
  def supported_languages
66
- call_service2(URL2_STRING , [])
71
+ fetch_languages(GOOGLE_TRANSLATE_SERVICE_URL , [])
67
72
  end
68
73
 
69
74
  private
70
75
 
71
- def camelize(str)
72
- words = str.split('_')
73
-
74
- words[0] + words[1..-1].map {|w| w.capitalize}.join
75
- end
76
-
77
- def call_service(request, keys)
78
- response = {}
79
-
80
- open(request) do |stream|
81
- content = stream.read
82
-
83
- unless content.nil?
84
- json = JSON.parse(content)
85
-
86
- keys.each do |key|
87
- response[key] = json[camelize(key.to_s)]
88
- end
89
- end
90
- end
91
-
92
- response
93
- end
94
-
95
- def call_service2(request, keys)
76
+ def fetch_languages(request, keys)
96
77
  response = {}
97
78
 
98
79
  open(URI.escape(request)) do |stream|
@@ -132,9 +113,13 @@ module Google
132
113
  end
133
114
 
134
115
  re2 = /<option(\s*)value="([a-z|A-Z|-]*)">([a-z|A-Z|\(|\)|\s]*)<\/option>/
135
-
136
116
  matches = text.gsub(/selected/i, '').squeeze.scan(re2)
137
117
 
118
+ if matches.size == 0
119
+ re2 = /<option(\s*)value=([a-z|A-Z|-]*)>([a-z|A-Z|\(|\)|\s]*)<\/option>/
120
+ matches = text.gsub(/selected/i, '').squeeze.scan(re2)
121
+ end
122
+
138
123
  matches.each do |m|
139
124
  languages << Language.new(m[2], m[1])
140
125
  end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  # spec_helper.rb
2
2
 
3
3
  require 'rubygems'
4
- require 'spec'
4
+ require 'rspec'
5
5
 
6
6
  # add lib directory
7
7
  $:.unshift File.dirname(__FILE__) + '/../lib'
8
8
 
9
- Spec::Runner.configure do |config|
9
+ RSpec.configure do |config|
10
10
  config.mock_with :mocha
11
11
  end
@@ -27,15 +27,13 @@ module Google
27
27
 
28
28
  it "should translate test string from one language to another" do
29
29
  r = @translator.translate(:en, :ru, "hello world!")
30
-
31
30
  puts r
32
-
33
31
  r.size.should be > 0
34
32
  end
35
33
 
36
- it "should detect the language of a string" do
37
- @translator.detect_language("bonjour tout le monde")['language'].should be == "fr"
38
- end
34
+ #it "should detect the language of a string" do
35
+ # @translator.detect_language("bonjour tout le monde")['language'].should be == "fr"
36
+ #end
39
37
 
40
38
  it "should raise an error if no string" do
41
39
  lambda {
@@ -43,9 +41,9 @@ module Google
43
41
  }.should raise_error
44
42
  end
45
43
 
46
- it "should return unreliable flag if language is not recognized" do
47
- @translator.detect_language("azafretmkldt")['isReliable'].should be_false
48
- end
44
+ #it "should return unreliable flag if language is not recognized" do
45
+ # @translator.detect_language("azafretmkldt")['isReliable'].should be_false
46
+ #end
49
47
 
50
48
  it "should return list of supported languages" do
51
49
  languages = @translator.supported_languages
metadata CHANGED
@@ -1,91 +1,102 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: google-translate
3
- version: !ruby/object:Gem::Version
4
- hash: 7
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 7
9
- - 2
10
- version: 0.7.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Alexander Shvets
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2010-09-16 00:00:00 -04:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json_pure
16
+ requirement: &2156925300 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
+ version_requirements: *2156925300
25
+ - !ruby/object:Gem::Dependency
26
+ name: jeweler
27
+ requirement: &2156924080 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2156924080
36
+ - !ruby/object:Gem::Dependency
37
+ name: gemcutter
38
+ requirement: &2156922920 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2156922920
47
+ - !ruby/object:Gem::Dependency
24
48
  name: json_pure
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
49
+ requirement: &2156921920 !ruby/object:Gem::Requirement
26
50
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 27
31
- segments:
32
- - 1
33
- - 1
34
- - 4
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
35
54
  version: 1.1.4
36
- requirement: *id001
37
- - !ruby/object:Gem::Dependency
38
55
  type: :runtime
39
56
  prerelease: false
57
+ version_requirements: *2156921920
58
+ - !ruby/object:Gem::Dependency
40
59
  name: json_pure
41
- version_requirements: &id002 !ruby/object:Gem::Requirement
60
+ requirement: &2156921080 !ruby/object:Gem::Requirement
42
61
  none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- hash: 3
47
- segments:
48
- - 0
49
- version: "0"
50
- requirement: *id002
51
- - !ruby/object:Gem::Dependency
52
- type: :development
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
53
67
  prerelease: false
68
+ version_requirements: *2156921080
69
+ - !ruby/object:Gem::Dependency
54
70
  name: jeweler
55
- version_requirements: &id003 !ruby/object:Gem::Requirement
71
+ requirement: &2156919920 !ruby/object:Gem::Requirement
56
72
  none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 3
61
- segments:
62
- - 0
63
- version: "0"
64
- requirement: *id003
65
- - !ruby/object:Gem::Dependency
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
66
77
  type: :development
67
78
  prerelease: false
79
+ version_requirements: *2156919920
80
+ - !ruby/object:Gem::Dependency
68
81
  name: gemcutter
69
- version_requirements: &id004 !ruby/object:Gem::Requirement
82
+ requirement: &2156918840 !ruby/object:Gem::Requirement
70
83
  none: false
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- hash: 3
75
- segments:
76
- - 0
77
- version: "0"
78
- requirement: *id004
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2156918840
79
91
  description: Simple client for Google Translate API.
80
92
  email: alexander.shvets@gmail.com
81
- executables:
93
+ executables:
82
94
  - translate
83
95
  - t
84
96
  extensions: []
85
-
86
- extra_rdoc_files:
97
+ extra_rdoc_files:
87
98
  - README
88
- files:
99
+ files:
89
100
  - CHANGES
90
101
  - README
91
102
  - Rakefile
@@ -98,40 +109,31 @@ files:
98
109
  - lib/google_translate.rb
99
110
  - spec/spec_helper.rb
100
111
  - spec/translate_spec.rb
101
- has_rdoc: true
102
112
  homepage: http://github.com/shvets/google-translate
103
113
  licenses: []
104
-
105
114
  post_install_message:
106
- rdoc_options:
107
- - --charset=UTF-8
108
- require_paths:
115
+ rdoc_options: []
116
+ require_paths:
109
117
  - lib
110
- required_ruby_version: !ruby/object:Gem::Requirement
118
+ required_ruby_version: !ruby/object:Gem::Requirement
111
119
  none: false
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- hash: 3
116
- segments:
117
- - 0
118
- version: "0"
119
- required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
125
  none: false
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- hash: 3
125
- segments:
126
- - 0
127
- version: "0"
128
- requirements:
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ requirements:
129
131
  - none
130
132
  rubyforge_project:
131
- rubygems_version: 1.3.7
133
+ rubygems_version: 1.8.6
132
134
  signing_key:
133
135
  specification_version: 3
134
136
  summary: Simple client for Google Translate API (Summary).
135
- test_files:
137
+ test_files:
136
138
  - spec/spec_helper.rb
137
139
  - spec/translate_spec.rb