Passed
Push — master ( 588637...c917b7 )
by Vinicius
04:24 queued 14s
created

kytos.core.id   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 39
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 23
dl 0
loc 39
ccs 22
cts 22
cp 1
rs 10
c 0
b 0
f 0
wmc 5

4 Methods

Rating   Name   Duplication   Size   Complexity  
A InterfaceID.__init__() 0 5 1
A LinkID.__new__() 0 4 1
A InterfaceID.__new__() 0 2 1
A InterfaceID.__lt__() 0 10 2
1
"""Module with identifier types for Links and Interfaces"""
2
3 1
import hashlib
4
5
6 1
class InterfaceID(str):
7
    """Interface Identifier"""
8
9 1
    __slots__ = ("switch", "port")
10
11 1
    def __new__(cls, switch: str, port: int):
12 1
        return super().__new__(cls, f"{switch}:{port}")
13
14 1
    def __init__(self, switch: str, port: int):
15
        # Used for sorting, but can be accessed
16 1
        self.switch = switch
17 1
        self.port = port
18 1
        super().__init__()
19
20 1
    def __lt__(self, other):
21
        # Ensures that instances are sortable in a way that maintains backwards
22
        # compatibility when creating instances of LinkID
23 1
        dpid_a = self.switch
24 1
        port_a = self.port
25 1
        dpid_b = other.switch
26 1
        port_b = other.port
27 1
        if dpid_a < dpid_b:
28 1
            return True
29 1
        return dpid_a == dpid_b and port_a < port_b
30
31
32 1
class LinkID(str):
33
    """Link Identifier"""
34
35 1
    def __new__(cls, interface_1: InterfaceID, interface_2: InterfaceID):
36 1
        raw_str = ":".join(sorted((interface_1, interface_2)))
37 1
        digest = hashlib.sha256(raw_str.encode('utf-8')).hexdigest()
38
        return super().__new__(cls, digest)
39