Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions custom_components/mbtalive/config_flow.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import re
import voluptuous as vol
from typing import Any, Dict, Optional

Expand All @@ -14,17 +15,24 @@

_LOGGER = logging.getLogger(__name__)

# --- Custom validator for train number ---
def validate_train_number(value: str | None) -> str | None:
"""Validate that train number is 2–4 alphanumeric characters or empty."""
if value in ("", None):
return None # normalize empty
value = str(value).strip().upper()
if not re.fullmatch(r"[A-Z0-9]{2,4}", value):
raise vol.Invalid("Train number must be 2–4 letters/numbers or empty")
return value


def get_user_schema(default_api_key: str = "") -> vol.Schema:
return vol.Schema({
vol.Required("depart_from", default=""): str,
vol.Required("arrive_at", default=""): str,
vol.Required("api_key", default=default_api_key): vol.All(str, vol.Length(min=32, max=32)),
vol.Optional("max_trips", default=2): int,
vol.Optional("train", default=""): vol.Any(
vol.All(str, vol.Length(min=3, max=3)),
""
)
vol.Optional("train", default=""): validate_train_number,
})


Expand All @@ -45,6 +53,10 @@ async def async_step_user(
arrive_at = user_input.get("arrive_at")
api_key = user_input.get("api_key", "").strip()
train = user_input.get("train", "")
# Normalize empty train to None
if train in ("", None):
train = None
user_input["train"] = None

if not api_key:
errors["api_key"] = "required"
Expand Down