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