Skip to main content

The power of Rust for the Python STAC ecosystem

Project description

rustac

GitHub Workflow Status GitHub Workflow Status PyPI - Version PyPI - License Contributor Covenant

A Python package for STAC using Rust under the hood.

[!TIP] While you can pronounce "rustac" however you'd like, we like "ruh-stac".

Why?

Q: We already have PySTAC, so why rustac?

A: rustac can

If you don't need those things, rustac probably isn't for you — use pystac and its friend, pystac-client.

Installation

Install via pip:

# basic
python -m pip install rustac

# support arrow tables
python -m pip install 'rustac[arrow]'

Or via conda:

conda install conda-forge::rustac

From source

By default, rustac wants to find DuckDB on your system:

brew install duckdb  # if you're using Homebrew ... if not, get DuckDB another way
python -m pip install -U git+https://github.com/stac-utils/rustac-py

If you don't want to (or can't) install DuckDB, can build DuckDB as a "bundled" build (warning: it takes a while):

MATURIN_PEP517_ARGS="--features=duckdb-bundled" python -m pip install -U git+https://github.com/stac-utils/rustac-py

Usage

import asyncio
import rustac

async def main() -> None:
    # Search a STAC API
    items = await rustac.search(
        "https://landsatlook.usgs.gov/stac-server",
        collections="landsat-c2l2-sr",
        intersects={"type": "Point", "coordinates": [-105.119, 40.173]},
        sortby="-properties.datetime",
        max_items=100,
    )

    # If you installed with `pystac[arrow]`:
    from geopandas import GeoDataFrame

    table = rustac.to_arrow(items)
    data_frame = GeoDataFrame.from_arrow(table)
    items = rustac.from_arrow(data_frame.to_arrow())

    # Write items to a stac-geoparquet file
    await rustac.write("/tmp/items.parquet", items)

    # Read items from a stac-geoparquet file as an item collection
    item_collection = await rustac.read("/tmp/items.parquet")

    # Use `search_to` for better performance if you know you'll be writing the items
    # to a file
    await rustac.search_to(
        "/tmp/items.parquet",
        "https://landsatlook.usgs.gov/stac-server",
        collections="landsat-c2l2-sr",
        intersects={"type": "Point", "coordinates": [-105.119, 40.173]},
        sortby="-properties.datetime",
        max_items=100,
    )

asyncio.run(main())

See the documentation for details. In particular, our examples demonstrate some of the more interesting features.

Command line interface (CLI)

rustac comes with a CLI:

rustac -h

stac-geoparquet

rustac replicates much of the behavior in the stac-geoparquet library, and even uses some of the same Rust dependencies. We believe there are a couple of issues with stac-geoparquet that make rustac a worthy replacement:

  • The stac-geoparquet repo includes Python dependencies
  • It doesn't have a nice one-shot API for reading and writing
  • It includes some leftover code and logic from its genesis as a tool for the Microsoft Planetary Computer

We test to ensure compatibility between the two libraries, and we intend to consolidate to a single "stac-geoparquet" library at some point in the future.

Development

Get Rust, uv, and (optionally) libduckdb. Then:

git clone git@github.com:stac-utils/rustac-py.git
cd rustac-py
scripts/test

See CONTRIBUTING.md for more information about contributing to this project.

DuckDB

By default, this package expects libduckdb to be present on your system. If you get this sort of error when building:

  = note: ld: library 'duckdb' not found

Set your DUCKDB_LIB_DIR to point to your libduckdb. If you're using homebrew, that might look like this:

export DUCKDB_LIB_DIR=/opt/homebrew/lib

Alternatively, you can use the duckdb-bundled feature to build DuckDB bindings into the Rust library:

maturin dev --uv -F duckdb-bundled && pytest

[!WARNING] Building DuckDB bundled takes a long while.

Docs

If you want to run an off-cycle docs update (e.g. if you fixed something and want to post it without having to make a new release):

mike deploy [version] latest --push

License

rustac-py is dual-licensed under both the MIT license and the Apache license (Version 2.0). See LICENSE-APACHE and LICENSE-MIT for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rustac-0.7.0b4.tar.gz (378.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rustac-0.7.0b4-cp311-abi3-manylinux_2_28_aarch64.whl (20.7 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ ARM64

rustac-0.7.0b4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (22.9 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

rustac-0.7.0b4-cp311-abi3-macosx_11_0_arm64.whl (19.0 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

rustac-0.7.0b4-cp311-abi3-macosx_10_12_x86_64.whl (20.8 MB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

Details for the file rustac-0.7.0b4.tar.gz.

File metadata

  • Download URL: rustac-0.7.0b4.tar.gz
  • Upload date:
  • Size: 378.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.8.3

File hashes

Hashes for rustac-0.7.0b4.tar.gz
Algorithm Hash digest
SHA256 89e2763c94fb49a820b8d0f63cb0456f77dcdceb72e7258e9032e1536ebe017a
MD5 39ee1f231ec1c2cc9cd7113016d53d5e
BLAKE2b-256 44ec12cb5a9aa53e9aeb858fbcfbbc3c22c4b06ffb9c0939abb14780843e711b

See more details on using hashes here.

File details

Details for the file rustac-0.7.0b4-cp311-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rustac-0.7.0b4-cp311-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ebbc6406a24359e98cdc351f48cc139fac876cc997016fa0213da7bf668e15af
MD5 77ea3f2b9d78c48c87820ea377eec2da
BLAKE2b-256 a0f8fbaa11452626e324eb52e08ab3820f19fcccdc989b3af2a6a010427ae336

See more details on using hashes here.

File details

Details for the file rustac-0.7.0b4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustac-0.7.0b4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7d694354de918750446f8602ee3b9005ae0d6b9e6b3519ed6d53a62e1a8bdd8b
MD5 fee2f31a3a755c8f6f8028e39c36e370
BLAKE2b-256 7adebb0fca1c0e60209ea330e4eaf2ada750253c0c0a05a7ab04240c02e05757

See more details on using hashes here.

File details

Details for the file rustac-0.7.0b4-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustac-0.7.0b4-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 33b1d5ef76a9edbe385c7d55751ea194ff13df296860a7e8cc29799245819419
MD5 945405f1b43a78f2084b8932df58e1dd
BLAKE2b-256 928c5de97bb3abadc9a703c4c9397b58a2934b72715a0278e5bc81c7ab54230d

See more details on using hashes here.

File details

Details for the file rustac-0.7.0b4-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustac-0.7.0b4-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f243eff9809046eda48bb71148d01d858840280f92aadba548320304ac0883f0
MD5 76e7ab5a81696451e4b3b82ce3741797
BLAKE2b-256 9b19a520e12a1c7f06f9a508ce2f06dc2bf4e9e109c03cafd78de824fb1a8054

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page