117 lines
3.3 KiB
Python
117 lines
3.3 KiB
Python
"""
|
|
Main command group for Rasterio's CLI.
|
|
|
|
Subcommands developed as a part of the Rasterio package have their own
|
|
modules under ``rasterio.rio`` (like ``rasterio/rio/info.py``) and are
|
|
registered in the 'rasterio.rio_commands' entry point group in
|
|
Rasterio's ``setup.py``:
|
|
|
|
entry_points='''
|
|
[console_scripts]
|
|
rio=rasterio.rio.main:main_group
|
|
|
|
[rasterio.rio_commands]
|
|
bounds=rasterio.rio.bounds:bounds
|
|
calc=rasterio.rio.calc:calc
|
|
...
|
|
|
|
Users may create their own ``rio`` subcommands by writing modules that
|
|
register entry points in Rasterio's 'rasterio.rio_plugins' group. See
|
|
for example https://github.com/sgillies/rio-plugin-example, which has
|
|
been published to PyPI as ``rio-metasay``.
|
|
|
|
There's no advantage to making a ``rio`` subcommand which doesn't
|
|
import rasterio. But if you are using rasterio, you may profit from
|
|
Rasterio's CLI infrastructure and the network of existing commands.
|
|
Please add yours to the registry
|
|
|
|
https://github.com/rasterio/rasterio/wiki/Rio-plugin-registry
|
|
|
|
so that other ``rio`` users may find it.
|
|
"""
|
|
|
|
import itertools
|
|
import logging
|
|
import sys
|
|
|
|
from click_plugins import with_plugins
|
|
import click
|
|
import cligj
|
|
|
|
if sys.version_info < (3, 10):
|
|
from importlib_metadata import entry_points
|
|
else:
|
|
from importlib.metadata import entry_points
|
|
|
|
import rasterio
|
|
from rasterio.session import AWSSession
|
|
|
|
|
|
def configure_logging(verbosity):
|
|
log_level = max(10, 30 - 10 * verbosity)
|
|
logging.basicConfig(stream=sys.stderr, level=log_level)
|
|
|
|
|
|
def gdal_version_cb(ctx, param, value):
|
|
if not value or ctx.resilient_parsing:
|
|
return
|
|
|
|
click.echo(f"{rasterio.__gdal_version__}", color=ctx.color)
|
|
ctx.exit()
|
|
|
|
def show_versions_cb(ctx, param, value):
|
|
if not value or ctx.resilient_parsing:
|
|
return
|
|
|
|
rasterio.show_versions()
|
|
ctx.exit()
|
|
|
|
|
|
@with_plugins(
|
|
itertools.chain(
|
|
entry_points(group="rasterio.rio_commands"),
|
|
entry_points(group="rasterio.rio_plugins"),
|
|
)
|
|
)
|
|
@click.group()
|
|
@cligj.verbose_opt
|
|
@cligj.quiet_opt
|
|
@click.option(
|
|
"--aws-profile", help="Select a profile from the AWS credentials file"
|
|
)
|
|
@click.option("--aws-no-sign-requests", is_flag=True, help="Make requests anonymously")
|
|
@click.option(
|
|
"--aws-requester-pays", is_flag=True, help="Requester pays data transfer costs"
|
|
)
|
|
@click.version_option(version=rasterio.__version__, message="%(version)s")
|
|
@click.option("--gdal-version", is_eager=True, is_flag=True, callback=gdal_version_cb)
|
|
@click.option("--show-versions", help="Show dependency versions", is_eager=True, is_flag=True, callback=show_versions_cb)
|
|
@click.pass_context
|
|
def main_group(
|
|
ctx,
|
|
verbose,
|
|
quiet,
|
|
aws_profile,
|
|
aws_no_sign_requests,
|
|
aws_requester_pays,
|
|
gdal_version,
|
|
show_versions,
|
|
):
|
|
"""Rasterio command line interface.
|
|
"""
|
|
verbosity = verbose - quiet
|
|
configure_logging(verbosity)
|
|
ctx.obj = {}
|
|
ctx.obj["verbosity"] = verbosity
|
|
ctx.obj["aws_profile"] = aws_profile
|
|
envopts = {"CPL_DEBUG": (verbosity > 2)}
|
|
if aws_profile or aws_no_sign_requests or aws_requester_pays:
|
|
ctx.obj["env"] = rasterio.Env(
|
|
session=AWSSession(
|
|
profile_name=aws_profile,
|
|
aws_unsigned=aws_no_sign_requests,
|
|
requester_pays=aws_requester_pays,
|
|
), **envopts)
|
|
else:
|
|
ctx.obj["env"] = rasterio.Env(**envopts)
|