accept_language 2.0.0 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
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: []