TypeDAL 4.2.0__tar.gz → 4.2.1__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.2.0 → typedal-4.2.1}/CHANGELOG.md +6 -0
- {typedal-4.2.0 → typedal-4.2.1}/PKG-INFO +1 -1
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/__about__.py +1 -1
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/cli.py +2 -1
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/query_builder.py +3 -2
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/relationships.py +41 -1
- {typedal-4.2.0 → typedal-4.2.1}/.github/workflows/su6.yml +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/.gitignore +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/.readthedocs.yml +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/README.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/coverage.svg +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/1_getting_started.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/2_defining_tables.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/3_building_queries.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/4_relationships.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/5_py4web.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/6_migrations.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/7_configuration.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/8_mixins.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/css/code_blocks.css +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/index.md +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/docs/requirements.txt +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/example_new.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/example_old.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/mkdocs.yml +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/pyproject.toml +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/__init__.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/caching.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/config.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/constants.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/core.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/define.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/fields.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/for_py4web.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/for_web2py.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/helpers.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/mixins.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/py.typed +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/rows.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/serializers/as_json.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/tables.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/types.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/src/typedal/web2py_py4web_shared.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/__init__.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/configs/simple.toml +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/configs/valid.env +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/configs/valid.toml +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/py314_tests.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_cli.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_config.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_docs_examples.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_helpers.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_json.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_main.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_mixins.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_mypy.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_orm.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_py4web.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_query_builder.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_relationships.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_row.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_stats.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_table.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_web2py.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/test_xx_others.py +0 -0
- {typedal-4.2.0 → typedal-4.2.1}/tests/timings.py +0 -0
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
<!--next-version-placeholder-->
|
|
4
4
|
|
|
5
|
+
## v4.2.1 (2025-12-10)
|
|
6
|
+
|
|
7
|
+
### Fix
|
|
8
|
+
|
|
9
|
+
* Improved type hints for relationships (non-list) ([`3fb53bc`](https://github.com/trialandsuccess/TypeDAL/commit/3fb53bc7a9b4c53c1bc533124ed205c5ec46fa92))
|
|
10
|
+
|
|
5
11
|
## v4.2.0 (2025-11-28)
|
|
6
12
|
|
|
7
13
|
### Feature
|
|
@@ -392,7 +392,8 @@ def fake_migrations(
|
|
|
392
392
|
|
|
393
393
|
previously_migrated = (
|
|
394
394
|
db(
|
|
395
|
-
db.ewh_implemented_features.name.belongs(to_fake)
|
|
395
|
+
db.ewh_implemented_features.name.belongs(to_fake)
|
|
396
|
+
& (db.ewh_implemented_features.installed == True) # noqa E712
|
|
396
397
|
)
|
|
397
398
|
.select(db.ewh_implemented_features.name)
|
|
398
399
|
.column("name")
|
|
@@ -36,6 +36,7 @@ from .types import (
|
|
|
36
36
|
SelectKwargs,
|
|
37
37
|
T,
|
|
38
38
|
T_MetaInstance,
|
|
39
|
+
Table,
|
|
39
40
|
)
|
|
40
41
|
|
|
41
42
|
|
|
@@ -76,13 +77,13 @@ class QueryBuilder(t.Generic[T_MetaInstance]):
|
|
|
76
77
|
self.relationships = relationships or {}
|
|
77
78
|
self.metadata = metadata or {}
|
|
78
79
|
|
|
79
|
-
def _ensure_table_defined(self):
|
|
80
|
+
def _ensure_table_defined(self) -> Table:
|
|
80
81
|
model = self.model
|
|
81
82
|
if hasattr(model, "_ensure_table_defined"):
|
|
82
83
|
return model._ensure_table_defined()
|
|
83
84
|
else:
|
|
84
85
|
# already a pydal table
|
|
85
|
-
return model
|
|
86
|
+
return t.cast(Table, model)
|
|
86
87
|
|
|
87
88
|
def __str__(self) -> str:
|
|
88
89
|
"""
|
|
@@ -257,6 +257,27 @@ class Relationship(t.Generic[To_Type]):
|
|
|
257
257
|
return fallback_value
|
|
258
258
|
|
|
259
259
|
|
|
260
|
+
@t.overload
|
|
261
|
+
def relationship(
|
|
262
|
+
_type: type[list[To_Type]],
|
|
263
|
+
condition: Condition = None,
|
|
264
|
+
join: JOIN_OPTIONS = None,
|
|
265
|
+
on: OnQuery = None,
|
|
266
|
+
lazy: LazyPolicy | None = None,
|
|
267
|
+
explicit: bool = False,
|
|
268
|
+
) -> list[To_Type]:
|
|
269
|
+
"""
|
|
270
|
+
Define a relationship that returns a list of related instances.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
_type: A list type hint like list[Office] to indicate multiple related records.
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
A list of related instances.
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
@t.overload
|
|
260
281
|
def relationship(
|
|
261
282
|
_type: t.Type[To_Type] | str,
|
|
262
283
|
condition: Condition = None,
|
|
@@ -264,7 +285,26 @@ def relationship(
|
|
|
264
285
|
on: OnQuery = None,
|
|
265
286
|
lazy: LazyPolicy | None = None,
|
|
266
287
|
explicit: bool = False,
|
|
267
|
-
) -> To_Type:
|
|
288
|
+
) -> To_Type | None:
|
|
289
|
+
"""
|
|
290
|
+
Define a relationship that returns a single optional related instance.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
_type: A type or string reference like City to indicate a single related record.
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
A single related instance or None.
|
|
297
|
+
"""
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def relationship(
|
|
301
|
+
_type: type[list[To_Type]] | t.Type[To_Type] | str,
|
|
302
|
+
condition: Condition = None,
|
|
303
|
+
join: JOIN_OPTIONS = None,
|
|
304
|
+
on: OnQuery = None,
|
|
305
|
+
lazy: LazyPolicy | None = None,
|
|
306
|
+
explicit: bool = False,
|
|
307
|
+
) -> list[To_Type] | To_Type | None:
|
|
268
308
|
"""
|
|
269
309
|
Define a relationship to another table, when its id is not stored in the current table.
|
|
270
310
|
|
|
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
|