Metadata-Version: 2.4
Name: portolan-cli
Version: 0.7.0
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.3.1
Requires-Dist: cryptography>=46.0.7
Requires-Dist: defusedxml>=0.7.1
Requires-Dist: geoparquet-io>=1.1.1
Requires-Dist: httpx>=0.27.0
Requires-Dist: lxml>=6.1.0
Requires-Dist: numpy>=1.24.0
Requires-Dist: obstore>=0.8.2
Requires-Dist: pillow>=12.2.0
Requires-Dist: pmtiles>=3.0.0
Requires-Dist: pyarrow<25.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: 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: pmtiles
Requires-Dist: gpio-pmtiles>=0.1.0; extra == 'pmtiles'
Provides-Extra: thumbnails
Requires-Dist: contextily>=1.5.0; extra == 'thumbnails'
Requires-Dist: geopandas>=0.14.0; extra == 'thumbnails'
Requires-Dist: mapbox-vector-tile>=2.0.0; extra == 'thumbnails'
Requires-Dist: matplotlib>=3.8.0; extra == 'thumbnails'
Description-Content-Type: text/markdown

<div align="center">
  <img src="docs/assets/images/cover.png" alt="Portolan" width="600"/>
</div>

<div align="center">

[![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)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![PyPI version](https://badge.fury.io/py/portolan-cli.svg)](https://badge.fury.io/py/portolan-cli)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)

</div>

---

<!-- --8<-- [start:intro] -->
Portolan enables organizations to share geospatial data in a low-cost, accessible, sovereign, and reliable way. Built on [cloud-native geospatial](https://cloudnativegeo.org) formats, a Portolan catalog is as interactive as any geospatial portal—but faster, more scalable, and much cheaper to run.

This CLI converts data to cloud-native formats (GeoParquet, COG), generates rich STAC metadata, and syncs to any object storage—no servers required.
<!-- --8<-- [end:intro] -->

<!-- --8<-- [start:quickstart] -->
## Quick Start

```bash
# Initialize a catalog
portolan init

# Add files (creates collections from directories)
portolan add demographics/

# Validate and convert to cloud-native formats
portolan check --fix

# notest - requires S3 credentials
# Push to remote storage
portolan push s3://my-bucket/catalog --collection demographics

# Later: pull updates from remote
portolan pull s3://my-bucket/catalog -c demographics

# Or sync everything (pull → init → scan → check → push)
portolan sync s3://my-bucket/catalog -c demographics
```

### All Commands

```bash
portolan init                               # Initialize catalog
portolan scan <path>                        # Scan for issues (--fix for filenames)
portolan add <path>                         # Track files
portolan rm <path>                          # Untrack files (--keep to preserve data)
portolan check                              # Validate catalog (metadata + geo-assets)
portolan check --fix                        # Convert to cloud-native + update metadata
portolan list                               # List tracked files
portolan info <path>                        # Show file/collection info
portolan push <remote>                      # Push to remote storage
portolan pull <remote>                      # Pull from remote storage
portolan sync <remote>                      # Full roundtrip sync
portolan clone <remote> <path>              # Clone remote catalog
portolan config <set|get|list|unset>        # Manage configuration
portolan metadata init                      # Create metadata.yaml template
portolan metadata validate                  # Validate required metadata fields
portolan readme                             # Generate README.md from STAC + metadata
portolan clean                              # Remove Portolan metadata
```
<!-- --8<-- [end:quickstart] -->

<!-- --8<-- [start:installation] -->
## Installation

```bash
# Recommended: uv (fast, isolated, project-aware)
uv tool install portolan-cli

# Alternative: pipx (isolated environment)
# pipx install portolan-cli

# Alternative: pip (global/user site-packages, may conflict)
# pip install portolan-cli
```

### For Development

```bash
git clone https://github.com/portolan-sdi/portolan-cli.git
cd portolan-cli
uv sync --all-extras
uv run portolan --help
```
<!-- --8<-- [end:installation] -->

See [Contributing Guide](docs/contributing.md) for full development setup.

## License

Apache 2.0 — see [LICENSE](LICENSE)
