From c02c96792f43466d881c8c91071a6dd953970400 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 3 Mar 2024 17:10:51 -0500 Subject: [PATCH] refactor: a slightly different way to deal with unserializable Numbers --- coverage/html.py | 13 ++++++++++--- coverage/results.py | 4 ---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/coverage/html.py b/coverage/html.py index ead647112..9810e166e 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -6,6 +6,7 @@ from __future__ import annotations import collections +import dataclasses import datetime import functools import json @@ -40,7 +41,10 @@ class IndexInfoDict(TypedDict): """Information for each file, to render the index file.""" - nums: Numbers + # For in-memory use, we have Numbers. For serialization, we write a list + # of ints. Two fields keeps the type-checker happier. + nums: Numbers | None + numlist: list[int] html_filename: str relative_filename: str @@ -460,6 +464,7 @@ def write_html_file(self, ftr: FileToReport, prev_html: str, next_html: str) -> # Save this file's information for the index file. index_info: IndexInfoDict = { "nums": ftr.analysis.numbers, + "numlist": [], "html_filename": ftr.html_filename, "relative_filename": ftr.fr.relative_filename(), } @@ -565,7 +570,7 @@ def read(self) -> None: if usable: self.files = {} for filename, fileinfo in status["files"].items(): - fileinfo["index"]["nums"] = Numbers(*fileinfo["index"]["nums"]) + fileinfo["index"]["nums"] = Numbers(*fileinfo["index"]["numlist"]) self.files[filename] = fileinfo self.globals = status["globals"] else: @@ -577,7 +582,9 @@ def write(self) -> None: files = {} for filename, fileinfo in self.files.items(): index = fileinfo["index"] - index["nums"] = index["nums"].init_args() # type: ignore[typeddict-item] + assert index["nums"] is not None + index["numlist"] = list(dataclasses.astuple(index["nums"])) + index["nums"] = None files[filename] = fileinfo status = { diff --git a/coverage/results.py b/coverage/results.py index b5289eb45..524bbb95c 100644 --- a/coverage/results.py +++ b/coverage/results.py @@ -196,10 +196,6 @@ class Numbers: n_partial_branches: int = 0 n_missing_branches: int = 0 - def init_args(self) -> list[int]: - """Return a list for __init__(*args) to recreate this object.""" - return list(dataclasses.astuple(self)) - @property def n_executed(self) -> int: """Returns the number of executed statements."""