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
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
1# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
3"""Serial Number Arthimetic from RFC 1982"""
6class Serial:
7 def __init__(self, value: int, bits: int = 32):
8 self.value = value % 2**bits
9 self.bits = bits
11 def __repr__(self):
12 return f"dns.serial.Serial({self.value}, {self.bits})"
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
21 def __hash__(self):
22 return hash(self.value)
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
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
45 def __le__(self, other):
46 return self == other or self < other
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
62 def __ge__(self, other):
63 return self == other or self > other
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)
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
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)
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