Use serialization hooks from pytest 4.4
This commit is contained in:
@@ -104,7 +104,9 @@ class WorkerInteractor(object):
|
||||
self.sendevent("logfinish", nodeid=nodeid, location=location)
|
||||
|
||||
def pytest_runtest_logreport(self, report):
|
||||
data = serialize_report(report)
|
||||
data = self.config.hook.pytest_report_to_serializable(
|
||||
config=self.config, report=report
|
||||
)
|
||||
data["item_index"] = self.item_index
|
||||
data["worker_id"] = self.workerid
|
||||
assert self.session.items[self.item_index].nodeid == report.nodeid
|
||||
@@ -113,7 +115,9 @@ class WorkerInteractor(object):
|
||||
def pytest_collectreport(self, report):
|
||||
# send only reports that have not passed to master as optimization (#330)
|
||||
if not report.passed:
|
||||
data = serialize_report(report)
|
||||
data = self.config.hook.pytest_report_to_serializable(
|
||||
config=self.config, report=report
|
||||
)
|
||||
self.sendevent("collectreport", data=data)
|
||||
|
||||
# the pytest_logwarning hook was deprecated since pytest 4.0
|
||||
@@ -143,47 +147,6 @@ class WorkerInteractor(object):
|
||||
)
|
||||
|
||||
|
||||
def serialize_report(rep):
|
||||
def disassembled_report(rep):
|
||||
reprtraceback = rep.longrepr.reprtraceback.__dict__.copy()
|
||||
reprcrash = rep.longrepr.reprcrash.__dict__.copy()
|
||||
|
||||
new_entries = []
|
||||
for entry in reprtraceback["reprentries"]:
|
||||
entry_data = {"type": type(entry).__name__, "data": entry.__dict__.copy()}
|
||||
for key, value in entry_data["data"].items():
|
||||
if hasattr(value, "__dict__"):
|
||||
entry_data["data"][key] = value.__dict__.copy()
|
||||
new_entries.append(entry_data)
|
||||
|
||||
reprtraceback["reprentries"] = new_entries
|
||||
|
||||
return {
|
||||
"reprcrash": reprcrash,
|
||||
"reprtraceback": reprtraceback,
|
||||
"sections": rep.longrepr.sections,
|
||||
}
|
||||
|
||||
import py
|
||||
|
||||
d = rep.__dict__.copy()
|
||||
if hasattr(rep.longrepr, "toterminal"):
|
||||
if hasattr(rep.longrepr, "reprtraceback") and hasattr(
|
||||
rep.longrepr, "reprcrash"
|
||||
):
|
||||
d["longrepr"] = disassembled_report(rep)
|
||||
else:
|
||||
d["longrepr"] = str(rep.longrepr)
|
||||
else:
|
||||
d["longrepr"] = rep.longrepr
|
||||
for name in d:
|
||||
if isinstance(d[name], py.path.local):
|
||||
d[name] = str(d[name])
|
||||
elif name == "result":
|
||||
d[name] = None # for now
|
||||
return d
|
||||
|
||||
|
||||
def serialize_warning_message(warning_message):
|
||||
if isinstance(warning_message.message, Warning):
|
||||
message_module = type(warning_message.message).__module__
|
||||
|
||||
@@ -10,8 +10,6 @@ import execnet
|
||||
|
||||
import xdist.remote
|
||||
|
||||
from _pytest import runner # XXX load dynamically
|
||||
|
||||
|
||||
def parse_spec_config(config):
|
||||
xspeclist = []
|
||||
@@ -322,7 +320,9 @@ class WorkerController(object):
|
||||
self.notify_inproc(eventname, node=self, **kwargs)
|
||||
elif eventname in ("testreport", "collectreport", "teardownreport"):
|
||||
item_index = kwargs.pop("item_index", None)
|
||||
rep = unserialize_report(eventname, kwargs["data"])
|
||||
rep = self.config.hook.pytest_report_from_serializable(
|
||||
config=self.config, data=kwargs["data"]
|
||||
)
|
||||
if item_index is not None:
|
||||
rep.item_index = item_index
|
||||
self.notify_inproc(eventname, node=self, rep=rep)
|
||||
@@ -367,73 +367,6 @@ class WorkerController(object):
|
||||
self.notify_inproc("errordown", node=self, error=excinfo)
|
||||
|
||||
|
||||
def unserialize_report(name, reportdict):
|
||||
def assembled_report(reportdict):
|
||||
from _pytest._code.code import (
|
||||
ReprEntry,
|
||||
ReprEntryNative,
|
||||
ReprExceptionInfo,
|
||||
ReprFileLocation,
|
||||
ReprFuncArgs,
|
||||
ReprLocals,
|
||||
ReprTraceback,
|
||||
)
|
||||
|
||||
if reportdict["longrepr"]:
|
||||
if (
|
||||
"reprcrash" in reportdict["longrepr"]
|
||||
and "reprtraceback" in reportdict["longrepr"]
|
||||
):
|
||||
|
||||
reprtraceback = reportdict["longrepr"]["reprtraceback"]
|
||||
reprcrash = reportdict["longrepr"]["reprcrash"]
|
||||
|
||||
unserialized_entries = []
|
||||
reprentry = None
|
||||
for entry_data in reprtraceback["reprentries"]:
|
||||
data = entry_data["data"]
|
||||
entry_type = entry_data["type"]
|
||||
if entry_type == "ReprEntry":
|
||||
reprfuncargs = None
|
||||
reprfileloc = None
|
||||
reprlocals = None
|
||||
if data["reprfuncargs"]:
|
||||
reprfuncargs = ReprFuncArgs(**data["reprfuncargs"])
|
||||
if data["reprfileloc"]:
|
||||
reprfileloc = ReprFileLocation(**data["reprfileloc"])
|
||||
if data["reprlocals"]:
|
||||
reprlocals = ReprLocals(data["reprlocals"]["lines"])
|
||||
|
||||
reprentry = ReprEntry(
|
||||
lines=data["lines"],
|
||||
reprfuncargs=reprfuncargs,
|
||||
reprlocals=reprlocals,
|
||||
filelocrepr=reprfileloc,
|
||||
style=data["style"],
|
||||
)
|
||||
elif entry_type == "ReprEntryNative":
|
||||
reprentry = ReprEntryNative(data["lines"])
|
||||
else:
|
||||
report_unserialization_failure(entry_type, name, reportdict)
|
||||
unserialized_entries.append(reprentry)
|
||||
reprtraceback["reprentries"] = unserialized_entries
|
||||
|
||||
exception_info = ReprExceptionInfo(
|
||||
reprtraceback=ReprTraceback(**reprtraceback),
|
||||
reprcrash=ReprFileLocation(**reprcrash),
|
||||
)
|
||||
|
||||
for section in reportdict["longrepr"]["sections"]:
|
||||
exception_info.addsection(*section)
|
||||
reportdict["longrepr"] = exception_info
|
||||
return reportdict
|
||||
|
||||
if name == "testreport":
|
||||
return runner.TestReport(**assembled_report(reportdict))
|
||||
elif name == "collectreport":
|
||||
return runner.CollectReport(**assembled_report(reportdict))
|
||||
|
||||
|
||||
def unserialize_warning_message(data):
|
||||
import warnings
|
||||
import importlib
|
||||
@@ -474,17 +407,3 @@ def unserialize_warning_message(data):
|
||||
kwargs[attr_name] = data[attr_name]
|
||||
|
||||
return warnings.WarningMessage(**kwargs)
|
||||
|
||||
|
||||
def report_unserialization_failure(type_name, report_name, reportdict):
|
||||
from pprint import pprint
|
||||
|
||||
url = "https://github.com/pytest-dev/pytest-xdist/issues"
|
||||
stream = py.io.TextIO()
|
||||
pprint("-" * 100, stream=stream)
|
||||
pprint("INTERNALERROR: Unknown entry type returned: %s" % type_name, stream=stream)
|
||||
pprint("report_name: %s" % report_name, stream=stream)
|
||||
pprint(reportdict, stream=stream)
|
||||
pprint("Please report this bug at %s" % url, stream=stream)
|
||||
pprint("-" * 100, stream=stream)
|
||||
assert 0, stream.getvalue()
|
||||
|
||||
Reference in New Issue
Block a user