97 lines
2.5 KiB
Python
97 lines
2.5 KiB
Python
"""Common commandline options for `fio`"""
|
|
|
|
|
|
from collections import defaultdict
|
|
|
|
import click
|
|
|
|
|
|
src_crs_opt = click.option('--src-crs', '--src_crs', help="Source CRS.")
|
|
dst_crs_opt = click.option('--dst-crs', '--dst_crs', help="Destination CRS.")
|
|
|
|
|
|
def cb_layer(ctx, param, value):
|
|
"""Let --layer be a name or index."""
|
|
if value is None or not value.isdigit():
|
|
return value
|
|
else:
|
|
return int(value)
|
|
|
|
|
|
def cb_multilayer(ctx, param, value):
|
|
"""
|
|
Transform layer options from strings ("1:a,1:b", "2:a,2:c,2:z") to
|
|
{
|
|
'1': ['a', 'b'],
|
|
'2': ['a', 'c', 'z']
|
|
}
|
|
"""
|
|
out = defaultdict(list)
|
|
for raw in value:
|
|
for v in raw.split(','):
|
|
ds, name = v.split(':')
|
|
out[ds].append(name)
|
|
return out
|
|
|
|
|
|
def cb_key_val(ctx, param, value):
|
|
"""
|
|
click callback to validate `--opt KEY1=VAL1 --opt KEY2=VAL2` and collect
|
|
in a dictionary like the one below, which is what the CLI function receives.
|
|
If no value or `None` is received then an empty dictionary is returned.
|
|
|
|
{
|
|
'KEY1': 'VAL1',
|
|
'KEY2': 'VAL2'
|
|
}
|
|
|
|
Note: `==VAL` breaks this as `str.split('=', 1)` is used.
|
|
|
|
"""
|
|
if not value:
|
|
return {}
|
|
else:
|
|
out = {}
|
|
for pair in value:
|
|
if "=" not in pair:
|
|
raise click.BadParameter(
|
|
f"Invalid syntax for KEY=VAL arg: {pair}"
|
|
)
|
|
else:
|
|
k, v = pair.split("=", 1)
|
|
k = k.lower()
|
|
v = v.lower()
|
|
out[k] = None if v.lower() in ["none", "null", "nil", "nada"] else v
|
|
return out
|
|
|
|
|
|
def validate_multilayer_file_index(files, layerdict):
|
|
"""
|
|
Ensure file indexes provided in the --layer option are valid
|
|
"""
|
|
for key in layerdict.keys():
|
|
if key not in [str(k) for k in range(1, len(files) + 1)]:
|
|
layer = key + ":" + layerdict[key][0]
|
|
raise click.BadParameter(f"Layer {layer} does not exist")
|
|
|
|
|
|
creation_opt = click.option(
|
|
"--co",
|
|
"--profile",
|
|
"creation_options",
|
|
metavar="NAME=VALUE",
|
|
multiple=True,
|
|
callback=cb_key_val,
|
|
help="Driver specific creation options. See the documentation for the selected output driver for more information.",
|
|
)
|
|
|
|
|
|
open_opt = click.option(
|
|
"--oo",
|
|
"open_options",
|
|
metavar="NAME=VALUE",
|
|
multiple=True,
|
|
callback=cb_key_val,
|
|
help="Driver specific open options. See the documentation for the selected output driver for more information.",
|
|
)
|