[pypy-svn] pypy pytest2: copy latest pytest release candidate
hpk42
commits-noreply at bitbucket.org
Tue Mar 8 09:53:31 CET 2011
Author: holger krekel <holger at merlinux.eu>
Branch: pytest2
Changeset: r42469:86986162c61b
Date: 2011-03-08 09:51 +0100
http://bitbucket.org/pypy/pypy/changeset/86986162c61b/
Log: copy latest pytest release candidate
diff --git a/_pytest/helpconfig.py b/_pytest/helpconfig.py
--- a/_pytest/helpconfig.py
+++ b/_pytest/helpconfig.py
@@ -2,6 +2,7 @@
import py
import pytest
import inspect, sys
+from _pytest.core import varnames
def pytest_addoption(parser):
group = parser.getgroup('debugconfig')
@@ -135,12 +136,11 @@
fail = True
else:
#print "checking", method
- method_args = getargs(method)
- #print "method_args", method_args
+ method_args = list(varnames(method))
if '__multicall__' in method_args:
method_args.remove('__multicall__')
hook = hooks[name]
- hookargs = getargs(hook)
+ hookargs = varnames(hook)
for arg in method_args:
if arg not in hookargs:
Print("argument %r not available" %(arg, ))
@@ -162,11 +162,6 @@
return name == "pytest_plugins" or \
name.startswith("pytest_funcarg__")
-def getargs(func):
- args = inspect.getargs(py.code.getrawcode(func))[0]
- startindex = inspect.ismethod(func) and 1 or 0
- return args[startindex:]
-
def collectattr(obj):
methods = {}
for apiname in dir(obj):
diff --git a/_pytest/pdb.py b/_pytest/pdb.py
--- a/_pytest/pdb.py
+++ b/_pytest/pdb.py
@@ -52,7 +52,10 @@
if "xfail" in rep.keywords:
return rep
# we assume that the above execute() suspended capturing
- tw = py.io.TerminalWriter()
+ # XXX we re-use the TerminalReporter's terminalwriter
+ # because this seems to avoid some encoding related troubles
+ # for not completely clear reasons.
+ tw = item.config.pluginmanager.getplugin("terminalreporter")._tw
tw.line()
tw.sep(">", "traceback")
rep.toterminal(tw)
diff --git a/_pytest/core.py b/_pytest/core.py
--- a/_pytest/core.py
+++ b/_pytest/core.py
@@ -60,6 +60,7 @@
class PluginManager(object):
def __init__(self, load=False):
self._name2plugin = {}
+ self._listattrcache = {}
self._plugins = []
self._hints = []
self.trace = TagTracer().get("pluginmanage")
@@ -272,6 +273,11 @@
def listattr(self, attrname, plugins=None):
if plugins is None:
plugins = self._plugins
+ key = (attrname,) + tuple(plugins)
+ try:
+ return list(self._listattrcache[key])
+ except KeyError:
+ pass
l = []
last = []
for plugin in plugins:
@@ -286,6 +292,7 @@
except AttributeError:
continue
l.extend(last)
+ self._listattrcache[key] = list(l)
return l
def call_plugin(self, plugin, methname, kwargs):
@@ -340,14 +347,20 @@
return kwargs
def varnames(func):
+ try:
+ return func._varnames
+ except AttributeError:
+ pass
if not inspect.isfunction(func) and not inspect.ismethod(func):
func = getattr(func, '__call__', func)
ismethod = inspect.ismethod(func)
rawcode = py.code.getrawcode(func)
try:
- return rawcode.co_varnames[ismethod:rawcode.co_argcount]
+ x = rawcode.co_varnames[ismethod:rawcode.co_argcount]
except AttributeError:
- return ()
+ x = ()
+ py.builtin._getfuncdict(func)['_varnames'] = x
+ return x
class HookRelay:
def __init__(self, hookspecs, pm, prefix="pytest_"):
diff --git a/_pytest/main.py b/_pytest/main.py
--- a/_pytest/main.py
+++ b/_pytest/main.py
@@ -326,7 +326,13 @@
return self._location
except AttributeError:
location = self.reportinfo()
- fspath = self.session.fspath.bestrelpath(location[0])
+ # bestrelpath is a quite slow function
+ cache = self.config.__dict__.setdefault("_bestrelpathcache", {})
+ try:
+ fspath = cache[location[0]]
+ except KeyError:
+ fspath = self.session.fspath.bestrelpath(location[0])
+ cache[location[0]] = fspath
location = (fspath, location[1], str(location[2]))
self._location = location
return location
More information about the Pypy-commit
mailing list