[project]
name = "discord-rss-bot"
version = "1.0.0"
description = "RSS bot for Discord"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "apscheduler",
    "discord-webhook",
    "fastapi",
    "httpx",
    "jinja2",
    "lxml",
    "markdownify",
    "platformdirs",
    "python-dotenv",
    "python-multipart",
    "reader",
    "sentry-sdk[fastapi]",
    "tldextract",
    "uvicorn",
]

[dependency-groups]
dev = ["pytest"]

[tool.poetry]
name = "discord-rss-bot"
version = "1.0.0"
description = "RSS bot for Discord"
authors = ["Joakim Hellsén <tlovinator@gmail.com>"]

[tool.poetry.dependencies]
python = "^3.12"
apscheduler = "*"
discord-webhook = "*"
fastapi = "*"
httpx = "*"
jinja2 = "*"
lxml = "*"
markdownify = "*"
platformdirs = "*"
python-dotenv = "*"
python-multipart = "*"
reader = "*"
sentry-sdk = { version = "*", extras = ["fastapi"] }
uvicorn = "*"

[tool.poetry.group.dev.dependencies]
pytest = "*"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.djlint]
ignore = "D004,D018,J018,T001,J004"
profile = "jinja"
max_line_length = 120
format_attribute_template_tags = true

[tool.ruff]
preview = true
line-length = 120
lint.select = ["ALL"]
lint.pydocstyle.convention = "google"
lint.isort.required-imports = ["from __future__ import annotations"]
lint.pycodestyle.ignore-overlong-task-comments = true

lint.ignore = [
    "ANN201",  # Checks that public functions and methods have return type annotations.
    "ARG001",  # Checks for the presence of unused arguments in function definitions.
    "B008",    # Allow Form() as a default value
    "CPY001",  # Missing copyright notice at top of file
    "D100",    # Checks for undocumented public module definitions.
    "D101",    # Checks for undocumented public class definitions.
    "D102",    # Checks for undocumented public method definitions.
    "D104",    # Missing docstring in public package.
    "D105",    # Missing docstring in magic method.
    "D105",    # pydocstyle - missing docstring in magic method
    "D106",    # Checks for undocumented public class definitions, for nested classes.
    "ERA001",  # Found commented-out code
    "FBT003",  # Checks for boolean positional arguments in function calls.
    "FIX002",  # Line contains TODO
    "G002",    # Allow % in logging
    "PGH003",  # Check for type: ignore annotations that suppress all type warnings, as opposed to targeting specific type warnings.
    "PLR6301", # Checks for the presence of unused self parameter in methods definitions.
    "RUF029",  # Checks for functions declared async that do not await or otherwise use features requiring the function to be declared async.
    "TD003",   # Checks that a TODO comment is associated with a link to a relevant issue or ticket.
    "PLR0913", # Checks for function definitions that include too many arguments.
    "PLR0917", # Checks for function definitions that include too many positional arguments.

    # Conflicting lint rules when using Ruff's formatter
    # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
    "COM812", # Checks for the absence of trailing commas.
    "COM819", # Checks for the presence of prohibited trailing commas.
    "D206",   # Checks for docstrings that are indented with tabs.
    "D300",   # Checks for docstrings that use '''triple single quotes''' instead of """triple double quotes""".
    "E111",   # Checks for indentation with a non-multiple of 4 spaces.
    "E114",   # Checks for indentation of comments with a non-multiple of 4 spaces.
    "E117",   # Checks for over-indented code.
    "ISC001", # Checks for implicitly concatenated strings on a single line.
    "ISC002", # Checks for implicitly concatenated strings that span multiple lines.
    "Q000",   # Checks for inline strings that use single quotes or double quotes, depending on the value of the lint.flake8-quotes.inline-quotes option.
    "Q001",   # Checks for multiline strings that use single quotes or double quotes, depending on the value of the lint.flake8-quotes.multiline-quotes setting.
    "Q002",   # Checks for docstrings that use single quotes or double quotes, depending on the value of the lint.flake8-quotes.docstring-quotes setting.
    "Q003",   # Checks for strings that include escaped quotes, and suggests changing the quote style to avoid the need to escape them.
    "W191",   # Checks for indentation that uses tabs.
]

[tool.ruff.lint.per-file-ignores]
"tests/*" = ["S101", "D103", "PLR2004"]

[tool.ruff.lint.mccabe]
max-complexity = 15 # Don't judge lol

[tool.pytest.ini_options]
python_files = ["test_*.py"]
log_cli = true
log_cli_level = "DEBUG"
log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)"
log_cli_date_format = "%Y-%m-%d %H:%M:%S"
filterwarnings = [
    "ignore::bs4.GuessedAtParserWarning",
    "ignore:functools\\.partial will be a method descriptor in future Python versions; wrap it in staticmethod\\(\\) if you want to preserve the old behavior:FutureWarning",
]