diff --git a/datasette/app.py b/datasette/app.py index d4ea9287..70704eeb 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -147,6 +147,12 @@ class ConnectedDatabase: p = Path(path) self.hash = inspect_hash(p) self.cached_size = p.stat().st_size + # Maybe use self.ds.inspect_data to populate cached_table_counts + if self.ds.inspect_data and self.ds.inspect_data.get(self.name): + self.cached_table_counts = { + key: value["count"] + for key, value in self.ds.inspect_data[self.name]["tables"].items() + } @property def size(self): @@ -310,6 +316,7 @@ class Datasette: elif memory: self.files = (MEMORY,) + self.files self.databases = {} + self.inspect_data = inspect_data for file in self.files: path = file is_memory = False @@ -325,7 +332,6 @@ class Datasette: self.databases[db.name] = db self.cache_headers = cache_headers self.cors = cors - self._inspect = inspect_data self._metadata = metadata or {} self.sqlite_functions = [] self.sqlite_extensions = sqlite_extensions or [] diff --git a/tests/fixtures.py b/tests/fixtures.py index bc6d55b2..d85aef95 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -31,6 +31,7 @@ def make_app_client( filename="fixtures.db", is_immutable=False, extra_databases=None, + inspect_data=None, ): with tempfile.TemporaryDirectory() as tmpdir: filepath = os.path.join(tmpdir, filename) @@ -71,6 +72,7 @@ def make_app_client( metadata=METADATA, plugins_dir=plugins_dir, config=config, + inspect_data=inspect_data, ) ds.sqlite_functions.append(("sleep", 1, lambda n: time.sleep(float(n)))) client = TestClient(ds.app().test_client) diff --git a/tests/test_cli.py b/tests/test_cli.py index cd85c4d4..d1ab6522 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,4 +1,4 @@ -from .fixtures import app_client +from .fixtures import app_client, make_app_client from datasette.cli import cli from click.testing import CliRunner import pathlib @@ -31,6 +31,14 @@ def test_inspect_cli_writes_to_file(app_client): assert ["fixtures"] == list(data.keys()) +def test_serve_with_inspect_file_prepopulates_table_counts_cache(): + inspect_data = {"fixtures": {"tables": {"hithere": {"count": 44}}}} + for client in make_app_client(inspect_data=inspect_data, is_immutable=True): + assert inspect_data == client.ds.inspect_data + db = client.ds.databases["fixtures"] + assert {"hithere": 44} == db.cached_table_counts + + def test_spatialite_error_if_attempt_to_open_spatialite(): runner = CliRunner() result = runner.invoke(