Mailinglist Archive: opensuse-commit (1903 mails)

< Previous Next >
commit python-Cython for openSUSE:Factory
Hello community,

here is the log from the commit of package python-Cython for openSUSE:Factory
checked in at 2019-04-18 09:55:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-Cython (Old)
and /work/SRC/openSUSE:Factory/.python-Cython.new.17052 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-Cython"

Thu Apr 18 09:55:35 2019 rev:48 rq:694800 version:0.29.7

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-Cython/python-Cython-doc.changes
2019-04-04 12:05:56.585438669 +0200
+++
/work/SRC/openSUSE:Factory/.python-Cython.new.17052/python-Cython-doc.changes
2019-04-18 09:55:36.769310649 +0200
@@ -1,0 +2,12 @@
+Tue Apr 16 09:26:50 UTC 2019 - Ondřej Súkup <mimi.vx@xxxxxxxxx>
+
+- update to 0.29.7
+ * Crash when the shared Cython config module gets unloaded and another
+ Cython module reports an exceptions. Cython now makes sure it keeps
+ an owned reference to the module
+ * Resolved a C89 compilation problem when enabling the fast-gil sharing
feature.
+ * Coverage reporting did not include the signature line of cdef functions
+ * Casting a GIL-requiring function into a nogil function now issues a warning
+ * Generators and coroutines were missing their return type annotation
+
+-------------------------------------------------------------------
python-Cython.changes: same change

Old:
----
Cython-0.29.6.tar.gz

New:
----
Cython-0.29.7.tar.gz

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

Other differences:
------------------
++++++ python-Cython-doc.spec ++++++
--- /var/tmp/diff_new_pack.IZ98LN/_old 2019-04-18 09:55:37.465311087 +0200
+++ /var/tmp/diff_new_pack.IZ98LN/_new 2019-04-18 09:55:37.469311089 +0200
@@ -20,7 +20,7 @@
# Tests currently fail randomly in OBS multiple local rund do not trigger them
%bcond_with test
Name: python-Cython-doc
-Version: 0.29.6
+Version: 0.29.7
Release: 0
Summary: The Cython compiler for writing C extensions for the Python
language
License: Apache-2.0

++++++ python-Cython.spec ++++++
--- /var/tmp/diff_new_pack.IZ98LN/_old 2019-04-18 09:55:37.505311112 +0200
+++ /var/tmp/diff_new_pack.IZ98LN/_new 2019-04-18 09:55:37.513311117 +0200
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define oldpython python
Name: python-Cython
-Version: 0.29.6
+Version: 0.29.7
Release: 0
Summary: The Cython compiler for writing C extensions for the Python
language
License: Apache-2.0

++++++ Cython-0.29.6.tar.gz -> Cython-0.29.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/.gitrev new/Cython-0.29.7/.gitrev
--- old/Cython-0.29.6/.gitrev 2019-02-27 13:29:00.000000000 +0100
+++ new/Cython-0.29.7/.gitrev 2019-04-14 12:01:43.000000000 +0200
@@ -1 +1 @@
-060e9090e4617a82ebbf7603f58747aa3519931c
+3b3bcbfc3f28259e75e363b3d872e82b35d47f19
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/CHANGES.rst
new/Cython-0.29.7/CHANGES.rst
--- old/Cython-0.29.6/CHANGES.rst 2019-02-27 13:23:19.000000000 +0100
+++ new/Cython-0.29.7/CHANGES.rst 2019-04-14 12:00:58.000000000 +0200
@@ -2,6 +2,29 @@
Cython Changelog
================

