Skip to content

Commit a98ec29

Browse files
committed
examples: regenerate python-r4-us-core fhir_types with the fhirpy client
1 parent 574318c commit a98ec29

8 files changed

Lines changed: 50 additions & 8 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from typing import TYPE_CHECKING, Any, Union, Optional, Iterator, Tuple, Dict
2+
from pydantic import BaseModel, Field
3+
from typing import Protocol
4+
5+
6+
class ResourceProtocol(Protocol):
7+
resourceType: Any
8+
id: Union[str, None]
9+
10+
11+
class FhirpyBaseModel(BaseModel):
12+
"""
13+
This class satisfies ResourceProtocol.
14+
Uses __pydantic_init_subclass__ to set resourceType as a class-level attribute
15+
after Pydantic finishes model construction, so that fhirpy can detect it
16+
via cls.resourceType for search/fetch operations.
17+
"""
18+
19+
if TYPE_CHECKING:
20+
# Set at runtime per-subclass by __pydantic_init_subclass__ below. Declared here
21+
# so static type-checkers see it: fhirpy's ResourceProtocol requires a settable
22+
# `resourceType`, and snake_case models expose the field as `resource_type`
23+
# (alias "resourceType"). A settable instance attr (not ClassVar) satisfies the
24+
# protocol's mutable member; the default keeps it optional for the pydantic mypy plugin.
25+
resourceType: str = ""
26+
27+
id: Optional[str] = Field(None, alias="id")
28+
29+
@classmethod
30+
def __pydantic_init_subclass__(cls, **kwargs: Any) -> None:
31+
super().__pydantic_init_subclass__(**kwargs)
32+
field = cls.model_fields.get("resource_type") or cls.model_fields.get("resourceType")
33+
if field is not None and field.default is not None:
34+
type.__setattr__(cls, "resourceType", str(field.default))
35+
36+
def __iter__(self) -> Iterator[Tuple[str, Any]]: # type: ignore[override]
37+
data = self.model_dump(mode='json', by_alias=True, exclude_none=True)
38+
return iter(data.items())
39+
40+
def serialize(self) -> Dict[str, Any]:
41+
"""Serialize to dict (compatible with fhirpy's serialize method)"""
42+
return self.model_dump(mode='json', by_alias=True, exclude_none=True)

examples/python-r4-us-core/fhir_types/hl7_fhir_r4_core/bundle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pydantic import BaseModel, ConfigDict, Field, PositiveInt, model_validator
77
from typing import Any, Generic, List as PyList, Literal
88
from typing_extensions import Self, TypeVar
9+
from fhir_types.fhirpy_base_model import FhirpyBaseModel
910

1011
from fhir_types.hl7_fhir_r4_core.base import BackboneElement, Identifier, Signature
1112
from fhir_types.hl7_fhir_r4_core.resource import Resource
@@ -74,7 +75,6 @@ class Bundle(Resource, Generic[T1, T2]):
7475
default='Bundle',
7576
alias='resourceType',
7677
serialization_alias='resourceType',
77-
frozen=True,
7878
pattern='Bundle'
7979
)
8080
entry: PyList[BundleEntry[T1, T2]] | None = Field(None, alias="entry", serialization_alias="entry")

examples/python-r4-us-core/fhir_types/hl7_fhir_r4_core/domain_resource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pydantic import BaseModel, ConfigDict, Field, PositiveInt, model_validator
77
from typing import Any, Generic, List as PyList, Literal
88
from typing_extensions import Self, TypeVar
9+
from fhir_types.fhirpy_base_model import FhirpyBaseModel
910

1011
from fhir_types.hl7_fhir_r4_core.base import Extension, Narrative
1112
from fhir_types.hl7_fhir_r4_core.resource import Resource
@@ -20,7 +21,6 @@ class DomainResource(Resource, Generic[T]):
2021
default='DomainResource',
2122
alias='resourceType',
2223
serialization_alias='resourceType',
23-
frozen=True,
2424
pattern='DomainResource'
2525
)
2626
contained: PyList[T] | None = Field(None, alias="contained", serialization_alias="contained")

