From 61442a598fa7f38c568e3df7e1d924ed85df7491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elisi=C3=A1rio=20Couto?= Date: Thu, 18 Sep 2025 11:09:43 +0100 Subject: [PATCH] fix(config): Remove aliases for configuration keys that were disabling telegram notifications in some cases. --- README.md | 4 ++-- config.example.toml | 10 +++++----- leggen/api/routes/notifications.py | 26 ++++++++++++------------- leggen/models/config.py | 15 ++++---------- leggen/notifications/telegram.py | 8 ++++---- leggen/services/notification_service.py | 16 +++++++-------- leggen/utils/notifications.py | 2 +- tests/unit/test_config.py | 10 +++++----- 8 files changed, 42 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index c392e73..b087dcb 100644 --- a/README.md +++ b/README.md @@ -146,8 +146,8 @@ enabled = true # Optional: Transaction filters for notifications [filters] -case-insensitive = ["salary", "utility"] -case-sensitive = ["SpecificStore"] +case_insensitive = ["salary", "utility"] +case_sensitive = ["SpecificStore"] ``` ## 📖 Usage diff --git a/config.example.toml b/config.example.toml index c7683a3..f9841ca 100644 --- a/config.example.toml +++ b/config.example.toml @@ -9,7 +9,7 @@ sqlite = true # Optional: Background sync scheduling [scheduler.sync] enabled = true -hour = 3 # 3 AM +hour = 3 # 3 AM minute = 0 # cron = "0 3 * * *" # Alternative: use cron expression @@ -20,11 +20,11 @@ enabled = true # Optional: Telegram notifications [notifications.telegram] -api-key = "your-bot-token" -chat-id = 12345 +token = "your-bot-token" +chat_id = 12345 enabled = true # Optional: Transaction filters for notifications [filters] -case-insensitive = ["salary", "utility"] -case-sensitive = ["SpecificStore"] +case_insensitive = ["salary", "utility"] +case_sensitive = ["SpecificStore"] diff --git a/leggen/api/routes/notifications.py b/leggen/api/routes/notifications.py index e0800ae..3b23d23 100644 --- a/leggen/api/routes/notifications.py +++ b/leggen/api/routes/notifications.py @@ -37,15 +37,15 @@ async def get_notification_settings() -> APIResponse: if discord_config.get("webhook") else None, telegram=TelegramConfig( - token="***" if telegram_config.get("api-key") else "", - chat_id=telegram_config.get("chat-id", 0), + token="***" if telegram_config.get("token") else "", + chat_id=telegram_config.get("chat_id", 0), enabled=telegram_config.get("enabled", True), ) - if telegram_config.get("api-key") + if telegram_config.get("token") else None, filters=NotificationFilters( - case_insensitive=filters_config.get("case-insensitive", []), - case_sensitive=filters_config.get("case-sensitive"), + case_insensitive=filters_config.get("case_insensitive", []), + case_sensitive=filters_config.get("case_sensitive"), ), ) @@ -77,17 +77,17 @@ async def update_notification_settings(settings: NotificationSettings) -> APIRes if settings.telegram: notifications_config["telegram"] = { - "api-key": settings.telegram.token, - "chat-id": settings.telegram.chat_id, + "token": settings.telegram.token, + "chat_id": settings.telegram.chat_id, "enabled": settings.telegram.enabled, } # Update filters config filters_config: Dict[str, Any] = {} if settings.filters.case_insensitive: - filters_config["case-insensitive"] = settings.filters.case_insensitive + filters_config["case_insensitive"] = settings.filters.case_insensitive if settings.filters.case_sensitive: - filters_config["case-sensitive"] = settings.filters.case_sensitive + filters_config["case_sensitive"] = settings.filters.case_sensitive # Save to config if notifications_config: @@ -153,12 +153,12 @@ async def get_notification_services() -> APIResponse: "telegram": { "name": "Telegram", "enabled": bool( - notifications_config.get("telegram", {}).get("api-key") - and notifications_config.get("telegram", {}).get("chat-id") + notifications_config.get("telegram", {}).get("token") + and notifications_config.get("telegram", {}).get("chat_id") ), "configured": bool( - notifications_config.get("telegram", {}).get("api-key") - and notifications_config.get("telegram", {}).get("chat-id") + notifications_config.get("telegram", {}).get("token") + and notifications_config.get("telegram", {}).get("chat_id") ), "active": notifications_config.get("telegram", {}).get("enabled", True), }, diff --git a/leggen/models/config.py b/leggen/models/config.py index 557c456..1dbf203 100644 --- a/leggen/models/config.py +++ b/leggen/models/config.py @@ -22,8 +22,8 @@ class DiscordNotificationConfig(BaseModel): class TelegramNotificationConfig(BaseModel): - token: str = Field(..., alias="api-key", description="Telegram bot token") - chat_id: int = Field(..., alias="chat-id", description="Telegram chat ID") + token: str = Field(..., description="Telegram bot token") + chat_id: int = Field(..., description="Telegram chat ID") enabled: bool = Field(default=True, description="Enable Telegram notifications") @@ -33,12 +33,8 @@ class NotificationConfig(BaseModel): class FilterConfig(BaseModel): - case_insensitive: Optional[List[str]] = Field( - default_factory=list, alias="case-insensitive" - ) - case_sensitive: Optional[List[str]] = Field( - default_factory=list, alias="case-sensitive" - ) + case_insensitive: Optional[List[str]] = Field(default_factory=list) + case_sensitive: Optional[List[str]] = Field(default_factory=list) class SyncScheduleConfig(BaseModel): @@ -60,6 +56,3 @@ class Config(BaseModel): notifications: Optional[NotificationConfig] = None filters: Optional[FilterConfig] = None scheduler: SchedulerConfig = Field(default_factory=SchedulerConfig) - - class Config: - validate_by_name = True diff --git a/leggen/notifications/telegram.py b/leggen/notifications/telegram.py index b4c9934..7e51ae6 100644 --- a/leggen/notifications/telegram.py +++ b/leggen/notifications/telegram.py @@ -29,8 +29,8 @@ def escape_markdown(text: str) -> str: def send_expire_notification(ctx: click.Context, notification: dict): - token = ctx.obj["notifications"]["telegram"]["api-key"] - chat_id = ctx.obj["notifications"]["telegram"]["chat-id"] + token = ctx.obj["notifications"]["telegram"]["token"] + chat_id = ctx.obj["notifications"]["telegram"]["chat_id"] bot_url = f"https://api.telegram.org/bot{token}/sendMessage" info("Sending expiration notification to Telegram") message = "*💲 [Leggen](https://github.com/elisiariocouto/leggen)*\n" @@ -54,8 +54,8 @@ def send_expire_notification(ctx: click.Context, notification: dict): def send_transaction_message(ctx: click.Context, transactions: list): - token = ctx.obj["notifications"]["telegram"]["api-key"] - chat_id = ctx.obj["notifications"]["telegram"]["chat-id"] + token = ctx.obj["notifications"]["telegram"]["token"] + chat_id = ctx.obj["notifications"]["telegram"]["chat_id"] bot_url = f"https://api.telegram.org/bot{token}/sendMessage" info(f"Got {len(transactions)} new transactions, sending message to Telegram") message = "*💲 [Leggen](https://github.com/elisiariocouto/leggen)*\n" diff --git a/leggen/services/notification_service.py b/leggen/services/notification_service.py index 058394b..3d1858b 100644 --- a/leggen/services/notification_service.py +++ b/leggen/services/notification_service.py @@ -63,8 +63,8 @@ class NotificationService: ) -> List[Dict[str, Any]]: """Filter transactions based on notification criteria""" matching = [] - filters_case_insensitive = self.filters_config.get("case-insensitive", []) - filters_case_sensitive = self.filters_config.get("case-sensitive", []) + filters_case_insensitive = self.filters_config.get("case_insensitive", []) + filters_case_sensitive = self.filters_config.get("case_sensitive", []) for transaction in transactions: description = transaction.get("description", "") @@ -159,8 +159,8 @@ class NotificationService: ctx.obj = { "notifications": { "telegram": { - "api-key": telegram_config.get("token"), - "chat-id": telegram_config.get("chat_id"), + "token": telegram_config.get("token"), + "chat_id": telegram_config.get("chat_id"), } } } @@ -219,8 +219,8 @@ class NotificationService: ctx.obj = { "notifications": { "telegram": { - "api-key": telegram_config.get("token"), - "chat-id": telegram_config.get("chat_id"), + "token": telegram_config.get("token"), + "chat_id": telegram_config.get("chat_id"), } } } @@ -277,8 +277,8 @@ class NotificationService: ctx.obj = { "notifications": { "telegram": { - "api-key": telegram_config.get("token"), - "chat-id": telegram_config.get("chat_id"), + "token": telegram_config.get("token"), + "chat_id": telegram_config.get("chat_id"), } } } diff --git a/leggen/utils/notifications.py b/leggen/utils/notifications.py index 42b9a9f..57d11c5 100644 --- a/leggen/utils/notifications.py +++ b/leggen/utils/notifications.py @@ -29,7 +29,7 @@ def send_notification(ctx: click.Context, transactions: list): warning("No filters are enabled, skipping notifications") return - filters_case_insensitive = ctx.obj.get("filters", {}).get("case-insensitive", {}) + filters_case_insensitive = ctx.obj.get("filters", {}).get("case_insensitive", {}) # Add transaction to the list of transactions to be sent as a notification notification_transactions = [] diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index c76cdfd..3a7ff27 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -216,8 +216,8 @@ class TestConfig: """Test filters configuration access.""" custom_config = { "filters": { - "case-insensitive": ["salary", "utility"], - "case-sensitive": ["SpecificStore"], + "case_insensitive": ["salary", "utility"], + "case_sensitive": ["SpecificStore"], } } @@ -225,6 +225,6 @@ class TestConfig: config._config = custom_config filters = config.filters_config - assert "salary" in filters["case-insensitive"] - assert "utility" in filters["case-insensitive"] - assert "SpecificStore" in filters["case-sensitive"] + assert "salary" in filters["case_insensitive"] + assert "utility" in filters["case_insensitive"] + assert "SpecificStore" in filters["case_sensitive"]