Metadata-Version: 2.5
Name: portolan-cli
Version: 1.0.0b0
Summary: A CLI tool for managing cloud-native geospatial data
Project-URL: Homepage, https://github.com/portolan-sdi/portolan-cli
Project-URL: Bug Tracker, https://github.com/portolan-sdi/portolan-cli/issues
Project-URL: Documentation, https://github.com/portolan-sdi/portolan-cli#readme
Project-URL: Source, https://github.com/portolan-sdi/portolan-cli
Author-email: Nissim Lebovits <nlebovits@pm.me>
License-Expression: Apache-2.0
License-File: LICENSE
Keywords: cloud-native,geospatial,gis,io
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: GIS
Requires-Python: >=3.10
Requires-Dist: antimeridian>=0.3.11
Requires-Dist: click<8.5,>=8.4
Requires-Dist: cryptography>=46.0.7
Requires-Dist: defusedxml>=0.7.1
Requires-Dist: duckdb<1.5.5,>=1.5.2
Requires-Dist: geopandas>=0.14.0
Requires-Dist: geoparquet-io>=1.4.0
Requires-Dist: httpx>=0.27.0
Requires-Dist: lxml>=6.1.0
Requires-Dist: matplotlib>=3.8.0
Requires-Dist: numpy>=1.24.0
Requires-Dist: obstore>=0.8.2
Requires-Dist: pillow>=12.3.0
Requires-Dist: pmtiles>=3.0.0
Requires-Dist: pyarrow<26.0.0,>=12.0.0
Requires-Dist: pygments>=2.20.0
Requires-Dist: pyogrio>=0.7.0
Requires-Dist: pyproj>=3.0.0
Requires-Dist: pystac>=1.10.0
Requires-Dist: python-dotenv>=1.0.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: rashid<0.2.0,>=0.1.5
Requires-Dist: rasterio>=1.3.0
Requires-Dist: requests>=2.33.0
Requires-Dist: rich>=13.0.0
Requires-Dist: rio-cogeo>=5.0.0
Requires-Dist: stac-geoparquet>=0.6.0
Requires-Dist: typing-extensions>=4.0.0; python_version < '3.11'
Provides-Extra: dev
Requires-Dist: bandit>=1.9.3; extra == 'dev'
Requires-Dist: codespell>=2.4.1; extra == 'dev'
Requires-Dist: commitizen>=4.13.4; extra == 'dev'
Requires-Dist: deptry>=0.25.1; extra == 'dev'
Requires-Dist: gitingest>=0.1.0; extra == 'dev'
Requires-Dist: hypothesis>=6.151.5; extra == 'dev'
Requires-Dist: import-linter>=2.0; extra == 'dev'
Requires-Dist: mutmut>=3.4.0; extra == 'dev'
Requires-Dist: mypy>=1.19.1; extra == 'dev'
Requires-Dist: pip-audit>=2.10.0; extra == 'dev'
Requires-Dist: pytest-benchmark>=5.0.0; extra == 'dev'
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
Requires-Dist: pytest-timeout>=2.3.1; extra == 'dev'
Requires-Dist: pytest>=9.0.3; extra == 'dev'
Requires-Dist: radon>=6.0.1; extra == 'dev'
Requires-Dist: ruff>=0.14.11; extra == 'dev'
Requires-Dist: types-defusedxml>=0.7.0; extra == 'dev'
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
Requires-Dist: vulture>=2.14; extra == 'dev'
Requires-Dist: xenon>=0.9.3; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mkdocs-click>=0.8.0; extra == 'docs'
Requires-Dist: mkdocs-material>=9.7.1; extra == 'docs'
Requires-Dist: mkdocs>=1.6.1; extra == 'docs'
Requires-Dist: mkdocstrings[python]>=1.0.0; extra == 'docs'
Requires-Dist: pymdown-extensions>=10.21.2; extra == 'docs'
Provides-Extra: e2e
Requires-Dist: boto3>=1.35.0; extra == 'e2e'
Provides-Extra: iceberg
Requires-Dist: pygeohash>=1.2.0; extra == 'iceberg'
Requires-Dist: pyiceberg[sql-sqlite]>=0.8.0; extra == 'iceberg'
Requires-Dist: shapely>=2.0.0; extra == 'iceberg'
Provides-Extra: pmtiles
Provides-Extra: thumbnails
Requires-Dist: contextily>=1.5.0; extra == 'thumbnails'
Requires-Dist: mapbox-vector-tile>=2.0.0; extra == 'thumbnails'
Description-Content-Type: text/markdown

# Portolan CLI

[![PyPI version](https://badge.fury.io/py/portolan-cli.svg)](https://badge.fury.io/py/portolan-cli)
[![CI](https://github.com/portolan-sdi/portolan-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/portolan-sdi/portolan-cli/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/portolan-sdi/portolan-cli/branch/main/graph/badge.svg)](https://codecov.io/gh/portolan-sdi/portolan-cli)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/portolan-sdi/portolan-cli/blob/main/LICENSE)

Portolan is an opinionated specification for serverless spatial data infrastructures.
It defines how publishers store, organize, document, and serve geospatial data as static files in their own storage.
Every Portolan catalog should offer a predictable, high-quality experience for publishers, people, and agents.

Portolan builds on existing standards instead of replacing them.
GeoParquet and PMTiles serve vector data, while COG serves raster data.
STAC provides a consistent catalog structure and index.
Required README and AGENTS.md files explain each catalog to people and agents.
The specification also covers operational details such as spatial ordering, bounding boxes, and CORS.

This repository contains the Portolan CLI, an implementation of the specification.
It helps publishers:

- Build [STAC](https://stacspec.org/en/) catalogs with [GeoParquet](https://geoparquet.org/) and [COG](https://cogeo.org/) assets.
- Extract ArcGIS, WFS, and Carto sources.
- Generate thumbnails, [PMTiles](https://docs.protomaps.com/pmtiles/), MapLibre styles, and STAC GeoParquet indexes.
- Track collection versions and checksums without a database.
- Validate catalog metadata, structure, and assets against the [Portolan specification](https://github.com/portolan-sdi/portolan-spec).
- Push, pull, sync, and clone catalogs through S3, GCS, Azure, or S3-compatible storage.
- Use structured JSON output, a typed Python API, or backend plugins.

## Installation

```sh
uv tool install portolan-cli
```

Or with pip:

```sh
pip install portolan-cli
```

## Documentation

Start with the [end-to-end publishing example](https://portolan-sdi.github.io/portolan-cli/examples/).
We plan to add more tutorials over time.

See the [full documentation](https://portolan-sdi.github.io/portolan-cli/).
It includes an auto-generated [CLI reference](https://portolan-sdi.github.io/portolan-cli/reference/cli/)
and [Python API reference](https://portolan-sdi.github.io/portolan-cli/reference/python/).

## Development

```sh
git clone https://github.com/portolan-sdi/portolan-cli.git
cd portolan-cli
uv sync --all-extras
uv run pytest
```

See the [contributing guide](https://portolan-sdi.github.io/portolan-cli/contributing/) for details.

## License

[Apache 2.0](https://github.com/portolan-sdi/portolan-cli/blob/main/LICENSE)
