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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1b6659d931a56171b880e543a4364fdd0212cf1664d9fa32d04f29c9142b1a6
4
- data.tar.gz: 259ddc12dc7ef62325a5fe634dd0bcb284f1dce0d9629d929858751dcc8cd936
3
+ metadata.gz: a5c9dad0529da52e9c0fa650e2825c788a673ecf57c7158a9e160797079607c9
4
+ data.tar.gz: b9e7430c21121d7fb111cf6159f27bb8690e6728dbf8e8ecdd410ce9bbae4a58
5
5
  SHA512:
6
- metadata.gz: c1566e1af8e2cd77e96eebebf25e7f694237f1562396d42ee001349d6fb75503fe022a8325e208db9cd24e354d90253496e11af66f1bd5b7704e8b54ac347263
7
- data.tar.gz: 0d7d2c59183e9eae327e61f4ccae25c050f5a82eb511041b2c86c4478548c7144ea10fa78f9c9a4d4b501fdbf8375b72e001e77f73d0820272c139fa9dad5972
6
+ metadata.gz: 2dc2b91a4809e88dadef537c951a00bec5adda83a6f80e9717a7ca4651352c606c94dc00a4b5a439668555c6942a92e5de26c985b8c11dc433aed7dde414d710
7
+ data.tar.gz: 1178cd443cd3c731a90347a9ad2b97cfe9f57084b234c98c1570d2ee8546e59112f0415e992e92bb342301bc3bd2861ac53739eefa55fc3967c64f0e7b086f09
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019-2021 Cyril Kato
3
+ Copyright (c) 2019-2022 Cyril Kato
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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
- [![Gem Version](https://badge.fury.io/rb/accept_language.svg)](https://badge.fury.io/rb/accept_language)
8
- [![Build Status](https://travis-ci.org/cyril/accept_language.rb.svg?branch=master)](https://travis-ci.org/cyril/accept_language.rb)
9
- [![Inline Docs](https://inch-ci.org/github/cyril/accept_language.rb.svg)](https://inch-ci.org/github/cyril/accept_language.rb)
7
+ [![Version](https://img.shields.io/github/v/tag/cyril/accept_language.rb?label=Version&logo=github)](https://github.com/cyril/accept_language.rb/releases)
8
+ [![Yard documentation](https://img.shields.io/badge/Yard-documentation-blue.svg?logo=github)](https://rubydoc.info/github/cyril/accept_language.rb/main)
9
+ [![CI](https://github.com/cyril/accept_language.rb/workflows/CI/badge.svg?branch=main)](https://github.com/cyril/accept_language.rb/actions?query=workflow%3Aci+branch%3Amain)
10
+ [![RuboCop](https://github.com/cyril/accept_language.rb/workflows/RuboCop/badge.svg?branch=main)](https://github.com/cyril/accept_language.rb/actions?query=workflow%3Arubocop+branch%3Amain)
11
+ [![License](https://img.shields.io/github/license/cyril/accept_language.rb?label=License&logo=github)](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
- $ bundle
31
+ ```sh
32
+ bundle install
33
+ ```
22
34
 
23
35
  Or install it yourself as:
24
36
 
25
- $ gem install accept_language
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 langtag.eql?("*")
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 preferred_tag.eql?("*")
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(" ").split(",").inject({}) do |hash, lang|
34
- tag, quality = lang.split(/;q=/i)
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? ? BigDecimal("1") : BigDecimal(quality)
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"
@@ -14,4 +14,4 @@ module AcceptLanguage
14
14
  end
15
15
  end
16
16
 
17
- require_relative "accept_language/parser"
17
+ require_relative File.join("accept_language", "parser")
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.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: 2021-05-02 00:00:00.000000000 Z
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: rspec
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
- post_install_message:
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: 3.0.0
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.2.15
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: []