From 7e37a6309819f95a7b44ab0fabfada50c2bf8c97 Mon Sep 17 00:00:00 2001 From: gnzng Date: Mon, 15 Jun 2026 10:05:02 -0700 Subject: [PATCH 1/2] revisions_count: implement pagination for metadata revisions and report total count --- CHANGELOG.md | 5 +++++ tests/test_writing.py | 14 ++++++++++++++ tiled/catalog/adapter.py | 11 +++++++++++ tiled/server/core.py | 2 +- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bc50682d..f942faeb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,11 @@ Write the date in place of the "Unreleased" in the case a new version is release retry cannot fix: an unsupported URL scheme and an invalid request such as an illegal header value. +### Fixed + +- The metadata revisions endpoint now reports the total revision count, so +all revisions can be paged through via the API. + ## v0.2.11 (2026-05-27) diff --git a/tests/test_writing.py b/tests/test_writing.py index 77f4f5b21..bcc362378 100644 --- a/tests/test_writing.py +++ b/tests/test_writing.py @@ -473,6 +473,20 @@ def test_metadata_revisions(tree): ac.metadata_revisions.delete_revision(1) +def test_metadata_revisions_count(tree): + with Context.from_app(build_app(tree)) as context: + client = from_context(context) + ac = client.write_array([1, 2, 3], key="paginate_me") + ac.update_metadata(metadata={"a": 1}) + ac.update_metadata(metadata={"a": 2}) + ac.update_metadata(metadata={"a": 3}) + # `len` reads the total count from the server, which was always 0 before. + assert len(ac.metadata_revisions) == 3 + # Revisions are returned ordered by revision number. + revision_numbers = [r["revision_number"] for r in ac.metadata_revisions[:]] + assert revision_numbers == sorted(revision_numbers) + + def test_replace_metadata(tiled_websocket_context): context = tiled_websocket_context client = from_context(context) diff --git a/tiled/catalog/adapter.py b/tiled/catalog/adapter.py index cc0ab3cd9..62a2c32f3 100644 --- a/tiled/catalog/adapter.py +++ b/tiled/catalog/adapter.py @@ -981,6 +981,17 @@ async def revisions(self, offset: int = 0, limit=None): ).all() return [Revision.from_orm(o[0]) for o in revision_orms] + async def revisions_count(self) -> int: + "Get the total number of revisions for this node." + async with self.context.session() as db: + return ( + await db.execute( + select(func.count()) + .select_from(orm.Revision) + .where(orm.Revision.node_id == self.node.id) + ) + ).scalar_one() + async def delete(self, recursive=False, external_only=True): """Delete the Node, its descendants, and associated DataSources and Assets diff --git a/tiled/server/core.py b/tiled/server/core.py index 9089d21ef..0fb2c0c87 100644 --- a/tiled/server/core.py +++ b/tiled/server/core.py @@ -348,7 +348,7 @@ async def construct_revisions_response( }, } data.append(item) - count = len(data) + count = await entry.revisions_count() links = pagination_links(base_url, route, path_parts, page, None, count) return schemas.Response(data=data, links=links, meta={"count": count}) From 4dc33aace5a6c0490151d67a7d536f101995849e Mon Sep 17 00:00:00 2001 From: gnzng Date: Mon, 15 Jun 2026 10:24:02 -0700 Subject: [PATCH 2/2] Remove trailing whitespace in CHANGELOG entry Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f942faeb6..667e3409c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,8 +24,8 @@ Write the date in place of the "Unreleased" in the case a new version is release ### Fixed -- The metadata revisions endpoint now reports the total revision count, so -all revisions can be paged through via the API. +- The metadata revisions endpoint now reports the total revision count, so + all revisions can be paged through via the API. ## v0.2.11 (2026-05-27)