Coverage for jstark/feature_period.py: 100%

29 statements  

« prev     ^ index     » next       coverage.py v7.4.3, created at 2024-02-25 20:09 +0000

1""" 

2Encapsulate the period of a feature, defined by a unit of time 

3measure, a start and an end 

4""" 

5from jstark.period_unit_of_measure import PeriodUnitOfMeasure 

6from .exceptions import FeaturePeriodEndGreaterThanStartError 

7 

8 

9class FeaturePeriod: 

10 """ 

11 Encapsulate the period of a feature, defined by a unit of time 

12 measure, a start and an end 

13 """ 

14 

15 def __init__( 

16 self, period_unit_of_measure: PeriodUnitOfMeasure, start: int, end: int 

17 ) -> None: 

18 if not isinstance(period_unit_of_measure, PeriodUnitOfMeasure): 

19 raise TypeError( 

20 ( 

21 "period_unit_of_measure needs to be of type " 

22 + f"PeriodUnitOfMeasure, not {type(period_unit_of_measure)}" 

23 ) 

24 ) 

25 if end > start: 

26 raise FeaturePeriodEndGreaterThanStartError(start=start, end=end) 

27 self.__period_unit_of_measure = period_unit_of_measure 

28 self.__start = start 

29 self.__end = end 

30 

31 @property 

32 def start(self) -> int: 

33 "Number of periods ago that the FeaturePeriod begins at" 

34 return self.__start 

35 

36 @property 

37 def end(self) -> int: 

38 "Number of periods ago that the FeaturePeriod ends at" 

39 return self.__end 

40 

41 @property 

42 def period_unit_of_measure(self) -> PeriodUnitOfMeasure: 

43 "Period unit of measure" 

44 return self.__period_unit_of_measure 

45 

46 @property 

47 def mnemonic(self) -> str: 

48 "Mnemonic for the feature period" 

49 return f"{self.start}{self.period_unit_of_measure.value}{self.end}" 

50 

51 @property 

52 def description(self) -> str: 

53 """Description of the feature period 

54 

55 Pretty sure this will change in time, but this initial implementation 

56 will do for now 

57 

58 Returns: 

59 str: description 

60 """ 

61 return ( 

62 f"Between {self.start} and {self.end} " 

63 + f"{self.period_unit_of_measure.name.lower()}s ago" 

64 ) 

65 

66 @property 

67 def number_of_periods(self) -> int: 

68 "Number of periods between start and end (inclusive)" 

69 return self.start - self.end + 1