From 8882927bc1952c79f4785a29f8d7b1fc4f489809 Mon Sep 17 00:00:00 2001 From: David Gallay Date: Tue, 10 Sep 2024 14:51:28 +0200 Subject: [PATCH 1/2] Using pydantic for SoftwareVersion type and fixing edge case for datetime type --- pa_api/xmlapi/types/operations/software.py | 50 +++++++--------------- pa_api/xmlapi/types/utils.py | 9 +++- 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/pa_api/xmlapi/types/operations/software.py b/pa_api/xmlapi/types/operations/software.py index 74135b6..68f5cd6 100644 --- a/pa_api/xmlapi/types/operations/software.py +++ b/pa_api/xmlapi/types/operations/software.py @@ -1,43 +1,25 @@ -from dataclasses import dataclass -from datetime import datetime +from typing import Optional + +from pydantic import ConfigDict, Field -from pa_api.utils import ( - first, -) from pa_api.xmlapi.types.utils import ( - mksx, - pd, + Bool, + Datetime, + String, + XMLBaseModel, ) -@dataclass -class SoftwareVersion: - # TODO: Use pydantic - version: str - filename: str - released_on: datetime - downloaded: bool - current: bool - latest: bool - uploaded: bool +class SoftwareVersion(XMLBaseModel): + model_config = ConfigDict(extra="ignore") - @staticmethod - def from_xml(xml): - # TODO: Use correct pydantic functionalities - if isinstance(xml, (list, tuple)): - xml = first(xml) - if xml is None: - return None - p = mksx(xml) - return SoftwareVersion( - p("./version/text()"), - p("./filename/text()"), - p("./released-on/text()", parser=pd), - p("./downloaded/text()") != "no", - p("./current/text()") != "no", - p("./latest/text()") != "no", - p("./uploaded/text()") != "no", - ) + version: String + filename: String + released_on: Optional[Datetime] = Field(alias="released-on") + downloaded: Bool + current: Bool + latest: Bool + uploaded: Bool @property def base_minor_version(self) -> str: diff --git a/pa_api/xmlapi/types/utils.py b/pa_api/xmlapi/types/utils.py index cfe1924..2a7d839 100644 --- a/pa_api/xmlapi/types/utils.py +++ b/pa_api/xmlapi/types/utils.py @@ -29,7 +29,7 @@ def from_xml(cls, xml) -> Self: def parse_datetime(d): try: - if d is None or d == "none": + if d is None or d in ("none", "Unknown"): return None return datetime.strptime(d, DATETIME_FORMAT) except Exception as e: @@ -102,6 +102,12 @@ def ensure_list(v: Any) -> typing.List[Any]: # print(ta.validate_python()) +def xml_text(v: Any): + if isinstance(v, dict) and "#text" in v: + return v["#text"] + return v + + def ensure_str(v: Any) -> str: if v is None: return "" @@ -119,6 +125,7 @@ def validate_ip(v: Any) -> str: String = Annotated[str, BeforeValidator(ensure_str)] +Bool = Annotated[bool, BeforeValidator(xml_text)] Ip = Annotated[str, BeforeValidator(validate_ip)] From b2c71bd5fbce1bd4384f614eaea6b23f44e9f06d Mon Sep 17 00:00:00 2001 From: David Gallay Date: Tue, 10 Sep 2024 14:52:43 +0200 Subject: [PATCH 2/2] Updating the package version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3350d9f..ce87239 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pa-api-sdk" -version = "0.1.1" +version = "0.1.2" description = "" authors = ["David Gallay "] readme = "README.md"