Skip to content

Support (un)resolving topics #3633

Support (un)resolving topics

Support (un)resolving topics #3633

Workflow file for this run

name: Linting & tests
on:
push:
branches: [main]
tags: ["*"]
pull_request:
workflow_dispatch:
# Cancel previous runs within same workflow and if within a PR (all branch runs complete)
# (head_ref [branch name] is unique to and only for PRs, otherwise use always-unique run_id)
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read
env:
LINTING_PYTHON_VERSION: 3.8
jobs:
mypy:
runs-on: ubuntu-latest
name: Lint - Type consistency (mypy)
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Install with type-checking tools, stubs & minimal test libraries
run: pip install .[typing,testing_minimal]
- name: Run mypy
run: ./tools/run-mypy
ruff:
runs-on: ubuntu-latest
name: Lint - PEP8 & more (ruff)
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Install with linting tools
run: pip install .[linting]
- name: Run ruff
run: ruff zulipterminal/ tests/ setup.py `tools/python_tools.py`
isort:
runs-on: ubuntu-latest
name: Lint - Import order (isort)
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Install with linting tools & minimal test libraries
# NOTE: Install pytest so that isort recognizes it as a known library
run: pip install .[linting,minimal_testing]
- name: Run isort
run: ./tools/run-isort-check
black:
runs-on: ubuntu-latest
name: Lint - Code format (black)
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Install with linting tools
run: pip install .[linting]
- name: Check code & tests meet black standards
run: black --check zulipterminal/ tests/ setup.py `tools/python_tools.py`
spellcheck:
runs-on: ubuntu-latest
name: Lint - Spellcheck (codespell, typos)
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Install with linting tools
run: pip install .[linting]
- name: Check spelling
run: ./tools/run-spellcheck
hotkeys:
runs-on: ubuntu-latest
name: Lint - Hotkeys & docs sync (lint-hotkeys)
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Minimal install
run: pip install .
- name: Run lint-hotkeys
run: ./tools/lint-hotkeys
docstrings:
runs-on: ubuntu-latest
name: Lint - Docstrings & docs sync (lint-docstring)
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Minimal install
run: pip install .
- name: Run lint-docstring
run: ./tools/lint-docstring
gitlint:
runs-on: ubuntu-latest
name: Lint - Commit text format (gitlint)
steps:
- name: 'PR commits +1'
if: github.event_name == 'pull_request'
run: echo "PR_FETCH_DEPTH=$(( ${{ github.event.pull_request.commits }} + 1 ))" >> "${GITHUB_ENV}"
- name: 'Checkout PR branch and all PR commits'
if: github.event_name == 'pull_request'
uses: actions/checkout@v4
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: ${{ env.PR_FETCH_DEPTH }}
- uses: actions/setup-python@v5
if: github.event_name == 'pull_request'
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Install with gitlint
if: github.event_name == 'pull_request'
run: pip install .[gitlint]
- name: Run gitlint
if: github.event_name == 'pull_request'
run:
git fetch https://github.com/zulip/zulip-terminal main;
gitlint --commits FETCH_HEAD..${{ github.event.pull_request.head.sha }}
base_pytest:
runs-on: ubuntu-latest
name: Install & test - CPython 3.7 (ubuntu), codecov
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Install Python version
uses: actions/setup-python@v5
with:
python-version: 3.7
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Output Python version
run: python --version
- name: Upgrade pip
run: python -m pip install --upgrade pip
- name: Ensure regular package installs from checkout
run: pip install .
- name: Install test dependencies
run: pip install .[testing]
- name: Run tests with pytest
run: pytest --cov-report=xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
isolated-commits:
runs-on: ubuntu-latest
name: Ensure isolated PR commits
needs:
- mypy
- ruff
- isort
- black
- spellcheck
- hotkeys
- docstrings
- base_pytest
- gitlint
steps:
- uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- uses: actions/setup-python@v5
if: github.event_name == 'pull_request'
with:
python-version: ${{ env.LINTING_PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Run check-branch
if: github.event_name == 'pull_request'
# Note that we install at each step since dependencies may change
run:
git fetch https://github.com/zulip/zulip-terminal main;
CHECK="pip install .[linting,testing,typing] && ./tools/lint-all && pytest" ./tools/check-branch FETCH_HEAD
pytest-on-other-platforms:
needs: isolated-commits
strategy:
# Not failing fast allows all matrix jobs to try & finish even if one fails early
fail-fast: false
matrix:
env:
- {PYTHON: 3.8, OS: ubuntu-latest, NAME: "CPython 3.8 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: 3.9, OS: ubuntu-latest, NAME: "CPython 3.9 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: "3.10", OS: ubuntu-latest, NAME: "CPython 3.10 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: "3.11", OS: ubuntu-latest, NAME: "CPython 3.11 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: 'pypy-3.7', OS: ubuntu-latest, NAME: "PyPy 3.7 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: 'pypy-3.8', OS: ubuntu-latest, NAME: "PyPy 3.8 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: 'pypy-3.9', OS: ubuntu-latest, NAME: "PyPy 3.9 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: 'pypy-3.10', OS: ubuntu-latest, NAME: "PyPy 3.10 (ubuntu)", EXPECT: "Linux"}
- {PYTHON: '3.11', OS: macos-latest, NAME: "CPython 3.11 (macos)", EXPECT: "MacOS"}
env:
EXPECT: ${{ matrix.env.EXPECT }}
PYTHON: ${{ matrix.env.PYTHON }}
runs-on: ${{ matrix.env.OS }}
name: Install & test - ${{ matrix.env.NAME}}
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Install Python version ${{ matrix.env.PYTHON }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.env.PYTHON }}
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Output Python version
run: python --version
- name: Upgrade pip
run: python -m pip install --upgrade pip
- name: Ensure libxml-related libraries are installed (some pypy versions don't have wheels)
if: startsWith(matrix.env.PYTHON, 'pypy-')
run: sudo apt install libxml2-dev libxslt1-dev
- name: Ensure regular package installs from checkout
run: pip install .
- name: Check we detect the python environment correctly
run: python -c "from zulipterminal.platform_code import detected_python_short; import os; e, d = os.environ['PYTHON'], detected_python_short(); assert d == e, f'{d} != {e}'"
- name: Check we detect the platform correctly
run: python -c "from zulipterminal.platform_code import detected_platform; import os; e, d = os.environ['EXPECT'], detected_platform(); assert d == e, f'{d} != {e}'"
- name: Install test dependencies
run: pip install .[testing]
- name: Run tests with pytest
run: pytest --cov-report=