chore: Sort imports, fix deprecated pydantic option.

This commit is contained in:
Elisiário Couto
2025-09-14 21:11:01 +01:00
parent 5ae3a51d81
commit 2467cb2f5a
35 changed files with 95 additions and 74 deletions

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import List, Optional, Dict, Any from typing import Any, Dict, List, Optional
from pydantic import BaseModel from pydantic import BaseModel

View File

@@ -1,4 +1,4 @@
from typing import Optional, List from typing import List, Optional
from pydantic import BaseModel from pydantic import BaseModel

View File

@@ -1,15 +1,16 @@
from typing import Optional, List, Union from typing import List, Optional, Union
from fastapi import APIRouter, HTTPException, Query from fastapi import APIRouter, HTTPException, Query
from loguru import logger from loguru import logger
from leggen.api.models.common import APIResponse
from leggen.api.models.accounts import ( from leggen.api.models.accounts import (
AccountDetails,
AccountBalance, AccountBalance,
AccountDetails,
AccountUpdate,
Transaction, Transaction,
TransactionSummary, TransactionSummary,
AccountUpdate,
) )
from leggen.api.models.common import APIResponse
from leggen.services.database_service import DatabaseService from leggen.services.database_service import DatabaseService
router = APIRouter() router = APIRouter()

View File

@@ -1,13 +1,13 @@
from fastapi import APIRouter, HTTPException, Query from fastapi import APIRouter, HTTPException, Query
from loguru import logger from loguru import logger
from leggen.api.models.common import APIResponse
from leggen.api.models.banks import ( from leggen.api.models.banks import (
BankInstitution,
BankConnectionRequest, BankConnectionRequest,
BankRequisition,
BankConnectionStatus, BankConnectionStatus,
BankInstitution,
BankRequisition,
) )
from leggen.api.models.common import APIResponse
from leggen.services.gocardless_service import GoCardlessService from leggen.services.gocardless_service import GoCardlessService
from leggen.utils.gocardless import REQUISITION_STATUS from leggen.utils.gocardless import REQUISITION_STATUS

View File

@@ -1,14 +1,15 @@
from typing import Dict, Any from typing import Any, Dict
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from loguru import logger from loguru import logger
from leggen.api.models.common import APIResponse from leggen.api.models.common import APIResponse
from leggen.api.models.notifications import ( from leggen.api.models.notifications import (
DiscordConfig,
NotificationFilters,
NotificationSettings, NotificationSettings,
NotificationTest, NotificationTest,
DiscordConfig,
TelegramConfig, TelegramConfig,
NotificationFilters,
) )
from leggen.services.notification_service import NotificationService from leggen.services.notification_service import NotificationService
from leggen.utils.config import config from leggen.utils.config import config

View File

@@ -1,11 +1,12 @@
from typing import Optional from typing import Optional
from fastapi import APIRouter, HTTPException, BackgroundTasks
from fastapi import APIRouter, BackgroundTasks, HTTPException
from loguru import logger from loguru import logger
from leggen.api.models.common import APIResponse from leggen.api.models.common import APIResponse
from leggen.api.models.sync import SyncRequest, SchedulerConfig from leggen.api.models.sync import SchedulerConfig, SyncRequest
from leggen.services.sync_service import SyncService
from leggen.background.scheduler import scheduler from leggen.background.scheduler import scheduler
from leggen.services.sync_service import SyncService
from leggen.utils.config import config from leggen.utils.config import config
router = APIRouter() router = APIRouter()

View File

@@ -1,10 +1,11 @@
from typing import Optional, List, Union
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import List, Optional, Union
from fastapi import APIRouter, HTTPException, Query from fastapi import APIRouter, HTTPException, Query
from loguru import logger from loguru import logger
from leggen.api.models.common import APIResponse, PaginatedResponse
from leggen.api.models.accounts import Transaction, TransactionSummary from leggen.api.models.accounts import Transaction, TransactionSummary
from leggen.api.models.common import APIResponse, PaginatedResponse
from leggen.services.database_service import DatabaseService from leggen.services.database_service import DatabaseService
router = APIRouter() router = APIRouter()

View File

@@ -1,8 +1,9 @@
import os import os
import requests from typing import Any, Dict, List, Optional, Union
from typing import Dict, Any, Optional, List, Union
from urllib.parse import urljoin from urllib.parse import urljoin
import requests
from leggen.utils.text import error from leggen.utils.text import error

