name: CI # The Python side (src/ml training/evaluation stack, archive backfills), on # every push and PR to master: # 1. formatting contract (black + isort, config in pyproject.toml) # 2. flake8 hard-error gate (syntax, undefined names) # 3. the pytest suite: synthetic data, no network; the database tests run # against a throwaway PostgreSQL service (TEST_DATABASE_URL, as in rust.yml) # The service itself (ping-collector) is checked by rust.yml. Production is a # systemd unit deployed by `git pull` + scripts/install.sh on the server. on: push: branches: [master, develop] pull_request: branches: [master] schedule: # daily, catches dependency drift - cron: "0 2 * * *" workflow_dispatch: env: PYTHON_VERSION: "3.11" # pandas 2.0.3 ships no 3.12 wheels; psycopg2-binary 2.9.9 breaks on 3.13 jobs: lint: name: Format & lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} cache: pip cache-dependency-path: requirements-dev.txt - name: Install tools run: | python -m pip install --upgrade pip --root-user-action=ignore pip install --root-user-action=ignore black==26.5.1 isort==5.12.0 flake8==6.1.0 - name: black run: black --check --diff src/ scripts/ tests/ rust/forecast/testdata rust/collector/testdata - name: isort run: isort --check-only --diff src/ scripts/ tests/ - name: flake8 (errors only) run: flake8 src/ scripts/ tests/ --count --select=E9,F63,F7,F82 --show-source --statistics test: name: Test suite runs-on: ubuntu-latest services: postgres: image: postgres:16 env: POSTGRES_PASSWORD: ping POSTGRES_DB: ping options: >- --health-cmd pg_isready --health-interval 5s --health-timeout 5s --health-retries 20 env: TEST_DATABASE_URL: postgres://postgres:ping@postgres:5432/ping steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} cache: pip cache-dependency-path: | requirements.txt requirements-dev.txt - name: Install dependencies run: | python -m pip install --upgrade pip --root-user-action=ignore pip install --root-user-action=ignore -r requirements.txt pytest==9.1.1 - name: pytest run: pytest -q -p no:cacheprovider -rs