TypeDAL 4.9.4__tar.gz → 4.9.6__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 (80) hide show
  1. {typedal-4.9.4 → typedal-4.9.6}/CHANGELOG.md +12 -0
  2. {typedal-4.9.4 → typedal-4.9.6}/PKG-INFO +1 -1
  3. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/__about__.py +1 -1
  4. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/core.py +9 -0
  5. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/fields.py +5 -0
  6. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/relationships.py +1 -1
  7. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/tables.py +11 -0
  8. {typedal-4.9.4 → typedal-4.9.6}/tests/test_main.py +25 -0
  9. {typedal-4.9.4 → typedal-4.9.6}/.crush/.gitignore +0 -0
  10. {typedal-4.9.4 → typedal-4.9.6}/.crush/crush.db-shm +0 -0
  11. {typedal-4.9.4 → typedal-4.9.6}/.crush/crush.db-wal +0 -0
  12. {typedal-4.9.4 → typedal-4.9.6}/.crush/init +0 -0
  13. {typedal-4.9.4 → typedal-4.9.6}/.crush/logs/crush.log +0 -0
  14. {typedal-4.9.4 → typedal-4.9.6}/.github/workflows/su6.yml +0 -0
  15. {typedal-4.9.4 → typedal-4.9.6}/.gitignore +0 -0
  16. {typedal-4.9.4 → typedal-4.9.6}/.readthedocs.yml +0 -0
  17. {typedal-4.9.4 → typedal-4.9.6}/README.md +0 -0
  18. {typedal-4.9.4 → typedal-4.9.6}/coverage.svg +0 -0
  19. {typedal-4.9.4 → typedal-4.9.6}/docs/10_advanced_apis.md +0 -0
  20. {typedal-4.9.4 → typedal-4.9.6}/docs/1_getting_started.md +0 -0
  21. {typedal-4.9.4 → typedal-4.9.6}/docs/2_defining_tables.md +0 -0
  22. {typedal-4.9.4 → typedal-4.9.6}/docs/3_building_queries.md +0 -0
  23. {typedal-4.9.4 → typedal-4.9.6}/docs/4_relationships.md +0 -0
  24. {typedal-4.9.4 → typedal-4.9.6}/docs/5_py4web.md +0 -0
  25. {typedal-4.9.4 → typedal-4.9.6}/docs/6_migrations.md +0 -0
  26. {typedal-4.9.4 → typedal-4.9.6}/docs/7_configuration.md +0 -0
  27. {typedal-4.9.4 → typedal-4.9.6}/docs/8_mixins.md +0 -0
  28. {typedal-4.9.4 → typedal-4.9.6}/docs/9_memoization.md +0 -0
  29. {typedal-4.9.4 → typedal-4.9.6}/docs/css/code_blocks.css +0 -0
  30. {typedal-4.9.4 → typedal-4.9.6}/docs/index.md +0 -0
  31. {typedal-4.9.4 → typedal-4.9.6}/docs/requirements.txt +0 -0
  32. {typedal-4.9.4 → typedal-4.9.6}/example_new.py +0 -0
  33. {typedal-4.9.4 → typedal-4.9.6}/example_old.py +0 -0
  34. {typedal-4.9.4 → typedal-4.9.6}/mkdocs.yml +0 -0
  35. {typedal-4.9.4 → typedal-4.9.6}/pyproject.toml +0 -0
  36. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/__init__.py +0 -0
  37. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/caching.py +0 -0
  38. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/cli.py +0 -0
  39. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/config.py +0 -0
  40. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/constants.py +0 -0
  41. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/define.py +0 -0
  42. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/enum_helpers.py +0 -0
  43. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/for_py4web.py +0 -0
  44. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/for_web2py.py +0 -0
  45. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/helpers.py +0 -0
  46. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/mixins.py +0 -0
  47. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/py.typed +0 -0
  48. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/query_builder.py +0 -0
  49. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/rows.py +0 -0
  50. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/serializers/as_json.py +0 -0
  51. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/serializers/typescript.py +0 -0
  52. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/types.py +0 -0
  53. {typedal-4.9.4 → typedal-4.9.6}/src/typedal/web2py_py4web_shared.py +0 -0
  54. {typedal-4.9.4 → typedal-4.9.6}/tasks.py +0 -0
  55. {typedal-4.9.4 → typedal-4.9.6}/tests/__init__.py +0 -0
  56. {typedal-4.9.4 → typedal-4.9.6}/tests/configs/simple.toml +0 -0
  57. {typedal-4.9.4 → typedal-4.9.6}/tests/configs/valid.env +0 -0
  58. {typedal-4.9.4 → typedal-4.9.6}/tests/configs/valid.toml +0 -0
  59. {typedal-4.9.4 → typedal-4.9.6}/tests/conftest.py +0 -0
  60. {typedal-4.9.4 → typedal-4.9.6}/tests/py314_tests.py +0 -0
  61. {typedal-4.9.4 → typedal-4.9.6}/tests/test_cli.py +0 -0
  62. {typedal-4.9.4 → typedal-4.9.6}/tests/test_config.py +0 -0
  63. {typedal-4.9.4 → typedal-4.9.6}/tests/test_docs_examples.py +0 -0
  64. {typedal-4.9.4 → typedal-4.9.6}/tests/test_helpers.py +0 -0
  65. {typedal-4.9.4 → typedal-4.9.6}/tests/test_json.py +0 -0
  66. {typedal-4.9.4 → typedal-4.9.6}/tests/test_mixins.py +0 -0
  67. {typedal-4.9.4 → typedal-4.9.6}/tests/test_mypy.py +0 -0
  68. {typedal-4.9.4 → typedal-4.9.6}/tests/test_orm.py +0 -0
  69. {typedal-4.9.4 → typedal-4.9.6}/tests/test_py4web.py +0 -0
  70. {typedal-4.9.4 → typedal-4.9.6}/tests/test_query_builder.py +0 -0
  71. {typedal-4.9.4 → typedal-4.9.6}/tests/test_relationships.py +0 -0
  72. {typedal-4.9.4 → typedal-4.9.6}/tests/test_row.py +0 -0
  73. {typedal-4.9.4 → typedal-4.9.6}/tests/test_stats.py +0 -0
  74. {typedal-4.9.4 → typedal-4.9.6}/tests/test_table.py +0 -0
  75. {typedal-4.9.4 → typedal-4.9.6}/tests/test_typescript.py +0 -0
  76. {typedal-4.9.4 → typedal-4.9.6}/tests/test_typing_mypy.md +0 -0
  77. {typedal-4.9.4 → typedal-4.9.6}/tests/test_typing_pyright.md +0 -0
  78. {typedal-4.9.4 → typedal-4.9.6}/tests/test_web2py.py +0 -0
  79. {typedal-4.9.4 → typedal-4.9.6}/tests/test_xx_others.py +0 -0
  80. {typedal-4.9.4 → typedal-4.9.6}/tests/timings.py +0 -0
