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@v2
    - name: Set up Python 3.8
      uses: actions/setup-python@v1
      with:
        python-version: "3.8"
    - uses: pre-commit/action@v2.0.0

  tests:

    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.7", "3.8", "3.9", "3.10"]
        sphinx: [">=5,<6"]
        os: [ubuntu-latest]
        include:
        - os: ubuntu-latest
          python-version: "3.8"
          sphinx: ">=4,<5"
        - os: windows-latest
          python-version: "3.8"
          sphinx: ">=4,<5"

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

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v1
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -e .[linkify,testing]
        pip install --upgrade-strategy "only-if-needed" "sphinx${{ matrix.sphinx }}"
    - name: Run pytest
      run: |
        pytest --cov=myst_parser --cov-report=xml --cov-report=term-missing
        coverage xml
    - name: Upload to Codecov
      if: github.repository == 'executablebooks/MyST-Parser' && matrix.python-version == 3.8
      uses: codecov/codecov-action@v1
      with:
        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.17", "0.18", "0.19"]

    steps:
    - name: Checkout source
      uses: actions/checkout@v2
    - name: Set up Python 3.8
      uses: actions/setup-python@v1
      with:
        python-version: "3.8"
    - 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 .
        pip install pytest~=6.2 pytest-param-files~=0.3.3 pygments 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
    - name: Run docutils CLI
      run: echo "test" | myst-docutils-html

  publish:

    name: Publish myst-parser to PyPi
    needs: [pre-commit, tests, check-myst-docutils]
    if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
    runs-on: ubuntu-latest
    steps:
    - name: Checkout source
      uses: actions/checkout@v2
    - name: Set up Python 3.8
      uses: actions/setup-python@v1
      with:
        python-version: "3.8"
    - 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@v2
    - name: Set up Python 3.8
      uses: actions/setup-python@v1
      with:
        python-version: "3.8"
    - 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 }}
