accept_language 2.0.0 → 2.0.3
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 +4 -4
- data/LICENSE.md +1 -1
- data/README.md +26 -7
- data/lib/accept_language/matcher.rb +12 -6
- data/lib/accept_language/parser.rb +10 -4
- data/lib/accept_language.rb +1 -1
- metadata +11 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a5c9dad0529da52e9c0fa650e2825c788a673ecf57c7158a9e160797079607c9
|
|
4
|
+
data.tar.gz: b9e7430c21121d7fb111cf6159f27bb8690e6728dbf8e8ecdd410ce9bbae4a58
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2dc2b91a4809e88dadef537c951a00bec5adda83a6f80e9717a7ca4651352c606c94dc00a4b5a439668555c6942a92e5de26c985b8c11dc433aed7dde414d710
|
|
7
|
+
data.tar.gz: 1178cd443cd3c731a90347a9ad2b97cfe9f57084b234c98c1570d2ee8546e59112f0415e992e92bb342301bc3bd2861ac53739eefa55fc3967c64f0e7b086f09
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
|
-
# Accept Language
|
|
1
|
+
# Accept Language 🌐
|
|
2
2
|
|
|
3
3
|
A tiny library for parsing the `Accept-Language` header from browsers (as defined in [RFC 2616](https://tools.ietf.org/html/rfc2616#section-14.4)).
|
|
4
4
|
|
|
5
5
|
## Status
|
|
6
6
|
|
|
7
|
-
[](https://github.com/cyril/accept_language.rb/releases)
|
|
8
|
+
[](https://rubydoc.info/github/cyril/accept_language.rb/main)
|
|
9
|
+
[](https://github.com/cyril/accept_language.rb/actions?query=workflow%3Aci+branch%3Amain)
|
|
10
|
+
[](https://github.com/cyril/accept_language.rb/actions?query=workflow%3Arubocop+branch%3Amain)
|
|
11
|
+
[](https://github.com/cyril/accept_language.rb/raw/main/LICENSE.md)
|
|
12
|
+
|
|
13
|
+
## Why this tool?
|
|
14
|
+
|
|
15
|
+
- Thread-safe implementation.
|
|
16
|
+
- Small algorithm that can handle tricky cases.
|
|
17
|
+
- Match strings and symbols ignoring the case.
|
|
18
|
+
- Works also well without Rails, Rack, i18n.
|
|
19
|
+
- Comes with [BCP 47](https://www.rfc-editor.org/bcp/bcp47.txt) support.
|
|
10
20
|
|
|
11
21
|
## Installation
|
|
12
22
|
|
|
@@ -18,11 +28,15 @@ gem "accept_language"
|
|
|
18
28
|
|
|
19
29
|
And then execute:
|
|
20
30
|
|
|
21
|
-
|
|
31
|
+
```sh
|
|
32
|
+
bundle install
|
|
33
|
+
```
|
|
22
34
|
|
|
23
35
|
Or install it yourself as:
|
|
24
36
|
|
|
25
|
-
|
|
37
|
+
```sh
|
|
38
|
+
gem install accept_language
|
|
39
|
+
```
|
|
26
40
|
|
|
27
41
|
## Usage
|
|
28
42
|
|
|
@@ -76,10 +90,15 @@ class ApplicationController < ActionController::Base
|
|
|
76
90
|
end
|
|
77
91
|
```
|
|
78
92
|
|
|
93
|
+
## Read more
|
|
94
|
+
|
|
95
|
+
* [Language negotiation with Ruby](https://dev.to/cyri_/language-negotiation-with-ruby-5166)
|
|
96
|
+
* [Rubyで、言語交渉](https://qiita.com/cyril/items/45dc233edb7be9d614e7)
|
|
97
|
+
|
|
79
98
|
## Versioning
|
|
80
99
|
|
|
81
100
|
__AcceptLanguage__ uses [Semantic Versioning 2.0.0](https://semver.org/)
|
|
82
101
|
|
|
83
102
|
## License
|
|
84
103
|
|
|
85
|
-
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
104
|
+
The [gem](https://rubygems.org/gems/accept_language) is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
@@ -8,17 +8,19 @@ module AcceptLanguage
|
|
|
8
8
|
# Matcher.new("da" => 1.0, "en-GB" => 0.8, "en" => 0.7).call(:ug, :kk, :ru, :en) # => :en
|
|
9
9
|
# Matcher.new("da" => 1.0, "en-GB" => 0.8, "en" => 0.7).call(:fr, :en, :"en-GB") # => :"en-GB"
|
|
10
10
|
class Matcher
|
|
11
|
+
WILDCARD = "*"
|
|
12
|
+
|
|
11
13
|
attr_reader :excluded_langtags, :preferred_langtags
|
|
12
14
|
|
|
13
15
|
# @param [Hash<String, BigDecimal>] languages_range A list of accepted
|
|
14
16
|
# languages with their respective qualities.
|
|
15
17
|
def initialize(**languages_range)
|
|
16
|
-
@excluded_langtags = Set[]
|
|
18
|
+
@excluded_langtags = ::Set[]
|
|
17
19
|
langtags = []
|
|
18
20
|
|
|
19
21
|
languages_range.select do |langtag, quality|
|
|
20
22
|
if quality.zero?
|
|
21
|
-
@excluded_langtags << langtag unless
|
|
23
|
+
@excluded_langtags << langtag unless wildcard?(langtag)
|
|
22
24
|
else
|
|
23
25
|
level = (quality * 1_000).to_i
|
|
24
26
|
langtags[level] = langtag
|
|
@@ -37,7 +39,7 @@ module AcceptLanguage
|
|
|
37
39
|
available_langtags = drop_unacceptable(*available_langtags)
|
|
38
40
|
|
|
39
41
|
preferred_langtags.each do |preferred_tag|
|
|
40
|
-
if
|
|
42
|
+
if wildcard?(preferred_tag)
|
|
41
43
|
langtag = any_other_langtag(*available_langtags)
|
|
42
44
|
return langtag unless langtag.nil?
|
|
43
45
|
else
|
|
@@ -54,7 +56,7 @@ module AcceptLanguage
|
|
|
54
56
|
|
|
55
57
|
def any_other_langtag(*available_langtags)
|
|
56
58
|
available_langtags.find do |available_langtag|
|
|
57
|
-
langtags = preferred_langtags - [
|
|
59
|
+
langtags = preferred_langtags - [WILDCARD]
|
|
58
60
|
|
|
59
61
|
langtags.none? do |langtag|
|
|
60
62
|
available_langtag.match?(/\A#{langtag}/i)
|
|
@@ -63,10 +65,10 @@ module AcceptLanguage
|
|
|
63
65
|
end
|
|
64
66
|
|
|
65
67
|
def drop_unacceptable(*available_langtags)
|
|
66
|
-
available_langtags.inject(Set[]) do |langtags, available_langtag|
|
|
68
|
+
available_langtags.inject(::Set[]) do |langtags, available_langtag|
|
|
67
69
|
next langtags if unacceptable?(available_langtag)
|
|
68
70
|
|
|
69
|
-
langtags + Set[available_langtag]
|
|
71
|
+
langtags + ::Set[available_langtag]
|
|
70
72
|
end
|
|
71
73
|
end
|
|
72
74
|
|
|
@@ -75,6 +77,10 @@ module AcceptLanguage
|
|
|
75
77
|
langtag.match?(/\A#{excluded_langtag}/i)
|
|
76
78
|
end
|
|
77
79
|
end
|
|
80
|
+
|
|
81
|
+
def wildcard?(value)
|
|
82
|
+
value.eql?(WILDCARD)
|
|
83
|
+
end
|
|
78
84
|
end
|
|
79
85
|
end
|
|
80
86
|
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "bigdecimal"
|
|
4
|
+
|
|
3
5
|
module AcceptLanguage
|
|
4
6
|
# @note Parser for Accept-Language header fields.
|
|
5
7
|
# @example
|
|
6
8
|
# Parser.new("da, en-GB;q=0.8, en;q=0.7") # => #<AcceptLanguage::Parser:0x00007 @languages_range={"da"=>0.1e1, "en-GB"=>0.8e0, "en"=>0.7e0}>
|
|
7
9
|
# @see https://tools.ietf.org/html/rfc2616#section-14.4
|
|
8
10
|
class Parser
|
|
11
|
+
DEFAULT_QUALITY = BigDecimal("1")
|
|
12
|
+
SEPARATOR = ","
|
|
13
|
+
SPACE = " "
|
|
14
|
+
SUFFIX = ";q="
|
|
15
|
+
|
|
9
16
|
attr_reader :languages_range
|
|
10
17
|
|
|
11
18
|
# @param [String] field The Accept-Language header field to parse.
|
|
@@ -30,16 +37,15 @@ module AcceptLanguage
|
|
|
30
37
|
# @return [Hash<String, BigDecimal>] A list of accepted languages with their
|
|
31
38
|
# respective qualities.
|
|
32
39
|
def import(field)
|
|
33
|
-
field.delete(
|
|
34
|
-
tag, quality = lang.split(
|
|
40
|
+
field.delete(SPACE).split(SEPARATOR).inject({}) do |hash, lang|
|
|
41
|
+
tag, quality = lang.split(SUFFIX)
|
|
35
42
|
next hash if tag.nil?
|
|
36
43
|
|
|
37
|
-
quality = quality.nil? ?
|
|
44
|
+
quality = quality.nil? ? DEFAULT_QUALITY : BigDecimal(quality)
|
|
38
45
|
hash.merge(tag => quality)
|
|
39
46
|
end
|
|
40
47
|
end
|
|
41
48
|
end
|
|
42
49
|
end
|
|
43
50
|
|
|
44
|
-
require "bigdecimal"
|
|
45
51
|
require_relative "matcher"
|
data/lib/accept_language.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: accept_language
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Cyril Kato
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-07-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -39,7 +39,7 @@ dependencies:
|
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
42
|
+
name: r_spec-clone
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - ">="
|
|
@@ -165,8 +165,9 @@ files:
|
|
|
165
165
|
homepage: https://github.com/cyril/accept_language.rb
|
|
166
166
|
licenses:
|
|
167
167
|
- MIT
|
|
168
|
-
metadata:
|
|
169
|
-
|
|
168
|
+
metadata:
|
|
169
|
+
rubygems_mfa_required: 'true'
|
|
170
|
+
post_install_message:
|
|
170
171
|
rdoc_options: []
|
|
171
172
|
require_paths:
|
|
172
173
|
- lib
|
|
@@ -174,15 +175,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
174
175
|
requirements:
|
|
175
176
|
- - ">="
|
|
176
177
|
- !ruby/object:Gem::Version
|
|
177
|
-
version:
|
|
178
|
+
version: 2.7.6
|
|
178
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
180
|
requirements:
|
|
180
181
|
- - ">="
|
|
181
182
|
- !ruby/object:Gem::Version
|
|
182
183
|
version: '0'
|
|
183
184
|
requirements: []
|
|
184
|
-
rubygems_version: 3.
|
|
185
|
-
signing_key:
|
|
185
|
+
rubygems_version: 3.1.6
|
|
186
|
+
signing_key:
|
|
186
187
|
specification_version: 4
|
|
187
|
-
summary: Parser for Accept-Language request HTTP header
|
|
188
|
+
summary: "Parser for Accept-Language request HTTP header \U0001F310"
|
|
188
189
|
test_files: []
|