@@ -2,6 +2,18 @@
2
2
 
3
3
  <!--next-version-placeholder-->
4
4
 
5
+ ## v4.9.6 (2026-07-14)
6
+
7
+ ### Fix
8
+
9
+ * **core:** Unbind models when closing database ([`e025d0c`](https://github.com/trialandsuccess/TypeDAL/commit/e025d0c13cdb95943ad22430d9822171834c3092))
10
+
11
+ ## v4.9.5 (2026-07-05)
12
+
13
+ ### Fix
14
+
15
+ * Restore 3.12-support syntax-wise ([`908a5a4`](https://github.com/trialandsuccess/TypeDAL/commit/908a5a49f2a83637acba7073ef3062ab2dd84496))
16
+
5
17
  ## v4.9.4 (2026-07-03)
6
18
 
7
19
  ### Fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TypeDAL
3
- Version: 4.9.4
3
+ Version: 4.9.6
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.9.4"
8
+ __version__ = "4.9.6"
@@ -280,6 +280,15 @@ class TypeDAL(_TypeDALBase):
280
280
  self.try_define(_TypedalCache)
281
281
  self.try_define(_TypedalCacheDependency)
282
282
 
283
+ def close(self) -> None:
284
+ """Close the database connection and unbind all defined TypedTable models."""
285
+ try:
286
+ super().close()
287
+ finally:
288
+ for model in set(self._builder.class_map.values()):
289
+ model.unbind()
290
+ self._builder.class_map.clear()
291
+
283
292
  def try_define[T: t.Any](self, model: t.Type[T], verbose: bool = False) -> t.Type[T]:
284
293
  """
285
294
  Try to define a model with migrate or fall back to fake migrate.
@@ -197,6 +197,11 @@ class TypedField[T_Value](Expression): # pragma: no cover
197
197
  self._table = table
198
198
  self._field = field
199
199
 
200
+ def unbind(self) -> None:
201
+ """Remove references to the pydal objects created during ``bind``."""
202
+ self._table = None
203
+ self._field = None
204
+
200
205
  def __getattr__(self, key: str) -> t.Any:
201
206
  """
202
207
  If the regular getattribute does not work, try to get info from the related Field.
@@ -237,7 +237,7 @@ class Relationship[To_Type]:
237
237
 
238
238
  def __get__(
239
239
  self,
240
- instance: "TypedTable" | None,
240
+ instance: "TypedTable | None",
241
241
  owner: t.Type["TypedTable"],
242
242
  ) -> "Relationship[To_Type] | list[t.Any] | t.Any | None":
243
243
  """
@@ -121,6 +121,17 @@ class TableMeta(type):
121
121
  self._relationships = relationships
122
122
  self._permissions = merge_permissions(permissions)
123
123
 
124
+ def unbind(self) -> None:
125
+ """Remove the database bindings created by ``db.define``."""
126
+ for value in self.__dict__.values():
127
+ if isinstance(value, TypedField):
128
+ value.unbind()
129
+
130
+ self._db = None
131
+ self._table = None
132
+ self._relationships = None
133
+ self._permissions = None
134
+
124
135
  def __getattr__(self, col: str) -> t.Optional[Field]:
125
136
  """
126
137
  Magic method used by TypedTableMeta to get a database field with dot notation on a class.
@@ -1,7 +1,9 @@
1
1
  import enum
2
+ import gc
2
3
  import re
3
4
  import sys
4
5
  import typing
6
+ import weakref
5
7
  from copy import copy
6
8
  from sqlite3 import IntegrityError
7
9
  from typing import ForwardRef
@@ -22,6 +24,29 @@ def test_about():
22
24
  db = TypeDAL("sqlite:memory")
23
25
 
24
26
 
27
+ def test_database_is_garbage_collected_after_close():
28
+ db = TypeDAL("sqlite:memory", enable_typedal_caching=False)
29
+
30
+ @db.define
31
+ class TemporaryTable(TypedTable):
32
+ value = TypedField(str)
33
+
34
+ field = TemporaryTable.__dict__["value"]
35
+ db_ref = weakref.ref(db)
36
+
37
+ db.close()
38
+
39
+ assert TemporaryTable._db is None
40
+ assert TemporaryTable._table is None
41
+ assert field._table is None
42
+ assert field._field is None
43
+
44
+ del db
45
+ gc.collect()
46
+
47
+ assert db_ref() is None
48
+
49
+
25
50
  def test_mixed_defines(capsys):
26
51
  ### DEFINE
27
52
 
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