TypeDAL 3.14.3__tar.gz → 3.15.0__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.

Potentially problematic release.


This version of TypeDAL might be problematic. Click here for more details.

Files changed (58) hide show
  1. {typedal-3.14.3 → typedal-3.15.0}/CHANGELOG.md +6 -0
  2. {typedal-3.14.3 → typedal-3.15.0}/PKG-INFO +1 -1
  3. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/__about__.py +1 -1
  4. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/core.py +19 -11
  5. {typedal-3.14.3 → typedal-3.15.0}/tests/test_query_builder.py +18 -0
  6. {typedal-3.14.3 → typedal-3.15.0}/.github/workflows/su6.yml +0 -0
  7. {typedal-3.14.3 → typedal-3.15.0}/.gitignore +0 -0
  8. {typedal-3.14.3 → typedal-3.15.0}/.readthedocs.yml +0 -0
  9. {typedal-3.14.3 → typedal-3.15.0}/README.md +0 -0
  10. {typedal-3.14.3 → typedal-3.15.0}/coverage.svg +0 -0
  11. {typedal-3.14.3 → typedal-3.15.0}/docs/1_getting_started.md +0 -0
  12. {typedal-3.14.3 → typedal-3.15.0}/docs/2_defining_tables.md +0 -0
  13. {typedal-3.14.3 → typedal-3.15.0}/docs/3_building_queries.md +0 -0
  14. {typedal-3.14.3 → typedal-3.15.0}/docs/4_relationships.md +0 -0
  15. {typedal-3.14.3 → typedal-3.15.0}/docs/5_py4web.md +0 -0
  16. {typedal-3.14.3 → typedal-3.15.0}/docs/6_migrations.md +0 -0
  17. {typedal-3.14.3 → typedal-3.15.0}/docs/7_mixins.md +0 -0
  18. {typedal-3.14.3 → typedal-3.15.0}/docs/css/code_blocks.css +0 -0
  19. {typedal-3.14.3 → typedal-3.15.0}/docs/index.md +0 -0
  20. {typedal-3.14.3 → typedal-3.15.0}/docs/requirements.txt +0 -0
  21. {typedal-3.14.3 → typedal-3.15.0}/example_new.py +0 -0
  22. {typedal-3.14.3 → typedal-3.15.0}/example_old.py +0 -0
  23. {typedal-3.14.3 → typedal-3.15.0}/mkdocs.yml +0 -0
  24. {typedal-3.14.3 → typedal-3.15.0}/pyproject.toml +0 -0
  25. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/__init__.py +0 -0
  26. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/caching.py +0 -0
  27. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/cli.py +0 -0
  28. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/config.py +0 -0
  29. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/fields.py +0 -0
  30. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/for_py4web.py +0 -0
  31. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/for_web2py.py +0 -0
  32. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/helpers.py +0 -0
  33. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/mixins.py +0 -0
  34. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/py.typed +0 -0
  35. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/serializers/as_json.py +0 -0
  36. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/types.py +0 -0
  37. {typedal-3.14.3 → typedal-3.15.0}/src/typedal/web2py_py4web_shared.py +0 -0
  38. {typedal-3.14.3 → typedal-3.15.0}/tests/__init__.py +0 -0
  39. {typedal-3.14.3 → typedal-3.15.0}/tests/configs/simple.toml +0 -0
  40. {typedal-3.14.3 → typedal-3.15.0}/tests/configs/valid.env +0 -0
  41. {typedal-3.14.3 → typedal-3.15.0}/tests/configs/valid.toml +0 -0
  42. {typedal-3.14.3 → typedal-3.15.0}/tests/test_cli.py +0 -0
  43. {typedal-3.14.3 → typedal-3.15.0}/tests/test_config.py +0 -0
  44. {typedal-3.14.3 → typedal-3.15.0}/tests/test_docs_examples.py +0 -0
  45. {typedal-3.14.3 → typedal-3.15.0}/tests/test_helpers.py +0 -0
  46. {typedal-3.14.3 → typedal-3.15.0}/tests/test_json.py +0 -0
  47. {typedal-3.14.3 → typedal-3.15.0}/tests/test_main.py +0 -0
  48. {typedal-3.14.3 → typedal-3.15.0}/tests/test_mixins.py +0 -0
  49. {typedal-3.14.3 → typedal-3.15.0}/tests/test_mypy.py +0 -0
  50. {typedal-3.14.3 → typedal-3.15.0}/tests/test_orm.py +0 -0
  51. {typedal-3.14.3 → typedal-3.15.0}/tests/test_py4web.py +0 -0
  52. {typedal-3.14.3 → typedal-3.15.0}/tests/test_relationships.py +0 -0
  53. {typedal-3.14.3 → typedal-3.15.0}/tests/test_row.py +0 -0
  54. {typedal-3.14.3 → typedal-3.15.0}/tests/test_stats.py +0 -0
  55. {typedal-3.14.3 → typedal-3.15.0}/tests/test_table.py +0 -0
  56. {typedal-3.14.3 → typedal-3.15.0}/tests/test_web2py.py +0 -0
  57. {typedal-3.14.3 → typedal-3.15.0}/tests/test_xx_others.py +0 -0
  58. {typedal-3.14.3 → typedal-3.15.0}/tests/timings.py +0 -0
