Source code for simdb.cli.commands.alias
import sys
import click
from typing import TYPE_CHECKING, Iterable
from ..remote_api import RemoteAPI
from . import pass_config
pass_api = click.make_pass_decorator(RemoteAPI)
if TYPE_CHECKING or "sphinx" in sys.modules:
from ...config import Config
from click import Context
[docs]
class AliasCommand(click.Command):
[docs]
def parse_args(self, ctx, args):
if len(args) < sum(1 for i in self.params if isinstance(i, click.Argument)):
args.insert(0, "")
super().parse_args(ctx, args)
[docs]
class AliasGroup(click.Group):
[docs]
def parse_args(self, ctx, args):
if args and args[0] in self.commands:
args.insert(0, "")
super().parse_args(ctx, args)
[docs]
class AliasSubGroup(click.Group):
[docs]
def is_empty(value) -> bool:
return any(value) if isinstance(value, Iterable) else bool(value)
@click.group(cls=AliasGroup, invoke_without_command=True)
@click.pass_context
@pass_config
@click.option("--username", help="Username used to authenticate with the remote.")
@click.option("--password", help="Password used to authenticate with the remote.")
@click.argument("remote", required=False)
def alias(config: "Config", ctx: "Context", remote, username, password):
"""Query remote and local aliases."""
if not ctx.invoked_subcommand and not any(is_empty(i) for i in ctx.params.values()):
click.echo(ctx.get_help())
elif "--help" not in sys.argv:
if ctx.invoked_subcommand:
ctx.obj = RemoteAPI(remote, username, password, config)
@alias.command("make-unique", cls=AliasCommand)
@pass_api
@pass_config
@click.argument("alias")
def alias_make_unique(config: "Config", api: RemoteAPI, alias: str):
"""Make the given alias unique, checking locally stored simulations and the remote."""
from ...database import get_local_db
trans = str.maketrans("#/()=,*%", "________")
alias = alias.translate(trans)
simulations = api.list_simulations()
db = get_local_db(config)
simulations += db.list_simulations()
aliases = [sim.alias for sim in simulations]
n = 1
base = alias
while alias in aliases:
alias = f"{base}-{n}"
n += 1
click.echo(alias)
@alias.command("search", cls=AliasCommand)
@pass_api
@pass_config
@click.argument("alias")
def alias_search(config: "Config", api: RemoteAPI, alias: str):
"""Search the REMOTE for all aliases that contain the given VALUE."""
from ...database import get_local_db
simulations = api.list_simulations()
db = get_local_db(config)
simulations += db.list_simulations()
aliases = [sim.alias for sim in simulations if alias in sim.alias]
for alias in aliases:
click.echo(alias)
@alias.command("list", cls=AliasCommand)
@pass_api
@pass_config
@click.option("--local", help="Only list the local aliases.", is_flag=True)
def alias_list(config: "Config", api: RemoteAPI, local: bool):
"""List aliases from the local database and the REMOTE (if specified)."""
from ...database import get_local_db
if not local:
remote_simulations = []
if api.has_url():
remote_simulations = api.list_simulations()
else:
click.echo(
"The Remote Server has not been specified in the configuration file. Please set remote-url"
)
click.echo("Remote:")
for sim in remote_simulations:
click.echo(f" {sim.alias}")
db = get_local_db(config)
local_simulations = db.list_simulations()
click.echo("Local:")
for sim in local_simulations:
click.echo(f" {sim.alias}")