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..1dba715 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 Exception: logger.exception("Invalid federated auth params, try updating toolkit version") return