diff --git a/165-use-ipaddress-library.patch b/165-use-ipaddress-library.patch index 40e9f45..6c34143 100644 --- a/165-use-ipaddress-library.patch +++ b/165-use-ipaddress-library.patch @@ -9,10 +9,10 @@ Subject: [PATCH] Use ipaddress to detect valid and invalid IPs tests/test_furl.py | 21 +++++++++++---------- 3 files changed, 50 insertions(+), 19 deletions(-) -diff --git a/furl/furl.py b/furl/furl.py -index cd6d710..451767f 100644 ---- a/furl/furl.py -+++ b/furl/furl.py +Index: furl-2.1.3/furl/furl.py +=================================================================== +--- furl-2.1.3.orig/furl/furl.py ++++ furl-2.1.3/furl/furl.py @@ -12,6 +12,7 @@ import re @@ -59,7 +59,7 @@ index cd6d710..451767f 100644 def get_scheme(url): if url.startswith(':'): return '' -@@ -1434,15 +1466,12 @@ def host(self, host): +@@ -1434,15 +1466,12 @@ class furl(URLPathCompositionInterface, """ Raises: ValueError on invalid host or malformed IPv6 address. """ @@ -81,11 +81,11 @@ index cd6d710..451767f 100644 errmsg = ( "Invalid host '%s'. Host strings must have at least one " "non-period character, can't contain any of '%s', and can't " -diff --git a/setup.py b/setup.py -index 8322619..887ca2e 100644 ---- a/setup.py -+++ b/setup.py -@@ -114,6 +114,7 @@ def run_tests(self): +Index: furl-2.1.3/setup.py +=================================================================== +--- furl-2.1.3.orig/setup.py ++++ furl-2.1.3/setup.py +@@ -109,6 +109,7 @@ setup( install_requires=[ 'six>=1.8.0', 'orderedmultidict>=1.0.1', @@ -93,11 +93,11 @@ index 8322619..887ca2e 100644 ], cmdclass={ 'test': RunTests, -diff --git a/tests/test_furl.py b/tests/test_furl.py -index bc268c8..5666be7 100644 ---- a/tests/test_furl.py -+++ b/tests/test_furl.py -@@ -1655,10 +1655,10 @@ def test_hosts(self): +Index: furl-2.1.3/tests/test_furl.py +=================================================================== +--- furl-2.1.3.orig/tests/test_furl.py ++++ furl-2.1.3/tests/test_furl.py +@@ -1666,10 +1666,10 @@ class TestFurl(unittest.TestCase): # addresses. f = furl.furl('http://1.2.3.4.5.6/') @@ -112,7 +112,7 @@ index bc268c8..5666be7 100644 # Malformed IPv6 should raise an exception because urlparse.urlsplit() # raises an exception on malformed IPv6 addresses. -@@ -1684,12 +1684,17 @@ def test_netloc(self): +@@ -1695,12 +1695,17 @@ class TestFurl(unittest.TestCase): assert f.host == '1.2.3.4.5.6' assert f.port == 999 @@ -132,7 +132,7 @@ index bc268c8..5666be7 100644 # Malformed IPv6 should raise an exception because # urlparse.urlsplit() raises an exception with self.assertRaises(ValueError): -@@ -1703,10 +1708,6 @@ def test_netloc(self): +@@ -1714,10 +1719,6 @@ class TestFurl(unittest.TestCase): with self.assertRaises(ValueError): f.netloc = 'pump2pump.org:777777777777' diff --git a/fix-test_odd_urls.patch b/fix-test_odd_urls.patch new file mode 100644 index 0000000..6d644b6 --- /dev/null +++ b/fix-test_odd_urls.patch @@ -0,0 +1,15 @@ +--- + tests/test_furl.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/tests/test_furl.py ++++ b/tests/test_furl.py +@@ -1637,7 +1637,7 @@ class TestFurl(unittest.TestCase): + # of a netloc, even if the netloc is empty. + f = furl.furl('////path') + assert f.netloc == '' and str(f.path) == '//path' +- assert f.url == '////path' ++ assert f.url in ('//////path', '////path') + + # TODO(grun): Test more odd URLs. + diff --git a/netloc-tests.patch b/netloc-tests.patch new file mode 100644 index 0000000..4ec82ac --- /dev/null +++ b/netloc-tests.patch @@ -0,0 +1,22 @@ +Index: furl-2.1.3/tests/test_furl.py +=================================================================== +--- furl-2.1.3.orig/tests/test_furl.py ++++ furl-2.1.3/tests/test_furl.py +@@ -1635,11 +1635,12 @@ class TestFurl(unittest.TestCase): + f.port = None + assert f.url == '' and f.netloc is None + +- # urlparse.urlsplit() treats the first two '//' as the beginning +- # of a netloc, even if the netloc is empty. +- f = furl.furl('////path') +- assert f.netloc == '' and str(f.path) == '//path' +- assert f.url == '////path' ++ if sys.version_info < (3, 12): ++ # urlparse.urlsplit() treats the first two '//' as the beginning ++ # of a netloc, even if the netloc is empty. ++ f = furl.furl('////path') ++ assert f.netloc == '' and str(f.path) == '//path' ++ assert f.url == '////path' + + # TODO(grun): Test more odd URLs. + diff --git a/python-furl.changes b/python-furl.changes index e2dcd46..e36ac6a 100644 --- a/python-furl.changes +++ b/python-furl.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Fri Sep 13 18:56:20 UTC 2024 - Matej Cepl + +- Add remove-six.patch (gh#gruns/furl#175) removing the + dependency on six. +- Add fix-test_odd_urls.patch fixing the failure of + tests/test_furl.py::TestFurl::test_odd_urls test with the + recent Python interpreters (gh#gruns/furl#176). + +------------------------------------------------------------------- +Tue Jul 2 20:29:03 UTC 2024 - Dirk Müller + +- add netloc-tests.patch to skip failing test with python 3.12 + ------------------------------------------------------------------- Tue Jul 4 22:28:07 UTC 2023 - Matej Cepl @@ -14,7 +28,7 @@ Wed Sep 28 19:47:43 UTC 2022 - Yogalakshmi Arunachalam - version update to v2.1.3 Fixed: Actually drop ';' as a query delimiter. See furl v2.1.2's - changelog and https://bugs.python.org/issue42967. + changelog and https://bugs.python.org/issue42967. ------------------------------------------------------------------- Fri Aug 19 16:28:12 UTC 2022 - Ben Greiner diff --git a/python-furl.spec b/python-furl.spec index e731c16..7543d37 100644 --- a/python-furl.spec +++ b/python-furl.spec @@ -1,7 +1,7 @@ # # spec file for package python-furl # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -29,17 +29,22 @@ Source: https://files.pythonhosted.org/packages/source/f/furl/furl-%{ver # PATCH-FIX-UPSTREAM 165-use-ipaddress-library.patch gh#gruns/furl#164 mcepl@suse.com # use ipaddress to parse IP addresses Patch0: 165-use-ipaddress-library.patch +Patch1: netloc-tests.patch +# PATCH-FEATURE-UPSTREAM remove-six.patch gh#gruns/furl#175 mcepl@suse.com +# remove the need of using six +Patch2: remove-six.patch +# PATCH-FIX-UPSTREAM fix-test_odd_urls.patch gh#gruns/furl#176 mcepl@suse.com +# Python currently parses '////path' URL in a different way +Patch3: fix-test_odd_urls.patch BuildRequires: %{python_module pip} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-orderedmultidict >= 1.0.1 -Requires: python-six >= 1.8.0 BuildArch: noarch # SECTION test requirements BuildRequires: %{python_module orderedmultidict >= 1.0.1} BuildRequires: %{python_module pytest} -BuildRequires: %{python_module six >= 1.8.0} # /SECTION %python_subpackages diff --git a/remove-six.patch b/remove-six.patch new file mode 100644 index 0000000..9cfae7b --- /dev/null +++ b/remove-six.patch @@ -0,0 +1,210 @@ +--- + furl.egg-info/requires.txt | 1 - + furl/furl.py | 34 ++++++++++++++-------------------- + setup.py | 2 -- + tests/test_furl.py | 7 ++----- + tests/test_omdict1D.py | 7 +++---- + 5 files changed, 19 insertions(+), 32 deletions(-) + +--- a/furl.egg-info/requires.txt ++++ b/furl.egg-info/requires.txt +@@ -1,2 +1 @@ +-six>=1.8.0 + orderedmultidict>=1.0.1 +--- a/furl/furl.py ++++ b/furl/furl.py +@@ -17,9 +17,8 @@ import warnings + from copy import deepcopy + from posixpath import normpath + +-import six +-from six.moves import urllib +-from six.moves.urllib.parse import quote, unquote ++import urllib ++from urllib.parse import quote, unquote + try: + from icecream import ic + except ImportError: # Graceful fallback if IceCream isn't installed. +@@ -138,7 +137,7 @@ def is_valid_port(port): + + def static_vars(**kwargs): + def decorator(func): +- for key, value in six.iteritems(kwargs): ++ for key, value in kwargs.items(): + setattr(func, key, value) + return func + return decorator +@@ -243,7 +242,7 @@ def is_valid_host(hostname): + + + def is_valid_ipv4(ip): +- if isinstance(ip, six.binary_type): ++ if isinstance(ip, bytes): + ip = ip.decode() + + try: +@@ -254,7 +253,7 @@ def is_valid_ipv4(ip): + + + def is_valid_ipv6(ip): +- if isinstance(ip, six.binary_type): ++ if isinstance(ip, bytes): + ip = ip.decode() + + # ipaddress handle IPs without brackets +@@ -733,8 +732,7 @@ class Path(object): + return '/'.join(segments) + + +-@six.add_metaclass(abc.ABCMeta) +-class PathCompositionInterface(object): ++class PathCompositionInterface(object, metaclass=abc.ABCMeta): + + """ + Abstract class interface for a parent class that contains a Path. +@@ -784,8 +782,7 @@ class PathCompositionInterface(object): + return False + + +-@six.add_metaclass(abc.ABCMeta) +-class URLPathCompositionInterface(PathCompositionInterface): ++class URLPathCompositionInterface(PathCompositionInterface, metaclass=abc.ABCMeta): + + """ + Abstract class interface for a parent class that contains a URL +@@ -812,8 +809,7 @@ class URLPathCompositionInterface(PathCo + return bool(path) and self.netloc + + +-@six.add_metaclass(abc.ABCMeta) +-class FragmentPathCompositionInterface(PathCompositionInterface): ++class FragmentPathCompositionInterface(PathCompositionInterface, metaclass=abc.ABCMeta): + + """ + Abstract class interface for a parent class that contains a Fragment +@@ -1125,7 +1121,7 @@ class Query(object): + elif callable_attr(items, 'iteritems'): + items = list(items.iteritems()) + # Encoded query string. e.g. 'a=1&b=2&c=3' +- elif isinstance(items, six.string_types): ++ elif isinstance(items, str): + items = self._extract_items_from_querystr(items) + # Default to list of key:value items interface. e.g. [('a','1'), + # ('b','2')] +@@ -1141,7 +1137,7 @@ class Query(object): + pairs = [item.split('=', 1) for item in pairstrs] + pairs = [(p[0], lget(p, 1, '')) for p in pairs] # Pad with value ''. + +- for pairstr, (key, value) in six.moves.zip(pairstrs, pairs): ++ for pairstr, (key, value) in zip(pairstrs, pairs): + valid_key = is_valid_encoded_query_key(key) + valid_value = is_valid_encoded_query_value(value) + if self.strict and (not valid_key or not valid_value): +@@ -1163,8 +1159,7 @@ class Query(object): + return items + + +-@six.add_metaclass(abc.ABCMeta) +-class QueryCompositionInterface(object): ++class QueryCompositionInterface(object, metaclass=abc.ABCMeta): + + """ + Abstract class interface for a parent class that contains a Query. +@@ -1331,8 +1326,7 @@ class Fragment(FragmentPathCompositionIn + return "%s('%s')" % (self.__class__.__name__, str(self)) + + +-@six.add_metaclass(abc.ABCMeta) +-class FragmentCompositionInterface(object): ++class FragmentCompositionInterface(object, metaclass=abc.ABCMeta): + + """ + Abstract class interface for a parent class that contains a +@@ -1430,7 +1424,7 @@ class furl(URLPathCompositionInterface, + + if url is None: + url = '' +- if not isinstance(url, six.string_types): ++ if not isinstance(url, str): + url = str(url) + + # urlsplit() raises a ValueError on malformed IPv6 addresses in +@@ -1874,7 +1868,7 @@ class furl(URLPathCompositionInterface, + + def join(self, *urls): + for url in urls: +- if not isinstance(url, six.string_types): ++ if not isinstance(url, str): + url = str(url) + newurl = urljoin(self.url, url) + self.load(newurl) +--- a/setup.py ++++ b/setup.py +@@ -104,10 +104,8 @@ setup( + ], + tests_require=[ + 'flake8', +- 'six>=1.8.0', + ], + install_requires=[ +- 'six>=1.8.0', + 'orderedmultidict>=1.0.1', + 'ipaddress>=1.0.23; python_version < "3.3"', + ], +--- a/tests/test_furl.py ++++ b/tests/test_furl.py +@@ -16,9 +16,7 @@ import warnings + from abc import ABCMeta, abstractmethod + import sys + +-import six +-from six.moves import zip +-from six.moves.urllib.parse import ( ++from urllib.parse import ( + quote, quote_plus, parse_qsl, urlsplit, SplitResult) + + import furl +@@ -35,8 +33,7 @@ import unittest + # + + +-@six.add_metaclass(ABCMeta) +-class itemcontainer(object): ++class itemcontainer(object, metaclass=ABCMeta): + + """ + Utility list subclasses to expose allitems() and iterallitems() +--- a/tests/test_omdict1D.py ++++ b/tests/test_omdict1D.py +@@ -13,7 +13,6 @@ + import unittest + from itertools import chain, product, permutations + +-import six + from furl.omdict1D import omdict1D + from orderedmultidict import omdict + +@@ -48,12 +47,12 @@ class TestOmdict1D(unittest.TestCase): + data.update(update) + omd1.update(update) + omd2.updateall(update) +- for key in six.iterkeys(omd1): ++ for key in omd1.keys(): + if isinstance(data[key], list): + assert omd1[key] == data[key][-1] + else: + assert omd1[key] == data[key] +- for key in six.iterkeys(omd2): ++ for key in omd2.keys(): + data_values_unpacked = [] + for value in data.getlist(key): + if isinstance(value, list): +@@ -149,7 +148,7 @@ class TestOmdict1D(unittest.TestCase): + + def test_setitem(self): + omd = omdict1D() +- for value, valuelist in six.moves.zip(self.values, self.valuelists): ++ for value, valuelist in zip(self.values, self.valuelists): + if valuelist: + omd[self.key] = valuelist + assert omd[self.key] == omd.get(self.key) == valuelist[0]