rack-geo-locale 0.0.1 → 0.0.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -1,16 +1,17 @@
1
- require 'ostruct'
1
+ require 'geoip'
2
2
 
3
3
  module Rack
4
4
  class GeoLocale
5
5
  def initialize(app)
6
6
  @app = app
7
-
8
- @geoip = GeoIP.new(ENV["GEOIP_DATABASE"])
9
7
  end
10
8
 
11
9
  def call(env)
12
- env["locale.country"] = parse_country(env)
13
- env["locale.languages"] = parse_languages(env)
10
+ env["locale.language"], env["locale.country"] = parse_locale(env)
11
+
12
+ if country = parse_country(env)
13
+ env["locale.country"] = country
14
+ end
14
15
 
15
16
  @app.call(env)
16
17
  end
@@ -21,7 +22,7 @@ module Rack
21
22
 
22
23
  return nil unless remote_addr
23
24
 
24
- result = @geoip.country(remote_addr).country_code2
25
+ result = geoip.country(remote_addr).country_code2
25
26
 
26
27
  if result != "--"
27
28
  result
@@ -30,7 +31,7 @@ module Rack
30
31
  end
31
32
  end
32
33
 
33
- def parse_languages(env)
34
+ def parse_locale(env)
34
35
  env["HTTP_ACCEPT_LANGUAGE"] ||= ""
35
36
  language_ranges = env["HTTP_ACCEPT_LANGUAGE"].split(",")
36
37
  language_ranges.map do |language_range|
@@ -38,10 +39,30 @@ module Rack
38
39
 
39
40
  locale, q = language_range.split(";q=")
40
41
 
41
- language = locale.strip.split("-").first
42
+ language, country = locale.strip.split("-")
43
+
44
+ {:language => language, :country => country, :q => q}
45
+ end.sort {|x, y| y[:q] <=> x[:q]}.map{|o| [o[:language], o[:country]]}.first
46
+ end
47
+
48
+ def database?
49
+ if ENV["GEOIP_DATABASE"]
50
+ ::File.exist? ENV["GEOIP_DATABASE"]
51
+ else
52
+ false
53
+ end
54
+ end
55
+
56
+ def database
57
+ ENV["GEOIP_DATABASE"]
58
+ end
42
59
 
43
- {:language => language, :q => q}
44
- end.sort {|x, y| y[:q] <=> x[:q]}.map{|lr| lr[:language]}
60
+ def geoip
61
+ if database?
62
+ GeoIP.new(database)
63
+ else
64
+ nil
65
+ end
45
66
  end
46
67
  end
47
68
  end
@@ -43,44 +43,45 @@ describe Rack::GeoLocale do
43
43
  describe "parsing HTTP_ACCEPT_LANGUAGE" do
44
44
  it "should return an empty result if no HTTP_ACCEPT_LANGUAGE passed" do
45
45
  get '/', {}, {}
46
- last_request.env["locale.languages"].should == []
46
+ last_request.env["locale.language"].should == nil
47
47
  end
48
48
 
49
49
  it "should parse HTTP_ACCEPT_LANGUAGE 'en'" do
50
50
  get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "en"}
51
- last_request.env["locale.languages"].should == ["en"]
51
+ last_request.env["locale.language"].should == "en"
52
52
  end
53
53
 
54
54
  it "should parse HTTP_ACCEPT_LANGUAGE 'sv'" do
55
55
  get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "sv"}
56
- last_request.env["locale.languages"].should == ["sv"]
56
+ last_request.env["locale.language"].should == "sv"
57
57
  end
58
58
 
59
59
  it "should parse HTTP_ACCEPT_LANGUAGE 'sv;q=0.1, en'" do
60
60
  get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "sv;q=0.1, en"}
61
- last_request.env["locale.languages"].should == ["en", "sv"]
61
+ last_request.env["locale.language"].should == "en"
62
62
  end
63
63
 
64
64
  it "should parse HTTP_ACCEPT_LANGUAGE 'sv, en'" do
65
65
  get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "sv, en"}
66
- last_request.env["locale.languages"].should == ["sv", "en"]
66
+ last_request.env["locale.language"].should == "sv"
67
67
  end
68
68
 
69
69
  it "should parse HTTP_ACCEPT_LANGUAGE 'en;q=0.4, de;q=0.7'" do
70
70
  get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "en;q=0.4, de;q=0.7"}
71
- last_request.env["locale.languages"].should == ["de", "en"]
71
+ last_request.env["locale.language"].should == "de"
72
72
  end
73
73
 
74
74
  it "should parse HTTP_ACCEPT_LANGUAGE 'en-US;q=0.7'" do
75
75
  get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "en-US;q=0.7"}
76
- last_request.env["locale.languages"].should == ["en"]
76
+ last_request.env["locale.language"].should == "en"
77
77
  end
78
78
  end
79
79
 
80
80
  describe "missing database" do
81
- xit "should fallback on HTTP_ACCEPT_LANGUAGE" do
82
- get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "en-US;q=0.7"}
83
- last_request.env["locale.languages"].should == ["en"]
81
+ it "should fallback on HTTP_ACCEPT_LANGUAGE for country" do
82
+ get '/', {}, {"HTTP_ACCEPT_LANGUAGE" => "en-US", "REMOTE_ADDR" => "10.0.0.1"}
83
+ last_request.env["locale.language"].should == "en"
84
+ last_request.env["locale.country"].should == "US"
84
85
  end
85
86
  end
86
87
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-geo-locale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70169376395940 !ruby/object:Gem::Requirement
16
+ requirement: &70157091906880 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70169376395940
24
+ version_requirements: *70157091906880
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rack-test
27
- requirement: &70169376395300 !ruby/object:Gem::Requirement
27
+ requirement: &70157091905180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70169376395300
35
+ version_requirements: *70157091905180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guard-rspec
38
- requirement: &70169376394740 !ruby/object:Gem::Requirement
38
+ requirement: &70157091903000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70169376394740
46
+ version_requirements: *70157091903000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rack
49
- requirement: &70169376394220 !ruby/object:Gem::Requirement
49
+ requirement: &70157091900900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70169376394220
57
+ version_requirements: *70157091900900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: geoip
60
- requirement: &70169376393660 !ruby/object:Gem::Requirement
60
+ requirement: &70157091899860 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70169376393660
68
+ version_requirements: *70157091899860
69
69
  description: Simple Rack middleware for setting the locale.country via GeoIP using
70
70
  the MaxMind GeoIP database, and setting the locale.languages based on the HTTP_ACCEPT_LANGUAGE
71
71
  header.