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.
Files changed (66) hide show
  1. {typedal-4.2.0 → typedal-4.2.2}/CHANGELOG.md +12 -0
  2. {typedal-4.2.0 → typedal-4.2.2}/PKG-INFO +1 -1
  3. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/__about__.py +1 -1
  4. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/cli.py +2 -1
  5. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/query_builder.py +3 -2
  6. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/relationships.py +64 -1
  7. {typedal-4.2.0 → typedal-4.2.2}/.github/workflows/su6.yml +0 -0
  8. {typedal-4.2.0 → typedal-4.2.2}/.gitignore +0 -0
  9. {typedal-4.2.0 → typedal-4.2.2}/.readthedocs.yml +0 -0
  10. {typedal-4.2.0 → typedal-4.2.2}/README.md +0 -0
  11. {typedal-4.2.0 → typedal-4.2.2}/coverage.svg +0 -0
  12. {typedal-4.2.0 → typedal-4.2.2}/docs/1_getting_started.md +0 -0
  13. {typedal-4.2.0 → typedal-4.2.2}/docs/2_defining_tables.md +0 -0
  14. {typedal-4.2.0 → typedal-4.2.2}/docs/3_building_queries.md +0 -0
  15. {typedal-4.2.0 → typedal-4.2.2}/docs/4_relationships.md +0 -0
  16. {typedal-4.2.0 → typedal-4.2.2}/docs/5_py4web.md +0 -0
  17. {typedal-4.2.0 → typedal-4.2.2}/docs/6_migrations.md +0 -0
  18. {typedal-4.2.0 → typedal-4.2.2}/docs/7_configuration.md +0 -0
  19. {typedal-4.2.0 → typedal-4.2.2}/docs/8_mixins.md +0 -0
  20. {typedal-4.2.0 → typedal-4.2.2}/docs/css/code_blocks.css +0 -0
  21. {typedal-4.2.0 → typedal-4.2.2}/docs/index.md +0 -0
  22. {typedal-4.2.0 → typedal-4.2.2}/docs/requirements.txt +0 -0
  23. {typedal-4.2.0 → typedal-4.2.2}/example_new.py +0 -0
  24. {typedal-4.2.0 → typedal-4.2.2}/example_old.py +0 -0
  25. {typedal-4.2.0 → typedal-4.2.2}/mkdocs.yml +0 -0
  26. {typedal-4.2.0 → typedal-4.2.2}/pyproject.toml +0 -0
  27. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/__init__.py +0 -0
  28. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/caching.py +0 -0
  29. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/config.py +0 -0
  30. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/constants.py +0 -0
  31. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/core.py +0 -0
  32. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/define.py +0 -0
  33. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/fields.py +0 -0
  34. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/for_py4web.py +0 -0
  35. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/for_web2py.py +0 -0
  36. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/helpers.py +0 -0
  37. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/mixins.py +0 -0
  38. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/py.typed +0 -0
  39. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/rows.py +0 -0
  40. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/serializers/as_json.py +0 -0
  41. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/tables.py +0 -0
  42. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/types.py +0 -0
  43. {typedal-4.2.0 → typedal-4.2.2}/src/typedal/web2py_py4web_shared.py +0 -0
  44. {typedal-4.2.0 → typedal-4.2.2}/tests/__init__.py +0 -0
  45. {typedal-4.2.0 → typedal-4.2.2}/tests/configs/simple.toml +0 -0
  46. {typedal-4.2.0 → typedal-4.2.2}/tests/configs/valid.env +0 -0
  47. {typedal-4.2.0 → typedal-4.2.2}/tests/configs/valid.toml +0 -0
  48. {typedal-4.2.0 → typedal-4.2.2}/tests/py314_tests.py +0 -0
  49. {typedal-4.2.0 → typedal-4.2.2}/tests/test_cli.py +0 -0
  50. {typedal-4.2.0 → typedal-4.2.2}/tests/test_config.py +0 -0
  51. {typedal-4.2.0 → typedal-4.2.2}/tests/test_docs_examples.py +0 -0
  52. {typedal-4.2.0 → typedal-4.2.2}/tests/test_helpers.py +0 -0
  53. {typedal-4.2.0 → typedal-4.2.2}/tests/test_json.py +0 -0
  54. {typedal-4.2.0 → typedal-4.2.2}/tests/test_main.py +0 -0
  55. {typedal-4.2.0 → typedal-4.2.2}/tests/test_mixins.py +0 -0
  56. {typedal-4.2.0 → typedal-4.2.2}/tests/test_mypy.py +0 -0
  57. {typedal-4.2.0 → typedal-4.2.2}/tests/test_orm.py +0 -0
  58. {typedal-4.2.0 → typedal-4.2.2}/tests/test_py4web.py +0 -0
  59. {typedal-4.2.0 → typedal-4.2.2}/tests/test_query_builder.py +0 -0
  60. {typedal-4.2.0 → typedal-4.2.2}/tests/test_relationships.py +0 -0
  61. {typedal-4.2.0 → typedal-4.2.2}/tests/test_row.py +0 -0
  62. {typedal-4.2.0 → typedal-4.2.2}/tests/test_stats.py +0 -0
  63. {typedal-4.2.0 → typedal-4.2.2}/tests/test_table.py +0 -0
  64. {typedal-4.2.0 → typedal-4.2.2}/tests/test_web2py.py +0 -0
  65. {typedal-4.2.0 → typedal-4.2.2}/tests/test_xx_others.py +0 -0
  66. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TypeDAL
3
- Version: 4.2.0
3
+ Version: 4.2.2
4
4
  Summary: Typing support for PyDAL
5
5
  Project-URL: Documentation, https://typedal.readthedocs.io/
6
6
  Project-URL: Issues, https://github.com/trialandsuccess/TypeDAL/issues
@@ -5,4 +5,4 @@ This file contains the Version info for this package.
5
5
  # SPDX-FileCopyrightText: 2023-present Robin van der Noord <robinvandernoord@gmail.com>
6
6
  #
7
7
  # SPDX-License-Identifier: MIT
8
- __version__ = "4.2.0"
8
+ __version__ = "4.2.2"
@@ -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) & (db.ewh_implemented_features.installed == True) # noqa E712
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: t.Type[To_Type] | str,
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