Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
270 changes: 94 additions & 176 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
@@ -1,181 +1,99 @@
# # This file is autogenerated by maturin v1.7.4
# # To update, run
# #
# # maturin generate-ci github
# #
# name: CI
name: Package checks

# on:
# push:
# branches:
# - main
# - master
# tags:
# - '*'
# pull_request:
# workflow_dispatch:
on:
pull_request:
paths: ['crates/**', 'Cargo.toml', 'Cargo.lock', 'scripts/**', '.github/workflows/CI.yml', '.github/workflows/publish.yml']
push:
branches: [main]
paths: ['crates/**', 'Cargo.toml', 'Cargo.lock', 'scripts/**', '.github/workflows/CI.yml', '.github/workflows/publish.yml']
workflow_dispatch:
workflow_call:

# permissions:
# contents: read
permissions:
contents: read

# jobs:
# linux:
# runs-on: ${{ matrix.platform.runner }}
# strategy:
# matrix:
# platform:
# - runner: ubuntu-latest
# target: x86_64
# - runner: ubuntu-latest
# target: x86
# - runner: ubuntu-latest
# target: aarch64
# - runner: ubuntu-latest
# target: armv7
# - runner: ubuntu-latest
# target: s390x
# - runner: ubuntu-latest
# target: ppc64le
# steps:
# - uses: actions/checkout@v4
# - uses: actions/setup-python@v5
# with:
# python-version: 3.x
# - name: Build wheels
# uses: PyO3/maturin-action@v1
# with:
# target: ${{ matrix.platform.target }}
# args: --release --out dist --find-interpreter
# sccache: 'true'
# manylinux: auto
# - name: Upload wheels
# uses: actions/upload-artifact@v4
# with:
# name: wheels-linux-${{ matrix.platform.target }}
# path: dist
jobs:
rust:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: python scripts/check-release-version.py
- uses: dtolnay/rust-toolchain@master
with:
toolchain: '1.88.0'
- uses: Swatinem/rust-cache@v2
- run: cargo test --workspace --exclude superstac-python --locked

