TypeDAL 4.4.3__tar.gz → 4.4.4__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.
- {typedal-4.4.3 → typedal-4.4.4}/CHANGELOG.md +6 -0
- {typedal-4.4.3 → typedal-4.4.4}/PKG-INFO +1 -1
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/__about__.py +1 -1
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/relationships.py +8 -1
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_relationships.py +4 -1
- {typedal-4.4.3 → typedal-4.4.4}/.crush/.gitignore +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/.crush/crush.db-shm +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/.crush/crush.db-wal +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/.crush/init +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/.crush/logs/crush.log +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/.github/workflows/su6.yml +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/.gitignore +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/.readthedocs.yml +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/README.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/coverage.svg +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/1_getting_started.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/2_defining_tables.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/3_building_queries.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/4_relationships.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/5_py4web.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/6_migrations.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/7_configuration.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/8_mixins.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/9_memoization.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/css/code_blocks.css +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/index.md +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/docs/requirements.txt +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/example_new.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/example_old.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/mkdocs.yml +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/pyproject.toml +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/__init__.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/caching.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/cli.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/config.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/constants.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/core.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/define.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/fields.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/for_py4web.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/for_web2py.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/helpers.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/mixins.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/py.typed +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/query_builder.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/rows.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/serializers/as_json.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/tables.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/types.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/src/typedal/web2py_py4web_shared.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tasks.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/__init__.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/configs/simple.toml +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/configs/valid.env +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/configs/valid.toml +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/py314_tests.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_cli.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_config.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_docs_examples.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_helpers.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_json.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_main.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_mixins.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_mypy.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_orm.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_py4web.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_query_builder.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_row.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_stats.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_table.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_web2py.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/test_xx_others.py +0 -0
- {typedal-4.4.3 → typedal-4.4.4}/tests/timings.py +0 -0
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
<!--next-version-placeholder-->
|
|
4
4
|
|
|
5
|
+
## v4.4.4 (2026-02-25)
|
|
6
|
+
|
|
7
|
+
### Fix
|
|
8
|
+
|
|
9
|
+
* **relationship:** Ensure get_db() also works with forward references by looking at other table (owner) as fallback ([`17dd7b4`](https://github.com/trialandsuccess/TypeDAL/commit/17dd7b4273819f2edf6d427264ee1a81622ef597))
|
|
10
|
+
|
|
5
11
|
## v4.4.3 (2026-02-11)
|
|
6
12
|
|
|
7
13
|
### Fix
|
|
@@ -37,6 +37,7 @@ class Relationship(t.Generic[To_Type]):
|
|
|
37
37
|
nested: dict[str, t.Self]
|
|
38
38
|
explicit: bool
|
|
39
39
|
name: str | None = None # set by __set_name__
|
|
40
|
+
_owner: t.Type["TypedTable"] | None = None
|
|
40
41
|
|
|
41
42
|
def __init__(
|
|
42
43
|
self,
|
|
@@ -120,6 +121,7 @@ class Relationship(t.Generic[To_Type]):
|
|
|
120
121
|
|
|
121
122
|
def __set_name__(self, owner: t.Type["TypedTable"], name: str) -> None:
|
|
122
123
|
"""Called automatically when assigned to a class attribute."""
|
|
124
|
+
self._owner = owner
|
|
123
125
|
self.name = name
|
|
124
126
|
|
|
125
127
|
def get_table(self, db: "TypeDAL") -> t.Type["TypedTable"]:
|
|
@@ -145,7 +147,12 @@ class Relationship(t.Generic[To_Type]):
|
|
|
145
147
|
Returns:
|
|
146
148
|
TypeDAL | None: The database instance if it exists, or None otherwise.
|
|
147
149
|
"""
|
|
148
|
-
|
|
150
|
+
target = self.table
|
|
151
|
+
|
|
152
|
+
if isinstance(target, str) and (owner := self._owner):
|
|
153
|
+
target = owner
|
|
154
|
+
|
|
155
|
+
return getattr(target, "_db", None)
|
|
149
156
|
|
|
150
157
|
@property
|
|
151
158
|
def lazy(self) -> LazyPolicy:
|
|
@@ -19,7 +19,7 @@ from src.typedal.caching import (
|
|
|
19
19
|
from src.typedal.serializers import as_json
|
|
20
20
|
from typedal import TypedRows
|
|
21
21
|
|
|
22
|
-
db = TypeDAL("sqlite:memory")
|
|
22
|
+
db = TypeDAL("sqlite:memory", lazy_policy="warn")
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class TaggableMixin:
|
|
@@ -336,6 +336,7 @@ def test_reprs():
|
|
|
336
336
|
empty = Relationship("article")
|
|
337
337
|
|
|
338
338
|
assert empty.get_table(db) == Article
|
|
339
|
+
assert empty.get_db() is None
|
|
339
340
|
|
|
340
341
|
db.define_table("new")
|
|
341
342
|
empty = Relationship("new")
|
|
@@ -345,8 +346,10 @@ def test_reprs():
|
|
|
345
346
|
|
|
346
347
|
empty = Relationship(db.new)
|
|
347
348
|
assert empty.get_table(db) == db.new
|
|
349
|
+
assert empty.get_db() == db
|
|
348
350
|
|
|
349
351
|
assert empty.get_table_name() == "new"
|
|
352
|
+
assert User.bestie.get_db() == db
|
|
350
353
|
|
|
351
354
|
relation = Article.join("author").relationships["author"]
|
|
352
355
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|