examples/python-r4-us-core/fhir_types/hl7_fhir_r4_core/observation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pydantic import BaseModel, ConfigDict, Field, PositiveInt
77
from typing import Any, List as PyList, Literal
88
from typing_extensions import Self
9+
from fhir_types.fhirpy_base_model import FhirpyBaseModel
910

1011
from fhir_types.hl7_fhir_r4_core.base import (
1112
Annotation, BackboneElement, CodeableConcept, Identifier, Period, Quantity, Range, Ratio, Reference, SampledData, \
@@ -49,7 +50,6 @@ class Observation(DomainResource):
4950
default='Observation',
5051
alias='resourceType',
5152
serialization_alias='resourceType',
52-
frozen=True,
5353
pattern='Observation'
5454
)
5555
based_on: PyList[Reference] | None = Field(None, alias="basedOn", serialization_alias="basedOn")

examples/python-r4-us-core/fhir_types/hl7_fhir_r4_core/operation_outcome.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pydantic import BaseModel, ConfigDict, Field, PositiveInt
77
from typing import Any, List as PyList, Literal
88
from typing_extensions import Self
9+
from fhir_types.fhirpy_base_model import FhirpyBaseModel
910

1011
from fhir_types.hl7_fhir_r4_core.base import BackboneElement, CodeableConcept
1112
from fhir_types.hl7_fhir_r4_core.domain_resource import DomainResource
@@ -27,7 +28,6 @@ class OperationOutcome(DomainResource):
2728
default='OperationOutcome',
2829
alias='resourceType',
2930
serialization_alias='resourceType',
30-
frozen=True,
3131
pattern='OperationOutcome'
3232
)
3333
issue: PyList[OperationOutcomeIssue] = Field(alias="issue", serialization_alias="issue")

examples/python-r4-us-core/fhir_types/hl7_fhir_r4_core/organization.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pydantic import BaseModel, ConfigDict, Field, PositiveInt
77
from typing import Any, List as PyList, Literal
88
from typing_extensions import Self
9+
from fhir_types.fhirpy_base_model import FhirpyBaseModel
910

1011
from fhir_types.hl7_fhir_r4_core.base import (
1112
Address, BackboneElement, CodeableConcept, ContactPoint, HumanName, Identifier, Reference
@@ -28,7 +29,6 @@ class Organization(DomainResource):
2829
default='Organization',
2930
alias='resourceType',
3031
serialization_alias='resourceType',
31-
frozen=True,
3232
pattern='Organization'
3333
)
3434
active: bool | None = Field(None, alias="active", serialization_alias="active")

examples/python-r4-us-core/fhir_types/hl7_fhir_r4_core/patient.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pydantic import BaseModel, ConfigDict, Field, PositiveInt
77
from typing import Any, List as PyList, Literal
88
from typing_extensions import Self
9+
from fhir_types.fhirpy_base_model import FhirpyBaseModel
910

1011
from fhir_types.hl7_fhir_r4_core.base import (
1112
Address, Attachment, BackboneElement, CodeableConcept, ContactPoint, HumanName, Identifier, Period, Reference
@@ -41,7 +42,6 @@ class Patient(DomainResource):
4142
default='Patient',
4243
alias='resourceType',
4344
serialization_alias='resourceType',
44-
frozen=True,
4545
pattern='Patient'
4646
)
4747
active: bool | None = Field(None, alias="active", serialization_alias="active")

examples/python-r4-us-core/fhir_types/hl7_fhir_r4_core/resource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
from pydantic import BaseModel, ConfigDict, Field, PositiveInt
77
from typing import Any, List as PyList, Literal
88
from typing_extensions import Self
9+
from fhir_types.fhirpy_base_model import FhirpyBaseModel
910

1011
from fhir_types.hl7_fhir_r4_core.base import Meta
1112
from fhir_types.hl7_fhir_r4_core.base import Element
1213

1314

14-
class Resource(BaseModel):
15+
class Resource(FhirpyBaseModel):
1516
model_config = ConfigDict(validate_by_name=True, serialize_by_alias=True, extra="forbid")
1617
resource_type: str = Field(
1718
default='Resource',
1819
alias='resourceType',
1920
serialization_alias='resourceType',
20-
frozen=True,
2121
pattern='Resource'
2222
)
2323
id: str | None = Field(None, alias="id", serialization_alias="id")

0 commit comments

Comments
 (0)