geo-lite-city 0.0.1
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/README.md +47 -0
- data/lib/geo.rb +83 -0
- data/lib/geo/GeoLiteCity.dat +0 -0
- data/lib/geo/etest.rb +68 -0
- data/lib/geo/instance.rb +7 -0
- data/lib/geo/version.rb +3 -0
- data/test/geo_test.rb +10 -0
- data/test/test_helper.rb +10 -0
- metadata +71 -0
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# geo lite city
|
2
|
+
|
3
|
+
Because sometimes you need just SQL only.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
gem install geo-lite-city
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
require "geo"
|
12
|
+
Geo.city("8.8.8.8")
|
13
|
+
|
14
|
+
returns
|
15
|
+
|
16
|
+
{
|
17
|
+
area_code: 650,
|
18
|
+
dma_code: 807,
|
19
|
+
city_name: "Mountain View",
|
20
|
+
continent_code: "NA",
|
21
|
+
country_code: "NA.US"
|
22
|
+
country_code2: "US",
|
23
|
+
country_code3: "USA",
|
24
|
+
country_name: "United States",
|
25
|
+
ip: "8.8.8.8",
|
26
|
+
latitude: 37.385999999999996,
|
27
|
+
longitude: -122.0838,
|
28
|
+
name: "Mountain View, CA, United States",
|
29
|
+
postal_code: "",
|
30
|
+
region_code: "NA.US.CA",
|
31
|
+
region_name: "CA",
|
32
|
+
request: "8.8.8.8",
|
33
|
+
timezone: "America/Los_Angeles",
|
34
|
+
}
|
35
|
+
|
36
|
+
## License
|
37
|
+
|
38
|
+
The geo-lite-city gem is distributed under the terms of the Modified BSD License, see LICENSE.BSD for details.
|
39
|
+
|
40
|
+
The file GeoLiteCity.dat, which is distributed with this gem, is (c) MaxMind, distributed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
|
41
|
+
|
42
|
+
Using this gem might require you to attribute the usage of the MaxMind databases
|
43
|
+
by including the following in all advertising and documentation mentioning
|
44
|
+
features of or use of this database:
|
45
|
+
|
46
|
+
This product includes GeoLite data created by MaxMind, available from
|
47
|
+
<a href="http://www.maxmind.com">http://www.maxmind.com</a>.
|
data/lib/geo.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require "geoip"
|
2
|
+
|
3
|
+
module Geo
|
4
|
+
end
|
5
|
+
|
6
|
+
require "geo/instance"
|
7
|
+
require "expectation"
|
8
|
+
|
9
|
+
module Geo
|
10
|
+
extend Instance
|
11
|
+
|
12
|
+
# lookup the IP in the GeoLiteCity database on city level.
|
13
|
+
def self.city(ip)
|
14
|
+
# Use some global IP if we are running locally.
|
15
|
+
if !ip || ip == "127.0.0.1"
|
16
|
+
ip = "www.heise.de"
|
17
|
+
end
|
18
|
+
|
19
|
+
if city = instance.city(ip)
|
20
|
+
complete_city(city)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def self.complete_city(city)
|
27
|
+
city = city.to_hash
|
28
|
+
|
29
|
+
parts = city.values_at :city_name, :region_name, :country_name
|
30
|
+
city_name = parts.grep(/[a-zA-Z]/).join(", ")
|
31
|
+
|
32
|
+
parts = city.values_at :continent_code, :country_code2, :region_name
|
33
|
+
region_code = parts.grep(/[a-zA-Z]/).join(".")
|
34
|
+
|
35
|
+
parts = city.values_at :continent_code, :country_code2
|
36
|
+
country_code = parts.grep(/[a-zA-Z]/).join(".")
|
37
|
+
|
38
|
+
city.update name: city_name, region_code: region_code, country_code: country_code
|
39
|
+
end
|
40
|
+
|
41
|
+
public
|
42
|
+
|
43
|
+
def self.cities(s, &block)
|
44
|
+
expect! s => [ Regexp, /../ ]
|
45
|
+
|
46
|
+
s = Regexp.compile("^" + Regexp.escape(s) + "$") unless s.is_a?(Regexp)
|
47
|
+
|
48
|
+
quietly do
|
49
|
+
r = []
|
50
|
+
|
51
|
+
instance.each.select do |rec|
|
52
|
+
next if rec.city_name !~ s
|
53
|
+
|
54
|
+
rec = complete_city(rec)
|
55
|
+
yield rec if block
|
56
|
+
r.push rec
|
57
|
+
end
|
58
|
+
|
59
|
+
r
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# quietly and silence_stream are taken from activesupport
|
66
|
+
|
67
|
+
def self.quietly
|
68
|
+
silence_stream(STDOUT) do
|
69
|
+
silence_stream(STDERR) do
|
70
|
+
yield
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.silence_stream(stream)
|
76
|
+
old_stream = stream.dup
|
77
|
+
stream.reopen(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ? 'NUL:' : '/dev/null')
|
78
|
+
stream.sync = true
|
79
|
+
yield
|
80
|
+
ensure
|
81
|
+
stream.reopen(old_stream)
|
82
|
+
end
|
83
|
+
end
|
Binary file
|
data/lib/geo/etest.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
module Geo::Etest
|
2
|
+
def test_geoip_google
|
3
|
+
assert_equal Geo.city("8.8.8.8"),
|
4
|
+
:request => "8.8.8.8",
|
5
|
+
:ip => "8.8.8.8",
|
6
|
+
:country_code2 => "US",
|
7
|
+
:country_code3 => "USA",
|
8
|
+
:country_name => "United States",
|
9
|
+
:continent_code => "NA",
|
10
|
+
:region_name => "CA",
|
11
|
+
:city_name => "Mountain View",
|
12
|
+
:postal_code => "",
|
13
|
+
:latitude => 37.385999999999996,
|
14
|
+
:longitude => -122.0838,
|
15
|
+
:dma_code => 807,
|
16
|
+
:area_code => 650,
|
17
|
+
:timezone => "America/Los_Angeles",
|
18
|
+
:name => "Mountain View, CA, United States",
|
19
|
+
:region_code => "NA.US.CA",
|
20
|
+
:country_code => "NA.US"
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_geoip_heise
|
24
|
+
assert_equal Geo.city("127.0.0.1"),
|
25
|
+
:request => "www.heise.de",
|
26
|
+
:ip => "193.99.144.85",
|
27
|
+
:country_code2 => "DE",
|
28
|
+
:country_code3 => "DEU",
|
29
|
+
:country_name => "Germany",
|
30
|
+
:continent_code => "EU",
|
31
|
+
:region_name => "06",
|
32
|
+
:city_name => "Hanover",
|
33
|
+
:postal_code => "",
|
34
|
+
:latitude => 52.36670000000001,
|
35
|
+
:longitude => 9.716700000000003,
|
36
|
+
:dma_code => nil,
|
37
|
+
:area_code => nil,
|
38
|
+
:timezone => "Europe/Berlin",
|
39
|
+
:name => "Hanover, Germany",
|
40
|
+
:region_code => "EU.DE",
|
41
|
+
:country_code => "EU.DE"
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_geoip_cities
|
45
|
+
berlins = Geo.cities("Berlin")
|
46
|
+
assert berlins.length > 1
|
47
|
+
assert_equal berlins.first, {
|
48
|
+
:area_code => nil,
|
49
|
+
:city_name => "Berlin",
|
50
|
+
:dma_code => nil,
|
51
|
+
:country_code => "EU.DE",
|
52
|
+
:country_code2 => "DE",
|
53
|
+
:country_code3 => "DEU",
|
54
|
+
:country_name => "Germany",
|
55
|
+
:continent_code => "EU",
|
56
|
+
:ip => "",
|
57
|
+
:latitude => 52.516699999999986,
|
58
|
+
:longitude => 13.400000000000006,
|
59
|
+
:name => "Berlin, Germany",
|
60
|
+
:postal_code => "",
|
61
|
+
:request => "",
|
62
|
+
:region_code => "EU.DE",
|
63
|
+
:region_name => "16",
|
64
|
+
:timezone => "Europe/Berlin"
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
data/lib/geo/instance.rb
ADDED
data/lib/geo/version.rb
ADDED
data/test/geo_test.rb
ADDED
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: geo-lite-city
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- radiospiel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: geoip
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.2'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.2'
|
30
|
+
description: Sometimes you just need SQL.
|
31
|
+
email: eno@radiospiel.org
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- lib/geo/etest.rb
|
37
|
+
- lib/geo/GeoLiteCity.dat
|
38
|
+
- lib/geo/instance.rb
|
39
|
+
- lib/geo/version.rb
|
40
|
+
- lib/geo.rb
|
41
|
+
- README.md
|
42
|
+
- test/geo_test.rb
|
43
|
+
- test/test_helper.rb
|
44
|
+
homepage: http://github.com/radiospiel/geo-lite-city
|
45
|
+
licenses: []
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
hash: 1806988417301298879
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 1.8.25
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: Sometimes you just need SQL.
|
71
|
+
test_files: []
|