TypeDAL 4.2.0__tar.gz → 4.2.2__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.2}/CHANGELOG.md +12 -0
- {typedal-4.2.0 → typedal-4.2.2}/PKG-INFO +1 -1
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/__about__.py +1 -1
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/cli.py +2 -1
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/query_builder.py +3 -2
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/relationships.py +64 -1
- {typedal-4.2.0 → typedal-4.2.2}/.github/workflows/su6.yml +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/.gitignore +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/.readthedocs.yml +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/README.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/coverage.svg +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/1_getting_started.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/2_defining_tables.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/3_building_queries.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/4_relationships.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/5_py4web.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/6_migrations.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/7_configuration.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/8_mixins.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/css/code_blocks.css +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/index.md +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/docs/requirements.txt +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/example_new.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/example_old.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/mkdocs.yml +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/pyproject.toml +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/__init__.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/caching.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/config.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/constants.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/core.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/define.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/fields.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/for_py4web.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/for_web2py.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/helpers.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/mixins.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/py.typed +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/rows.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/serializers/as_json.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/tables.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/types.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/src/typedal/web2py_py4web_shared.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/__init__.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/configs/simple.toml +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/configs/valid.env +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/configs/valid.toml +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/py314_tests.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_cli.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_config.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_docs_examples.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_helpers.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_json.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_main.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_mixins.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_mypy.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_orm.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_py4web.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_query_builder.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_relationships.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_row.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_stats.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_table.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_web2py.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/test_xx_others.py +0 -0
- {typedal-4.2.0 → typedal-4.2.2}/tests/timings.py +0 -0
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
<!--next-version-placeholder-->
|
|
4
4
|
|
|
5
|
+
## v4.2.2 (2025-12-10)
|
|
6
|
+
|
|
7
|
+
### Fix
|
|
8
|
+
|
|
9
|
+
* Improved type hints for relationships (when join='inner') ([`e54cf91`](https://github.com/trialandsuccess/TypeDAL/commit/e54cf918461757b2fd146f1f3c7d9957c723f68c))
|
|
10
|
+
|
|
11
|
+
## v4.2.1 (2025-12-10)
|
|
12
|
+
|
|
13
|
+
### Fix
|
|
14
|
+
|
|
15
|
+
* Improved type hints for relationships (non-list) ([`3fb53bc`](https://github.com/trialandsuccess/TypeDAL/commit/3fb53bc7a9b4c53c1bc533124ed205c5ec46fa92))
|
|
16
|
+
|
|
5
17
|
## v4.2.0 (2025-11-28)
|
|
6
18
|
|
|
7
19
|
### 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,14 +257,76 @@ class Relationship(t.Generic[To_Type]):
|
|
|
257
257
|
return fallback_value
|
|
258
258
|
|
|
259
259
|
|
|
260
|
+
@t.overload
|
|
260
261
|
def relationship(
|
|
261
|
-
_type:
|
|
262
|
+
_type: type[list[To_Type]],
|
|
262
263
|
condition: Condition = None,
|
|
263
264
|
join: JOIN_OPTIONS = None,
|
|
264
265
|
on: OnQuery = None,
|
|
265
266
|
lazy: LazyPolicy | None = None,
|
|
266
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
|
|
281
|
+
def relationship(
|
|
282
|
+
_type: t.Type[To_Type] | str,
|
|
283
|
+
condition: Condition = None,
|
|
284
|
+
*,
|
|
285
|
+
join: t.Literal["inner"],
|
|
286
|
+
on: OnQuery = None,
|
|
287
|
+
lazy: LazyPolicy | None = None,
|
|
288
|
+
explicit: bool = False,
|
|
267
289
|
) -> To_Type:
|
|
290
|
+
"""
|
|
291
|
+
Define a relationship that returns a single related instance (never None with inner join).
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
_type: A type or string reference like City to indicate a single related record.
|
|
295
|
+
join: Set to 'inner' to guarantee a non-null result.
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
A single related instance (guaranteed non-null with inner join).
|
|
299
|
+
"""
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
@t.overload
|
|
303
|
+
def relationship(
|
|
304
|
+
_type: t.Type[To_Type] | str,
|
|
305
|
+
condition: Condition = None,
|
|
306
|
+
join: JOIN_OPTIONS = None,
|
|
307
|
+
on: OnQuery = None,
|
|
308
|
+
lazy: LazyPolicy | None = None,
|
|
309
|
+
explicit: bool = False,
|
|
310
|
+
) -> To_Type | None:
|
|
311
|
+
"""
|
|
312
|
+
Define a relationship that returns a single optional related instance.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
_type: A type or string reference like City to indicate a single related record.
|
|
316
|
+
|
|
317
|
+
Returns:
|
|
318
|
+
A single related instance or None.
|
|
319
|
+
"""
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def relationship(
|
|
323
|
+
_type: type[list[To_Type]] | t.Type[To_Type] | str,
|
|
324
|
+
condition: Condition = None,
|
|
325
|
+
join: JOIN_OPTIONS = None,
|
|
326
|
+
on: OnQuery = None,
|
|
327
|
+
lazy: LazyPolicy | None = None,
|
|
328
|
+
explicit: bool = False,
|
|
329
|
+
) -> list[To_Type] | To_Type | None:
|
|
268
330
|
"""
|
|
269
331
|
Define a relationship to another table, when its id is not stored in the current table.
|
|
270
332
|
|
|
@@ -273,6 +335,7 @@ def relationship(
|
|
|
273
335
|
condition: Lambda function defining the join condition between tables.
|
|
274
336
|
Example: lambda self, post: self.id == post.author
|
|
275
337
|
join: Join strategy ('left', 'inner', etc.). Defaults to 'left' when using 'on'.
|
|
338
|
+
When 'inner' is used with a single type, the result is guaranteed non-null.
|
|
276
339
|
on: Alternative to condition for complex queries with pivot tables.
|
|
277
340
|
Allows specifying multiple join conditions to avoid cross joins.
|
|
278
341
|
lazy: Controls behavior when accessing relationship data without explicitly joining:
|
|
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
|