From 151f94fde10a5b697fb871a35bfa1b1cb3a38a67 Mon Sep 17 00:00:00 2001 From: tomas Date: Wed, 14 Jan 2026 12:53:24 +0000 Subject: [PATCH 1/2] fix: Use pydantic compat validate where v2 was expected - Updated the function name from `_model_validate_compat` to `model_validate_compat` for consistency and clarity. - Adjusted imports in `loader.py` and `sql_execution.py` to reflect the new function name. - Ensured all references to the function are updated accordingly in the codebase. --- deepnote_core/config/loader.py | 6 +++--- deepnote_core/pydantic_compat_helpers.py | 2 +- deepnote_toolkit/sql/sql_execution.py | 11 ++++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/deepnote_core/config/loader.py b/deepnote_core/config/loader.py index d79edd5..d296907 100644 --- a/deepnote_core/config/loader.py +++ b/deepnote_core/config/loader.py @@ -14,7 +14,7 @@ import yaml -from ..pydantic_compat_helpers import _model_validate_compat +from ..pydantic_compat_helpers import model_validate_compat from .installation_detector import InstallMethod, get_installation_method from .models import DeepnoteConfig from .xdg_paths import XDGPaths @@ -108,7 +108,7 @@ def load_with_args(self, args: argparse.Namespace) -> DeepnoteConfig: # 5) Expand paths and installation paths prior to model validation self._expand_path_fields(merged) - cfg = _model_validate_compat(DeepnoteConfig, merged) + cfg = model_validate_compat(DeepnoteConfig, merged) # 6) Normalize/expand any defaulted path values in the final model self._expand_config_paths(cfg) @@ -131,7 +131,7 @@ def load_config(self) -> DeepnoteConfig: _deep_merge(merged, file_dict) _deep_merge(merged, env_overlay) self._expand_path_fields(merged) - cfg = _model_validate_compat(DeepnoteConfig, merged) + cfg = model_validate_compat(DeepnoteConfig, merged) self._expand_config_paths(cfg) self._apply_installation_defaults(cfg) return cfg diff --git a/deepnote_core/pydantic_compat_helpers.py b/deepnote_core/pydantic_compat_helpers.py index 2723ae4..8d42b06 100644 --- a/deepnote_core/pydantic_compat_helpers.py +++ b/deepnote_core/pydantic_compat_helpers.py @@ -45,7 +45,7 @@ def _get_description_compat(field: Any) -> str: return getattr(field_info, "description", "") if field_info else "" -def _model_validate_compat(model_cls, data: Mapping[str, Any]) -> Any: +def model_validate_compat(model_cls, data: Mapping[str, Any]) -> Any: """Validate using Pydantic v2 if available, else fall back to v1. Pydantic v2 exposes `model_validate`, while v1 uses `parse_obj` on the class. diff --git a/deepnote_toolkit/sql/sql_execution.py b/deepnote_toolkit/sql/sql_execution.py index 86ff5ca..61ddbb3 100644 --- a/deepnote_toolkit/sql/sql_execution.py +++ b/deepnote_toolkit/sql/sql_execution.py @@ -16,10 +16,11 @@ from google.api_core.client_info import ClientInfo from google.cloud import bigquery from packaging.version import parse as parse_version -from pydantic import BaseModel, ValidationError +from pydantic import BaseModel from sqlalchemy.engine import URL, create_engine, make_url from sqlalchemy.exc import ResourceClosedError +from deepnote_core.pydantic_compat_helpers import model_validate_compat from deepnote_toolkit import env as dnenv from deepnote_toolkit.create_ssh_tunnel import create_ssh_tunnel from deepnote_toolkit.get_webapp_url import ( @@ -281,7 +282,7 @@ def _get_federated_auth_credentials( response.raise_for_status() - data = FederatedAuthResponseData.model_validate(response.json()) + data = model_validate_compat(FederatedAuthResponseData, response.json()) return data @@ -310,10 +311,10 @@ def _handle_federated_auth_params(sql_alchemy_dict: dict[str, Any]) -> None: return try: - federated_auth_params = IntegrationFederatedAuthParams.model_validate( - sql_alchemy_dict["federatedAuthParams"] + federated_auth_params = model_validate_compat( + IntegrationFederatedAuthParams, sql_alchemy_dict["federatedAuthParams"] ) - except ValidationError: + except BaseException: logger.exception("Invalid federated auth params, try updating toolkit version") return From 0944850e7810bc3f80ab9d36cee0d0562fa4535d Mon Sep 17 00:00:00 2001 From: tomas Date: Wed, 14 Jan 2026 13:05:32 +0000 Subject: [PATCH 2/2] Use Exception instead of BaseException --- deepnote_toolkit/sql/sql_execution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepnote_toolkit/sql/sql_execution.py b/deepnote_toolkit/sql/sql_execution.py index 61ddbb3..1dba715 100644 --- a/deepnote_toolkit/sql/sql_execution.py +++ b/deepnote_toolkit/sql/sql_execution.py @@ -314,7 +314,7 @@ def _handle_federated_auth_params(sql_alchemy_dict: dict[str, Any]) -> None: federated_auth_params = model_validate_compat( IntegrationFederatedAuthParams, sql_alchemy_dict["federatedAuthParams"] ) - except BaseException: + except Exception: logger.exception("Invalid federated auth params, try updating toolkit version") return