Skip to content

Commit cd7d26a

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

2 files changed

Lines changed: 28 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: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2124,6 +2124,12 @@ 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/register-view",
2129+
status_code=404,
2130+
request_headers=TEST_HEADERS,
2131+
)
2132+
21272133
rest_mock.post(
21282134
f"{TEST_URI}v1/namespaces/default/register-view",
21292135
json=example_view_metadata_rest_json,
@@ -2138,11 +2144,10 @@ def test_register_view_200(rest_mock: Mocker, example_view_metadata_rest_json: d
21382144
identifier=("default", "registered_view"),
21392145
metadata=ViewMetadata(**example_view_metadata_rest_json["metadata"]),
21402146
)
2141-
assert actual.metadata.model_dump() == expected.metadata.model_dump()
2142-
assert actual.name() == expected.name()
2147+
assert actual == expected
21432148

21442149

2145-
def test_register_view_409(rest_mock: Mocker) -> None:
2150+
def test_register_view_409_view(rest_mock: Mocker) -> None:
21462151
rest_mock.post(
21472152
f"{TEST_URI}v1/namespaces/default/register-view",
21482153
json={
@@ -2164,6 +2169,21 @@ def test_register_view_409(rest_mock: Mocker) -> None:
21642169
assert "View already exists" in str(e.value)
21652170

21662171

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

0 commit comments

Comments
 (0)