# Ruff configuration for the entire project
# This ensures consistent formatting across all Python code

# Use 120 character line length to prevent splitting Reflex lambdas
line-length = 120

# Target Python 3.11+
target-version = "py311"

# Exclude generated and build directories
extend-exclude = [
    ".venv",
    "venv",
    "__pycache__",
    "*.pyc",
    ".web",
    "node_modules",
    "recipe-executor/recipe_executor",  # Generated code
    "cortex-core/cortex_core",  # Generated code
]

[format]
# Use double quotes for strings
quote-style = "double"

# Use 4 spaces for indentation
indent-style = "space"

# Respect magic trailing commas
skip-magic-trailing-comma = false

# Use Unix line endings
line-ending = "auto"

[lint]
# Enable specific rule sets
select = [
    "E",    # pycodestyle errors
    "W",    # pycodestyle warnings (includes W292 for newline at EOF)
    "F",    # Pyflakes
    "I",    # isort
    "N",    # pep8-naming
    "UP",   # pyupgrade
    "B",    # flake8-bugbear
    "C4",   # flake8-comprehensions
    "DTZ",  # flake8-datetimez
    "T10",  # flake8-debugger
    "RET",  # flake8-return
    "SIM",  # flake8-simplify
    "TID",  # flake8-tidy-imports
]

# Ignore specific rules
ignore = [
    "E501",   # Line too long (handled by formatter)
    "E712",   # Comparison to True/False (needed for SQLAlchemy)
    "B008",   # Do not perform function calls in argument defaults
    "B904",   # Within except clause, use raise from (not always needed)
    "UP007",  # Use X | Y for type unions (keep Optional for clarity)
    "SIM108", # Use ternary operator (sometimes if/else is clearer)
    "DTZ005", # datetime.now() without tz (okay for timestamps)
    "N999",   # Invalid module name (web-bff is valid)
    "TID252", # Relative imports from parent (used in package structure)
    "RET504", # Unnecessary assignment before return (sometimes clearer)
]

# Allow unused variables when prefixed with underscore
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

[lint.per-file-ignores]
# Ignore import violations in __init__ files
"__init__.py" = ["E402", "F401", "F403"]

# Ignore missing docstrings in tests
"test_*.py" = ["D100", "D101", "D102", "D103", "D104"]
"tests/*" = ["D100", "D101", "D102", "D103", "D104"]

# Allow dynamic imports in recipe files
"recipes/*" = ["F401", "F403"]

[lint.isort]
# Combine as imports
combine-as-imports = true

# Force single line imports
force-single-line = true

# Order imports by type
section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"]

[lint.pydocstyle]
# Use Google docstring convention
convention = "google"