Skip to content

Commit 68ecd22

Browse files
committed
Updated pydantic settings
1 parent d451de9 commit 68ecd22

File tree

5 files changed

+39
-33
lines changed

5 files changed

+39
-33
lines changed

cdk/app.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232
lambda_env=lambda_env,
3333
fetch_bucket=settings.FETCH_BUCKET,
3434
vpc_id=settings.VPC_ID,
35-
ingest_lambda_timeout=settings.INGEST_LAMBDA_TIMEOUT,
36-
ingest_lambda_memory_size=settings.INGEST_LAMBDA_MEMORY_SIZE,
37-
ingest_rate_minutes=settings.INGEST_RATE_MINUTES,
35+
lambda_timeout=settings.LAMBDA_TIMEOUT,
36+
lambda_memory_size=settings.LAMBDA_MEMORY_SIZE,
37+
rate_minutes=settings.RATE_MINUTES,
3838
topic_arn=settings.TOPIC_ARN,
3939
env=env,
4040
)

cdk/config.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
from typing import List
2-
from pydantic import BaseSettings
2+
from pydantic_settings import (
3+
BaseSettings,
4+
SettingsConfigDict,
5+
)
36
from pathlib import Path
47
from os import environ
58

@@ -8,19 +11,17 @@ class Settings(BaseSettings):
811
FETCH_BUCKET: str
912
ENV: str = "staging"
1013
PROJECT: str = "openaq"
11-
INGEST_LAMBDA_TIMEOUT: int = 900
12-
INGEST_LAMBDA_MEMORY_SIZE: int = 1536
13-
INGEST_RATE_MINUTES: int = 15
14+
LAMBDA_TIMEOUT: int = 900
15+
LAMBDA_MEMORY_SIZE: int = 1536
16+
RATE_MINUTES: int = 15
1417
LOG_LEVEL: str = 'INFO'
1518
TOPIC_ARN: str = None
1619
VPC_ID: str = None
1720

18-
class Config:
19-
parent = Path(__file__).resolve().parent.parent
20-
if 'DOTENV' in environ:
21-
env_file = Path.joinpath(parent, environ['DOTENV'])
22-
else:
23-
env_file = Path.joinpath(parent, ".env")
21+
22+
model_config = SettingsConfigDict(
23+
extra="ignore", env_file=f"../{environ.get('DOTENV', '.env')}", env_file_encoding="utf-8"
24+
)
2425

2526

2627
settings = Settings()

cdk/lambda_ingest_stack.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ def __init__(
3030
env_name: str,
3131
lambda_env: Dict,
3232
fetch_bucket: str,
33-
ingest_lambda_timeout: int,
34-
ingest_lambda_memory_size: int,
35-
ingest_rate_minutes: int = 15,
33+
lambda_timeout: int,
34+
lambda_memory_size: int,
35+
rate_minutes: int = 15,
3636
topic_arn: str = None,
3737
vpc_id: str = None,
3838
**kwargs,
@@ -68,9 +68,9 @@ def __init__(
6868
vpc=vpc_id,
6969
runtime=aws_lambda.Runtime.PYTHON_3_11,
7070
allow_public_subnet=True,
71-
memory_size=ingest_lambda_memory_size,
71+
memory_size=lambda_memory_size,
7272
environment=stringify_settings(lambda_env),
73-
timeout=Duration.seconds(ingest_lambda_timeout),
73+
timeout=Duration.seconds(lambda_timeout),
7474
layers=[
7575
create_dependencies_layer(
7676
self,
@@ -89,12 +89,12 @@ def __init__(
8989

9090
# Set how often the ingester will run
9191
# If 0 the ingester will not run automatically
92-
if ingest_rate_minutes > 0:
92+
if rate_minutes > 0:
9393
aws_events.Rule(
9494
self,
9595
f"{id}-ingest-event-rule",
9696
schedule=aws_events.Schedule.cron(
97-
minute=f"0/{ingest_rate_minutes}"
97+
minute=f"0/{rate_minutes}"
9898
),
9999
targets=[
100100
aws_events_targets.LambdaFunction(ingest_function),

ingest/settings.py

+17-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
from typing import Union
2-
from pydantic import BaseSettings, validator
2+
3+
from pydantic_settings import (
4+
BaseSettings,
5+
SettingsConfigDict,
6+
)
7+
8+
from pydantic import computed_field
9+
310
from pathlib import Path
411
from os import environ
512

@@ -26,20 +33,17 @@ class Settings(BaseSettings):
2633
USE_TEMP_TABLES: bool = True
2734
PAUSE_INGESTING: bool = False
2835

29-
@validator('DATABASE_READ_URL', allow_reuse=True)
30-
def get_read_url(cls, v, values):
31-
return v or f"postgresql://{values['DATABASE_READ_USER']}:{values['DATABASE_READ_PASSWORD']}@{values['DATABASE_HOST']}:{values['DATABASE_PORT']}/{values['DATABASE_DB']}"
36+
@computed_field
37+
def DATABASE_READ_URL(self) -> str:
38+
return f"postgresql://{values['DATABASE_READ_USER']}:{values['DATABASE_READ_PASSWORD']}@{values['DATABASE_HOST']}:{values['DATABASE_PORT']}/{values['DATABASE_DB']}"
3239

33-
@validator('DATABASE_WRITE_URL', allow_reuse=True)
34-
def get_write_url(cls, v, values):
35-
return v or f"postgresql://{values['DATABASE_WRITE_USER']}:{values['DATABASE_WRITE_PASSWORD']}@{values['DATABASE_HOST']}:{values['DATABASE_PORT']}/{values['DATABASE_DB']}"
40+
@computed_field
41+
def DATABASE_WRITE_URL(self) -> str:
42+
return f"postgresql://{values['DATABASE_WRITE_USER']}:{values['DATABASE_WRITE_PASSWORD']}@{values['DATABASE_HOST']}:{values['DATABASE_PORT']}/{values['DATABASE_DB']}"
3643

37-
class Config:
38-
parent = Path(__file__).resolve().parent.parent
39-
if 'DOTENV' in environ:
40-
env_file = Path.joinpath(parent, environ['DOTENV'])
41-
else:
42-
env_file = Path.joinpath(parent, ".env")
44+
model_config = SettingsConfigDict(
45+
extra="ignore", env_file=f"../{environ.get('DOTENV', '.env')}", env_file_encoding="utf-8"
46+
)
4347

4448

4549
settings = Settings()

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pytz = "^2024.1"
1414
typer = "^0.12.3"
1515
typing-extensions = "^4.12.2"
1616
pydantic = {extras = ["dotenv"], version = "^2.7.3"}
17+
pydantic-settings = "^2.3.2"
1718

1819

1920
[tool.poetry.group.cdk.dependencies]

0 commit comments

Comments
 (0)