tox for local CI, with coverage and bandit checks added

This commit is contained in:
Brian S. Stephan 2023-06-21 12:27:45 -05:00
parent e6f6a888a5
commit d31c451d0c
Signed by: bss
GPG Key ID: 3DE06D3180895FCB
4 changed files with 162 additions and 19 deletions

View File

@ -10,6 +10,28 @@ FOOTER_SIZE = 12
FOOTER_MAGIC = b'\x65\xe3\xf1\xd2'
###############
# LIB METHODS #
###############
def get_config(content: bytes) -> dict:
"""Read the config from a GP2040-CE storage section.
Args:
content: bytes from a GP2040-CE board's storage section
Returns:
the parsed configuration
"""
size, _, _ = get_config_footer(content)
config_pb2 = get_config_pb2()
config = config_pb2.Config()
config.ParseFromString(content[-(size + FOOTER_SIZE):-FOOTER_SIZE])
logger.debug("parsed: %s", config)
return config
def get_config_footer(content: bytes) -> tuple[int, int, str]:
"""Confirm and retrieve the config footer from a series of bytes of GP2040-CE storage.
@ -40,21 +62,9 @@ def get_config_footer(content: bytes) -> tuple[int, int, str]:
return config_size, config_crc, config_magic
def get_config(content: bytes) -> dict:
"""Read the config from a GP2040-CE storage section.
Args:
content: bytes from a GP2040-CE board's storage section
Returns:
the parsed configuration
"""
size, _, _ = get_config_footer(content)
config_pb2 = get_config_pb2()
config = config_pb2.Config()
config.ParseFromString(content[-(size+FOOTER_SIZE):-FOOTER_SIZE])
logger.debug("parsed: %s", config)
return config
############
# COMMANDS #
############
def visualize():

View File

@ -14,18 +14,25 @@ dependencies = ["grpcio-tools"]
dynamic = ["version"]
[project.optional-dependencies]
dev = ["decorator", "flake8", "flake8-blind-except", "flake8-builtins", "flake8-docstrings", "flake8-executable",
"flake8-fixme", "flake8-isort", "flake8-logging-format", "flake8-mutable", "flake8-pyproject", "mypy",
"pip-tools", "pytest", "setuptools-scm"]
dev = ["bandit", "decorator", "flake8", "flake8-blind-except", "flake8-builtins", "flake8-docstrings",
"flake8-executable", "flake8-fixme", "flake8-isort", "flake8-logging-format", "flake8-mutable",
"flake8-pyproject", "mypy", "pip-tools", "pytest", "pytest-cov", "setuptools-scm", "tox"]
[project.scripts]
visualize-storage = "gp2040ce_bintools.storage:visualize"
[tool.flake8]
enable-extensions = "G,M"
exclude = [".tox/", "venv/", "_version.py", "tests/test-files/"]
extend-ignore = "T101"
max-complexity = 10
max-line-length = 120
[tool.mypy]
ignore_missing_imports = true
[tool.pytest]
python_files = ["*_tests.py", "tests.py", "test_*.py"]
[tool.setuptools_scm]
write_to = "gp2040ce_bintools/_version.py"

View File

@ -4,14 +4,30 @@
#
# pip-compile --extra=dev --output-file=requirements/requirements-dev.txt
#
bandit==1.7.5
# via gp2040ce-binary-tools (pyproject.toml)
build==0.10.0
# via pip-tools
cachetools==5.3.1
# via tox
chardet==5.1.0
# via tox
click==8.1.3
# via pip-tools
colorama==0.4.6
# via tox
coverage[toml]==7.2.7
# via pytest-cov
decorator==5.1.1
# via gp2040ce-binary-tools (pyproject.toml)
distlib==0.3.6
# via virtualenv
exceptiongroup==1.1.1
# via pytest
filelock==3.12.2
# via
# tox
# virtualenv
flake8==6.0.0
# via
# flake8-builtins
@ -39,6 +55,10 @@ flake8-mutable==1.2.0
# via gp2040ce-binary-tools (pyproject.toml)
flake8-pyproject==1.2.3
# via gp2040ce-binary-tools (pyproject.toml)
gitdb==4.0.10
# via gitpython
gitpython==3.1.31
# via bandit
grpcio==1.54.2
# via grpcio-tools
grpcio-tools==1.54.2
@ -47,8 +67,12 @@ iniconfig==2.0.0
# via pytest
isort==5.12.0
# via flake8-isort
markdown-it-py==3.0.0
# via rich
mccabe==0.7.0
# via flake8
mdurl==0.1.2
# via markdown-it-py
mypy==1.4.0
# via gp2040ce-binary-tools (pyproject.toml)
mypy-extensions==1.0.0
@ -56,12 +80,22 @@ mypy-extensions==1.0.0
packaging==23.1
# via
# build
# pyproject-api
# pytest
# setuptools-scm
# tox
pbr==5.11.1
# via stevedore
pip-tools==6.13.0
# via gp2040ce-binary-tools (pyproject.toml)
platformdirs==3.7.0
# via
# tox
# virtualenv
pluggy==1.0.0
# via pytest
# via
# pytest
# tox
protobuf==4.23.3
# via grpcio-tools
pycodestyle==2.10.0
@ -70,25 +104,49 @@ pydocstyle==6.3.0
# via flake8-docstrings
pyflakes==3.0.1
# via flake8
pygments==2.15.1
# via rich
pyproject-api==1.5.2
# via tox
pyproject-hooks==1.0.0
# via build
pytest==7.3.2
# via
# gp2040ce-binary-tools (pyproject.toml)
# pytest-cov
pytest-cov==4.1.0
# via gp2040ce-binary-tools (pyproject.toml)
pyyaml==6.0
# via bandit
rich==13.4.2
# via bandit
setuptools-scm==7.1.0
# via gp2040ce-binary-tools (pyproject.toml)
smmap==5.0.0
# via gitdb
snowballstemmer==2.2.0
# via pydocstyle
stevedore==5.1.0
# via bandit
tomli==2.0.1
# via
# build
# coverage
# flake8-pyproject
# mypy
# pyproject-api
# pyproject-hooks
# pytest
# setuptools-scm
# tox
tox==4.6.3
# via gp2040ce-binary-tools (pyproject.toml)
typing-extensions==4.6.3
# via
# mypy
# setuptools-scm
virtualenv==20.23.1
# via tox
wheel==0.40.0
# via pip-tools

68
tox.ini Normal file
View File

@ -0,0 +1,68 @@
# tox (https://tox.readthedocs.io/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.
[tox]
isolated_build = true
envlist = begin,py39,py310,py311,coverage,bandit,lint
[testenv]
allow_externals = pytest, coverage
deps =
-rrequirements/requirements-dev.txt
[testenv:begin]
# clean up potential previous coverage runs
skip_install = true
commands = coverage erase
[testenv:py39]
# run pytest with coverage
commands =
pytest --cov-append --cov={envsitepackagesdir}/gp2040ce_bintools/ --cov-branch
[testenv:py310]
# run pytest with coverage
commands =
pytest --cov-append --cov={envsitepackagesdir}/gp2040ce_bintools/ --cov-branch
[testenv:py311]
# run pytest with coverage
commands =
pytest --cov-append --cov={envsitepackagesdir}/gp2040ce_bintools/ --cov-branch
[testenv:coverage]
# report on coverage runs from above
skip_install = true
commands =
coverage report --fail-under=80 --show-missing
[testenv:bandit]
commands =
bandit ./gp2040ce_bintools/ -r
; dep hell, can't install safety at the moment
; [testenv:safety]
; skip_install = true
; isolated_build = false
; commands =
; safety check -r requirements/requirements-dev.txt
[testenv:lint]
# run style checks
commands =
flake8
- flake8 --disable-noqa --ignore= --select=E,W,F,C,D,A,G,B,I,T,M,DUO
[coverage:paths]
source =
./
.tox/**/site-packages/
[coverage:run]
branch = True
omit =
**/_version.py