[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