datasette serve --create option, closes #1135

pull/1145/head
Simon Willison 2020-12-09 11:45:45 -08:00
rodzic 4c25b035b2
commit fe86d85308
3 zmienionych plików z 40 dodań i 1 usunięć

Wyświetl plik

@ -27,6 +27,7 @@ from .utils import (
StaticMount, StaticMount,
ValueAsBooleanError, ValueAsBooleanError,
) )
from .utils.sqlite import sqlite3
from .utils.testing import TestClient from .utils.testing import TestClient
from .version import __version__ from .version import __version__
@ -299,7 +300,7 @@ def uninstall(packages, yes):
@cli.command() @cli.command()
@click.argument("files", type=click.Path(exists=True), nargs=-1) @click.argument("files", type=click.Path(), nargs=-1)
@click.option( @click.option(
"-i", "-i",
"--immutable", "--immutable",
@ -401,6 +402,11 @@ def uninstall(packages, yes):
is_flag=True, is_flag=True,
help="Open Datasette in your web browser", help="Open Datasette in your web browser",
) )
@click.option(
"--create",
is_flag=True,
help="Create database files if they do not exist",
)
def serve( def serve(
files, files,
immutable, immutable,
@ -424,6 +430,7 @@ def serve(
help_config, help_config,
pdb, pdb,
open_browser, open_browser,
create,
return_instance=False, return_instance=False,
): ):
"""Serve up specified SQLite database files with a web UI""" """Serve up specified SQLite database files with a web UI"""
@ -486,6 +493,18 @@ def serve(
kwargs["config_dir"] = pathlib.Path(files[0]) kwargs["config_dir"] = pathlib.Path(files[0])
files = [] files = []
# Verify list of files, create if needed (and --create)
for file in files:
if not pathlib.Path(file).exists():
if create:
sqlite3.connect(file).execute("vacuum")
else:
raise click.ClickException(
"Invalid value for '[FILES]...': Path '{}' does not exist.".format(
file
)
)
try: try:
ds = Datasette(files, **kwargs) ds = Datasette(files, **kwargs)
except SpatialiteNotFound: except SpatialiteNotFound:

Wyświetl plik

@ -40,4 +40,5 @@ Options:
--help-config Show available config options --help-config Show available config options
--pdb Launch debugger on any errors --pdb Launch debugger on any errors
-o, --open Open Datasette in your web browser -o, --open Open Datasette in your web browser
--create Create database files if they do not exist
--help Show this message and exit. --help Show this message and exit.

Wyświetl plik

@ -146,6 +146,7 @@ def test_metadata_yaml():
help_config=False, help_config=False,
pdb=False, pdb=False,
open_browser=False, open_browser=False,
create=False,
return_instance=True, return_instance=True,
) )
client = _TestClient(ds) client = _TestClient(ds)
@ -221,3 +222,21 @@ def test_sql_errors_logged_to_stderr(ensure_eventloop):
result = runner.invoke(cli, ["--get", "/:memory:.json?sql=select+blah"]) result = runner.invoke(cli, ["--get", "/:memory:.json?sql=select+blah"])
assert result.exit_code == 1 assert result.exit_code == 1
assert "sql = 'select blah', params = {}: no such column: blah\n" in result.stderr assert "sql = 'select blah', params = {}: no such column: blah\n" in result.stderr
def test_serve_create(ensure_eventloop, tmpdir):
runner = CliRunner()
db_path = tmpdir / "does_not_exist_yet.db"
assert not db_path.exists()
result = runner.invoke(
cli, [str(db_path), "--create", "--get", "/-/databases.json"]
)
assert result.exit_code == 0, result.output
databases = json.loads(result.output)
assert {
"name": "does_not_exist_yet",
"is_mutable": True,
"is_memory": False,
"hash": None,
}.items() <= databases[0].items()
assert db_path.exists()