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" }