[Python-modules-commits] r33376 - in packages/pytest/trunk/debian (3 files)

barry at users.alioth.debian.org barry at users.alioth.debian.org
Fri Jul 17 15:37:16 UTC 2015


    Date: Friday, July 17, 2015 @ 15:37:14
  Author: barry
Revision: 33376

* Team upload.
* debian/patches/issue744-py35-compat: Upstream patch to fix Python 3.5
  compatibility by handling the change in the ast module API.

Added:
  packages/pytest/trunk/debian/patches/issue744-py35-compat
Modified:
  packages/pytest/trunk/debian/changelog
  packages/pytest/trunk/debian/patches/series

Modified: packages/pytest/trunk/debian/changelog
===================================================================
--- packages/pytest/trunk/debian/changelog	2015-07-17 03:47:19 UTC (rev 33375)
+++ packages/pytest/trunk/debian/changelog	2015-07-17 15:37:14 UTC (rev 33376)
@@ -1,3 +1,11 @@
+pytest (2.7.2-2) unstable; urgency=medium
+
+  * Team upload.
+  * debian/patches/issue744-py35-compat: Upstream patch to fix Python 3.5
+    compatibility by handling the change in the ast module API.
+
+ -- Barry Warsaw <barry at debian.org>  Fri, 17 Jul 2015 10:15:39 -0400
+
 pytest (2.7.2-1) unstable; urgency=medium
 
   * Team upload.

