Coverage for pybeepop/beepop/mitetreatments.py: 53%

43 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-30 13:34 +0000

1"""BeePop+ Mite Treatment Management Module. 

2 

3This module contains classes for managing Varroa mite treatment schedules and 

4efficacy parameters. Mite treatments are critical interventions that reduce 

5mite populations to prevent colony collapse from mite-induced mortality. 

6 

7Classes: 

8 MiteTreatmentItem: Individual treatment schedule with efficacy parameters 

9 MiteTreatments: Collection manager for treatment schedules and active treatment lookup 

10""" 

11 

12from dataclasses import dataclass 

13from datetime import datetime 

14from datetime import timedelta 

15from typing import List, Optional 

16 

17 

18@dataclass 

19class MiteTreatmentItem: 

20 """Individual mite treatment schedule with efficacy and resistance parameters. 

21 

22 Represents a single miticide application with specified timing, duration, 

23 and efficacy characteristics. Treatments target Varroa mites with defined 

24 mortality rates while accounting for resistant mite populations that 

25 survive treatment. 

26 

27 Attributes: 

28 start_time (datetime): Treatment application start date 

29 duration (int): Treatment duration in days 

30 pct_mortality (float): Mortality rate for susceptible mites (0-100%) 

31 pct_resistant (float): Proportion of mites resistant to treatment (0-100%) 

32 """ 

33 

34 start_time: datetime 

35 duration: int # in days 

36 pct_mortality: float # percent mortality (0-100) 

37 pct_resistant: float # percent resistant (0-100) 

38 # TODO: Need to change logic in rest of program to treat pct_mortality like a float (percentage) 

39 

40 def is_valid(self) -> bool: 

41 return isinstance(self.start_time, datetime) 

42 

43 

44class MiteTreatments: 

45 """Collection manager for mite treatment schedules and active treatment lookup. 

46 

47 Manages multiple mite treatment schedules and provides functionality to 

48 determine active treatments for any given date. 

49 

50 Attributes: 

51 items (List[MiteTreatmentItem]): Collection of scheduled mite treatments 

52 """ 

53 

54 def __init__(self): 

55 self.items: List[MiteTreatmentItem] = [] 

56 

57 def add_item(self, item: MiteTreatmentItem): 

58 self.items.append(item) 

59 

60 def add_item_by_values( 

61 self, 

62 start_time: datetime, 

63 duration: int, 

64 pct_mortality: float, 

65 pct_resistant: float, 

66 ): 

67 item = MiteTreatmentItem(start_time, duration, pct_mortality, pct_resistant) 

68 self.add_item(item) 

69 

70 def get_item(self, index: int) -> Optional[MiteTreatmentItem]: 

71 if 0 <= index < len(self.items): 

72 return self.items[index] 

73 return None 

74 

75 def get_item_by_date(self, date: datetime) -> Optional[MiteTreatmentItem]: 

76 for item in self.items: 

77 if item.start_time.date() == date.date(): 

78 return item 

79 return None 

80 

81 def get_active_item(self, date: datetime) -> Optional[MiteTreatmentItem]: 

82 for item in self.items: 

83 if ( 

84 item.start_time 

85 <= date 

86 < item.start_time + timedelta(days=item.duration) 

87 ): 

88 return item 

89 return None 

90 

91 def is_new_treatment_starting(self, date: datetime) -> bool: 

92 return any(item.start_time.date() == date.date() for item in self.items) 

93 

94 def delete_item(self, index: int): 

95 if 0 <= index < len(self.items): 

96 del self.items[index] 

97 

98 def get_count(self) -> int: 

99 return len(self.items) 

100 

101 def clear_all(self): 

102 self.items.clear()