[project]
name = ""
version = "0.0.1"
requires-python = ">=3.10,<3.12"
dependencies = [
    "aiohttp==3.8.3",
    "aiosignal==1.2.0",
    "anyio==3.6.1",
    "astroid==3.1.0",
    "async-timeout==4.0.2",
    "asyncio-dgram==2.1.2",
    "attrs==21.2.0",
    "beautifulsoup4==4.10.0",
    "brotli==1.0.9",
    "bs4==0.0.1",
    "cachetools==5.0.0",
    "certifi==2024.2.2",
    "chardet==4.0.0",
    "cleverwrap==0.3.0.2",
    "click==8.2.1",
    "colorama==0.4.6",
    "colorful==0.5.4",
    "curl-cffi>=0.11.4",
    "decorator==5.1.1",
    "dict-cc-py==3.1.0",
    "dnspython==2.4.2",
    "duckduckpy==0.2",
    "ety==1.4.0",
    "fake-useragent==0.1.11",
    "fastapi",
    "feedparser==6.0.8",
    "forecastiopy==0.22",
    "frozenlist==1.3.1",
    "fuzzywuzzy==0.18.0",
    "gazpacho==1.1.0",
    "geoip2==5.1.0",
    "google-play-scraper==1.2.2",
    "google-transliteration-api==1.0.3",
    "googlemaps==4.10.0",
    "greenlet==3.0.3",
    "h11>=0.16",
    "httpcore>=1.0.0",
    "httpx==0.28.1",
    "humanfriendly==10.0",
    "idna==2.10",
    "imgurpython==1.1.7",
    "isodate==0.6.1",
    "openrouter>=0.0.19",
    "pydantic>=2.11.2",
    "isort==5.8.0",
    "jinja2>=3.1.6",
    "joblib==1.0.1",
    "lazy-object-proxy>=1.9.0",
    "lightstreamer-client-lib>=2.0.0",
    "lxml==4.9.1",
    "markitdown>=0.1.2",
    "mccabe==0.6.1",
    "mcstatus==12.0.1",
    "microdata==0.8.0",
    "multidict==5.2.0",
    "mutagen==1.45.1",
    "mwparserfromhell==0.6.4",
    "natsort==8.1.0",
    "nbformat==5.10.4",
    "newsapi-python==0.2.6",
    "nltk==3.6.6",
    "numpy==2.2.6",
    "oauthlib==3.1.0",
    "opencv-python==4.6.0.66",
    "orjson==3.10.3",
    "pillow==9.2.0",
    "objgraph==3.6.1",
    "psutil==5.8.0",
    "pympler==1.0.1",
    "py-irclib==0.3.0",
    "py-open-weather==0.1.3",
    "pycryptodomex==3.15.0",
    "pydub==0.25.1",
    "pyenchant==3.2.2",
    "pygithub==2.4.0",
    "pymediawiki==0.7.1",
    "pyocr==0.8.3",
    "pyowm==3.3.0",
    "pypdf==4.3.1",
    "pyproj==3.7.0",
    "pysocks==1.7.1",
    "python-levenshtein==0.12.2",
    "python-magic==0.4.27",
    "python-youtube==0.9.5",
    "pytz==2024.1",
    "pywikibot==10.0.0",
    "timezonefinder>=8.0.0",
    "regex==2022.3.2",
    "requests==2.32.2",
    "requests-oauthlib==1.3.0",
    "revchatgpt==6.8.6",
    "rfc3986==1.5.0",
    "sgmllib3k==1.0.0",
    "six>=1.16.0",
    "sniffio==1.2.0",
    "soupsieve==2.2.1",
    "sqlalchemy==1.4.27",
    "streetview==0.0.11",
    "thefuzz==0.19.0",
    "toml==0.10.2",
    "tqdm==4.60.0",
    "treelib==1.6.1",
    "tweepy==3.10.0",
    "unidecode==1.3.4",
    "uvicorn",
    "uwuipy==0.1.5",
    "validators==0.19.0",
    "venusian==3.0.0",
    "watchdog==2.1.6",
    "asyncwhois>=1.1.9",
    "wrapt>=1.16.0",
    "yarl>=1.8.1",
    "youtube-search==2.1.0",
    "youtube-transcript-api>=1.1.0",
    "openai-agents==0.0.6",
    "litellm>=1.41.1",
    "griffe>=1.5.6,<1.6",
]

[tool.isort]
line_length = 80
multi_line_output = 3
include_trailing_comma = true
use_parentheses = true
known_first_party = ["cloudbot", "plugins", "tests"]
float_to_top = true

[dependency-groups]
dev = [
    "freezegun==1.4.0",
    "mypy==1.9.0",
    "pre-commit==3.3.3",
    "pylint==3.1.0",
    "pytest==8.1.1",
    "pytest-asyncio==0.20.3",
    "pytest-cov==4.1.0",
    "pytest-random-order==1.1.1",
    "pytest-pythonhashseed==1.0.1",
    "responses==0.25.0",
    "typing-extensions>=4.12.2",
    "types-requests~=2.32.4.20250611",
    "types-pytz>=2024.1",
    "types-cachetools>=7.0.0",
]

[tool.black]
line-length = 80
target-version = ['py310']
include = '\.pyi?$'
exclude = '''
(
  /(
      \.eggs         # exclude a few common directories in the
    | \.git          # root of the project
    | \.hg
    | \.mypy_cache
    | \.tox
    | \.venv
    | _build
    | buck-out
    | build
    | dist
    | venv
  )/
)
'''

[tool.uv]
package = false

[tool.pylint.main]
py-version = "3.10"
extension-pkg-allow-list=["lxml"]
max-module-lines = 2000
ignored-modules = [
  "agents",
  "agents.exceptions",
  "agents.models.openai_chatcompletions",
  "agents.models.openai_provider",
  "agents.run",
  "asyncwhois",
  "chatbot",
  "cleverwrap",
  "curl_cffi",
  "dictcc",
  "enchant",
  "enchant.checker",
  "enchant.tokenize",
  "ety",
  "feedparser",
  "freezegun",
  "fuzzywuzzy",
  "gazpacho",
  "github",
  "google.transliteration",
  "google.transliteration.numerals",
  "google_play_scraper",
  "googlemaps",
  "googlemaps.exceptions",
  "humanfriendly",
  "imgurpython",
  "irclib.parser",
  "irclib.util.compare",
  "isodate",
  "lightstreamer.client",
  "magic",
  "markitdown",
  "mcstatus",
  "mcstatus.status_response",
  "mediawiki",
  "microdata",
  "mwparserfromhell",
  "natsort",
  "newsapi",
  "nltk",
  "openai",
  "openrouter",
  "openrouter.components.model",
  "openrouter.errors",
  "pyocr.builders",
  "pyproj",
  "pypdf",
  "pywikibot",
  "pywikibot.exceptions",
  "pyyoutube",
  "responses",
  "responses.matchers",
  "streetview",
  "timezonefinder",
  "unidecode",
  "uwuipy",
  "validators",
  "watchdog.events",
  "watchdog.observers",
  "youtube_search",
  "youtube_transcript_api",
]

[tool.pylint.messages_control]
disable = [
  "raw-checker-failed",
  "no-else-return",
  "nested-min-max",
  "bad-mcs-classmethod-argument",
  "bad-inline-option",
  "locally-disabled",
  "file-ignored",
  "suppressed-message",
  "useless-suppression",
  "deprecated-pragma",
  "use-symbolic-message-instead",
  "invalid-name",
  "duplicate-string-formatting-argument",
  "missing-module-docstring",
  "missing-class-docstring",
  "missing-function-docstring",
  "consider-using-f-string",
  "consider-using-dict-items",
  "consider-using-with",
  "consider-using-min-builtin",
  "arguments-renamed",
  "use-maxsplit-arg",
  "consider-iterating-dictionary",
  "redefined-outer-name",
  "unused-argument",
  "broad-except",
  "ungrouped-imports",
  "wrong-import-position",
  "arguments-differ",
  "too-many-arguments",
  "too-many-locals",
  "too-many-statements",
  "too-many-branches",
  "protected-access",
  "duplicate-code",
  "no-else-raise",
  "arguments-out-of-order",
  "redefined-builtin",
  "no-else-continue",
  "unnecessary-comprehension",
  "no-value-for-parameter",
  "too-few-public-methods",
  "fixme",
  "too-many-public-methods",
  "missing-timeout",
  "not-callable",
  "unnecessary-lambda-assignment",
  "abstract-method",
  "abstract-class-instantiated",
  "consider-using-generator",
  "too-many-return-statements",
  "line-too-long",
  "too-many-instance-attributes",
  "broad-exception-raised",
  "use-implicit-booleaness-not-comparison",
  # cloudbot/agent/subagent.py imports plugins.agent for _make_run_config, so
  # cloudbot.agent <-> plugins.agent is cyclic by design and broken at runtime by
  # deferred imports. pylint counts deferred imports too, and reports this at an
  # arbitrary module, so it cannot be suppressed locally.
  "cyclic-import",
]

enable = ["c-extension-no-member"]

[tool.pylint.typecheck]
generated-members = "(requests\\.)?codes\\.[a-zA-Z0-9_]+"

[tool.mypy]
namespace_packages = true
python_version = "3.10"
warn_unused_configs = true
strict = false
strict_optional = false
ignore_missing_imports = true
check_untyped_defs = true
show_error_codes = true
warn_unused_ignores = true
warn_redundant_casts = true

[[tool.mypy.overrides]]
module = 'cloudbot.*'
check_untyped_defs = true
warn_return_any = true
