fossasia/AYABInterface

View on GitHub
AYABInterface/communication/test/test_hardware_messages.py

Summary

Maintainability
B
4 hrs
Test Coverage

File test_hardware_messages.py has 253 lines of code (exceeds 250 allowed). Consider refactoring.
Open

"""Test the received messages."""
from AYABInterface.communication.host_messages import LineConfirmation
from AYABInterface.communication.hardware_messages import read_message_type, \
    UnknownMessage, SuccessConfirmation, StartConfirmation, LineRequest, \
    InformationConfirmation, TestConfirmation, StateIndication, Debug, \
Severity: Minor
Found in AYABInterface/communication/test/test_hardware_messages.py - About 2 hrs to fix

    Cyclomatic complexity is too high in method test_versions. (6)
    Open

        @pytest.mark.parametrize("bytes", [b"\x01\x02\x03\r\n", b"abc\r\n"])
        @pytest.mark.parametrize("api_version", [True, False])
        def test_versions(self, bytes, configuration, api_version):
            file = Message(bytes)
            configuration.api_version_is_supported.return_value = api_version

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Function test_versions has 10 arguments (exceeds 4 allowed). Consider refactoring.
    Open

        def test_versions(self, ready, valid, left_hall, left_bytes, right_hall,
    Severity: Major
    Found in AYABInterface/communication/test/test_hardware_messages.py - About 1 hr to fix

      Function test_line_number has 6 arguments (exceeds 4 allowed). Consider refactoring.
      Open

          def test_line_number(self, last_line, next_line, byte, monkeypatch, file,
      Severity: Minor
      Found in AYABInterface/communication/test/test_hardware_messages.py - About 45 mins to fix

        Expected 2 blank lines after class or function definition, found 1
        Open

        PATCH_RECEIVED = "AYABInterface.communication.hardware_messages."\

        Separate top-level function and class definitions with two blank lines.

        Method definitions inside a class are separated by a single blank line.
        
        Extra blank lines may be used (sparingly) to separate groups of related
        functions.  Blank lines may be omitted between a bunch of related
        one-liners (e.g. a set of dummy implementations).
        
        Use blank lines in functions, sparingly, to indicate logical sections.
        
        Okay: def a():\n    pass\n\n\ndef b():\n    pass
        Okay: def a():\n    pass\n\n\nasync def b():\n    pass
        Okay: def a():\n    pass\n\n\n# Foo\n# Bar\n\ndef b():\n    pass
        Okay: default = 1\nfoo = 1
        Okay: classify = 1\nfoo = 1
        
        E301: class Foo:\n    b = 0\n    def bar():\n        pass
        E302: def a():\n    pass\n\ndef b(n):\n    pass
        E302: def a():\n    pass\n\nasync def b(n):\n    pass
        E303: def a():\n    pass\n\n\n\ndef b(n):\n    pass
        E303: def a():\n\n\n\n    pass
        E304: @decorator\n\ndef a():\n    pass
        E305: def a():\n    pass\na()
        E306: def a():\n    def b():\n        pass\n    def c():\n        pass

        Expected 2 blank lines after class or function definition, found 1
        Open

        PATCH_RECEIVED_DEBUG = "AYABInterface.communication.hardware_messages.Debug." \

        Separate top-level function and class definitions with two blank lines.

        Method definitions inside a class are separated by a single blank line.
        
        Extra blank lines may be used (sparingly) to separate groups of related
        functions.  Blank lines may be omitted between a bunch of related
        one-liners (e.g. a set of dummy implementations).
        
        Use blank lines in functions, sparingly, to indicate logical sections.
        
        Okay: def a():\n    pass\n\n\ndef b():\n    pass
        Okay: def a():\n    pass\n\n\nasync def b():\n    pass
        Okay: def a():\n    pass\n\n\n# Foo\n# Bar\n\ndef b():\n    pass
        Okay: default = 1\nfoo = 1
        Okay: classify = 1\nfoo = 1
        
        E301: class Foo:\n    b = 0\n    def bar():\n        pass
        E302: def a():\n    pass\n\ndef b(n):\n    pass
        E302: def a():\n    pass\n\nasync def b(n):\n    pass
        E303: def a():\n    pass\n\n\n\ndef b(n):\n    pass
        E303: def a():\n\n\n\n    pass
        E304: @decorator\n\ndef a():\n    pass
        E305: def a():\n    pass\na()
        E306: def a():\n    def b():\n        pass\n    def c():\n        pass

        There are no issues that match your filters.

        Category
        Status