Skip to content

Commit f389b33

Browse files
committed
fixup! Add support for registering views
1 parent d59b5d8 commit f389b33

2 files changed

Lines changed: 27 additions & 8 deletions

File tree

pyiceberg/catalog/rest/__init__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,11 +1322,11 @@ def view_exists(self, identifier: str | Identifier) -> bool:
13221322
@retry(**_RETRY_ARGS)
13231323
def register_view(self, identifier: str | Identifier, metadata_location: str) -> View:
13241324
self._check_endpoint(Capability.V1_REGISTER_VIEW)
1325-
namespace_and_view = self._split_identifier_for_path(identifier)
1326-
request = RegisterViewRequest(
1327-
name=self._identifier_to_validated_tuple(identifier)[-1],
1328-
metadata_location=metadata_location,
1329-
)
1325+
if self.table_exists(identifier):
1326+
raise TableAlreadyExistsError()
1327+
1328+
namespace_and_view = self._split_identifier_for_path(identifier, IdentifierKind.VIEW)
1329+
request = RegisterViewRequest(name=namespace_and_view["view"], metadata_location=metadata_location)
13301330
serialized_json = request.model_dump_json().encode(UTF8)
13311331
response = self._session.post(
13321332
self.url(Endpoints.register_view, namespace=namespace_and_view["namespace"]),

tests/catalog/test_rest.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2124,6 +2124,11 @@ def test_table_identifier_in_commit_table_request(
21242124

21252125

21262126
def test_register_view_200(rest_mock: Mocker, example_view_metadata_rest_json: dict[str, Any]) -> None:
2127+
rest_mock.head(
2128+
f"{TEST_URI}v1/namespaces/default/tables/registered_view",
2129+
status_code=404,
2130+
request_headers=TEST_HEADERS,
2131+
)
21272132
rest_mock.post(
21282133
f"{TEST_URI}v1/namespaces/default/register-view",
21292134
json=example_view_metadata_rest_json,
@@ -2138,11 +2143,10 @@ def test_register_view_200(rest_mock: Mocker, example_view_metadata_rest_json: d
21382143
identifier=("default", "registered_view"),
21392144
metadata=ViewMetadata(**example_view_metadata_rest_json["metadata"]),
21402145
)
2141-
assert actual.metadata.model_dump() == expected.metadata.model_dump()
2142-
assert actual.name() == expected.name()
2146+
assert actual == expected
21432147

21442148

2145-
def test_register_view_409(rest_mock: Mocker) -> None:
2149+
def test_register_view_409_view(rest_mock: Mocker) -> None:
21462150
rest_mock.post(
21472151
f"{TEST_URI}v1/namespaces/default/register-view",
21482152
json={
@@ -2164,6 +2168,21 @@ def test_register_view_409(rest_mock: Mocker) -> None:
21642168
assert "View already exists" in str(e.value)
21652169

21662170

2171+
def test_register_view_409_table(rest_mock: Mocker) -> None:
2172+
rest_mock.post(
2173+
f"{TEST_URI}v1/namespaces/default/views/registered_view",
2174+
status_code=204,
2175+
request_headers=TEST_HEADERS,
2176+
)
2177+
2178+
catalog = RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN)
2179+
with pytest.raises(TableAlreadyExistsError) as e:
2180+
catalog.register_view(
2181+
identifier=("default", "registered_view"), metadata_location="s3://warehouse/database/view/metadata.json"
2182+
)
2183+
assert "Table already exists" in str(e.value)
2184+
2185+
21672186
def test_drop_view_invalid_namespace(rest_mock: Mocker) -> None:
21682187
view = "view"
21692188
with pytest.raises(NoSuchIdentifierError) as e:

0 commit comments

Comments
 (0)