[V5] CLI 2.0 - Pluggable Backends, Non-TTY Default, HTTP Dispatcher, Spec Files + Codegen #10
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 📦 publish openbb-technical | |
| # Triggers exclusively on the merge of a ``release/openbb-technical-v*`` | |
| # branch into ``develop``. Four sequential jobs — version-check, | |
| # build, test, publish — with PyPI OIDC trusted publishing. | |
| on: | |
| pull_request: | |
| types: [closed] | |
| branches: [develop, v5] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| version-check: | |
| name: Verify version bump | |
| if: ${{ (github.event_name == 'pull_request' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/openbb-technical-v')) || github.event_name == 'workflow_dispatch' }} | |
| runs-on: ubuntu-latest | |
| outputs: | |
| version: ${{ steps.parse.outputs.version }} | |
| defaults: | |
| run: | |
| shell: bash | |
| working-directory: openbb_platform/extensions/technical | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| ref: develop | |
| - name: Parse [project].version from pyproject.toml | |
| id: parse | |
| run: | | |
| VERSION=$(grep -m1 -E '^version[[:space:]]*=' pyproject.toml | sed -E 's/^version[[:space:]]*=[[:space:]]*"([^"]+)".*/\1/') | |
| if [ -z "$VERSION" ]; then | |
| echo "::error::Could not parse [project].version from pyproject.toml." | |
| exit 1 | |
| fi | |
| echo "Local version: $VERSION" | |
| echo "version=$VERSION" >> "$GITHUB_OUTPUT" | |
| - name: Fail if version already exists on PyPI | |
| env: | |
| VERSION: ${{ steps.parse.outputs.version }} | |
| run: | | |
| STATUS=$(curl -sS -o /dev/null -w "%{http_code}" "https://pypi.org/pypi/openbb-technical/${VERSION}/json") | |
| case "$STATUS" in | |
| 200) | |
| echo "::error::openbb-technical ${VERSION} is already published on PyPI." | |
| echo "Bump openbb_platform/extensions/technical/pyproject.toml [project].version and re-merge a fresh release branch." | |
| exit 1 | |
| ;; | |
| 404) | |
| echo "openbb-technical ${VERSION} is not yet on PyPI — proceeding." | |
| ;; | |
| *) | |
| echo "::error::Unexpected status $STATUS from PyPI JSON API. Aborting to avoid a silent skip." | |
| exit 1 | |
| ;; | |
| esac | |
| - name: Verify release branch name matches pyproject version | |
| if: github.event_name == 'pull_request' | |
| env: | |
| VERSION: ${{ steps.parse.outputs.version }} | |
| BRANCH: ${{ github.event.pull_request.head.ref }} | |
| run: | | |
| EXPECTED="release/openbb-technical-v${VERSION}" | |
| if [ "$BRANCH" != "$EXPECTED" ]; then | |
| echo "::error::Release branch '${BRANCH}' does not match pyproject version '${VERSION}'." | |
| echo "Expected branch name: '${EXPECTED}'." | |
| echo "Either rename the release branch or update [project].version in pyproject.toml so they agree." | |
| exit 1 | |
| fi | |
| echo "Branch '${BRANCH}' matches pyproject version '${VERSION}'." | |
| build: | |
| name: Build sdist + wheel | |
| needs: version-check | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| shell: bash | |
| working-directory: openbb_platform/extensions/technical | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| ref: develop | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: "3.11" | |
| - run: python -m pip install --upgrade pip uv | |
| - name: Build sdist + wheel | |
| run: uv build --no-sources | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: openbb-technical-dist | |
| path: openbb_platform/extensions/technical/dist/ | |
| if-no-files-found: error | |
| retention-days: 7 | |
| test: | |
| name: Test (${{ matrix.os }} / Python ${{ matrix.python_version }}) | |
| needs: build | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - { 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" } | |
| - { 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" } | |
| runs-on: ${{ matrix.os }} | |
| defaults: | |
| run: | |
| shell: bash | |
| working-directory: openbb_platform/extensions/technical | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| ref: develop | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: ${{ matrix.python_version }} | |
| allow-prereleases: true | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: openbb-technical-dist | |
| path: openbb_platform/extensions/technical/dist | |
| - run: python -m pip install --upgrade pip uv | |
| - name: Install openbb-technical from source (+ dev group) | |
| # Source install via ``-e .`` reads ``[tool.uv.sources]`` and | |
| # resolves ``openbb-core[pandas]`` from the sibling tree at | |
| # ``../../core``. Installing the wheel directly would fail | |
| # dependency resolution until ``openbb-core>=2.0.0`` ships to | |
| # PyPI; the wheel is still the artifact uploaded to PyPI by | |
| # the ``publish`` job — this matrix validates the source the | |
| # wheel was built from. | |
| run: | | |
| uv pip install --system -e . | |
| uv pip install --system --group dev | |
| - name: Run unit tests | |
| run: pytest tests --cov=openbb_technical --cov-report=term-missing --cov-fail-under=100 | |
| publish: | |
| name: Publish to PyPI | |
| needs: test | |
| runs-on: ubuntu-latest | |
| environment: pypi-openbb-technical | |
| permissions: | |
| id-token: write | |
| steps: | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: openbb-technical-dist | |
| path: dist | |
| - uses: pypa/gh-action-pypi-publish@release/v1 | |
| with: | |
| packages-dir: dist |