View File

@@ -2,9 +2,9 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.cron import CronTrigger
from loguru import logger 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.notification_service import NotificationService
from leggen.services.sync_service import SyncService
from leggen.utils.config import config
class BackgroundScheduler: class BackgroundScheduler:

View File

@@ -1,7 +1,7 @@
import click import click
from leggen.main import cli
from leggen.api_client import LeggenAPIClient from leggen.api_client import LeggenAPIClient
from leggen.main import cli
from leggen.utils.text import datefmt, print_table from leggen.utils.text import datefmt, print_table

View File

@@ -1,9 +1,9 @@
import click import click
from leggen.main import cli
from leggen.api_client import LeggenAPIClient from leggen.api_client import LeggenAPIClient
from leggen.main import cli
from leggen.utils.disk import save_file 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() @cli.command()

View File

@@ -1,8 +1,9 @@
"""Generate sample database command.""" """Generate sample database command."""
import click
from pathlib import Path from pathlib import Path
import click
@click.command() @click.command()
@click.option( @click.option(
@@ -34,8 +35,8 @@ def generate_sample_db(
"""Generate a sample database with realistic financial data for testing.""" """Generate a sample database with realistic financial data for testing."""
# Import here to avoid circular imports # Import here to avoid circular imports
import sys
import subprocess import subprocess
import sys
from pathlib import Path as PathlibPath from pathlib import Path as PathlibPath
# Get the script path # Get the script path

View File

@@ -7,7 +7,7 @@ from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from loguru import logger 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.background.scheduler import scheduler
from leggen.utils.config import config from leggen.utils.config import config
from leggen.utils.paths import path_manager from leggen.utils.paths import path_manager

View File

@@ -1,7 +1,7 @@
import click import click
from leggen.main import cli
from leggen.api_client import LeggenAPIClient from leggen.api_client import LeggenAPIClient
from leggen.main import cli
from leggen.utils.text import datefmt, echo, info, print_table from leggen.utils.text import datefmt, echo, info, print_table

View File

@@ -1,7 +1,7 @@
import click import click
from leggen.main import cli
from leggen.api_client import LeggenAPIClient from leggen.api_client import LeggenAPIClient
from leggen.main import cli
from leggen.utils.text import error, info, success from leggen.utils.text import error, info, success

View File

@@ -1,7 +1,7 @@
import click import click
from leggen.main import cli
from leggen.api_client import LeggenAPIClient from leggen.api_client import LeggenAPIClient
from leggen.main import cli
from leggen.utils.text import datefmt, info, print_table from leggen.utils.text import datefmt, info, print_table

View File

@@ -6,8 +6,8 @@ from pathlib import Path
import click import click
from leggen.utils.config import load_config from leggen.utils.config import load_config
from leggen.utils.text import error
from leggen.utils.paths import path_manager 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")) cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), "commands"))

View File

@@ -1,4 +1,5 @@
from typing import Optional, List from typing import List, Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@@ -61,6 +62,4 @@ class Config(BaseModel):
scheduler: SchedulerConfig = Field(default_factory=SchedulerConfig) scheduler: SchedulerConfig = Field(default_factory=SchedulerConfig)
class Config: class Config:
allow_population_by_field_name = ( validate_by_name = True
True # Allow both 'case_insensitive' and 'case-insensitive'
)

View File

@@ -1,14 +1,14 @@
from datetime import datetime, timedelta
from typing import List, Dict, Any, Optional
import sqlite3
import json import json
import sqlite3
from collections import defaultdict from collections import defaultdict
from datetime import datetime, timedelta
from typing import Any, Dict, List, Optional
from loguru import logger from loguru import logger
from leggen.services.transaction_processor import TransactionProcessor
from leggen.utils.config import config from leggen.utils.config import config
from leggen.utils.paths import path_manager from leggen.utils.paths import path_manager
from leggen.services.transaction_processor import TransactionProcessor
class DatabaseService: class DatabaseService:
@@ -721,8 +721,8 @@ class DatabaseService:
) -> List[Dict[str, Any]]: ) -> List[Dict[str, Any]]:
"""Persist transactions to SQLite""" """Persist transactions to SQLite"""
try: try:
import sqlite3
import json import json
import sqlite3
db_path = path_manager.get_database_path() db_path = path_manager.get_database_path()
conn = sqlite3.connect(str(db_path)) conn = sqlite3.connect(str(db_path))

View File

@@ -1,8 +1,8 @@
import json import json
import httpx
from pathlib import Path from pathlib import Path
from typing import Dict, Any, List from typing import Any, Dict, List
import httpx
from loguru import logger from loguru import logger
from leggen.utils.config import config from leggen.utils.config import config

View File

@@ -1,4 +1,4 @@
from typing import List, Dict, Any from typing import Any, Dict, List
from loguru import logger from loguru import logger
@@ -119,9 +119,10 @@ class NotificationService:
) -> None: ) -> None:
"""Send Discord notifications for transactions""" """Send Discord notifications for transactions"""
try: try:
from leggen.notifications.discord import send_transactions_message
import click import click
from leggen.notifications.discord import send_transactions_message
# Create a mock context with the webhook # Create a mock context with the webhook
ctx = click.Context(click.Command("notifications")) ctx = click.Context(click.Command("notifications"))
ctx.obj = { ctx.obj = {
@@ -148,9 +149,10 @@ class NotificationService:
) -> None: ) -> None:
"""Send Telegram notifications for transactions""" """Send Telegram notifications for transactions"""
try: try:
from leggen.notifications.telegram import send_transaction_message
import click import click
from leggen.notifications.telegram import send_transaction_message
# Create a mock context with the telegram config # Create a mock context with the telegram config
ctx = click.Context(click.Command("notifications")) ctx = click.Context(click.Command("notifications"))
telegram_config = self.notifications_config.get("telegram", {}) telegram_config = self.notifications_config.get("telegram", {})
@@ -175,9 +177,10 @@ class NotificationService:
async def _send_discord_test(self, message: str) -> None: async def _send_discord_test(self, message: str) -> None:
"""Send Discord test notification""" """Send Discord test notification"""
try: try:
from leggen.notifications.discord import send_expire_notification
import click import click
from leggen.notifications.discord import send_expire_notification
# Create a mock context with the webhook # Create a mock context with the webhook
ctx = click.Context(click.Command("test")) ctx = click.Context(click.Command("test"))
ctx.obj = { ctx.obj = {
@@ -206,9 +209,10 @@ class NotificationService:
async def _send_telegram_test(self, message: str) -> None: async def _send_telegram_test(self, message: str) -> None:
"""Send Telegram test notification""" """Send Telegram test notification"""
try: try:
from leggen.notifications.telegram import send_expire_notification
import click import click
from leggen.notifications.telegram import send_expire_notification
# Create a mock context with the telegram config # Create a mock context with the telegram config
ctx = click.Context(click.Command("test")) ctx = click.Context(click.Command("test"))
telegram_config = self.notifications_config.get("telegram", {}) 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: async def _send_discord_expiry(self, notification_data: Dict[str, Any]) -> None:
"""Send Discord expiry notification""" """Send Discord expiry notification"""
try: try:
from leggen.notifications.discord import send_expire_notification
import click import click
from leggen.notifications.discord import send_expire_notification
# Create a mock context with the webhook # Create a mock context with the webhook
ctx = click.Context(click.Command("expiry")) ctx = click.Context(click.Command("expiry"))
ctx.obj = { ctx.obj = {
@@ -262,9 +267,10 @@ class NotificationService:
async def _send_telegram_expiry(self, notification_data: Dict[str, Any]) -> None: async def _send_telegram_expiry(self, notification_data: Dict[str, Any]) -> None:
"""Send Telegram expiry notification""" """Send Telegram expiry notification"""
try: try:
from leggen.notifications.telegram import send_expire_notification
import click import click
from leggen.notifications.telegram import send_expire_notification
# Create a mock context with the telegram config # Create a mock context with the telegram config
ctx = click.Context(click.Command("expiry")) ctx = click.Context(click.Command("expiry"))
telegram_config = self.notifications_config.get("telegram", {}) telegram_config = self.notifications_config.get("telegram", {})

View File

@@ -4,8 +4,8 @@ from typing import List
from loguru import logger from loguru import logger
from leggen.api.models.sync import SyncResult, SyncStatus 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.database_service import DatabaseService
from leggen.services.gocardless_service import GoCardlessService
from leggen.services.notification_service import NotificationService from leggen.services.notification_service import NotificationService

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import List, Dict, Any from typing import Any, Dict, List
class TransactionProcessor: class TransactionProcessor:

View File

@@ -1,17 +1,17 @@
import os import os
import sys import sys
import tomllib import tomllib
import tomli_w
from pathlib import Path from pathlib import Path
from typing import Dict, Any, Optional from typing import Any, Dict, Optional
import click import click
import tomli_w
from loguru import logger from loguru import logger
from pydantic import ValidationError 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.models.config import Config as ConfigModel
from leggen.utils.paths import path_manager
from leggen.utils.text import error
class Config: class Config:

View File

@@ -7,7 +7,7 @@ import sqlite3
import sys import sys
from datetime import datetime, timedelta from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
from typing import List, Dict, Any from typing import Any, Dict, List
import click import click

View File

@@ -1,10 +1,11 @@
"""Pytest configuration and shared fixtures.""" """Pytest configuration and shared fixtures."""
import pytest
import tempfile
import json import json
import tempfile
from pathlib import Path from pathlib import Path
from unittest.mock import patch from unittest.mock import patch
import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from leggen.commands.server import create_app from leggen.commands.server import create_app

View File

@@ -1,8 +1,9 @@
"""Tests for analytics fixes to ensure all transactions are used in statistics.""" """Tests for analytics fixes to ensure all transactions are used in statistics."""
import pytest
from datetime import datetime, timedelta 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 fastapi.testclient import TestClient
from leggen.commands.server import create_app from leggen.commands.server import create_app

View File

@@ -1,8 +1,9 @@
"""Tests for accounts API endpoints.""" """Tests for accounts API endpoints."""
import pytest
from unittest.mock import patch from unittest.mock import patch
import pytest
@pytest.mark.api @pytest.mark.api
class TestAccountsAPI: class TestAccountsAPI:

View File

@@ -1,9 +1,10 @@
"""Tests for banks API endpoints.""" """Tests for banks API endpoints."""
from unittest.mock import patch
import httpx
import pytest import pytest
import respx import respx
import httpx
from unittest.mock import patch
@pytest.mark.api @pytest.mark.api

View File

@@ -1,9 +1,10 @@
"""Tests for CLI API client.""" """Tests for CLI API client."""
from unittest.mock import patch
import pytest import pytest
import requests import requests
import requests_mock import requests_mock
from unittest.mock import patch
from leggen.api_client import LeggenAPIClient from leggen.api_client import LeggenAPIClient

View File

@@ -1,8 +1,9 @@
"""Tests for transactions API endpoints.""" """Tests for transactions API endpoints."""
import pytest
from unittest.mock import patch
from datetime import datetime from datetime import datetime
from unittest.mock import patch
import pytest
@pytest.mark.api @pytest.mark.api

View File

@@ -1,8 +1,9 @@
"""Tests for configuration management.""" """Tests for configuration management."""
import pytest
from unittest.mock import patch from unittest.mock import patch
import pytest
from leggen.utils.config import Config from leggen.utils.config import Config

View File

@@ -1,13 +1,14 @@
"""Integration tests for configurable paths.""" """Integration tests for configurable paths."""
import pytest
import tempfile
import os import os
import tempfile
from pathlib import Path from pathlib import Path
from unittest.mock import patch from unittest.mock import patch
from leggen.utils.paths import path_manager import pytest
from leggen.services.database_service import DatabaseService from leggen.services.database_service import DatabaseService
from leggen.utils.paths import path_manager
@pytest.mark.unit @pytest.mark.unit

View File

@@ -1,8 +1,9 @@
"""Tests for database service.""" """Tests for database service."""
import pytest
from unittest.mock import patch
from datetime import datetime from datetime import datetime
from unittest.mock import patch
import pytest
from leggen.services.database_service import DatabaseService from leggen.services.database_service import DatabaseService

View File

@@ -1,8 +1,9 @@
"""Tests for background scheduler.""" """Tests for background scheduler."""
import pytest
from unittest.mock import patch, AsyncMock, MagicMock
from datetime import datetime from datetime import datetime
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from leggen.background.scheduler import BackgroundScheduler from leggen.background.scheduler import BackgroundScheduler