From bbe1da95b1d289c1b7622187a38a542edef619b5 Mon Sep 17 00:00:00 2001 From: Piotr Pasza Storozenko Date: Mon, 25 Mar 2024 17:57:22 +0100 Subject: [PATCH] feat: add mypy for type checking --- .github/workflows/main.yaml | 4 +-- README.md | 1 + poetry.lock | 60 ++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + quality_checks.sh | 14 +++++++++ run_tests_and_bandit.sh | 12 -------- 6 files changed, 77 insertions(+), 15 deletions(-) create mode 100755 quality_checks.sh delete mode 100755 run_tests_and_bandit.sh diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 0e13bad..84f2829 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -12,7 +12,7 @@ jobs: - name: Checkout (GitHub) uses: actions/checkout@v4 - - name: Build and run dev container tests + - name: Run quality checks uses: devcontainers/ci@v0.3 with: - runCmd: ./run_tests_and_bandit.sh + runCmd: ./quality_checks.sh diff --git a/README.md b/README.md index d665444..30345b9 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Our template ensures a streamlined development lifecycle, offering: - **Structured Logging with Loguru**: Enhanced debugging and monitoring. - **Best Practice Configuration**: Using `pydantic-settings`. - **Efficient Deployment**: Smooth deployment to Posit Connect with `rsconnect`. +- **Static Type Checking with mypy**: Ensures type safety and code quality. ## Community and Contributions diff --git a/poetry.lock b/poetry.lock index ed2fa26..22a9b4f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -937,6 +937,64 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mypy" +version = "1.9.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + [[package]] name = "nest-asyncio" version = "1.6.0" @@ -2308,4 +2366,4 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "4e29615ec3b3de4694764eceb4c06539105c721aa589dc9842b1942e9c923b2e" +content-hash = "82e9013b94d944e798829ec65b66f8390d59dc4b62812b31ce7663464df98835" diff --git a/pyproject.toml b/pyproject.toml index a1d5256..222a012 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,7 @@ tenacity = "^8.2.3" bandit = "^1.7.8" pytest-watch = "^4.2.0" pytest-cov = "^5.0.0" +mypy = "^1.9.0" [build-system] requires = ["poetry-core"] diff --git a/quality_checks.sh b/quality_checks.sh new file mode 100755 index 0000000..b3abf83 --- /dev/null +++ b/quality_checks.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# This script is for running quality checks in GitHub Actions. +# It runs tests, security analysis with Bandit, and type checks with mypy. + +set -e # Exit immediately if a command exits with a non-zero status. + +echo "Running pytest for unit tests..." +poetry run pytest + +echo "Running Bandit for security analysis..." +poetry run bandit -r pyshiny_template + +echo "Running mypy for type checking..." +poetry run mypy pyshiny_template diff --git a/run_tests_and_bandit.sh b/run_tests_and_bandit.sh deleted file mode 100755 index aa20e3c..0000000 --- a/run_tests_and_bandit.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# This script is for Github Action purposes. -# You cannot run multiple commands with runCmd in devcontainers/ci@v0.3 action -# Hence, this script is created to run the tests and bandit. - -set -e # Exit immediately if a command exits with a non-zero status. - -echo "Running pytest..." -poetry run pytest - -echo "Running Bandit..." -poetry run bandit -r pyshiny_template