From 2467cb2f5af07a7262b3221bf61b58ad4017659a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elisi=C3=A1rio=20Couto?= Date: Sun, 14 Sep 2025 21:11:01 +0100 Subject: [PATCH] chore: Sort imports, fix deprecated pydantic option. --- leggen/api/models/accounts.py | 2 +- leggen/api/models/notifications.py | 2 +- leggen/api/routes/accounts.py | 9 +++++---- leggen/api/routes/banks.py | 6 +++--- leggen/api/routes/notifications.py | 7 ++++--- leggen/api/routes/sync.py | 7 ++++--- leggen/api/routes/transactions.py | 5 +++-- leggen/api_client.py | 5 +++-- leggen/background/scheduler.py | 4 ++-- leggen/commands/balances.py | 2 +- leggen/commands/bank/add.py | 4 ++-- leggen/commands/generate_sample_db.py | 5 +++-- leggen/commands/server.py | 2 +- leggen/commands/status.py | 2 +- leggen/commands/sync.py | 2 +- leggen/commands/transactions.py | 2 +- leggen/main.py | 2 +- leggen/models/config.py | 7 +++---- leggen/services/database_service.py | 10 +++++----- leggen/services/gocardless_service.py | 4 ++-- leggen/services/notification_service.py | 20 +++++++++++++------- leggen/services/sync_service.py | 2 +- leggen/services/transaction_processor.py | 2 +- leggen/utils/config.py | 8 ++++---- scripts/generate_sample_db.py | 2 +- tests/conftest.py | 5 +++-- tests/unit/test_analytics_fix.py | 5 +++-- tests/unit/test_api_accounts.py | 3 ++- tests/unit/test_api_banks.py | 5 +++-- tests/unit/test_api_client.py | 3 ++- tests/unit/test_api_transactions.py | 5 +++-- tests/unit/test_config.py | 3 ++- tests/unit/test_configurable_paths.py | 7 ++++--- tests/unit/test_database_service.py | 5 +++-- tests/unit/test_scheduler.py | 5 +++-- 35 files changed, 95 insertions(+), 74 deletions(-) diff --git a/leggen/api/models/accounts.py b/leggen/api/models/accounts.py index edbc6cb..2fb4848 100644 --- a/leggen/api/models/accounts.py +++ b/leggen/api/models/accounts.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import List, Optional, Dict, Any +from typing import Any, Dict, List, Optional from pydantic import BaseModel diff --git a/leggen/api/models/notifications.py b/leggen/api/models/notifications.py index 2abfd88..5b0379e 100644 --- a/leggen/api/models/notifications.py +++ b/leggen/api/models/notifications.py @@ -1,4 +1,4 @@ -from typing import Optional, List +from typing import List, Optional from pydantic import BaseModel diff --git a/leggen/api/routes/accounts.py b/leggen/api/routes/accounts.py index 1bad617..32b1a11 100644 --- a/leggen/api/routes/accounts.py +++ b/leggen/api/routes/accounts.py @@ -1,15 +1,16 @@ -from typing import Optional, List, Union +from typing import List, Optional, Union + from fastapi import APIRouter, HTTPException, Query from loguru import logger -from leggen.api.models.common import APIResponse from leggen.api.models.accounts import ( - AccountDetails, AccountBalance, + AccountDetails, + AccountUpdate, Transaction, TransactionSummary, - AccountUpdate, ) +from leggen.api.models.common import APIResponse from leggen.services.database_service import DatabaseService router = APIRouter() diff --git a/leggen/api/routes/banks.py b/leggen/api/routes/banks.py index 1063767..98a8c42 100644 --- a/leggen/api/routes/banks.py +++ b/leggen/api/routes/banks.py @@ -1,13 +1,13 @@ from fastapi import APIRouter, HTTPException, Query from loguru import logger -from leggen.api.models.common import APIResponse from leggen.api.models.banks import ( - BankInstitution, BankConnectionRequest, - BankRequisition, BankConnectionStatus, + BankInstitution, + BankRequisition, ) +from leggen.api.models.common import APIResponse from leggen.services.gocardless_service import GoCardlessService from leggen.utils.gocardless import REQUISITION_STATUS diff --git a/leggen/api/routes/notifications.py b/leggen/api/routes/notifications.py index 5ab7f3d..e0800ae 100644 --- a/leggen/api/routes/notifications.py +++ b/leggen/api/routes/notifications.py @@ -1,14 +1,15 @@ -from typing import Dict, Any +from typing import Any, Dict + from fastapi import APIRouter, HTTPException from loguru import logger from leggen.api.models.common import APIResponse from leggen.api.models.notifications import ( + DiscordConfig, + NotificationFilters, NotificationSettings, NotificationTest, - DiscordConfig, TelegramConfig, - NotificationFilters, ) from leggen.services.notification_service import NotificationService from leggen.utils.config import config diff --git a/leggen/api/routes/sync.py b/leggen/api/routes/sync.py index f154d69..5eec8be 100644 --- a/leggen/api/routes/sync.py +++ b/leggen/api/routes/sync.py @@ -1,11 +1,12 @@ from typing import Optional -from fastapi import APIRouter, HTTPException, BackgroundTasks + +from fastapi import APIRouter, BackgroundTasks, HTTPException from loguru import logger from leggen.api.models.common import APIResponse -from leggen.api.models.sync import SyncRequest, SchedulerConfig -from leggen.services.sync_service import SyncService +from leggen.api.models.sync import SchedulerConfig, SyncRequest from leggen.background.scheduler import scheduler +from leggen.services.sync_service import SyncService from leggen.utils.config import config router = APIRouter() diff --git a/leggen/api/routes/transactions.py b/leggen/api/routes/transactions.py index c25c186..8d031ef 100644 --- a/leggen/api/routes/transactions.py +++ b/leggen/api/routes/transactions.py @@ -1,10 +1,11 @@ -from typing import Optional, List, Union from datetime import datetime, timedelta +from typing import List, Optional, Union + from fastapi import APIRouter, HTTPException, Query from loguru import logger -from leggen.api.models.common import APIResponse, PaginatedResponse from leggen.api.models.accounts import Transaction, TransactionSummary +from leggen.api.models.common import APIResponse, PaginatedResponse from leggen.services.database_service import DatabaseService router = APIRouter() diff --git a/leggen/api_client.py b/leggen/api_client.py index a8fd089..9832925 100644 --- a/leggen/api_client.py +++ b/leggen/api_client.py @@ -1,8 +1,9 @@ import os -import requests -from typing import Dict, Any, Optional, List, Union +from typing import Any, Dict, List, Optional, Union from urllib.parse import urljoin +import requests + from leggen.utils.text import error diff --git a/leggen/background/scheduler.py b/leggen/background/scheduler.py index 17ea397..302f5e7 100644 --- a/leggen/background/scheduler.py +++ b/leggen/background/scheduler.py @@ -2,9 +2,9 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger from loguru import logger -from leggen.utils.config import config -from leggen.services.sync_service import SyncService from leggen.services.notification_service import NotificationService +from leggen.services.sync_service import SyncService +from leggen.utils.config import config class BackgroundScheduler: diff --git a/leggen/commands/balances.py b/leggen/commands/balances.py index 47b86c1..ce3571d 100644 --- a/leggen/commands/balances.py +++ b/leggen/commands/balances.py @@ -1,7 +1,7 @@ import click -from leggen.main import cli from leggen.api_client import LeggenAPIClient +from leggen.main import cli from leggen.utils.text import datefmt, print_table diff --git a/leggen/commands/bank/add.py b/leggen/commands/bank/add.py index ead9033..19d0961 100644 --- a/leggen/commands/bank/add.py +++ b/leggen/commands/bank/add.py @@ -1,9 +1,9 @@ import click -from leggen.main import cli from leggen.api_client import LeggenAPIClient +from leggen.main import cli from leggen.utils.disk import save_file -from leggen.utils.text import info, print_table, warning, success +from leggen.utils.text import info, print_table, success, warning @cli.command() diff --git a/leggen/commands/generate_sample_db.py b/leggen/commands/generate_sample_db.py index 519d076..67636df 100644 --- a/leggen/commands/generate_sample_db.py +++ b/leggen/commands/generate_sample_db.py @@ -1,8 +1,9 @@ """Generate sample database command.""" -import click from pathlib import Path +import click + @click.command() @click.option( @@ -34,8 +35,8 @@ def generate_sample_db( """Generate a sample database with realistic financial data for testing.""" # Import here to avoid circular imports - import sys import subprocess + import sys from pathlib import Path as PathlibPath # Get the script path diff --git a/leggen/commands/server.py b/leggen/commands/server.py index 14cc57f..e1c2653 100644 --- a/leggen/commands/server.py +++ b/leggen/commands/server.py @@ -7,7 +7,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from loguru import logger -from leggen.api.routes import banks, accounts, sync, notifications, transactions +from leggen.api.routes import accounts, banks, notifications, sync, transactions from leggen.background.scheduler import scheduler from leggen.utils.config import config from leggen.utils.paths import path_manager diff --git a/leggen/commands/status.py b/leggen/commands/status.py index a8de114..52f6894 100644 --- a/leggen/commands/status.py +++ b/leggen/commands/status.py @@ -1,7 +1,7 @@ import click -from leggen.main import cli from leggen.api_client import LeggenAPIClient +from leggen.main import cli from leggen.utils.text import datefmt, echo, info, print_table diff --git a/leggen/commands/sync.py b/leggen/commands/sync.py index 73300a5..83e03d0 100644 --- a/leggen/commands/sync.py +++ b/leggen/commands/sync.py @@ -1,7 +1,7 @@ import click -from leggen.main import cli from leggen.api_client import LeggenAPIClient +from leggen.main import cli from leggen.utils.text import error, info, success diff --git a/leggen/commands/transactions.py b/leggen/commands/transactions.py index 3d4f3fc..f52b458 100644 --- a/leggen/commands/transactions.py +++ b/leggen/commands/transactions.py @@ -1,7 +1,7 @@ import click -from leggen.main import cli from leggen.api_client import LeggenAPIClient +from leggen.main import cli from leggen.utils.text import datefmt, info, print_table diff --git a/leggen/main.py b/leggen/main.py index b4302c3..498220c 100644 --- a/leggen/main.py +++ b/leggen/main.py @@ -6,8 +6,8 @@ from pathlib import Path import click from leggen.utils.config import load_config -from leggen.utils.text import error from leggen.utils.paths import path_manager +from leggen.utils.text import error cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), "commands")) diff --git a/leggen/models/config.py b/leggen/models/config.py index b14194b..557c456 100644 --- a/leggen/models/config.py +++ b/leggen/models/config.py @@ -1,4 +1,5 @@ -from typing import Optional, List +from typing import List, Optional + from pydantic import BaseModel, Field @@ -61,6 +62,4 @@ class Config(BaseModel): scheduler: SchedulerConfig = Field(default_factory=SchedulerConfig) class Config: - allow_population_by_field_name = ( - True # Allow both 'case_insensitive' and 'case-insensitive' - ) + validate_by_name = True diff --git a/leggen/services/database_service.py b/leggen/services/database_service.py index cf990df..6eef8dd 100644 --- a/leggen/services/database_service.py +++ b/leggen/services/database_service.py @@ -1,14 +1,14 @@ -from datetime import datetime, timedelta -from typing import List, Dict, Any, Optional -import sqlite3 import json +import sqlite3 from collections import defaultdict +from datetime import datetime, timedelta +from typing import Any, Dict, List, Optional from loguru import logger +from leggen.services.transaction_processor import TransactionProcessor from leggen.utils.config import config from leggen.utils.paths import path_manager -from leggen.services.transaction_processor import TransactionProcessor class DatabaseService: @@ -721,8 +721,8 @@ class DatabaseService: ) -> List[Dict[str, Any]]: """Persist transactions to SQLite""" try: - import sqlite3 import json + import sqlite3 db_path = path_manager.get_database_path() conn = sqlite3.connect(str(db_path)) diff --git a/leggen/services/gocardless_service.py b/leggen/services/gocardless_service.py index 1353cc4..5865eba 100644 --- a/leggen/services/gocardless_service.py +++ b/leggen/services/gocardless_service.py @@ -1,8 +1,8 @@ import json -import httpx from pathlib import Path -from typing import Dict, Any, List +from typing import Any, Dict, List +import httpx from loguru import logger from leggen.utils.config import config diff --git a/leggen/services/notification_service.py b/leggen/services/notification_service.py index 7562187..058394b 100644 --- a/leggen/services/notification_service.py +++ b/leggen/services/notification_service.py @@ -1,4 +1,4 @@ -from typing import List, Dict, Any +from typing import Any, Dict, List from loguru import logger @@ -119,9 +119,10 @@ class NotificationService: ) -> None: """Send Discord notifications for transactions""" try: - from leggen.notifications.discord import send_transactions_message import click + from leggen.notifications.discord import send_transactions_message + # Create a mock context with the webhook ctx = click.Context(click.Command("notifications")) ctx.obj = { @@ -148,9 +149,10 @@ class NotificationService: ) -> None: """Send Telegram notifications for transactions""" try: - from leggen.notifications.telegram import send_transaction_message import click + from leggen.notifications.telegram import send_transaction_message + # Create a mock context with the telegram config ctx = click.Context(click.Command("notifications")) telegram_config = self.notifications_config.get("telegram", {}) @@ -175,9 +177,10 @@ class NotificationService: async def _send_discord_test(self, message: str) -> None: """Send Discord test notification""" try: - from leggen.notifications.discord import send_expire_notification import click + from leggen.notifications.discord import send_expire_notification + # Create a mock context with the webhook ctx = click.Context(click.Command("test")) ctx.obj = { @@ -206,9 +209,10 @@ class NotificationService: async def _send_telegram_test(self, message: str) -> None: """Send Telegram test notification""" try: - from leggen.notifications.telegram import send_expire_notification import click + from leggen.notifications.telegram import send_expire_notification + # Create a mock context with the telegram config ctx = click.Context(click.Command("test")) telegram_config = self.notifications_config.get("telegram", {}) @@ -237,9 +241,10 @@ class NotificationService: async def _send_discord_expiry(self, notification_data: Dict[str, Any]) -> None: """Send Discord expiry notification""" try: - from leggen.notifications.discord import send_expire_notification import click + from leggen.notifications.discord import send_expire_notification + # Create a mock context with the webhook ctx = click.Context(click.Command("expiry")) ctx.obj = { @@ -262,9 +267,10 @@ class NotificationService: async def _send_telegram_expiry(self, notification_data: Dict[str, Any]) -> None: """Send Telegram expiry notification""" try: - from leggen.notifications.telegram import send_expire_notification import click + from leggen.notifications.telegram import send_expire_notification + # Create a mock context with the telegram config ctx = click.Context(click.Command("expiry")) telegram_config = self.notifications_config.get("telegram", {}) diff --git a/leggen/services/sync_service.py b/leggen/services/sync_service.py index 3ac0d75..0d4426c 100644 --- a/leggen/services/sync_service.py +++ b/leggen/services/sync_service.py @@ -4,8 +4,8 @@ from typing import List from loguru import logger from leggen.api.models.sync import SyncResult, SyncStatus -from leggen.services.gocardless_service import GoCardlessService from leggen.services.database_service import DatabaseService +from leggen.services.gocardless_service import GoCardlessService from leggen.services.notification_service import NotificationService diff --git a/leggen/services/transaction_processor.py b/leggen/services/transaction_processor.py index fadda42..7e238bf 100644 --- a/leggen/services/transaction_processor.py +++ b/leggen/services/transaction_processor.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import List, Dict, Any +from typing import Any, Dict, List class TransactionProcessor: diff --git a/leggen/utils/config.py b/leggen/utils/config.py index e037c51..6cbe55c 100644 --- a/leggen/utils/config.py +++ b/leggen/utils/config.py @@ -1,17 +1,17 @@ import os import sys import tomllib -import tomli_w from pathlib import Path -from typing import Dict, Any, Optional +from typing import Any, Dict, Optional import click +import tomli_w from loguru import logger from pydantic import ValidationError -from leggen.utils.text import error -from leggen.utils.paths import path_manager from leggen.models.config import Config as ConfigModel +from leggen.utils.paths import path_manager +from leggen.utils.text import error class Config: diff --git a/scripts/generate_sample_db.py b/scripts/generate_sample_db.py index 0f03466..74edbdb 100755 --- a/scripts/generate_sample_db.py +++ b/scripts/generate_sample_db.py @@ -7,7 +7,7 @@ import sqlite3 import sys from datetime import datetime, timedelta from pathlib import Path -from typing import List, Dict, Any +from typing import Any, Dict, List import click diff --git a/tests/conftest.py b/tests/conftest.py index c34cd29..7ebff10 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,10 +1,11 @@ """Pytest configuration and shared fixtures.""" -import pytest -import tempfile import json +import tempfile from pathlib import Path from unittest.mock import patch + +import pytest from fastapi.testclient import TestClient from leggen.commands.server import create_app diff --git a/tests/unit/test_analytics_fix.py b/tests/unit/test_analytics_fix.py index 0a88ecf..b8f7bd0 100644 --- a/tests/unit/test_analytics_fix.py +++ b/tests/unit/test_analytics_fix.py @@ -1,8 +1,9 @@ """Tests for analytics fixes to ensure all transactions are used in statistics.""" -import pytest from datetime import datetime, timedelta -from unittest.mock import Mock, AsyncMock, patch +from unittest.mock import AsyncMock, Mock, patch + +import pytest from fastapi.testclient import TestClient from leggen.commands.server import create_app diff --git a/tests/unit/test_api_accounts.py b/tests/unit/test_api_accounts.py index 480066b..b5327e1 100644 --- a/tests/unit/test_api_accounts.py +++ b/tests/unit/test_api_accounts.py @@ -1,8 +1,9 @@ """Tests for accounts API endpoints.""" -import pytest from unittest.mock import patch +import pytest + @pytest.mark.api class TestAccountsAPI: diff --git a/tests/unit/test_api_banks.py b/tests/unit/test_api_banks.py index 075d439..f3f97cd 100644 --- a/tests/unit/test_api_banks.py +++ b/tests/unit/test_api_banks.py @@ -1,9 +1,10 @@ """Tests for banks API endpoints.""" +from unittest.mock import patch + +import httpx import pytest import respx -import httpx -from unittest.mock import patch @pytest.mark.api diff --git a/tests/unit/test_api_client.py b/tests/unit/test_api_client.py index 7f39e24..ce61d40 100644 --- a/tests/unit/test_api_client.py +++ b/tests/unit/test_api_client.py @@ -1,9 +1,10 @@ """Tests for CLI API client.""" +from unittest.mock import patch + import pytest import requests import requests_mock -from unittest.mock import patch from leggen.api_client import LeggenAPIClient diff --git a/tests/unit/test_api_transactions.py b/tests/unit/test_api_transactions.py index 8b3db2d..7e637d1 100644 --- a/tests/unit/test_api_transactions.py +++ b/tests/unit/test_api_transactions.py @@ -1,8 +1,9 @@ """Tests for transactions API endpoints.""" -import pytest -from unittest.mock import patch from datetime import datetime +from unittest.mock import patch + +import pytest @pytest.mark.api diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index d22bfd8..c76cdfd 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -1,8 +1,9 @@ """Tests for configuration management.""" -import pytest from unittest.mock import patch +import pytest + from leggen.utils.config import Config diff --git a/tests/unit/test_configurable_paths.py b/tests/unit/test_configurable_paths.py index 40915e2..556cc72 100644 --- a/tests/unit/test_configurable_paths.py +++ b/tests/unit/test_configurable_paths.py @@ -1,13 +1,14 @@ """Integration tests for configurable paths.""" -import pytest -import tempfile import os +import tempfile from pathlib import Path from unittest.mock import patch -from leggen.utils.paths import path_manager +import pytest + from leggen.services.database_service import DatabaseService +from leggen.utils.paths import path_manager @pytest.mark.unit diff --git a/tests/unit/test_database_service.py b/tests/unit/test_database_service.py index cc158e9..94f90f7 100644 --- a/tests/unit/test_database_service.py +++ b/tests/unit/test_database_service.py @@ -1,8 +1,9 @@ """Tests for database service.""" -import pytest -from unittest.mock import patch from datetime import datetime +from unittest.mock import patch + +import pytest from leggen.services.database_service import DatabaseService diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py index 1a05eaf..84e6f5f 100644 --- a/tests/unit/test_scheduler.py +++ b/tests/unit/test_scheduler.py @@ -1,8 +1,9 @@ """Tests for background scheduler.""" -import pytest -from unittest.mock import patch, AsyncMock, MagicMock from datetime import datetime +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest from leggen.background.scheduler import BackgroundScheduler