TypeDAL 4.2.1__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.1 → typedal-4.2.2}/CHANGELOG.md +6 -0
  2. {typedal-4.2.1 → typedal-4.2.2}/PKG-INFO +1 -1
  3. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/__about__.py +1 -1
  4. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/relationships.py +23 -0
  5. {typedal-4.2.1 → typedal-4.2.2}/.github/workflows/su6.yml +0 -0
  6. {typedal-4.2.1 → typedal-4.2.2}/.gitignore +0 -0
  7. {typedal-4.2.1 → typedal-4.2.2}/.readthedocs.yml +0 -0
  8. {typedal-4.2.1 → typedal-4.2.2}/README.md +0 -0
  9. {typedal-4.2.1 → typedal-4.2.2}/coverage.svg +0 -0
  10. {typedal-4.2.1 → typedal-4.2.2}/docs/1_getting_started.md +0 -0
  11. {typedal-4.2.1 → typedal-4.2.2}/docs/2_defining_tables.md +0 -0
  12. {typedal-4.2.1 → typedal-4.2.2}/docs/3_building_queries.md +0 -0
  13. {typedal-4.2.1 → typedal-4.2.2}/docs/4_relationships.md +0 -0
  14. {typedal-4.2.1 → typedal-4.2.2}/docs/5_py4web.md +0 -0
  15. {typedal-4.2.1 → typedal-4.2.2}/docs/6_migrations.md +0 -0
  16. {typedal-4.2.1 → typedal-4.2.2}/docs/7_configuration.md +0 -0
  17. {typedal-4.2.1 → typedal-4.2.2}/docs/8_mixins.md +0 -0
  18. {typedal-4.2.1 → typedal-4.2.2}/docs/css/code_blocks.css +0 -0
  19. {typedal-4.2.1 → typedal-4.2.2}/docs/index.md +0 -0
  20. {typedal-4.2.1 → typedal-4.2.2}/docs/requirements.txt +0 -0
  21. {typedal-4.2.1 → typedal-4.2.2}/example_new.py +0 -0
  22. {typedal-4.2.1 → typedal-4.2.2}/example_old.py +0 -0
  23. {typedal-4.2.1 → typedal-4.2.2}/mkdocs.yml +0 -0
  24. {typedal-4.2.1 → typedal-4.2.2}/pyproject.toml +0 -0
  25. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/__init__.py +0 -0
  26. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/caching.py +0 -0
  27. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/cli.py +0 -0
  28. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/config.py +0 -0
  29. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/constants.py +0 -0
  30. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/core.py +0 -0
  31. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/define.py +0 -0
  32. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/fields.py +0 -0
  33. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/for_py4web.py +0 -0
  34. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/for_web2py.py +0 -0
  35. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/helpers.py +0 -0
  36. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/mixins.py +0 -0
  37. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/py.typed +0 -0
  38. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/query_builder.py +0 -0
  39. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/rows.py +0 -0
  40. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/serializers/as_json.py +0 -0
  41. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/tables.py +0 -0
  42. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/types.py +0 -0
  43. {typedal-4.2.1 → typedal-4.2.2}/src/typedal/web2py_py4web_shared.py +0 -0
  44. {typedal-4.2.1 → typedal-4.2.2}/tests/__init__.py +0 -0
  45. {typedal-4.2.1 → typedal-4.2.2}/tests/configs/simple.toml +0 -0
  46. {typedal-4.2.1 → typedal-4.2.2}/tests/configs/valid.env +0 -0
  47. {typedal-4.2.1 → typedal-4.2.2}/tests/configs/valid.toml +0 -0
  48. {typedal-4.2.1 → typedal-4.2.2}/tests/py314_tests.py +0 -0
  49. {typedal-4.2.1 → typedal-4.2.2}/tests/test_cli.py +0 -0
  50. {typedal-4.2.1 → typedal-4.2.2}/tests/test_config.py +0 -0
  51. {typedal-4.2.1 → typedal-4.2.2}/tests/test_docs_examples.py +0 -0
  52. {typedal-4.2.1 → typedal-4.2.2}/tests/test_helpers.py +0 -0
  53. {typedal-4.2.1 → typedal-4.2.2}/tests/test_json.py +0 -0
  54. {typedal-4.2.1 → typedal-4.2.2}/tests/test_main.py +0 -0
  55. {typedal-4.2.1 → typedal-4.2.2}/tests/test_mixins.py +0 -0
  56. {typedal-4.2.1 → typedal-4.2.2}/tests/test_mypy.py +0 -0
  57. {typedal-4.2.1 → typedal-4.2.2}/tests/test_orm.py +0 -0
  58. {typedal-4.2.1 → typedal-4.2.2}/tests/test_py4web.py +0 -0
  59. {typedal-4.2.1 → typedal-4.2.2}/tests/test_query_builder.py +0 -0
  60. {typedal-4.2.1 → typedal-4.2.2}/tests/test_relationships.py +0 -0
  61. {typedal-4.2.1 → typedal-4.2.2}/tests/test_row.py +0 -0
  62. {typedal-4.2.1 → typedal-4.2.2}/tests/test_stats.py +0 -0
  63. {typedal-4.2.1 → typedal-4.2.2}/tests/test_table.py +0 -0
  64. {typedal-4.2.1 → typedal-4.2.2}/tests/test_web2py.py +0 -0
  65. {typedal-4.2.1 → typedal-4.2.2}/tests/test_xx_others.py +0 -0
  66. {typedal-4.2.1 → typedal-4.2.2}/tests/timings.py +0 -0
@@ -2,6 +2,12 @@
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
+
5
11
  ## v4.2.1 (2025-12-10)
6
12
 
7
13
  ### Fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TypeDAL
3
- Version: 4.2.1
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.1"
8
+ __version__ = "4.2.2"
@@ -277,6 +277,28 @@ def relationship(
277
277
  """
278
278
 
279
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,
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
+
280
302
  @t.overload
281
303
  def relationship(
282
304
  _type: t.Type[To_Type] | str,
@@ -313,6 +335,7 @@ def relationship(
313
335
  condition: Lambda function defining the join condition between tables.
314
336
  Example: lambda self, post: self.id == post.author
315
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.
316
339
  on: Alternative to condition for complex queries with pivot tables.
317
340
  Allows specifying multiple join conditions to avoid cross joins.
318
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