From ea99a4431ce5bc2d65a3496da5b38e1986550a96 Mon Sep 17 00:00:00 2001 From: Amjith Ramanujam Date: Thu, 2 Jul 2020 20:08:32 -0700 Subject: [PATCH] Only load Python files from plugins-dir Pull request #890. Thanks, @amjith! * Load only python files from plugins-dir * Add a test to verify non-python files are not loaded as plugins --- datasette/app.py | 8 +++++--- tests/test_config_dir.py | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index 254d7872..bafee857 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -2,6 +2,7 @@ import asyncio import asgi_csrf import collections import datetime +import glob import hashlib import inspect import itertools @@ -263,9 +264,10 @@ class Datasette: # Execute plugins in constructor, to ensure they are available # when the rest of `datasette inspect` executes if self.plugins_dir: - for filename in os.listdir(self.plugins_dir): - filepath = os.path.join(self.plugins_dir, filename) - mod = module_from_path(filepath, name=filename) + for filepath in glob.glob(os.path.join(self.plugins_dir, "*.py")): + if not os.path.isfile(filepath): + continue + mod = module_from_path(filepath, name=os.path.basename(filepath)) try: pm.register(mod) except ValueError: diff --git a/tests/test_config_dir.py b/tests/test_config_dir.py index b1f6994f..430eba16 100644 --- a/tests/test_config_dir.py +++ b/tests/test_config_dir.py @@ -30,6 +30,8 @@ def config_dir_client(tmp_path_factory): plugins_dir = config_dir / "plugins" plugins_dir.mkdir() (plugins_dir / "hooray.py").write_text(PLUGIN, "utf-8") + (plugins_dir / "non_py_file.txt").write_text(PLUGIN, "utf-8") + (plugins_dir / ".mypy_cache").mkdir() templates_dir = config_dir / "templates" templates_dir.mkdir() @@ -95,6 +97,8 @@ def test_plugins(config_dir_client): response = config_dir_client.get("/-/plugins.json") assert 200 == response.status assert "hooray.py" in {p["name"] for p in response.json} + assert "non_py_file.txt" not in {p["name"] for p in response.json} + assert "mypy_cache" not in {p["name"] for p in response.json} def test_templates_and_plugin(config_dir_client):