from logging import getLogger
import click
import sys
from dtale.app import find_free_port, show
from dtale.cli.clickutils import LOG_LEVELS, get_log_options, run, setup_logging
from dtale.cli.loaders import check_loaders, setup_loader_options
logger = getLogger(__name__)
[docs]def validate_allow_cell_edits(ctx, param, value):
if "--no-cell-edits" in sys.argv:
return value
return None
@click.command(name="main", help="Run D-Tale from command-line")
@click.option("--host", type=str, help="hostname or IP address of process")
@click.option("--port", type=int, help="port number of process")
@click.option("--debug", is_flag=True, help="flag to switch on Flask's debug mode")
@click.option(
"--no-reaper",
is_flag=True,
help="flag to turn off auto-reaping (process cleanup after period of inactivity)",
)
@click.option(
"--open-browser",
is_flag=True,
help="flag to automatically open default web browser on startup",
)
@click.option("--name", type=str, help="name to apply to your D-Tale session")
@click.option(
"--no-cell-edits",
is_flag=True,
callback=validate_allow_cell_edits,
help="flag to turn off cell editing in the grid",
)
@click.option(
"--hide-shutdown", is_flag=True, help='flag to hide "Shutdown" button from users'
)
@click.option(
"--github-fork",
is_flag=True,
help='flag to show "Fork Me On GitHub" link in upper right-hand corner of the app',
)
@click.option("--app-root", type=str)
@click.option(
"--hide-drop-rows", is_flag=True, help='flag to hide "Drop Rows" button from users'
)
@click.option(
"--theme",
default="light",
type=click.Choice(["light", "dark"]),
help='theme you would like used for D-Tale, the default is "light"',
)
@click.option(
"--precision",
default=2,
type=int,
help="Default precision displayed by columns containing float data (default: 2)",
)
@click.option(
"--show-columns",
help="Comma-separated string of column names you would like displayed on load",
)
@click.option(
"--hide-columns",
help="Comma-separated string of column names you would like hidden on load",
)
@click.option(
"--query-engine",
default="python",
type=click.Choice(["python", "numexpr"]),
help='query engine you would like used for D-Tale, the default is "python"',
)
@click.option(
"--sort",
help=(
"Comma-separated string of pipe-separated column names/sort directions you would like applied on load. "
"EX: col1|ASC,col2|DESC"
),
)
@click.option(
"--locked",
help="Comma-separated string of column names you would like locked on the left-hand side of your grid on load",
)
@setup_loader_options()
@click.option("--log", "logfile", help="Log file name")
@click.option(
"--log-level",
help="Set the logging level",
type=click.Choice(list(LOG_LEVELS.keys())),
default="info",
show_default=True,
)
@click.option("-v", "--verbose", help="Set the logging level to debug", is_flag=True)
def main(
host=None,
port=None,
debug=None,
no_reaper=None,
open_browser=False,
name=None,
no_cell_edits=None,
hide_shutdown=None,
github_fork=None,
app_root=None,
hide_drop_rows=None,
**kwargs
):
"""
Runs a local server for the D-Tale application.
This local server is recommended when you have a pandas object stored in a CSV
or retrievable from :class:`arctic.Arctic` data store.
"""
log_opts = get_log_options(kwargs)
setup_logging(
log_opts.get("logfile"), log_opts.get("log_level"), log_opts.get("verbose")
)
data_loader = check_loaders(kwargs)
# in order to handle the hierarchy of inputs if "--no-cell-edits" is not specified
# then we'll update it to None
allow_cell_edits = False if no_cell_edits is not None else None
kwargs["show_columns"] = (
kwargs["show_columns"].split(",") if kwargs.get("show_columns") else None
)
kwargs["hide_columns"] = (
kwargs["hide_columns"].split(",") if kwargs.get("hide_columns") else None
)
kwargs["sort"] = (
[tuple(sort.split("|")) for sort in kwargs["sort"].split(",")]
if kwargs.get("sort")
else None
)
kwargs["locked"] = kwargs["locked"].split(",") if kwargs.get("locked") else None
show(
host=host,
port=int(port or find_free_port()),
debug=debug,
subprocess=False,
data_loader=data_loader,
reaper_on=not no_reaper,
open_browser=open_browser,
name=name,
allow_cell_edits=allow_cell_edits,
hide_shutdown=hide_shutdown,
github_fork=github_fork,
app_root=app_root,
hide_drop_rows=hide_drop_rows,
**kwargs
)
if __name__ == "__main__":
run(main)