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.
This commit is contained in:
Alex committed 2026-09-07 10:20:43 +01:00
1 parent 3e7f1f91b4
commit 574f96341e
984 files changed
+9847 -9682

No files matched your search

+79 -79
View File
@@ -1,4 +1,4 @@
"""Tests for application.api.user.agents.sharing module."""
"""Tests for docsgpt.api.user.agents.sharing module."""
import uuid
from unittest.mock import Mock, patch
@@ -27,27 +27,27 @@ def app():
class TestSharedAgent:
def test_returns_400_missing_token(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
with app.test_request_context("/api/shared_agent"):
response = SharedAgent().get()
assert response.status_code == 400
def test_returns_404_agent_not_found(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
mock_col = Mock()
mock_col.find_one.return_value = None
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context("/api/shared_agent?token=abc123"):
response = SharedAgent().get()
assert response.status_code == 404
def test_returns_shared_agent_data(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
agent_id = uuid.uuid4().hex
mock_agents_col = Mock()
@@ -69,11 +69,11 @@ class TestSharedAgent:
mock_db = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.db", mock_db
"docsgpt.api.user.agents.sharing.db", mock_db
):
with app.test_request_context("/api/shared_agent?token=abc123"):
from flask import request
@@ -88,7 +88,7 @@ class TestSharedAgent:
assert data["shared"] is True
def test_adds_to_shared_with_me_for_different_user(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
agent_id = uuid.uuid4().hex
mock_agents_col = Mock()
@@ -106,15 +106,15 @@ class TestSharedAgent:
mock_users_col = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.db", mock_db
"docsgpt.api.user.agents.sharing.db", mock_db
), patch(
"application.api.user.agents.sharing.ensure_user_doc", mock_ensure
"docsgpt.api.user.agents.sharing.ensure_user_doc", mock_ensure
), patch(
"application.api.user.agents.sharing.users_collection", mock_users_col
"docsgpt.api.user.agents.sharing.users_collection", mock_users_col
):
with app.test_request_context("/api/shared_agent?token=abc123"):
from flask import request
@@ -126,7 +126,7 @@ class TestSharedAgent:
mock_users_col.update_one.assert_called_once()
def test_does_not_add_to_shared_for_owner(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
agent_id = uuid.uuid4().hex
mock_agents_col = Mock()
@@ -144,15 +144,15 @@ class TestSharedAgent:
mock_users_col = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.db", mock_db
"docsgpt.api.user.agents.sharing.db", mock_db
), patch(
"application.api.user.agents.sharing.ensure_user_doc", mock_ensure
"docsgpt.api.user.agents.sharing.ensure_user_doc", mock_ensure
), patch(
"application.api.user.agents.sharing.users_collection", mock_users_col
"docsgpt.api.user.agents.sharing.users_collection", mock_users_col
):
with app.test_request_context("/api/shared_agent?token=abc123"):
from flask import request
@@ -164,7 +164,7 @@ class TestSharedAgent:
mock_users_col.update_one.assert_not_called()
def test_enriches_tool_names(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
agent_id = uuid.uuid4().hex
tool_id = str(uuid.uuid4().hex)
@@ -186,13 +186,13 @@ class TestSharedAgent:
mock_db = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.user_tools_collection", mock_tools_col
"docsgpt.api.user.agents.sharing.user_tools_collection", mock_tools_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.db", mock_db
"docsgpt.api.user.agents.sharing.db", mock_db
):
with app.test_request_context("/api/shared_agent?token=tok"):
from flask import request
@@ -203,7 +203,7 @@ class TestSharedAgent:
assert response.json["tools"] == ["calculator"]
def test_handles_source_dbref(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
agent_id = uuid.uuid4().hex
source_id = uuid.uuid4().hex
@@ -223,11 +223,11 @@ class TestSharedAgent:
mock_db.dereference.return_value = {"_id": source_id}
with patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.db", mock_db
"docsgpt.api.user.agents.sharing.db", mock_db
):
with app.test_request_context("/api/shared_agent?token=tok"):
from flask import request
@@ -238,20 +238,20 @@ class TestSharedAgent:
assert response.json["source"] == str(source_id)
def test_returns_400_on_exception(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
mock_col = Mock()
mock_col.find_one.side_effect = Exception("DB error")
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context("/api/shared_agent?token=tok"):
response = SharedAgent().get()
assert response.status_code == 400
def test_tool_enrichment_handles_missing_tool(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
agent_id = uuid.uuid4().hex
tool_id = str(uuid.uuid4().hex)
@@ -270,13 +270,13 @@ class TestSharedAgent:
mock_db = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.user_tools_collection", mock_tools_col
"docsgpt.api.user.agents.sharing.user_tools_collection", mock_tools_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.db", mock_db
"docsgpt.api.user.agents.sharing.db", mock_db
):
with app.test_request_context("/api/shared_agent?token=tok"):
from flask import request
@@ -288,7 +288,7 @@ class TestSharedAgent:
assert response.json["tools"] == []
def test_image_url_generated_when_present(self, app):
from application.api.user.agents.sharing import SharedAgent
from docsgpt.api.user.agents.sharing import SharedAgent
agent_id = uuid.uuid4().hex
mock_agents_col = Mock()
@@ -306,13 +306,13 @@ class TestSharedAgent:
mock_generate = Mock(return_value="http://example.com/img.png")
with patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.db", mock_db
"docsgpt.api.user.agents.sharing.db", mock_db
), patch(
"application.api.user.agents.sharing.generate_image_url", mock_generate
"docsgpt.api.user.agents.sharing.generate_image_url", mock_generate
):
with app.test_request_context("/api/shared_agent?token=tok"):
from flask import request
@@ -333,7 +333,7 @@ class TestSharedAgent:
class TestSharedAgents:
def test_returns_401_unauthenticated(self, app):
from application.api.user.agents.sharing import SharedAgents
from docsgpt.api.user.agents.sharing import SharedAgents
with app.test_request_context("/api/shared_agents"):
from flask import request
@@ -343,7 +343,7 @@ class TestSharedAgents:
assert response.status_code == 401
def test_returns_shared_agents_list(self, app):
from application.api.user.agents.sharing import SharedAgents
from docsgpt.api.user.agents.sharing import SharedAgents
agent_id = uuid.uuid4().hex
mock_ensure = Mock(
@@ -372,13 +372,13 @@ class TestSharedAgents:
mock_users_col = Mock()
with patch(
"application.api.user.agents.sharing.ensure_user_doc", mock_ensure
"docsgpt.api.user.agents.sharing.ensure_user_doc", mock_ensure
), patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.users_collection", mock_users_col
"docsgpt.api.user.agents.sharing.users_collection", mock_users_col
):
with app.test_request_context("/api/shared_agents"):
from flask import request
@@ -392,7 +392,7 @@ class TestSharedAgents:
assert data[0]["pinned"] is True
def test_removes_stale_shared_ids(self, app):
from application.api.user.agents.sharing import SharedAgents
from docsgpt.api.user.agents.sharing import SharedAgents
stale_id = str(uuid.uuid4().hex)
mock_ensure = Mock(
@@ -409,11 +409,11 @@ class TestSharedAgents:
mock_users_col = Mock()
with patch(
"application.api.user.agents.sharing.ensure_user_doc", mock_ensure
"docsgpt.api.user.agents.sharing.ensure_user_doc", mock_ensure
), patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.users_collection", mock_users_col
"docsgpt.api.user.agents.sharing.users_collection", mock_users_col
):
with app.test_request_context("/api/shared_agents"):
from flask import request
@@ -428,7 +428,7 @@ class TestSharedAgents:
]
def test_returns_empty_when_no_shared_ids(self, app):
from application.api.user.agents.sharing import SharedAgents
from docsgpt.api.user.agents.sharing import SharedAgents
mock_ensure = Mock(
return_value={
@@ -440,9 +440,9 @@ class TestSharedAgents:
mock_agents_col.find.return_value = []
with patch(
"application.api.user.agents.sharing.ensure_user_doc", mock_ensure
"docsgpt.api.user.agents.sharing.ensure_user_doc", mock_ensure
), patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
):
with app.test_request_context("/api/shared_agents"):
from flask import request
@@ -453,12 +453,12 @@ class TestSharedAgents:
assert response.json == []
def test_returns_400_on_exception(self, app):
from application.api.user.agents.sharing import SharedAgents
from docsgpt.api.user.agents.sharing import SharedAgents
mock_ensure = Mock(side_effect=Exception("DB error"))
with patch(
"application.api.user.agents.sharing.ensure_user_doc", mock_ensure
"docsgpt.api.user.agents.sharing.ensure_user_doc", mock_ensure
):
with app.test_request_context("/api/shared_agents"):
from flask import request
@@ -468,7 +468,7 @@ class TestSharedAgents:
assert response.status_code == 400
def test_image_url_generated(self, app):
from application.api.user.agents.sharing import SharedAgents
from docsgpt.api.user.agents.sharing import SharedAgents
agent_id = uuid.uuid4().hex
mock_ensure = Mock(
@@ -494,15 +494,15 @@ class TestSharedAgents:
mock_generate = Mock(return_value="http://example.com/path.png")
with patch(
"application.api.user.agents.sharing.ensure_user_doc", mock_ensure
"docsgpt.api.user.agents.sharing.ensure_user_doc", mock_ensure
), patch(
"application.api.user.agents.sharing.agents_collection", mock_agents_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_agents_col
), patch(
"application.api.user.agents.sharing.resolve_tool_details", mock_resolve
"docsgpt.api.user.agents.sharing.resolve_tool_details", mock_resolve
), patch(
"application.api.user.agents.sharing.generate_image_url", mock_generate
"docsgpt.api.user.agents.sharing.generate_image_url", mock_generate
), patch(
"application.api.user.agents.sharing.users_collection", Mock()
"docsgpt.api.user.agents.sharing.users_collection", Mock()
):
with app.test_request_context("/api/shared_agents"):
from flask import request
@@ -522,7 +522,7 @@ class TestSharedAgents:
class TestShareAgent:
def test_returns_401_unauthenticated(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
with app.test_request_context(
"/api/share_agent",
@@ -536,7 +536,7 @@ class TestShareAgent:
assert response.status_code == 401
def test_returns_400_missing_json_body(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
with app.test_request_context(
"/api/share_agent",
@@ -553,7 +553,7 @@ class TestShareAgent:
assert response.json["success"] is False
def test_returns_400_missing_id(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
with app.test_request_context(
"/api/share_agent",
@@ -567,7 +567,7 @@ class TestShareAgent:
assert response.status_code == 400
def test_returns_400_missing_shared_param(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
with app.test_request_context(
"/api/share_agent",
@@ -581,7 +581,7 @@ class TestShareAgent:
assert response.status_code == 400
def test_returns_400_invalid_agent_id(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
with app.test_request_context(
"/api/share_agent",
@@ -595,14 +595,14 @@ class TestShareAgent:
assert response.status_code == 400
def test_returns_404_agent_not_found(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
mock_col = Mock()
mock_col.find_one.return_value = None
agent_id = str(uuid.uuid4().hex)
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context(
"/api/share_agent",
@@ -616,7 +616,7 @@ class TestShareAgent:
assert response.status_code == 404
def test_shares_agent_success(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
agent_id = uuid.uuid4().hex
mock_col = Mock()
@@ -627,7 +627,7 @@ class TestShareAgent:
mock_col.update_one.return_value = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context(
"/api/share_agent",
@@ -649,7 +649,7 @@ class TestShareAgent:
mock_col.update_one.assert_called_once()
def test_unshares_agent_success(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
agent_id = uuid.uuid4().hex
mock_col = Mock()
@@ -660,7 +660,7 @@ class TestShareAgent:
mock_col.update_one.return_value = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context(
"/api/share_agent",
@@ -680,7 +680,7 @@ class TestShareAgent:
assert data["shared_token"] is None
def test_returns_400_on_db_exception(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
agent_id = uuid.uuid4().hex
mock_col = Mock()
@@ -691,7 +691,7 @@ class TestShareAgent:
mock_col.update_one.side_effect = Exception("DB error")
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context(
"/api/share_agent",
@@ -708,7 +708,7 @@ class TestShareAgent:
assert response.status_code == 400
def test_share_with_username(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
agent_id = uuid.uuid4().hex
mock_col = Mock()
@@ -719,7 +719,7 @@ class TestShareAgent:
mock_col.update_one.return_value = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context(
"/api/share_agent",
@@ -742,7 +742,7 @@ class TestShareAgent:
assert "shared_token" in update_call
def test_shared_false_explicitly(self, app):
from application.api.user.agents.sharing import ShareAgent
from docsgpt.api.user.agents.sharing import ShareAgent
agent_id = uuid.uuid4().hex
mock_col = Mock()
@@ -753,7 +753,7 @@ class TestShareAgent:
mock_col.update_one.return_value = Mock()
with patch(
"application.api.user.agents.sharing.agents_collection", mock_col
"docsgpt.api.user.agents.sharing.agents_collection", mock_col
):
with app.test_request_context(
"/api/share_agent",