From bce27d7d5561fbd73aa5948ffa6545856609110a Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 26 Apr 2020 20:54:50 -0700 Subject: [PATCH] config_dir= parameter for Datasette(), refs #731 --- datasette/app.py | 45 +++++++++++++++++---------------------------- datasette/cli.py | 40 ++++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 46 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index 471dcbc3..437550ef 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -164,9 +164,16 @@ class Datasette: memory=False, config=None, version_note=None, + config_dir=None, ): + assert config_dir is None or isinstance( + config_dir, Path + ), "config_dir= should be a pathlib.Path" + # TODO: Use 'inspect-data.json' to decide on immutables immutables = immutables or [] self.files = tuple(files) + tuple(immutables) + if config_dir: + self.files += tuple([str(p) for p in config_dir.glob("*.db")]) self.immutables = set(immutables) if not self.files: self.files = [MEMORY] @@ -187,12 +194,22 @@ class Datasette: self.add_database(db.name, db) self.cache_headers = cache_headers self.cors = cors + if (config_dir / "metadata.json").exists() and not metadata: + metadata = json.load((config_dir / "metadata.json").open()) self._metadata = metadata or {} self.sqlite_functions = [] self.sqlite_extensions = sqlite_extensions or [] + if (config_dir / "templates").is_dir() and not template_dir: + template_dir = str((config_dir / "templates").resolve()) self.template_dir = template_dir + if (config_dir / "plugins").is_dir() and not plugins_dir: + template_dir = str((config_dir / "plugins").resolve()) self.plugins_dir = plugins_dir + if (config_dir / "static").is_dir() and not static_mounts: + static_mounts = [("static", str((config_dir / "static").resolve()))] self.static_mounts = static_mounts or [] + if (config_dir / "config.json").exists() and not config: + config = json.load((config_dir / "config.json").open()) self._config = dict(DEFAULT_CONFIG, **(config or {})) self.renderers = {} # File extension -> renderer function self.version_note = version_note @@ -247,34 +264,6 @@ class Datasette: self.register_renderers() - @classmethod - def from_path(cls, path): - path = Path(path) - files = [str(p.resolve()) for p in path.glob("*.db")] - inspect_data = None - if (path / "inspect.json").exists(): - inspect_data = json.load((path / "inspect.json").open()) - metadata = None - if (path / "metadata.json").exists(): - metadata = json.load((path / "metadata.json").open()) - template_dir = None - if (path / "templates").exists(): - template_dir = str((path / "templates")) - plugins_dir = None - if (path / "plugins").exists(): - plugins = str((path / "plugins")) - static_mounts = None - if (path / "static").exists(): - static_mounts = [("static", str(path / "plugins"))] - return cls( - files, - inspect_data=inspect_data, - metadata=metadata, - template_dir=template_dir, - plugins_dir=plugins_dir, - static_mounts=static_mounts, - ) - def add_database(self, name, db): self.databases[name] = db diff --git a/datasette/cli.py b/datasette/cli.py index 2240ede3..a93eaf79 100644 --- a/datasette/cli.py +++ b/datasette/cli.py @@ -5,6 +5,7 @@ from click import formatting from click_default_group import DefaultGroup import json import os +import pathlib import shutil from subprocess import call import sys @@ -353,25 +354,28 @@ def serve( "Serve! files={} (immutables={}) on port {}".format(files, immutable, port) ) - # if files is a single directory, do something special with it + kwargs = dict( + immutables=immutable, + cache_headers=not debug and not reload, + cors=cors, + inspect_data=inspect_data, + metadata=metadata_data, + sqlite_extensions=sqlite_extensions, + template_dir=template_dir, + plugins_dir=plugins_dir, + static_mounts=static, + config=dict(config), + memory=memory, + version_note=version_note, + ) + + # if files is a single directory, use that as config_dir= if 1 == len(files) and os.path.isdir(files[0]): - ds = Datasette.from_path(files[0]) - else: - ds = Datasette( - files, - immutables=immutable, - cache_headers=not debug and not reload, - cors=cors, - inspect_data=inspect_data, - metadata=metadata_data, - sqlite_extensions=sqlite_extensions, - template_dir=template_dir, - plugins_dir=plugins_dir, - static_mounts=static, - config=dict(config), - memory=memory, - version_note=version_note, - ) + kwargs["config_dir"] = pathlib.Path(files[0]) + files = [] + + ds = Datasette(files, **kwargs) + if return_instance: # Private utility mechanism for writing unit tests return ds