Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-Cython for openSUSE:Factory 
checked in at 2021-04-24 23:06:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-Cython (Old)
 and      /work/SRC/openSUSE:Factory/.python-Cython.new.12324 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-Cython"

Sat Apr 24 23:06:35 2021 rev:59 rq:887377 version:0.29.23

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-Cython/python-Cython.changes      
2021-03-02 15:25:53.753791890 +0100
+++ /work/SRC/openSUSE:Factory/.python-Cython.new.12324/python-Cython.changes   
2021-04-24 23:06:38.571181817 +0200
@@ -1,0 +2,14 @@
+Wed Apr 21 21:19:17 UTC 2021 - Dirk M??ller <dmuel...@suse.com>
+
+- update to 0.29.23:
+  * Some problems with Python 3.10 were resolved.
+    Patches by Victor Stinner and David Woods.  (Github issues #4046, #4100)
+  * An incorrect "optimisation" was removed that allowed changes to a keyword
+    dict to leak into keyword arguments passed into a function.
+    Patch by Peng Weikang.  (Github issue #3227)
+  * Multiplied str constants could end up as bytes constants with 
language_level=2.
+    Patch by Alphadelta14 and David Woods.  (Github issue #3951)
+  * ``PY_SSIZE_T_CLEAN`` does not get defined any more if it is already 
defined.
+    Patch by Andrew Jones.  (Github issue #4104)
+
+-------------------------------------------------------------------

Old:
----
  Cython-0.29.22.tar.gz

New:
----
  Cython-0.29.23.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-Cython.spec ++++++
--- /var/tmp/diff_new_pack.gXaNWT/_old  2021-04-24 23:06:38.991182411 +0200
+++ /var/tmp/diff_new_pack.gXaNWT/_new  2021-04-24 23:06:38.991182411 +0200
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define         oldpython python
 Name:           python-Cython
-Version:        0.29.22
+Version:        0.29.23
 Release:        0
 Summary:        The Cython compiler for writing C extensions for the Python 
language
 License:        Apache-2.0
@@ -36,7 +36,7 @@
 Requires:       python-devel
 Requires:       python-xml
 Requires(post): update-alternatives
-Requires(postun): update-alternatives
+Requires(postun):update-alternatives
 %ifpython2
 Provides:       %{oldpython}-cython = %{version}
 Obsoletes:      %{oldpython}-cython < %{version}

++++++ Cython-0.29.22.tar.gz -> Cython-0.29.23.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/.gitrev new/Cython-0.29.23/.gitrev
--- old/Cython-0.29.22/.gitrev  2021-02-19 21:31:35.000000000 +0100
+++ new/Cython-0.29.23/.gitrev  2021-04-14 17:25:18.000000000 +0200
@@ -1 +1 @@
-fc777dd6f2661e9b34f50cbd39ac9b184eded484
+17670781083e3ccfedb1af4adcec614d4599eef9
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/CHANGES.rst 
new/Cython-0.29.23/CHANGES.rst
--- old/Cython-0.29.22/CHANGES.rst      2021-02-19 21:31:16.000000000 +0100
+++ new/Cython-0.29.23/CHANGES.rst      2021-04-14 17:24:45.000000000 +0200
@@ -2,6 +2,26 @@
 Cython Changelog
 ================
 
+0.29.23 (2021-04-14)
+====================
+
+Bugs fixed
+----------
+
+* Some problems with Python 3.10 were resolved.
+  Patches by Victor Stinner and David Woods.  (Github issues #4046, #4100)
+
+* An incorrect "optimisation" was removed that allowed changes to a keyword
+  dict to leak into keyword arguments passed into a function.
+  Patch by Peng Weikang.  (Github issue #3227)
+
+* Multiplied str constants could end up as bytes constants with 
language_level=2.
+  Patch by Alphadelta14 and David Woods.  (Github issue #3951)
+
+* ``PY_SSIZE_T_CLEAN`` does not get defined any more if it is already defined.
+  Patch by Andrew Jones.  (Github issue #4104)
+
+
 0.29.22 (2021-02-20)
 ====================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Cython/Build/Inline.py 
new/Cython-0.29.23/Cython/Build/Inline.py
--- old/Cython-0.29.22/Cython/Build/Inline.py   2020-08-14 10:31:39.000000000 
+0200
+++ new/Cython-0.29.23/Cython/Build/Inline.py   2021-04-14 17:24:45.000000000 
+0200
@@ -35,14 +35,18 @@
 else:
     to_unicode = lambda x: x
 
-if sys.version_info[:2] < (3, 3):
+if sys.version_info < (3, 5):
     import imp
     def load_dynamic(name, module_path):
         return imp.load_dynamic(name, module_path)
 else:
-    from importlib.machinery import ExtensionFileLoader
+    import importlib.util as _importlib_util
     def load_dynamic(name, module_path):
-        return ExtensionFileLoader(name, module_path).load_module()
+        spec = _importlib_util.spec_from_file_location(name, module_path)
+        module = _importlib_util.module_from_spec(spec)
+        # sys.modules[name] = module
+        spec.loader.exec_module(module)
+        return module
 
 class UnboundSymbols(EnvTransform, SkipDeclarations):
     def __init__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Cython/Compiler/ExprNodes.py 
new/Cython-0.29.23/Cython/Compiler/ExprNodes.py
--- old/Cython-0.29.22/Cython/Compiler/ExprNodes.py     2021-02-19 
21:31:16.000000000 +0100
+++ new/Cython-0.29.23/Cython/Compiler/ExprNodes.py     2021-04-14 
17:24:45.000000000 +0200
@@ -6669,22 +6669,13 @@
         return dict_type
 
     def analyse_types(self, env):
-        args = [
+        self.keyword_args = [
             arg.analyse_types(env).coerce_to_pyobject(env).as_none_safe_node(
                 # FIXME: CPython's error message starts with the runtime 
function name
                 'argument after ** must be a mapping, not NoneType')
             for arg in self.keyword_args
         ]
 
-        if len(args) == 1 and args[0].type is dict_type:
-            # strip this intermediate node and use the bare dict
-            arg = args[0]
-            if arg.is_name and arg.entry.is_arg and 
len(arg.entry.cf_assignments) == 1:
-                # passing **kwargs through to function call => allow NULL
-                arg.allow_null = True
-            return arg
-
-        self.keyword_args = args
         return self
 
     def may_be_none(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Cython/Compiler/ModuleNode.py 
new/Cython-0.29.23/Cython/Compiler/ModuleNode.py
--- old/Cython-0.29.22/Cython/Compiler/ModuleNode.py    2021-02-19 
21:31:16.000000000 +0100
+++ new/Cython-0.29.23/Cython/Compiler/ModuleNode.py    2021-04-14 
17:24:45.000000000 +0200
@@ -634,7 +634,10 @@
             code.putln(json.dumps(metadata, indent=4, sort_keys=True))
             code.putln("END: Cython Metadata */")
             code.putln("")
+
+        code.putln("#ifndef PY_SSIZE_T_CLEAN")
         code.putln("#define PY_SSIZE_T_CLEAN")
+        code.putln("#endif /* PY_SSIZE_T_CLEAN */")
 
         for inc in sorted(env.c_includes.values(), key=IncludeCode.sortkey):
             if inc.location == inc.INITIAL:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Cython/Compiler/Optimize.py 
new/Cython-0.29.23/Cython/Compiler/Optimize.py
--- old/Cython-0.29.22/Cython/Compiler/Optimize.py      2020-08-14 
10:31:39.000000000 +0200
+++ new/Cython-0.29.23/Cython/Compiler/Optimize.py      2021-04-14 
17:24:45.000000000 +0200
@@ -4251,6 +4251,7 @@
                 string_node.unicode_value = encoded_string(
                     string_node.unicode_value * multiplier,
                     string_node.unicode_value.encoding)
+            build_string = encoded_string if string_node.value.is_unicode else 
bytes_literal
         elif isinstance(string_node, ExprNodes.UnicodeNode):
             if string_node.bytes_value is not None:
                 string_node.bytes_value = bytes_literal(
@@ -4258,9 +4259,14 @@
                     string_node.bytes_value.encoding)
         else:
             assert False, "unknown string node type: %s" % type(string_node)
-        string_node.constant_result = string_node.value = build_string(
+        string_node.value = build_string(
             string_node.value * multiplier,
             string_node.value.encoding)
+        # follow constant-folding and use unicode_value in preference
+        if isinstance(string_node, ExprNodes.StringNode) and 
string_node.unicode_value is not None:
+            string_node.constant_result = string_node.unicode_value
+        else:
+            string_node.constant_result = string_node.value
         return string_node
 
     def _calculate_constant_seq(self, node, sequence_node, factor):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Cython/Compiler/TreePath.py 
new/Cython-0.29.23/Cython/Compiler/TreePath.py
--- old/Cython-0.29.22/Cython/Compiler/TreePath.py      2020-04-19 
11:26:03.000000000 +0200
+++ new/Cython-0.29.23/Cython/Compiler/TreePath.py      2021-04-14 
17:24:45.000000000 +0200
@@ -10,6 +10,12 @@
 
 import re
 import operator
+import sys
+
+if sys.version_info[0] >= 3:
+    _unicode = str
+else:
+    _unicode = unicode
 
 path_tokenizer = re.compile(
     r"("
@@ -167,6 +173,11 @@
                     continue
                 if attr_value == value:
                     yield attr_value
+                elif (isinstance(attr_value, bytes) and isinstance(value, 
_unicode) and
+                        attr_value == value.encode()):
+                    # allow a bytes-to-string comparison too
+                    yield attr_value
+
     return select
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Cython/Shadow.py 
new/Cython-0.29.23/Cython/Shadow.py
--- old/Cython-0.29.22/Cython/Shadow.py 2021-02-19 21:31:16.000000000 +0100
+++ new/Cython-0.29.23/Cython/Shadow.py 2021-04-14 17:24:45.000000000 +0200
@@ -1,7 +1,7 @@
 # cython.* namespace for pure mode.
 from __future__ import absolute_import
 
-__version__ = "0.29.22"
+__version__ = "0.29.23"
 
 try:
     from __builtin__ import basestring
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Cython/Utility/Builtins.c 
new/Cython-0.29.23/Cython/Utility/Builtins.c
--- old/Cython-0.29.22/Cython/Utility/Builtins.c        2020-08-14 
10:31:39.000000000 +0200
+++ new/Cython-0.29.23/Cython/Utility/Builtins.c        2021-04-14 
17:24:45.000000000 +0200
@@ -496,9 +496,9 @@
         result = PyFrozenSet_New(it);
         if (unlikely(!result))
             return NULL;
-        if (likely(PySet_GET_SIZE(result)))
+        if ((PY_VERSION_HEX >= 0x031000A1) || likely(PySet_GET_SIZE(result)))
             return result;
-        // empty frozenset is a singleton
+        // empty frozenset is a singleton (on Python <3.10)
         // seems wasteful, but CPython does the same
         Py_DECREF(result);
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/Demos/embed/Makefile 
new/Cython-0.29.23/Demos/embed/Makefile
--- old/Cython-0.29.22/Demos/embed/Makefile     2020-08-14 10:31:39.000000000 
+0200
+++ new/Cython-0.29.23/Demos/embed/Makefile     2021-04-14 17:24:45.000000000 
+0200
@@ -15,6 +15,23 @@
 LIBS := $(shell $(PYTHON) -c "import distutils.sysconfig; 
print(distutils.sysconfig.get_config_var('LIBS'))")
 SYSLIBS :=  $(shell $(PYTHON) -c "import distutils.sysconfig; 
print(distutils.sysconfig.get_config_var('SYSLIBS'))")
 
+.PHONY: paths all clean test
+
+paths:
+       @echo "PYTHON=$(PYTHON)"
+       @echo "PYVERSION=$(PYVERSION)"
+       @echo "PYPREFIX=$(PYPREFIX)"
+       @echo "INCDIR=$(INCDIR)"
+       @echo "PLATINCDIR=$(PLATINCDIR)"
+       @echo "LIBDIR1=$(LIBDIR1)"
+       @echo "LIBDIR2=$(LIBDIR2)"
+       @echo "PYLIB=$(PYLIB)"
+       @echo "CC=$(CC)"
+       @echo "LINKCC=$(LINKCC)"
+       @echo "LINKFORSHARED=$(LINKFORSHARED)"
+       @echo "LIBS=$(LIBS)"
+       @echo "SYSLIBS=$(SYSLIBS)"
+
 embedded: embedded.o
        $(LINKCC) -o $@ $^ -L$(LIBDIR1) -L$(LIBDIR2) -l$(PYLIB) $(LIBS) 
$(SYSLIBS) $(LINKFORSHARED)
 
@@ -32,5 +49,5 @@
        @rm -f *~ *.o *.so core core.* *.c embedded test.output
 
 test: clean all
-       PYTHONHOME=$(PYPREFIX) LD_LIBRARY_PATH=$(LIBDIR1):$$LD_LIBRARY_PATH 
./embedded > test.output
+       LD_LIBRARY_PATH=$(LIBDIR1):$$LD_LIBRARY_PATH ./embedded > test.output
        $(PYTHON) assert_equal.py embedded.output test.output
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/PKG-INFO new/Cython-0.29.23/PKG-INFO
--- old/Cython-0.29.22/PKG-INFO 2021-02-19 21:31:42.000000000 +0100
+++ new/Cython-0.29.23/PKG-INFO 2021-04-14 17:25:27.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: Cython
-Version: 0.29.22
+Version: 0.29.23
 Summary: The Cython compiler for writing C extensions for the Python language.
 Home-page: http://cython.org/
 Author: Robert Bradshaw, Stefan Behnel, Dag Seljebotn, Greg Ewing, et al.
@@ -44,6 +44,7 @@
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Programming Language :: C
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/runtests.py 
new/Cython-0.29.23/runtests.py
--- old/Cython-0.29.22/runtests.py      2021-02-19 21:31:16.000000000 +0100
+++ new/Cython-0.29.23/runtests.py      2021-04-14 17:24:45.000000000 +0200
@@ -432,6 +432,7 @@
 INCLUDE_DIRS = [ d for d in os.getenv('INCLUDE', '').split(os.pathsep) if d ]
 CFLAGS = os.getenv('CFLAGS', '').split()
 CCACHE = os.getenv('CYTHON_RUNTESTS_CCACHE', '').split()
+CDEFS = []
 TEST_SUPPORT_DIR = 'testsupport'
 
 BACKENDS = ['c', 'cpp']
@@ -592,7 +593,7 @@
         if not self.test_times:
             return
         lines = ['Times:\n']
-        for metric, t in sorted(self.test_times.items()):
+        for metric, t in sorted(self.test_times.items(), 
key=operator.itemgetter(1), reverse=True):
             count = self.test_counts[metric]
             top = self.top_tests[metric]
             lines.append("%-12s: %8.2f sec  (%4d, %6.3f / run) - slowest: 
%s\n" % (
@@ -1052,6 +1053,7 @@
                 build_extension.compiler = COMPILER
 
             ext_compile_flags = CFLAGS[:]
+            ext_compile_defines = CDEFS[:]
 
             if  build_extension.compiler == 'mingw32':
                 ext_compile_flags.append('-Wno-format')
@@ -1066,6 +1068,7 @@
                 module,
                 sources=self.source_files(workdir, module, related_files),
                 extra_compile_args=ext_compile_flags,
+                define_macros=ext_compile_defines,
                 **extra_extension_args
                 )
 
@@ -1794,12 +1797,20 @@
         if sys.version_info[0] >=3 and CY3_DIR:
             cython = os.path.join(CY3_DIR, cython)
         cython = os.path.abspath(os.path.join('..', '..', cython))
-        self.assertEqual(0, os.system(
-            "make PYTHON='%s' CYTHON='%s' LIBDIR1='%s' test > make.output" % 
(sys.executable, cython, libdir)))
+
         try:
-            os.remove('make.output')
-        except OSError:
-            pass
+            subprocess.check_call([
+                "make",
+                "PYTHON='%s'" % sys.executable,
+                "CYTHON='%s'" % cython,
+                "LIBDIR1='%s'" % libdir,
+                "paths", "test",
+            ])
+        except subprocess.CalledProcessError as err:
+            print(err.output.decode())
+            raise
+        self.assertTrue(True)  # :)
+
 
 
 class MissingDependencyExcluder(object):
@@ -2134,14 +2145,16 @@
         import multiprocessing
         pool = multiprocessing.Pool(options.shard_count)
         tasks = [(options, cmd_args, shard_num) for shard_num in 
range(options.shard_count)]
-        errors = []
+        error_shards = []
+        failure_outputs = []
         # NOTE: create process pool before time stamper thread to avoid 
forking issues.
         total_time = time.time()
         stats = Stats()
         with time_stamper_thread():
-            for shard_num, shard_stats, return_code in 
pool.imap_unordered(runtests_callback, tasks):
+            for shard_num, shard_stats, return_code, failure_output in 
pool.imap_unordered(runtests_callback, tasks):
                 if return_code != 0:
-                    errors.append(shard_num)
+                    error_shards.append(shard_num)
+                    failure_outputs.append(failure_output)
                     sys.stderr.write("FAILED (%s/%s)\n" % (shard_num, 
options.shard_count))
                 sys.stderr.write("ALL DONE (%s/%s)\n" % (shard_num, 
options.shard_count))
                 stats.update(shard_stats)
@@ -2149,14 +2162,16 @@
         pool.join()
         total_time = time.time() - total_time
         sys.stderr.write("Sharded tests run in %d seconds (%.1f minutes)\n" % 
(round(total_time), total_time / 60.))
-        if errors:
-            sys.stderr.write("Errors for shards %s\n" % ", ".join([str(e) for 
e in errors]))
+        if error_shards:
+            sys.stderr.write("Errors found in shards %s\n" % ", ".join([str(e) 
for e in error_shards]))
+            for failure_output in zip(error_shards, failure_outputs):
+                sys.stderr.write("\nErrors from shard %s:\n%s" % 
failure_output)
             return_code = 1
         else:
             return_code = 0
     else:
         with time_stamper_thread():
-            _, stats, return_code = runtests(options, cmd_args, coverage)
+            _, stats, return_code, _ = runtests(options, cmd_args, coverage)
 
     if coverage:
         if options.shard_count > 1 and options.shard_num == -1:
@@ -2306,7 +2321,7 @@
                              build_in_temp=True,
                              pyxbuild_dir=os.path.join(WORKDIR, "support"))
         sys.path.insert(0, os.path.split(libpath)[0])
-        CFLAGS.append("-DCYTHON_REFNANNY=1")
+        CDEFS.append(('CYTHON_REFNANNY', '1'))
 
     if xml_output_dir and options.fork:
         # doesn't currently work together
@@ -2501,10 +2516,27 @@
         import refnanny
         sys.stderr.write("\n".join([repr(x) for x in refnanny.reflog]))
 
-    if options.exit_ok:
-        return options.shard_num, stats, 0
+    result_code = 0 if options.exit_ok else not result.wasSuccessful()
+
+    if xml_output_dir:
+        failure_output = ""
     else:
-        return options.shard_num, stats, not result.wasSuccessful()
+        failure_output = "".join(collect_failure_output(result))
+
+    return options.shard_num, stats, result_code, failure_output
+
+
+def collect_failure_output(result):
+    """Extract test error/failure output from a TextTestResult."""
+    failure_output = []
+    for flavour, errors in (("ERROR", result.errors), ("FAIL", 
result.failures)):
+        for test, err in errors:
+            failure_output.append("%s\n%s: %s\n%s\n%s\n" % (
+                result.separator1,
+                flavour, result.getDescription(test),
+                result.separator2,
+                err))
+    return failure_output
 
 
 if __name__ == '__main__':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/setup.py new/Cython-0.29.23/setup.py
--- old/Cython-0.29.22/setup.py 2020-08-14 10:31:39.000000000 +0200
+++ new/Cython-0.29.23/setup.py 2021-02-19 21:57:49.000000000 +0100
@@ -272,6 +272,7 @@
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
         "Programming Language :: Python :: 3.8",
+        "Programming Language :: Python :: 3.9",
         "Programming Language :: Python :: Implementation :: CPython",
         "Programming Language :: Python :: Implementation :: PyPy",
         "Programming Language :: C",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/cpdef_enums.pyx 
new/Cython-0.29.23/tests/run/cpdef_enums.pyx
--- old/Cython-0.29.22/tests/run/cpdef_enums.pyx        2020-08-14 
10:31:39.000000000 +0200
+++ new/Cython-0.29.23/tests/run/cpdef_enums.pyx        2021-04-14 
17:24:45.000000000 +0200
@@ -33,10 +33,10 @@
 Traceback (most recent call last):
 NameError: ...name 'RANK_3' is not defined
 
->>> set(PyxEnum) == set([TWO, THREE, FIVE])
+>>> set(PyxEnum) == {TWO, THREE, FIVE}
 True
->>> str(PyxEnum.TWO)
-'PyxEnum.TWO'
+>>> str(PyxEnum.TWO).split(".")[-1]  # Py3.10 changed the output here
+'TWO'
 >>> PyxEnum.TWO + PyxEnum.THREE == PyxEnum.FIVE
 True
 >>> PyxEnum(2) is PyxEnum["TWO"] is PyxEnum.TWO
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/cstringmul.pyx 
new/Cython-0.29.23/tests/run/cstringmul.pyx
--- old/Cython-0.29.22/tests/run/cstringmul.pyx 2018-09-22 16:18:56.000000000 
+0200
+++ new/Cython-0.29.23/tests/run/cstringmul.pyx 2021-04-14 17:24:45.000000000 
+0200
@@ -31,3 +31,15 @@
 uspam = u"eggs" * 4
 ugrail = 7 * u"tomato"
 ugrail_long = 700 * u"tomato"
+
+cimport cython
+
+@cython.test_assert_path_exists("//StringNode[@value = '-----']")
+@cython.test_assert_path_exists("//StringNode[@unicode_value = '-----']")
+def gh3951():
+    """
+    Bug occurs with language_level=2 and affects StringNode.value
+    >>> gh3951()
+    '-----'
+    """
+    return "-"*5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/dict.pyx 
new/Cython-0.29.23/tests/run/dict.pyx
--- old/Cython-0.29.22/tests/run/dict.pyx       2015-09-10 18:25:36.000000000 
+0200
+++ new/Cython-0.29.23/tests/run/dict.pyx       2021-04-14 17:24:45.000000000 
+0200
@@ -117,3 +117,22 @@
     [2, 4, 5]
     """
     return {1:2, sideeffect(2): 3, 3: 4, unhashable(4): 5, sideeffect(5): 6}
+
+
+def dict_unpacking_not_for_arg_create_a_copy():
+    """
+    >>> dict_unpacking_not_for_arg_create_a_copy()
+    [('a', 'modified'), ('b', 'original')]
+    [('a', 'original'), ('b', 'original')]
+    """
+    data = {'a': 'original', 'b': 'original'}
+
+    func = lambda: {**data}
+
+    call_once = func()
+    call_once['a'] = 'modified'
+
+    call_twice = func()
+
+    print(sorted(call_once.items()))
+    print(sorted(call_twice.items()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/generators_py35.py 
new/Cython-0.29.23/tests/run/generators_py35.py
--- old/Cython-0.29.22/tests/run/generators_py35.py     2020-08-14 
10:31:39.000000000 +0200
+++ new/Cython-0.29.23/tests/run/generators_py35.py     2021-04-14 
17:24:45.000000000 +0200
@@ -30,10 +30,10 @@
     >>> next(gen)
     2.0
     >>> ret, arg = sorted(anno_gen.__annotations__.items())
-    >>> print(ret[0]); print(ret[1])
+    >>> print(ret[0]); print(str(ret[1]).strip("'"))  # strip makes it pass 
with/without PEP563
     return
     float
-    >>> print(arg[0]); print(arg[1])
+    >>> print(arg[0]); print(str(arg[1]).strip("'"))
     x
     int
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/kwargs_passthrough.pyx 
new/Cython-0.29.23/tests/run/kwargs_passthrough.pyx
--- old/Cython-0.29.22/tests/run/kwargs_passthrough.pyx 2015-06-22 
14:53:11.000000000 +0200
+++ new/Cython-0.29.23/tests/run/kwargs_passthrough.pyx 2021-04-14 
17:24:45.000000000 +0200
@@ -1,7 +1,6 @@
-cimport cython
+import cython
 
-
-@cython.test_fail_if_path_exists('//MergedDictNode')
+#@cython.test_fail_if_path_exists('//MergedDictNode')
 def wrap_passthrough(f):
     """
     >>> def f(a=1): return a
@@ -80,7 +79,7 @@
     return wrapper
 
 
-@cython.test_fail_if_path_exists('//MergedDictNode')
+#@cython.test_fail_if_path_exists('//MergedDictNode')
 def wrap_passthrough2(f):
     """
     >>> def f(a=1): return a
@@ -99,7 +98,7 @@
     return wrapper
 
 
-@cython.test_fail_if_path_exists('//MergedDictNode')
+#@cython.test_fail_if_path_exists('//MergedDictNode')
 def wrap_modify(f):
     """
     >>> def f(a=1, test=2):
@@ -123,7 +122,7 @@
     return wrapper
 
 
-@cython.test_fail_if_path_exists('//MergedDictNode')
+#@cython.test_fail_if_path_exists('//MergedDictNode')
 def wrap_modify_mix(f):
     """
     >>> def f(a=1, test=2):
@@ -175,7 +174,21 @@
     return wrapper
 
 
-@cython.test_assert_path_exists('//MergedDictNode')
+def modify_in_function():
+    """
+    >>> modify_in_function()
+    {'foo': 'bar'}
+    {'foo': 'bar'}
+    """
+    def inner(**kwds):
+        kwds['foo'] = 'modified'
+    d = {'foo': 'bar'}
+    print(d)
+    inner(**d)
+    print(d)
+
+
+#@cython.test_assert_path_exists('//MergedDictNode')
 def wrap_modify_func_mix(f):
     """
     >>> def f(a=1, test=2):
@@ -203,12 +216,11 @@
     return wrapper
 
 
-@cython.test_fail_if_path_exists('//MergedDictNode')
+#@cython.test_fail_if_path_exists('//MergedDictNode')
 def wrap_reassign(f):
     """
     >>> def f(a=1, test=2):
     ...     return a, test
-
     >>> wrapped = wrap_reassign(f)
     >>> wrapped(1)
     CALLED
@@ -227,7 +239,7 @@
     return wrapper
 
 
-@cython.test_fail_if_path_exists('//MergedDictNode')
+#@cython.test_fail_if_path_exists('//MergedDictNode')
 def kwargs_metaclass(**kwargs):
     """
     >>> K = kwargs_metaclass()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/powop.pyx 
new/Cython-0.29.23/tests/run/powop.pyx
--- old/Cython-0.29.22/tests/run/powop.pyx      2020-08-14 10:31:39.000000000 
+0200
+++ new/Cython-0.29.23/tests/run/powop.pyx      2021-04-14 17:24:45.000000000 
+0200
@@ -153,9 +153,9 @@
     0.5
     >>> optimised_pow2_inplace(0.5) == 2 ** 0.5
     True
-    >>> optimised_pow2_inplace('test')
+    >>> optimised_pow2_inplace('test') #doctest: +ELLIPSIS
     Traceback (most recent call last):
-    TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'str'
+    TypeError: unsupported operand type(s) for ...: 'int' and 'str'
     """
     x = 2
     x **= n
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/set.pyx 
new/Cython-0.29.23/tests/run/set.pyx
--- old/Cython-0.29.22/tests/run/set.pyx        2018-09-22 16:18:56.000000000 
+0200
+++ new/Cython-0.29.23/tests/run/set.pyx        2021-04-14 17:24:45.000000000 
+0200
@@ -417,7 +417,8 @@
     True
     >>> len(s)
     0
-    >>> s is frozenset()   # singleton!
+    >>> import sys
+    >>> sys.version_info >= (3, 10) or s is frozenset()   # singleton (in 
Python < 3.10)!
     True
     """
     return frozenset()
@@ -430,7 +431,8 @@
 )
 def test_singleton_empty_frozenset():
     """
-    >>> test_singleton_empty_frozenset()  # from CPython's test_set.py
+    >>> import sys
+    >>> test_singleton_empty_frozenset() if sys.version_info < (3, 10) else 1  
# from CPython's test_set.py
     1
     """
     f = frozenset()
@@ -438,7 +440,7 @@
            frozenset(), frozenset([]), frozenset(()), frozenset(''),
            frozenset(range(0)), frozenset(frozenset()),
            frozenset(f), f]
-    return len(set(map(id, efs)))
+    return len(set(map(id, efs)))  # note, only a singleton in Python <3.10
 
 
 def sorted(it):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/test_asyncgen.py 
new/Cython-0.29.23/tests/run/test_asyncgen.py
--- old/Cython-0.29.22/tests/run/test_asyncgen.py       2020-08-14 
10:31:39.000000000 +0200
+++ new/Cython-0.29.23/tests/run/test_asyncgen.py       2021-04-14 
17:24:45.000000000 +0200
@@ -501,9 +501,9 @@
     def test_async_gen_asyncio_01(self):
         async def gen():
             yield 1
-            await asyncio.sleep(0.01, loop=self.loop)
+            await asyncio.sleep(0.01)
             yield 2
-            await asyncio.sleep(0.01, loop=self.loop)
+            await asyncio.sleep(0.01)
             return
             yield 3
 
@@ -513,7 +513,7 @@
     def test_async_gen_asyncio_02(self):
         async def gen():
             yield 1
-            await asyncio.sleep(0.01, loop=self.loop)
+            await asyncio.sleep(0.01)
             yield 2
             1 / ZERO
             yield 3
@@ -527,7 +527,7 @@
         class Gen:
             async def __aiter__(self):
                 yield 1
-                await asyncio.sleep(0.01, loop=loop)
+                await asyncio.sleep(0.01)
                 yield 2
 
         res = loop.run_until_complete(self.to_list(Gen()))
@@ -536,13 +536,13 @@
     def test_async_gen_asyncio_anext_04(self):
         async def foo():
             yield 1
-            await asyncio.sleep(0.01, loop=self.loop)
+            await asyncio.sleep(0.01)
             try:
                 yield 2
                 yield 3
             except ZeroDivisionError:
                 yield 1000
-            await asyncio.sleep(0.01, loop=self.loop)
+            await asyncio.sleep(0.01)
             yield 4
 
         async def run1():
@@ -693,7 +693,7 @@
                 yield 1
                 1 / ZERO
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 yield 12
 
         async def run():
@@ -716,8 +716,8 @@
                 yield 1
                 1 / ZERO
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE += 1
             DONE += 1000
 
@@ -743,8 +743,8 @@
                 DONE += 1000
                 yield 2
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE += 1
             DONE += 1000
 
@@ -753,7 +753,7 @@
             it = gen.__aiter__()
             self.assertEqual(await it.__anext__(), 1)
             t = self.loop.create_task(it.__anext__())
-            await asyncio.sleep(0.01, loop=self.loop)
+            await asyncio.sleep(0.01)
             await gen.aclose()
             return t
 
@@ -763,7 +763,7 @@
         # Silence ResourceWarnings
         fut.cancel()
         t.cancel()
-        self.loop.run_until_complete(asyncio.sleep(0.01, loop=self.loop))
+        self.loop.run_until_complete(asyncio.sleep(0.01))
 
     @needs_py36_asyncio
     def test_async_gen_asyncio_gc_aclose_09(self):
@@ -775,8 +775,8 @@
                 while True:
                     yield 1
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE = 1
 
         async def run():
@@ -785,7 +785,7 @@
             await g.__anext__()
             del g
 
-            await asyncio.sleep(0.1, loop=self.loop)
+            await asyncio.sleep(0.1)
 
         self.loop.run_until_complete(run())
         self.assertEqual(DONE, 1)
@@ -876,15 +876,15 @@
         async def gen():
             nonlocal DONE
             try:
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 v = yield 1
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 yield v * 2
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 return
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE = 1
 
         async def run():
@@ -906,21 +906,21 @@
         DONE = 0
 
         async def sleep_n_crash(delay):
-            await asyncio.sleep(delay, loop=self.loop)
+            await asyncio.sleep(delay)
             1 / ZERO
 
         async def gen():
             nonlocal DONE
             try:
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 v = yield 1
                 await sleep_n_crash(0.01)
                 DONE += 1000
                 yield v * 2
             finally:
                 assert sys.exc_info()[0] == ZeroDivisionError
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE += 1
 
         async def run():
@@ -939,7 +939,7 @@
         DONE = 0
 
         async def sleep_n_crash(delay):
-            fut = asyncio.ensure_future(asyncio.sleep(delay, loop=self.loop),
+            fut = asyncio.ensure_future(asyncio.sleep(delay),
                                         loop=self.loop)
             self.loop.call_later(delay / 2, lambda: fut.cancel())
             return await fut
@@ -947,14 +947,14 @@
         async def gen():
             nonlocal DONE
             try:
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 v = yield 1
                 await sleep_n_crash(0.01)
                 DONE += 1000
                 yield v * 2
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE = 1
 
         async def run():
@@ -993,18 +993,18 @@
         async def gen():
             nonlocal DONE
             try:
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 try:
                     v = yield 1
                 except FooEr:
                     v = 1000
-                    await asyncio.sleep(0.01, loop=self.loop)
+                    await asyncio.sleep(0.01)
                 yield v * 2
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 # return
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE = 1
 
         async def run():
@@ -1029,7 +1029,7 @@
             pass
 
         async def sleep_n_crash(delay):
-            fut = asyncio.ensure_future(asyncio.sleep(delay, loop=self.loop),
+            fut = asyncio.ensure_future(asyncio.sleep(delay),
                                         loop=self.loop)
             self.loop.call_later(delay / 2, lambda: fut.cancel())
             return await fut
@@ -1037,17 +1037,17 @@
         async def gen():
             nonlocal DONE
             try:
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 try:
                     v = yield 1
                 except FooEr:
                     await sleep_n_crash(0.01)
                 yield v * 2
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
                 # return
             finally:
-                await asyncio.sleep(0.01, loop=self.loop)
-                await asyncio.sleep(0.01, loop=self.loop)
+                await asyncio.sleep(0.01)
+                await asyncio.sleep(0.01)
                 DONE = 1
 
         async def run():
@@ -1147,10 +1147,10 @@
         async def waiter(timeout):
             nonlocal finalized
             try:
-                await asyncio.sleep(timeout, loop=self.loop)
+                await asyncio.sleep(timeout)
                 yield 1
             finally:
-                await asyncio.sleep(0, loop=self.loop)
+                await asyncio.sleep(0)
                 finalized += 1
 
         async def wait():
@@ -1160,7 +1160,7 @@
         t1 = self.loop.create_task(wait())
         t2 = self.loop.create_task(wait())
 
-        self.loop.run_until_complete(asyncio.sleep(0.1, loop=self.loop))
+        self.loop.run_until_complete(asyncio.sleep(0.1))
 
         self.loop.run_until_complete(self.loop.shutdown_asyncgens())
         self.assertEqual(finalized, 2)
@@ -1168,7 +1168,7 @@
         # Silence warnings
         t1.cancel()
         t2.cancel()
-        self.loop.run_until_complete(asyncio.sleep(0.1, loop=self.loop))
+        self.loop.run_until_complete(asyncio.sleep(0.1))
 
     @needs_py36_asyncio
     def test_async_gen_asyncio_shutdown_02(self):
@@ -1183,7 +1183,7 @@
 
         async def waiter(timeout):
             try:
-                await asyncio.sleep(timeout, loop=self.loop)
+                await asyncio.sleep(timeout)
                 yield 1
             finally:
                 1 / ZERO
@@ -1193,7 +1193,7 @@
                 pass
 
         t = self.loop.create_task(wait())
-        self.loop.run_until_complete(asyncio.sleep(0.1, loop=self.loop))
+        self.loop.run_until_complete(asyncio.sleep(0.1))
 
         self.loop.set_exception_handler(logger)
         self.loop.run_until_complete(self.loop.shutdown_asyncgens())
@@ -1202,7 +1202,7 @@
 
         # Silence warnings
         t.cancel()
-        self.loop.run_until_complete(asyncio.sleep(0.1, loop=self.loop))
+        self.loop.run_until_complete(asyncio.sleep(0.1))
 
 if __name__ == "__main__":
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/test_exceptions.pyx 
new/Cython-0.29.23/tests/run/test_exceptions.pyx
--- old/Cython-0.29.22/tests/run/test_exceptions.pyx    2020-04-19 
11:26:03.000000000 +0200
+++ new/Cython-0.29.23/tests/run/test_exceptions.pyx    2021-04-14 
17:24:45.000000000 +0200
@@ -13,11 +13,16 @@
 import weakref
 import errno
 
-from test.support import (TESTFN, captured_stderr, check_impl_detail,
-                          check_warnings, gc_collect,
+from test.support import (captured_stderr, check_impl_detail, gc_collect,
                           # no_tracing, cpython_only,
-                          unlink, import_module, script_helper,
-                          SuppressCrashReport)
+                          script_helper, SuppressCrashReport)
+try:
+    from test.support.os_helper import TESTFN, unlink
+    from test.support.warnings_helper import check_warnings
+    from test.support.import_helper import import_module
+except ImportError:
+    # Python 3.9 and older
+    from test.support import check_warnings, TESTFN, unlink, import_module
 
 no_tracing = unittest.skip("For nested functions, Cython generates a C call 
without recursion checks.")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Cython-0.29.22/tests/run/test_unicode.pyx 
new/Cython-0.29.23/tests/run/test_unicode.pyx
--- old/Cython-0.29.22/tests/run/test_unicode.pyx       2020-08-14 
10:31:39.000000000 +0200
+++ new/Cython-0.29.23/tests/run/test_unicode.pyx       2021-04-14 
17:24:45.000000000 +0200
@@ -1470,19 +1470,19 @@
         class Str(str, enum.Enum):
             ABC = 'abc'
         # Testing Unicode formatting strings...
-        self.assertEqual("%s, %s" % (Str.ABC, Str.ABC),
-                         'Str.ABC, Str.ABC')
-        self.assertEqual("%s, %s, %d, %i, %u, %f, %5.2f" %
+        self.assertEqual(("%s, %s" % (Str.ABC, Str.ABC)).replace("Str.", ""),
+                         'ABC, ABC')
+        self.assertEqual(("%s, %s, %d, %i, %u, %f, %5.2f" %
                         (Str.ABC, Str.ABC,
                          Int.IDES, Int.IDES, Int.IDES,
-                         Float.PI, Float.PI),
-                         'Str.ABC, Str.ABC, 15, 15, 15, 3.141593,  3.14')
+                         Float.PI, Float.PI)).replace("Str.", ""),
+                         'ABC, ABC, 15, 15, 15, 3.141593,  3.14')
 
         # formatting jobs delegated from the string implementation:
-        self.assertEqual('...%(foo)s...' % {'foo':Str.ABC},
-                         '...Str.ABC...')
-        self.assertEqual('...%(foo)s...' % {'foo':Int.IDES},
-                         '...Int.IDES...')
+        self.assertEqual(('...%(foo)s...' % {'foo':Str.ABC}).replace("Str.", 
""),
+                         '...ABC...')
+        self.assertEqual(('...%(foo)s...' % {'foo':Int.IDES}).replace("Int.", 
""),
+                         '...IDES...')
         self.assertEqual('...%(foo)i...' % {'foo':Int.IDES},
                          '...15...')
         self.assertEqual('...%(foo)d...' % {'foo':Int.IDES},

Reply via email to