Skip to content

Commit 4cc99e6

Browse files
committed
Implement Pydantic BaseSettings for Env Vars
1 parent 31bd737 commit 4cc99e6

File tree

10 files changed

+89
-126
lines changed

10 files changed

+89
-126
lines changed

docker-compose.yml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,24 @@ services:
44
context: .
55
dockerfile: Dockerfile
66
container_name: print_server
7+
environment:
8+
- BACKEND=${BACKEND}
9+
- PRINTER=${PRINTER}
10+
- VENDOR_ID=${VENDOR_ID}
11+
- PRODUCT_ID=${PRODUCT_ID}
12+
- MEDIA=${MEDIA}
13+
- FONT=${FONT}
714
ports:
815
- "80:80"
916
privileged: true
1017
devices:
1118
- /dev/bus/usb:/dev/usb # USB Printer
12-
# volumes:
19+
# volumes:
1320
# - /sys/class/pwm/pwmchip0/pwm1/:/sys/class/pwm/pwmchip0/pwm1
1421
restart: always
22+
healthcheck:
23+
test: [ "CMD", "curl", "-f", "http://localhost:80/health" ]
24+
interval: 60s
25+
timeout: 10s
26+
retries: 2
27+
start_period: 30s

web/.env.example

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
BACKEND=usb
2+
PRINTER=PTP_700
3+
4+
VENDOR_ID=
5+
PRODUCT_ID=
6+
7+
MOTOR_INITIAL=50
8+
MOTOR_FINAL=25
9+
10+
MEDIA=W12
11+
FONT=/root/.local/share/fonts/fonts/ttf/JetBrainsMono-Regular.ttf

web/config.py

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

web/config.yaml

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

web/main.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,34 @@
44
from fastapi import FastAPI
55
from fastapi.staticfiles import StaticFiles
66

7-
from . import BrotherPrinterApiError
8-
from .config import Config
97
from .printer_manager import PrinterManager
10-
from .routes.config import router as config_router
118
from .routes.print import router as print_router
9+
from .settings import Settings
1210

1311
app = FastAPI()
1412

1513

1614
@asynccontextmanager
1715
async def lifespan(app: FastAPI):
18-
config = Config.get()
19-
if config.backend is None or config.printer is None:
20-
raise BrotherPrinterApiError("Must Provide a Valid Backend AND Printer Configuration")
16+
settings = Settings()
2117

22-
PrinterManager.toggle_power_button(config.motor_initial, config.motor_pressed)
18+
PrinterManager.toggle_power_button(settings.motor_initial, settings.motor_final)
2319
time.sleep(5)
2420

25-
PrinterManager(config.backend, config.printer, config.vendor_id, config.product_id)
21+
PrinterManager(
22+
settings.backend, settings.printer, settings.vendor_id, settings.product_id
23+
)
2624

2725
yield
2826

2927

3028
app.router.lifespan_context = lifespan
31-
app.include_router(config_router)
3229
app.include_router(print_router)
3330

31+
3432
@app.get("/health")
3533
def health():
3634
return {"status": "ok"}
3735

36+
3837
app.mount("/", StaticFiles(directory="static", html=True), name="static")

web/print_request.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from brother_label_printer_control.labels.text import Padding, Text
55
from pydantic import BaseModel, Field, field_validator
66

7-
from .config import Config
7+
from .settings import Settings
88

99

1010
class PrintRequest(BaseModel):
@@ -13,8 +13,8 @@ class PrintRequest(BaseModel):
1313
padding: Padding = Field(
1414
default_factory=lambda: Padding(top=0, right=0, bottom=0, left=0)
1515
)
16-
font: str = Field(default_factory=lambda: Config.get().font)
17-
media: Media = Field(default_factory=lambda: Config.get().media)
16+
font: str = Field(default_factory=lambda: Settings().font)
17+
media: Media = Field(default_factory=lambda: Settings().media)
1818

1919
@field_validator("padding")
2020
def set_padding(cls, padding: dict[str, int] | Padding) -> Padding:

web/requirements.txt

52 Bytes
Binary file not shown.

web/routes/config.py

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

web/routes/print.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from brother_label_printer_control.job import Job
22
from fastapi import APIRouter, Depends
33

4-
from .config import Config
54
from ..print_request import PrintRequest
65
from ..printer_manager import PrinterManager
6+
from ..settings import Settings
77

88
router = APIRouter()
99

1010

11-
def get_printer_manager(config: Config = Depends(Config.get)) -> "PrinterManager":
11+
def get_printer_manager(config: Settings = Depends(Settings)) -> "PrinterManager":
1212
return PrinterManager(config.backend, config.printer)
1313

1414

web/settings.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from brother_label_printer_control.backends.main import Backend
2+
from brother_label_printer_control.constants import Media
3+
from brother_label_printer_control.printers.main import Printer
4+
from brother_label_printer_control.utils.font import get_fonts
5+
from pydantic import model_validator
6+
from pydantic_settings import BaseSettings
7+
8+
from . import BrotherPrinterApiError
9+
10+
11+
class Settings(BaseSettings):
12+
"""Get the Settings from the Environment"""
13+
14+
backend: Backend | None
15+
printer: Printer | None
16+
vendor_id: int | None
17+
product_id: int | None
18+
motor_initial: int
19+
motor_final: int
20+
media: Media | None
21+
font: str | None
22+
23+
@classmethod
24+
@model_validator(mode="before")
25+
def convert_fields(cls, values):
26+
backend_value = values.get("backend")
27+
if not backend_value:
28+
raise BrotherPrinterApiError("Must Provide a Valid Backend")
29+
values["backend"] = Backend.get(backend_value)
30+
31+
printer_value = values.get("printer")
32+
if not printer_value:
33+
raise BrotherPrinterApiError("Must Provide a Valid Printer")
34+
values["printer"] = Printer.get(printer_value)
35+
36+
media_value = values.get("media")
37+
if media_value:
38+
values["media"] = Media.get(media_value)
39+
40+
if not values.get("font"):
41+
values["font"] = cls._get_default_font()
42+
43+
return values
44+
45+
@staticmethod
46+
def _get_default_font() -> str | None:
47+
"""Get the First Available TrueType Font in Linux as Default"""
48+
try:
49+
return list(get_fonts().values())[0][0].as_posix()
50+
except IndexError:
51+
return None

0 commit comments

Comments
 (0)