From b8267341a15feed3308870b91255a5d4de842df9 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Fri, 29 May 2020 11:52:03 -0700 Subject: [PATCH] Add pre commit checks + CI (#545) * Add pre commit checks * untested but should work * fix typo in dockerfile * add sqlite * add pylintrc to ignore usb1 members * Typo in stage name * Move to requirements --- .github/workflows/test.yaml | 5 +- .pre-commit-config.yaml | 30 ++ .pylintrc | 2 + Dockerfile.panda | 2 + __init__.py | 4 +- python/__init__.py | 13 +- python/uds.py | 2 +- requirements.txt | 3 +- tests/all_wifi_test.py | 4 +- tests/automated/helpers.py | 8 +- tests/bulk_write_test.py | 11 +- tests/debug_console.py | 2 +- tests/elm_car_simulator.py | 8 +- tests/linter_python/.pylintrc | 585 ---------------------- tests/linter_python/flake8_panda.sh | 8 - tests/linter_python/pylint_panda.sh | 11 - tests/safety/common.py | 17 +- tests/safety/test_gm.py | 5 +- tests/safety/test_honda.py | 9 +- tests/safety_replay/test_safety_replay.py | 4 +- tests/throughput_test.py | 2 +- 21 files changed, 85 insertions(+), 650 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 .pylintrc delete mode 100644 tests/linter_python/.pylintrc delete mode 100755 tests/linter_python/flake8_panda.sh delete mode 100755 tests/linter_python/pylint_panda.sh diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index fd7d57cc47b0b4..fea9aa2b12cc4d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -123,7 +123,6 @@ jobs: - uses: actions/checkout@v2 - name: Build Docker image run: eval "$BUILD" - - name: Run linters + - name: Run static analysis run: | - $RUN "cd /tmp/openpilot/panda/tests/linter_python/ && ./flake8_panda.sh" - $RUN "cd /tmp/openpilot/panda/tests/linter_python/ && ./pylint_panda.sh" + $RUN "cd /tmp/openpilot/panda && git init && git add -A && MYPYPATH=/tmp/openpilot pre-commit run --all" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000000000..e8464da5090d85 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,30 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: master + hooks: + - id: check-ast + - id: check-json + - id: check-xml + - id: check-yaml +- repo: https://github.com/pre-commit/mirrors-mypy + rev: master + hooks: + - id: mypy + exclude: '^(tests/automated)/' +- repo: https://github.com/PyCQA/flake8 + rev: master + hooks: + - id: flake8 + exclude: '^(tests/automated)/' + args: + - --select=F +- repo: local + hooks: + - id: pylint + name: pylint + entry: pylint + language: system + types: [python] + exclude: '^(tests/automated)/' + args: + - --disable=R,C,W diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000000000..dbcc4852c8747c --- /dev/null +++ b/.pylintrc @@ -0,0 +1,2 @@ +[MASTER] +generated-members=usb1.* diff --git a/Dockerfile.panda b/Dockerfile.panda index bcae9731995850..dbc01082a751a4 100644 --- a/Dockerfile.panda +++ b/Dockerfile.panda @@ -20,6 +20,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libffi-dev \ libtool \ libssl-dev \ + libsqlite3-dev \ libusb-1.0-0 \ libzmq3-dev \ locales \ @@ -62,3 +63,4 @@ RUN cd /tmp/openpilot && \ pip install --no-cache-dir -r tools/requirements.txt COPY . /tmp/openpilot/panda +RUN rm -rf /tmp/openpilot/panda/.git diff --git a/__init__.py b/__init__.py index 5374d5a9ab550a..deeea46eb5e773 100644 --- a/__init__.py +++ b/__init__.py @@ -1 +1,3 @@ -from .python import Panda, PandaWifiStreaming, PandaDFU, ESPROM, CesantaFlasher, flash_release, BASEDIR, ensure_st_up_to_date, build_st, PandaSerial # noqa: F401 +# flake8: noqa +# pylint: skip-file +from .python import Panda, PandaWifiStreaming, PandaDFU, ESPROM, CesantaFlasher, flash_release, BASEDIR, ensure_st_up_to_date, build_st, PandaSerial diff --git a/python/__init__.py b/python/__init__.py index e8525a1764e9a6..2f70c871c26537 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -10,12 +10,13 @@ import traceback import subprocess import sys -from .dfu import PandaDFU -from .esptool import ESPROM, CesantaFlasher # noqa: F401 -from .flash_release import flash_release # noqa: F401 -from .update import ensure_st_up_to_date # noqa: F401 -from .serial import PandaSerial # noqa: F401 -from .isotp import isotp_send, isotp_recv +from .dfu import PandaDFU # pylint: disable=import-error +from .esptool import ESPROM, CesantaFlasher # noqa pylint: disable=import-error +from .flash_release import flash_release # noqa pylint: disable=import-error +from .update import ensure_st_up_to_date # noqa pylint: disable=import-error +from .serial import PandaSerial # noqa pylint: disable=import-error +from .isotp import isotp_send, isotp_recv # pylint: disable=import-error + __version__ = '0.0.9' diff --git a/python/uds.py b/python/uds.py index 6c7b21ff5c597b..946afb796810ee 100644 --- a/python/uds.py +++ b/python/uds.py @@ -416,7 +416,7 @@ def _isotp_rx_next(self, rx_data: bytes) -> None: self.rx_idx = 0 self.rx_done = False if self.debug: print(f"ISO-TP: RX - first frame - idx={self.rx_idx} done={self.rx_done}") - if self.debug: print(f"ISO-TP: TX - flow control continue") + if self.debug: print("ISO-TP: TX - flow control continue") # send flow control message (send all bytes) msg = b"\x30\x00\x00".ljust(self.max_len, b"\x00") self._can_client.send([msg]) diff --git a/requirements.txt b/requirements.txt index fb01edcedb9107..2f479710add053 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,6 +7,7 @@ nose parameterized requests flake8==3.7.9 -pylint==2.4.3 cffi==1.11.4 crcmod +pre-commit==2.4.0 +pylint==2.5.2 diff --git a/tests/all_wifi_test.py b/tests/all_wifi_test.py index 85dc173b07625c..b1ca79cc5ac4dc 100755 --- a/tests/all_wifi_test.py +++ b/tests/all_wifi_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import requests import json -from .automated.helpers import _connect_wifi +from .automated.helpers import _connect_wifi # pylint: disable=import-error from panda import Panda from nose.tools import assert_equal @@ -25,5 +25,3 @@ assert_equal(str(dongle_id), wifi_dongle_id) assert_equal(latest_version, st_version) assert_equal(latest_version, esp_version) - - diff --git a/tests/automated/helpers.py b/tests/automated/helpers.py index f4118464efc193..a5e1506036c903 100644 --- a/tests/automated/helpers.py +++ b/tests/automated/helpers.py @@ -45,13 +45,13 @@ def init_panda_serials(): param(panda_type=Panda.HW_TYPE_UNO) ]) test_all_pandas = parameterized( - list(map(lambda x: x[0], _panda_serials)) + list(map(lambda x: x[0], _panda_serials)) # type: ignore ) test_all_gen2_pandas = parameterized( - list(map(lambda x: x[0], filter(lambda x: x[1] in GEN2_HW_TYPES, _panda_serials))) + list(map(lambda x: x[0], filter(lambda x: x[1] in GEN2_HW_TYPES, _panda_serials))) # type: ignore ) test_all_gps_pandas = parameterized( - list(map(lambda x: x[0], filter(lambda x: x[1] in GPS_HW_TYPES, _panda_serials))) + list(map(lambda x: x[0], filter(lambda x: x[1] in GPS_HW_TYPES, _panda_serials))) # type: ignore ) test_white_and_grey = parameterized([ param(panda_type=Panda.HW_TYPE_WHITE_PANDA), @@ -202,7 +202,7 @@ def wrapper(panda_serials=None, **kwargs): finally: # Close all connections for panda in pandas: - panda.close() + panda.close() return wrapper def clear_can_buffers(panda): diff --git a/tests/bulk_write_test.py b/tests/bulk_write_test.py index 43a52bce57e22c..a99ab28b992f3e 100755 --- a/tests/bulk_write_test.py +++ b/tests/bulk_write_test.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 -import time import threading +import time +from typing import Any, List from panda import Panda @@ -18,18 +19,18 @@ def flood_tx(panda): serials = Panda.list() if len(serials) != 2: raise Exception("Connect two pandas to perform this test!") - + sender = Panda(serials[0]) receiver = Panda(serials[1]) - + sender.set_safety_mode(Panda.SAFETY_ALLOUTPUT) receiver.set_safety_mode(Panda.SAFETY_ALLOUTPUT) - + # Start transmisson threading.Thread(target=flood_tx, args=(sender,)).start() # Receive as much as we can in a few second time period - rx = [] + rx: List[Any] = [] old_len = 0 start_time = time.time() while time.time() - start_time < 2 or len(rx) > old_len: diff --git a/tests/debug_console.py b/tests/debug_console.py index 7b354b1487a080..cf43b39307f4fc 100755 --- a/tests/debug_console.py +++ b/tests/debug_console.py @@ -28,7 +28,7 @@ if os.getenv("BAUD") is not None: for panda in pandas: - panda.set_uart_baud(port_number, int(os.getenv("BAUD"))) + panda.set_uart_baud(port_number, int(os.getenv("BAUD"))) # type: ignore while True: for i, panda in enumerate(pandas): diff --git a/tests/elm_car_simulator.py b/tests/elm_car_simulator.py index 01b79c88404e48..c44def04f915f8 100755 --- a/tests/elm_car_simulator.py +++ b/tests/elm_car_simulator.py @@ -299,10 +299,10 @@ def _process_obd(self, mode, pid): if __name__ == "__main__": serial = os.getenv("SERIAL") if os.getenv("SERIAL") else None - kbaud = int(os.getenv("CANKBAUD")) if os.getenv("CANKBAUD") else 500 - bitwidth = int(os.getenv("CANBITWIDTH")) if os.getenv("CANBITWIDTH") else 0 - canenable = bool(int(os.getenv("CANENABLE"))) if os.getenv("CANENABLE") else True - linenable = bool(int(os.getenv("LINENABLE"))) if os.getenv("LINENABLE") else True + kbaud = int(os.getenv("CANKBAUD")) if os.getenv("CANKBAUD") else 500 # type: ignore + bitwidth = int(os.getenv("CANBITWIDTH")) if os.getenv("CANBITWIDTH") else 0 # type: ignore + canenable = bool(int(os.getenv("CANENABLE"))) if os.getenv("CANENABLE") else True # type: ignore + linenable = bool(int(os.getenv("LINENABLE"))) if os.getenv("LINENABLE") else True # type: ignore sim = ELMCarSimulator(serial, can_kbaud=kbaud, can=canenable, lin=linenable) if(bitwidth == 0): sim.can_mode_11b_29b() diff --git a/tests/linter_python/.pylintrc b/tests/linter_python/.pylintrc deleted file mode 100644 index 64a55daf8fabb3..00000000000000 --- a/tests/linter_python/.pylintrc +++ /dev/null @@ -1,585 +0,0 @@ -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code -extension-pkg-whitelist=scipy - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=CVS - -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Use multiple processes to speed up Pylint. -jobs=4 - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins= - -# Pickle collected data for later comparisons. -persistent=yes - -# Specify a configuration file. -#rcfile= - -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages -suggestion-mode=yes - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -disable=print-statement, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, - bad-inline-option, - locally-disabled, - locally-enabled, - file-ignored, - suppressed-message, - useless-suppression, - deprecated-pragma, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - bad-indentation, - line-too-long, - missing-docstring, - multiple-statements, - bad-continuation, - invalid-name, - too-many-arguments, - too-many-locals, - superfluous-parens, - bad-whitespace, - too-many-instance-attributes, - wrong-import-position, - ungrouped-imports, - wrong-import-order, - protected-access, - trailing-whitespace, - too-many-branches, - too-few-public-methods, - too-many-statements, - trailing-newlines, - attribute-defined-outside-init, - too-many-return-statements, - too-many-public-methods, - unused-argument, - old-style-class, - no-init, - len-as-condition, - unneeded-not, - no-self-use, - multiple-imports, - no-else-return, - logging-not-lazy, - fixme, - redefined-outer-name, - unused-variable, - unsubscriptable-object, - expression-not-assigned, - too-many-boolean-expressions, - consider-using-ternary, - invalid-unary-operand-type, - relative-import, - deprecated-lambda - - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio).You can also give a reporter class, eg -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=optparse.Values,sys.exit - - -[LOGGING] - -# Logging modules to check that the string format arguments are in logging -# function parameter format -logging-modules=logging - - -[SPELLING] - -# Limits count of emitted suggestions for spelling mistakes -max-spelling-suggestions=4 - -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. -spelling-store-unknown-words=no - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - TODO - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - -# Minimum lines number of a similarity. -min-similarity-lines=4 - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members=capnp.* cereal.* pygame.* zmq.* setproctitle.* smbus2.* usb1.* serial.* cv2.* - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules=flask setproctitle usb1 flask.ext.socketio smbus2 usb1.* - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb - -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=100 - -# Maximum number of lines in a module -max-module-lines=1000 - -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma, - dict-separator - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[BASIC] - -# Naming style matching correct argument names -argument-naming-style=snake_case - -# Regular expression matching correct argument names. Overrides argument- -# naming-style -#argument-rgx= - -# Naming style matching correct attribute names -attr-naming-style=snake_case - -# Regular expression matching correct attribute names. Overrides attr-naming- -# style -#attr-rgx= - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo, - bar, - baz, - toto, - tutu, - tata - -# Naming style matching correct class attribute names -class-attribute-naming-style=any - -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style -#class-attribute-rgx= - -# Naming style matching correct class names -class-naming-style=PascalCase - -# Regular expression matching correct class names. Overrides class-naming-style -#class-rgx= - -# Naming style matching correct constant names -const-naming-style=UPPER_CASE - -# Regular expression matching correct constant names. Overrides const-naming- -# style -#const-rgx= - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Naming style matching correct function names -function-naming-style=snake_case - -# Regular expression matching correct function names. Overrides function- -# naming-style -#function-rgx= - -# Good variable names which should always be accepted, separated by a comma -good-names=i, - j, - k, - ex, - Run, - _ - -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no - -# Naming style matching correct inline iteration names -inlinevar-naming-style=any - -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style -#inlinevar-rgx= - -# Naming style matching correct method names -method-naming-style=snake_case - -# Regular expression matching correct method names. Overrides method-naming- -# style -#method-rgx= - -# Naming style matching correct module names -module-naming-style=snake_case - -# Regular expression matching correct module names. Overrides module-naming- -# style -#module-rgx= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -property-classes=abc.abstractproperty - -# Naming style matching correct variable names -variable-naming-style=snake_case - -# Regular expression matching correct variable names. Overrides variable- -# naming-style -#variable-rgx= - - -[DESIGN] - -# Maximum number of arguments for function / method -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in a if statement -max-bool-expr=5 - -# Maximum number of branch for function / method body -max-branches=12 - -# Maximum number of locals for function / method body -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body -max-returns=6 - -# Maximum number of statements in function / method body -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=regsub, - TERMIOS, - Bastion, - rexec - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception" -overgeneral-exceptions=Exception diff --git a/tests/linter_python/flake8_panda.sh b/tests/linter_python/flake8_panda.sh deleted file mode 100755 index a1d02ea548eabe..00000000000000 --- a/tests/linter_python/flake8_panda.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -RESULT=$(python3 -m flake8 --select=F $(find ../../ -type f | grep -v "/boardesp/" | grep -v "/cppcheck/" | grep "\.py$")) -if [[ $RESULT ]]; then - echo "Pyflakes found errors in the code. Please fix and try again" - echo "$RESULT" - exit 1 -fi diff --git a/tests/linter_python/pylint_panda.sh b/tests/linter_python/pylint_panda.sh deleted file mode 100755 index 1486bd839cceff..00000000000000 --- a/tests/linter_python/pylint_panda.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -python3 -m pylint --disable=R,C,W $(find ../../ -type f | grep -v "/boardesp/" | grep -v "/cppcheck/" | grep "\.py$") - -exit_status=$? -(( res = exit_status & 3 )) - -if [[ $res != 0 ]]; then - echo "Pylint found errors in the code. Please fix and try again" - exit 1 -fi diff --git a/tests/safety/common.py b/tests/safety/common.py index 945a974f2e648b..4ca7d093b38d8c 100644 --- a/tests/safety/common.py +++ b/tests/safety/common.py @@ -2,7 +2,8 @@ import struct import unittest import numpy as np -from opendbc.can.packer import CANPacker # pylint: disable=import-error +from typing import Optional, List, Dict +from opendbc.can.packer import CANPacker # pylint: disable=import-error from panda.tests.safety import libpandasafety_py MAX_WRONG_COUNTERS = 5 @@ -247,13 +248,13 @@ def test_torque_measurements(self): class PandaSafetyTest(PandaSafetyTestBase): - TX_MSGS = None - STANDSTILL_THRESHOLD = None + TX_MSGS: Optional[List[List[int]]] = None + STANDSTILL_THRESHOLD: Optional[float] = None GAS_PRESSED_THRESHOLD = 0 - RELAY_MALFUNCTION_ADDR = None - RELAY_MALFUNCTION_BUS = None - FWD_BLACKLISTED_ADDRS = {} # {bus: [addr]} - FWD_BUS_LOOKUP = {} + RELAY_MALFUNCTION_ADDR: Optional[int] = None + RELAY_MALFUNCTION_BUS: Optional[int] = None + FWD_BLACKLISTED_ADDRS: Dict[int, List[int]] = {} # {bus: [addr]} + FWD_BUS_LOOKUP: Dict[int, int] = {} @classmethod def setUpClass(cls): @@ -398,7 +399,7 @@ def test_not_allow_brake_when_moving(self): def test_sample_speed(self): self.assertFalse(self.safety.get_vehicle_moving()) - + # not moving self.safety.safety_rx_hook(self._speed_msg(0)) self.assertFalse(self.safety.get_vehicle_moving()) diff --git a/tests/safety/test_gm.py b/tests/safety/test_gm.py index 53433552924b05..5de959098e8496 100644 --- a/tests/safety/test_gm.py +++ b/tests/safety/test_gm.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 import unittest +from typing import Dict, List import numpy as np from panda import Panda from panda.tests.safety import libpandasafety_py @@ -27,8 +28,8 @@ class TestGmSafety(common.PandaSafetyTest): STANDSTILL_THRESHOLD = 0 RELAY_MALFUNCTION_ADDR = 384 RELAY_MALFUNCTION_BUS = 0 - FWD_BLACKLISTED_ADDRS = {} - FWD_BUS_LOOKUP = {} + FWD_BLACKLISTED_ADDRS: Dict[int, List[int]] = {} + FWD_BUS_LOOKUP: Dict[int, int] = {} def setUp(self): self.packer = CANPackerPanda("gm_global_a_powertrain") diff --git a/tests/safety/test_honda.py b/tests/safety/test_honda.py index e053e4e586922f..d322073ae77d20 100755 --- a/tests/safety/test_honda.py +++ b/tests/safety/test_honda.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 import unittest +from typing import Optional import numpy as np from panda import Panda from panda.tests.safety import libpandasafety_py @@ -18,9 +19,9 @@ class Btn: class TestHondaSafety(common.PandaSafetyTest): - MAX_BRAKE = 255 - PT_BUS = None # must be set when inherited - STEER_BUS = None # must be set when inherited + MAX_BRAKE: float = 255 + PT_BUS: Optional[int] = None # must be set when inherited + STEER_BUS: Optional[int] = None # must be set when inherited cnt_speed = 0 cnt_gas = 0 @@ -264,7 +265,7 @@ def setUpClass(cls): cls.packer = None cls.safety = None raise unittest.SkipTest - + def setUp(self): self.packer = CANPackerPanda("honda_accord_s2t_2018_can_generated") self.safety = libpandasafety_py.libpandasafety diff --git a/tests/safety_replay/test_safety_replay.py b/tests/safety_replay/test_safety_replay.py index 1ba800a7d63177..90913b11eea88c 100755 --- a/tests/safety_replay/test_safety_replay.py +++ b/tests/safety_replay/test_safety_replay.py @@ -37,6 +37,6 @@ if not replay_drive(lr, mode, int(param)): failed.append(route) - for f in failed: - print("\n**** failed on %s ****" % f) + for f in failed: # type: ignore + print(f"\n**** failed on {f} ****") assert len(failed) == 0, "\nfailed on %d logs" % len(failed) diff --git a/tests/throughput_test.py b/tests/throughput_test.py index 9f6021240173e9..c02f0f7674254b 100755 --- a/tests/throughput_test.py +++ b/tests/throughput_test.py @@ -19,7 +19,7 @@ p_in = Panda("WIFI") print(p_in.get_serial()) - p_in = PandaWifiStreaming() + p_in = PandaWifiStreaming() # type: ignore #while True: # p_in.can_recv()