Files
DocsGPT/application/__init__.py
T
Alex 574f96341e refactor: rename the application package to docsgpt
The backend import package is now docsgpt, the name it will carry on PyPI;
application was far too generic to install into anyone's site-packages.
git mv plus a mechanical rewrite of every import, dotted string and path
reference: 734 Python files, the compose files, Dockerfile, workflows, docs,
setup scripts, devcontainer, k8s manifests, vscode config, pytest and coverage
config, .gitignore. Behaviour is unchanged.

Kept for one release:
- A top-level application package whose meta-path finder resolves
  application.x.y to the already-imported docsgpt.x.y object, so old imports
  and entry points (celery -A application.app.celery,
  uvicorn application.asgi:asgi_app) keep working with a FutureWarning.
- Celery registers every application.* task name as an alias of its
  docsgpt.* task on start-up, so messages queued by the previous release still
  run. The redbeat key prefix moves to redbeat:docsgpt:v2: so schedule entries
  the previous release wrote are left unread instead of firing twice.

The backend image builds from the repository root (docker build -f
docsgpt/Dockerfile .) so it can ship the alias package; a root .dockerignore
allow-lists docsgpt/ and application/ and keeps caches, local data, .env
files, the sample index files and the Dockerfile out. Compose and the image
workflows point at the new context.
2026-09-07 10:20:43 +01:00

58 lines
1.8 KiB
Python

"""``application`` is now ``docsgpt``; this alias keeps the old name importable for one release.
Every ``import application.x.y`` resolves to the already-imported ``docsgpt.x.y``
module object, so there is exactly one settings object, one Celery app and one
Flask app however a process refers to them. Entry points such as
``celery -A application.app.celery`` and ``uvicorn application.asgi:asgi_app``
keep working; update them to ``docsgpt.…`` before the alias is removed.
"""
from __future__ import annotations
import importlib
import importlib.abc
import importlib.util
import sys
import warnings
_OLD = __name__
_NEW = "docsgpt"
class _AliasLoader(importlib.abc.Loader):
"""Hand back the ``docsgpt`` module instead of executing anything."""
def __init__(self, target: str) -> None:
self._target = target
def create_module(self, spec):
return importlib.import_module(self._target)
def exec_module(self, module) -> None:
return None
class _AliasFinder(importlib.abc.MetaPathFinder):
"""Resolve ``application.<path>`` to ``docsgpt.<path>``."""
def find_spec(self, name, path=None, target=None):
if name != _OLD and not name.startswith(_OLD + "."):
return None
new_name = _NEW + name[len(_OLD):]
spec = importlib.util.find_spec(new_name)
if spec is None:
return None
return importlib.util.spec_from_loader(
name, _AliasLoader(new_name), is_package=spec.submodule_search_locations is not None
)
warnings.warn(
"The 'application' package was renamed to 'docsgpt'. Update imports and entry points "
"(celery -A docsgpt.app.celery, uvicorn docsgpt.asgi:asgi_app); this alias will be removed.",
FutureWarning,
stacklevel=2,
)
sys.meta_path.insert(0, _AliasFinder())
sys.modules[_OLD] = importlib.import_module(_NEW)