TypeDAL 3.16.2__tar.gz → 3.16.3__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.
- {typedal-3.16.2 → typedal-3.16.3}/CHANGELOG.md +6 -0
- {typedal-3.16.2 → typedal-3.16.3}/PKG-INFO +1 -1
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/__about__.py +1 -1
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/core.py +37 -32
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_row.py +13 -5
- {typedal-3.16.2 → typedal-3.16.3}/.github/workflows/su6.yml +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/.gitignore +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/.readthedocs.yml +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/README.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/coverage.svg +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/1_getting_started.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/2_defining_tables.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/3_building_queries.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/4_relationships.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/5_py4web.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/6_migrations.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/7_mixins.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/css/code_blocks.css +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/index.md +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/docs/requirements.txt +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/example_new.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/example_old.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/mkdocs.yml +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/pyproject.toml +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/__init__.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/caching.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/cli.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/config.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/fields.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/for_py4web.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/for_web2py.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/helpers.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/mixins.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/py.typed +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/serializers/as_json.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/types.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/src/typedal/web2py_py4web_shared.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/__init__.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/configs/simple.toml +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/configs/valid.env +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/configs/valid.toml +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_cli.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_config.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_docs_examples.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_helpers.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_json.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_main.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_mixins.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_mypy.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_orm.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_py4web.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_query_builder.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_relationships.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_stats.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_table.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_web2py.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/test_xx_others.py +0 -0
- {typedal-3.16.2 → typedal-3.16.3}/tests/timings.py +0 -0
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
<!--next-version-placeholder-->
|
|
4
4
|
|
|
5
|
+
## v3.16.3 (2025-09-08)
|
|
6
|
+
|
|
7
|
+
### Fix
|
|
8
|
+
|
|
9
|
+
* Support `.render()` on individual row ([`200a64c`](https://github.com/trialandsuccess/TypeDAL/commit/200a64c0e0c2647c5036dee0476d9ad8ebb416e4))
|
|
10
|
+
|
|
5
11
|
## v3.16.2 (2025-09-08)
|
|
6
12
|
|
|
7
13
|
### Fix
|
|
@@ -2037,6 +2037,41 @@ class TypedTable(_TypedTable, metaclass=TableMeta):
|
|
|
2037
2037
|
|
|
2038
2038
|
return pydal2sql.generate_sql(cls)
|
|
2039
2039
|
|
|
2040
|
+
def render(self, fields=None, compact=False) -> Self:
|
|
2041
|
+
row = copy.deepcopy(self)
|
|
2042
|
+
keys = list(row)
|
|
2043
|
+
if not fields:
|
|
2044
|
+
fields = [self._table[f] for f in self._table._fields]
|
|
2045
|
+
fields = [f for f in fields if isinstance(f, Field) and f.represent]
|
|
2046
|
+
|
|
2047
|
+
for field in fields:
|
|
2048
|
+
if field._table == self._table:
|
|
2049
|
+
row[field.name] = self._db.represent(
|
|
2050
|
+
"rows_render",
|
|
2051
|
+
field,
|
|
2052
|
+
row[field.name],
|
|
2053
|
+
row,
|
|
2054
|
+
)
|
|
2055
|
+
# else: relationship, different logic:
|
|
2056
|
+
|
|
2057
|
+
for relation_name in row._with:
|
|
2058
|
+
if relation := self._relationships.get(relation_name):
|
|
2059
|
+
relation_table = relation.table
|
|
2060
|
+
|
|
2061
|
+
relation_row = row[relation_name]
|
|
2062
|
+
for fieldname in relation_row:
|
|
2063
|
+
field = relation_table[fieldname]
|
|
2064
|
+
row[relation_name][fieldname] = self._db.represent(
|
|
2065
|
+
"rows_render",
|
|
2066
|
+
field,
|
|
2067
|
+
relation_row[field.name],
|
|
2068
|
+
relation_row,
|
|
2069
|
+
)
|
|
2070
|
+
|
|
2071
|
+
if compact and len(keys) == 1 and keys[0] != "_extra": # pragma: no cover
|
|
2072
|
+
return row[keys[0]]
|
|
2073
|
+
return row
|
|
2074
|
+
|
|
2040
2075
|
|
|
2041
2076
|
# backwards compat:
|
|
2042
2077
|
TypedRow = TypedTable
|
|
@@ -2431,38 +2466,8 @@ class TypedRows(typing.Collection[T_MetaInstance], Rows):
|
|
|
2431
2466
|
"Rows.render() needs a `rows_render` representer in DAL instance",
|
|
2432
2467
|
)
|
|
2433
2468
|
|
|
2434
|
-
row =
|
|
2435
|
-
|
|
2436
|
-
if not fields:
|
|
2437
|
-
fields = [f for f in self.fields if isinstance(f, Field) and f.represent]
|
|
2438
|
-
|
|
2439
|
-
for field in fields:
|
|
2440
|
-
if field._table == self.model._table:
|
|
2441
|
-
row[field.name] = self.db.represent(
|
|
2442
|
-
"rows_render",
|
|
2443
|
-
field,
|
|
2444
|
-
row[field.name],
|
|
2445
|
-
row,
|
|
2446
|
-
)
|
|
2447
|
-
# else: relationship, different logic:
|
|
2448
|
-
|
|
2449
|
-
for relation_name in row._with:
|
|
2450
|
-
if relation := self.model._relationships.get(relation_name):
|
|
2451
|
-
relation_table = relation.table
|
|
2452
|
-
|
|
2453
|
-
relation_row = row[relation_name]
|
|
2454
|
-
for fieldname in relation_row:
|
|
2455
|
-
field = relation_table[fieldname]
|
|
2456
|
-
row[relation_name][fieldname] = self.db.represent(
|
|
2457
|
-
"rows_render",
|
|
2458
|
-
field,
|
|
2459
|
-
relation_row[field.name],
|
|
2460
|
-
relation_row,
|
|
2461
|
-
)
|
|
2462
|
-
|
|
2463
|
-
if self.compact and len(keys) == 1 and keys[0] != "_extra": # pragma: no cover
|
|
2464
|
-
return row[keys[0]]
|
|
2465
|
-
return row
|
|
2469
|
+
row = self.records[i]
|
|
2470
|
+
return row.render(fields, compact=self.compact)
|
|
2466
2471
|
|
|
2467
2472
|
|
|
2468
2473
|
from .caching import ( # noqa: E402
|
|
@@ -245,11 +245,19 @@ def test_render():
|
|
|
245
245
|
|
|
246
246
|
rows = RenderTable.select().join("related").collect()
|
|
247
247
|
|
|
248
|
-
|
|
248
|
+
first = rows.first()
|
|
249
|
+
|
|
250
|
+
assert first.related
|
|
249
251
|
|
|
250
252
|
iterator = rows.render()
|
|
251
|
-
|
|
253
|
+
rendered_one = next(iterator)
|
|
254
|
+
|
|
255
|
+
assert rendered_one.normal == "123"
|
|
256
|
+
assert rendered_one.list_field == "abc, def"
|
|
257
|
+
assert rendered_one.related.also_normal == "321"
|
|
252
258
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
assert
|
|
259
|
+
# .render() on one row:
|
|
260
|
+
rendered_two = first.render()
|
|
261
|
+
assert rendered_two.normal == "123"
|
|
262
|
+
assert rendered_two.list_field == "abc, def"
|
|
263
|
+
assert rendered_two.related.also_normal == "321"
|
|
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
|