Skip to content

Commit 4905032

Browse files
Restructure files.
1 parent ed5c68e commit 4905032

20 files changed

Lines changed: 378 additions & 335 deletions

gateway-api/src/fhir/__init__.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
"""FHIR data types and resources."""
22

3-
from .elements import Issue, IssueCode, IssueSeverity
4-
from .resources import (
5-
Bundle,
6-
Device,
7-
Endpoint,
8-
OperationOutcome,
9-
Parameters,
10-
Patient,
11-
Resource,
12-
)
3+
from .elements.issue import Issue, IssueCode, IssueSeverity
4+
from .resources.bundle import Bundle
5+
from .resources.device import Device
6+
from .resources.endpoint import Endpoint
7+
from .resources.operation_outcome import OperationOutcome
8+
from .resources.parameters import Parameters
9+
from .resources.patient import Patient
10+
from .resources.resource import Resource
1311

1412
__all__ = [
1513
"Bundle",

gateway-api/src/fhir/elements.py

Lines changed: 0 additions & 101 deletions
This file was deleted.

gateway-api/src/fhir/elements/__init__.py

Whitespace-only changes.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import uuid
2+
from abc import ABC
3+
from dataclasses import dataclass
4+
from typing import ClassVar
5+
6+
from pydantic import model_validator
7+
8+
9+
@dataclass(frozen=True)
10+
class Identifier(ABC):
11+
"""
12+
A FHIR R4 Identifier element. See https://hl7.org/fhir/R4/datatypes.html#Identifier.
13+
Attributes:
14+
system: The namespace for the identifier value.
15+
value: The value that is unique within the system.
16+
"""
17+
18+
_expected_system: ClassVar[str] = "__unknown__"
19+
20+
value: str
21+
system: str
22+
23+
@model_validator(mode="after")
24+
def validate_system(self) -> "Identifier":
25+
if self.system != self._expected_system:
26+
raise ValueError(
27+
f"Identifier system '{self.system}' does not match expected "
28+
f"system '{self._expected_system}'."
29+
)
30+
return self
31+
32+
@classmethod
33+
def __init_subclass__(cls, expected_system: str) -> None:
34+
cls._expected_system = expected_system
35+
36+
37+
class UUIDIdentifier(Identifier, expected_system="https://tools.ietf.org/html/rfc4122"):
38+
"""A UUID identifier utilising the standard RFC 4122 system."""
39+
40+
def __init__(self, value: uuid.UUID | None = None):
41+
super().__init__(
42+
value=str(value or uuid.uuid4()),
43+
system=self._expected_system,
44+
)
45+
46+
47+
class NHSNumberValueIdentifier(
48+
Identifier, expected_system="https://fhir.nhs.uk/Id/nhs-number"
49+
):
50+
"""A valueIdentifier NHS numbers - used in Parameter"""
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from abc import ABC
2+
from dataclasses import dataclass
3+
from enum import StrEnum
4+
5+
6+
class IssueSeverity(StrEnum):
7+
FATAL = "fatal"
8+
ERROR = "error"
9+
WARNING = "warning"
10+
INFORMATION = "information"
11+
12+
13+
class IssueCode(StrEnum):
14+
INVALID = "invalid"
15+
EXCEPTION = "exception"
16+
17+
18+
@dataclass(frozen=True)
19+
class Issue(ABC):
20+
"""
21+
A FHIR R4 OperationOutcome Issue element. See https://hl7.org/fhir/R4/datatypes.html#OperationOutcome.
22+
"""
23+
24+
severity: IssueSeverity
25+
code: IssueCode
26+
diagnostics: str | None = None
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import datetime
2+
from dataclasses import dataclass
3+
from typing import Annotated
4+
5+
from pydantic import Field
6+
7+
8+
@dataclass(frozen=True)
9+
class Meta:
10+
"""
11+
A FHIR R4 Meta element. See https://hl7.org/fhir/R4/datatypes.html#Meta.
12+
Attributes:
13+
version_id: The version id of the resource.
14+
last_updated: The last updated timestamp of the resource.
15+
"""
16+
17+
last_updated: Annotated[datetime.datetime | None, Field(alias="lastUpdated")] = None
18+
version_id: Annotated[str | None, Field(alias="versionId")] = None
19+
20+
@classmethod
21+
def with_last_updated(cls, last_updated: datetime.datetime | None = None) -> "Meta":
22+
"""
23+
Create a Meta instance with the provided last_updated timestamp.
24+
Args:
25+
last_updated: The last updated timestamp.
26+
Returns:
27+
A Meta instance with the specified last_updated.
28+
"""
29+
return cls(
30+
last_updated=last_updated or datetime.datetime.now(tz=datetime.timezone.utc)
31+
)

gateway-api/src/fhir/elements/py.typed

Whitespace-only changes.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import Any
2+
3+
from pydantic import BaseModel, Field
4+
5+
6+
# TODO: convert this to dataclass/ABC like the other elements?
7+
class Reference(BaseModel):
8+
"""A FHIR R4 Reference base class."""
9+
10+
reference_type: str = Field(alias="type", frozen=True)
11+
12+
def __init_subclass__(
13+
cls, reference_type: str, **kwargs: Any
14+
) -> None: # TODO: Why is this necessary?
15+
super().__init_subclass__(**kwargs)

gateway-api/src/fhir/test_elements.py renamed to gateway-api/src/fhir/elements/test_elements.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import pytest
55
from pydantic import BaseModel
66

7-
from .elements import Identifier, Meta, UUIDIdentifier
7+
from fhir.elements.identifier import Identifier, UUIDIdentifier
8+
from fhir.elements.meta import Meta
89

910

1011
class TestMeta:

0 commit comments

Comments
 (0)