+0.29.7 (2019-04-14)
+===================
+
+Bugs fixed
+----------
+
+* Crash when the shared Cython config module gets unloaded and another Cython
+ module reports an exceptions. Cython now makes sure it keeps an owned
reference
+ to the module.
+ (Github issue #2885)
+
+* Resolved a C89 compilation problem when enabling the fast-gil sharing
feature.
+
+* Coverage reporting did not include the signature line of ``cdef`` functions.
+ (Github issue #1461)
+
+* Casting a GIL-requiring function into a nogil function now issues a warning.
+ (Github issue #2879)
+
+* Generators and coroutines were missing their return type annotation.
+ (Github issue #2884)
+
+
0.29.6 (2019-02-27)
===================

diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Compiler/ExprNodes.py
new/Cython-0.29.7/Cython/Compiler/ExprNodes.py
--- old/Cython-0.29.6/Cython/Compiler/ExprNodes.py 2019-02-27
13:23:19.000000000 +0100
+++ new/Cython-0.29.7/Cython/Compiler/ExprNodes.py 2019-04-14
12:00:58.000000000 +0200
@@ -10426,7 +10426,8 @@
error(self.pos, "Python objects cannot be cast from
pointers of primitive types")
else:
# Should this be an error?
- warning(self.pos, "No conversion from %s to %s, python
object pointer used." % (self.operand.type, self.type))
+ warning(self.pos, "No conversion from %s to %s, python
object pointer used." % (
+ self.operand.type, self.type))
self.operand = self.operand.coerce_to_simple(env)
elif from_py and not to_py:
if self.type.create_from_py_utility_code(env):
@@ -10435,7 +10436,8 @@
if not (self.type.base_type.is_void or
self.type.base_type.is_struct):
error(self.pos, "Python objects cannot be cast to pointers
of primitive types")
else:
- warning(self.pos, "No conversion from %s to %s, python object
pointer used." % (self.type, self.operand.type))
+ warning(self.pos, "No conversion from %s to %s, python object
pointer used." % (
+ self.type, self.operand.type))
elif from_py and to_py:
if self.typecheck:
self.operand = PyTypeTestNode(self.operand, self.type, env,
notnone=True)
@@ -10447,6 +10449,13 @@
elif self.operand.type.is_fused:
self.operand = self.operand.coerce_to(self.type, env)
#self.type = self.operand.type
+ if self.type.is_ptr and self.type.base_type.is_cfunction and
self.type.base_type.nogil:
+ op_type = self.operand.type
+ if op_type.is_ptr:
+ op_type = op_type.base_type
+ if op_type.is_cfunction and not op_type.nogil:
+ warning(self.pos,
+ "Casting a GIL-requiring function into a nogil
function circumvents GIL validation", 1)
return self

def is_simple(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Compiler/FlowControl.pxd
new/Cython-0.29.7/Cython/Compiler/FlowControl.pxd
--- old/Cython-0.29.6/Cython/Compiler/FlowControl.pxd 2015-09-10
18:25:36.000000000 +0200
+++ new/Cython-0.29.7/Cython/Compiler/FlowControl.pxd 2019-04-14
12:00:58.000000000 +0200
@@ -11,10 +11,8 @@
cdef public list stats
cdef public dict gen
cdef public set bounded
- cdef public dict input
- cdef public dict output

- # Big integer it bitsets
+ # Big integer bitsets
cdef public object i_input
cdef public object i_output
cdef public object i_gen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Compiler/ModuleNode.py
new/Cython-0.29.7/Cython/Compiler/ModuleNode.py
--- old/Cython-0.29.6/Cython/Compiler/ModuleNode.py 2019-02-27
13:23:19.000000000 +0100
+++ new/Cython-0.29.7/Cython/Compiler/ModuleNode.py 2019-04-14
12:00:58.000000000 +0200
@@ -2704,11 +2704,11 @@
# if entry.type.is_pyobject and entry.used:
# code.putln("Py_DECREF(%s); %s = 0;" % (
# code.entry_as_pyobject(entry), entry.cname))
- code.putln('#if CYTHON_COMPILING_IN_PYPY')
- code.putln('Py_CLEAR(%s);' % Naming.builtins_cname)
- code.putln('#endif')
- code.put_decref_clear(env.module_dict_cname, py_object_type,
- nanny=False, clear_before_decref=True)
+ if Options.pre_import is not None:
+ code.put_decref_clear(Naming.preimport_cname, py_object_type,
+ nanny=False, clear_before_decref=True)
+ for cname in [env.module_dict_cname, Naming.cython_runtime_cname,
Naming.builtins_cname]:
+ code.put_decref_clear(cname, py_object_type, nanny=False,
clear_before_decref=True)

def generate_main_method(self, env, code):
module_is_main = "%s%s" % (Naming.module_is_main,
self.full_module_name.replace('.', '__'))
@@ -2815,13 +2815,12 @@
'%s = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); %s' % (
Naming.builtins_cname,
code.error_goto_if_null(Naming.builtins_cname, self.pos)))
+ code.put_incref(Naming.builtins_cname, py_object_type, nanny=False)
code.putln(
'%s = PyImport_AddModule((char *) "cython_runtime"); %s' % (
Naming.cython_runtime_cname,
code.error_goto_if_null(Naming.cython_runtime_cname,
self.pos)))
- code.putln('#if CYTHON_COMPILING_IN_PYPY')
- code.putln('Py_INCREF(%s);' % Naming.builtins_cname)
- code.putln('#endif')
+ code.put_incref(Naming.cython_runtime_cname, py_object_type,
nanny=False)
code.putln(
'if (PyObject_SetAttrString(%s, "__builtins__", %s) < 0) %s;' % (
env.module_cname,
@@ -2833,6 +2832,7 @@
Naming.preimport_cname,
Options.pre_import,
code.error_goto_if_null(Naming.preimport_cname, self.pos)))
+ code.put_incref(Naming.preimport_cname, py_object_type,
nanny=False)

def generate_global_init_code(self, env, code):
# Generate code to initialise global PyObject *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Compiler/Nodes.py
new/Cython-0.29.7/Cython/Compiler/Nodes.py
--- old/Cython-0.29.6/Cython/Compiler/Nodes.py 2019-02-27 13:23:19.000000000
+0100
+++ new/Cython-0.29.7/Cython/Compiler/Nodes.py 2019-04-14 12:00:58.000000000
+0200
@@ -2653,6 +2653,9 @@
self.generate_arg_none_check(arg, code)

def generate_execution_code(self, code):
+ if code.globalstate.directives['linetrace']:
+ code.mark_pos(self.pos)
+ code.putln("") # generate line tracing code
super(CFuncDefNode, self).generate_execution_code(code)
if self.py_func_stat:
self.py_func_stat.generate_execution_code(code)
@@ -7536,12 +7539,14 @@

code.funcstate.in_try_finally = was_in_try_finally
code.putln("}")
- code.set_all_labels(old_labels)

temps_to_clean_up = code.funcstate.all_free_managed_temps()
code.mark_pos(self.finally_clause.pos)
code.putln("/*finally:*/ {")

+ # Reset labels only after writing out a potential line trace call for
correct nogil error handling.
+ code.set_all_labels(old_labels)
+
def fresh_finally_clause(_next=[self.finally_clause]):
# generate the original subtree once and always keep a fresh copy
node = _next[0]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Compiler/ParseTreeTransforms.py
new/Cython-0.29.7/Cython/Compiler/ParseTreeTransforms.py
--- old/Cython-0.29.6/Cython/Compiler/ParseTreeTransforms.py 2018-11-24
10:20:06.000000000 +0100
+++ new/Cython-0.29.7/Cython/Compiler/ParseTreeTransforms.py 2019-04-14
12:00:58.000000000 +0200
@@ -2624,7 +2624,8 @@
pos=node.pos, name=node.name, args=node.args,
star_arg=node.star_arg, starstar_arg=node.starstar_arg,
doc=node.doc, decorators=node.decorators,
- gbody=gbody, lambda_name=node.lambda_name)
+ gbody=gbody, lambda_name=node.lambda_name,
+ return_type_annotation=node.return_type_annotation)
return coroutine

def visit_CFuncDefNode(self, node):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Coverage.py
new/Cython-0.29.7/Cython/Coverage.py
--- old/Cython-0.29.6/Cython/Coverage.py 2019-01-19 10:25:16.000000000
+0100
+++ new/Cython-0.29.7/Cython/Coverage.py 2019-04-14 12:00:58.000000000
+0200
@@ -82,7 +82,7 @@
# is not from the main .pyx file but a file with a different
# name than the .c file (which prevents us from finding the
# .c file)
- _, code = self._parse_lines(c_file, filename)
+ _, code = self._read_source_lines(c_file, filename)
if code is None:
return None # no source found

@@ -104,7 +104,7 @@
c_file, _ = self._find_source_files(filename)
if not c_file:
return None # unknown file
- rel_file_path, code = self._parse_lines(c_file, filename)
+ rel_file_path, code = self._read_source_lines(c_file, filename)
if code is None:
return None # no source found
return CythonModuleReporter(c_file, filename, rel_file_path, code)
@@ -170,14 +170,14 @@
for filename in os.listdir(dir_path):
ext = splitext(filename)[1].lower()
if ext in C_FILE_EXTENSIONS:
- self._parse_lines(os.path.join(dir_path, filename),
source_file)
+ self._read_source_lines(os.path.join(dir_path, filename),
source_file)
if source_file in self._c_files_map:
return
# not found? then try one package up
if is_package_dir(dir_path):
self._find_c_source_files(os.path.dirname(dir_path), source_file)

- def _parse_lines(self, c_file, sourcefile):
+ def _read_source_lines(self, c_file, sourcefile):
"""
Parse a Cython generated C/C++ source file and find the executable
lines.
Each executable line starts with a comment header that states source
file
@@ -188,39 +188,7 @@
if c_file in self._parsed_c_files:
code_lines = self._parsed_c_files[c_file]
else:
- match_source_path_line = re.compile(r' */[*]
+"(.*)":([0-9]+)$').match
- match_current_code_line = re.compile(r' *[*] (.*) #
<<<<<<+$').match
- match_comment_end = re.compile(r' *[*]/$').match
- not_executable = re.compile(
- r'\s*c(?:type)?def\s+'
- r'(?:(?:public|external)\s+)?'
- r'(?:struct|union|enum|class)'
- r'(\s+[^:]+|)\s*:'
- ).match
-
- code_lines = defaultdict(dict)
- filenames = set()
- with open(c_file) as lines:
- lines = iter(lines)
- for line in lines:
- match = match_source_path_line(line)
- if not match:
- continue
- filename, lineno = match.groups()
- filenames.add(filename)
- lineno = int(lineno)
- for comment_line in lines:
- match = match_current_code_line(comment_line)
- if match:
- code_line = match.group(1).rstrip()
- if not_executable(code_line):
- break
- code_lines[filename][lineno] = code_line
- break
- elif match_comment_end(comment_line):
- # unexpected comment format - false positive?
- break
-
+ code_lines = self._parse_cfile_lines(c_file)
self._parsed_c_files[c_file] = code_lines

if self._c_files_map is None:
@@ -234,6 +202,57 @@
return (None,) * 2 # e.g. shared library file
return self._c_files_map[sourcefile][1:]

+ def _parse_cfile_lines(self, c_file):
+ """
+ Parse a C file and extract all source file lines that generated
executable code.
+ """
+ match_source_path_line = re.compile(r' */[*] +"(.*)":([0-9]+)$').match
+ match_current_code_line = re.compile(r' *[*] (.*) # <<<<<<+$').match
+ match_comment_end = re.compile(r' *[*]/$').match
+ match_trace_line = re.compile(r' *__Pyx_TraceLine\(([0-9]+),').match
+ not_executable = re.compile(
+ r'\s*c(?:type)?def\s+'
+ r'(?:(?:public|external)\s+)?'
+ r'(?:struct|union|enum|class)'
+ r'(\s+[^:]+|)\s*:'
+ ).match
+
+ code_lines = defaultdict(dict)
+ executable_lines = defaultdict(set)
+ current_filename = None
+
+ with open(c_file) as lines:
+ lines = iter(lines)
+ for line in lines:
+ match = match_source_path_line(line)
+ if not match:
+ if '__Pyx_TraceLine(' in line and current_filename is not
None:
+ trace_line = match_trace_line(line)
+ if trace_line:
+
executable_lines[current_filename].add(int(trace_line.group(1)))
+ continue
+ filename, lineno = match.groups()
+ current_filename = filename
+ lineno = int(lineno)
+ for comment_line in lines:
+ match = match_current_code_line(comment_line)
+ if match:
+ code_line = match.group(1).rstrip()
+ if not_executable(code_line):
+ break
+ code_lines[filename][lineno] = code_line
+ break
+ elif match_comment_end(comment_line):
+ # unexpected comment format - false positive?
+ break
+
+ # Remove lines that generated code but are not traceable.
+ for filename, lines in code_lines.items():
+ dead_lines = set(lines).difference(executable_lines.get(filename,
()))
+ for lineno in dead_lines:
+ del lines[lineno]
+ return code_lines
+

class CythonModuleTracer(FileTracer):
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Shadow.py
new/Cython-0.29.7/Cython/Shadow.py
--- old/Cython-0.29.6/Cython/Shadow.py 2019-02-27 13:23:19.000000000 +0100
+++ new/Cython-0.29.7/Cython/Shadow.py 2019-04-14 12:00:58.000000000 +0200
@@ -1,7 +1,7 @@
# cython.* namespace for pure mode.
from __future__ import absolute_import

-__version__ = "0.29.6"
+__version__ = "0.29.7"

try:
from __builtin__ import basestring
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/Cython/Utility/ModuleSetupCode.c
new/Cython-0.29.7/Cython/Utility/ModuleSetupCode.c
--- old/Cython-0.29.6/Cython/Utility/ModuleSetupCode.c 2019-02-08
20:14:39.000000000 +0100
+++ new/Cython-0.29.7/Cython/Utility/ModuleSetupCode.c 2019-04-14
12:00:58.000000000 +0200
@@ -1410,8 +1410,9 @@

static PyGILState_STATE __Pyx_FastGil_PyGILState_Ensure(void) {
int current;
+ PyThreadState *tcur;
__Pyx_FastGIL_Remember0();
- PyThreadState *tcur = __Pyx_FastGil_get_tcur();
+ tcur = __Pyx_FastGil_get_tcur();
if (tcur == NULL) {
// Uninitialized, need to initialize now.
return PyGILState_Ensure();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/PKG-INFO new/Cython-0.29.7/PKG-INFO
--- old/Cython-0.29.6/PKG-INFO 2019-02-27 13:29:02.000000000 +0100
+++ new/Cython-0.29.7/PKG-INFO 2019-04-14 12:01:51.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: Cython
-Version: 0.29.6
+Version: 0.29.7
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.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/tests/errors/e_nogilfunctype.pyx
new/Cython-0.29.7/tests/errors/e_nogilfunctype.pyx
--- old/Cython-0.29.6/tests/errors/e_nogilfunctype.pyx 2018-09-22
16:18:56.000000000 +0200
+++ new/Cython-0.29.7/tests/errors/e_nogilfunctype.pyx 2019-04-14
12:00:58.000000000 +0200
@@ -1,12 +1,18 @@
# mode: error
+# tag: warnings

cdef extern from *:
- cdef void f()
- cdef void (*fp)() nogil
+ cdef void f()
+ cdef void (*fp)() nogil
+ ctypedef void (*fp_t)() nogil

fp = f
-
+fp = <fp_t>f

_ERRORS = u"""
-7:5: Cannot assign type 'void (void)' to 'void (*)(void) nogil'
+9:5: Cannot assign type 'void (void)' to 'void (*)(void) nogil'
+"""
+
+_WARNINGS = """
+10:5: Casting a GIL-requiring function into a nogil function circumvents GIL
validation
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/tests/run/coverage_nogil.srctree
new/Cython-0.29.7/tests/run/coverage_nogil.srctree
--- old/Cython-0.29.6/tests/run/coverage_nogil.srctree 2015-06-22
14:53:11.000000000 +0200
+++ new/Cython-0.29.7/tests/run/coverage_nogil.srctree 2019-04-14
12:00:58.000000000 +0200
@@ -25,19 +25,19 @@
# cython: linetrace=True
# distutils: define_macros=CYTHON_TRACE=1 CYTHON_TRACE_NOGIL=1

-cdef int func1(int a, int b) nogil:
- cdef int x # 5
- with gil: # 6
- x = 1 # 7
- cdef int c = func2(a) + b # 8
- return x + c # 9
+cdef int func1(int a, int b) nogil: # 4
+ cdef int x # 5
+ with gil: # 6
+ x = 1 # 7
+ cdef int c = func2(a) + b # 8
+ return x + c # 9


-cdef int func2(int a) with gil:
+cdef int func2(int a) with gil: # 12
return a * 2 # 13


-def call(int a, int b):
+def call(int a, int b): # 16
a, b = b, a # 17
with nogil: # 18
result = func1(b, a) # 19
@@ -56,20 +56,18 @@
from coverage import coverage


-import coverage_test_nogil
-
-assert not any(coverage_test_nogil.__file__.endswith(ext)
- for ext in '.py .pyc .pyo .pyw .pyx .pxi'.split()), \
- coverage_test_nogil.__file__
-
+def run_coverage():
+ cov = coverage()
+ cov.start()

-def run_coverage(module):
+ import coverage_test_nogil as module
module_name = module.__name__
module_path = module_name + '.pyx'
-
- cov = coverage()
- cov.start()
+ assert not any(module.__file__.endswith(ext)
+ for ext in '.py .pyc .pyo .pyw .pyx .pxi'.split()), \
+ module.__file__
assert module.call(1, 2) == (1 * 2) + 2 + 1
+
cov.stop()

out = StringIO()
@@ -84,10 +82,10 @@

executed = set(exec_lines) - set(missing_lines)
# check that everything that runs with the gil owned was executed
- assert all(line in executed for line in [13, 17, 18, 20]), '%s / %s' %
(exec_lines, missing_lines)
+ assert all(line in executed for line in [12, 13, 16, 17, 18, 20]), '%s /
%s' % (exec_lines, missing_lines)
# check that everything that runs in nogil sections was executed
- assert all(line in executed for line in [6, 7, 8, 9]), '%s / %s' %
(exec_lines, missing_lines)
+ assert all(line in executed for line in [4, 6, 7, 8, 9]), '%s / %s' %
(exec_lines, missing_lines)


if __name__ == '__main__':
- run_coverage(coverage_test_nogil)
+ run_coverage()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/tests/run/cython3.pyx
new/Cython-0.29.7/tests/run/cython3.pyx
--- old/Cython-0.29.6/tests/run/cython3.pyx 2018-11-24 10:20:06.000000000
+0100
+++ new/Cython-0.29.7/tests/run/cython3.pyx 2019-04-14 12:00:58.000000000
+0200
@@ -551,3 +551,16 @@
result : int = a + b

return result
+
+
+async def async_def_annotations(x: 'int') -> 'float':
+ """
+ >>> ret, arg = sorted(async_def_annotations.__annotations__.items())
+ >>> print(ret[0]); print(ret[1])
+ return
+ float
+ >>> print(arg[0]); print(arg[1])
+ x
+ int
+ """
+ return float(x)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Cython-0.29.6/tests/run/generators_py35.py
new/Cython-0.29.7/tests/run/generators_py35.py
--- old/Cython-0.29.6/tests/run/generators_py35.py 2018-09-22
16:18:56.000000000 +0200
+++ new/Cython-0.29.7/tests/run/generators_py35.py 2019-04-14
12:00:58.000000000 +0200
@@ -22,3 +22,19 @@
yield i
raise StopIteration
return generator
+
+
+def anno_gen(x: 'int') -> 'float':
+ """
+ >>> gen = anno_gen(2)
+ >>> next(gen)
+ 2.0
+ >>> ret, arg = sorted(anno_gen.__annotations__.items())
+ >>> print(ret[0]); print(ret[1])
+ return
+ float
+ >>> print(arg[0]); print(arg[1])
+ x
+ int
+ """
+ yield float(x)


< Previous Next >
This Thread