fastapi-toolsets 4.1.2__tar.gz → 4.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/PKG-INFO +1 -1
  2. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/pyproject.toml +1 -1
  3. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/__init__.py +1 -1
  4. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/pytest/utils.py +26 -8
  5. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/LICENSE +0 -0
  6. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/README.md +0 -0
  7. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/_imports.py +0 -0
  8. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/cli/__init__.py +0 -0
  9. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/cli/app.py +0 -0
  10. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/cli/commands/__init__.py +0 -0
  11. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/cli/commands/fixtures.py +0 -0
  12. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/cli/config.py +0 -0
  13. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/cli/pyproject.py +0 -0
  14. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/cli/utils.py +0 -0
  15. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/crud/__init__.py +0 -0
  16. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/crud/factory.py +0 -0
  17. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/crud/search.py +0 -0
  18. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/db.py +0 -0
  19. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/dependencies.py +0 -0
  20. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/exceptions/__init__.py +0 -0
  21. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/exceptions/exceptions.py +0 -0
  22. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/exceptions/handler.py +0 -0
  23. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/fixtures/__init__.py +0 -0
  24. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/fixtures/enum.py +0 -0
  25. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/fixtures/registry.py +0 -0
  26. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/fixtures/utils.py +0 -0
  27. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/logger.py +0 -0
  28. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/metrics/__init__.py +0 -0
  29. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/metrics/handler.py +0 -0
  30. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/metrics/registry.py +0 -0
  31. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/models/__init__.py +0 -0
  32. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/models/columns.py +0 -0
  33. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/models/watched.py +0 -0
  34. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/py.typed +0 -0
  35. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/pytest/__init__.py +0 -0
  36. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/pytest/plugin.py +0 -0
  37. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/schemas.py +0 -0
  38. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/__init__.py +0 -0
  39. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/abc.py +0 -0
  40. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/oauth.py +0 -0
  41. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/sources/__init__.py +0 -0
  42. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/sources/bearer.py +0 -0
  43. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/sources/cookie.py +0 -0
  44. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/sources/header.py +0 -0
  45. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/security/sources/multi.py +0 -0
  46. {fastapi_toolsets-4.1.2 → fastapi_toolsets-4.1.3}/src/fastapi_toolsets/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-toolsets
3
- Version: 4.1.2
3
+ Version: 4.1.3
4
4
  Summary: Production-ready utilities for FastAPI applications
5
5
  Keywords: fastapi,sqlalchemy,postgresql
6
6
  Author: d3vyce
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-toolsets"
3
- version = "4.1.2"
3
+ version = "4.1.3"
4
4
  description = "Production-ready utilities for FastAPI applications"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -21,4 +21,4 @@ Example usage:
21
21
  return Response(data={"user": user.username}, message="Success")
22
22
  """
23
23
 
24
- __version__ = "4.1.2"
24
+ __version__ = "4.1.3"
@@ -34,12 +34,18 @@ def _get_xdist_worker(default_test_db: str) -> str:
34
34
  return os.environ.get("PYTEST_XDIST_WORKER", default_test_db)
35
35
 
36
36
 
37
- def worker_database_url(database_url: str, default_test_db: str) -> str:
37
+ def worker_database_url(
38
+ database_url: str,
39
+ default_test_db: str,
40
+ *,
41
+ prefix: str | None = None,
42
+ ) -> str:
38
43
  """Derive a per-worker database URL for pytest-xdist parallel runs.
39
44
 
40
- Appends ``_{worker_name}`` to the database name so each xdist worker
41
- operates on its own database. When not running under xdist,
42
- ``_{default_test_db}`` is appended instead.
45
+ Sets the database name to the worker name so each xdist worker operates
46
+ on its own database. When not running under xdist, *default_test_db* is
47
+ used instead. When *prefix* is provided, the name becomes
48
+ ``{prefix}_{worker}``.
43
49
 
44
50
  The worker name is read from the ``PYTEST_XDIST_WORKER`` environment
45
51
  variable (set automatically by xdist in each worker process).
@@ -48,6 +54,9 @@ def worker_database_url(database_url: str, default_test_db: str) -> str:
48
54
  database_url: Original database connection URL.
49
55
  default_test_db: Suffix appended to the database name when
50
56
  ``PYTEST_XDIST_WORKER`` is not set.
57
+ prefix: Optional prefix prepended to the worker name
58
+ (e.g. ``"test"`` → ``"test_gw0"``). Without it, the database
59
+ name is just the worker name (e.g. ``"gw0"``).
51
60
 
52
61
  Returns:
53
62
  A database URL with a worker- or default-specific database name.
@@ -55,7 +64,8 @@ def worker_database_url(database_url: str, default_test_db: str) -> str:
55
64
  worker = _get_xdist_worker(default_test_db=default_test_db)
56
65
 
57
66
  url = make_url(database_url)
58
- url = url.set(database=f"{url.database}_{worker}")
67
+ db_name = f"{prefix}_{worker}" if prefix else worker
68
+ url = url.set(database=db_name)
59
69
  return url.render_as_string(hide_password=False)
60
70
 
61
71
 
@@ -64,6 +74,7 @@ async def create_worker_database(
64
74
  database_url: str,
65
75
  default_test_db: str = "test_db",
66
76
  *,
77
+ prefix: str | None = None,
67
78
  server_url: str | None = None,
68
79
  ) -> AsyncGenerator[str, None]:
69
80
  """Create and drop a per-worker database for pytest-xdist isolation.
@@ -80,6 +91,9 @@ async def create_worker_database(
80
91
  the worker database name).
81
92
  default_test_db: Suffix appended to the database name when
82
93
  ``PYTEST_XDIST_WORKER`` is not set. Defaults to ``"test_db"``.
94
+ prefix: Optional prefix prepended to the worker name
95
+ (e.g. ``prefix="test"`` → ``"test_gw0"``). Without it, the
96
+ database name is just the worker name (e.g. ``"gw0"``).
83
97
  server_url: URL used for server-level DDL (must point to an existing
84
98
  database on the same server). Defaults to *database_url* with the
85
99
  database omitted, letting asyncpg fall back to the username.
@@ -107,7 +121,7 @@ async def create_worker_database(
107
121
  ```
108
122
  """
109
123
  worker_url = worker_database_url(
110
- database_url=database_url, default_test_db=default_test_db
124
+ database_url=database_url, default_test_db=default_test_db, prefix=prefix
111
125
  )
112
126
  worker_db_name = make_url(worker_url).database
113
127
  assert worker_db_name is not None
@@ -125,13 +139,17 @@ async def create_worker_database(
125
139
  engine = create_async_engine(_server_url, isolation_level="AUTOCOMMIT")
126
140
  try:
127
141
  async with engine.connect() as conn:
128
- await conn.execute(text(f"DROP DATABASE IF EXISTS {worker_db_name}"))
142
+ await conn.execute(
143
+ text(f"DROP DATABASE IF EXISTS {worker_db_name} WITH (FORCE)")
144
+ )
129
145
  await create_database(db_name=worker_db_name, server_url=_server_url)
130
146
 
131
147
  yield worker_url
132
148
 
133
149
  async with engine.connect() as conn:
134
- await conn.execute(text(f"DROP DATABASE IF EXISTS {worker_db_name}"))
150
+ await conn.execute(
151
+ text(f"DROP DATABASE IF EXISTS {worker_db_name} WITH (FORCE)")
152
+ )
135
153
  finally:
136
154
  await engine.dispose()
137
155