alot/db/utils.py

Summary

Maintainability
D
2 days
Test Coverage

File utils.py has 428 lines of code (exceeds 250 allowed). Consider refactoring.
Open

# encoding=utf-8
# Copyright (C) 2011-2012  Patrick Totzke <patricktotzke@gmail.com>
# Copyright © 2017 Dylan Baker <dylan@pnwbakers.com>
# This file is released under the GNU GPL, version 3 or a later revision.
# For further details see the COPYING file
Severity: Minor
Found in alot/db/utils.py - About 6 hrs to fix

    Function _decrypted_message_from_message has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.
    Open

    def _decrypted_message_from_message(original_bytes, m, session_keys=None):
        '''Detect and decrypt OpenPGP encrypted data in an email object. If this
        succeeds, any mime messages found in the recovered plaintext
        message are added to the returned message object.
    
    
    Severity: Minor
    Found in alot/db/utils.py - About 2 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function _handle_encrypted has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.
    Open

    def _handle_encrypted(original, message, session_keys=None):
        """Handle encrypted messages helper.
    
        RFC 3156 is quite strict:
        * exactly two messages
    Severity: Minor
    Found in alot/db/utils.py - About 2 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function add_signature_headers has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.
    Open

    def add_signature_headers(mail, sigs, error_msg):
        '''Add pseudo headers to the mail indicating whether the signature
        verification was successful.
    
        :param mail: :class:`email.message.Message` the message to entitle
    Severity: Minor
    Found in alot/db/utils.py - About 2 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function remove_cte has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.
    Open

    def remove_cte(part, as_string=False):
        """Interpret MIME-part according to it's Content-Transfer-Encodings.
    
        This returns the payload of `part` as string or bytestring for display, or
        to be passed to an external program. In the raw file the payload may be
    Severity: Minor
    Found in alot/db/utils.py - About 1 hr to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function render_part has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
    Open

    def render_part(part, field_key='copiousoutput'):
        """
        renders a non-multipart email part into displayable plaintext by piping its
        payload through an external script. The handler itself is determined by
        the mailcap entry for this part's ctype.
    Severity: Minor
    Found in alot/db/utils.py - About 45 mins to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function _handle_signatures has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
    Open

    def _handle_signatures(original_bytes, original, message, params):
        """Shared code for handling message signatures.
    
        RFC 3156 is quite strict:
        * exactly two messages
    Severity: Minor
    Found in alot/db/utils.py - About 45 mins to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function extract_body_part has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
    Open

    def extract_body_part(body_part):
        """Returns a string view of a Message."""
        displaystring = ""
        rendered_payload = render_part(
            body_part,
    Severity: Minor
    Found in alot/db/utils.py - About 25 mins to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    TODO found
    Open

            # TODO[dcbaker]: RFC 3156 says the alg has to be lower case, but I've
    Severity: Minor
    Found in alot/db/utils.py by fixme

    Line break after binary operator
    Open

                    elif (sub.get_content_subtype() == 'encrypted' and
    Severity: Minor
    Found in alot/db/utils.py by pep8

    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.
    
    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)
    
    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    
    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)

    Line break after binary operator
    Open

                  p.get('protocol') == _APP_PGP_ENC and
    Severity: Minor
    Found in alot/db/utils.py by pep8

    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.
    
    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)
    
    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    
    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)

    Line break after binary operator
    Open

            elif (m.get_content_subtype() == 'encrypted' and
    Severity: Minor
    Found in alot/db/utils.py by pep8

    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.
    
    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)
    
    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    
    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)

    Line break after binary operator
    Open

                    if (sub.get_content_subtype() == 'signed' and
    Severity: Minor
    Found in alot/db/utils.py by pep8

    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.
    
    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)
    
    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    
    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)

    Continuation line under-indented for hanging indent
    Open

                   f'expected Content-Type: {_APP_PGP_SIG}, got: {ct}')
    Severity: Minor
    Found in alot/db/utils.py by pep8

    Continuation lines indentation.

    Continuation lines should align wrapped elements either vertically
    using Python's implicit line joining inside parentheses, brackets
    and braces, or using a hanging indent.
    
    When using a hanging indent these considerations should be applied:
    - there should be no arguments on the first line, and
    - further indentation should be used to clearly distinguish itself
      as a continuation line.
    
    Okay: a = (\n)
    E123: a = (\n    )
    
    Okay: a = (\n    42)
    E121: a = (\n   42)
    E122: a = (\n42)
    E123: a = (\n    42\n    )
    E124: a = (24,\n     42\n)
    E125: if (\n    b):\n    pass
    E126: a = (\n        42)
    E127: a = (24,\n      42)
    E128: a = (24,\n    42)
    E129: if (a or\n    b):\n    pass
    E131: a = (\n    42\n 24)

    Line break after binary operator
    Open

            if (m.get_content_subtype() == 'signed' and
    Severity: Minor
    Found in alot/db/utils.py by pep8

    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.
    
    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)
    
    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    
    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)

    There are no issues that match your filters.

    Category
    Status