| 162 | 162 | """ |
| 163 | 163 | |
| 164 | 164 | def disassembled_report(rep): |
| 165 | reprtraceback = rep.longrepr.reprtraceback.__dict__.copy() | |
| 166 | reprcrash = rep.longrepr.reprcrash.__dict__.copy() | |
| 167 | ||
| 168 | new_entries = [] | |
| 169 | for entry in reprtraceback["reprentries"]: | |
| 170 | entry_data = { | |
| 171 | "type": type(entry).__name__, | |
| 172 | "data": entry.__dict__.copy(), | |
| 165 | # Check if this is an ExceptionChainRepr | |
| 166 | if hasattr(rep.longrepr, "chain"): | |
| 167 | # Handle chained exceptions | |
| 168 | chain_data = [] | |
| 169 | for element in rep.longrepr.chain: | |
| 170 | element_reprtraceback = element[0].__dict__.copy() | |
| 171 | element_reprcrash = element[1].__dict__.copy() if element[1] else None | |
| 172 | element_descr = element[2] | |
| 173 | ||
| 174 | # Serialize reprentries for this element | |
| 175 | if "reprentries" in element_reprtraceback: | |
| 176 | new_entries = [] | |
| 177 | for entry in element_reprtraceback["reprentries"]: | |
| 178 | entry_data = { | |
| 179 | "type": type(entry).__name__, | |
| 180 | "data": entry.__dict__.copy(), | |
| 181 | } | |
| 182 | for key, value in entry_data["data"].items(): | |
| 183 | if hasattr(value, "__dict__"): | |
| 184 | entry_data["data"][key] = value.__dict__.copy() | |
| 185 | new_entries.append(entry_data) | |
| 186 | element_reprtraceback["reprentries"] = new_entries | |
| 187 | ||
| 188 | chain_data.append({ | |
| 189 | "reprtraceback": element_reprtraceback, | |
| 190 | "reprcrash": element_reprcrash, | |
| 191 | "descr": element_descr, | |
| 192 | }) | |
| 193 | ||
| 194 | return { | |
| 195 | "reprcrash": rep.longrepr.reprcrash.__dict__.copy(), | |
| 196 | "reprtraceback": rep.longrepr.reprtraceback.__dict__.copy(), | |
| 197 | "sections": rep.longrepr.sections, | |
| 198 | "chain": chain_data, | |
| 199 | "is_chain": True, | |
| 200 | } | |
| 201 | else: | |
| 202 | # Handle regular exceptions | |
| 203 | reprtraceback = rep.longrepr.reprtraceback.__dict__.copy() | |
| 204 | reprcrash = rep.longrepr.reprcrash.__dict__.copy() | |
| 205 | ||
| 206 | new_entries = [] | |
| 207 | for entry in reprtraceback["reprentries"]: | |
| 208 | entry_data = { | |
| 209 | "type": type(entry).__name__, | |
| 210 | "data": entry.__dict__.copy(), | |
| 211 | } | |
| 212 | for key, value in entry_data["data"].items(): | |
| 213 | if hasattr(value, "__dict__"): | |
| 214 | entry_data["data"][key] = value.__dict__.copy() | |
| 215 | new_entries.append(entry_data) | |
| 216 | ||
| 217 | reprtraceback["reprentries"] = new_entries | |
| 218 | ||
| 219 | return { | |
| 220 | "reprcrash": reprcrash, | |
| 221 | "reprtraceback": reprtraceback, | |
| 222 | "sections": rep.longrepr.sections, | |
| 173 | 223 | } |
| 174 | for key, value in entry_data["data"].items(): | |
| 175 | if hasattr(value, "__dict__"): | |
| 176 | entry_data["data"][key] = value.__dict__.copy() | |
| 177 | new_entries.append(entry_data) | |
| 178 | ||
| 179 | reprtraceback["reprentries"] = new_entries | |
| 180 | ||
| 181 | return { | |
| 182 | "reprcrash": reprcrash, | |
| 183 | "reprtraceback": reprtraceback, | |
| 184 | "sections": rep.longrepr.sections, | |
| 185 | } | |
| 186 | 224 | |
| 187 | 225 | d = self.__dict__.copy() |
| 188 | 226 | if hasattr(self.longrepr, "toterminal"): |
| 216 | 254 | "reprcrash" in reportdict["longrepr"] |
| 217 | 255 | and "reprtraceback" in reportdict["longrepr"] |
| 218 | 256 | ): |
| 257 | # Check if this is a chained exception | |
| 258 | if reportdict["longrepr"].get("is_chain"): | |
| 259 | # Handle chained exceptions | |
| 260 | chain_data = reportdict["longrepr"]["chain"] | |
| 261 | chain = [] | |
| 262 | ||
| 263 | for element_data in chain_data: | |
| 264 | element_reprtraceback = element_data["reprtraceback"] | |
| 265 | element_reprcrash = element_data["reprcrash"] | |
| 266 | element_descr = element_data["descr"] | |
| 267 | ||
| 268 | # Deserialize reprentries for this element | |
| 269 | unserialized_entries = [] | |
| 270 | reprentry = None | |
| 271 | for entry_data in element_reprtraceback["reprentries"]: | |
| 272 | data = entry_data["data"] | |
| 273 | entry_type = entry_data["type"] | |
| 274 | if entry_type == "ReprEntry": | |
| 275 | reprfuncargs = None | |
| 276 | reprfileloc = None | |
| 277 | reprlocals = None | |
| 278 | if data["reprfuncargs"]: | |
| 279 | reprfuncargs = ReprFuncArgs(**data["reprfuncargs"]) | |
| 280 | if data["reprfileloc"]: | |
| 281 | reprfileloc = ReprFileLocation(**data["reprfileloc"]) | |
| 282 | if data["reprlocals"]: | |
| 283 | reprlocals = ReprLocals(data["reprlocals"]["lines"]) | |
| 284 | ||
| 285 | reprentry = ReprEntry( | |
| 286 | lines=data["lines"], | |
| 287 | reprfuncargs=reprfuncargs, | |
| 288 | reprlocals=reprlocals, | |
| 289 | filelocrepr=reprfileloc, | |
| 290 | style=data["style"], | |
| 291 | ) | |
| 292 | elif entry_type == "ReprEntryNative": | |
| 293 | reprentry = ReprEntryNative(data["lines"]) | |
| 294 | else: | |
| 295 | _report_unserialization_failure(entry_type, cls, reportdict) | |
| 296 | unserialized_entries.append(reprentry) | |
| 297 | element_reprtraceback["reprentries"] = unserialized_entries | |
| 298 | ||
| 299 | # Reconstruct the traceback and crash objects | |
| 300 | reconstructed_traceback = ReprTraceback(**element_reprtraceback) | |
| 301 | reconstructed_crash = ReprFileLocation(**element_reprcrash) if element_reprcrash else None | |
| 302 | ||
| 303 | chain.append((reconstructed_traceback, reconstructed_crash, element_descr)) | |
| 304 | ||
| 305 | # Create the ExceptionChainRepr with the reconstructed chain | |
| 306 | exception_info = ExceptionChainRepr(chain) | |
| 307 | ||
| 308 | # Add sections | |
| 309 | for section in reportdict["longrepr"]["sections"]: | |
| 310 | exception_info.addsection(*section) | |
| 311 | reportdict["longrepr"] = exception_info | |
| 312 | else: | |
| 313 | # Handle regular exceptions | |
| 314 | reprtraceback = reportdict["longrepr"]["reprtraceback"] | |
| 315 | reprcrash = reportdict["longrepr"]["reprcrash"] | |
| 316 | ||
| 317 | unserialized_entries = [] | |
| 318 | reprentry = None | |
| 319 | for entry_data in reprtraceback["reprentries"]: | |
| 320 | data = entry_data["data"] | |
| 321 | entry_type = entry_data["type"] | |
| 322 | if entry_type == "ReprEntry": | |
| 323 | reprfuncargs = None | |
| 324 | reprfileloc = None | |
| 325 | reprlocals = None | |
| 326 | if data["reprfuncargs"]: | |
| 327 | reprfuncargs = ReprFuncArgs(**data["reprfuncargs"]) | |
| 328 | if data["reprfileloc"]: | |
| 329 | reprfileloc = ReprFileLocation(**data["reprfileloc"]) | |
| 330 | if data["reprlocals"]: | |
| 331 | reprlocals = ReprLocals(data["reprlocals"]["lines"]) | |
| 332 | ||
| 333 | reprentry = ReprEntry( | |
| 334 | lines=data["lines"], | |
| 335 | reprfuncargs=reprfuncargs, | |
| 336 | reprlocals=reprlocals, | |
| 337 | filelocrepr=reprfileloc, | |
| 338 | style=data["style"], | |
| 339 | ) | |
| 340 | elif entry_type == "ReprEntryNative": | |
| 341 | reprentry = ReprEntryNative(data["lines"]) | |
| 342 | else: | |
| 343 | _report_unserialization_failure(entry_type, cls, reportdict) | |
| 344 | unserialized_entries.append(reprentry) | |
| 345 | reprtraceback["reprentries"] = unserialized_entries | |
| 346 | ||
| 347 | exception_info = ReprExceptionInfo( | |
| 348 | reprtraceback=ReprTraceback(**reprtraceback), | |
| 349 | reprcrash=ReprFileLocation(**reprcrash), | |
| 350 | ) | |
| 219 | 351 | |
| 220 | reprtraceback = reportdict["longrepr"]["reprtraceback"] | |
| 221 | reprcrash = reportdict["longrepr"]["reprcrash"] | |
| 222 | ||
| 223 | unserialized_entries = [] | |
| 224 | reprentry = None | |
| 225 | for entry_data in reprtraceback["reprentries"]: | |
| 226 | data = entry_data["data"] | |
| 227 | entry_type = entry_data["type"] | |
| 228 | if entry_type == "ReprEntry": | |
| 229 | reprfuncargs = None | |
| 230 | reprfileloc = None | |
| 231 | reprlocals = None | |
| 232 | if data["reprfuncargs"]: | |
| 233 | reprfuncargs = ReprFuncArgs(**data["reprfuncargs"]) | |
| 234 | if data["reprfileloc"]: | |
| 235 | reprfileloc = ReprFileLocation(**data["reprfileloc"]) | |
| 236 | if data["reprlocals"]: | |
| 237 | reprlocals = ReprLocals(data["reprlocals"]["lines"]) | |
| 238 | ||
| 239 | reprentry = ReprEntry( | |
| 240 | lines=data["lines"], | |
| 241 | reprfuncargs=reprfuncargs, | |
| 242 | reprlocals=reprlocals, | |
| 243 | filelocrepr=reprfileloc, | |
| 244 | style=data["style"], | |
| 245 | ) | |
| 246 | elif entry_type == "ReprEntryNative": | |
| 247 | reprentry = ReprEntryNative(data["lines"]) | |
| 248 | else: | |
| 249 | _report_unserialization_failure(entry_type, cls, reportdict) | |
| 250 | unserialized_entries.append(reprentry) | |
| 251 | reprtraceback["reprentries"] = unserialized_entries | |
| 252 | ||
| 253 | exception_info = ReprExceptionInfo( | |
| 254 | reprtraceback=ReprTraceback(**reprtraceback), | |
| 255 | reprcrash=ReprFileLocation(**reprcrash), | |
| 256 | ) | |
| 257 | ||
| 258 | for section in reportdict["longrepr"]["sections"]: | |
| 259 | exception_info.addsection(*section) | |
| 260 | reportdict["longrepr"] = exception_info | |
| 352 | for section in reportdict["longrepr"]["sections"]: | |
| 353 | exception_info.addsection(*section) | |
| 354 | reportdict["longrepr"] = exception_info | |
| 261 | 355 | |
| 262 | 356 | return cls(**reportdict) |
| 263 | 357 |
| Test Name | Status |
|---|---|
testing/test_reports.py::TestReportSerialization::test_chained_exceptions[TestReport] | Fail |
testing/test_reports.py::TestReportSerialization::test_chained_exceptions[CollectReport] | Fail |
testing/test_reports.py::TestReportSerialization::test_xdist_report_longrepr_reprcrash_130 | Fail |
testing/test_reports.py::TestReportSerialization::test_reprentries_serialization_170 | Fail |
testing/test_reports.py::TestReportSerialization::test_itemreport_outcomes | Fail |
testing/test_reports.py::TestReportSerialization::test_deserialization_failure | Fail |
testing/test_reports.py::TestHooks::test_test_report | Fail |
testing/code/test_code.py::test_ne | Pass |
testing/code/test_code.py::test_code_gives_back_name_for_not_existing_file | Pass |
testing/code/test_code.py::test_code_with_class | Pass |
testing/code/test_code.py::test_code_fullsource | Pass |
testing/code/test_code.py::test_code_source | Pass |
testing/code/test_code.py::test_frame_getsourcelineno_myself | Pass |
testing/code/test_code.py::test_getstatement_empty_fullsource | Pass |
testing/code/test_code.py::test_code_from_func | Pass |
testing/code/test_code.py::test_unicode_handling | Pass |
testing/code/test_code.py::test_code_getargs | Pass |
testing/code/test_code.py::test_frame_getargs | Pass |
testing/code/test_code.py::TestExceptionInfo::test_bad_getsource | Pass |
testing/code/test_code.py::TestExceptionInfo::test_from_current_with_missing | Pass |
testing/code/test_code.py::TestTracebackEntry::test_getsource | Pass |
testing/code/test_code.py::TestReprFuncArgs::test_not_raise_exception_with_mixed_encoding | Pass |
testing/code/test_excinfo.py::test_excinfo_simple | Pass |
testing/code/test_excinfo.py::test_excinfo_from_exc_info_simple | Pass |
testing/code/test_excinfo.py::test_excinfo_getstatement | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_entries | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_entry_getsource | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_entry_getsource_in_construct | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_cut | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_filter | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_filter_selective[<lambda>-True] | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_filter_selective[<lambda>-False] | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_filter_selective[tracebackhide2-True] | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_filter_selective[tracebackhide3-False] | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_recursion_index | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_only_specific_recursion_errors | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_no_recursion_index | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_getcrashentry | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_getcrashentry_empty | Pass |
testing/code/test_excinfo.py::test_excinfo_exconly | Pass |
testing/code/test_excinfo.py::test_excinfo_repr_str | Pass |
testing/code/test_excinfo.py::test_excinfo_for_later | Pass |
testing/code/test_excinfo.py::test_excinfo_errisinstance | Pass |
testing/code/test_excinfo.py::test_excinfo_no_sourcecode | Pass |
testing/code/test_excinfo.py::test_entrysource_Queue_example | Pass |
testing/code/test_excinfo.py::test_codepath_Queue_example | Pass |
testing/code/test_excinfo.py::test_match_succeeds | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_source | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_source_excinfo | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_source_not_existing | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_many_line_source_not_existing | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_source_failing_fullsource | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_local | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_local_with_error | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_local_with_exception_in_class_property | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_local_truncated | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_tracebackentry_lines | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_tracebackentry_lines2 | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_tracebackentry_lines_var_kw_args | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_tracebackentry_short | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_tracebackentry_no | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_traceback_tbfilter | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_traceback_short_no_source | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_traceback_and_excinfo | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_traceback_with_invalid_cwd | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_excinfo_addouterr | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_excinfo_reprcrash | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_traceback_recursion | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_reprexcinfo_getrepr | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_reprexcinfo_unicode | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_toterminal_long | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_toterminal_long_missing_source | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_toterminal_long_incomplete_source | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_toterminal_long_filenames | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions0] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions1] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions2] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions3] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions4] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions5] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions6] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions7] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions8] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions9] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions10] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions11] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions12] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions13] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions14] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions15] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions16] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions17] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions18] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions19] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions20] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions21] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions22] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_format_excinfo[reproptions23] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_traceback_repr_style | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_exc_chain_repr | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_exc_repr_chain_suppression[from_none] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_exc_repr_chain_suppression[explicit_suppress] | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_exc_chain_repr_without_traceback[cause-The | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_exc_chain_repr_without_traceback[context-During | Pass |
testing/code/test_excinfo.py::TestFormattedExcinfo::test_exc_chain_repr_cycle | Pass |
testing/code/test_excinfo.py::test_repr_traceback_with_unicode[None-short] | Pass |
testing/code/test_excinfo.py::test_repr_traceback_with_unicode[None-long] | Pass |
testing/code/test_excinfo.py::test_repr_traceback_with_unicode[utf8-short] | Pass |
testing/code/test_excinfo.py::test_repr_traceback_with_unicode[utf8-long] | Pass |
testing/code/test_excinfo.py::test_repr_traceback_with_unicode[utf16-short] | Pass |
testing/code/test_excinfo.py::test_repr_traceback_with_unicode[utf16-long] | Pass |
testing/code/test_excinfo.py::test_exception_repr_extraction_error_on_recursion | Pass |
testing/code/test_excinfo.py::test_no_recursion_index_on_recursion_error | Pass |
testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_cut_excludepath | Pass |
testing/code/test_excinfo.py::test_match_raises_error | Pass |
testing/code/test_excinfo.py::test_cwd_deleted | Pass |
testing/test_reports.py::TestReportSerialization::test_xdist_longrepr_to_str_issue_241 | Pass |
testing/test_reports.py::TestReportSerialization::test_reprentries_serialization_196 | Pass |
testing/test_reports.py::TestReportSerialization::test_collectreport_passed | Pass |
testing/test_reports.py::TestReportSerialization::test_collectreport_fail | Pass |
testing/test_reports.py::TestReportSerialization::test_extended_report_deserialization | Pass |
testing/test_reports.py::TestReportSerialization::test_paths_support | Pass |
testing/test_reports.py::TestHooks::test_collect_report | Pass |
testing/test_reports.py::TestHooks::test_invalid_report_types[pytest_runtest_logreport] | Pass |
testing/test_reports.py::TestHooks::test_invalid_report_types[pytest_collectreport] | Pass |
© 2025 Ridges AI. Building the future of decentralized AI development.