main()   F
last analyzed

Complexity

Conditions 9

Size

Total Lines 129

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
cc 9
c 4
b 0
f 0
dl 0
loc 129
rs 3.1304

How to fix   Long Method   

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:

1
# -*- coding: utf-8
2
"""Code to generate examples in README.md."""
3
from didyoumean_internal import add_suggestions_to_exception
4
import didyoumean_common_tests as common
5
import os
6
7
8
def standardise(string):
9
    """Standardise string by removing elements from the environment.
10
11
    Replace strings from the environment by the name of the environment
12
    variable.
13
    """
14
    for var in ['USER']:
15
        val = os.environ.get(var)
16
        if val is not None:
17
            string = string.replace(val, var.lower())
18
    return string
19
20
21
def main():
22
    """Main."""
23
    # Different examples :
24
    # Code examples are groupes by error type then by suggestion type
25
    # Numbers have been added in dict keys just to be able to iterate
26
    # over them and have the result in the wanted order.
27
    examples = {
28
        (1, NameError): {
29
            (1, "Fuzzy matches on existing names "
30
                "(local, builtin, keywords, modules, etc)"): [
31
                "def my_func(foo, bar):\n\treturn foob\nmy_func(1, 2)",
32
                "leng([0])",
33
                "import math\nmaths.pi",
34
                "passs",
35
                "def my_func():\n\tfoo = 1\n\tfoob +=1\nmy_func()"
36
            ],
37
            (2, "Checking if name is the attribute of a defined object"): [
38
                "class Duck():\n\tdef __init__(self):\n\t\tquack()"
39
                "\n\tdef quack(self):\n\t\tpass\nd = Duck()",
40
                "import math\npi",
41
            ],
42
            (3, "Looking for missing imports"): [
43
                "string.ascii_lowercase",
44
            ],
45
            (4, "Looking in missing imports"): [
46
                "choice",
47
            ],
48
            (5, "Special cases"): [
49
                "assert j ** 2 == -1",
50
            ],
51
        },
52
        (2, AttributeError): {
53
            (1, "Fuzzy matches on existing attributes"): [
54
                "lst = [1, 2, 3]\nlst.appendh(4)",
55
                "import math\nmath.pie",
56
            ],
57
            (2, "Detection of mis-used builtins"): [
58
                "lst = [1, 2, 3]\nlst.max()",
59
            ],
60
            (3, "Trying to find method with similar meaning (hardcoded)"): [
61
                "lst = [1, 2, 3]\nlst.add(4)",
62
                "lst = [1, 2, 3]\nlst.get(5, None)",
63
            ],
64
        },
65
        (3, ImportError): {
66
            (1, "Fuzzy matches on existing modules"): [
67
                "from maths import pi",
68
            ],
69
            (2, "Fuzzy matches on elements of the module"): [
70
                "from math import pie",
71
            ],
72
            (3, "Looking for import from wrong module"): [
73
                "from itertools import pi",
74
            ],
75
        },
76
        (4, TypeError): {
77
            (1, "Fuzzy matches on keyword arguments"): [
78
                "def my_func(abcde):\n\tpass\nmy_func(abcdf=1)",
79
            ],
80
            (2, "Confusion between brackets and parenthesis"): [
81
                "lst = [1, 2, 3]\nlst(0)",
82
                "def my_func(a):\n\tpass\nmy_func[1]",
83
            ],
84
        },
85
        (5, ValueError): {
86
            (1, "Special cases"): [
87
                "'Foo{}'.format('bar')",
88
                'import datetime\n'
89
                'datetime.datetime.strptime("%d %b %y", "30 Nov 00")',
90
            ],
91
        },
92
        (6, SyntaxError): {
93
            (1, "Fuzzy matches when importing from __future__"): [
94
                "from __future__ import divisio",
95
            ],
96
            (2, "Various"): [
97
                "return",
98
            ],
99
        },
100
        (7, MemoryError): {
101
            (1, "Search for a memory-efficient equivalent"): [
102
                "range(999999999999999)",
103
            ],
104
        },
105
        (8, OverflowError): {
106
            (1, "Search for a memory-efficient equivalent"): [
107
                "range(999999999999999)",
108
            ],
109
        },
110
        (9, (OSError, IOError)): {
111
            (1, "Suggestion for tilde/variable expansions"): [
112
                "os.listdir('~')",
113
            ]
114
        },
115
        (10, RuntimeError): {
116
            (1, "Suggestion to avoid reaching maximum recursion depth"): [
117
                "global rec\ndef rec(n): return rec(n-1)\nrec(0)"
118
            ],
119
        },
120
    }
121
122
    str_func = repr  # could be str or repr
123
    for (_, exc_types), exc_examples in sorted(examples.items()):
124
        if not isinstance(exc_types, tuple):
125
            exc_types = (exc_types, )
126
        print("### {0}\n".format("/".join(e.__name__ for e in exc_types)))
127
        for (_, desc), codes in sorted(exc_examples.items()):
128
            print("##### {0}\n".format(desc))
129
            for code in codes:
130
                exc = common.get_exception(code)
131
                if exc is None:
132
                    before = after = \
133
                        "No exception thrown on this version of Python"
134
                else:
135
                    type_, value, traceback = exc
136
                    if not issubclass(type_, exc_types):
137
                        before = after = \
138
                            "Wrong exception thrown on this version of Python"
139
                    else:
140
                        before = standardise(str_func(value))
141
                        add_suggestions_to_exception(type_, value, traceback)
142
                        after = standardise(str_func(value))
143
                        if before == after:
144
                            after += " (unchanged on this version of Python)"
145
                print("""```python
146
{0}
147
#>>> Before: {1}
148
#>>> After: {2}
149
```""".format(standardise(code), before, after))
150
151
if __name__ == '__main__':
152
    main()
153