name: continuous-integration

on:
  push:
    branches: [master]
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+*"
  pull_request:

jobs:
  pre-commit:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v6
    - name: Set up Python 3.11
      uses: actions/setup-python@v6
      with:
        python-version: "3.11"
    - uses: pre-commit/action@v3.0.1

  tests:

    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.11", "3.12", "3.13", "3.14"]
        sphinx: [">=8,<9", ">=9,<10"]
        os: [ubuntu-latest]
        include:
        - os: windows-latest
          python-version: "3.11"
          sphinx: ">=8,<9"
        - os: windows-latest
          python-version: "3.14"
          sphinx: ">=9,<10"

    runs-on: ${{ matrix.os }}

    name: "pytest: py${{ matrix.python-version }}, sphinx${{ matrix.sphinx }}, on ${{ matrix.os }}"

    steps:
    - uses: actions/checkout@v6
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
        allow-prereleases: true
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -e ".[linkify,testing]" "sphinx${{ matrix.sphinx }}"
    - name: Run pytest
      run: pytest --cov=myst_parser --cov-report=xml --cov-report=term-missing
    - name: Create coverage report
      run: coverage xml
    # TODO there is currently problem with this action and pull-requests from external forks
    # - name: Upload to Codecov
    #   if: github.repository == 'executablebooks/MyST-Parser' && matrix.python-version == 3.11 && matrix.os == 'ubuntu-latest'
    #   uses: codecov/codecov-action@v4
    #   with:
    #     token: ${{ secrets.CODECOV_TOKEN }}
    #     name: myst-parser-pytests
    #     flags: pytests
    #     file: ./coverage.xml
    #     fail_ci_if_error: true

  check-myst-docutils:

    name: Check myst-docutils install
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        docutils-version: ["0.20", "0.21", "0.22"]

    steps:
    - name: Checkout source
      uses: actions/checkout@v6
    - name: Set up Python 3.11
      uses: actions/setup-python@v6
      with:
        python-version: "3.11"
    - name: Install setup
      run: |
        python -m pip install --upgrade pip
        pip install tomlkit
    - name: Modify setup
      run: python .github/workflows/docutils_setup.py pyproject.toml README.md
    - name: Install dependencies
      run: |
        pip install .[linkify,testing-docutils] docutils==${{ matrix.docutils-version }}
    - name: ensure sphinx is not installed
      run: |
        python -c "\
        try:
            import sphinx
        except ImportError:
            pass
        else:
            raise AssertionError()"
    - name: Run pytest for docutils-only tests
      run: pytest tests/test_docutils.py tests/test_renderers/test_fixtures_docutils.py tests/test_renderers/test_include_directive.py tests/test_renderers/test_myst_config.py
    - name: Run docutils CLI
      run: echo "test" | myst-docutils-html

  # https://github.com/marketplace/actions/alls-green#why
  check:  # This job does nothing and is only used for the branch protection

    if: always()

    needs:
    - pre-commit
    - tests
    - check-myst-docutils

    runs-on: ubuntu-latest

    steps:
    - name: Decide whether the needed jobs succeeded or failed
      uses: re-actors/alls-green@release/v1
      with:
        jobs: ${{ toJSON(needs) }}

  publish:

    name: Publish myst-parser to PyPi
    needs:
    - check
    if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
    runs-on: ubuntu-latest
    steps:
    - name: Checkout source
      uses: actions/checkout@v6
    - name: Set up Python 3.11
      uses: actions/setup-python@v6
      with:
        python-version: "3.11"
    - name: install flit
      run: |
        pip install flit~=3.4
    - name: Build and publish
      run: |
        flit publish
      env:
        FLIT_USERNAME: __token__
        FLIT_PASSWORD: ${{ secrets.PYPI_KEY }}

  publish-docutils:

    name: Publish myst-docutils to PyPi
    needs: [publish]
    if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
    runs-on: ubuntu-latest
    steps:
    - name: Checkout source
      uses: actions/checkout@v6
    - name: Set up Python 3.11
      uses: actions/setup-python@v6
      with:
        python-version: "3.11"
    - name: install flit and tomlkit
      run: |
        pip install flit~=3.4 tomlkit
    - name: Modify setup
      run: python .github/workflows/docutils_setup.py pyproject.toml README.md
    - name: Build and publish
      run: |
        flit publish
      env:
        FLIT_USERNAME: __token__
        FLIT_PASSWORD: ${{ secrets.PYPI_KEY_DOCUTILS }}
