Skip to content

Commit 9614576

Browse files
jacalataclaude
andcommitted
Make databases.populate_tables raise a clear NotImplementedError
populate_tables was gated with @api(version="99"), so it raised a misleading EndpointUnavailableError on every server. It called GET /databases/{id}/tables, which is not part of the REST API at any version. Raise NotImplementedError pointing to the Metadata API and tables.get_by_id instead, and make the DatabaseItem.tables error message accurate. Refs #735 Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent a5a8c48 commit 9614576

3 files changed

Lines changed: 31 additions & 20 deletions

File tree

‎tableauserverclient/models/database_item.py‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def __init__(self, name, description=None, content_permissions=None):
4242

4343
self._data_quality_warnings = None
4444

45-
self._tables = None # Not implemented yet
45+
self._tables = None
4646

4747
def __str__(self):
4848
return f"<Database {self._id} '{self.name}'>"
@@ -177,9 +177,11 @@ def contact_id(self, value):
177177
@property
178178
def tables(self):
179179
if self._tables is None:
180-
error = "Database must be populated with tables first."
180+
error = (
181+
"Database tables are not available: the REST API cannot list the tables of a database. "
182+
"Use the Metadata API to find them."
183+
)
181184
raise UnpopulatedPropertyError(error)
182-
# Each call to `.tables` should create a new pager, this just runs the callable
183185
return self._tables()
184186

185187
def _set_values(self, database_values):

‎tableauserverclient/server/endpoint/databases_endpoint.py‎

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from tableauserverclient.server.endpoint.permissions_endpoint import _PermissionsEndpoint
1111
from tableauserverclient.server.endpoint.resource_tagger import TaggingMixin
1212
from tableauserverclient.server import RequestFactory
13-
from tableauserverclient.models import DatabaseItem, TableItem, PaginationItem, Resource
13+
from tableauserverclient.models import DatabaseItem, PaginationItem, Resource
1414

1515
from tableauserverclient.helpers.logging import logger
1616

@@ -149,24 +149,26 @@ def update(self, database_item: DatabaseItem) -> DatabaseItem:
149149
updated_database = DatabaseItem.from_response(server_response.content, self.parent_srv.namespace)[0]
150150
return updated_database
151151

152-
# Not Implemented Yet
153-
@api(version="99")
154-
def populate_tables(self, database_item):
155-
if not database_item.id:
156-
error = "database item missing ID. database must be retrieved from server first."
157-
raise MissingRequiredFieldError(error)
158-
159-
def column_fetcher():
160-
return self._get_tables_for_database(database_item)
152+
def populate_tables(self, database_item: DatabaseItem) -> None:
153+
"""
154+
Not supported. The REST API has no endpoint that lists the tables of a
155+
database.
161156
162-
database_item._set_tables(column_fetcher)
163-
logger.info(f"Populated tables for database (ID: {database_item.id}")
157+
To find the tables in a database, use the Metadata API with
158+
``server.metadata.query`` and a query such as
159+
``databases(filter: {luid: $luid}) { tables { luid name } }``, then
160+
retrieve each table with ``server.tables.get_by_id``.
164161
165-
def _get_tables_for_database(self, database_item):
166-
url = f"{self.baseurl}/{database_item.id}/tables"
167-
server_response = self.get_request(url)
168-
tables = TableItem.from_response(server_response.content, self.parent_srv.namespace)
169-
return tables
162+
Raises
163+
------
164+
NotImplementedError
165+
Always.
166+
"""
167+
raise NotImplementedError(
168+
"The REST API has no endpoint to list the tables of a database. Use the Metadata API "
169+
"(server.metadata.query with databases(filter: {luid: $luid}) { tables { luid name } }) "
170+
"to find the table LUIDs, then call server.tables.get_by_id."
171+
)
170172

171173
@api(version="3.5")
172174
def populate_permissions(self, item: DatabaseItem) -> None:

‎test/test_database.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,10 @@ def test_delete(server):
110110
with requests_mock.mock() as m:
111111
m.delete(server.databases.baseurl + "/0448d2ed-590d-4fa0-b272-a2a8a24555b5", status_code=204)
112112
server.databases.delete("0448d2ed-590d-4fa0-b272-a2a8a24555b5")
113+
114+
115+
def test_populate_tables_not_supported(server):
116+
database = TSC.DatabaseItem("test")
117+
database._id = "23591f2c-4802-4d6a-9e28-574a8ea9bc4c"
118+
with pytest.raises(NotImplementedError, match="Metadata API"):
119+
server.databases.populate_tables(database)

0 commit comments

Comments
 (0)