refactor: fix wrongly initiated settings (#1250)

* refactor: fix wrongly initiated settings

* refacttor: remove `_load_settings()` from apps.py

* refactor: fix building of docs + update titles in API reference

* refactor: fix docs build error

* refactor: use EXTENSIONS_DEFAULTS

* refactor: update titles
This commit is contained in:
Juro Oravec 2025-06-10 10:12:48 +02:00 committed by GitHub
parent 2350a6b6c4
commit 458e1894db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 65 additions and 41 deletions

View file

@ -746,8 +746,8 @@ defaults = ComponentsSettings(
#
# Settings are loaded from Django settings only once, at `apps.py` in `ready()`.
class InternalSettings:
def __init__(self, settings: Optional[Dict[str, Any]] = None):
self._settings = ComponentsSettings(**settings) if settings else defaults
def __init__(self) -> None:
self._settings: Optional[ComponentsSettings] = None
def _load_settings(self) -> None:
data = getattr(settings, "COMPONENTS", {})
@ -786,6 +786,11 @@ class InternalSettings:
tag_formatter=default(components_settings.tag_formatter, defaults.tag_formatter), # type: ignore[arg-type]
)
def _get_settings(self) -> ComponentsSettings:
if self._settings is None:
self._load_settings()
return cast(ComponentsSettings, self._settings)
def _prepare_extensions(self, new_settings: ComponentsSettings) -> List["ComponentExtension"]:
extensions: Sequence[Union[Type["ComponentExtension"], str]] = default(
new_settings.extensions, cast(List[str], defaults.extensions)
@ -853,70 +858,73 @@ class InternalSettings:
return raw_value
# TODO REMOVE THE PROPERTIES BELOW? THEY NO LONGER SERVE ANY PURPOSE
@property
def AUTODISCOVER(self) -> bool:
return self._settings.autodiscover # type: ignore[return-value]
return self._get_settings().autodiscover # type: ignore[return-value]
@property
def CACHE(self) -> Optional[str]:
return self._settings.cache
return self._get_settings().cache
@property
def DIRS(self) -> Sequence[Union[str, PathLike, Tuple[str, str], Tuple[str, PathLike]]]:
return self._settings.dirs # type: ignore[return-value]
return self._get_settings().dirs # type: ignore[return-value]
@property
def APP_DIRS(self) -> Sequence[str]:
return self._settings.app_dirs # type: ignore[return-value]
return self._get_settings().app_dirs # type: ignore[return-value]
@property
def DEBUG_HIGHLIGHT_COMPONENTS(self) -> bool:
return self._settings.debug_highlight_components # type: ignore[return-value]
return self._get_settings().debug_highlight_components # type: ignore[return-value]
@property
def DEBUG_HIGHLIGHT_SLOTS(self) -> bool:
return self._settings.debug_highlight_slots # type: ignore[return-value]
return self._get_settings().debug_highlight_slots # type: ignore[return-value]
@property
def DYNAMIC_COMPONENT_NAME(self) -> str:
return self._settings.dynamic_component_name # type: ignore[return-value]
return self._get_settings().dynamic_component_name # type: ignore[return-value]
@property
def LIBRARIES(self) -> List[str]:
return self._settings.libraries # type: ignore[return-value]
return self._get_settings().libraries # type: ignore[return-value]
@property
def EXTENSIONS(self) -> List["ComponentExtension"]:
return self._settings.extensions # type: ignore[return-value]
return self._get_settings().extensions # type: ignore[return-value]
@property
def EXTENSIONS_DEFAULTS(self) -> Dict[str, Any]:
return self._get_settings().extensions_defaults # type: ignore[return-value]
@property
def MULTILINE_TAGS(self) -> bool:
return self._settings.multiline_tags # type: ignore[return-value]
return self._get_settings().multiline_tags # type: ignore[return-value]
@property
def RELOAD_ON_FILE_CHANGE(self) -> bool:
return self._settings.reload_on_file_change # type: ignore[return-value]
return self._get_settings().reload_on_file_change # type: ignore[return-value]
@property
def TEMPLATE_CACHE_SIZE(self) -> int:
return self._settings.template_cache_size # type: ignore[return-value]
return self._get_settings().template_cache_size # type: ignore[return-value]
@property
def STATIC_FILES_ALLOWED(self) -> Sequence[Union[str, re.Pattern]]:
return self._settings.static_files_allowed # type: ignore[return-value]
return self._get_settings().static_files_allowed # type: ignore[return-value]
@property
def STATIC_FILES_FORBIDDEN(self) -> Sequence[Union[str, re.Pattern]]:
return self._settings.static_files_forbidden # type: ignore[return-value]
return self._get_settings().static_files_forbidden # type: ignore[return-value]
@property
def CONTEXT_BEHAVIOR(self) -> ContextBehavior:
return ContextBehavior(self._settings.context_behavior)
return ContextBehavior(self._get_settings().context_behavior)
@property
def TAG_FORMATTER(self) -> Union["TagFormatterABC", str]:
return self._settings.tag_formatter # type: ignore[return-value]
return self._get_settings().tag_formatter # type: ignore[return-value]
app_settings = InternalSettings()

View file

@ -20,8 +20,6 @@ class ComponentsConfig(AppConfig):
from django_components.extension import extensions
from django_components.util.django_monkeypatch import monkeypatch_template_cls
app_settings._load_settings()
# NOTE: This monkeypatch is applied here, before Django processes any requests.
# To make django-components work with django-debug-toolbar-template-profiler
# See https://github.com/django-components/django-components/discussions/819

View file

@ -20,7 +20,7 @@ def _gen_subcommands() -> List[Type[ComponentCommand]]:
commands: List[Type[ComponentCommand]] = []
for extension in extensions.extensions:
ExtCommand = type(
"ExtCommand",
"ExtRunSubcommand_" + extension.name,
(ComponentCommand,),
{
"name": extension.name,

View file

@ -1047,7 +1047,7 @@ class ExtensionManager:
# - `MyExtensionBase` is the base class that the extension class inherits from.
bases_list = [ext_base_class]
all_extensions_defaults = app_settings._settings.extensions_defaults or {}
all_extensions_defaults = app_settings.EXTENSIONS_DEFAULTS or {}
extension_defaults = all_extensions_defaults.get(extension.name, None)
if extension_defaults:
# Create dummy class that holds the extension defaults

View file

@ -25,7 +25,7 @@ def component_error_message(component_path: List[str]) -> Generator[None, None,
if not components:
orig_msg = str(err.args[0])
else:
orig_msg = err.args[0].split("\n", 1)[-1]
orig_msg = str(err.args[0]).split("\n", 1)[-1]
else:
orig_msg = str(err)