From 18ee5ad3b0c867cf10cd27a6f9415e031543bafd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emil=20Stenstr=C3=B6m?= Date: Mon, 18 Jul 2022 09:13:03 +0200 Subject: [PATCH] Autodetect components inside component subdirectories to make setup easier. --- django_components/__init__.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/django_components/__init__.py b/django_components/__init__.py index d87f1ffe..bcbbb483 100644 --- a/django_components/__init__.py +++ b/django_components/__init__.py @@ -1,17 +1,42 @@ +import glob +import importlib +import sys from importlib import import_module +from pathlib import Path import django +from django.template.engine import Engine from django.utils.module_loading import autodiscover_modules +from django_components.template_loader import Loader + if django.VERSION < (3, 2): default_app_config = "django_components.apps.ComponentsConfig" def autodiscover(): - # look for "components" module/pkg in each app from . import app_settings if app_settings.AUTODISCOVER: + # Autodetect a components.py file in each app directory autodiscover_modules("components") + + # Autodetect a .py file in a components dir + current_engine = Engine.get_default() + loader = Loader(current_engine) + dirs = loader.get_dirs() + for directory in dirs: + for path in glob.iglob(str(directory / "**/*.py"), recursive=True): + import_file(path) + for path in app_settings.LIBRARIES: import_module(path) + + +def import_file(path): + MODULE_PATH = path + MODULE_NAME = Path(path).stem + spec = importlib.util.spec_from_file_location(MODULE_NAME, MODULE_PATH) + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module)