main
  1[project]
  2dependencies = [
  3  "aioboto3==15.5.0",
  4  "anthropic",
  5  "apscheduler>=3.11,<4",
  6  "beautifulsoup4==4.14.3",
  7  "bilibili-api-python",
  8  "brotli==1.2.0",
  9  "cacheout==0.16.0",
 10  "chardet==7.3.0",
 11  "curl-cffi==0.15.0",
 12  "cutword==0.1.1",
 13  "dashscope==1.25.15",
 14  "feedgen==1.0.0",
 15  "feedparser==6.0.12",
 16  "glom==25.12.0",
 17  "google-genai",
 18  "httpx-aiohttp==0.1.12",
 19  "httpx-curl-cffi==0.1.5",
 20  "httpx[http2,socks]==0.28.1",
 21  "loguru==0.7.3",
 22  "markdown==3.10.2",
 23  "markitdown[docx,pdf,pptx,xls,xlsx]",
 24  "openai",
 25  "pathvalidate==3.3.1",
 26  "pillow-heif==1.3.0",
 27  "pillow==12.2.0",
 28  "puremagic==2.1.1",
 29  "pyarrow==23.0.1",
 30  "pyrotgfork==2.2.21",
 31  "pysocks==1.7.1",
 32  "pytgcrypto==1.2.12",
 33  "python-ffmpeg",
 34  "python-magic==0.4.27",
 35  "pyuegc==16.0.3",
 36  "pyyaml==6.0.3",
 37  "quickchart-io==2.0.0",
 38  "soundfile==0.13.1",
 39  "telegraph==2.2.0",
 40  "uvloop==0.22.1",
 41  "xmltodict==1.0.4",
 42  "youtube-transcript-api",
 43  "yt-dlp[default]",
 44  "zhconv==1.4.3",
 45]
 46name = "bennybot"
 47requires-python = "==3.13.*"
 48version = "0.1.0"
 49
 50[dependency-groups]
 51dev = ["ipdb==0.13.13"]
 52
 53[tool.ruff]
 54cache-dir = "~/.cache/ruff"
 55force-exclude = true
 56indent-width = 4
 57line-length = 200
 58output-format = "grouped"
 59respect-gitignore = true
 60show-fixes = true
 61target-version = "py313"
 62
 63[tool.ruff.format]
 64exclude = ["src/quotly/fonts.py"]
 65indent-style = "space"
 66line-ending = "lf"
 67quote-style = "double"
 68
 69[tool.ruff.lint]
 70exclude = ["src/quotly/fonts.py"]
 71ignore = [
 72  "ANN",
 73  "PTH",
 74  "D417",
 75  "BLE001",
 76  "T20",
 77  "ERA",
 78  "C90",
 79  "D1",
 80  "INP001",
 81  "E203",
 82  "E266",
 83  "E501",
 84  "E731",
 85  "E741",
 86  "N806",
 87  "EXE001",
 88  "PD901",
 89  "PGH003",
 90  "S101",
 91  "S301",
 92  "UP009",
 93  "COM812",
 94  "ISC001",
 95  "PLR2004",
 96  "S311",
 97  "TD",
 98  "FIX002",
 99  "PLC0415",
100  "S608",
101  "ASYNC240",
102]
103select = ["ALL"]
104
105[tool.ruff.lint.pydocstyle]
106convention = "google"
107
108[tool.ruff.lint.pylint]
109max-args = 999
110max-branches = 999
111max-locals = 999
112max-returns = 999
113max-statements = 999
114
115[tool.pyright]
116exclude = ["src/quotly/fonts.py"]
117ignore = ["src/quotly/fonts.py"]
118
119[tool.uv]
120exclude-newer = "5 days" # https://simonwillison.net/2026/Mar/24/package-managers-need-to-cool-down/
121environments = [
122  "sys_platform == 'darwin' and platform_machine == 'arm64'",
123  "sys_platform == 'darwin' and platform_machine == 'x86_64'",
124  "sys_platform == 'linux' and platform_machine == 'x86_64'",
125]
126required-environments = [
127  "sys_platform == 'darwin' and platform_machine == 'arm64'",
128  "sys_platform == 'darwin' and platform_machine == 'x86_64'",
129  "sys_platform == 'linux' and platform_machine == 'x86_64'",
130]
131index-url = "https://pypi.org/simple"
132
133[tool.uv.sources]
134anthropic = { git = "https://github.com/anthropics/anthropic-sdk-python.git" }
135bilibili-api-python = { git = "https://github.com/Nemo2011/bilibili-api.git" }
136google-genai = { git = "https://github.com/googleapis/python-genai.git" }
137python-ffmpeg = { git = "https://github.com/chadawagner/python-ffmpeg.git", branch = "cw/decode-errors" }  # jonghwanhyeon/python-ffmpeg, PR-56
138openai = { git = "https://github.com/openai/openai-python.git" }
139youtube-transcript-api = { git = "https://github.com/jdepoix/youtube-transcript-api.git" }
140yt-dlp = { git = "https://github.com/yt-dlp/yt-dlp.git" }
141markitdown = { git = "https://github.com/benny-dou/markitdown.git", subdirectory = "packages/markitdown" }