rack-http-accept-language 0.1.0

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