name: 🖥️ openbb-cli on: pull_request: branches: - develop - v5 paths: - 'cli/**' - '.github/workflows/test-unit-cli.yml' push: branches: - develop - v5 paths: - 'cli/**' - '.github/workflows/test-unit-cli.yml' merge_group: types: [checks_requested] workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true defaults: run: shell: bash working-directory: cli jobs: test: name: Test (${{ matrix.os }} / Python ${{ matrix.python_version }}) runs-on: ${{ matrix.os }} env: OPENBB_ALLOW_ON_COMMAND_OUTPUT: "True" OPENBB_ALLOW_MUTABLE_EXTENSIONS: "True" UV_CACHE_DIR: ${{ github.workspace }}/.uv-cache permissions: contents: read strategy: fail-fast: false matrix: include: # Linux: full sweep across every supported Python. - { os: ubuntu-latest, python_version: "3.10" } - { os: ubuntu-latest, python_version: "3.11" } - { os: ubuntu-latest, python_version: "3.12" } - { os: ubuntu-latest, python_version: "3.13" } - { os: ubuntu-latest, python_version: "3.14" } # macOS and Windows: min and max supported. - { os: macos-latest, python_version: "3.10" } - { os: macos-latest, python_version: "3.14" } - { os: windows-latest, python_version: "3.10" } - { os: windows-latest, python_version: "3.14" } steps: - name: Checkout code uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: Install Python ${{ matrix.python_version }} uses: actions/setup-python@v6 with: python-version: ${{ matrix.python_version }} allow-prereleases: true cache: "pip" - name: Cache uv (built wheels — scipy/numpy/pandas source builds) uses: actions/cache@v4 with: path: ${{ github.workspace }}/.uv-cache key: uv-${{ runner.os }}-py${{ matrix.python_version }}-${{ hashFiles('cli/pyproject.toml', 'cli/uv.lock', 'openbb_platform/core/pyproject.toml', 'openbb_platform/obbject_extensions/charting/pyproject.toml', 'openbb_platform/extensions/devtools/pyproject.toml') }} restore-keys: | uv-${{ runner.os }}-py${{ matrix.python_version }}- - name: Install gfortran + OpenBLAS (macOS, prerelease Python — scipy source build) if: runner.os == 'macOS' && matrix.python_version == '3.15' shell: bash working-directory: . run: | set -euo pipefail brew install gcc openblas pkg-config GFORTRAN_BIN=$(ls /opt/homebrew/opt/gcc/bin/gfortran-* | tail -1) GFORTRAN_DIR=$(dirname "$GFORTRAN_BIN") ln -sf "$GFORTRAN_BIN" "$GFORTRAN_DIR/gfortran" echo "$GFORTRAN_DIR" >> "$GITHUB_PATH" "$GFORTRAN_DIR/gfortran" --version OPENBLAS_PC="$(brew --prefix openblas)/lib/pkgconfig" echo "PKG_CONFIG_PATH=$OPENBLAS_PC" >> "$GITHUB_ENV" PKG_CONFIG_PATH="$OPENBLAS_PC" pkg-config --modversion openblas - name: Install gfortran (Linux, prerelease Python — scipy source build) if: runner.os == 'Linux' && matrix.python_version == '3.15' shell: bash working-directory: . run: | set -euo pipefail sudo apt-get update -y sudo apt-get install -y gfortran libopenblas-dev liblapack-dev gfortran --version - name: Install openbb-cli run: | python -m pip install --upgrade pip uv python -m uv pip install --system -e ".[charting]" --group dev - name: Run unit tests run: | python -m pytest tests \ --cov=openbb_cli \ --cov-config=.coveragerc \ --cov-report=term-missing \ --cov-report=xml:coverage-unit.xml - name: Upload unit-test coverage artifact if: always() uses: actions/upload-artifact@v4 with: name: openbb-cli-coverage-unit-${{ matrix.os }}-py${{ matrix.python_version }} path: cli/coverage-unit.xml