diff options
-rw-r--r-- | dev-python/cookies/cookies-2.2.1-r1.ebuild | 26 | ||||
-rw-r--r-- | dev-python/cookies/files/cookies-2.2.1-fix-warnings.patch | 201 | ||||
-rw-r--r-- | dev-python/cookies/files/cookies-2.2.1-tests.patch | 28 |
3 files changed, 255 insertions, 0 deletions
diff --git a/dev-python/cookies/cookies-2.2.1-r1.ebuild b/dev-python/cookies/cookies-2.2.1-r1.ebuild new file mode 100644 index 000000000000..7902a8e44f21 --- /dev/null +++ b/dev-python/cookies/cookies-2.2.1-r1.ebuild @@ -0,0 +1,26 @@ +# Copyright 1999-2019 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 +PYTHON_COMPAT=(python{2_7,3_{5,6,7,8}} pypy{,3} ) + +inherit distutils-r1 + +DESCRIPTION="Friendlier RFC 6265-compliant cookie parser/renderer" +HOMEPAGE="https://gitlab.com/sashahart/cookies" +SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux" + +BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]" + +PATCHES=( + # https://gitlab.com/sashahart/cookies/merge_requests/2 + "${FILESDIR}/cookies-2.2.1-fix-warnings.patch" + + "${FILESDIR}/cookies-2.2.1-tests.patch" +) + +distutils_enable_tests pytest diff --git a/dev-python/cookies/files/cookies-2.2.1-fix-warnings.patch b/dev-python/cookies/files/cookies-2.2.1-fix-warnings.patch new file mode 100644 index 000000000000..adb43f4241df --- /dev/null +++ b/dev-python/cookies/files/cookies-2.2.1-fix-warnings.patch @@ -0,0 +1,201 @@ +diff --git a/cookies.py b/cookies.py +index d1637d22630580e25cb0b1405754dd7e195bf85f..4fd0ebbd07384e02d6f40e45a4432a2baa95fc8b 100644 +--- a/cookies.py ++++ b/cookies.py +@@ -132,7 +132,7 @@ class Definitions(object): + # attribute and extract it appropriately. + # As compared with the RFC production grammar, it is must more liberal with + # space characters, in order not to break on data made by barbarians. +- SET_COOKIE_HEADER = """(?x) # Verbose mode ++ SET_COOKIE_HEADER = r"""(?x) # Verbose mode + ^(?:Set-Cookie:[ ]*)? + (?P<name>[{name}:]+) + [ ]*=[ ]* +@@ -203,7 +203,7 @@ class Definitions(object): + # Here is the overall date format; ~99% of cases fold into one generalized + # syntax like RFC 1123, and many of the rest use asctime-like formats. + # (see test_date_formats for a full exegesis) +- DATE = """(?ix) # Case-insensitive mode, verbose mode ++ _DATE = """ + (?: + (?P<weekday>(?:{wdy}|{weekday}),[ ])? + (?P<day>{day}) +@@ -230,11 +230,17 @@ class Definitions(object): + (?P<year2>\d\d\d\d) + (?:[ ]GMT)? # GMT (Amazon) + ) +- """ +- DATE = DATE.format(wdy=WEEKDAY_SHORT, weekday=WEEKDAY_LONG, +- day=DAY_OF_MONTH, mon=MONTH_SHORT, month=MONTH_LONG) ++ """.format(wdy=WEEKDAY_SHORT, weekday=WEEKDAY_LONG, ++ day=DAY_OF_MONTH, mon=MONTH_SHORT, month=MONTH_LONG) ++ ++ # Starting in Python 3.6, embedding a regex that starts with "(?ix)" in ++ # the middle of another regex produces a warning (and will stop working ++ # altogether in some future Python version). We thus create two variables ++ # here: _DATE is for embedding inside other regexes (which must themselves ++ # begin with "(?ix)"), DATE is for standalone matching. ++ DATE = '(?ix)' + _DATE + +- EXPIRES_AV = "Expires=(?P<expires>%s)" % DATE ++ EXPIRES_AV = "Expires=(?P<expires>%s)" % _DATE + + # Now we're ready to define a regexp which can match any number of attrs + # in the variable portion of the Set-Cookie header (like the unnamed latter +@@ -263,7 +269,7 @@ class Definitions(object): + path=PATH_AV, stuff=EXTENSION_AV) + + # For request data ("Cookie: ") parsing, with finditer cf. RFC 6265 4.2.1 +- COOKIE = """(?x) # Verbose mode ++ COOKIE = r"""(?x) # Verbose mode + (?: # Either something close to valid... + + # Match starts at start of string, or at separator. +@@ -306,13 +312,13 @@ class Definitions(object): + """.format(name=COOKIE_NAME, value=COOKIE_OCTET) + + # Precompile externally useful definitions into re objects. +- COOKIE_NAME_RE = re.compile("^([%s:]+)\Z" % COOKIE_NAME) ++ COOKIE_NAME_RE = re.compile(r"^([%s:]+)\Z" % COOKIE_NAME) + COOKIE_RE = re.compile(COOKIE) + SET_COOKIE_HEADER_RE = re.compile(SET_COOKIE_HEADER) + ATTR_RE = re.compile(ATTR) + DATE_RE = re.compile(DATE) + DOMAIN_RE = re.compile(DOMAIN) +- PATH_RE = re.compile('^([%s]+)\Z' % EXTENSION_AV) ++ PATH_RE = re.compile(r'^([%s]+)\Z' % EXTENSION_AV) + EOL = re.compile("(?:\r\n|\n)") + + +@@ -965,7 +971,7 @@ class Cookie(object): + 'path': valid_path, + 'max_age': valid_max_age, + 'comment': valid_value, +- 'version': lambda number: re.match("^\d+\Z", str(number)), ++ 'version': lambda number: re.match(r"^\d+\Z", str(number)), + 'secure': lambda item: item is True or item is False, + 'httponly': lambda item: item is True or item is False, + } +diff --git a/test_cookies.py b/test_cookies.py +index 2197916effae23a85e571dcb4a1acf78fbe1c71e..abc95a6346a1522556b95e03de81baaa0a478031 100644 +--- a/test_cookies.py ++++ b/test_cookies.py +@@ -35,19 +35,19 @@ class RFC1034: + digit = "[0-9]" + letter = "[A-Za-z]" + let_dig = "[0-9A-Za-z]" +- let_dig_hyp = "[0-9A-Za-z\-]" ++ let_dig_hyp = r"[0-9A-Za-z\-]" + assert "\\" in let_dig_hyp + ldh_str = "%s+" % let_dig_hyp + label = "(?:%s|%s|%s)" % ( + letter, + letter + let_dig, + letter + ldh_str + let_dig) +- subdomain = "(?:%s\.)*(?:%s)" % (label, label) ++ subdomain = r"(?:%s\.)*(?:%s)" % (label, label) + domain = "( |%s)" % (subdomain) + + def test_sanity(self): + "Basic smoke tests that definitions transcribed OK" +- match = re.compile("^%s\Z" % self.domain).match ++ match = re.compile(r"^%s\Z" % self.domain).match + assert match("A.ISI.EDU") + assert match("XX.LCS.MIT.EDU") + assert match("SRI-NIC.ARPA") +@@ -74,12 +74,12 @@ class RFC1123: + # n.b.: there are length limits in the real thing + label = "{let_dig}(?:(?:{let_dig_hyp}+)?{let_dig})?".format( + let_dig=RFC1034.let_dig, let_dig_hyp=RFC1034.let_dig_hyp) +- subdomain = "(?:%s\.)*(?:%s)" % (label, label) ++ subdomain = r"(?:%s\.)*(?:%s)" % (label, label) + domain = "( |%s)" % (subdomain) + + def test_sanity(self): + "Basic smoke tests that definitions transcribed OK" +- match = re.compile("^%s\Z" % self.domain).match ++ match = re.compile(r"^%s\Z" % self.domain).match + assert match("A.ISI.EDU") + assert match("XX.LCS.MIT.EDU") + assert match("SRI-NIC.ARPA") +@@ -241,7 +241,7 @@ class TestDefinitions(object): + ; whitespace DQUOTE, comma, semicolon, + ; and backslash + """ +- match = re.compile("^[%s]+\Z" % Definitions.COOKIE_OCTET).match ++ match = re.compile(r"^[%s]+\Z" % Definitions.COOKIE_OCTET).match + for c in RFC5234.CTL: + assert not match(c) + assert not match("a%sb" % c) +@@ -331,7 +331,7 @@ class TestDefinitions(object): + ('frob', 'laz', '')] + + def assert_correct(s): +- #naive = re.findall(" *([^;]+)=([^;]+) *(?:;|\Z)", s) ++ #naive = re.findall(r" *([^;]+)=([^;]+) *(?:;|\Z)", s) + result = regex.findall(s) + assert result == correct + # normal-looking case should work normally +@@ -390,7 +390,7 @@ class TestDefinitions(object): + extension_av_explicit = "".join(sorted( + set(RFC5234.CHAR) - set(RFC5234.CTL + ";"))) + # ... that should turn out to be the same as Definitions.EXTENSION_AV +- match = re.compile("^([%s]+)\Z" % Definitions.EXTENSION_AV).match ++ match = re.compile(r"^([%s]+)\Z" % Definitions.EXTENSION_AV).match + # Verify I didn't mess up on escaping here first + assert match(r']') + assert match(r'[') +@@ -411,7 +411,7 @@ class TestDefinitions(object): + def test_max_age_av(self): + "Smoke test Definitions.MAX_AGE_AV" + # Not a lot to this, it's just digits +- match = re.compile("^%s\Z" % Definitions.MAX_AGE_AV).match ++ match = re.compile(r"^%s\Z" % Definitions.MAX_AGE_AV).match + assert not match("") + assert not match("Whiskers") + assert not match("Max-Headroom=992") +@@ -424,7 +424,7 @@ class TestDefinitions(object): + + def test_label(self, check_unicode=False): + "Test label, as used in Domain attribute" +- match = re.compile("^(%s)\Z" % Definitions.LABEL).match ++ match = re.compile(r"^(%s)\Z" % Definitions.LABEL).match + for i in range(0, 10): + assert match(str(i)) + assert not match(".") +@@ -459,7 +459,7 @@ class TestDefinitions(object): + assert match(domain) + + # Now same tests through DOMAIN_AV +- match = re.compile("^%s\Z" % Definitions.DOMAIN_AV).match ++ match = re.compile(r"^%s\Z" % Definitions.DOMAIN_AV).match + for domain in bad_domains: + assert not match("Domain=%s" % domain) + for domain in good_domains: +@@ -487,7 +487,7 @@ class TestDefinitions(object): + for path in good_paths: + assert match(path) + +- match = re.compile("^%s\Z" % Definitions.PATH_AV).match ++ match = re.compile(r"^%s\Z" % Definitions.PATH_AV).match + for path in bad_paths: + assert not match("Path=%s" % path) + for path in good_paths: +@@ -575,7 +575,7 @@ class TestDefinitions(object): + # dependencies, and odds are good that other implementations are loose. + # so this parser is also loose. "liberal in what you accept, + # conservative in what you produce" +- match = re.compile("^%s\Z" % Definitions.EXPIRES_AV).match ++ match = re.compile(r"^%s\Z" % Definitions.EXPIRES_AV, flags=re.I | re.X).match + assert not match("") + assert not match("Expires=") + +@@ -610,7 +610,7 @@ class TestDefinitions(object): + + If this works, then ATTR should work + """ +- match = re.compile("^[%s]+\Z" % Definitions.EXTENSION_AV).match ++ match = re.compile(r"^[%s]+\Z" % Definitions.EXTENSION_AV).match + assert match("Expires=Sun, 06 Nov 1994 08:49:37 GMT") + assert match("Expires=Sunday, 06-Nov-94 08:49:37 GMT") + assert match("Expires=Sun Nov 6 08:49:37 1994") diff --git a/dev-python/cookies/files/cookies-2.2.1-tests.patch b/dev-python/cookies/files/cookies-2.2.1-tests.patch new file mode 100644 index 000000000000..9d8c84bb3c9d --- /dev/null +++ b/dev-python/cookies/files/cookies-2.2.1-tests.patch @@ -0,0 +1,28 @@ +diff --git a/test_cookies.py b/test_cookies.py +index 2197916..502ce86 100644 +--- a/test_cookies.py ++++ b/test_cookies.py +@@ -2225,7 +2225,10 @@ def test_encoding_assumptions(check_unicode=False): + else: + assert cookie_value_re.match(quoted) + +- assert set(dont_quote) == set("!#$%&'()*+/:<=>?@[]^`{|}~") ++ if sys.hexversion < 0x3070000: ++ assert set(dont_quote) == set("!#$%&'()*+/:<=>?@[]^`{|}~") ++ else: ++ assert set(dont_quote) == set("!#$%&'()*+/:<=>?@[]^`{|}") + + # From 128 on urllib.quote will not work on a unichr() return value. + # We'll want to encode utf-8 values into ASCII, then do the quoting. +@@ -2257,7 +2260,10 @@ def test_encoding_assumptions(check_unicode=False): + else: + assert extension_av_re.match(quoted) + +- assert set(dont_quote) == set(' !"#$%&\'()*+,/:<=>?@[\\]^`{|}~') ++ if sys.hexversion < 0x3070000: ++ assert set(dont_quote) == set(' !"#$%&\'()*+,/:<=>?@[\\]^`{|}~') ++ else: ++ assert set(dont_quote) == set(' !"#$%&\'()*+,/:<=>?@[\\]^`{|}') + + + test_encode_cookie_value = _simple_test(encode_cookie_value, |