Skip to content

Commit 8633704

Browse files
Use NewTypes for response model.
1 parent 64ad9ca commit 8633704

File tree

3 files changed

+29
-12
lines changed

3 files changed

+29
-12
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ The following software packages, or their equivalents, are expected to be instal
7878
| `AWS_SECRET_ACCESS_KEY` | `dummy_secret` | AWS Secret Access Key |
7979
| `DYNAMODB_ENDPOINT` | `http://localhost:4566` | Endpoint for the app to access DynamoDB |
8080
| `LOG_LEVEL` | `WARNING` | Logging level. Must be one of `DEBUG`, `INFO`, `WARNING`, `ERROR` or `CRITICAL` as per [Logging Levels](https://docs.python.org/3/library/logging.html#logging-levels) |
81+
| `RULES_BUCKET_NAME` | `test-rules-bucket` | AWS S3 bucket from which to read rules. |
8182
8283
## Usage
8384

src/eligibility_signposting_api/views/eligibility.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88

99
from eligibility_signposting_api.model.eligibility import EligibilityStatus, NHSNumber, Status
1010
from eligibility_signposting_api.services import EligibilityService, UnknownPersonError
11-
from eligibility_signposting_api.views.response_models import EligibilityResponse, ProcessedSuggestion
11+
from eligibility_signposting_api.views.response_models import (
12+
ConditionName,
13+
EligibilityResponse,
14+
ProcessedSuggestion,
15+
StatusText,
16+
)
1217
from eligibility_signposting_api.views.response_models import Status as ResponseStatus
1318

1419
STATUS_MAPPING = {
@@ -49,9 +54,9 @@ def build_eligibility_response(eligibility_status: EligibilityStatus) -> Eligibi
4954
return EligibilityResponse( # pyright: ignore[reportCallIssue]
5055
processed_suggestions=[ # pyright: ignore[reportCallIssue]
5156
ProcessedSuggestion( # pyright: ignore[reportCallIssue]
52-
condition=condition.condition_name,
57+
condition_name=ConditionName(condition.condition_name), # pyright: ignore[reportCallIssue]
5358
status=STATUS_MAPPING[condition.status],
54-
status_text=f"{condition.status}", # pyright: ignore[reportCallIssue]
59+
status_text=StatusText(f"{condition.status}"), # pyright: ignore[reportCallIssue]
5560
eligibility_cohorts=[], # pyright: ignore[reportCallIssue]
5661
suitability_rules=[], # pyright: ignore[reportCallIssue]
5762
actions=[],

src/eligibility_signposting_api/views/response_models.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
from enum import Enum
2+
from typing import NewType
23

34
from pydantic import BaseModel, Field, HttpUrl
45

6+
ConditionName = NewType("ConditionName", str)
7+
StatusText = NewType("StatusText", str)
8+
ActionType = NewType("ActionType", str)
9+
ActionCode = NewType("ActionCode", str)
10+
Description = NewType("Description", str)
11+
RuleCode = NewType("RuleCode", str)
12+
RuleText = NewType("RuleText", str)
13+
CohortCode = NewType("CohortCode", str)
14+
CohortText = NewType("CohortText", str)
15+
516

617
class Status(str, Enum):
718
not_eligible = "NotEligible"
@@ -16,34 +27,34 @@ class RuleType(str, Enum):
1627

1728

1829
class EligibilityCohort(BaseModel):
19-
cohort_code: str = Field(..., alias="cohortCode")
20-
cohort_text: str = Field(..., alias="cohortText")
30+
cohort_code: CohortCode = Field(..., alias="cohortCode")
31+
cohort_text: CohortText = Field(..., alias="cohortText")
2132
cohort_status: Status = Field(..., alias="cohortStatus")
2233

2334
model_config = {"populate_by_name": True}
2435

2536

2637
class SuitabilityRule(BaseModel):
2738
type: RuleType = Field(..., alias="ruleType")
28-
rule_code: str = Field(..., alias="ruleCode")
29-
rule_text: str = Field(..., alias="ruleText")
39+
rule_code: RuleCode = Field(..., alias="ruleCode")
40+
rule_text: RuleText = Field(..., alias="ruleText")
3041

3142
model_config = {"populate_by_name": True}
3243

3344

3445
class Action(BaseModel):
35-
action_type: str = Field(..., alias="actionType")
36-
action_code: str = Field(..., alias="actionCode")
37-
description: str
46+
action_type: ActionType = Field(..., alias="actionType")
47+
action_code: ActionCode = Field(..., alias="actionCode")
48+
description: Description
3849
url_link: HttpUrl = Field(..., alias="urlLink")
3950

4051
model_config = {"populate_by_name": True}
4152

4253

4354
class ProcessedSuggestion(BaseModel):
44-
condition: str
55+
condition_name: ConditionName = Field(..., alias="condition")
4556
status: Status
46-
status_text: str = Field(..., alias="statusText")
57+
status_text: StatusText = Field(..., alias="statusText")
4758
eligibility_cohorts: list[EligibilityCohort] = Field(..., alias="eligibilityCohorts")
4859
suitability_rules: list[SuitabilityRule] = Field(..., alias="suitabilityRules")
4960
actions: list[Action]

0 commit comments

Comments
 (0)