google-geocoder 0.0.2
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 +10 -0
- data/README +11 -0
- data/Rakefile +89 -0
- data/VERSION +1 -0
- data/bin/g +6 -0
- data/bin/g.bat +1 -0
- data/bin/geo +42 -0
- data/bin/geo.bat +6 -0
- data/google-geocoder.gemspec +64 -0
- data/lib/google_geocoder.rb +104 -0
- data/spec/geocoder_spec.rb +29 -0
- data/spec/spec_helper.rb +11 -0
- metadata +137 -0
data/CHANGES
ADDED
data/README
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# Rakefile for google-geocoder
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/testtask'
|
6
|
+
require 'spec/rake/spectask'
|
7
|
+
require 'rake/rdoctask'
|
8
|
+
require 'rcov/rcovtask'
|
9
|
+
|
10
|
+
task :default => :gemspec
|
11
|
+
|
12
|
+
begin
|
13
|
+
require 'bundler'
|
14
|
+
|
15
|
+
begin
|
16
|
+
require 'jeweler'
|
17
|
+
|
18
|
+
Jeweler::Tasks.new do |gemspec|
|
19
|
+
gemspec.name = "google-geocoder"
|
20
|
+
gemspec.summary = "Simple client for Google Geocode API (Summary)."
|
21
|
+
gemspec.description = "Simple client for Google Geocode API."
|
22
|
+
gemspec.email = "alexander.shvets@gmail.com"
|
23
|
+
gemspec.homepage = "http://github.com/shvets/google-geocoder"
|
24
|
+
gemspec.authors = ["Alexander Shvets"]
|
25
|
+
gemspec.files = FileList["CHANGES", "google-geocoder.gemspec", "Rakefile", "README", "VERSION",
|
26
|
+
"lib/**/*", "bin/**/*"]
|
27
|
+
gemspec.add_dependency "json_pure", ">= 1.1.4"
|
28
|
+
|
29
|
+
gemspec.executables = ['geo', 'g']
|
30
|
+
gemspec.requirements = ["none"]
|
31
|
+
gemspec.bindir = "bin"
|
32
|
+
|
33
|
+
gemspec.add_bundler_dependencies
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
puts "Jeweler not available. Install it s with: [sudo] gem install jeweler"
|
37
|
+
end
|
38
|
+
rescue LoadError
|
39
|
+
puts "Bundler not available. Install it s with: [sudo] gem install bundler"
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Release the gem"
|
43
|
+
task :"release:gem" do
|
44
|
+
%x(
|
45
|
+
rake gemspec
|
46
|
+
rake build
|
47
|
+
rake install
|
48
|
+
git add .
|
49
|
+
)
|
50
|
+
puts "Commit message:"
|
51
|
+
message = STDIN.gets
|
52
|
+
|
53
|
+
version = "#{File.open(File::dirname(__FILE__) + "/VERSION").readlines().first}"
|
54
|
+
|
55
|
+
%x(
|
56
|
+
git commit -m "#{message}"
|
57
|
+
|
58
|
+
git push origin master
|
59
|
+
|
60
|
+
gem push pkg/google-geocoder-#{version}.gem
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Run gem code locally"
|
65
|
+
task :"run:gem" do
|
66
|
+
command = "bin/geo " + (ENV['params'].nil? ? '' : ENV['params'])
|
67
|
+
puts ruby("#{command}")
|
68
|
+
end
|
69
|
+
|
70
|
+
Spec::Rake::SpecTask.new do |task|
|
71
|
+
task.libs << 'lib'
|
72
|
+
task.pattern = 'spec/**/*_spec.rb'
|
73
|
+
task.verbose = false
|
74
|
+
end
|
75
|
+
|
76
|
+
Rake::RDocTask.new do |rdoc|
|
77
|
+
rdoc.rdoc_dir = 'rdoc'
|
78
|
+
rdoc.title = 'teststuff'
|
79
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
80
|
+
rdoc.rdoc_files.include('README*')
|
81
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
82
|
+
end
|
83
|
+
|
84
|
+
Rcov::RcovTask.new do |task|
|
85
|
+
task.libs << 'test'
|
86
|
+
task.test_files = FileList['test/**/*_test.rb']
|
87
|
+
task.verbose = true
|
88
|
+
end
|
89
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.2
|
data/bin/g
ADDED
data/bin/g.bat
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
@CALL geo.bat
|
data/bin/geo
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift(File::join(File::dirname(File::dirname(__FILE__)), "lib"))
|
4
|
+
|
5
|
+
require 'rubygems' unless RUBY_VERSION =~ /1.9.*/
|
6
|
+
require 'google_geocoder'
|
7
|
+
|
8
|
+
#$KCODE='u'
|
9
|
+
|
10
|
+
class Geo
|
11
|
+
|
12
|
+
USAGE= <<-TEXT
|
13
|
+
Usage:
|
14
|
+
geo russia moscow - returns geocode information for the provided location
|
15
|
+
TEXT
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@geocoder = Google::Geocoder.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
if(ARGV.size == 0)
|
23
|
+
puts USAGE and return
|
24
|
+
end
|
25
|
+
|
26
|
+
query = ARGV.join(' ')
|
27
|
+
|
28
|
+
case query
|
29
|
+
|
30
|
+
when /(-v)|(--version)/ then
|
31
|
+
puts "Version: #{File.open(File::dirname(__FILE__) + "/../VERSION").readlines().first}"
|
32
|
+
when /(.*)/ then
|
33
|
+
begin
|
34
|
+
@geocoder.query(query)
|
35
|
+
rescue Exception => e
|
36
|
+
puts "Error: " + e.message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
Geo.new.run
|
data/bin/geo.bat
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{google-geocoder}
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
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-29}
|
13
|
+
s.description = %q{Simple client for Google Geocode API.}
|
14
|
+
s.email = %q{alexander.shvets@gmail.com}
|
15
|
+
s.executables = ["geo", "g"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"README"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"CHANGES",
|
21
|
+
"README",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"bin/g",
|
25
|
+
"bin/g.bat",
|
26
|
+
"bin/geo",
|
27
|
+
"bin/geo.bat",
|
28
|
+
"google-geocoder.gemspec",
|
29
|
+
"lib/google_geocoder.rb"
|
30
|
+
]
|
31
|
+
s.homepage = %q{http://github.com/shvets/google-geocoder}
|
32
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
s.requirements = ["none"]
|
35
|
+
s.rubygems_version = %q{1.3.7}
|
36
|
+
s.summary = %q{Simple client for Google Geocode API (Summary).}
|
37
|
+
s.test_files = [
|
38
|
+
"spec/geocoder_spec.rb",
|
39
|
+
"spec/spec_helper.rb"
|
40
|
+
]
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
44
|
+
s.specification_version = 3
|
45
|
+
|
46
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
|
+
s.add_runtime_dependency(%q<json_pure>, [">= 1.1.4"])
|
48
|
+
s.add_runtime_dependency(%q<json_pure>, [">= 0"])
|
49
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
50
|
+
s.add_development_dependency(%q<gemcutter>, [">= 0"])
|
51
|
+
else
|
52
|
+
s.add_dependency(%q<json_pure>, [">= 1.1.4"])
|
53
|
+
s.add_dependency(%q<json_pure>, [">= 0"])
|
54
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
55
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
56
|
+
end
|
57
|
+
else
|
58
|
+
s.add_dependency(%q<json_pure>, [">= 1.1.4"])
|
59
|
+
s.add_dependency(%q<json_pure>, [">= 0"])
|
60
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
61
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# google_geocoder.rb
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'cgi'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
# Example:
|
8
|
+
# {
|
9
|
+
# "results"=> [
|
10
|
+
# {"address_components"=>
|
11
|
+
# [{"long_name"=>"Paris", "types"=>["locality", "political"], "short_name"=>"Paris"},
|
12
|
+
# {"long_name"=>"Paris", "types"=>["administrative_area_level_2", "political" ], "short_name"=>"75"},
|
13
|
+
# {"long_name"=>"Ile-de-France", "types"=>["administrative_area_level_1", "political"], "short_name"=>"IDF"},
|
14
|
+
# {"long_name"=>"France", "types"=>["country", "political"], "short_name"=>"FR"}
|
15
|
+
# ],
|
16
|
+
# "geometry"=>{
|
17
|
+
# "bounds"=>{"northeast"=>{"lng"=>2.4699099, "lat"=>48.9021461}, "southwest"=>{"lng"=>2.2241006, "lat"=>48.8155414}},
|
18
|
+
# "location"=>{"lng"=>2.3509871, "lat"=>48.8566667},
|
19
|
+
# "location_type"=>"APPROXIMATE",
|
20
|
+
# "viewport"=>{"northeast"=>{"lng"=>2.4790465, "lat"=>48.915363}, "southwest"=>{"lng"=>2.2229277, "lat"=>48.7979015}}
|
21
|
+
# },
|
22
|
+
# "types"=>["locality", "political"],
|
23
|
+
# "formatted_address"=>"Paris, France"}
|
24
|
+
# ],
|
25
|
+
# "status"=>"OK"
|
26
|
+
# }
|
27
|
+
|
28
|
+
module Google
|
29
|
+
class Geocoder
|
30
|
+
def self.Exception(*names)
|
31
|
+
cl = Module === self ? self : Object
|
32
|
+
names.each {|n| cl.const_set(n, Class.new(Exception))}
|
33
|
+
end
|
34
|
+
|
35
|
+
Exception :MissingLocation, :GeocoderServerIsDown, :InvalidResponse
|
36
|
+
|
37
|
+
URL_STRING = "http://maps.googleapis.com/maps/api/geocode"
|
38
|
+
|
39
|
+
def query(location)
|
40
|
+
raise(MissingLocation) if location.nil?
|
41
|
+
|
42
|
+
request = "#{URL_STRING}/json?address=#{CGI.escape(location)}&sensor=false"
|
43
|
+
|
44
|
+
begin
|
45
|
+
response = call_service(request)
|
46
|
+
|
47
|
+
raise(GeocoderServerIsDown) if response.empty?
|
48
|
+
|
49
|
+
raise(InvalidResponse, response['results']) if response['status'] != "OK" # success
|
50
|
+
|
51
|
+
root = response["results"][0]
|
52
|
+
address_components = root["address_components"]
|
53
|
+
geometry = root["geometry"]
|
54
|
+
|
55
|
+
country = address_component(address_components, "country")
|
56
|
+
locality = address_component(address_components, "locality")
|
57
|
+
administrative_area_l1 = address_component(address_components, "administrative_area_level_1")
|
58
|
+
administrative_area_l2 = address_component(address_components, "administrative_area_level_2")
|
59
|
+
|
60
|
+
latitude = geometry["location"]["lat"]
|
61
|
+
longitude = geometry["location"]["lng"]
|
62
|
+
|
63
|
+
puts "Country: #{country['long_name']} (#{country['short_name']})"
|
64
|
+
puts "Locality: #{locality['long_name']} (#{locality['short_name']})"
|
65
|
+
puts "Administrative Area (level 1): #{administrative_area_l1['long_name']} (#{administrative_area_l1['short_name']})"
|
66
|
+
puts "Administrative Area (level 2): #{administrative_area_l2['long_name']} (#{administrative_area_l2['short_name']})" unless administrative_area_l2.nil?
|
67
|
+
|
68
|
+
puts "Latitude: #{latitude}"
|
69
|
+
puts "Longitude: #{longitude}"
|
70
|
+
|
71
|
+
[latitude, longitude]
|
72
|
+
rescue OpenURI::HTTPError
|
73
|
+
raise(GeocoderServerIsDown)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def call_service(request)
|
80
|
+
response = {}
|
81
|
+
|
82
|
+
open(request) do |stream|
|
83
|
+
content = stream.read
|
84
|
+
|
85
|
+
unless content.nil?
|
86
|
+
response = JSON.parse(content)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
response
|
91
|
+
end
|
92
|
+
|
93
|
+
def address_component(parent, type)
|
94
|
+
parent.each do |child|
|
95
|
+
if child["types"].include? type
|
96
|
+
return child
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# geocoder_spec.rb
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
4
|
+
|
5
|
+
require 'google_geocoder'
|
6
|
+
|
7
|
+
module Google
|
8
|
+
|
9
|
+
describe Geocoder do
|
10
|
+
before :each do
|
11
|
+
@geocoder = Geocoder.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should raise an error if parameter is missing" do
|
15
|
+
lambda {
|
16
|
+
@geocoder.query(nil)
|
17
|
+
}.should raise_error
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return geocode coordinates" do
|
21
|
+
q = @geocoder.query("moscow russia")
|
22
|
+
|
23
|
+
puts q
|
24
|
+
|
25
|
+
q.size.should be == 2
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google-geocoder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Alexander Shvets
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-09-29 00:00:00 -04:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
name: json_pure
|
25
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 27
|
31
|
+
segments:
|
32
|
+
- 1
|
33
|
+
- 1
|
34
|
+
- 4
|
35
|
+
version: 1.1.4
|
36
|
+
requirement: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
name: json_pure
|
41
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
42
|
+
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
|
53
|
+
prerelease: false
|
54
|
+
name: jeweler
|
55
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
|
+
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
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
name: gemcutter
|
69
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
requirement: *id004
|
79
|
+
description: Simple client for Google Geocode API.
|
80
|
+
email: alexander.shvets@gmail.com
|
81
|
+
executables:
|
82
|
+
- geo
|
83
|
+
- g
|
84
|
+
extensions: []
|
85
|
+
|
86
|
+
extra_rdoc_files:
|
87
|
+
- README
|
88
|
+
files:
|
89
|
+
- CHANGES
|
90
|
+
- README
|
91
|
+
- Rakefile
|
92
|
+
- VERSION
|
93
|
+
- bin/g
|
94
|
+
- bin/g.bat
|
95
|
+
- bin/geo
|
96
|
+
- bin/geo.bat
|
97
|
+
- google-geocoder.gemspec
|
98
|
+
- lib/google_geocoder.rb
|
99
|
+
- spec/geocoder_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
has_rdoc: true
|
102
|
+
homepage: http://github.com/shvets/google-geocoder
|
103
|
+
licenses: []
|
104
|
+
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options:
|
107
|
+
- --charset=UTF-8
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
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
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
hash: 3
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
version: "0"
|
128
|
+
requirements:
|
129
|
+
- none
|
130
|
+
rubyforge_project:
|
131
|
+
rubygems_version: 1.3.7
|
132
|
+
signing_key:
|
133
|
+
specification_version: 3
|
134
|
+
summary: Simple client for Google Geocode API (Summary).
|
135
|
+
test_files:
|
136
|
+
- spec/geocoder_spec.rb
|
137
|
+
- spec/spec_helper.rb
|