[svn r63051] be very careful when we cannot unpickle an
colitem because its parent can't collect the same way as on the sending side. (due to platform skips etc.) --HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									f013f0a54b
								
							
						
					
					
						commit
						5f25395cdd
					
				|  | @ -20,6 +20,7 @@ The is a schematic example of a tree of collectors and test items:: | |||
| """  | ||||
| import py | ||||
| from py.__.misc.warn import APIWARN | ||||
| from py.__.test.outcome import Skipped | ||||
| 
 | ||||
| def configproperty(name): | ||||
|     def fget(self): | ||||
|  | @ -81,11 +82,24 @@ class Node(object): | |||
|     def __getstate__(self): | ||||
|         return (self.name, self.parent) | ||||
|     def __setstate__(self, (name, parent)): | ||||
|         newnode = parent.join(name) | ||||
|         if newnode is None: | ||||
|             raise AssertionError(self, name, parent, parent.__dict__) | ||||
|         self.__dict__.update(newnode.__dict__) | ||||
|         #self.__init__(name=name, parent=parent) | ||||
|         try: | ||||
|             colitems = parent._memocollect() | ||||
|         except KeyboardInterrupt: | ||||
|             raise | ||||
|         except Exception: | ||||
|             # seems our parent can't collect us  | ||||
|             # so let's be somewhat operable  | ||||
|             self.name = name  | ||||
|             self.parent = parent  | ||||
|             self.config = parent.config | ||||
|             self._obj = "could not unpickle"  | ||||
|         else: | ||||
|             for colitem in colitems: | ||||
|                 if colitem.name == name: | ||||
|                     # we are a copy that will not be returned | ||||
|                     # by our parent  | ||||
|                     self.__dict__ = colitem.__dict__ | ||||
|                     break | ||||
| 
 | ||||
|     def __repr__(self):  | ||||
|         if getattr(self.config.option, 'debug', False): | ||||
|  | @ -368,11 +382,6 @@ class Collector(Node): | |||
|         warnoldcollect() | ||||
|         return self.collect_by_name(name) | ||||
| 
 | ||||
|     def multijoin(self, namelist):  | ||||
|         """ DEPRECATED: return a list of child items matching the given namelist. """  | ||||
|         warnoldcollect() | ||||
|         return [self.join(name) for name in namelist] | ||||
| 
 | ||||
| class FSCollector(Collector):  | ||||
|     def __init__(self, fspath, parent=None, config=None):  | ||||
|         fspath = py.path.local(fspath)  | ||||
|  |  | |||
|  | @ -70,7 +70,15 @@ class ItemTestReport(BaseReport): | |||
| 
 | ||||
|     def __init__(self, colitem, excinfo=None, when=None, outerr=None): | ||||
|         self.colitem = colitem  | ||||
|         self.keywords = colitem and colitem.readkeywords() | ||||
|         if colitem and when != "setup": | ||||
|             self.keywords = colitem.readkeywords()  | ||||
|         else: | ||||
|             # if we fail during setup it might mean  | ||||
|             # we are not able to access the underlying object | ||||
|             # this might e.g. happen if we are unpickled  | ||||
|             # and our parent collector did not collect us  | ||||
|             # (because it e.g. skipped for platform reasons) | ||||
|             self.keywords = {}   | ||||
|         if not excinfo: | ||||
|             self.passed = True | ||||
|             self.shortrepr = "."  | ||||
|  |  | |||
|  | @ -234,10 +234,12 @@ class TmpTestdir: | |||
|         bindir = py.path.local(py.__file__).dirpath("bin") | ||||
|         if py.std.sys.platform == "win32": | ||||
|             script = bindir.join("win32", scriptname + ".cmd") | ||||
|             assert script.check() | ||||
|             return self.run(script, *args) | ||||
|         else: | ||||
|             script = bindir.join(scriptname) | ||||
|         assert script.check() | ||||
|         return self.run(py.std.sys.executable, script, *args) | ||||
|             assert script.check() | ||||
|             return self.run(py.std.sys.executable, script, *args) | ||||
| 
 | ||||
|     def runpytest(self, *args): | ||||
|         p = py.path.local.make_numbered_dir(prefix="runpytest-",  | ||||
|  |  | |||
|  | @ -265,7 +265,7 @@ class FunctionMixin(PyobjMixin): | |||
|             teardown_func_or_meth(self.obj)  | ||||
| 
 | ||||
|     def _prunetraceback(self, traceback): | ||||
|         if not self.config.option.fulltrace:  | ||||
|         if hasattr(self, '_obj') and not self.config.option.fulltrace:  | ||||
|             code = py.code.Code(self.obj)  | ||||
|             path, firstlineno = code.path, code.firstlineno  | ||||
|             ntraceback = traceback.cut(path=path, firstlineno=firstlineno) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue