| from __future__ import annotations |
|
|
| from datetime import date |
| from typing import List, Optional, Literal |
|
|
| from pydantic import BaseModel, Field, field_validator |
|
|
| Department = Literal[ |
| "Artificial Intelligence", |
| "AI/ML", |
| "Machine Learning", |
| "Data Science", |
| ] |
|
|
|
|
| class Employee(BaseModel): |
| user_id: int |
| name: str = Field(min_length=1) |
| age: Optional[int] = Field(default=None, ge=16, le=80) |
| email: Optional[str] = None |
| salary: Optional[float] = Field(default=None, ge=0) |
| join_date: Optional[date] = None |
| department: Department |
| performance_score: Optional[float] = Field(default=None, ge=0, le=10) |
| location: Optional[str] = None |
| job_title: Optional[str] = None |
|
|
| @field_validator("name") |
| @classmethod |
| def normalize_name(cls, v: str) -> str: |
| v = " ".join(str(v).strip().split()) |
| return v.title() |
|
|
|
|
| class RejectedRecord(BaseModel): |
| raw_record: str = Field(min_length=1) |
| reasons: List[str] = Field(min_length=1) |
|
|
|
|
| class ExtractedData(BaseModel): |
| |
| employees: List[Employee] = Field(default_factory=list) |
|
|
| |
| rejected: List[RejectedRecord] = Field(default_factory=list) |
|
|