sqlakit 0.9.1__tar.gz → 0.10.0__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 (30) hide show
  1. {sqlakit-0.9.1 → sqlakit-0.10.0}/PKG-INFO +1 -1
  2. {sqlakit-0.9.1 → sqlakit-0.10.0}/pyproject.toml +1 -1
  3. {sqlakit-0.9.1 → sqlakit-0.10.0}/pyproject.toml.orig +1 -1
  4. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_base.py +36 -4
  5. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/debugserver.html +30 -30
  6. {sqlakit-0.9.1 → sqlakit-0.10.0}/LICENSE +0 -0
  7. {sqlakit-0.9.1 → sqlakit-0.10.0}/README.md +0 -0
  8. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/__init__.py +0 -0
  9. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_cli.py +0 -0
  10. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_db.py +0 -0
  11. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_debugserver.py +0 -0
  12. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_discovery.py +0 -0
  13. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_model.py +0 -0
  14. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_query.py +0 -0
  15. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_recording.py +0 -0
  16. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_registry.py +0 -0
  17. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_routing.py +0 -0
  18. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/_sql.py +0 -0
  19. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/asyncio/__init__.py +0 -0
  20. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/asyncio/_db.py +0 -0
  21. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/asyncio/_registry.py +0 -0
  22. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/asyncio/orm.py +0 -0
  23. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/asyncio/sql.py +0 -0
  24. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/exceptions.py +0 -0
  25. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/orm.py +0 -0
  26. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/py.typed +0 -0
  27. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/pytest_plugin.py +0 -0
  28. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/sql.py +0 -0
  29. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/testing.py +0 -0
  30. {sqlakit-0.9.1 → sqlakit-0.10.0}/sqlakit/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlakit
3
- Version: 0.9.1
3
+ Version: 0.10.0
4
4
  Summary: A toolkit for SQLAlchemy applications.
5
5
  Keywords: sqlalchemy,database,orm,sql,asyncio
6
6
  Author: Anton Ruhlov
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sqlakit"
3
- version = "0.9.1"
3
+ version = "0.10.0"
4
4
  description = "A toolkit for SQLAlchemy applications."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sqlakit"
3
- version = "0.9.1"
3
+ version = "0.10.0"
4
4
  description = "A toolkit for SQLAlchemy applications."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -207,6 +207,7 @@ class BaseDatabase(Generic[ConnectionT, SessionT]):
207
207
  engine_args: EngineArgs | None = None,
208
208
  session_args: SessionArgs | None = None,
209
209
  templates: TemplatesLike | None = None,
210
+ alias: str | None = None,
210
211
  **parts: Unpack[UrlParts],
211
212
  ) -> None:
212
213
  """Build a database on ``url``, or on the parts to make one from.
@@ -221,8 +222,14 @@ class BaseDatabase(Generic[ConnectionT, SessionT]):
221
222
  )
222
223
 
223
224
  Database(DB_URL, templates="app/sql") # where `sql` reads templates from
225
+ Database(WAREHOUSE_URL, alias="warehouse") # what a recording calls it
224
226
  ```
225
227
 
228
+ ``alias`` is the name a recorded statement carries, for telling two
229
+ databases apart in a log or on the debug server's page. A registry
230
+ names the databases it holds after the aliases they are registered
231
+ under, so it is worth setting on a database you keep yourself.
232
+
226
233
  Raises:
227
234
  MissingDatabaseUrlError: if given neither a ``url`` nor the parts to
228
235
  build one.
@@ -259,7 +266,7 @@ class BaseDatabase(Generic[ConnectionT, SessionT]):
259
266
  self._listening = 0
260
267
  self._listened: Any = None
261
268
  self._listening_lock = threading.Lock()
262
- self._name = DEFAULT_ALIAS
269
+ self._name = alias or DEFAULT_ALIAS
263
270
 
264
271
  def __repr__(self) -> str:
265
272
  return f"{type(self).__name__}({self.url.render_as_string()!r})"
@@ -781,6 +788,7 @@ class _DatabaseRegistryMixin(BaseDatabase[Any, Any], Generic[DatabaseT]):
781
788
  skip_queries_from: Sequence[str | PathLike[str]] = (),
782
789
  into: Recording | None = None,
783
790
  debugserver: DebugServer | tuple[str, int] | None = None,
791
+ using: str | DatabaseT | Sequence[str | DatabaseT] | None = None,
784
792
  ) -> Iterator[Recording]:
785
793
  """Record every database this registry has, not the default one alone.
786
794
 
@@ -791,11 +799,26 @@ class _DatabaseRegistryMixin(BaseDatabase[Any, Any], Generic[DatabaseT]):
791
799
  record.databases # ("default", "warehouse")
792
800
  ```
793
801
 
794
- Statements say which database ran them. `db["warehouse"].recording()` records
795
- that one on its own.
802
+ Statements say which database ran them. ``using`` narrows the block to
803
+ the databases named, by alias or in person, as `assert_queries` takes
804
+ them:
805
+
806
+ ```python
807
+ with db.recording(using="warehouse"):
808
+ move_the_reports()
809
+
810
+ with db.recording(using=["default", "warehouse"]):
811
+ move_the_reports()
812
+ ```
813
+
814
+ `db["warehouse"].recording()` records that one on its own.
815
+
816
+ Raises:
817
+ UnknownDatabaseError: if ``using`` names an alias nothing holds.
818
+
796
819
  """
797
820
  together = Recording(label=label) if into is None else into
798
- databases = tuple(self[alias] for alias in self.aliases)
821
+ databases = self._recorded(using)
799
822
  with ExitStack() as stack:
800
823
  for db in databases:
801
824
  stack.enter_context(
@@ -817,6 +840,15 @@ class _DatabaseRegistryMixin(BaseDatabase[Any, Any], Generic[DatabaseT]):
817
840
  if debugserver is not None:
818
841
  send_recording(together, debugserver)
819
842
 
843
+ def _recorded(
844
+ self, using: str | DatabaseT | Sequence[str | DatabaseT] | None
845
+ ) -> tuple[Any, ...]:
846
+ """Return the databases a recording watches: the ones named, or all of them."""
847
+ if using is None:
848
+ return tuple(self[alias] for alias in self.aliases)
849
+ asked = using if isinstance(using, (list, tuple, set, frozenset)) else (using,)
850
+ return tuple(self[one] if isinstance(one, str) else one for one in asked)
851
+
820
852
  @staticmethod
821
853
  def _named(alias: str, db: DatabaseT) -> DatabaseT:
822
854
  """Let a database say which alias it answers to, when it is recorded."""