geo_locale 0.2.0 → 0.9.5
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -3
- data/README.md +5 -5
- data/geo_locale.gemspec +4 -5
- data/lib/geo_locale/country_code.rb +9 -1
- data/lib/geo_locale/locale.rb +2 -2
- data/lib/geo_locale/version.rb +1 -1
- data/spec/spec_helper.rb +57 -0
- data/spec/tests/geolocation_spec.rb +51 -0
- metadata +31 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3674b3cd123677a6c74a5e9e6d8c59cf85f6fdcb
|
4
|
+
data.tar.gz: 8ea2adb1587b1b95c88d8182205b38f4656709d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc991bf5ed9e30255a4896607254b89ab1a55f36d3bac0a8e6a221077cac7fa229a6136e94e4285994f76703ad465f86ff8e47f1a13f9e3702196585e708098e
|
7
|
+
data.tar.gz: 0722d6adc4567702cacd7f011018554829aa25736a86f161b2f2cfba200c97da9ff7fca025c910cc4842aaaec118aa0d00e5fe0e4ef69cdb6645b616805402f7
|
data/CHANGELOG.md
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
4
4
|
|
5
|
-
## [
|
6
|
-
###
|
7
|
-
|
5
|
+
## [0.9.5] - 2016-05-06
|
6
|
+
### Updated
|
7
|
+
* API (can pass request_headers hash in addition to IP)
|
8
|
+
### Added
|
9
|
+
* Cloudflare support
|
8
10
|
|
9
11
|
## [0.2.0] - 2016-01-13
|
10
12
|
### Added
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# GeoLocale v0.
|
2
|
-
Simple wrapper for GeoIP gem with some redundancy on GeoKit to get a two-letter country code or locale from an IP
|
1
|
+
# GeoLocale v0.9.5
|
2
|
+
Simple wrapper for GeoIP gem with some redundancy on GeoKit to get a two-letter country code or locale from an IP and, (optionally) request headers if a service like cloudflare is used.
|
3
3
|
|
4
4
|
## Basic use-case
|
5
5
|
Detect application user's origin and display app in that language.
|
@@ -11,7 +11,7 @@ Ruby 2.0.0 and greater.
|
|
11
11
|
|
12
12
|
```ruby
|
13
13
|
# in Gemfile
|
14
|
-
gem 'geo_locale' # and bundle
|
14
|
+
gem 'geo_locale', '~> 0.9.5' # and bundle
|
15
15
|
```
|
16
16
|
|
17
17
|
## Usage
|
@@ -29,13 +29,13 @@ end
|
|
29
29
|
|
30
30
|
### To get country code:
|
31
31
|
```ruby
|
32
|
-
GeoLocale.country_code(ip: request.remote_ip)
|
32
|
+
GeoLocale.country_code(ip: request.remote_ip, request_headers: request.headers)
|
33
33
|
# => "en"
|
34
34
|
```
|
35
35
|
|
36
36
|
### To get locale:
|
37
37
|
```ruby
|
38
|
-
GeoLocale.locale(country_code: "gb")
|
38
|
+
GeoLocale.locale(country_code: "gb", request_headers: request.headers)
|
39
39
|
#=> "en"
|
40
40
|
GeoLocale.locale(country_code: "gb", lcid: true)
|
41
41
|
#=> "en-gb"
|
data/geo_locale.gemspec
CHANGED
@@ -22,13 +22,12 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
spec.rubyforge_project = "geo_locale"
|
24
24
|
|
25
|
-
spec.add_development_dependency "bundler"
|
26
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
-
spec.add_development_dependency 'rspec', "~> 3.1.0"
|
28
|
-
spec.add_development_dependency 'pry'
|
29
|
-
|
30
25
|
spec.add_dependency 'geoip'
|
31
26
|
spec.add_dependency 'geokit'
|
32
27
|
spec.add_dependency 'geokit-rails'
|
33
28
|
|
29
|
+
spec.add_development_dependency "bundler"
|
30
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
31
|
+
spec.add_development_dependency 'rspec', "~> 3.1.0"
|
32
|
+
spec.add_development_dependency 'pry'
|
34
33
|
end
|
@@ -3,7 +3,12 @@ require 'timeout'
|
|
3
3
|
module GeoLocale
|
4
4
|
IP_REGEX = /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/
|
5
5
|
|
6
|
-
def self.country_code(ip: "") # ip = "12.12.12.12"
|
6
|
+
def self.country_code(ip: "", request_headers: {}) # ip = "12.12.12.12"
|
7
|
+
if request_headers.present?
|
8
|
+
cloudflare_country_code = cloudflare_country_code(request_headers)
|
9
|
+
return cloudflare_country_code.downcase if cloudflare_country_code.present? && cloudflare_country_code != "XX"
|
10
|
+
end
|
11
|
+
|
7
12
|
return GeoLocale.config.localhost_country if ip == GeoLocale::LOCALHOST_IP && GeoLocale.config.localhost_country.present?
|
8
13
|
country_code = GeoLocale.geo_ip_try(ip)
|
9
14
|
if country_code.present?
|
@@ -20,6 +25,9 @@ module GeoLocale
|
|
20
25
|
end
|
21
26
|
|
22
27
|
private
|
28
|
+
def self.cloudflare_country_code(request_headers)
|
29
|
+
request_headers["HTTP_CF_IPCOUNTRY"]
|
30
|
+
end
|
23
31
|
|
24
32
|
def self.geo_ip_try(ip)
|
25
33
|
begin
|
data/lib/geo_locale/locale.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module GeoLocale
|
2
2
|
|
3
|
-
def self.locale (ip: "", country_code: nil, lcid: false)
|
4
|
-
country_code ||= GeoLocale.country_code(ip: ip)
|
3
|
+
def self.locale (ip: "", country_code: nil, lcid: false, request_headers: {})
|
4
|
+
country_code ||= GeoLocale.country_code(ip: ip, request_headers: request_headers)
|
5
5
|
GeoLocale.get_locale_or_lcid(country_code: country_code, lcid: lcid)
|
6
6
|
end
|
7
7
|
|
data/lib/geo_locale/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -14,4 +14,61 @@ RSpec.configure do |config|
|
|
14
14
|
IR_IPS =["77.104.75.76", "94.74.132.65"]
|
15
15
|
IE_IPS =["54.170.245.171", "54.171.4.57", "176.34.86.253"]
|
16
16
|
PL_IPS =["83.3.115.58", "109.207.54.81", "88.199.29.50"]
|
17
|
+
|
18
|
+
XX_CLOUDFLARE_REQUEST_HEADERS = {
|
19
|
+
"rack.version"=>[1, 3],
|
20
|
+
"rack.errors"=>"",
|
21
|
+
"rack.multithread"=>false,
|
22
|
+
"rack.multiprocess"=>false,
|
23
|
+
"rack.run_once"=>false,
|
24
|
+
"SCRIPT_NAME"=>"",
|
25
|
+
"QUERY_STRING"=>"pp=flamegraph",
|
26
|
+
"SERVER_PROTOCOL"=>"HTTP/1.1",
|
27
|
+
"SERVER_SOFTWARE"=>"2.13.4",
|
28
|
+
"GATEWAY_INTERFACE"=>"CGI/1.2",
|
29
|
+
"REQUEST_METHOD"=>"GET",
|
30
|
+
"REQUEST_PATH"=>"/lv/lv/p/k2/landing",
|
31
|
+
"REQUEST_URI"=>"/lv/lv/p/k2/landing?pp=flamegraph",
|
32
|
+
"HTTP_VERSION"=>"HTTP/1.1",
|
33
|
+
"HTTP_HOST"=>"localhost:3000",
|
34
|
+
"HTTP_USER_AGENT"=> "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:43.0) Gecko/20100101 Firefox/43.0",
|
35
|
+
"HTTP_ACCEPT"=> "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
36
|
+
"HTTP_ACCEPT_LANGUAGE"=>"en-US,en;q=0.5",
|
37
|
+
"HTTP_ACCEPT_ENCODING"=>"gzip, deflate",
|
38
|
+
"HTTP_CONNECTION"=>"keep-alive",
|
39
|
+
"HTTP_CACHE_CONTROL"=>"max-age=0",
|
40
|
+
"SERVER_NAME"=>"localhost",
|
41
|
+
"SERVER_PORT"=>"3000",
|
42
|
+
"PATH_INFO"=>"/lv/lv/p/k2/landing",
|
43
|
+
"REMOTE_ADDR"=>"::1",
|
44
|
+
"puma.socket"=>"",
|
45
|
+
"rack.hijack?"=>true,
|
46
|
+
"rack.hijack"=>"",
|
47
|
+
"rack.input"=>"",
|
48
|
+
"rack.url_scheme"=>"http",
|
49
|
+
"rack.after_reply"=>[],
|
50
|
+
"ORIGINAL_FULLPATH"=>"/lv/lv/p/k2/landing?pp=flamegraph",
|
51
|
+
"ORIGINAL_SCRIPT_NAME"=>"",
|
52
|
+
"HTTP_CF_IPCOUNTRY"=>"XX"
|
53
|
+
}
|
54
|
+
|
55
|
+
LV_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
56
|
+
LT_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
57
|
+
EE_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
58
|
+
RU_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
59
|
+
US_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
60
|
+
GB_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
61
|
+
IR_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
62
|
+
IE_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
63
|
+
PL_CLOUDFLARE_REQUEST_HEADERS = XX_CLOUDFLARE_REQUEST_HEADERS.clone
|
64
|
+
|
65
|
+
LV_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "LV"
|
66
|
+
LT_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "LT"
|
67
|
+
EE_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "EE"
|
68
|
+
RU_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "RU"
|
69
|
+
US_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "US"
|
70
|
+
GB_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "GB"
|
71
|
+
IR_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "IR"
|
72
|
+
IE_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "IE"
|
73
|
+
PL_CLOUDFLARE_REQUEST_HEADERS["HTTP_CF_IPCOUNTRY"] = "PL"
|
17
74
|
end
|
@@ -19,6 +19,57 @@ describe "GeoLocale" do
|
|
19
19
|
GeoLocale.configure {}
|
20
20
|
end
|
21
21
|
|
22
|
+
describe ".country_code(ip: "", request_headers: {})" do
|
23
|
+
before :all do
|
24
|
+
@ip = "0.0.0.0"
|
25
|
+
end
|
26
|
+
|
27
|
+
context "when HTTP_CF_IPCOUNTRY is " do
|
28
|
+
|
29
|
+
it "LV should return lv" do
|
30
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: LV_CLOUDFLARE_REQUEST_HEADERS)).to eq "lv"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "LT should return lt" do
|
34
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: LT_CLOUDFLARE_REQUEST_HEADERS)).to eq "lt"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "EE should return ee" do
|
38
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: EE_CLOUDFLARE_REQUEST_HEADERS)).to eq "ee"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "RU should return ru" do
|
42
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: RU_CLOUDFLARE_REQUEST_HEADERS)).to eq "ru"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "US should return us" do
|
46
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: US_CLOUDFLARE_REQUEST_HEADERS)).to eq "us"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "GB should return gb" do
|
50
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: GB_CLOUDFLARE_REQUEST_HEADERS)).to eq "gb"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "IR should return ir" do
|
54
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: IR_CLOUDFLARE_REQUEST_HEADERS)).to eq "ir"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "IE should return ie" do
|
58
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: IE_CLOUDFLARE_REQUEST_HEADERS)).to eq "ie"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "PL should return pl" do
|
62
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: PL_CLOUDFLARE_REQUEST_HEADERS)).to eq "pl"
|
63
|
+
end
|
64
|
+
|
65
|
+
it "XX should return fallback to default_country" do
|
66
|
+
expect(GeoLocale.country_code(ip: @ip, request_headers: XX_CLOUDFLARE_REQUEST_HEADERS)).to eq "us"
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
22
73
|
describe ".country_code(ip: "")" do
|
23
74
|
it "should return lv for #{lv_ip}" do
|
24
75
|
expect(GeoLocale.country_code(ip: lv_ip)).to eq "lv"
|
metadata
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geo_locale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Epigene
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: geoip
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
|
-
type: :
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
@@ -25,35 +25,35 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: geokit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
34
|
-
type: :
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: geokit-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
-
type: :
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - '>='
|
@@ -67,41 +67,41 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
82
|
+
version: '10.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
90
|
-
type: :
|
89
|
+
version: 3.1.0
|
90
|
+
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 3.1.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: pry
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
|
-
type: :
|
104
|
+
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|