summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIra Lun <sammyrosajoe@gmail.com>2017-08-24 23:43:07 +0100
committerIra Lun <sammyrosajoe@gmail.com>2017-08-24 23:43:07 +0100
commite8845013f03d6729ab12fbc8ec470e1afef696c0 (patch)
tree155375a2f3dea1c9f7c0ea851f4c55c5e787116c /src
parentf3658646ff52c1d1fdbc34843c41843aee9b0056 (diff)
downloadwebob-e8845013f03d6729ab12fbc8ec470e1afef696c0.tar.gz
Move .parse from AcceptLanguageValidHeader to AcceptLanguage.
Diffstat (limited to 'src')
-rw-r--r--src/webob/acceptparse.py94
1 files changed, 47 insertions, 47 deletions
diff --git a/src/webob/acceptparse.py b/src/webob/acceptparse.py
index 6446826..a80abe8 100644
--- a/src/webob/acceptparse.py
+++ b/src/webob/acceptparse.py
@@ -306,6 +306,26 @@ class AcceptLanguage(object):
:class:`AcceptLanguageNoHeader`, and :class:`AcceptLanguageInvalidHeader`.
"""
+ # RFC 7231 Section 5.3.5 "Accept-Language":
+ # Accept-Language = 1#( language-range [ weight ] )
+ # language-range =
+ # <language-range, see [RFC4647], Section 2.1>
+ # RFC 4647 Section 2.1 "Basic Language Range":
+ # language-range = (1*8ALPHA *("-" 1*8alphanum)) / "*"
+ # alphanum = ALPHA / DIGIT
+ lang_range_re = (
+ r'\*|'
+ '(?:'
+ '[A-Za-z]{1,8}'
+ '(?:-[A-Za-z0-9]{1,8})*'
+ ')'
+ )
+ lang_range_n_weight_re = _item_n_weight_re(item_re=lang_range_re)
+ lang_range_n_weight_compiled_re = re.compile(lang_range_n_weight_re)
+ accept_language_compiled_re = _list_1_or_more__compiled_re(
+ element_re=lang_range_n_weight_re,
+ )
+
@classmethod
def _python_value_to_header_str(cls, value):
if isinstance(value, str):
@@ -330,6 +350,33 @@ class AcceptLanguage(object):
header_str = str(value)
return header_str
+ @classmethod
+ def parse(cls, value):
+ """
+ Parse an ``Accept-Language`` header.
+
+ :param value: (``str``) header value
+ :return: If `value` is a valid ``Accept-Language`` header, returns an
+ iterator of (language range, quality value) tuples, as parsed
+ from the header from left to right.
+ :raises ValueError: if `value` is an invalid header
+ """
+ # Check if header is valid
+ # Using Python stdlib's `re` module, there is currently no way to check
+ # the match *and* get all the groups using the same regex, so we have
+ # to use one regex to check the match, and another to get the groups.
+ if cls.accept_language_compiled_re.match(value) is None:
+ raise ValueError('Invalid value for an Accept-Language header.')
+ def generator(value):
+ for match in (
+ cls.lang_range_n_weight_compiled_re.finditer(value)
+ ):
+ lang_range = match.group(1)
+ qvalue = match.group(2)
+ qvalue = float(qvalue) if qvalue else 1.0
+ yield (lang_range, qvalue)
+ return generator(value=value)
+
class AcceptLanguageValidHeader(AcceptLanguage):
"""
@@ -348,26 +395,6 @@ class AcceptLanguageValidHeader(AcceptLanguage):
docstring for :meth:`AcceptLanguageValidHeader.__add__`).
"""
- # RFC 7231 Section 5.3.5 "Accept-Language":
- # Accept-Language = 1#( language-range [ weight ] )
- # language-range =
- # <language-range, see [RFC4647], Section 2.1>
- # RFC 4647 Section 2.1 "Basic Language Range":
- # language-range = (1*8ALPHA *("-" 1*8alphanum)) / "*"
- # alphanum = ALPHA / DIGIT
- lang_range_re = (
- r'\*|'
- '(?:'
- '[A-Za-z]{1,8}'
- '(?:-[A-Za-z0-9]{1,8})*'
- ')'
- )
- lang_range_n_weight_re = _item_n_weight_re(item_re=lang_range_re)
- lang_range_n_weight_compiled_re = re.compile(lang_range_n_weight_re)
- accept_language_compiled_re = _list_1_or_more__compiled_re(
- element_re=lang_range_n_weight_re,
- )
-
def __init__(self, header_value):
"""
Create an :class:`AcceptLanguageValidHeader` instance.
@@ -397,33 +424,6 @@ class AcceptLanguageValidHeader(AcceptLanguage):
"""
return self._parsed
- @classmethod
- def parse(cls, value):
- """
- Parse an ``Accept-Language`` header.
-
- :param value: (``str``) header value
- :return: If `value` is a valid ``Accept-Language`` header, returns an
- iterator of (language range, quality value) tuples, as parsed
- from the header from left to right.
- :raises ValueError: if `value` is an invalid header
- """
- # Check if header is valid
- # Using Python stdlib's `re` module, there is currently no way to check
- # the match *and* get all the groups using the same regex, so we have
- # to use one regex to check the match, and another to get the groups.
- if cls.accept_language_compiled_re.match(value) is None:
- raise ValueError('Invalid value for an Accept-Language header.')
- def generator(value):
- for match in (
- cls.lang_range_n_weight_compiled_re.finditer(value)
- ):
- lang_range = match.group(1)
- qvalue = match.group(2)
- qvalue = float(qvalue) if qvalue else 1.0
- yield (lang_range, qvalue)
- return generator(value=value)
-
def __add__(self, other):
"""
Add to header, creating a new header object.