rack-http-accept-language 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0cc2d8075572ce2a2ca152fbda94ff02c4827590
4
+ data.tar.gz: e59c620c556d71c51fd5bdb1ecbb806dac6adaa6
5
+ SHA512:
6
+ metadata.gz: 135cde2db0fdc9e0514ec758ed52af0d65617a9fb465eee0b3372f89f790eb943bd2422513036a5cd069094d6518e8d06ca6a7395fcd0796f7141271b5d6f9e5
7
+ data.tar.gz: c470ef9773c02eec6b1b75ad42872c998a495e699b2e1defb97c432834f567599d2efc9c15602b87fbccbe7f952740a2dffde40c1d618f6f54450500ee188a89
data/.gitignore ADDED
@@ -0,0 +1,36 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ ## Specific to RubyMotion:
14
+ .dat*
15
+ .repl_history
16
+ build/
17
+
18
+ ## Documentation cache and generated files:
19
+ /.yardoc/
20
+ /_yardoc/
21
+ /doc/
22
+ /rdoc/
23
+
24
+ ## Environment normalization:
25
+ /.bundle/
26
+ /vendor/bundle
27
+ /lib/bundler/man/
28
+
29
+ # for a library or gem, you might want to ignore these files since the code is
30
+ # intended to run in multiple environments; otherwise, check them in:
31
+ # Gemfile.lock
32
+ # .ruby-version
33
+ # .ruby-gemset
34
+
35
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
36
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,14 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
4
+ Documentation:
5
+ Enabled: false
6
+
7
+ Style/FileName:
8
+ Enabled: false
9
+
10
+ Style/FrozenStringLiteralComment:
11
+ EnforcedStyle: always
12
+
13
+ Style/BracesAroundHashParameters:
14
+ EnforcedStyle: context_dependent
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.0
4
+ sudo: false
5
+ notifications:
6
+ email: false
7
+
8
+ script:
9
+ - bundle exec rspec
10
+ - bundle exec rubocop
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org'
3
+
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,68 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rack-http-accept-language (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.2.0)
10
+ codeclimate-test-reporter (0.4.8)
11
+ simplecov (>= 0.7.1, < 1.0.0)
12
+ coderay (1.1.1)
13
+ diff-lcs (1.2.5)
14
+ docile (1.1.5)
15
+ json (1.8.3)
16
+ method_source (0.8.2)
17
+ parser (2.3.0.6)
18
+ ast (~> 2.2)
19
+ powerpack (0.1.1)
20
+ pry (0.10.3)
21
+ coderay (~> 1.1.0)
22
+ method_source (~> 0.8.1)
23
+ slop (~> 3.4)
24
+ rack (1.6.4)
25
+ rack-test (0.6.3)
26
+ rack (>= 1.0)
27
+ rainbow (2.1.0)
28
+ rspec (3.4.0)
29
+ rspec-core (~> 3.4.0)
30
+ rspec-expectations (~> 3.4.0)
31
+ rspec-mocks (~> 3.4.0)
32
+ rspec-core (3.4.4)
33
+ rspec-support (~> 3.4.0)
34
+ rspec-expectations (3.4.0)
35
+ diff-lcs (>= 1.2.0, < 2.0)
36
+ rspec-support (~> 3.4.0)
37
+ rspec-mocks (3.4.1)
38
+ diff-lcs (>= 1.2.0, < 2.0)
39
+ rspec-support (~> 3.4.0)
40
+ rspec-support (3.4.1)
41
+ rubocop (0.38.0)
42
+ parser (>= 2.3.0.6, < 3.0)
43
+ powerpack (~> 0.1)
44
+ rainbow (>= 1.99.1, < 3.0)
45
+ ruby-progressbar (~> 1.7)
46
+ unicode-display_width (~> 1.0, >= 1.0.1)
47
+ ruby-progressbar (1.7.5)
48
+ simplecov (0.11.2)
49
+ docile (~> 1.1.0)
50
+ json (~> 1.8)
51
+ simplecov-html (~> 0.10.0)
52
+ simplecov-html (0.10.0)
53
+ slop (3.6.0)
54
+ unicode-display_width (1.0.2)
55
+
56
+ PLATFORMS
57
+ ruby
58
+
59
+ DEPENDENCIES
60
+ codeclimate-test-reporter (~> 0.4.8)
61
+ pry (~> 0.10.3)
62
+ rack-http-accept-language!
63
+ rack-test (~> 0.6.3)
64
+ rspec (~> 3.3, >= 3.3.0)
65
+ rubocop (~> 0.38.0)
66
+
67
+ BUNDLED WITH
68
+ 1.11.2
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # RackHttpAcceptLanguage
2
+ [![Build Status](https://travis-ci.org/kaeuferportal/rack-http-accept-language.svg?branch=master)](https://travis-ci.org/kaeuferportal/rack-http-accept-language)
3
+
4
+ ## Possible Methods
5
+
6
+ You have two methods on the ``env`` object:
7
+ ```
8
+ rack_http_accept_lanugage
9
+ ```
10
+ and
11
+ ```
12
+ rack_http_accept_lanugages
13
+ ```
14
+
15
+ ## How you can use it with Sinatra
16
+
17
+ ```
18
+ class App < Sinatra::Base
19
+ use RackHttpAcceptLanguage::Middleware
20
+
21
+ post '/' do
22
+ I18n.locale = request.env.rack_http_accept_language
23
+ end
24
+ end
25
+ ```
26
+
27
+
28
+ ## Installation
29
+
30
+ Add the gem to your Gemfile:
31
+
32
+ ``` ruby
33
+ gem 'rack-http-accept-language'
34
+ ```
35
+
36
+ Run `bundle install` to install it.
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+ require 'rack-http-accept-language/parser'
3
+ require 'rack-http-accept-language/middleware'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module RackHttpAcceptLanguage
3
+ class Middleware
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ parser = Parser.new(env['HTTP_ACCEPT_LANGUAGE'])
10
+ env['RACK_HTTP_ACCEPT_LANGUAGE'] = parser.preferred_language
11
+ env['RACK_HTTP_ACCEPT_LANGUAGES'] = parser.preferred_languages
12
+
13
+ def env.rack_http_accept_languages
14
+ self['RACK_HTTP_ACCEPT_LANGUAGES']
15
+ end
16
+
17
+ def env.rack_http_accept_language
18
+ self['RACK_HTTP_ACCEPT_LANGUAGE']
19
+ end
20
+
21
+ @app.call(env)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ module RackHttpAcceptLanguage
3
+ class Parser
4
+ attr_reader :http_accept_language
5
+
6
+ def initialize(http_accept_language)
7
+ @http_accept_language = http_accept_language
8
+ end
9
+
10
+ def preferred_language
11
+ return nil if early_return?
12
+ order_languages_by_qvalue.first
13
+ end
14
+
15
+ def preferred_languages
16
+ return nil if early_return?
17
+ order_languages_by_qvalue
18
+ end
19
+
20
+ private
21
+
22
+ def early_return?
23
+ http_accept_language.nil? || http_accept_language == '*'
24
+ end
25
+
26
+ def order_languages_by_qvalue
27
+ order_languages_by_qvalue_hash.values.flatten
28
+ end
29
+
30
+ def split_languages
31
+ @split_languages ||= http_accept_language.to_s.split(',')
32
+ end
33
+
34
+ def order_languages_by_qvalue_hash
35
+ @order_languages_by_qvalue ||=
36
+ split_languages.each_with_object({}) do |language_with_qvalue, memo|
37
+ language, qvalue = language_with_qvalue.split(';q=')
38
+ next if language == '*'
39
+
40
+ handle_language(language, qvalue, memo)
41
+ end.sort.reverse.to_h
42
+ end
43
+
44
+ def handle_language(language, qvalue, memo)
45
+ language = language.downcase.gsub(/-[a-z0-9]+$/i, &:upcase)
46
+ qvalue = qvalue ? qvalue.to_f : 1.0
47
+
48
+ if memo[qvalue].nil?
49
+ memo[qvalue] = [language]
50
+ else
51
+ memo[qvalue] << language
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ Gem::Specification.new do |s|
3
+ s.name = 'rack-http-accept-language'
4
+ s.version = '0.1.0'
5
+
6
+ if s.respond_to? :required_rubygems_version=
7
+ s.required_rubygems_version = Gem::Requirement.new('>= 1.2')
8
+ end
9
+ s.required_ruby_version = '>= 2.1.0'
10
+ s.author = 'Bennet Palluthe'
11
+ s.email = 'bennet.palluthe@kaeuferportal.de'
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+
16
+ s.require_paths = ['lib']
17
+
18
+ s.add_development_dependency 'rspec', '~> 3.3', '>= 3.3.0'
19
+ s.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.8'
20
+ s.add_development_dependency 'pry', '~> 0.10.3'
21
+ s.add_development_dependency 'rack-test', '~> 0.6.3'
22
+ s.add_development_dependency 'rubocop', '~> 0.38.0'
23
+
24
+ s.rubygems_version = '2.6.2'
25
+ s.summary = 'http accept language handler'
26
+ s.description = 'http accept language handler'
27
+ s.homepage = 'https://github.com/kaeuferportal/rack-http-accept-language'
28
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+ require 'rack-http-accept-language'
3
+ require 'rack/test'
4
+ require 'json'
5
+
6
+ class TestRackHttpAcceptLanguageApp
7
+ def call(env)
8
+ rack_http_accept_language = env.rack_http_accept_language
9
+ rack_http_accept_languages = env.rack_http_accept_languages
10
+
11
+ result = {
12
+ preferred_language: rack_http_accept_language,
13
+ preferred_languages: rack_http_accept_languages
14
+ }
15
+ [200, {}, [JSON.generate(result)]]
16
+ end
17
+ end
18
+
19
+ describe 'Rack integration' do
20
+ include Rack::Test::Methods
21
+
22
+ def app
23
+ Rack::Builder.new do
24
+ use RackHttpAcceptLanguage::Middleware
25
+ run TestRackHttpAcceptLanguageApp.new
26
+ end.to_app
27
+ end
28
+
29
+ def call_get_method(http_accept_language)
30
+ get '/', {}, { 'HTTP_ACCEPT_LANGUAGE' => http_accept_language }
31
+ end
32
+
33
+ def response
34
+ JSON.parse(last_response.body)
35
+ end
36
+
37
+ context 'use middleware with test app' do
38
+ it 'decodes the HTTP_ACCEPT_LANGUAGE header' do
39
+ http_accept_language = 'en-US,en-GB;q=0.8,en;q=0.6,es-419'
40
+ get '/', {}, { 'HTTP_ACCEPT_LANGUAGE' => http_accept_language }
41
+ expect(response['preferred_language']).to eq 'en-US'
42
+ end
43
+
44
+ it 'decodes the HTTP_ACCEPT_LANGUAGE header' do
45
+ http_accept_language = 'en-US,en-GB;q=0.8,en;q=0.6,es-419'
46
+ get '/', {}, { 'HTTP_ACCEPT_LANGUAGE' => http_accept_language }
47
+ expect(response['preferred_languages']).to eq %w(en-US es-419 en-GB en)
48
+ end
49
+ end
50
+
51
+ context 'call middleware directly' do
52
+ context 'without i18n' do
53
+ let(:app) { ->(env_data) { env_data } }
54
+ let(:middleware) { RackHttpAcceptLanguage::Middleware.new(app) }
55
+
56
+ context 'http_accept_language' do
57
+ it 'handle one http_accept_language' do
58
+ env = { 'HTTP_ACCEPT_LANGUAGE' => 'en' }
59
+ middleware.call(env)
60
+ expect(env.rack_http_accept_language).to eq 'en'
61
+ env['HTTP_ACCEPT_LANGUAGE'] = 'de'
62
+ middleware.call(env)
63
+ expect(env.rack_http_accept_language).to eq 'de'
64
+ end
65
+
66
+ it 'handle more http_accept_languages' do
67
+ env = { 'HTTP_ACCEPT_LANGUAGE' => 'en-US,en-GB;q=0.8,en;q=0.6' }
68
+ middleware.call(env)
69
+ expect(env.rack_http_accept_language).to eq 'en-US'
70
+ end
71
+ end
72
+
73
+ context 'http_accept_languages' do
74
+ it 'handle one http_accept_language' do
75
+ env = { 'HTTP_ACCEPT_LANGUAGE' => 'en' }
76
+ middleware.call(env)
77
+ expect(env.rack_http_accept_languages).to eq %w(en)
78
+ env['HTTP_ACCEPT_LANGUAGE'] = 'de'
79
+ middleware.call(env)
80
+ expect(env.rack_http_accept_languages).to eq %w(de)
81
+ end
82
+
83
+ it 'handle more http_accept_languages' do
84
+ env = { 'HTTP_ACCEPT_LANGUAGE' => 'en-US,en-GB;q=0.5,en;q=0.7' }
85
+ middleware.call(env)
86
+ expect(env.rack_http_accept_languages).to eq %w(en-US en en-GB)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ describe RackHttpAcceptLanguage::Parser do
5
+ context 'without wildcard' do
6
+ context 'no upcase handling necessary' do
7
+ let(:http_accept_language) { 'en-US,en-GB;q=0.6,en;q=0.8' }
8
+ subject(:parser) { described_class.new(http_accept_language) }
9
+
10
+ it 'preferred language' do
11
+ expected_array = 'en-US'
12
+ expect(parser.preferred_language).to eq expected_array
13
+ end
14
+
15
+ it 'preferred_languages' do
16
+ expected_array = ['en-US', 'en', 'en-GB']
17
+ expect(parser.preferred_languages).to eq expected_array
18
+ end
19
+ end
20
+
21
+ context 'upcase necessary' do
22
+ let(:http_accept_language) { 'en-us,en-GB;q=0.6,en;q=0.8' }
23
+ subject(:parser) { described_class.new(http_accept_language) }
24
+
25
+ it 'preferred language' do
26
+ expected_array = 'en-US'
27
+ expect(parser.preferred_language).to eq expected_array
28
+ end
29
+
30
+ it 'preferred_languages' do
31
+ expected_array = ['en-US', 'en', 'en-GB']
32
+ expect(parser.preferred_languages).to eq expected_array
33
+ end
34
+ end
35
+ end
36
+
37
+ context 'with wildcard' do
38
+ describe '.preferred_language' do
39
+ it 'has no http_accept_language' do
40
+ http_accept_language = nil
41
+ parser = described_class.new(http_accept_language)
42
+
43
+ expect(parser.preferred_language).to eq nil
44
+ end
45
+
46
+ it 'has a * as http_accept_language' do
47
+ http_accept_language = '*'
48
+ parser = described_class.new(http_accept_language)
49
+
50
+ expect(parser.preferred_language).to eq nil
51
+ end
52
+
53
+ it 'has a * in http_accept_language' do
54
+ http_accept_language = '*,en;q=0.6'
55
+ parser = described_class.new(http_accept_language)
56
+
57
+ expect(parser.preferred_language).to eq 'en'
58
+ end
59
+ end
60
+
61
+ describe '.preferred_languages' do
62
+ it 'has no http_accept_languages' do
63
+ http_accept_language = nil
64
+ parser = described_class.new(http_accept_language)
65
+
66
+ expect(parser.preferred_languages).to eq nil
67
+ end
68
+
69
+ it 'has a * as http_accept_languages' do
70
+ http_accept_language = '*'
71
+ parser = described_class.new(http_accept_language)
72
+
73
+ expect(parser.preferred_languages).to eq nil
74
+ end
75
+
76
+ it 'has a * in http_accept_languages' do
77
+ http_accept_language = '*,en;q=0.6'
78
+ parser = described_class.new(http_accept_language)
79
+
80
+ expect(parser.preferred_languages).to eq %w(en)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'rack-http-accept-language'
4
+ require 'codeclimate-test-reporter'
5
+ require 'simplecov'
6
+
7
+ SimpleCov.start
8
+ CodeClimate::TestReporter.start
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-http-accept-language
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Bennet Palluthe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.3'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.3.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '3.3'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.3.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: codeclimate-test-reporter
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.4.8
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.4.8
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.10.3
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.10.3
61
+ - !ruby/object:Gem::Dependency
62
+ name: rack-test
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 0.6.3
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 0.6.3
75
+ - !ruby/object:Gem::Dependency
76
+ name: rubocop
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 0.38.0
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.38.0
89
+ description: http accept language handler
90
+ email: bennet.palluthe@kaeuferportal.de
91
+ executables: []
92
+ extensions: []
93
+ extra_rdoc_files: []
94
+ files:
95
+ - ".gitignore"
96
+ - ".rspec"
97
+ - ".rubocop.yml"
98
+ - ".travis.yml"
99
+ - Gemfile
100
+ - Gemfile.lock
101
+ - README.md
102
+ - lib/rack-http-accept-language.rb
103
+ - lib/rack-http-accept-language/middleware.rb
104
+ - lib/rack-http-accept-language/parser.rb
105
+ - rack-http-accept-language.gemspec
106
+ - spec/middleware_spec.rb
107
+ - spec/parser_spec.rb
108
+ - spec/spec_helper.rb
109
+ homepage: https://github.com/kaeuferportal/rack-http-accept-language
110
+ licenses: []
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 2.1.0
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '1.2'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.4.8
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: http accept language handler
132
+ test_files:
133
+ - spec/middleware_spec.rb
134
+ - spec/parser_spec.rb
135
+ - spec/spec_helper.rb