From d4844c0998bee24b8eb023b231d39dc14128d245 Mon Sep 17 00:00:00 2001 From: Jonathan Tsai Date: Fri, 10 Oct 2025 14:45:47 -0700 Subject: [PATCH] Upgrade to Pydantic v2 and bump version to 0.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit completes the migration from Pydantic v1 to v2, with the following changes: - Updated Pydantic model configuration syntax: - Changed `class Config:` to `model_config = ConfigDict()` in catalog.py - Updated imports to use `from pydantic import ConfigDict` - Fixed Pydantic v2 field requirements: - Added default values (= None) to all Optional fields without defaults in manifest.py - This is required in Pydantic v2 for proper model validation - Updated deprecated method calls: - Changed `.json()` to `.model_dump_json()` in executor.py - These methods serialize Pydantic models to JSON strings - Added .venv/ to .gitignore - Bumped version from 0.0.26 to 0.1.0 to reflect breaking changes Note: Vendored manifest_v*.py files in src/vendor/dbt_artifacts_parser/ remain unchanged as they are historical archives. Testing: - Ran full test suite using .venv/bin/pytest - All 64 tests passed successfully - Verified Pydantic 2.12.0 compatibility BREAKING CHANGE: This upgrade requires downstream users to also upgrade to Pydantic v2. setup.py now specifies pydantic>=2.0,<3.0. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/meta/.keep | 0 .gitignore | 2 ++ setup.py | 2 +- src/datapilot/core/platforms/dbt/executor.py | 4 +-- .../core/platforms/dbt/schemas/catalog.py | 10 +++--- .../core/platforms/dbt/schemas/manifest.py | 32 +++++++++---------- 6 files changed, 25 insertions(+), 25 deletions(-) create mode 100644 .github/meta/.keep diff --git a/.github/meta/.keep b/.github/meta/.keep new file mode 100644 index 00000000..e69de29b diff --git a/.gitignore b/.gitignore index 23bb0a16..87a96dfb 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ pyvenv*/ sdist var venv*/ +.venv/ wheelhouse # Installer logs @@ -62,6 +63,7 @@ nosetests.xml .project .pydevproject .vscode +.github/meta/ # Complexity output/*.html diff --git a/setup.py b/setup.py index 8807c1be..5c53d6be 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name="altimate-datapilot-cli", - version="0.0.26", + version="0.1.0", license="MIT", description="Assistant for Data Teams", long_description="{}\n{}".format( diff --git a/src/datapilot/core/platforms/dbt/executor.py b/src/datapilot/core/platforms/dbt/executor.py index a5023125..50efb8ca 100644 --- a/src/datapilot/core/platforms/dbt/executor.py +++ b/src/datapilot/core/platforms/dbt/executor.py @@ -109,8 +109,8 @@ def run_llm_checks(self): self.token, self.instance_name, self.backend_url, - self.manifest.json() if self.manifest else "", - self.catalog.json() if self.catalog else "", + self.manifest.model_dump_json() if self.manifest else "", + self.catalog.model_dump_json() if self.catalog else "", check_names, ) return llm_check_results diff --git a/src/datapilot/core/platforms/dbt/schemas/catalog.py b/src/datapilot/core/platforms/dbt/schemas/catalog.py index 923eea31..699635ce 100644 --- a/src/datapilot/core/platforms/dbt/schemas/catalog.py +++ b/src/datapilot/core/platforms/dbt/schemas/catalog.py @@ -5,7 +5,8 @@ from typing import Optional from typing import Union -from pydantic.main import BaseModel +from pydantic import BaseModel +from pydantic import ConfigDict from vendor.dbt_artifacts_parser.parsers.catalog.catalog_v1 import CatalogV1 as BaseCatalogV1 from vendor.dbt_artifacts_parser.parsers.catalog.catalog_v1 import Metadata as BaseMetadata @@ -59,15 +60,12 @@ class AltimateCatalogCatalogV1(BaseModel): # Custom classes to handle extra fields in newer dbt versions class Metadata(BaseMetadata): - class Config: - extra = "allow" # Allow extra fields in metadata + model_config = ConfigDict(extra="allow") class CatalogV1(BaseCatalogV1): metadata: Metadata # Use our custom metadata class - - class Config: - extra = "allow" # Allow extra fields + model_config = ConfigDict(extra="allow") Catalog = CatalogV1 diff --git a/src/datapilot/core/platforms/dbt/schemas/manifest.py b/src/datapilot/core/platforms/dbt/schemas/manifest.py index c5609315..3a4b33fe 100644 --- a/src/datapilot/core/platforms/dbt/schemas/manifest.py +++ b/src/datapilot/core/platforms/dbt/schemas/manifest.py @@ -25,7 +25,7 @@ class DBTVersion(BaseModel): MAJOR: int MINOR: int - PATCH: Optional[int] + PATCH: Optional[int] = None Manifest = Union[ @@ -64,8 +64,8 @@ class AltimateManifestColumnInfo(BaseModel): class AltimateFileHash(BaseModel): - name: Optional[str] - checksum: Optional[str] + name: Optional[str] = None + checksum: Optional[str] = None class AltimateResourceType(Enum): @@ -118,8 +118,8 @@ class AltimateNodeConfig(BaseModel): materialized: Optional[str] = "view" incremental_strategy: Optional[Optional[str]] = None persist_docs: Optional[Dict[str, Any]] = None - post_hook: Optional[List[AltimateHook]] - pre_hook: Optional[List[AltimateHook]] + post_hook: Optional[List[AltimateHook]] = None + pre_hook: Optional[List[AltimateHook]] = None quoting: Optional[Dict[str, Any]] = None column_types: Optional[Dict[str, Any]] = None full_refresh: Optional[Optional[bool]] = None @@ -128,7 +128,7 @@ class AltimateNodeConfig(BaseModel): class AltimateManifestNode(BaseModel): - database: Optional[str] + database: Optional[str] = None resource_type: AltimateResourceType schema_name: str name: str @@ -141,7 +141,7 @@ class AltimateManifestNode(BaseModel): config: Optional[AltimateNodeConfig] = None raw_code: Optional[str] = "" language: Optional[str] = "sql" - checksum: Optional[AltimateFileHash] + checksum: Optional[AltimateFileHash] = None description: Optional[str] = "" columns: Optional[Dict[str, AltimateManifestColumnInfo]] = None relation_name: Optional[Optional[str]] = None @@ -151,7 +151,7 @@ class AltimateManifestNode(BaseModel): compiled_path: Optional[Optional[str]] = None compiled: Optional[bool] = False compiled_code: Optional[Optional[str]] = None - access: Optional[AltimateAccess] + access: Optional[AltimateAccess] = None contract: Optional[AltimateDBTContract] = None meta: Optional[Dict[str, Any]] = None patch_path: Optional[Optional[str]] = None @@ -190,10 +190,10 @@ class AltimateSourceConfig(BaseModel): class AltimateDeferRelation(BaseModel): - database: Optional[str] + database: Optional[str] = None schema_name: str alias: str - relation_name: Optional[str] + relation_name: Optional[str] = None class AltimateSeedConfig(BaseModel): @@ -208,8 +208,8 @@ class AltimateSeedConfig(BaseModel): materialized: Optional[str] = "seed" incremental_strategy: Optional[Optional[str]] = None persist_docs: Optional[Dict[str, Any]] = None - post_hook: Optional[List[AltimateHook]] - pre_hook: Optional[List[AltimateHook]] + post_hook: Optional[List[AltimateHook]] = None + pre_hook: Optional[List[AltimateHook]] = None quoting: Optional[Dict[str, Any]] = None column_types: Optional[Dict[str, Any]] = None full_refresh: Optional[Optional[bool]] = None @@ -225,7 +225,7 @@ class AltimateSeedConfig(BaseModel): class AltimateSeedNode(BaseModel): - database: Optional[str] + database: Optional[str] = None schema_name: str name: str resource_type: AltimateResourceType @@ -235,7 +235,7 @@ class AltimateSeedNode(BaseModel): unique_id: str fqn: List[str] alias: str - checksum: Optional[AltimateFileHash] + checksum: Optional[AltimateFileHash] = None config: Optional[AltimateSeedConfig] = None tags: Optional[List[str]] = None description: Optional[str] = "" @@ -257,7 +257,7 @@ class AltimateSeedNode(BaseModel): class AltimateManifestSourceNode(BaseModel): - database: Optional[str] + database: Optional[str] = None resource_type: AltimateResourceType schema_name: str name: str @@ -379,7 +379,7 @@ class AltimateManifestTestNode(BaseModel): unique_id: str fqn: List[str] alias: str - checksum: Optional[AltimateFileHash] + checksum: Optional[AltimateFileHash] = None config: Optional[AltimateTestConfig] = None _event_status: Optional[Dict[str, Any]] = None tags: Optional[List[str]] = None