refactor: modernize code quality tooling with Ruff

- Replace black, isort, and flake8 with Ruff (all-in-one linter and formatter)
- Add comprehensive pyproject.toml configuration
- Simplify Makefile code quality targets
- Configure exclusions for venv/.venv in pyproject.toml
- Auto-fix 1,359 linting issues across codebase

Benefits:
- Much faster builds (Ruff is written in Rust)
- Single tool replaces multiple tools
- More comprehensive rule set (UP, B, C4, SIM, PIE, RET, Q)
- All configuration centralized in pyproject.toml
- Better import sorting and formatting consistency

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-28 19:37:38 +01:00
parent 21c13ca39b
commit 238c1ec9b8
169 changed files with 2183 additions and 1784 deletions

View File

@@ -15,7 +15,7 @@ Schemas include:
import re
from datetime import datetime
from typing import Any, Dict, List, Optional
from typing import Any
from pydantic import BaseModel, ConfigDict, Field, field_validator
@@ -36,7 +36,7 @@ class VendorCreate(BaseModel):
name: str = Field(
..., description="Display name of the vendor", min_length=2, max_length=255
)
description: Optional[str] = Field(None, description="Vendor description")
description: str | None = Field(None, description="Vendor description")
# Owner Information (Creates User Account)
owner_email: str = Field(
@@ -45,21 +45,21 @@ class VendorCreate(BaseModel):
)
# Business Contact Information (Vendor Fields)
contact_email: Optional[str] = Field(
contact_email: str | None = Field(
None,
description="Public business contact email (defaults to owner_email if not provided)",
)
contact_phone: Optional[str] = Field(None, description="Contact phone number")
website: Optional[str] = Field(None, description="Website URL")
contact_phone: str | None = Field(None, description="Contact phone number")
website: str | None = Field(None, description="Website URL")
# Business Details
business_address: Optional[str] = Field(None, description="Business address")
tax_number: Optional[str] = Field(None, description="Tax/VAT number")
business_address: str | None = Field(None, description="Business address")
tax_number: str | None = Field(None, description="Tax/VAT number")
# Marketplace URLs (multi-language support)
letzshop_csv_url_fr: Optional[str] = Field(None, description="French CSV URL")
letzshop_csv_url_en: Optional[str] = Field(None, description="English CSV URL")
letzshop_csv_url_de: Optional[str] = Field(None, description="German CSV URL")
letzshop_csv_url_fr: str | None = Field(None, description="French CSV URL")
letzshop_csv_url_en: str | None = Field(None, description="English CSV URL")
letzshop_csv_url_de: str | None = Field(None, description="German CSV URL")
@field_validator("owner_email", "contact_email")
@classmethod
@@ -95,29 +95,29 @@ class VendorUpdate(BaseModel):
"""
# Basic Information
name: Optional[str] = Field(None, min_length=2, max_length=255)
description: Optional[str] = None
subdomain: Optional[str] = Field(None, min_length=2, max_length=100)
name: str | None = Field(None, min_length=2, max_length=255)
description: str | None = None
subdomain: str | None = Field(None, min_length=2, max_length=100)
# Business Contact Information (Vendor Fields)
contact_email: Optional[str] = Field(
contact_email: str | None = Field(
None, description="Public business contact email"
)
contact_phone: Optional[str] = None
website: Optional[str] = None
contact_phone: str | None = None
website: str | None = None
# Business Details
business_address: Optional[str] = None
tax_number: Optional[str] = None
business_address: str | None = None
tax_number: str | None = None
# Marketplace URLs
letzshop_csv_url_fr: Optional[str] = None
letzshop_csv_url_en: Optional[str] = None
letzshop_csv_url_de: Optional[str] = None
letzshop_csv_url_fr: str | None = None
letzshop_csv_url_en: str | None = None
letzshop_csv_url_de: str | None = None
# Status (Admin only)
is_active: Optional[bool] = None
is_verified: Optional[bool] = None
is_active: bool | None = None
is_verified: bool | None = None
@field_validator("subdomain")
@classmethod
@@ -145,22 +145,22 @@ class VendorResponse(BaseModel):
vendor_code: str
subdomain: str
name: str
description: Optional[str]
description: str | None
owner_user_id: int
# Contact Information (Business)
contact_email: Optional[str]
contact_phone: Optional[str]
website: Optional[str]
contact_email: str | None
contact_phone: str | None
website: str | None
# Business Information
business_address: Optional[str]
tax_number: Optional[str]
business_address: str | None
tax_number: str | None
# Marketplace URLs
letzshop_csv_url_fr: Optional[str]
letzshop_csv_url_en: Optional[str]
letzshop_csv_url_de: Optional[str]
letzshop_csv_url_fr: str | None
letzshop_csv_url_en: str | None
letzshop_csv_url_de: str | None
# Status Flags
is_active: bool
@@ -196,13 +196,13 @@ class VendorCreateResponse(VendorDetailResponse):
temporary_password: str = Field(
..., description="Temporary password for owner (SHOWN ONLY ONCE)"
)
login_url: Optional[str] = Field(None, description="URL for vendor owner to login")
login_url: str | None = Field(None, description="URL for vendor owner to login")
class VendorListResponse(BaseModel):
"""Schema for paginated vendor list."""
vendors: List[VendorResponse]
vendors: list[VendorResponse]
total: int
skip: int
limit: int
@@ -237,7 +237,7 @@ class VendorTransferOwnership(BaseModel):
..., description="Must be true to confirm ownership transfer"
)
transfer_reason: Optional[str] = Field(
transfer_reason: str | None = Field(
None,
max_length=500,
description="Reason for ownership transfer (for audit logs)",
@@ -260,12 +260,12 @@ class VendorTransferOwnershipResponse(BaseModel):
vendor_code: str
vendor_name: str
old_owner: Dict[str, Any] = Field(
old_owner: dict[str, Any] = Field(
..., description="Information about the previous owner"
)
new_owner: Dict[str, Any] = Field(
new_owner: dict[str, Any] = Field(
..., description="Information about the new owner"
)
transferred_at: datetime
transfer_reason: Optional[str]
transfer_reason: str | None