Skip to content

Commit d7d57ea

Browse files
authored
Merge branch 'main' into fix-2544-rest-signer-token
2 parents 203bbb4 + ccb3a29 commit d7d57ea

File tree

4 files changed

+88
-27
lines changed

4 files changed

+88
-27
lines changed

pyiceberg/catalog/rest/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ class Endpoints:
8989
list_views: str = "namespaces/{namespace}/views"
9090
drop_view: str = "namespaces/{namespace}/views/{view}"
9191
view_exists: str = "namespaces/{namespace}/views/{view}"
92+
plan_table_scan: str = "namespaces/{namespace}/tables/{table}/plan"
93+
fetch_scan_tasks: str = "namespaces/{namespace}/tables/{table}/tasks"
9294

9395

9496
class IdentifierKind(Enum):
@@ -123,6 +125,8 @@ class IdentifierKind(Enum):
123125
SNAPSHOT_LOADING_MODE = "snapshot-loading-mode"
124126
AUTH = "auth"
125127
CUSTOM = "custom"
128+
REST_SCAN_PLANNING_ENABLED = "rest-scan-planning-enabled"
129+
REST_SCAN_PLANNING_ENABLED_DEFAULT = False
126130

127131
NAMESPACE_SEPARATOR = b"\x1f".decode(UTF8)
128132

@@ -271,6 +275,13 @@ def _load_file_io(self, properties: Properties = EMPTY_DICT, location: str | Non
271275
if self._auth_manager:
272276
merged_properties[AUTH_MANAGER] = self._auth_manager
273277
return load_file_io(merged_properties, location)
278+
def is_rest_scan_planning_enabled(self) -> bool:
279+
"""Check if rest server-side scan planning is enabled.
280+
281+
Returns:
282+
True if enabled, False otherwise.
283+
"""
284+
return property_as_bool(self.properties, REST_SCAN_PLANNING_ENABLED, REST_SCAN_PLANNING_ENABLED_DEFAULT)
274285

275286
def _create_legacy_oauth2_auth_manager(self, session: Session) -> AuthManager:
276287
"""Create the LegacyOAuth2AuthManager by fetching required properties.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ dev = [
112112
"pyspark[connect]==4.0.1",
113113
"protobuf==6.33.2", # match Spark Connect's gencode
114114
"cython>=3.0.0",
115-
"deptry>=0.14,<0.24",
115+
"deptry>=0.14,<0.25",
116116
"docutils!=0.21.post1",
117117
"mypy-boto3-glue>=1.28.18",
118118
"mypy-boto3-dynamodb>=1.28.18",
@@ -123,7 +123,7 @@ docs = [
123123
"mkdocs==1.6.1",
124124
"griffe==1.15.0",
125125
"jinja2==3.1.6",
126-
"mkdocstrings==0.30.1",
126+
"mkdocstrings==1.0.0",
127127
"mkdocstrings-python==2.0.1",
128128
"mkdocs-literate-nav==0.6.2",
129129
"mkdocs-autorefs==1.4.3",

tests/catalog/test_rest.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1993,3 +1993,53 @@ def test_rest_catalog_context_manager_with_exception_sigv4(self, rest_mock: Mock
19931993

19941994
assert catalog is not None and hasattr(catalog, "_session")
19951995
assert len(catalog._session.adapters) == self.EXPECTED_ADAPTERS_SIGV4
1996+
1997+
def test_rest_scan_planning_disabled_by_default(self, rest_mock: Mocker) -> None:
1998+
rest_mock.get(
1999+
f"{TEST_URI}v1/config",
2000+
json={"defaults": {}, "overrides": {}},
2001+
status_code=200,
2002+
)
2003+
catalog = RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN)
2004+
2005+
assert catalog.is_rest_scan_planning_enabled() is False
2006+
2007+
def test_rest_scan_planning_enabled_by_property(self, rest_mock: Mocker) -> None:
2008+
rest_mock.get(
2009+
f"{TEST_URI}v1/config",
2010+
json={"defaults": {}, "overrides": {}},
2011+
status_code=200,
2012+
)
2013+
catalog = RestCatalog(
2014+
"rest",
2015+
uri=TEST_URI,
2016+
token=TEST_TOKEN,
2017+
**{"rest-scan-planning-enabled": "true"},
2018+
)
2019+
2020+
assert catalog.is_rest_scan_planning_enabled() is True
2021+
2022+
def test_rest_scan_planning_explicitly_disabled(self, rest_mock: Mocker) -> None:
2023+
rest_mock.get(
2024+
f"{TEST_URI}v1/config",
2025+
json={"defaults": {}, "overrides": {}},
2026+
status_code=200,
2027+
)
2028+
catalog = RestCatalog(
2029+
"rest",
2030+
uri=TEST_URI,
2031+
token=TEST_TOKEN,
2032+
**{"rest-scan-planning-enabled": "false"},
2033+
)
2034+
2035+
assert catalog.is_rest_scan_planning_enabled() is False
2036+
2037+
def test_rest_scan_planning_enabled_from_server_config(self, rest_mock: Mocker) -> None:
2038+
rest_mock.get(
2039+
f"{TEST_URI}v1/config",
2040+
json={"defaults": {"rest-scan-planning-enabled": "true"}, "overrides": {}},
2041+
status_code=200,
2042+
)
2043+
catalog = RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN)
2044+
2045+
assert catalog.is_rest_scan_planning_enabled() is True

uv.lock

Lines changed: 25 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)