Added: packages/pytest/trunk/debian/patches/issue744-py35-compat
===================================================================
--- packages/pytest/trunk/debian/patches/issue744-py35-compat	                        (rev 0)
+++ packages/pytest/trunk/debian/patches/issue744-py35-compat	2015-07-17 15:37:14 UTC (rev 33376)
@@ -0,0 +1,217 @@
+Description: Fix Python 3.5 compatibility.
+Origin: https://github.com/pytest-dev/pytest/pull/801
+Bug: https://github.com/pytest-dev/pytest/issues/744
+Forwarded: not-needed
+
+--- a/_pytest/assertion/newinterpret.py
++++ b/_pytest/assertion/newinterpret.py
+@@ -33,6 +33,12 @@
+     def _is_ast_stmt(node):
+         return isinstance(node, ast.stmt)
+ 
++try:
++    _Starred = ast.Starred
++except AttributeError:
++    # Python 2. Define a dummy class so isinstance() will always be False.
++    class _Starred(object): pass
++
+ 
+ class Failure(Exception):
+     """Error found while interpreting AST."""
+@@ -232,24 +238,38 @@
+         arguments = []
+         for arg in call.args:
+             arg_explanation, arg_result = self.visit(arg)
+-            arg_name = "__exprinfo_%s" % (len(ns),)
+-            ns[arg_name] = arg_result
+-            arguments.append(arg_name)
+-            arg_explanations.append(arg_explanation)
++            if isinstance(arg, _Starred):
++                arg_name = "__exprinfo_star"
++                ns[arg_name] = arg_result
++                arguments.append("*%s" % (arg_name,))
++                arg_explanations.append("*%s" % (arg_explanation,))
++            else:
++                arg_name = "__exprinfo_%s" % (len(ns),)
++                ns[arg_name] = arg_result
++                arguments.append(arg_name)
++                arg_explanations.append(arg_explanation)
+         for keyword in call.keywords:
+             arg_explanation, arg_result = self.visit(keyword.value)
+-            arg_name = "__exprinfo_%s" % (len(ns),)
++            if keyword.arg:
++                arg_name = "__exprinfo_%s" % (len(ns),)
++                keyword_source = "%s=%%s" % (keyword.arg)
++                arguments.append(keyword_source % (arg_name,))
++                arg_explanations.append(keyword_source % (arg_explanation,))
++            else:
++                arg_name = "__exprinfo_kwds"
++                arguments.append("**%s" % (arg_name,))
++                arg_explanations.append("**%s" % (arg_explanation,))
++                
+             ns[arg_name] = arg_result
+-            keyword_source = "%s=%%s" % (keyword.arg)
+-            arguments.append(keyword_source % (arg_name,))
+-            arg_explanations.append(keyword_source % (arg_explanation,))
+-        if call.starargs:
++
++        if getattr(call, 'starargs', None):
+             arg_explanation, arg_result = self.visit(call.starargs)
+             arg_name = "__exprinfo_star"
+             ns[arg_name] = arg_result
+             arguments.append("*%s" % (arg_name,))
+             arg_explanations.append("*%s" % (arg_explanation,))
+-        if call.kwargs:
++            
++        if getattr(call, 'kwargs', None):
+             arg_explanation, arg_result = self.visit(call.kwargs)
+             arg_name = "__exprinfo_kwds"
+             ns[arg_name] = arg_result
+--- a/_pytest/assertion/rewrite.py
++++ b/_pytest/assertion/rewrite.py
+@@ -35,6 +35,12 @@
+ REWRITE_NEWLINES = sys.version_info[:2] != (2, 7) and sys.version_info < (3, 2)
+ ASCII_IS_DEFAULT_ENCODING = sys.version_info[0] < 3
+ 
++if sys.version_info >= (3,5):
++    ast_Call = ast.Call
++else:
++    ast_Call = lambda a,b,c: ast.Call(a, b, c, None, None)
++
++
+ class AssertionRewritingHook(object):
+     """PEP302 Import hook which rewrites asserts."""
+ 
+@@ -587,7 +593,7 @@
+         """Call a helper in this module."""
+         py_name = ast.Name("@pytest_ar", ast.Load())
+         attr = ast.Attribute(py_name, "_" + name, ast.Load())
+-        return ast.Call(attr, list(args), [], None, None)
++        return ast_Call(attr, list(args), [])
+ 
+     def builtin(self, name):
+         """Return the builtin called *name*."""
+@@ -677,7 +683,7 @@
+         msg = self.pop_format_context(template)
+         fmt = self.helper("format_explanation", msg)
+         err_name = ast.Name("AssertionError", ast.Load())
+-        exc = ast.Call(err_name, [fmt], [], None, None)
++        exc = ast_Call(err_name, [fmt], [])
+         if sys.version_info[0] >= 3:
+             raise_ = ast.Raise(exc, None)
+         else:
+@@ -697,7 +703,7 @@
+     def visit_Name(self, name):
+         # Display the repr of the name if it's a local variable or
+         # _should_repr_global_name() thinks it's acceptable.
+-        locs = ast.Call(self.builtin("locals"), [], [], None, None)
++        locs = ast_Call(self.builtin("locals"), [], [])
+         inlocs = ast.Compare(ast.Str(name.id), [ast.In()], [locs])
+         dorepr = self.helper("should_repr_global_name", name)
+         test = ast.BoolOp(ast.Or(), [inlocs, dorepr])
+@@ -724,7 +730,7 @@
+             res, expl = self.visit(v)
+             body.append(ast.Assign([ast.Name(res_var, ast.Store())], res))
+             expl_format = self.pop_format_context(ast.Str(expl))
+-            call = ast.Call(app, [expl_format], [], None, None)
++            call = ast_Call(app, [expl_format], [])
+             self.on_failure.append(ast.Expr(call))
+             if i < levels:
+                 cond = res
+@@ -753,7 +759,42 @@
+         res = self.assign(ast.BinOp(left_expr, binop.op, right_expr))
+         return res, explanation
+ 
+-    def visit_Call(self, call):
++    def visit_Call_35(self, call):
++        """
++        visit `ast.Call` nodes on Python3.5 and after
++        """
++        new_func, func_expl = self.visit(call.func)
++        arg_expls = []
++        new_args = []
++        new_kwargs = []
++        for arg in call.args:
++            res, expl = self.visit(arg)
++            arg_expls.append(expl)
++            new_args.append(res)
++        for keyword in call.keywords:
++            res, expl = self.visit(keyword.value)
++            new_kwargs.append(ast.keyword(keyword.arg, res))
++            if keyword.arg:
++                arg_expls.append(keyword.arg + "=" + expl)
++            else: ## **args have `arg` keywords with an .arg of None
++                arg_expls.append("**" + expl)
++
++        expl = "%s(%s)" % (func_expl, ', '.join(arg_expls))
++        new_call = ast.Call(new_func, new_args, new_kwargs)
++        res = self.assign(new_call)
++        res_expl = self.explanation_param(self.display(res))
++        outer_expl = "%s\n{%s = %s\n}" % (res_expl, res_expl, expl)
++        return res, outer_expl
++
++    def visit_Starred(self, starred):
++        # From Python 3.5, a Starred node can appear in a function call
++        res, expl = self.visit(starred.value)
++        return starred, '*' + expl
++
++    def visit_Call_legacy(self, call):
++        """
++        visit `ast.Call nodes on 3.4 and below`
++        """
+         new_func, func_expl = self.visit(call.func)
+         arg_expls = []
+         new_args = []
+@@ -781,6 +822,15 @@
+         outer_expl = "%s\n{%s = %s\n}" % (res_expl, res_expl, expl)
+         return res, outer_expl
+ 
++    # ast.Call signature changed on 3.5,
++    # conditionally change  which methods is named
++    # visit_Call depending on Python version
++    if sys.version_info >= (3, 5):
++        visit_Call = visit_Call_35
++    else:
++        visit_Call = visit_Call_legacy
++
++
+     def visit_Attribute(self, attr):
+         if not isinstance(attr.ctx, ast.Load):
+             return self.generic_visit(attr)
+--- a/_pytest/main.py
++++ b/_pytest/main.py
+@@ -502,10 +502,12 @@
+ class NoMatch(Exception):
+     """ raised if matching cannot locate a matching names. """
+ 
++class Interrupted(KeyboardInterrupt):
++    """ signals an interrupted test run. """
++    __module__ = 'builtins' # for py3
++
+ class Session(FSCollector):
+-    class Interrupted(KeyboardInterrupt):
+-        """ signals an interrupted test run. """
+-        __module__ = 'builtins' # for py3
++    Interrupted = Interrupted
+ 
+     def __init__(self, config):
+         FSCollector.__init__(self, config.rootdir, parent=None,
+--- a/tox.ini
++++ b/tox.ini
+@@ -2,7 +2,7 @@
+ minversion=2.0
+ distshare={homedir}/.tox/distshare
+ envlist=
+-     flakes,py26,py27,py33,py34,pypy,
++     flakes,py26,py27,py33,py34,py35,pypy,
+      {py27,py34}-{pexpect,xdist,trial},
+      py27-nobyte,doctesting,py27-cxfreeze
+ 
+@@ -16,6 +16,7 @@
+ commands= py.test --genscript=pytest1
+ 
+ [testenv:flakes]
++basepython = python2.7
+ deps = pytest-flakes>=0.2
+ commands = py.test --flakes -m flakes _pytest testing
+ 

Modified: packages/pytest/trunk/debian/patches/series
===================================================================
--- packages/pytest/trunk/debian/patches/series	2015-07-17 03:47:19 UTC (rev 33375)
+++ packages/pytest/trunk/debian/patches/series	2015-07-17 15:37:14 UTC (rev 33376)
@@ -1,3 +1,4 @@
 remove_google_js
 local-intersphinx
 remove-herokuapp-images
+issue744-py35-compat




More information about the Python-modules-commits mailing list