@@ -2,6 +2,12 @@
2
2
 
3
3
  <!--next-version-placeholder-->
4
4
 
5
+ ## v3.15.0 (2025-06-23)
6
+
7
+ ### Feature
8
+
9
+ * **querybuilder:** Support dictionaries (AND) in where (table.where({"example": "selection, "with": "dictionary")) ([`67837f8`](https://github.com/trialandsuccess/TypeDAL/commit/67837f82b13246ca2a526141e8e3915167fe3369))
10
+
5
11
  ## v3.14.3 (2025-06-09)
6
12
 
7
13
  ### Fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: TypeDAL
3
- Version: 3.14.3
3
+ Version: 3.15.0
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__ = "3.14.3"
8
+ __version__ = "3.15.0"
@@ -2434,7 +2434,7 @@ class QueryBuilder(typing.Generic[T_MetaInstance]):
2434
2434
 
2435
2435
  def where(
2436
2436
  self,
2437
- *queries_or_lambdas: Query | typing.Callable[[Type[T_MetaInstance]], Query],
2437
+ *queries_or_lambdas: Query | typing.Callable[[Type[T_MetaInstance]], Query] | dict,
2438
2438
  **filters: Any,
2439
2439
  ) -> "QueryBuilder[T_MetaInstance]":
2440
2440
  """
@@ -2453,20 +2453,28 @@ class QueryBuilder(typing.Generic[T_MetaInstance]):
2453
2453
  new_query = self.query
2454
2454
  table = self.model._ensure_table_defined()
2455
2455
 
2456
- for field, value in filters.items():
2457
- new_query &= table[field] == value
2456
+ queries_or_lambdas = (
2457
+ *queries_or_lambdas,
2458
+ filters,
2459
+ )
2458
2460
 
2459
2461
  subquery: DummyQuery | Query = DummyQuery()
2460
- for query_or_lambda in queries_or_lambdas:
2461
- if isinstance(query_or_lambda, _Query):
2462
- subquery |= typing.cast(Query, query_or_lambda)
2463
- elif callable(query_or_lambda):
2464
- if result := query_or_lambda(self.model):
2462
+ for query_part in queries_or_lambdas:
2463
+ if isinstance(query_part, _Query):
2464
+ subquery |= typing.cast(Query, query_part)
2465
+ elif callable(query_part):
2466
+ if result := query_part(self.model):
2465
2467
  subquery |= result
2466
- elif isinstance(query_or_lambda, (Field, _Field)) or is_typed_field(query_or_lambda):
2467
- subquery |= typing.cast(Query, query_or_lambda != None)
2468
+ elif isinstance(query_part, (Field, _Field)) or is_typed_field(query_part):
2469
+ subquery |= typing.cast(Query, query_part != None)
2470
+ elif isinstance(query_part, dict):
2471
+ subsubquery = DummyQuery()
2472
+ for field, value in query_part.items():
2473
+ subsubquery &= table[field] == value
2474
+ if subsubquery:
2475
+ subquery |= subsubquery
2468
2476
  else:
2469
- raise ValueError(f"Unexpected query type ({type(query_or_lambda)}).")
2477
+ raise ValueError(f"Unexpected query type ({type(query_part)}).")
2470
2478
 
2471
2479
  if subquery:
2472
2480
  new_query &= subquery
@@ -153,7 +153,25 @@ def test_where_builder():
153
153
  # test OR
154
154
 
155
155
  assert TestQueryTable.where(lambda row: row.id == 1, lambda row: row.id == 2).count() == 2
156
+ assert (
157
+ TestQueryTable.where(
158
+ {"id": 1},
159
+ { # OR
160
+ "id": 2
161
+ },
162
+ ).count()
163
+ == 2
164
+ )
165
+
156
166
  assert TestQueryTable.where(lambda row: row.id == 1, lambda row: row.id == 99).count() == 1
167
+ assert (
168
+ TestQueryTable.where(
169
+ {"id": 1},
170
+ # OR
171
+ {"id": 99},
172
+ ).count()
173
+ == 1
174
+ )
157
175
 
158
176
  assert TestQueryTable.where(id=-1).first() is None
159
177
  with pytest.raises(ValueError):
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