# 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: Package on: push: pull_request: types: [opened, reopened] defaults: run: shell: bash env: git-depth: 0 # Depth to search for tags. jobs: black: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install Black run: pip install black - name: Run Black run: black --check --diff examples/ scripts/ tcod/ tests/ *.py isort: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install isort run: pip install isort - name: isort uses: liskin/gh-problem-matcher-wrap@v2 with: linters: isort run: isort scripts/ tcod/ tests/ examples/ --check --diff mypy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Checkout submodules run: git submodule update --init --recursive --depth 1 - name: Install typing dependencies run: pip install mypy pytest -r requirements.txt - name: Mypy uses: liskin/gh-problem-matcher-wrap@v2 with: linters: mypy run: mypy --show-column-numbers sdist: runs-on: ubuntu-latest steps: - name: APT update run: sudo apt-get update - name: Install APT dependencies run: sudo apt-get install libsdl2-dev - uses: actions/checkout@v3 with: fetch-depth: ${{ env.git-depth }} - name: Checkout submodules run: git submodule update --init --recursive --depth 1 - name: Install build run: pip install build - name: Build source distribution run: python -m build --sdist - uses: actions/upload-artifact@v3 with: name: sdist path: dist/tcod-*.tar.gz retention-days: 7 # This makes sure that the latest versions of the SDL headers parse correctly. parse_sdl: needs: [black, isort, mypy] runs-on: ${{ matrix.os }} strategy: matrix: os: ["windows-latest", "macos-latest"] sdl-version: ["2.0.14", "2.0.16"] fail-fast: true steps: - uses: actions/checkout@v3 with: fetch-depth: ${{ env.git-depth }} - name: Checkout submodules run: git submodule update --init --recursive --depth 1 - uses: actions/setup-python@v4 with: python-version: "3.x" - name: Install build dependencies run: pip install -r requirements.txt - name: Test SDL parsing run: python build_sdl.py env: SDL_VERSION: ${{ matrix.sdl-version }} build: needs: [black, isort, mypy] runs-on: ${{ matrix.os }} strategy: matrix: os: ["ubuntu-latest", "windows-latest"] python-version: ["3.7", "3.8", "3.9", "pypy-3.7"] architecture: ["x64"] include: - os: "windows-latest" python-version: "3.7" architecture: "x86" - os: "windows-latest" python-version: "pypy-3.7" architecture: "x86" fail-fast: false steps: - uses: actions/checkout@v3 with: fetch-depth: ${{ env.git-depth }} - name: Checkout submodules run: | git submodule update --init --recursive --depth 1 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} architecture: ${{ matrix.architecture }} - name: Install APT dependencies if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install libsdl2-dev xvfb - name: Install Python dependencies run: | python -m pip install --upgrade pip pip install pytest pytest-cov pytest-benchmark pytest-timeout build if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Initialize package run: | pip install -e . # Install the package in-place. - name: Build package run: | python -m build - name: Test with pytest if: runner.os == 'Windows' run: | pytest --cov-report=xml --timeout=300 - name: Test with pytest (Xvfb) if: always() && runner.os != 'Windows' run: | xvfb-run -e /tmp/xvfb.log --server-num=$RANDOM --auto-servernum pytest --cov-report=xml --timeout=300 - name: Xvfb logs if: runner.os != 'Windows' run: cat /tmp/xvfb.log - uses: codecov/codecov-action@v3 - uses: actions/upload-artifact@v3 if: runner.os == 'Windows' with: name: wheels-windows path: dist/*.whl retention-days: 7 isolated: # Test installing the package from source. needs: [black, isort, mypy, sdist] runs-on: ${{ matrix.os }} strategy: matrix: os: ["ubuntu-latest", "windows-latest"] steps: - name: Set up Python uses: actions/setup-python@v4 with: python-version: 3.x - name: Install Python dependencies run: | python -m pip install --upgrade pip pip install wheel - name: Install APT dependencies if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install libsdl2-dev - uses: actions/download-artifact@v3 with: name: sdist - name: Build package in isolation run: | pip install tcod-*.tar.gz - name: Confirm package import run: | python -c "import tcod.context" linux-wheels: needs: [black, isort, mypy] runs-on: "ubuntu-latest" strategy: matrix: arch: ["x86_64", "aarch64"] build: ["cp37-manylinux*", "pp37-manylinux*"] steps: - uses: actions/checkout@v3 with: fetch-depth: ${{ env.git-depth }} - name: Set up QEMU if: ${{ matrix.arch == 'aarch64' }} uses: docker/setup-qemu-action@v2 - name: Checkout submodules run: | git submodule update --init --recursive --depth 1 - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.x" - name: Install Python dependencies run: | python -m pip install --upgrade pip pip install cibuildwheel==2.3.1 - name: Build wheels run: | python -m cibuildwheel --output-dir wheelhouse env: CIBW_BUILD: ${{ matrix.build }} CIBW_ARCHS_LINUX: ${{ matrix.arch }} CIBW_MANYLINUX_*_IMAGE: manylinux2014 CIBW_MANYLINUX_PYPY_X86_64_IMAGE: manylinux2014 CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: manylinux2014 CIBW_BEFORE_ALL_LINUX: > yum install -y epel-release && yum-config-manager --enable epel && yum install -y SDL2-devel CIBW_BEFORE_TEST: pip install numpy CIBW_TEST_COMMAND: python -c "import tcod.context" # Skip test on emulated architectures CIBW_TEST_SKIP: "*_aarch64" - name: Archive wheel uses: actions/upload-artifact@v3 with: name: wheels-linux path: wheelhouse/*.whl retention-days: 7 build-macos: needs: [black, isort, mypy] runs-on: "macos-11" strategy: fail-fast: true matrix: python: ["cp38-*_universal2", "cp38-*_x86_64", "cp38-*_arm64", "pp37-*"] steps: - uses: actions/checkout@v3 with: fetch-depth: ${{ env.git-depth }} - name: Checkout submodules run: git submodule update --init --recursive --depth 1 - name: Install Python dependencies run: pip3 install -r requirements.txt - name: Prepare package # Downloads SDL2 for the later step. run: python3 build_sdl.py - name: Build wheels uses: pypa/[email protected] env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS_MACOS: x86_64 arm64 universal2 CIBW_BEFORE_BUILD_MACOS: pip install --upgrade delocate CIBW_BEFORE_TEST: pip install numpy CIBW_TEST_COMMAND: python -c "import tcod.context" CIBW_TEST_SKIP: "pp* *-macosx_arm64 *-macosx_universal2:arm64" - name: Archive wheel uses: actions/upload-artifact@v3 with: name: wheels-macos path: wheelhouse/*.whl retention-days: 7 publish: needs: [sdist, build, build-macos, linux-wheels] runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') environment: name: release url: https://pypi.org/p/tcod permissions: id-token: write steps: - uses: actions/download-artifact@v3 with: name: sdist path: dist/ - uses: actions/download-artifact@v3 with: name: wheels-windows path: dist/ - uses: actions/download-artifact@v3 with: name: wheels-macos path: dist/ - uses: actions/download-artifact@v3 with: name: wheels-linux path: dist/ - uses: pypa/gh-action-pypi-publish@release/v1 with: skip-existing: true