name: Continuous Deployment

on:
  push:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint-python:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: '3.9'

      - name: Install flake8
        run: pip install flake8

      - name: Run flake8
        run: flake8 bakery

  test-python:
    strategy:
      matrix:
        python: ['3.8', '3.9', '3.10', '3.11']
        django: ['2.2', '3.2', '4.2', '5.0']
        exclude:
        - python: '3.8'
          django: '5.0'
        - python: '3.9'
          django: '5.0'
    name: Test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python }}
          cache: 'pipenv'

      - name: Install pipenv
        run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python

      - name: Install Python dependencies
        run: |
            pipenv install --skip-lock --python=${{ matrix.python }}
            pipenv install moto Django~=${{ matrix.django }} --skip-lock --python=${{ matrix.python }}
        shell: bash

      - name: Run
        run: pipenv run python setup.py test
        shell: bash
        env:
          AWS_ACCESS_KEY_ID: 'MOCK_ACCESS_KEY_ID'
          AWS_SECRET_ACCESS_KEY: 'MOCK_SECRET_ACCESS_KEY'

  test-build:
    name: Build Python package
    runs-on: ubuntu-latest
    needs: [test-python]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: '3.9'
          cache: 'pipenv'

      - name: Install pipenv
        run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python

      - name: Install Python dependencies
        run: pipenv sync --dev
        shell: bash

      - name: Build release
        run: |
            pipenv run python setup.py sdist
            pipenv run python setup.py bdist_wheel
            ls -l dist

      - name: Check release
        run: pipenv run twine check dist/*

      - name: Save artifact
        uses: actions/upload-artifact@v4
        with:
          name: release-candidate
          path: ./dist
          if-no-files-found: error

  tag-release:
    name: Tagged PyPI release
    runs-on: ubuntu-latest
    needs: [test-build]
    if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
    steps:
      - id: fetch
        name: Fetch artifact
        uses: actions/download-artifact@v4
        with:
          name: release-candidate
          path: ./dist

      - name: Publish release
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}
          verbose: true
          verify_metadata: false
