Sync: input validation, rate limits, NaN handling, compressed output
Browse files- convgru_ensemble/serve.py +12 -7
- tests/test_serve.py +1 -1
- uv.lock +126 -9
convgru_ensemble/serve.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
| 2 |
|
| 3 |
import io
|
| 4 |
import os
|
|
|
|
| 5 |
import time
|
| 6 |
from contextlib import asynccontextmanager
|
| 7 |
|
|
@@ -149,13 +150,14 @@ async def predict(
|
|
| 149 |
)
|
| 150 |
|
| 151 |
data = da.values
|
| 152 |
-
if
|
| 153 |
raise HTTPException(
|
| 154 |
status_code=422,
|
| 155 |
-
detail="Input data contains
|
| 156 |
)
|
| 157 |
|
| 158 |
-
|
|
|
|
| 159 |
|
| 160 |
# Run inference
|
| 161 |
preds = _model.predict(past, forecast_steps=forecast_steps, ensemble_size=ensemble_size)
|
|
@@ -182,12 +184,15 @@ async def predict(
|
|
| 182 |
encoding = {
|
| 183 |
"precipitation_forecast": {"zlib": True, "complevel": 4},
|
| 184 |
}
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
|
|
|
|
|
|
|
|
|
| 188 |
|
| 189 |
return Response(
|
| 190 |
-
content=
|
| 191 |
media_type="application/x-netcdf",
|
| 192 |
headers={
|
| 193 |
"Content-Disposition": "attachment; filename=predictions.nc",
|
|
|
|
| 2 |
|
| 3 |
import io
|
| 4 |
import os
|
| 5 |
+
import tempfile
|
| 6 |
import time
|
| 7 |
from contextlib import asynccontextmanager
|
| 8 |
|
|
|
|
| 150 |
)
|
| 151 |
|
| 152 |
data = da.values
|
| 153 |
+
if np.isinf(data).any():
|
| 154 |
raise HTTPException(
|
| 155 |
status_code=422,
|
| 156 |
+
detail="Input data contains Inf values.",
|
| 157 |
)
|
| 158 |
|
| 159 |
+
# Replace NaN with 0 (no rain) — common for masked radar pixels
|
| 160 |
+
past = np.nan_to_num(data, nan=0.0).astype(np.float32)
|
| 161 |
|
| 162 |
# Run inference
|
| 163 |
preds = _model.predict(past, forecast_steps=forecast_steps, ensemble_size=ensemble_size)
|
|
|
|
| 184 |
encoding = {
|
| 185 |
"precipitation_forecast": {"zlib": True, "complevel": 4},
|
| 186 |
}
|
| 187 |
+
with tempfile.NamedTemporaryFile(suffix=".nc", delete=False) as tmp_out:
|
| 188 |
+
tmp_out_path = tmp_out.name
|
| 189 |
+
ds_out.to_netcdf(tmp_out_path, engine="netcdf4", encoding=encoding)
|
| 190 |
+
with open(tmp_out_path, "rb") as fh:
|
| 191 |
+
out_bytes = fh.read()
|
| 192 |
+
os.unlink(tmp_out_path)
|
| 193 |
|
| 194 |
return Response(
|
| 195 |
+
content=out_bytes,
|
| 196 |
media_type="application/x-netcdf",
|
| 197 |
headers={
|
| 198 |
"Content-Disposition": "attachment; filename=predictions.nc",
|
tests/test_serve.py
CHANGED
|
@@ -54,7 +54,7 @@ def test_predict_returns_netcdf(client):
|
|
| 54 |
# Create a small NetCDF file in memory
|
| 55 |
ds = xr.Dataset({"RR": xr.DataArray(np.zeros((4, 8, 8), dtype=np.float32), dims=["time", "y", "x"])})
|
| 56 |
buf = io.BytesIO()
|
| 57 |
-
ds.to_netcdf(buf)
|
| 58 |
buf.seek(0)
|
| 59 |
|
| 60 |
resp = client.post(
|
|
|
|
| 54 |
# Create a small NetCDF file in memory
|
| 55 |
ds = xr.Dataset({"RR": xr.DataArray(np.zeros((4, 8, 8), dtype=np.float32), dims=["time", "y", "x"])})
|
| 56 |
buf = io.BytesIO()
|
| 57 |
+
ds.to_netcdf(buf, engine="scipy")
|
| 58 |
buf.seek(0)
|
| 59 |
|
| 60 |
resp = client.post(
|
uv.lock
CHANGED
|
@@ -2,8 +2,10 @@ version = 1
|
|
| 2 |
revision = 1
|
| 3 |
requires-python = ">=3.13"
|
| 4 |
resolution-markers = [
|
| 5 |
-
"python_full_version >= '3.14'",
|
| 6 |
-
"python_full_version
|
|
|
|
|
|
|
| 7 |
]
|
| 8 |
|
| 9 |
[[package]]
|
|
@@ -328,6 +330,37 @@ wheels = [
|
|
| 328 |
{ url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445 },
|
| 329 |
]
|
| 330 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 331 |
[[package]]
|
| 332 |
name = "charset-normalizer"
|
| 333 |
version = "3.4.4"
|
|
@@ -464,13 +497,17 @@ dependencies = [
|
|
| 464 |
{ name = "etils" },
|
| 465 |
{ name = "fiddle" },
|
| 466 |
{ name = "fire" },
|
|
|
|
|
|
|
| 467 |
{ name = "huggingface-hub" },
|
| 468 |
{ name = "importlib-resources" },
|
| 469 |
{ name = "jupyterlab" },
|
| 470 |
{ name = "matplotlib" },
|
|
|
|
| 471 |
{ name = "numpy" },
|
| 472 |
{ name = "pandas" },
|
| 473 |
{ name = "pysteps" },
|
|
|
|
| 474 |
{ name = "pytorch-lightning" },
|
| 475 |
{ name = "pyyaml" },
|
| 476 |
{ name = "tensorboard" },
|
|
@@ -503,13 +540,17 @@ requires-dist = [
|
|
| 503 |
{ name = "fastapi", marker = "extra == 'serve'", specifier = ">=0.115.0" },
|
| 504 |
{ name = "fiddle", specifier = ">=0.3.0" },
|
| 505 |
{ name = "fire", specifier = ">=0.7.1" },
|
|
|
|
|
|
|
| 506 |
{ name = "huggingface-hub", specifier = ">=0.27.0" },
|
| 507 |
{ name = "importlib-resources", specifier = ">=6.5.2" },
|
| 508 |
{ name = "jupyterlab", specifier = ">=4.5.5" },
|
| 509 |
{ name = "matplotlib", specifier = ">=3.10.8" },
|
|
|
|
| 510 |
{ name = "numpy", specifier = ">=2.3.5" },
|
| 511 |
{ name = "pandas", specifier = ">=2.3.3" },
|
| 512 |
{ name = "pysteps", specifier = ">=1.19.0" },
|
|
|
|
| 513 |
{ name = "python-multipart", marker = "extra == 'serve'", specifier = ">=0.0.18" },
|
| 514 |
{ name = "pytorch-lightning", specifier = ">=2.6.0" },
|
| 515 |
{ name = "pyyaml", specifier = ">=6.0.3" },
|
|
@@ -879,6 +920,46 @@ wheels = [
|
|
| 879 |
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 },
|
| 880 |
]
|
| 881 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 882 |
[[package]]
|
| 883 |
name = "hf-xet"
|
| 884 |
version = "1.3.1"
|
|
@@ -1735,6 +1816,33 @@ wheels = [
|
|
| 1735 |
{ url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 },
|
| 1736 |
]
|
| 1737 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1738 |
[[package]]
|
| 1739 |
name = "networkx"
|
| 1740 |
version = "3.6.1"
|
|
@@ -1874,7 +1982,7 @@ name = "nvidia-cudnn-cu12"
|
|
| 1874 |
version = "9.10.2.21"
|
| 1875 |
source = { registry = "https://pypi.org/simple" }
|
| 1876 |
dependencies = [
|
| 1877 |
-
{ name = "nvidia-cublas-cu12" },
|
| 1878 |
]
|
| 1879 |
wheels = [
|
| 1880 |
{ url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467 },
|
|
@@ -1885,7 +1993,7 @@ name = "nvidia-cufft-cu12"
|
|
| 1885 |
version = "11.3.3.83"
|
| 1886 |
source = { registry = "https://pypi.org/simple" }
|
| 1887 |
dependencies = [
|
| 1888 |
-
{ name = "nvidia-nvjitlink-cu12" },
|
| 1889 |
]
|
| 1890 |
wheels = [
|
| 1891 |
{ url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695 },
|
|
@@ -1912,9 +2020,9 @@ name = "nvidia-cusolver-cu12"
|
|
| 1912 |
version = "11.7.3.90"
|
| 1913 |
source = { registry = "https://pypi.org/simple" }
|
| 1914 |
dependencies = [
|
| 1915 |
-
{ name = "nvidia-cublas-cu12" },
|
| 1916 |
-
{ name = "nvidia-cusparse-cu12" },
|
| 1917 |
-
{ name = "nvidia-nvjitlink-cu12" },
|
| 1918 |
]
|
| 1919 |
wheels = [
|
| 1920 |
{ url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905 },
|
|
@@ -1925,7 +2033,7 @@ name = "nvidia-cusparse-cu12"
|
|
| 1925 |
version = "12.5.8.93"
|
| 1926 |
source = { registry = "https://pypi.org/simple" }
|
| 1927 |
dependencies = [
|
| 1928 |
-
{ name = "nvidia-nvjitlink-cu12" },
|
| 1929 |
]
|
| 1930 |
wheels = [
|
| 1931 |
{ url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466 },
|
|
@@ -2043,7 +2151,7 @@ name = "pexpect"
|
|
| 2043 |
version = "4.9.0"
|
| 2044 |
source = { registry = "https://pypi.org/simple" }
|
| 2045 |
dependencies = [
|
| 2046 |
-
{ name = "ptyprocess" },
|
| 2047 |
]
|
| 2048 |
sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
|
| 2049 |
wheels = [
|
|
@@ -2438,6 +2546,15 @@ wheels = [
|
|
| 2438 |
{ url = "https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2", size = 15548 },
|
| 2439 |
]
|
| 2440 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2441 |
[[package]]
|
| 2442 |
name = "python-multipart"
|
| 2443 |
version = "0.0.22"
|
|
|
|
| 2 |
revision = 1
|
| 3 |
requires-python = ">=3.13"
|
| 4 |
resolution-markers = [
|
| 5 |
+
"python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'",
|
| 6 |
+
"(python_full_version >= '3.14' and platform_machine != 'ARM64') or (python_full_version >= '3.14' and sys_platform != 'win32')",
|
| 7 |
+
"python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'",
|
| 8 |
+
"(python_full_version < '3.14' and platform_machine != 'ARM64') or (python_full_version < '3.14' and sys_platform != 'win32')",
|
| 9 |
]
|
| 10 |
|
| 11 |
[[package]]
|
|
|
|
| 330 |
{ url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445 },
|
| 331 |
]
|
| 332 |
|
| 333 |
+
[[package]]
|
| 334 |
+
name = "cftime"
|
| 335 |
+
version = "1.6.5"
|
| 336 |
+
source = { registry = "https://pypi.org/simple" }
|
| 337 |
+
dependencies = [
|
| 338 |
+
{ name = "numpy" },
|
| 339 |
+
]
|
| 340 |
+
sdist = { url = "https://files.pythonhosted.org/packages/65/dc/470ffebac2eb8c54151eb893055024fe81b1606e7c6ff8449a588e9cd17f/cftime-1.6.5.tar.gz", hash = "sha256:8225fed6b9b43fb87683ebab52130450fc1730011150d3092096a90e54d1e81e", size = 326605 }
|
| 341 |
+
wheels = [
|
| 342 |
+
{ url = "https://files.pythonhosted.org/packages/2e/60/74ea344b3b003fada346ed98a6899085d6fd4c777df608992d90c458fda6/cftime-1.6.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4aba66fd6497711a47c656f3a732c2d1755ad15f80e323c44a8716ebde39ddd5", size = 502453 },
|
| 343 |
+
{ url = "https://files.pythonhosted.org/packages/1e/14/adb293ac6127079b49ff11c05cf3d5ce5c1f17d097f326dc02d74ddfcb6e/cftime-1.6.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89e7cba699242366e67d6fb5aee579440e791063f92a93853610c91647167c0d", size = 484541 },
|
| 344 |
+
{ url = "https://files.pythonhosted.org/packages/4f/74/bb8a4566af8d0ef3f045d56c462a9115da4f04b07c7fbbf2b4875223eebd/cftime-1.6.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2f1eb43d7a7b919ec99aee709fb62ef87ef1cf0679829ef93d37cc1c725781e9", size = 1591014 },
|
| 345 |
+
{ url = "https://files.pythonhosted.org/packages/ba/08/52f06ff2f04d376f9cd2c211aefcf2b37f1978e43289341f362fc99f6a0e/cftime-1.6.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e02a1d80ffc33fe469c7db68aa24c4a87f01da0c0c621373e5edadc92964900b", size = 1633625 },
|
| 346 |
+
{ url = "https://files.pythonhosted.org/packages/cf/33/03e0b23d58ea8fab94ecb4f7c5b721e844a0800c13694876149d98830a73/cftime-1.6.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18ab754805233cdd889614b2b3b86a642f6d51a57a1ec327c48053f3414f87d8", size = 1684269 },
|
| 347 |
+
{ url = "https://files.pythonhosted.org/packages/a4/60/a0cfba63847b43599ef1cdbbf682e61894994c22b9a79fd9e1e8c7e9de41/cftime-1.6.5-cp313-cp313-win_amd64.whl", hash = "sha256:6c27add8f907f4a4cd400e89438f2ea33e2eb5072541a157a4d013b7dbe93f9c", size = 465364 },
|
| 348 |
+
{ url = "https://files.pythonhosted.org/packages/3d/e8/ec32f2aef22c15604e6fda39ff8d581a00b5469349f8fba61640d5358d2c/cftime-1.6.5-cp313-cp313-win_arm64.whl", hash = "sha256:31d1ff8f6bbd4ca209099d24459ec16dea4fb4c9ab740fbb66dd057ccbd9b1b9", size = 450468 },
|
| 349 |
+
{ url = "https://files.pythonhosted.org/packages/ea/6c/a9618f589688358e279720f5c0fe67ef0077fba07334ce26895403ebc260/cftime-1.6.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c69ce3bdae6a322cbb44e9ebc20770d47748002fb9d68846a1e934f1bd5daf0b", size = 502725 },
|
| 350 |
+
{ url = "https://files.pythonhosted.org/packages/d8/e3/da3c36398bfb730b96248d006cabaceed87e401ff56edafb2a978293e228/cftime-1.6.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e62e9f2943e014c5ef583245bf2e878398af131c97e64f8cd47c1d7baef5c4e2", size = 485445 },
|
| 351 |
+
{ url = "https://files.pythonhosted.org/packages/32/93/b05939e5abd14bd1ab69538bbe374b4ee2a15467b189ff895e9a8cdaddf6/cftime-1.6.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7da5fdaa4360d8cb89b71b8ded9314f2246aa34581e8105c94ad58d6102d9e4f", size = 1584434 },
|
| 352 |
+
{ url = "https://files.pythonhosted.org/packages/7f/89/648397f9936e0b330999c4e776ebf296ec3c6a65f9901687dbca4ab820da/cftime-1.6.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bff865b4ea4304f2744a1ad2b8149b8328b321dd7a2b9746ef926d229bd7cd49", size = 1609812 },
|
| 353 |
+
{ url = "https://files.pythonhosted.org/packages/e7/0f/901b4835aa67ad3e915605d4e01d0af80a44b114eefab74ae33de6d36933/cftime-1.6.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e552c5d1c8a58f25af7521e49237db7ca52ed2953e974fe9f7c4491e95fdd36c", size = 1669768 },
|
| 354 |
+
{ url = "https://files.pythonhosted.org/packages/22/d5/e605e4b28363e7a9ae98ed12cabbda5b155b6009270e6a231d8f10182a17/cftime-1.6.5-cp314-cp314-win_amd64.whl", hash = "sha256:e645b095dc50a38ac454b7e7f0742f639e7d7f6b108ad329358544a6ff8c9ba2", size = 463818 },
|
| 355 |
+
{ url = "https://files.pythonhosted.org/packages/3d/89/a8f85ae697ff10206ec401c2621f5ca9f327554f586d62f244739ceeb347/cftime-1.6.5-cp314-cp314-win_arm64.whl", hash = "sha256:b9044d7ac82d3d8af189df1032fdc871bbd3f3dd41a6ec79edceb5029b71e6e0", size = 459862 },
|
| 356 |
+
{ url = "https://files.pythonhosted.org/packages/ab/05/7410e12fd03a0c52717e74e6a1b49958810807dda212e23b65d43ea99676/cftime-1.6.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9ef56460cb0576e1a9161e1428c9e1a633f809a23fa9d598f313748c1ae5064e", size = 533781 },
|
| 357 |
+
{ url = "https://files.pythonhosted.org/packages/44/ba/10e3546426d3ed9f9cc82e4a99836bb6fac1642c7830f7bdd0ac1c3f0805/cftime-1.6.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4f4873d38b10032f9f3111c547a1d485519ae64eee6a7a2d091f1f8b08e1ba50", size = 515218 },
|
| 358 |
+
{ url = "https://files.pythonhosted.org/packages/bd/68/efa11eae867749e921bfec6a865afdba8166e96188112dde70bb8bb49254/cftime-1.6.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ccce0f4c9d3f38dd948a117e578b50d0e0db11e2ca9435fb358fd524813e4b61", size = 1579932 },
|
| 359 |
+
{ url = "https://files.pythonhosted.org/packages/9d/6c/0971e602c1390a423e6621dfbad9f1d375186bdaf9c9c7f75e06f1fbf355/cftime-1.6.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19cbfc5152fb0b34ce03acf9668229af388d7baa63a78f936239cb011ccbe6b1", size = 1555894 },
|
| 360 |
+
{ url = "https://files.pythonhosted.org/packages/ad/fc/8475a15b7c3209a4a68b563dfc5e01ce74f2d8b9822372c3d30c68ab7f39/cftime-1.6.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4470cd5ef3c2514566f53efbcbb64dd924fa0584637d90285b2f983bd4ee7d97", size = 513027 },
|
| 361 |
+
{ url = "https://files.pythonhosted.org/packages/f7/80/4ecbda8318fbf40ad4e005a4a93aebba69e81382e5b4c6086251cd5d0ee8/cftime-1.6.5-cp314-cp314t-win_arm64.whl", hash = "sha256:034c15a67144a0a5590ef150c99f844897618b148b87131ed34fda7072614662", size = 469065 },
|
| 362 |
+
]
|
| 363 |
+
|
| 364 |
[[package]]
|
| 365 |
name = "charset-normalizer"
|
| 366 |
version = "3.4.4"
|
|
|
|
| 497 |
{ name = "etils" },
|
| 498 |
{ name = "fiddle" },
|
| 499 |
{ name = "fire" },
|
| 500 |
+
{ name = "h5netcdf" },
|
| 501 |
+
{ name = "h5py" },
|
| 502 |
{ name = "huggingface-hub" },
|
| 503 |
{ name = "importlib-resources" },
|
| 504 |
{ name = "jupyterlab" },
|
| 505 |
{ name = "matplotlib" },
|
| 506 |
+
{ name = "netcdf4" },
|
| 507 |
{ name = "numpy" },
|
| 508 |
{ name = "pandas" },
|
| 509 |
{ name = "pysteps" },
|
| 510 |
+
{ name = "python-magic" },
|
| 511 |
{ name = "pytorch-lightning" },
|
| 512 |
{ name = "pyyaml" },
|
| 513 |
{ name = "tensorboard" },
|
|
|
|
| 540 |
{ name = "fastapi", marker = "extra == 'serve'", specifier = ">=0.115.0" },
|
| 541 |
{ name = "fiddle", specifier = ">=0.3.0" },
|
| 542 |
{ name = "fire", specifier = ">=0.7.1" },
|
| 543 |
+
{ name = "h5netcdf", specifier = ">=1.8.1" },
|
| 544 |
+
{ name = "h5py", specifier = ">=3.15.1" },
|
| 545 |
{ name = "huggingface-hub", specifier = ">=0.27.0" },
|
| 546 |
{ name = "importlib-resources", specifier = ">=6.5.2" },
|
| 547 |
{ name = "jupyterlab", specifier = ">=4.5.5" },
|
| 548 |
{ name = "matplotlib", specifier = ">=3.10.8" },
|
| 549 |
+
{ name = "netcdf4", specifier = ">=1.7.0" },
|
| 550 |
{ name = "numpy", specifier = ">=2.3.5" },
|
| 551 |
{ name = "pandas", specifier = ">=2.3.3" },
|
| 552 |
{ name = "pysteps", specifier = ">=1.19.0" },
|
| 553 |
+
{ name = "python-magic", specifier = ">=0.4.27" },
|
| 554 |
{ name = "python-multipart", marker = "extra == 'serve'", specifier = ">=0.0.18" },
|
| 555 |
{ name = "pytorch-lightning", specifier = ">=2.6.0" },
|
| 556 |
{ name = "pyyaml", specifier = ">=6.0.3" },
|
|
|
|
| 920 |
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 },
|
| 921 |
]
|
| 922 |
|
| 923 |
+
[[package]]
|
| 924 |
+
name = "h5netcdf"
|
| 925 |
+
version = "1.8.1"
|
| 926 |
+
source = { registry = "https://pypi.org/simple" }
|
| 927 |
+
dependencies = [
|
| 928 |
+
{ name = "numpy" },
|
| 929 |
+
{ name = "packaging" },
|
| 930 |
+
]
|
| 931 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ef/03/92d6cc02c0055158167255980461155d6e17f1c4143c03f8bcc18d3e3f3a/h5netcdf-1.8.1.tar.gz", hash = "sha256:9b396a4cc346050fc1a4df8523bc1853681ec3544e0449027ae397cb953c7a16", size = 78679 }
|
| 932 |
+
wheels = [
|
| 933 |
+
{ url = "https://files.pythonhosted.org/packages/b1/8b/88f16936a8e8070a83d36239555227ecd91728f9ef222c5382cda07e0fd6/h5netcdf-1.8.1-py3-none-any.whl", hash = "sha256:a76ed7cfc9b8a8908ea7057c4e57e27307acff1049b7f5ed52db6c2247636879", size = 62915 },
|
| 934 |
+
]
|
| 935 |
+
|
| 936 |
+
[[package]]
|
| 937 |
+
name = "h5py"
|
| 938 |
+
version = "3.15.1"
|
| 939 |
+
source = { registry = "https://pypi.org/simple" }
|
| 940 |
+
dependencies = [
|
| 941 |
+
{ name = "numpy" },
|
| 942 |
+
]
|
| 943 |
+
sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236 }
|
| 944 |
+
wheels = [
|
| 945 |
+
{ url = "https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8440fd8bee9500c235ecb7aa1917a0389a2adb80c209fa1cc485bd70e0d94a5", size = 3376511 },
|
| 946 |
+
{ url = "https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ab2219dbc6fcdb6932f76b548e2b16f34a1f52b7666e998157a4dfc02e2c4123", size = 2826143 },
|
| 947 |
+
{ url = "https://files.pythonhosted.org/packages/6a/c2/fc6375d07ea3962df7afad7d863fe4bde18bb88530678c20d4c90c18de1d/h5py-3.15.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8cb02c3a96255149ed3ac811eeea25b655d959c6dd5ce702c9a95ff11859eb5", size = 4908316 },
|
| 948 |
+
{ url = "https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:121b2b7a4c1915d63737483b7bff14ef253020f617c2fb2811f67a4bed9ac5e8", size = 5103710 },
|
| 949 |
+
{ url = "https://files.pythonhosted.org/packages/e0/f6/11f1e2432d57d71322c02a97a5567829a75f223a8c821764a0e71a65cde8/h5py-3.15.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59b0d63b318bf3cc06687def2b45afd75926bbc006f7b8cd2b1a231299fc8599", size = 4556042 },
|
| 950 |
+
{ url = "https://files.pythonhosted.org/packages/18/88/3eda3ef16bfe7a7dbc3d8d6836bbaa7986feb5ff091395e140dc13927bcc/h5py-3.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e02fe77a03f652500d8bff288cbf3675f742fc0411f5a628fa37116507dc7cc0", size = 5030639 },
|
| 951 |
+
{ url = "https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:dea78b092fd80a083563ed79a3171258d4a4d307492e7cf8b2313d464c82ba52", size = 2864363 },
|
| 952 |
+
{ url = "https://files.pythonhosted.org/packages/5d/c9/35021cc9cd2b2915a7da3026e3d77a05bed1144a414ff840953b33937fb9/h5py-3.15.1-cp313-cp313-win_arm64.whl", hash = "sha256:c256254a8a81e2bddc0d376e23e2a6d2dc8a1e8a2261835ed8c1281a0744cd97", size = 2449570 },
|
| 953 |
+
{ url = "https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5f4fb0567eb8517c3ecd6b3c02c4f4e9da220c8932604960fd04e24ee1254763", size = 3380368 },
|
| 954 |
+
{ url = "https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:954e480433e82d3872503104f9b285d369048c3a788b2b1a00e53d1c47c98dd2", size = 2833793 },
|
| 955 |
+
{ url = "https://files.pythonhosted.org/packages/ef/d4/ef386c28e4579314610a8bffebbee3b69295b0237bc967340b7c653c6c10/h5py-3.15.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd125c131889ebbef0849f4a0e29cf363b48aba42f228d08b4079913b576bb3a", size = 4903199 },
|
| 956 |
+
{ url = "https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28a20e1a4082a479b3d7db2169f3a5034af010b90842e75ebbf2e9e49eb4183e", size = 5097224 },
|
| 957 |
+
{ url = "https://files.pythonhosted.org/packages/30/30/5273218400bf2da01609e1292f562c94b461fcb73c7a9e27fdadd43abc0a/h5py-3.15.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa8df5267f545b4946df8ca0d93d23382191018e4cda2deda4c2cedf9a010e13", size = 4551207 },
|
| 958 |
+
{ url = "https://files.pythonhosted.org/packages/d3/39/a7ef948ddf4d1c556b0b2b9559534777bccc318543b3f5a1efdf6b556c9c/h5py-3.15.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99d374a21f7321a4c6ab327c4ab23bd925ad69821aeb53a1e75dd809d19f67fa", size = 5025426 },
|
| 959 |
+
{ url = "https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl", hash = "sha256:9c73d1d7cdb97d5b17ae385153472ce118bed607e43be11e9a9deefaa54e0734", size = 2865704 },
|
| 960 |
+
{ url = "https://files.pythonhosted.org/packages/d3/b7/4a806f85d62c20157e62e58e03b27513dc9c55499768530acc4f4c5ce4be/h5py-3.15.1-cp314-cp314-win_arm64.whl", hash = "sha256:a6d8c5a05a76aca9a494b4c53ce8a9c29023b7f64f625c6ce1841e92a362ccdf", size = 2465544 },
|
| 961 |
+
]
|
| 962 |
+
|
| 963 |
[[package]]
|
| 964 |
name = "hf-xet"
|
| 965 |
version = "1.3.1"
|
|
|
|
| 1816 |
{ url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 },
|
| 1817 |
]
|
| 1818 |
|
| 1819 |
+
[[package]]
|
| 1820 |
+
name = "netcdf4"
|
| 1821 |
+
version = "1.7.4"
|
| 1822 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1823 |
+
dependencies = [
|
| 1824 |
+
{ name = "certifi" },
|
| 1825 |
+
{ name = "cftime" },
|
| 1826 |
+
{ name = "numpy" },
|
| 1827 |
+
]
|
| 1828 |
+
sdist = { url = "https://files.pythonhosted.org/packages/34/b6/0370bb3af66a12098da06dc5843f3b349b7c83ccbdf7306e7afa6248b533/netcdf4-1.7.4.tar.gz", hash = "sha256:cdbfdc92d6f4d7192ca8506c9b3d4c1d9892969ff28d8e8e1fc97ca08bf12164", size = 838352 }
|
| 1829 |
+
wheels = [
|
| 1830 |
+
{ url = "https://files.pythonhosted.org/packages/38/de/38ed7e1956943d28e8ea74161e97c3a00fb98d6d08943b4fd21bae32c240/netcdf4-1.7.4-cp311-abi3-macosx_13_0_x86_64.whl", hash = "sha256:dec70e809cc65b04ebe95113ee9c85ba46a51c3a37c058d2b2b0cadc4d3052d8", size = 23427499 },
|
| 1831 |
+
{ url = "https://files.pythonhosted.org/packages/e5/70/2f73c133b71709c412bc81d8b721e28dc6237ba9d7dad861b7bfbb70408a/netcdf4-1.7.4-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:75cf59100f0775bc4d6b9d4aca7cbabd12e2b8cf3b9a4fb16d810b92743a315a", size = 22847667 },
|
| 1832 |
+
{ url = "https://files.pythonhosted.org/packages/77/ce/43a3c0c41a6e2e940d87feea79d29aa88302211ac122604838f8a5a48de6/netcdf4-1.7.4-cp311-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddfc7e9d261125c74708119440c85ea288b5fee41db676d2ba1ce9be11f96932", size = 10274769 },
|
| 1833 |
+
{ url = "https://files.pythonhosted.org/packages/7b/7a/a8d32501bb95ecff342004a674720164f95ad616f269450b3bc13dc88ae3/netcdf4-1.7.4-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a72c9f58767779ec14cb7451c3b56bdd8fdc027a792fac2062b14e090c5617f3", size = 10123122 },
|
| 1834 |
+
{ url = "https://files.pythonhosted.org/packages/18/68/e89b4fa9242e59326c849c39ce0f49eb68499603c639405a8449900a4f15/netcdf4-1.7.4-cp311-abi3-win_amd64.whl", hash = "sha256:9476e1f23161ae5159cd1548c50c8a37922e77d76583e247133f256ef7b825fc", size = 21299637 },
|
| 1835 |
+
{ url = "https://files.pythonhosted.org/packages/6c/fc/edd41a3607241027aa4533e7f18e0cd647e74dde10a63274c65350f59967/netcdf4-1.7.4-cp311-abi3-win_arm64.whl", hash = "sha256:876ad9d58f09c98741c066c726164c45a098a58fb90e5fac9e74de4bb8a793fd", size = 2386377 },
|
| 1836 |
+
{ url = "https://files.pythonhosted.org/packages/d8/2b/684b15dd4791f8be295b2f6fa97377bbc07a768478a63b7d3c4951712e36/netcdf4-1.7.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5841de0735e8e4875b367c668e81d334287858d64dd9f3e3e2261e808c84922", size = 10395635 },
|
| 1837 |
+
{ url = "https://files.pythonhosted.org/packages/37/dc/44d21524cf1b1c64254f92e22395a7a10f70c18f3a13a18ac9db258760f7/netcdf4-1.7.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86fac03a8c5b250d57866e7d98918a64742e4b0de1681c5c86bac5726bab8aee", size = 10237725 },
|
| 1838 |
+
{ url = "https://files.pythonhosted.org/packages/d4/9d/c3ddf54296ad8f18f02f77f23452bdb0971aece1b87e84bab9d734bf72cc/netcdf4-1.7.4-cp314-cp314t-macosx_13_0_x86_64.whl", hash = "sha256:ad083d260301b5add74b1669c75ab0df03bdf986decfcc092cb45eec2615b5f1", size = 23515258 },
|
| 1839 |
+
{ url = "https://files.pythonhosted.org/packages/dd/44/bc0346e995d436d03fab682b7fbd2a9adcf0db6a05790b8f24853bf08170/netcdf4-1.7.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f22014092cc9da3f056b0368e2e38c42afd5725c87ad4843eb2f467e16dd4f6", size = 22910171 },
|
| 1840 |
+
{ url = "https://files.pythonhosted.org/packages/30/6b/f9bc3f43c55e2dac72ee9f98d77860789bdd5d50c29adf164a6bdb303078/netcdf4-1.7.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:224a15434c165a5e0225e5831f591edf62533044b1ce62fdfee815195bbd077d", size = 10567579 },
|
| 1841 |
+
{ url = "https://files.pythonhosted.org/packages/6d/d5/e7685c66b7f011c73cd746127f986358a26c642a4e4a1aa5ab51481b6586/netcdf4-1.7.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31a2318305de6831a18df25ad0df9f03b6d68666af0356d4f6057d66c02ffeb6", size = 10255032 },
|
| 1842 |
+
{ url = "https://files.pythonhosted.org/packages/a6/14/7506738bb6c8bc373b01e5af8f3b727f83f4f496c6b108490ea2609dc2cf/netcdf4-1.7.4-cp314-cp314t-win_amd64.whl", hash = "sha256:6c4a0aa9446c3a616ef3be015b629dc6173643f8b09546de26a4e40e272cd1ed", size = 22289653 },
|
| 1843 |
+
{ url = "https://files.pythonhosted.org/packages/af/2e/39d5e9179c543f2e6e149a65908f83afd9b6d64379a90789b323111761db/netcdf4-1.7.4-cp314-cp314t-win_arm64.whl", hash = "sha256:034220887d48da032cb2db5958f69759dbb04eb33e279ec6390571d4aea734fe", size = 2531682 },
|
| 1844 |
+
]
|
| 1845 |
+
|
| 1846 |
[[package]]
|
| 1847 |
name = "networkx"
|
| 1848 |
version = "3.6.1"
|
|
|
|
| 1982 |
version = "9.10.2.21"
|
| 1983 |
source = { registry = "https://pypi.org/simple" }
|
| 1984 |
dependencies = [
|
| 1985 |
+
{ name = "nvidia-cublas-cu12", marker = "platform_machine != 'ARM64' or sys_platform != 'win32'" },
|
| 1986 |
]
|
| 1987 |
wheels = [
|
| 1988 |
{ url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467 },
|
|
|
|
| 1993 |
version = "11.3.3.83"
|
| 1994 |
source = { registry = "https://pypi.org/simple" }
|
| 1995 |
dependencies = [
|
| 1996 |
+
{ name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'ARM64' or sys_platform != 'win32'" },
|
| 1997 |
]
|
| 1998 |
wheels = [
|
| 1999 |
{ url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695 },
|
|
|
|
| 2020 |
version = "11.7.3.90"
|
| 2021 |
source = { registry = "https://pypi.org/simple" }
|
| 2022 |
dependencies = [
|
| 2023 |
+
{ name = "nvidia-cublas-cu12", marker = "platform_machine != 'ARM64' or sys_platform != 'win32'" },
|
| 2024 |
+
{ name = "nvidia-cusparse-cu12", marker = "platform_machine != 'ARM64' or sys_platform != 'win32'" },
|
| 2025 |
+
{ name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'ARM64' or sys_platform != 'win32'" },
|
| 2026 |
]
|
| 2027 |
wheels = [
|
| 2028 |
{ url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905 },
|
|
|
|
| 2033 |
version = "12.5.8.93"
|
| 2034 |
source = { registry = "https://pypi.org/simple" }
|
| 2035 |
dependencies = [
|
| 2036 |
+
{ name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'ARM64' or sys_platform != 'win32'" },
|
| 2037 |
]
|
| 2038 |
wheels = [
|
| 2039 |
{ url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466 },
|
|
|
|
| 2151 |
version = "4.9.0"
|
| 2152 |
source = { registry = "https://pypi.org/simple" }
|
| 2153 |
dependencies = [
|
| 2154 |
+
{ name = "ptyprocess", marker = "platform_machine != 'ARM64' or sys_platform != 'win32'" },
|
| 2155 |
]
|
| 2156 |
sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
|
| 2157 |
wheels = [
|
|
|
|
| 2546 |
{ url = "https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2", size = 15548 },
|
| 2547 |
]
|
| 2548 |
|
| 2549 |
+
[[package]]
|
| 2550 |
+
name = "python-magic"
|
| 2551 |
+
version = "0.4.27"
|
| 2552 |
+
source = { registry = "https://pypi.org/simple" }
|
| 2553 |
+
sdist = { url = "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", size = 14677 }
|
| 2554 |
+
wheels = [
|
| 2555 |
+
{ url = "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3", size = 13840 },
|
| 2556 |
+
]
|
| 2557 |
+
|
| 2558 |
[[package]]
|
| 2559 |
name = "python-multipart"
|
| 2560 |
version = "0.0.22"
|