Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/isoduration/operations/util.py: 25%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

24 statements  

1from decimal import ROUND_FLOOR, Decimal 

2 

3 

4def quot2(dividend: Decimal, divisor: Decimal) -> Decimal: 

5 return (dividend / divisor).to_integral_value(rounding=ROUND_FLOOR) 

6 

7 

8def mod2(dividend: Decimal, divisor: Decimal) -> Decimal: 

9 return dividend - quot2(dividend, divisor) * divisor 

10 

11 

12def quot3(value: Decimal, low: Decimal, high: Decimal) -> Decimal: 

13 dividend = value - low 

14 divisor = high - low 

15 return (dividend / divisor).to_integral_value(rounding=ROUND_FLOOR) 

16 

17 

18def mod3(value: Decimal, low: Decimal, high: Decimal) -> Decimal: 

19 dividend = value - low 

20 divisor = high - low 

21 return mod2(dividend, divisor) + low 

22 

23 

24def max_day_in_month(year: Decimal, month: Decimal) -> Decimal: 

25 norm_month = int(mod3(month, Decimal(1), Decimal(13))) 

26 norm_year = year + quot3(month, Decimal(1), Decimal(13)) 

27 

28 if norm_month in (1, 3, 5, 7, 8, 10, 12): 

29 return Decimal(31) 

30 if norm_month in (4, 6, 9, 11): 

31 return Decimal(30) 

32 

33 is_leap_year = ( 

34 mod2(norm_year, Decimal(400)) == 0 

35 or mod2(norm_year, Decimal(100)) != 0 

36 and mod2(norm_year, Decimal(4)) == 0 

37 ) 

38 if norm_month == 2 and is_leap_year: 

39 return Decimal(29) 

40 

41 return Decimal(28)