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 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: