geo_locale 0.2.0 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f0e323deff5492ea6d479dd332e31d047c5a46f
4
- data.tar.gz: 6a243e05b9c4f5bd121a8d931f1174b48fffec1c
3
+ metadata.gz: 3674b3cd123677a6c74a5e9e6d8c59cf85f6fdcb
4
+ data.tar.gz: 8ea2adb1587b1b95c88d8182205b38f4656709d6
5
5
  SHA512:
6
- metadata.gz: c9d8c58a6ab5ab076bfe581e24932998044f24c3d33810b618d3fa566d1611620013b25172aa455b109e9c42045a865a71f723c6a67cb5f30f2c90c9aa2678e7
7
- data.tar.gz: 74e181e0d2ab3c9393ca0e1593b5c97d8d65643e15ed934cc875a098e535519c8976d475cf1d2c4b716cf1aad80fde3f786d4110f25ef4b810b280d98b4028a5
6
+ metadata.gz: dc991bf5ed9e30255a4896607254b89ab1a55f36d3bac0a8e6a221077cac7fa229a6136e94e4285994f76703ad465f86ff8e47f1a13f9e3702196585e708098e
7
+ data.tar.gz: 0722d6adc4567702cacd7f011018554829aa25736a86f161b2f2cfba200c97da9ff7fca025c910cc4842aaaec118aa0d00e5fe0e4ef69cdb6645b616805402f7
@@ -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
- ## [Release candidate][ - - ]
6
- ### Changed
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.0
2
- Simple wrapper for GeoIP gem with some redundancy on GeoKit to get a two-letter country code or locale from an IP address.
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"
@@ -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
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module GeoLocale
2
- VERSION = "0.2.0"
2
+ VERSION = "0.9.5"
3
3
  end
@@ -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.2.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-01-13 00:00:00.000000000 Z
11
+ date: 2016-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
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: :development
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: rake
28
+ name: geokit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
34
- type: :development
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: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: geokit-rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
- version: 3.1.0
48
- type: :development
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: 3.1.0
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: pry
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: geoip
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: :runtime
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: geokit
84
+ name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
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: '0'
96
+ version: 3.1.0
97
97
  - !ruby/object:Gem::Dependency
98
- name: geokit-rails
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: :runtime
104
+ type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements: