pyof.v0x04.symmetric.hello   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 128
Duplicated Lines 13.28 %

Test Coverage

Coverage 90%

Importance

Changes 0
Metric Value
wmc 8
eloc 41
dl 17
loc 128
ccs 36
cts 40
cp 0.9
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A HelloElemHeader.__init__() 0 12 1
A HelloElemHeader.pack() 17 17 3
A Hello.__init__() 0 9 1
A ListOfHelloElements.__init__() 0 7 1
A HelloElemHeader.update_length() 0 3 1
A HelloElemHeader.unpack() 0 18 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
"""Defines Hello message."""
2
3
# System imports
4
5 1
from enum import IntEnum
6
7 1
from pyof.foundation.base import GenericMessage, GenericStruct
8 1
from pyof.foundation.basic_types import BinaryData, FixedTypeList, UBInt16
9 1
from pyof.foundation.exceptions import PackException
10 1
from pyof.v0x04.common.header import Header, Type
11
12
# Third-party imports
13
14 1
__all__ = ('Hello', 'HelloElemHeader', 'HelloElemType', 'ListOfHelloElements')
15
16
# Enums
17
18
19 1
class HelloElemType(IntEnum):
20
    """Hello element types."""
21
22
    #: Bitmap of version supported.
23 1
    OFPHET_VERSIONBITMAP = 1
24
25
26
# Classes
27
28
29 1
class HelloElemHeader(GenericStruct):
30
    """Common header for all Hello Elements."""
31
32 1
    element_type = UBInt16()
33 1
    length = UBInt16()
34 1
    content = BinaryData()
35
36 1
    def __init__(self, element_type=None, length=None, content=b''):
37
        """Create a HelloElemHeader with the optional parameters below.
38
39
        Args:
40
            element_type: One of OFPHET_*.
41
            length: Length in bytes of the element, including this header,
42
                excluding padding.
43
        """
44 1
        super().__init__()
45 1
        self.element_type = element_type
46 1
        self.length = length
47 1
        self.content = content
48
49 1 View Code Duplication
    def pack(self, value=None):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
50
        """Update the length and pack the massege into binary data.
51
52
        Returns:
53
            bytes: A binary data that represents the Message.
54
55
        Raises:
56
            Exception: If there are validation errors.
57
58
        """
59 1
        if value is None:
60 1
            self.update_length()
61 1
            return super().pack()
62
        if isinstance(value, type(self)):
63
            return value.pack()
64
        msg = "{} is not an instance of {}".format(value, type(self).__name__)
65
        raise PackException(msg)
66
67 1
    def update_length(self):
68
        """Update length attribute."""
69 1
        self.length = self.get_size()
70
71 1
    def unpack(self, buff=None, offset=0):
72
        """Unpack *buff* into this object.
73
74
        This method will convert a binary data into a readable value according
75
        to the attribute format.
76
77
        Args:
78
            buff (bytes): Binary buffer.
79
            offset (int): Where to begin unpacking.
80
81
        Raises:
82
            :exc:`~.exceptions.UnpackException`: If unpack fails.
83
84
        """
85 1
        length = UBInt16()
86 1
        length.unpack(buff, offset=offset+2)
87
88 1
        super().unpack(buff[:offset+length.value], offset)
89
90
91 1
class ListOfHelloElements(FixedTypeList):
92
    """List of Hello elements.
93
94
    Represented by instances of HelloElemHeader and used on Hello
95
    objects.
96
    """
97
98 1
    def __init__(self, items=None):
99
        """Create a ListOfHelloElements with the optional parameters below.
100
101
        Args:
102
            items (HelloElemHeader): Instance or a list of instances.
103
        """
104 1
        super().__init__(pyof_class=HelloElemHeader, items=items)
105
106
107 1
class Hello(GenericMessage):
108
    """OpenFlow Hello Message OFPT_HELLO.
109
110
    This message includes zero or more hello elements having variable size.
111
    Unknown element types must be ignored/skipped, to allow for future
112
    extensions.
113
    """
114
115 1
    header = Header(message_type=Type.OFPT_HELLO)
116
    #: Hello element list
117 1
    elements = ListOfHelloElements()
118
119 1
    def __init__(self, xid=None, elements=None):
120
        """Create a Hello with the optional parameters below.
121
122
        Args:
123
            xid (int): xid to be used on the message header.
124
            elements: List of elements - 0 or more
125
        """
126 1
        super().__init__(xid)
127
        self.elements = elements
128