Source code for jsonschema_diff.core.compare_combined

from typing import TYPE_CHECKING, Any, Dict

from .abstraction import Statuses, ToCompare
from .compare_base import Compare

if TYPE_CHECKING:
    from .compare_base import LEGEND_RETURN_TYPE


[docs] class CompareCombined(Compare): def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs)
[docs] self.dict_compare: Dict[str, ToCompare] = {}
[docs] self.dict_values: Dict[str, Any] = {}
[docs] def compare(self) -> Statuses: for c in self.to_compare: if self.status == Statuses.UNKNOWN: self.status = c.status elif self.status != c.status: self.status = Statuses.REPLACED self.dict_compare[c.key] = c self.dict_values[c.key] = c.value return self.status
[docs] def calc_diff(self) -> dict[str, int]: """ Multiple implementation: counts its own status as the number of keys. Complex comparators (e.g. CompareList) override this to return an aggregate. """ stats = {self.status.name: 1} for comp in self.dict_compare.values(): if comp.status.name not in stats: stats[comp.status.name] = 0 stats[comp.status.name] += 1 return stats
[docs] def get_name(self) -> str: raise NotImplementedError("The get_name method must be overridden")
[docs] def render( self, tab_level: int = 0, with_path: bool = True, to_crop: tuple[int, int] = (0, 0) ) -> str: raise NotImplementedError("The render method must be overridden")
@staticmethod
[docs] def legend() -> "LEGEND_RETURN_TYPE": raise NotImplementedError("The legend method must be overridden")