Failed Conditions
Pull Request — master (#1152)
by Lasse
03:36
created

coalib.misc.run_coala()   F

Complexity

Conditions 15

Size

Total Lines 122

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 15
dl 0
loc 122
rs 2

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like coalib.misc.run_coala() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
from collections import Iterable, OrderedDict
2
3
4
def inverse_dicts(*dicts):
5
    """
6
    Inverts the dicts, e.g. {1: 2, 3: 4} and {2: 3, 4: 4} will be inverted
7
    {2: [1, 2], 4: [3, 4]}. This also handles dictionaries with Iterable items
8
    as values e.g. {1: [1, 2, 3], 2: [3, 4, 5]} and
9
    {2: [1], 3: [2], 4: [3, 4]} will be inverted to
10
    {1: [1, 2], 2: [1, 3], 3: [1, 2, 4], 4: [2, 4], 5: [2]}.
11
    No order is preserved.
12
13
    :param dicts: The dictionaries to invert.
14
    :return:      The inversed dictionary which merges all dictionaries into
15
                  one.
16
    """
17
    inverse = {}
18
19
    for dictionary in dicts:
20
        for key, value in dictionary.items():
21
            if isinstance(value, Iterable):
22
                for item in value:
23
                    add_pair_to_dict(item, key, inverse)
24
            else:
25
                add_pair_to_dict(value, key, inverse)
26
27
    return inverse
28
29
30
def add_pair_to_dict(key, value, dictionary):
31
    """
32
    Add (key, value) pair to the dictionary. The value is added to a list of
33
    values for the key.
34
    """
35
    if key in dictionary:
36
        dictionary[key].append(value)
37
    else:
38
        dictionary[key] = [value]
39
40
41
def update_ordered_dict_key(dictionary, old_key, new_key):
42
    return OrderedDict(((new_key if k == old_key else k), v)
43
                       for k, v in dictionary.items())
44