Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/dns/serial.py: 16%

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

96 statements  

1# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license 

2 

3"""Serial Number Arthimetic from RFC 1982""" 

4 

5 

6class Serial: 

7 def __init__(self, value: int, bits: int = 32): 

8 self.value = value % 2**bits 

9 self.bits = bits 

10 

11 def __repr__(self): 

12 return f"dns.serial.Serial({self.value}, {self.bits})" 

13 

14 def __eq__(self, other): 

15 if isinstance(other, int): 

16 other = Serial(other, self.bits) 

17 elif not isinstance(other, Serial) or other.bits != self.bits: 

18 return NotImplemented 

19 return self.value == other.value 

20 

21 def __hash__(self): 

22 return hash(self.value) 

23 

24 def __ne__(self, other): 

25 if isinstance(other, int): 

26 other = Serial(other, self.bits) 

27 elif not isinstance(other, Serial) or other.bits != self.bits: 

28 return NotImplemented 

29 return self.value != other.value 

30 

31 def __lt__(self, other): 

32 if isinstance(other, int): 

33 other = Serial(other, self.bits) 

34 elif not isinstance(other, Serial) or other.bits != self.bits: 

35 return NotImplemented 

36 if self.value < other.value and other.value - self.value < 2 ** (self.bits - 1): 

37 return True 

38 elif self.value > other.value and self.value - other.value > 2 ** ( 

39 self.bits - 1 

40 ): 

41 return True 

42 else: 

43 return False 

44 

45 def __le__(self, other): 

46 return self == other or self < other 

47 

48 def __gt__(self, other): 

49 if isinstance(other, int): 

50 other = Serial(other, self.bits) 

51 elif not isinstance(other, Serial) or other.bits != self.bits: 

52 return NotImplemented 

53 if self.value < other.value and other.value - self.value > 2 ** (self.bits - 1): 

54 return True 

55 elif self.value > other.value and self.value - other.value < 2 ** ( 

56 self.bits - 1 

57 ): 

58 return True 

59 else: 

60 return False 

61 

62 def __ge__(self, other): 

63 return self == other or self > other 

64 

65 def __add__(self, other): 

66 v = self.value 

67 if isinstance(other, Serial): 

68 delta = other.value 

69 elif isinstance(other, int): 

70 delta = other 

71 else: 

72 raise ValueError 

73 if abs(delta) > (2 ** (self.bits - 1) - 1): 

74 raise ValueError 

75 v += delta 

76 v = v % 2**self.bits 

77 return Serial(v, self.bits) 

78 

79 def __iadd__(self, other): 

80 v = self.value 

81 if isinstance(other, Serial): 

82 delta = other.value 

83 elif isinstance(other, int): 

84 delta = other 

85 else: 

86 raise ValueError 

87 if abs(delta) > (2 ** (self.bits - 1) - 1): 

88 raise ValueError 

89 v += delta 

90 v = v % 2**self.bits 

91 self.value = v 

92 return self 

93 

94 def __sub__(self, other): 

95 v = self.value 

96 if isinstance(other, Serial): 

97 delta = other.value 

98 elif isinstance(other, int): 

99 delta = other 

100 else: 

101 raise ValueError 

102 if abs(delta) > (2 ** (self.bits - 1) - 1): 

103 raise ValueError 

104 v -= delta 

105 v = v % 2**self.bits 

106 return Serial(v, self.bits) 

107 

108 def __isub__(self, other): 

109 v = self.value 

110 if isinstance(other, Serial): 

111 delta = other.value 

112 elif isinstance(other, int): 

113 delta = other 

114 else: 

115 raise ValueError 

116 if abs(delta) > (2 ** (self.bits - 1) - 1): 

117 raise ValueError 

118 v -= delta 

119 v = v % 2**self.bits 

120 self.value = v 

121 return self