geo_ip 0.2.0 → 0.3.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/.gitignore CHANGED
@@ -19,3 +19,4 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
+ spec/api.yml
data/CHANGES CHANGED
@@ -1,8 +1,15 @@
1
+ == 0.3.0
2
+
3
+ * Added support for API key requirement (Thanks to seanconaty and luigi)
4
+ * Explicit gem dependency for json and removed rubygems requirement (idris) (http://tomayko.com/writings/require-rubygems-antipattern)
5
+ * Removed deprecated GeoIp#remote_geolocation method
6
+
1
7
  == 0.2.0
2
8
 
3
9
  * Added support for timezone information. Use the optional {:timezone => true|false} option
4
10
  * Added support for country lookup. This will result in a faster reply since less queries need
5
11
  to be done at ipinfodb's side. Use the optional {:precision => :city|:country} option
12
+ * API change: GeoIp.remote_geolocation(ip) is deprecated in favor of GeoIp.geolocation(ip)
6
13
 
7
14
  == 0.1.1
8
15
 
data/README.rdoc CHANGED
@@ -2,36 +2,81 @@
2
2
 
3
3
  Retreive the geolocation of an IP address based on the {ipinfodb.com}[http://ipinfodb.com/] webservice.
4
4
 
5
+ As of 8th November 2010, the service is asking that all users {register}[http://ipinfodb.com/register.php] for an API key.
6
+
5
7
  Consider making a donation to {ipinfodb.com}[http://ipinfodb.com/] at {http://ipinfodb.com/donate.php}[http://ipinfodb.com/donate.php]
6
8
 
7
9
  == Usage
8
10
 
9
- === Retreive geolocation
10
- GeoIp.remote_geolocation(ip_address)
11
+ === Set API key
12
+ GeoIp.api_key = "YOUR_API_KEY"
13
+
14
+ This must be done before making the geolocation call.
15
+
16
+ === Retrieve geolocation
17
+ GeoIp.geolocation(ip_address)
11
18
 
12
19
  === Example
13
20
 
14
21
  # 209.85.227.104 = google.be (US)
15
- GeoIp.remote_geolocation('209.85.227.104')
22
+ GeoIp.geolocation('209.85.227.104')
23
+
24
+ returns:
25
+
26
+ {
27
+ :status =>"OK",
28
+ :ip =>"209.85.227.104"
29
+ :country_code =>"US",
30
+ :country_name =>"United States",
31
+ :region_code =>"06",
32
+ :region_name =>"California",
33
+ :city =>"Mountain View",
34
+ :zip_postal_code =>"94043",
35
+ :latitude =>"37.4192",
36
+ :longitude =>"-122.057"
37
+ }
38
+
39
+ === Country only
40
+
41
+ There is an option to only retreive the country information and thus excluding the city details. This results in a faster response from the service since less queries need to be done.
42
+
43
+ GeoIp.geolocation('209.85.227.104', {:precision => :country})
44
+
45
+ returns:
46
+
47
+ {
48
+ :status => "OK",
49
+ :ip => "209.85.227.104"
50
+ :country_code => "US",
51
+ :country_name => "United States"
52
+ }
53
+
54
+ === Timezone information
55
+
56
+ There is an option now to retrieve optional timezone information too:
57
+
58
+ GeoIp.geolocation('209.85.227.104', {:timezone => true})
16
59
 
17
60
  returns:
18
61
 
19
62
  {
20
- :status=>"OK",
21
- :ip=>"209.85.227.104"
22
- :country_code=>"US",
23
- :country_name=>"United States",
24
- :region_code=>"06",
25
- :region_name=>"California",
26
- :city=>"Mountain View",
27
- :zip_postal_code=>"94043",
28
- :latitude=>"37.4192",
29
- :longitude=>"-122.057",
30
- :timezone=>"-8",
31
- :gmt_offset=>"-8",
32
- :dst_offset=>"-7",
63
+ :status =>"OK",
64
+ :ip =>"209.85.227.104"
65
+ :country_code =>"US",
66
+ :country_name =>"United States",
67
+ :region_code =>"06",
68
+ :region_name =>"California",
69
+ :city =>"Mountain View",
70
+ :zip_postal_code =>"94043",
71
+ :latitude =>"37.4192",
72
+ :longitude =>"-122.057"
73
+ :timezone_name =>"America/Los_Angeles",
74
+ :utc_offset =>-25200,
75
+ :dst? =>true
33
76
  }
34
77
 
78
+ Obviously it is not possible to have the country precision enabled while retrieving the timezone information.
79
+
35
80
  == Getting it
36
81
 
37
82
  GeoIp can be installed as a Ruby Gem:
@@ -42,8 +87,24 @@ Alternatively, you can also install it as a Rails plugin:
42
87
 
43
88
  ./script/plugin install git://github.com/jeroenj/geo_ip.git
44
89
 
90
+ == Testing
91
+
92
+ Set up your API key first for the test suite by creating a spec/api.yml file. Follow the example in spec/api.yml.example. Then run the tests with:
93
+
94
+ ruby spec/geo_ip_spec.rb
95
+
96
+ If you get a LoadError, you should run the tests with:
97
+
98
+ ruby -rubygems spec/geo_ip_spec.rb
99
+
100
+ == Colaborators
101
+
102
+ * {seanconaty}[https://github.com/seanconaty]
103
+ * {luigi}[https://github.com/luigi]
104
+ * {idris}[https://github.com/idris]
105
+
45
106
  == Note on Patches/Pull Requests
46
-
107
+
47
108
  * Fork the project.
48
109
  * Make your feature addition or bug fix.
49
110
  * Add tests for it. This is important so I don't break it in a
data/Rakefile CHANGED
@@ -7,10 +7,11 @@ begin
7
7
  gem.name = "geo_ip"
8
8
  gem.summary = "Retreive the geolocation of an IP address based on the ipinfodb.com webservice"
9
9
  gem.description = "A call to the ipinfodb.com will be done to retreive the geolocation based on the IP address. No need to include a database file in the application."
10
- gem.email = "jj@redstorm.com"
10
+ gem.email = "jacobsjeroen@gmail.com"
11
11
  gem.homepage = "http://github.com/jeroenj/geo_ip"
12
12
  gem.authors = ["Jeroen Jacobs"]
13
- gem.add_development_dependency "rspec", ">= 1.2.9"
13
+ gem.add_dependency "json", "~> 1.4.6"
14
+ gem.add_development_dependency "rspec", "~> 1.3.0"
14
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
16
  end
16
17
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
data/geo_ip.gemspec CHANGED
@@ -5,13 +5,13 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{geo_ip}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jeroen Jacobs"]
12
- s.date = %q{2010-03-25}
12
+ s.date = %q{2010-11-16}
13
13
  s.description = %q{A call to the ipinfodb.com will be done to retreive the geolocation based on the IP address. No need to include a database file in the application.}
14
- s.email = %q{jj@redstorm.com}
14
+ s.email = %q{jacobsjeroen@gmail.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.rdoc"
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
27
27
  "geo_ip.gemspec",
28
28
  "init.rb",
29
29
  "lib/geo_ip.rb",
30
+ "spec/api.yml.example",
30
31
  "spec/geo_ip_spec.rb",
31
32
  "spec/spec.opts",
32
33
  "spec/spec_helper.rb"
@@ -34,7 +35,7 @@ Gem::Specification.new do |s|
34
35
  s.homepage = %q{http://github.com/jeroenj/geo_ip}
35
36
  s.rdoc_options = ["--charset=UTF-8"]
36
37
  s.require_paths = ["lib"]
37
- s.rubygems_version = %q{1.3.6}
38
+ s.rubygems_version = %q{1.3.7}
38
39
  s.summary = %q{Retreive the geolocation of an IP address based on the ipinfodb.com webservice}
39
40
  s.test_files = [
40
41
  "spec/geo_ip_spec.rb",
@@ -45,13 +46,16 @@ Gem::Specification.new do |s|
45
46
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
46
47
  s.specification_version = 3
47
48
 
48
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
49
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
49
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
+ s.add_runtime_dependency(%q<json>, ["~> 1.4.6"])
51
+ s.add_development_dependency(%q<rspec>, ["~> 1.3.0"])
50
52
  else
51
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
53
+ s.add_dependency(%q<json>, ["~> 1.4.6"])
54
+ s.add_dependency(%q<rspec>, ["~> 1.3.0"])
52
55
  end
53
56
  else
54
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
57
+ s.add_dependency(%q<json>, ["~> 1.4.6"])
58
+ s.add_dependency(%q<rspec>, ["~> 1.3.0"])
55
59
  end
56
60
  end
57
61
 
data/lib/geo_ip.rb CHANGED
@@ -1,18 +1,22 @@
1
- SERVICE_URL = "http://ipinfodb.com/"
1
+ SERVICE_URL = "http://api.ipinfodb.com/v2/"
2
2
  CITY_API = "ip_query.php"
3
3
  COUNTRY_API = "ip_query_country.php"
4
4
  IPV4_REGEXP = /\A(?:25[0-5]|(?:2[0-4]|1\d|[1-9])?\d)(?:\.(?:25[0-5]|(?:2[0-4]|1\d|[1-9])?\d)){3}\z/
5
5
 
6
- require 'rubygems'
7
6
  require 'json'
8
7
  require 'uri'
9
8
  require 'net/http'
10
9
 
11
10
  class GeoIp
12
- # <b>DEPRECATED:</b> Please use <tt>geolocation</tt> instead.
13
- def self.remote_geolocation(ip, timezone=false)
14
- warn "DEPRECATION WARNING: `remote_geolocation` is deprecated and will be removed from 0.3. Use `geolocation` instead."
15
- geolocation(ip, {:timezone => timezone})
11
+
12
+ @@api_key = nil
13
+
14
+ def self.api_key
15
+ @@api_key
16
+ end
17
+
18
+ def self.api_key=(api_key)
19
+ @@api_key = api_key
16
20
  end
17
21
 
18
22
  # Retreive the remote location of a given ip address.
@@ -26,10 +30,11 @@ class GeoIp
26
30
  def self.geolocation(ip, options={})
27
31
  @precision = options[:precision] || :city
28
32
  @timezone = options[:timezone] || false
33
+ raise "API key must be set first: GeoIp.api_key = 'YOURKEY'" if self.api_key.nil?
29
34
  raise "Invalid IP address" unless ip.to_s =~ IPV4_REGEXP
30
35
  raise "Invalid precision" unless [:country, :city].include?(@precision)
31
36
  raise "Invalid timezone" unless [true, false].include?(@timezone)
32
- uri = "#{SERVICE_URL}#{@country ? COUNTRY_API : CITY_API}?ip=#{ip}&output=json&timezone=#{@timezone}"
37
+ uri = "#{SERVICE_URL}#{@country ? COUNTRY_API : CITY_API}?key=#{self.api_key}&ip=#{ip}&output=json&timezone=#{@timezone}"
33
38
  url = URI.parse(uri)
34
39
  reply = JSON.parse(Net::HTTP.get(url))
35
40
  location = convert_keys reply
@@ -0,0 +1 @@
1
+ key: YOUR_KEY_HERE
data/spec/geo_ip_spec.rb CHANGED
@@ -4,6 +4,24 @@ IP_PRIVATE = '10.0.0.1'
4
4
  IP_LOCAL = '127.0.0.1'
5
5
 
6
6
  describe "GeoIp" do
7
+
8
+ before(:all) do
9
+ api_config = YAML.load_file(File.dirname(__FILE__) + '/api.yml')
10
+ GeoIp.api_key = api_config['key']
11
+ end
12
+
13
+ context "api_key" do
14
+ it "should return the API key when set" do
15
+ GeoIp.api_key = "my_api_key"
16
+ GeoIp.api_key.should == "my_api_key"
17
+ end
18
+
19
+ it "should throw an error when API key is not set" do
20
+ GeoIp.api_key = nil
21
+ lambda {GeoIp.geolocation(IP_GOOGLE_US)}.should raise_error
22
+ end
23
+ end
24
+
7
25
  context "city" do
8
26
  it "should return the correct city for a public ip address" do
9
27
  geolocation = GeoIp.geolocation(IP_GOOGLE_US)
@@ -65,7 +83,7 @@ describe "GeoIp" do
65
83
  it "should return the correct timezone information for a public ip address" do
66
84
  geolocation = GeoIp.geolocation(IP_GOOGLE_US, {:timezone => true})
67
85
  geolocation[:timezone_name].should == 'America/Los_Angeles'
68
- geolocation[:utc_offset].should == -25200
86
+ geolocation[:utc_offset].should == -28800
69
87
  geolocation[:dst?].should_not be_nil # true if dst?, false if not dst?
70
88
  end
71
89
 
@@ -90,12 +108,4 @@ describe "GeoIp" do
90
108
  geolocation[:dst?].should be_nil
91
109
  end
92
110
  end
93
-
94
- context "deprecated" do
95
- it "should return the correct country for a public ip address" do
96
- geolocation = GeoIp.remote_geolocation(IP_GOOGLE_US)
97
- geolocation[:country_code].should == 'US'
98
- geolocation[:country_name].should == 'United States'
99
- end
100
- end
101
111
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geo_ip
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 19
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 2
8
+ - 3
8
9
  - 0
9
- version: 0.2.0
10
+ version: 0.3.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Jeroen Jacobs
@@ -14,25 +15,43 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-03-25 00:00:00 +01:00
18
+ date: 2010-11-16 00:00:00 +01:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- name: rspec
22
+ name: json
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
- - - ">="
27
+ - - ~>
26
28
  - !ruby/object:Gem::Version
29
+ hash: 11
27
30
  segments:
28
31
  - 1
29
- - 2
30
- - 9
31
- version: 1.2.9
32
- type: :development
32
+ - 4
33
+ - 6
34
+ version: 1.4.6
35
+ type: :runtime
33
36
  version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 27
46
+ segments:
47
+ - 1
48
+ - 3
49
+ - 0
50
+ version: 1.3.0
51
+ type: :development
52
+ version_requirements: *id002
34
53
  description: A call to the ipinfodb.com will be done to retreive the geolocation based on the IP address. No need to include a database file in the application.
35
- email: jj@redstorm.com
54
+ email: jacobsjeroen@gmail.com
36
55
  executables: []
37
56
 
38
57
  extensions: []
@@ -51,6 +70,7 @@ files:
51
70
  - geo_ip.gemspec
52
71
  - init.rb
53
72
  - lib/geo_ip.rb
73
+ - spec/api.yml.example
54
74
  - spec/geo_ip_spec.rb
55
75
  - spec/spec.opts
56
76
  - spec/spec_helper.rb
@@ -64,23 +84,27 @@ rdoc_options:
64
84
  require_paths:
65
85
  - lib
66
86
  required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
67
88
  requirements:
68
89
  - - ">="
69
90
  - !ruby/object:Gem::Version
91
+ hash: 3
70
92
  segments:
71
93
  - 0
72
94
  version: "0"
73
95
  required_rubygems_version: !ruby/object:Gem::Requirement
96
+ none: false
74
97
  requirements:
75
98
  - - ">="
76
99
  - !ruby/object:Gem::Version
100
+ hash: 3
77
101
  segments:
78
102
  - 0
79
103
  version: "0"
80
104
  requirements: []
81
105
 
82
106
  rubyforge_project:
83
- rubygems_version: 1.3.6
107
+ rubygems_version: 1.3.7
84
108
  signing_key:
85
109
  specification_version: 3
86
110
  summary: Retreive the geolocation of an IP address based on the ipinfodb.com webservice