diff --git a/python-38-support.patch b/python-38-support.patch new file mode 100644 index 0000000..54c466b --- /dev/null +++ b/python-38-support.patch @@ -0,0 +1,163 @@ +From f0c2990d35ac3c924ecc8be4a5c71c8e4abbd0e5 Mon Sep 17 00:00:00 2001 +From: Fred Drake +Date: Tue, 17 Sep 2019 19:25:20 -0400 +Subject: [PATCH 1/4] update to tolerate logging.Formatter validation + +- required to work with Python 3.8 +- closes issue #69 +--- + ZConfig/components/logger/formatter.py | 11 +++++++- + .../components/logger/tests/test_formatter.py | 28 ++++++++++++++----- + 2 files changed, 31 insertions(+), 8 deletions(-) + +diff --git a/ZConfig/components/logger/formatter.py b/ZConfig/components/logger/formatter.py +index 512f5da..6cf464e 100644 +--- a/ZConfig/components/logger/formatter.py ++++ b/ZConfig/components/logger/formatter.py +@@ -248,8 +248,17 @@ def __call__(self): + else: + # A formatter class that supports style, but our style is + # non-standard, so we reach under the covers a bit. ++ # ++ # Python 3.8 adds a validate option, defaulting to True, ++ # which cases the format string to be checked. Since ++ # safe-template is not a standard style, we want to ++ # suppress this. ++ # ++ kwargs = dict() ++ if sys.version_info >= (3, 8): ++ kwargs['validate'] = False + formatter = self.factory(self.format, self.dateformat, +- style='$') ++ style='$', **kwargs) + assert formatter._style._fmt == self.format + formatter._style = stylist + else: +diff --git a/ZConfig/components/logger/tests/test_formatter.py b/ZConfig/components/logger/tests/test_formatter.py +index 81c7235..3a04a5f 100644 +--- a/ZConfig/components/logger/tests/test_formatter.py ++++ b/ZConfig/components/logger/tests/test_formatter.py +@@ -25,6 +25,17 @@ + import ZConfig.components.logger.tests.support + + ++# In Python 3.8, a KeyError raised by string interpolation is re-written ++# into a ValueError reporting a reference to an undefined field. We're ++# not masking the exception, but we want to check for the right one in ++# the tests below (without catching anything else). ++# ++if sys.version_info >= (3, 8): ++ MissingFieldError = ValueError ++else: ++ MissingFieldError = KeyError ++ ++ + class LogFormatStyleTestCase(unittest.TestCase): + + def setUp(self): +@@ -314,7 +325,10 @@ class CustomFormatterFactoryWithoutStyleParamTestCase( + class StylelessFormatter(logging.Formatter): + + def __init__(self, fmt=None, datefmt=None): +- logging.Formatter.__init__(self, fmt=fmt, datefmt=datefmt) ++ kwargs = dict() ++ if sys.version_info >= (3, 8): ++ kwargs['validate'] = False ++ logging.Formatter.__init__(self, fmt=fmt, datefmt=datefmt, **kwargs) + + + def styleless_formatter(fmt=None, datefmt=None): +@@ -552,9 +566,9 @@ def test_classic_arbitrary_field_missing(self): + arbitrary_fields=True) + + # The formatter still breaks when it references an undefined field: +- with self.assertRaises(KeyError) as cm: ++ with self.assertRaises(MissingFieldError) as cm: + formatter.format(self.record) +- self.assertEqual(str(cm.exception), "'undefined_field'") ++ self.assertIn("'undefined_field'", str(cm.exception)) + + def test_classic_arbitrary_field_present(self): + formatter = self.get_formatter( +@@ -574,9 +588,9 @@ def test_format_arbitrary_field_missing(self): + arbitrary_fields=True) + + # The formatter still breaks when it references an undefined field: +- with self.assertRaises(KeyError) as cm: ++ with self.assertRaises(MissingFieldError) as cm: + formatter.format(self.record) +- self.assertEqual(str(cm.exception), "'undefined_field'") ++ self.assertIn("'undefined_field'", str(cm.exception)) + + def test_format_arbitrary_field_present(self): + formatter = self.get_formatter( +@@ -596,9 +610,9 @@ def test_template_arbitrary_field_missing(self): + arbitrary_fields=True) + + # The formatter still breaks when it references an undefined field: +- with self.assertRaises(KeyError) as cm: ++ with self.assertRaises(MissingFieldError) as cm: + formatter.format(self.record) +- self.assertEqual(str(cm.exception), "'undefined_field'") ++ self.assertIn("'undefined_field'", str(cm.exception)) + + def test_template_arbitrary_field_present(self): + formatter = self.get_formatter( + +From 42a09a17048fee4c6b880ea3fc215f6abe5b51eb Mon Sep 17 00:00:00 2001 +From: Fred Drake +Date: Tue, 17 Sep 2019 19:43:27 -0400 +Subject: [PATCH 2/4] add python 3.8 to tox, travis configs + +--- + .travis.yml | 1 + + tox.ini | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/.travis.yml b/.travis.yml +index 9dd3331..f46558a 100644 +--- a/.travis.yml ++++ b/.travis.yml +@@ -7,6 +7,7 @@ python: + - 3.5 + - 3.6 + - 3.7 ++ - 3.8-dev + - pypy + - pypy3 + +diff --git a/tox.ini b/tox.ini +index 7a9860b..4c7f8cd 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -1,5 +1,5 @@ + [tox] +-envlist = py27,py34,py35,py36,py37,pypy,coverage-report ++envlist = py27,py34,py35,py36,py37,py38,pypy,coverage-report + skip_missing_interpreters = true + + [testenv] + +From 61accf2c5d64f23ecaef4b4f7a13207dd4b3fa29 Mon Sep 17 00:00:00 2001 +From: Fred Drake +Date: Wed, 18 Sep 2019 08:35:38 -0700 +Subject: [PATCH 3/4] fix typo in comment (ZConfig.components.logger.formatter) + +Co-Authored-By: Jason Madden +--- + ZConfig/components/logger/formatter.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ZConfig/components/logger/formatter.py b/ZConfig/components/logger/formatter.py +index 6cf464e..009630d 100644 +--- a/ZConfig/components/logger/formatter.py ++++ b/ZConfig/components/logger/formatter.py +@@ -250,7 +250,7 @@ def __call__(self): + # non-standard, so we reach under the covers a bit. + # + # Python 3.8 adds a validate option, defaulting to True, +- # which cases the format string to be checked. Since ++ # which causes the format string to be checked. Since + # safe-template is not a standard style, we want to + # suppress this. + # diff --git a/python-ZConfig.changes b/python-ZConfig.changes index 5fce32a..4afd3c1 100644 --- a/python-ZConfig.changes +++ b/python-ZConfig.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Mon Nov 25 01:54:32 UTC 2019 - Steve Kowalik + +- Add python-38-support.patch to support Python 3.8 + ------------------------------------------------------------------- Mon Jul 29 14:07:11 UTC 2019 - pgajdos@suse.com diff --git a/python-ZConfig.spec b/python-ZConfig.spec index 2ac05d0..6b6693b 100644 --- a/python-ZConfig.spec +++ b/python-ZConfig.spec @@ -1,7 +1,7 @@ # # spec file for package python-ZConfig # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -25,6 +25,8 @@ License: ZPL-2.1 Group: Development/Libraries/Python URL: https://github.com/zopefoundation/ZConfig Source: https://files.pythonhosted.org/packages/source/Z/ZConfig/ZConfig-%{version}.tar.gz +# UPSTREAM PATCH (partial): gh#zopefoundation/ZConfig#70 +Patch0: python-38-support.patch # Testing requirements: BuildRequires: %{python_module docutils} BuildRequires: %{python_module manuel} @@ -64,6 +66,7 @@ This package contains documentation files for %{name}. %prep %setup -q -n ZConfig-%{version} +%autopatch -p1 rm -rf ZConfig.egg-info rm doc/make.bat # test works only in git repo