Skip to content

Commit 6c31501

Browse files
jontsaiclaude
andauthored
Upgrade to Pydantic v2 and bump version to 0.1.0 (#76)
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 <[email protected]>
1 parent aa5d3df commit 6c31501

File tree

6 files changed

+25
-25
lines changed

6 files changed

+25
-25
lines changed

.github/meta/.keep

Whitespace-only changes.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pyvenv*/
3333
sdist
3434
var
3535
venv*/
36+
.venv/
3637
wheelhouse
3738

3839
# Installer logs
@@ -62,6 +63,7 @@ nosetests.xml
6263
.project
6364
.pydevproject
6465
.vscode
66+
.github/meta/
6567

6668
# Complexity
6769
output/*.html

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def read(*names, **kwargs):
1313

1414
setup(
1515
name="altimate-datapilot-cli",
16-
version="0.0.26",
16+
version="0.1.0",
1717
license="MIT",
1818
description="Assistant for Data Teams",
1919
long_description="{}\n{}".format(

src/datapilot/core/platforms/dbt/executor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ def run_llm_checks(self):
109109
self.token,
110110
self.instance_name,
111111
self.backend_url,
112-
self.manifest.json() if self.manifest else "",
113-
self.catalog.json() if self.catalog else "",
112+
self.manifest.model_dump_json() if self.manifest else "",
113+
self.catalog.model_dump_json() if self.catalog else "",
114114
check_names,
115115
)
116116
return llm_check_results

src/datapilot/core/platforms/dbt/schemas/catalog.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from typing import Optional
66
from typing import Union
77

8-
from pydantic.main import BaseModel
8+
from pydantic import BaseModel
9+
from pydantic import ConfigDict
910

1011
from vendor.dbt_artifacts_parser.parsers.catalog.catalog_v1 import CatalogV1 as BaseCatalogV1
1112
from vendor.dbt_artifacts_parser.parsers.catalog.catalog_v1 import Metadata as BaseMetadata
@@ -59,15 +60,12 @@ class AltimateCatalogCatalogV1(BaseModel):
5960

6061
# Custom classes to handle extra fields in newer dbt versions
6162
class Metadata(BaseMetadata):
62-
class Config:
63-
extra = "allow" # Allow extra fields in metadata
63+
model_config = ConfigDict(extra="allow")
6464

6565

6666
class CatalogV1(BaseCatalogV1):
6767
metadata: Metadata # Use our custom metadata class
68-
69-
class Config:
70-
extra = "allow" # Allow extra fields
68+
model_config = ConfigDict(extra="allow")
7169

7270

7371
Catalog = CatalogV1

src/datapilot/core/platforms/dbt/schemas/manifest.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
class DBTVersion(BaseModel):
2626
MAJOR: int
2727
MINOR: int
28-
PATCH: Optional[int]
28+
PATCH: Optional[int] = None
2929

3030

3131
Manifest = Union[
@@ -64,8 +64,8 @@ class AltimateManifestColumnInfo(BaseModel):
6464

6565

6666
class AltimateFileHash(BaseModel):
67-
name: Optional[str]
68-
checksum: Optional[str]
67+
name: Optional[str] = None
68+
checksum: Optional[str] = None
6969

7070

7171
class AltimateResourceType(Enum):
@@ -118,8 +118,8 @@ class AltimateNodeConfig(BaseModel):
118118
materialized: Optional[str] = "view"
119119
incremental_strategy: Optional[Optional[str]] = None
120120
persist_docs: Optional[Dict[str, Any]] = None
121-
post_hook: Optional[List[AltimateHook]]
122-
pre_hook: Optional[List[AltimateHook]]
121+
post_hook: Optional[List[AltimateHook]] = None
122+
pre_hook: Optional[List[AltimateHook]] = None
123123
quoting: Optional[Dict[str, Any]] = None
124124
column_types: Optional[Dict[str, Any]] = None
125125
full_refresh: Optional[Optional[bool]] = None
@@ -128,7 +128,7 @@ class AltimateNodeConfig(BaseModel):
128128

129129

130130
class AltimateManifestNode(BaseModel):
131-
database: Optional[str]
131+
database: Optional[str] = None
132132
resource_type: AltimateResourceType
133133
schema_name: str
134134
name: str
@@ -141,7 +141,7 @@ class AltimateManifestNode(BaseModel):
141141
config: Optional[AltimateNodeConfig] = None
142142
raw_code: Optional[str] = ""
143143
language: Optional[str] = "sql"
144-
checksum: Optional[AltimateFileHash]
144+
checksum: Optional[AltimateFileHash] = None
145145
description: Optional[str] = ""
146146
columns: Optional[Dict[str, AltimateManifestColumnInfo]] = None
147147
relation_name: Optional[Optional[str]] = None
@@ -151,7 +151,7 @@ class AltimateManifestNode(BaseModel):
151151
compiled_path: Optional[Optional[str]] = None
152152
compiled: Optional[bool] = False
153153
compiled_code: Optional[Optional[str]] = None
154-
access: Optional[AltimateAccess]
154+
access: Optional[AltimateAccess] = None
155155
contract: Optional[AltimateDBTContract] = None
156156
meta: Optional[Dict[str, Any]] = None
157157
patch_path: Optional[Optional[str]] = None
@@ -190,10 +190,10 @@ class AltimateSourceConfig(BaseModel):
190190

191191

192192
class AltimateDeferRelation(BaseModel):
193-
database: Optional[str]
193+
database: Optional[str] = None
194194
schema_name: str
195195
alias: str
196-
relation_name: Optional[str]
196+
relation_name: Optional[str] = None
197197

198198

199199
class AltimateSeedConfig(BaseModel):
@@ -208,8 +208,8 @@ class AltimateSeedConfig(BaseModel):
208208
materialized: Optional[str] = "seed"
209209
incremental_strategy: Optional[Optional[str]] = None
210210
persist_docs: Optional[Dict[str, Any]] = None
211-
post_hook: Optional[List[AltimateHook]]
212-
pre_hook: Optional[List[AltimateHook]]
211+
post_hook: Optional[List[AltimateHook]] = None
212+
pre_hook: Optional[List[AltimateHook]] = None
213213
quoting: Optional[Dict[str, Any]] = None
214214
column_types: Optional[Dict[str, Any]] = None
215215
full_refresh: Optional[Optional[bool]] = None
@@ -225,7 +225,7 @@ class AltimateSeedConfig(BaseModel):
225225

226226

227227
class AltimateSeedNode(BaseModel):
228-
database: Optional[str]
228+
database: Optional[str] = None
229229
schema_name: str
230230
name: str
231231
resource_type: AltimateResourceType
@@ -235,7 +235,7 @@ class AltimateSeedNode(BaseModel):
235235
unique_id: str
236236
fqn: List[str]
237237
alias: str
238-
checksum: Optional[AltimateFileHash]
238+
checksum: Optional[AltimateFileHash] = None
239239
config: Optional[AltimateSeedConfig] = None
240240
tags: Optional[List[str]] = None
241241
description: Optional[str] = ""
@@ -257,7 +257,7 @@ class AltimateSeedNode(BaseModel):
257257

258258

259259
class AltimateManifestSourceNode(BaseModel):
260-
database: Optional[str]
260+
database: Optional[str] = None
261261
resource_type: AltimateResourceType
262262
schema_name: str
263263
name: str
@@ -379,7 +379,7 @@ class AltimateManifestTestNode(BaseModel):
379379
unique_id: str
380380
fqn: List[str]
381381
alias: str
382-
checksum: Optional[AltimateFileHash]
382+
checksum: Optional[AltimateFileHash] = None
383383
config: Optional[AltimateTestConfig] = None
384384
_event_status: Optional[Dict[str, Any]] = None
385385
tags: Optional[List[str]] = None

0 commit comments

Comments
 (0)