Skip to content

Commit

Permalink
LanguageAccept falls back to language only
Browse files Browse the repository at this point in the history
  • Loading branch information
chivalry authored and davidism committed Jul 14, 2019
1 parent 845fbfd commit a61e6d6
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/werkzeug/datastructures.py
Expand Up @@ -1849,6 +1849,19 @@ def _normalize(language):

return item == "*" or _normalize(value) == _normalize(item)

def best_match(self, matches, default=None):
"""Calls the super version of `best_match` and if it returns none,
attempts to fall back to language only matches.
:param matches: a list of matches to check for
:param default: the value that is returned if none match
"""
result = super(LanguageAccept, self).best_match(matches)
if result is not None:
return result
fallback = Accept([(item[0][0:2], item[1]) for item in self])
return fallback.best_match(matches, default=default)


class CharsetAccept(Accept):
"""Like :class:`Accept` but with normalization for charsets."""
Expand Down
29 changes: 29 additions & 0 deletions tests/test_datastructures.py
Expand Up @@ -1074,6 +1074,35 @@ def test_accept_wildcard_specificity(self):
assert accept.best_match(["text/plain", "image/png"]) == "image/png"


class TestLanguageAccept(object):
storage_class = datastructures.LanguageAccept

def test_best_match_fallback(self):
accept = self.storage_class([("en-us", 1)])
assert accept.best_match(["en"]) == "en"

accept = self.storage_class([("de_AT", 1), ("de", 0.9)])
assert accept.best_match(["en"]) is None

accept = self.storage_class([("de_AT", 1), ("de", 0.9), ("en-US", 0.8)])
assert accept.best_match(["de", "en"]) == "de"

accept = self.storage_class([("de_AT", 0.9), ("en-US", 1)])
assert accept.best_match(["en"]) == "en"

accept = self.storage_class([("en-us", 1)])
assert accept.best_match(["en-us"]) == "en-us"

accept = self.storage_class([("en-us", 1)])
assert accept.best_match(["en-us", "en"]) == "en-us"

accept = self.storage_class([("en-GB", 1)])
assert accept.best_match(["en-US", "en"], default="en-US") == "en"

accept = self.storage_class([("de-AT", 1)])
assert accept.best_match(["en-US", "en"], default="en-US") == "en-US"


class TestFileStorage(object):
storage_class = datastructures.FileStorage

Expand Down

0 comments on commit a61e6d6

Please sign in to comment.