Mirror of https://github.com/roostorg/osprey
github.com/roostorg/osprey
1[build-system]
2requires = ["uv_build>=0.8.12,<0.9.0"]
3build-backend = "uv_build"
4
5[dependency-groups]
6common = [
7 "absl-py==2.3.1",
8 "asttokens==3.0.0",
9 "blinker==1.9.0",
10 "bytecode==0.16.2",
11 "cachetools==5.5.2",
12 "certifi==2025.8.3",
13 "charset-normalizer==3.4.2",
14 "click==7.1.2",
15 "datadog==0.51.0",
16 "ddtrace==2.21.11",
17 "decorator==5.2.1",
18 "deepmerge==0.3.0",
19 "dnspython==2.0.0",
20 "ecdsa==0.19.1",
21 "envier==0.5.2",
22 "erlpack",
23 "executing==2.2.0",
24 "faker==4.18.0",
25 "flask==1.1.4",
26 "gevent==24.2.1",
27 "google-api-core==2.19.2",
28 "google-api-python-client==2.105.0",
29 "google-auth==2.40.3",
30 "google-auth-httplib2==0.2.0",
31 "google-cloud-appengine-logging==1.6.2",
32 "google-cloud-audit-log==0.3.2",
33 "google-cloud-bigquery==3.27.0",
34 "google-cloud-bigtable==2.10.0",
35 "google-cloud-core==2.4.3",
36 "google-cloud-kms==3.5.1",
37 "google-cloud-logging==3.4.0",
38 "google-cloud-pubsub==2.15.2",
39 "google-cloud-secret-manager==2.24.0",
40 "google-cloud-storage==2.10.0",
41 "google-crc32c==1.7.1",
42 "google-resumable-media==2.7.2",
43 "googleapis-common-protos==1.70.0",
44 "graphviz==0.20",
45 "greenlet",
46 "grpc-google-iam-v1==0.14.2",
47 "grpcio==1.49.1; platform_machine == 'x86_64'", # Normal dependency for production
48 "grpcio==1.53.*; platform_machine == 'aarch64'", # Only install on ARM64 architecture for local development on MacOS
49 "grpcio-health-checking==1.44.0",
50 "grpcio-reflection==1.44.0",
51 "grpcio-status==1.49.1",
52 "grpcio-tools==1.49.1",
53 "gunicorn",
54 "hash-ring",
55 "httplib2==0.22.0",
56 "humanize==4.12.3",
57 "idna==3.10",
58 "imagehash==4.3.2",
59 "importlib-metadata==8.7.0",
60 "infinity==1.5",
61 "iniconfig==2.1.0",
62 "intervals==0.9.2",
63 "ipdb==0.13.13",
64 "ipython==9.4.0",
65 "ipython-pygments-lexers==1.1.1",
66 "iso8601==2.1.0",
67 "itsdangerous==1.1.0",
68 "jedi==0.19.2",
69 "jinja2==2.11.3",
70 "jslog4kube==1.0.6",
71 "jsonpath-rw",
72 "kafka-python==1.4.7",
73 "linkify-it-py==2.0.3",
74 "markdown-it-py==3.0.0",
75 "markupsafe==2.0.1",
76 "matplotlib-inline==0.1.7",
77 "maxminddb==1.5.4",
78 "mdit-py-plugins==0.4.2",
79 "mdurl==0.1.2",
80 "memray==1.17.2",
81 "minio>=7.2.16",
82 "mmh3==3.0.0",
83 "msgpack==1.0.8",
84 "mypy==1.13.0",
85 "mypy-extensions==1.0.0",
86 "mypy-protobuf==3.6.0",
87 "nostril",
88 "numpy==1.24.4",
89 "opentelemetry-api==1.36.0",
90 "packaging==25.0",
91 "parso==0.8.4",
92 "pdqhash==0.2.5",
93 "pexpect==4.9.0",
94 "phone-iso3166==0.3.8",
95 "pillow==9.5.0",
96 "plac==1.4.5",
97 "platformdirs==4.3.8",
98 "pluggy==1.5.0",
99 "ply==3.11",
100 "prompt-toolkit==3.0.51",
101 "proto-plus==1.26.1",
102 "protobuf==4.25.8",
103 "psycogreen==1.0.2",
104 "psycopg2-binary==2.9.10",
105 "ptyprocess==0.7.0",
106 "pure-eval==0.2.3",
107 "py==1.11.0",
108 "pyasn1==0.6.1",
109 "pyasn1-modules==0.4.2",
110 "pycryptodome==3.21.0",
111 "pydantic==1.10.19",
112 "pydruid==0.6.9",
113 "pygments==2.19.2",
114 "pyparsing==3.2.3",
115 "pytest==8.3.5",
116 "pytest-flask==1.3.0",
117 "pytest-mock==3.14.1",
118 "pytest-order==1.3.0",
119 "python-dateutil==2.8.0",
120 "python-jose==3.5.0",
121 "python-json-logger==0.1.10",
122 "python-levenshtein==0.12.2",
123 "pytz==2022.1",
124 "pywavelets==1.8.0",
125 "pyyaml==6.0.1",
126 "requests==2.32.4",
127 "requests-mock==1.9.3",
128 "result==0.5.0",
129 "retry==0.9.2",
130 "rich==14.1.0",
131 "rsa==4.9.1",
132 "scipy==1.15.3",
133 "sentry-sdk==1.5.12",
134 "setuptools==80.9.0",
135 "simplejson==3.19.3",
136 "six==1.16.0",
137 "sqlalchemy==1.4.31",
138 "sqlalchemy-utils==0.41.1",
139 "sqlalchemy2-stubs==0.0.2a38",
140 "stack-data==0.6.3",
141 "tabulate==0.9.0",
142 "tenacity==8.1.0",
143 "text-unidecode==1.3",
144 "textual==5.2.0",
145 "tink==1.9.0",
146 "tld==0.12.7",
147 "traitlets==5.14.3",
148 "types-cachetools==6.1.0.20250717",
149 "types-click==7.1.8",
150 "types-flask==1.1.6",
151 "types-ipaddress==1.0.8",
152 "types-jinja2==2.11.9",
153 "types-markupsafe==1.1.10",
154 "types-maxminddb==1.5.0",
155 "types-protobuf==4.24.0.1",
156 "types-psycopg2>=2.9.21.20250809",
157 "types-python-dateutil==2.9.0.20250708",
158 "types-pytz==2025.2.0.20250516",
159 "types-pyyaml==6.0.12.20250516",
160 "types-requests==2.27.7",
161 "types-simplejson==3.20.0.20250326",
162 "types-six==1.17.0.20250515",
163 "types-urllib3==1.26.25.14",
164 "types-werkzeug==1.0.9",
165 "typing-extensions==4.6.3",
166 "typing-inspect==0.9.0",
167 "uc-micro-py==1.0.3",
168 "unidecode==1.3.8",
169 "uritemplate==4.2.0",
170 "urllib3==2.5.0",
171 "wcwidth==0.2.13",
172 "werkzeug==1.0.1",
173 "wrapt==1.17.2",
174 "xmltodict==0.14.2",
175 "zipp==3.23.0",
176 "zope-event==5.1.1",
177 "zope-interface==7.2",
178]
179dev = [
180 "mypy>=1.13.0",
181 "pre-commit>=4.3.0",
182 "ruff>=0.12.9",
183 "sqlalchemy[mypy]>=1.4.31",
184 "types-flask-cors>=3.0.10",
185]
186
187
188[tool.uv]
189override-dependencies = ["ddtrace>=2.17.2,<3.0.0"]
190default-groups = ["common", "dev"]
191
192[tool.uv.sources]
193erlpack = { git = "https://github.com/discord/erlpack.git", rev = "b25ebd51ae4c097bd7f756fd4e1c841b61bfe50b" }
194greenlet = { git = "https://github.com/discord/greenlet.git", rev = "a75d78f1547c74a81134644a179467525a255466" }
195gunicorn = { git = "https://github.com/discord/gunicorn.git", rev = "979efdcb918daa536d8923668241c6e6bf1edb58" }
196hash-ring = { url = "https://storage.googleapis.com/discord-devops/hash_ring-src-b4b56bc93053881b68b829ee9d1a4871b4aee592.zip" }
197jsonpath-rw = { url = "https://github.com/kennknowles/python-jsonpath-rw/archive/6f5647bb3ad2395c20f0191fef07a1df51c9fed8.tar.gz" }
198nostril = { url = "https://github.com/casics/nostril/archive/v1.2.0.tar.gz" }
199osprey_rpc = { workspace = true }
200osprey_worker = { workspace = true }
201example_plugins = { workspace = true }
202
203[tool.uv.workspace]
204members = [
205 "osprey_rpc",
206 "osprey_worker",
207 "example_plugins",
208]
209
210
211[tool.ruff]
212target-version = "py311"
213line-length = 120
214fix = true
215force-exclude = true # Needed for pre-commit to work on staged files
216extend-exclude = [
217 # Exclude protobuf generated files
218 "**/*_pb2*.py",
219 "**/*_pb2*.pyi",
220]
221
222[tool.ruff.format]
223quote-style = "single"
224indent-style = "space"
225skip-magic-trailing-comma = false
226line-ending = "auto"
227
228[tool.ruff.lint]
229select = [
230 "E", # pycodestyle errors
231 "F", # pyflakes
232 "I", # isort
233 "B006", # flake8-bugbear, B006 catches mutable defaults
234]
235ignore = [
236 "E501", # Formatter already does a best effort of handling line-length, but some lines just can't be shortened anymore
237]
238
239[tool.ruff.lint.isort]
240known-first-party = ["osprey_worker", "osprey_rpc", "example_plugins"]
241
242[tool.mypy]
243plugins = ["pydantic.mypy", "sqlalchemy.ext.mypy.plugin"]
244python_version = "3.11"
245namespace_packages = true
246explicit_package_bases = true
247disable_error_code = ["annotation-unchecked"]
248
249mypy_path = [
250 "osprey_rpc/src",
251 "osprey_worker/src",
252 "example_plugins/src",
253]
254
255# Strict mode includes the following flags. When these are all True, they can be replaced with strict mode.
256# Mostly disabled to match old config
257warn_unused_configs = true
258disallow_any_generics = true
259disallow_subclassing_any = true
260disallow_untyped_calls = false
261disallow_untyped_defs = false
262disallow_incomplete_defs = false
263check_untyped_defs = false
264disallow_untyped_decorators = false
265warn_redundant_casts = true
266warn_return_any = false
267no_implicit_reexport = false
268strict_equality = false
269
270# Additional checks we want to turn on eventually (disabled for now)
271disallow_any_unimported = false
272disallow_any_expr = false
273disallow_any_decorated = false
274disallow_any_explicit = false
275warn_unreachable = false
276
277exclude = [
278 "^.*/venv/.*$",
279 ".*/setup\\.py$",
280 ".*_pb2\\.py$",
281 ".*_pb2\\.pyi$",
282 ".*_pb2_grpc\\.py$",
283 ".*/tests/.*",
284 ".*/test_.*\\.py$",
285]
286
287# required until pydantic explicitly exports Extra
288[[tool.mypy.overrides]]
289module = "pydantic.main"
290implicit_reexport = true
291
292[[tool.mypy.overrides]]
293module = ["jsonpath_rw", "minio.*"]
294ignore_missing_imports = true
295
296# third party packages we don't care about
297[[tool.mypy.overrides]]
298module = [
299 "stubs.*",
300 "pigeon.*",
301 "google.*",
302 "perf_tools.*",
303 "gevent.*",
304 "grpc.*",
305 "pydruid.*",
306 "phone_iso3166.*",
307 "typing_inspect.*",
308 "tink.*",
309 "sqlalchemy_utils.*",
310 "graphviz.*",
311 "psycogreen.*",
312 "hash_ring.*",
313 "deepmerge.*",
314 "greenlet.*",
315 "Levenshtein.*",
316 "kafka.*",
317 "pythonjsonlogger.*",
318 "msgpack.*",
319 "jose.*",
320]
321ignore_errors = true
322disable_error_code = ["annotation-unchecked", "import-untyped"]
323ignore_missing_imports = true
324# At least for now, ignore tests.
325# TODO: Remove these exclusions once they're fixed
326[[tool.mypy.overrides]]
327module = "osprey.worker.*.tests.*"
328ignore_errors = true
329
330[[tool.mypy.overrides]]
331module = ["osprey.rpc.*"]
332ignore_errors = true