Coverage for vorlagellm/agreements.py: 90.91%
33 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-10-24 03:22 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-10-24 03:22 +0000
1from enum import Enum
2from lxml.etree import _ElementTree as ElementTree
3from lxml.etree import _Element as Element
4from collections import Counter
6from .tei import readings_for_witness, find_elements
8class WitnessComparison(Enum):
9 MISSING = 0
10 UNAMBIGUOUS_DISAGREEMENT = 1
11 AMBIGUOUS_AGREEMENT = 2
12 UNAMBIGUOUS_AGREEMENT = 3
14 @property
15 def plural(self) -> str:
16 if self == WitnessComparison.MISSING:
17 return self.name.title()
18 return f"{self.name.title()}s"
21def get_app_witness_agreements(app:Element, siglum1:str, siglum2:str) -> WitnessComparison:
22 readings1 = readings_for_witness(app, siglum1)
23 if len(readings1) == 0:
24 return WitnessComparison.MISSING
26 readings2 = readings_for_witness(app, siglum2)
27 if len(readings2) == 0:
28 return WitnessComparison.MISSING
30 intersection = readings1 & readings2
31 if len(intersection) == 0:
32 return WitnessComparison.UNAMBIGUOUS_DISAGREEMENT
34 if len(readings1) == 1 and len(readings2) == 1:
35 return WitnessComparison.UNAMBIGUOUS_AGREEMENT
37 return WitnessComparison.AMBIGUOUS_AGREEMENT
41def count_witness_agreements(apparatus:ElementTree|Element, siglum1:str, siglum2:str) -> Counter[WitnessComparison]:
42 """Aggregates the types of witness agreements across multiple apparatus entries in an XML document.
44 Args:
45 apparatus (ElementTree or Element): The root XML element or element tree representing the entire document.
46 siglum1 (str): The siglum of the first witness.
47 siglum2 (str): The siglum of the second witness.
49 Returns:
50 Counter: A counter with the counts of each type of witness agreement.
51 """
52 counter = Counter()
53 for app in find_elements(apparatus, ".//app"):
54 counter.update( [get_app_witness_agreements(app, siglum1, siglum2)] )
55 return counter