from typing import Any from pydantic import ( BaseModel, ConfigDict, Field, field_validator, ) class ExperienceItem(BaseModel): model_config = ConfigDict(extra="ignore") title: str | None = None company: str | None = None employment_type: str | None = None start_date: str | None = None end_date: str | None = None duration: str | None = None location: str | None = None work_type: str | None = None description: list[str] = Field(default_factory=list) class EducationItem(BaseModel): model_config = ConfigDict(extra="ignore") school: str | None = None degree: str | None = None field: str | None = None start: str | None = None end: str | None = None activities: list[str] = Field(default_factory=list) class SkillItem(BaseModel): model_config = ConfigDict(extra="ignore") name: str class CertificationItem(BaseModel): model_config = ConfigDict(extra="ignore") name: str | None = None issuer: str | None = None issued: str | None = None credential_id: str | None = None description: str | None = None class LanguageItem(BaseModel): model_config = ConfigDict(extra="ignore") language: str proficiency: str | None = None class Profile(BaseModel): """A fully scraped LinkedIn profile.""" model_config = ConfigDict(extra="ignore") vanity: str name: str | None = None headline: str | None = None location: str | None = None about: str | None = None experience: list[ExperienceItem] = Field(default_factory=list) education: list[EducationItem] = Field(default_factory=list) skills: list[SkillItem] = Field(default_factory=list) certifications: list[CertificationItem] = Field(default_factory=list) languages: list[LanguageItem] = Field(default_factory=list) profile_image: str | None = None background_image: str | None = None pronouns: str | None = None followers: str | None = None connections: str | None = None # the parser may emit None for missing list sections; coerce to [] @field_validator( "experience", "education", "skills", "certifications", "languages", mode="before", ) @classmethod def _none_to_list(cls, v: Any) -> Any: return [] if v is None else v