diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e30f1fa --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,187 @@ +name: CI + +on: + push: + branches: + - main + tags: + - "v*.*.*" + pull_request: + branches: + - main + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + + lint: + name: Linting + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install ruff + - name: Ruff lint + run: | + ruff check --output-format=github . + - name: Ruff format + run: | + ruff format --check . + + docs: + name: Docs + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Install dev dependencies + run: | + python -m pip install --upgrade pip + pip install -U -e .[docs] + - name: Build docs + run: | + cd docs + make html SPHINXOPTS="-W --keep-going" + + tests: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: Test py39 + os: ubuntu-latest + pyversion: '3.9' + - name: Test py310 + os: ubuntu-latest + pyversion: '3.10' + - name: Test py311 + os: ubuntu-latest + pyversion: '3.11' + - name: Test py312 + os: ubuntu-latest + pyversion: '3.12' + - name: Test py313 + os: ubuntu-latest + pyversion: '3.13' + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.pyversion }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.pyversion }} + - name: Install package and dev dependencies + run: | + python -m pip install --upgrade pip + pip install .[tests] + rm -r rendercanvas + - name: Unit tests + run: | + pytest -v tests + + test-pyinstaller: + name: Test pyinstaller + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Install package and dev dependencies + run: | + python -m pip install --upgrade pip + pip install -U . + pip install pytest pyinstaller + - name: Unit tests + run: | + pushd $HOME + pytest -v --pyargs rendercanvas.__pyinstaller + + release: + name: Build release on ubuntu-latest + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Install dev dependencies + run: | + python -m pip install --upgrade pip + pip install -U flit build twine + - name: Create source distribution + run: | + python -m build -n -s + - name: Build wheel + run: | + python -m build -n -w + - name: Test sdist + shell: bash + run: | + rm -rf ./rendercanvas + pushd $HOME + pip install $GITHUB_WORKSPACE/dist/*.tar.gz + python -c "import rendercanvas; print(rendercanvas.__version__)" + popd + # don't run tests, we just want to know if the sdist can be installed + pip uninstall -y rendercanvas + git reset --hard HEAD + - name: Twine check + run: | + twine check dist/* + - name: Upload distributions + uses: actions/upload-artifact@v4 + with: + path: dist + name: dist + + publish: + name: Publish release to Github and Pypi + runs-on: ubuntu-latest + needs: [tests, release] + if: success() && startsWith(github.ref, 'refs/tags/v') + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Download assets + uses: actions/download-artifact@v4 + with: + name: dist + path: dist + - name: Release + uses: softprops/action-gh-release@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + files: | + dist/*.tar.gz + dist/*.whl + draft: true + prerelease: false + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_PASSWORD }} diff --git a/examples/gui_auto.py b/examples/gui_auto.py index bca63ba..668c7ad 100644 --- a/examples/gui_auto.py +++ b/examples/gui_auto.py @@ -7,7 +7,9 @@ from rendercanvas.utils.cube import setup_drawing_sync -canvas = WgpuCanvas(size=(640, 480), title=f"The wgpu cube example on a {WgpuCanvas.__name__}") +canvas = WgpuCanvas( + size=(640, 480), title=f"The wgpu cube example on a {WgpuCanvas.__name__}" +) draw_frame = setup_drawing_sync(canvas) diff --git a/examples/gui_glfw.py b/examples/gui_glfw.py index 5760ea8..bb8fbc3 100644 --- a/examples/gui_glfw.py +++ b/examples/gui_glfw.py @@ -7,7 +7,7 @@ from rendercanvas.utils.cube import setup_drawing_sync -canvas = WgpuCanvas(size=(640, 480), title=f"The wgpu cube example on glfw") +canvas = WgpuCanvas(size=(640, 480), title="The wgpu cube example on glfw") draw_frame = setup_drawing_sync(canvas) diff --git a/examples/gui_qt.py b/examples/gui_qt.py index 438f6a2..4289027 100644 --- a/examples/gui_qt.py +++ b/examples/gui_qt.py @@ -4,6 +4,8 @@ Works with either PySide6, PyQt6, PyQt5 or PySide2. """ +# ruff: noqa: E402 + import importlib # The `rendercanvas.qt` module checks what Qt libs is imported, so we need to import that first. diff --git a/examples/gui_wx.py b/examples/gui_wx.py index 0aa5827..b1fce04 100644 --- a/examples/gui_wx.py +++ b/examples/gui_wx.py @@ -7,7 +7,7 @@ from rendercanvas.utils.cube import setup_drawing_sync -canvas = WgpuCanvas(size=(640, 480), title=f"The wgpu cube example on wx") +canvas = WgpuCanvas(size=(640, 480), title="The wgpu cube example on wx") draw_frame = setup_drawing_sync(canvas)