# musllinux:
# runs-on: ${{ matrix.platform.runner }}
# strategy:
# matrix:
# platform:
# - runner: ubuntu-latest
# target: x86_64
# - runner: ubuntu-latest
# target: x86
# - runner: ubuntu-latest
# target: aarch64
# - runner: ubuntu-latest
# target: armv7
# steps:
# - uses: actions/checkout@v4
# - uses: actions/setup-python@v5
# with:
# python-version: 3.x
# - name: Build wheels
# uses: PyO3/maturin-action@v1
# with:
# target: ${{ matrix.platform.target }}
# args: --release --out dist --find-interpreter
# sccache: 'true'
# manylinux: musllinux_1_2
# - name: Upload wheels
# uses: actions/upload-artifact@v4
# with:
# name: wheels-musllinux-${{ matrix.platform.target }}
# path: dist
wheels:
name: Wheel (${{ matrix.target }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-24.04
target: x86_64-unknown-linux-gnu
- runner: ubuntu-24.04-arm
target: aarch64-unknown-linux-gnu
- runner: macos-15-intel
target: x86_64-apple-darwin
- runner: macos-14
target: aarch64-apple-darwin
- runner: windows-latest
target: x86_64-pc-windows-msvc
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
rust-toolchain: '1.88.0'
maturin-version: '1.13.3'
manylinux: '2_28'
args: --release --locked --manifest-path crates/python/Cargo.toml --out dist
- name: Check and install the wheel
shell: bash
run: |
python -m pip install twine
python -m twine check --strict dist/*
python -m pip install --no-deps --force-reinstall dist/*.whl
- name: Test the installed wheel
run: python -m unittest discover -s crates/python/tests -v
- uses: actions/upload-artifact@v4
with:
name: wheels-${{ matrix.target }}
path: dist/*.whl
if-no-files-found: error

# windows:
# runs-on: ${{ matrix.platform.runner }}
# strategy:
# matrix:
# platform:
# - runner: windows-latest
# target: x64
# - runner: windows-latest
# target: x86
# steps:
# - uses: actions/checkout@v4
# - uses: actions/setup-python@v5
# with:
# python-version: 3.x
# architecture: ${{ matrix.platform.target }}
# - name: Build wheels
# uses: PyO3/maturin-action@v1
# with:
# target: ${{ matrix.platform.target }}
# args: --release --out dist --find-interpreter
# sccache: 'true'
# - name: Upload wheels
# uses: actions/upload-artifact@v4
# with:
# name: wheels-windows-${{ matrix.platform.target }}
# path: dist

# macos:
# runs-on: ${{ matrix.platform.runner }}
# strategy:
# matrix:
# platform:
# - runner: macos-12
# target: x86_64
# - runner: macos-14
# target: aarch64
# steps:
# - uses: actions/checkout@v4
# - uses: actions/setup-python@v5
# with:
# python-version: 3.x
# - name: Build wheels
# uses: PyO3/maturin-action@v1
# with:
# target: ${{ matrix.platform.target }}
# args: --release --out dist --find-interpreter
# sccache: 'true'
# - name: Upload wheels
# uses: actions/upload-artifact@v4
# with:
# name: wheels-macos-${{ matrix.platform.target }}
# path: dist

# sdist:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v4
# - name: Build sdist
# uses: PyO3/maturin-action@v1
# with:
# command: sdist
# args: --out dist
# - name: Upload sdist
# uses: actions/upload-artifact@v4
# with:
# name: wheels-sdist
# path: dist

# release:
# name: Release
# runs-on: ubuntu-latest
# if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
# needs: [linux, musllinux, windows, macos, sdist]
# permissions:
# # Use to sign the release artifacts
# id-token: write
# # Used to upload release artifacts
# contents: write
# # Used to generate artifact attestation
# attestations: write
# steps:
# - uses: actions/download-artifact@v4
# - name: Generate artifact attestation
# uses: actions/attest-build-provenance@v1
# with:
# subject-path: 'wheels-*/*'
# - name: Publish to PyPI
# if: "startsWith(github.ref, 'refs/tags/')"
# uses: PyO3/maturin-action@v1
# env:
# MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
# with:
# command: upload
# args: --non-interactive --skip-existing wheels-*/*
sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.9'
- uses: dtolnay/rust-toolchain@master
with:
toolchain: '1.88.0'
- uses: PyO3/maturin-action@v1
with:
command: sdist
maturin-version: '1.13.3'
args: --manifest-path crates/python/Cargo.toml --out dist
- name: Build and test from the source archive on Python 3.9
run: |
python -m pip install twine
python -m twine check --strict dist/*
python -m pip wheel --no-deps --wheel-dir rebuilt dist/*.tar.gz
python -m pip install --no-deps rebuilt/*.whl
python -m unittest discover -s crates/python/tests -v
- uses: actions/upload-artifact@v4
with:
name: python-sdist
path: dist/*.tar.gz
if-no-files-found: error
75 changes: 57 additions & 18 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,62 @@
# name: Publish to PyPI
name: Publish packages

# on:
# push:
# tags:
# - "v*.*.*"
on:
release:
types: [published]

# jobs:
# build:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v4
permissions:
contents: read

# - name: Install uv
# run: curl -LsSf https://astral.sh/uv/install.sh | sh
concurrency:
group: publish-packages
cancel-in-progress: false

# - name: Build package
# run: uv build
jobs:
checks:
uses: ./.github/workflows/CI.yml

# - name: Publish to PyPI
# uses: pypa/gh-action-pypi-publish@release/v1
# with:
# password: ${{ secrets.PYPI_API_TOKEN }}
crates:
needs: checks
runs-on: ubuntu-latest
environment: crates-io
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: dtolnay/rust-toolchain@master
with:
toolchain: '1.88.0'
- name: Publish Rust crates in dependency order
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: |
test -n "$CARGO_REGISTRY_TOKEN" || { echo 'Set CARGO_REGISTRY_TOKEN in Actions secrets'; exit 1; }
python scripts/check-release-version.py
python scripts/publish-crates.py

pypi:
needs: [checks, crates]
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/superstac
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: wheels-*
merge-multiple: true
path: dist
- uses: actions/download-artifact@v4
with:
name: python-sdist
path: dist
- name: Publish Python distributions
uses: pypa/gh-action-pypi-publish@release/v1
with:
# Omit the secret to use PyPI Trusted Publishing; existing API tokens also work.
password: ${{ secrets.PYPI_API_TOKEN }}
skip-existing: true
attestations: false
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,26 @@ releases.

## [Unreleased]

## [0.2.0] - 2026-09-27

### Added
- First Rust-backed Python distribution with synchronous `Client`, `AsyncClient`,
native dictionary results, configuration, discovery, and search metadata.
- Documentation at https://spatialnode.com/superstac, with Python, Rust, CLI,
configuration guides, and a runnable notebook.
- Release automation for Python wheels, a source distribution, and Rust crates.

### Changed
- The PyPI package replaces the legacy 0.1.0a2 Python implementation. This is a
breaking migration; use the new client API rather than assuming compatibility.
- Python requires CPython 3.9+. Maturin is a build dependency only.
- All Rust crate versions advance together to 0.2.0 and link to the docs site.

### Fixed
- Python bindings import configuration types from their current Rust module.
- Python `Search` now returns an iterator from `__iter__`.
- Python type hints include constructor keyword options and `to_geojson()`.

## [0.1.0] - 2026-05-21

Initial public release.
Expand Down
Loading
Loading