sdoc.sdoc2.node.FigureNode   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 132
Duplicated Lines 87.88 %

Test Coverage

Coverage 84.31%

Importance

Changes 0
Metric Value
wmc 16
eloc 51
dl 116
loc 132
ccs 43
cts 51
cp 0.8431
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A FigureNode.__init__() 11 11 1
A FigureNode._get_numeration() 22 22 5
A FigureNode.is_inline_command() 5 5 1
A FigureNode.is_block_command() 5 5 1
A FigureNode.setup_label() 7 7 1
A FigureNode._increment_last_level() 11 11 1
A FigureNode.prepare_content_tree() 14 14 4
A FigureNode.number() 12 12 1
A FigureNode.get_command() 5 5 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 1
from typing import Any, Dict, Optional
2
3 1
from cleo.io.io import IO
4
5 1
from sdoc.sdoc2 import in_scope, out_scope
6 1
from sdoc.sdoc2.node.CaptionNode import CaptionNode
7 1
from sdoc.sdoc2.node.LabelNode import LabelNode
8 1
from sdoc.sdoc2.node.Node import Node
9 1
from sdoc.sdoc2.NodeStore import NodeStore
10
11
12 1 View Code Duplication
class FigureNode(Node):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
13
    """
14
    A stub for SDoc2 node for figures.
15
    """
16
17
    # ------------------------------------------------------------------------------------------------------------------
18 1
    def __init__(self, io: IO, options: Dict[str, str]):
19
        """
20
        Object constructor.
21
22
        :param OutputStyle io: The IO object.
23
        :param dict[str,str] options: The options of this figure.
24
        """
25 1
        super().__init__(io, 'figure', options)
26
27 1
        self.caption: Optional[str] = None
28 1
        """
29
        The caption for the figure.
30
        """
31
32
    # ------------------------------------------------------------------------------------------------------------------
33 1
    def get_command(self) -> str:
34
        """
35
        Returns the command of this node, i.e. smile.
36
        """
37 1
        return 'figure'
38
39
    # ------------------------------------------------------------------------------------------------------------------
40 1
    def is_block_command(self) -> bool:
41
        """
42
        Returns False.
43
        """
44 1
        return True
45
46
    # ------------------------------------------------------------------------------------------------------------------
47 1
    def is_inline_command(self) -> bool:
48
        """
49
        Returns True.
50
        """
51
        return False
52
53
    # ------------------------------------------------------------------------------------------------------------------
54 1
    def prepare_content_tree(self) -> None:
55
        """
56
        Prepares this node for further processing.
57
        """
58 1
        for node_id in self.child_nodes:
59
            node = in_scope(node_id)
60
61
            if isinstance(node, CaptionNode):
62
                self.caption = node.argument
63
64
            if isinstance(node, LabelNode):
65
                self.setup_label(node)
66
67
            out_scope(node)
68
69
    # ------------------------------------------------------------------------------------------------------------------
70 1
    def setup_label(self, node: LabelNode) -> None:
71
        """
72
        Sets the data of a label to current table.
73
74
        :param LabelNode node: The label node.
75
        """
76
        self._options['id'] = node.argument
77
78
    # ------------------------------------------------------------------------------------------------------------------
79 1
    @staticmethod
80 1
    def _get_numeration(enumerable_numbers: Dict[str, Any]) -> None:
81
        """
82
        Returns the current enumeration of figures.
83
84
        :param dict[str,any] enumerable_numbers:
85
        """
86 1
        if 'heading' in enumerable_numbers and enumerable_numbers['heading'].get_level(1):
87 1
            chapter = enumerable_numbers['heading'].get_level(1)
88
        else:
89 1
            chapter = 0
90
91 1
        if 'figures' not in enumerable_numbers:
92 1
            enumerable_numbers['figures'] = '{0!s}.{1!s}'.format(chapter, '0')
93
94
        else:
95 1
            numbers_level = enumerable_numbers['figures'].split('.')
96 1
            if chapter > int(numbers_level[0]):
97 1
                numbers_level[0] = chapter
98 1
                numbers_level[-1] = '0'
99
100 1
            enumerable_numbers['figures'] = '.'.join(map(str, numbers_level))
101
102
    # ------------------------------------------------------------------------------------------------------------------
103 1
    @staticmethod
104 1
    def _increment_last_level(enumerable_numbers: Dict[str, Any]) -> None:
105
        """
106
        Increments the last level of figures enumeration.
107
108
        :param dict[str,any] enumerable_numbers: The current numbers of enumerable nodes.
109
        """
110 1
        heading_numbers = enumerable_numbers['figures'].split('.')
111 1
        heading_numbers[-1] = str(int(heading_numbers[-1]) + 1)
112
113 1
        enumerable_numbers['figures'] = '.'.join(heading_numbers)
114
115
    # ------------------------------------------------------------------------------------------------------------------
116 1
    def number(self, enumerable_numbers: Dict[str, Any]):
117
        """
118
        Sets the number of this figure node.
119
120
        :param dict[str,any] enumerable_numbers: The current numbers of enumerable nodes.
121
        """
122 1
        self._get_numeration(enumerable_numbers)
123 1
        self._increment_last_level(enumerable_numbers)
124
125 1
        self._options['number'] = enumerable_numbers['figures']
126
127 1
        super().number(enumerable_numbers)
128
129
130
# ----------------------------------------------------------------------------------------------------------------------
131
NodeStore.register_block_command('figure', FigureNode)
132