DEV: Update dev requirements and pre-commit configuration #5540
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions | |
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions | |
name: CI | |
on: | |
push: | |
branches: | |
- main | |
paths-ignore: | |
- '**/*.md' | |
- '**/*.rst' | |
pull_request: | |
branches: | |
- main | |
paths-ignore: | |
- '**/*.md' | |
- '**/*.rst' | |
workflow_dispatch: | |
jobs: | |
test_windows: | |
name: pytest on windows | |
runs-on: windows-latest | |
steps: | |
- name: Checkout Code | |
uses: actions/checkout@v4 | |
with: | |
submodules: 'recursive' | |
- name: Setup Python (3.11+) | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.12 # latest stable python | |
allow-prereleases: true | |
- name: Upgrade pip | |
run: | | |
python -m pip install --upgrade pip | |
- name: Install requirements (Python 3.11+) | |
run: | | |
pip install -r requirements/ci-3.11.txt | |
- name: Install cryptography | |
run: | | |
pip install cryptography | |
- name: Install pypdf | |
run: | | |
pip install . | |
- name: Prepare | |
run: | | |
python -c "from tests import download_test_pdfs; download_test_pdfs()" | |
- name: Test with pytest | |
run: | | |
python -m pytest tests --cov=pypdf --cov-append -n auto -vv | |
tests: | |
name: "pytest on ${{ matrix.python-version }} (crypto-lib: ${{ matrix.use-crypto-lib }})" | |
runs-on: ubuntu-20.04 | |
strategy: | |
matrix: | |
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] | |
use-crypto-lib: ["cryptography"] | |
include: | |
- python-version: "3.8" | |
use-crypto-lib: "pycryptodome" | |
- python-version: "3.8" | |
use-crypto-lib: "none" | |
steps: | |
- name: Update APT packages | |
run: | |
sudo apt-get update | |
- name: Install APT dependencies | |
run: | |
sudo apt-get install ghostscript | |
- name: Checkout Code | |
uses: actions/checkout@v4 | |
with: | |
submodules: 'recursive' | |
- name: Cache Downloaded Files | |
id: cache-downloaded-files | |
uses: actions/cache@v4 | |
with: | |
path: '**/tests/pdf_cache/*' | |
key: cache-downloaded-files | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
if: matrix.python-version == '3.8' || matrix.python-version == '3.9' || matrix.python-version == '3.10' | |
with: | |
python-version: ${{ matrix.python-version }} | |
cache: 'pip' | |
cache-dependency-path: '**/requirements/ci.txt' | |
- name: Setup Python (3.11+) | |
uses: actions/setup-python@v5 | |
if: matrix.python-version == '3.11' || matrix.python-version == '3.12' || matrix.python-version == '3.13' | |
with: | |
python-version: ${{ matrix.python-version }} | |
allow-prereleases: true | |
cache: 'pip' | |
cache-dependency-path: '**/requirements/ci-3.11.txt' | |
- name: Upgrade pip | |
run: | | |
python -m pip install --upgrade pip | |
- name: Install requirements (Python 3) | |
run: | | |
pip install -r requirements/ci.txt | |
if: matrix.python-version == '3.8' || matrix.python-version == '3.9' || matrix.python-version == '3.10' | |
- name: Install requirements (Python 3.11+) | |
run: | | |
pip install -r requirements/ci-3.11.txt | |
if: matrix.python-version == '3.11' || matrix.python-version == '3.12' || matrix.python-version == '3.13' | |
- name: Remove pycryptodome and cryptography | |
run: | | |
pip uninstall pycryptodome cryptography -y | |
- name: Install cryptography | |
run: | | |
pip install cryptography | |
if: matrix.use-crypto-lib == 'cryptography' | |
- name: Install pycryptodome | |
run: | | |
pip install pycryptodome | |
if: matrix.use-crypto-lib == 'pycryptodome' | |
- name: Install pypdf | |
run: | | |
pip install . | |
- name: Prepare | |
run: | | |
python -c "from tests import download_test_pdfs; download_test_pdfs()" | |
- name: Test with pytest | |
run: | | |
python -m pytest tests --cov=pypdf --cov-append -n auto -vv | |
- name: Rename coverage data file | |
run: mv .coverage ".coverage.$RANDOM" | |
- name: Upload coverage data | |
uses: actions/upload-artifact@v4 | |
with: | |
name: coverage-data.${{ matrix.python-version }}-${{ matrix.use-crypto-lib }} | |
path: .coverage.* | |
if-no-files-found: ignore | |
include-hidden-files: true | |
codestyle: | |
name: Check code style issues | |
runs-on: ubuntu-20.04 | |
steps: | |
- name: Checkout Code | |
uses: actions/checkout@v4 | |
with: | |
submodules: 'recursive' | |
- name: Setup Python 3.11 | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.11" | |
cache: 'pip' | |
cache-dependency-path: '**/requirements/ci-3.11.txt' | |
- name: Upgrade pip | |
run: | | |
python -m pip install --upgrade pip | |
- name: Install requirements | |
run: | | |
pip install -r requirements/ci-3.11.txt | |
- name: Install pypdf | |
run: | | |
pip install . | |
- name: Test with ruff | |
run: | | |
echo `ruff --version` | |
ruff check . | |
- name: Test with mypy | |
run : | | |
mypy pypdf | |
- name: Test docs build | |
run: | | |
pip install -r requirements/docs.txt | |
sphinx-build --nitpicky --fail-on-warning --keep-going --show-traceback --builder html docs build/sphinx/html | |
package: | |
name: Build & verify package | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: ${{env.PYTHON_LATEST}} | |
- run: python -m pip install flit check-wheel-contents | |
- run: flit build | |
- run: ls -l dist | |
- run: check-wheel-contents dist/*.whl | |
- name: Test installing package | |
run: python -m pip install . | |
- name: Test running installed package | |
working-directory: /tmp | |
run: python -c "import pypdf;print(pypdf.__version__)" | |
coverage: | |
name: Combine & check coverage. | |
runs-on: ubuntu-latest | |
needs: tests | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
# Use latest Python, so it understands all syntax. | |
python-version: ${{env.PYTHON_LATEST}} | |
- run: python -m pip install --upgrade coverage[toml] | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: coverage-data* | |
merge-multiple: true | |
- name: Check Number of Downloaded Files | |
run: | | |
downloaded_files_count=$(find \.coverage* -type f | wc -l) | |
if [ $downloaded_files_count -eq 8 ]; then | |
echo "The expected number of files (8) were downloaded." | |
else | |
echo "ERROR: Expected 8 files, but found $downloaded_files_count files." | |
exit 1 | |
fi | |
- name: Combine coverage & create xml report | |
run: | | |
python -m coverage combine | |
python -m coverage xml | |
- name: Upload Coverage to Codecov | |
uses: codecov/codecov-action@v4 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
files: ./coverage.xml |