From 536c68ac3bb16c998d4004501d7a1c6c18b9b6d8 Mon Sep 17 00:00:00 2001 From: Simon Eskildsen Date: Tue, 21 May 2024 13:36:44 -0400 Subject: [PATCH] metadata: add created_at field to namespace metadata (#23) * metadata: add created_at field to namespace metadata * remove metadata when listing namespaces --- tests/test_vectors.py | 2 ++ turbopuffer/namespace.py | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/test_vectors.py b/tests/test_vectors.py index 3c9623c..57b4266 100644 --- a/tests/test_vectors.py +++ b/tests/test_vectors.py @@ -1,6 +1,7 @@ import uuid import turbopuffer as tpuf import tests +from datetime import datetime def test_upsert_rows(): @@ -297,6 +298,7 @@ def test_read_metadata(): assert ns.exists() assert ns.dimensions() == 2 assert ns.approx_count() == 98 + assert type(ns.created_at()) == type(datetime.now()) all_ns = tpuf.namespaces() assert ns in list(all_ns) diff --git a/turbopuffer/namespace.py b/turbopuffer/namespace.py index d4f1d3c..d20fd2a 100644 --- a/turbopuffer/namespace.py +++ b/turbopuffer/namespace.py @@ -1,5 +1,6 @@ import sys import iso8601 +from datetime import datetime from turbopuffer.error import APIError from turbopuffer.vectors import Cursor, VectorResult, VectorColumns, VectorRow, batch_iter from turbopuffer.backend import Backend @@ -51,12 +52,14 @@ def refresh_metadata(self): 'exists': dimensions != 0, 'dimensions': dimensions, 'approx_count': approx_count, + 'created_at': iso8601.parse_date(headers.get('x-turbopuffer-created-at')), } elif status_code == 404: self.metadata = { 'exists': False, 'dimensions': 0, 'approx_count': 0, + 'created_at': None, } else: raise APIError(response.status_code, 'Unexpected status code', response.get('content')) @@ -85,6 +88,14 @@ def approx_count(self) -> int: self.refresh_metadata() return self.metadata.pop('approx_count', 0) + def created_at(self) -> Optional[datetime]: + """ + Returns the creation date of this namespace. + """ + if self.metadata is None or 'created_at' not in self.metadata: + self.refresh_metadata() + return self.metadata.pop('created_at', None) + @overload def upsert(self, ids: Union[List[int], List[str]], @@ -366,10 +377,6 @@ def load_namespaces(api_key: Optional[str], initial_set: List[dict]) -> List[Nam ns = tpuf.Namespace(input['id'], api_key=api_key) ns.metadata = { 'exists': True, - 'dimensions': input['dimensions'], - 'approx_count': input['approx_count'], - # rfc3339 returned by the server is compatible with iso8601 - 'created_at': iso8601.parse_date(input['created_at']), } output.append(ns)