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

1from enum import Enum 

2from lxml.etree import _ElementTree as ElementTree 

3from lxml.etree import _Element as Element 

4from collections import Counter 

5 

6from .tei import readings_for_witness, find_elements 

7 

8class WitnessComparison(Enum): 

9 MISSING = 0 

10 UNAMBIGUOUS_DISAGREEMENT = 1 

11 AMBIGUOUS_AGREEMENT = 2 

12 UNAMBIGUOUS_AGREEMENT = 3 

13 

14 @property 

15 def plural(self) -> str: 

16 if self == WitnessComparison.MISSING: 

17 return self.name.title() 

18 return f"{self.name.title()}s" 

19 

20 

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 

25 

26 readings2 = readings_for_witness(app, siglum2) 

27 if len(readings2) == 0: 

28 return WitnessComparison.MISSING 

29 

30 intersection = readings1 & readings2 

31 if len(intersection) == 0: 

32 return WitnessComparison.UNAMBIGUOUS_DISAGREEMENT 

33 

34 if len(readings1) == 1 and len(readings2) == 1: 

35 return WitnessComparison.UNAMBIGUOUS_AGREEMENT 

36 

37 return WitnessComparison.AMBIGUOUS_AGREEMENT 

38 

39 

40 

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. 

43 

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. 

48 

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