diff --git a/Dockerfile b/Dockerfile index afc0e87b18817744ba1504a5ba4d542d559043e4..05c880f7740d8dc8b88bcfbe8c787b8dc9bdb349 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,8 +24,8 @@ FROM node:20 AS base_node FROM python:3.12-slim AS base_python # Keeps Python from buffering stdout and stderr to avoid situations where # the application crashes without emitting any logs due to buffering. -ENV PYTHONUNBUFFERED 1 -ENV PYTHONPATH "${PYTHONPATH}:/backend/" +ENV PYTHONUNBUFFERED=1 +ENV PYTHONPATH="${PYTHONPATH}:/backend/" ENV UV_SYSTEM_PYTHON=1 FROM base_python AS base_final @@ -75,7 +75,7 @@ FROM base_python AS dev_python # Prevents Python from writing pyc files. ENV PYTHONDONTWRITEBYTECODE=1 -ENV RUNTIME docker +ENV RUNTIME=docker WORKDIR /app @@ -108,8 +108,8 @@ FROM base_node AS dev_node WORKDIR /app/gui -ENV PATH /app/node_modules/.bin:$PATH -ENV NODE_OPTIONS "--max_old_space_size=4096 --openssl-legacy-provider" +ENV PATH=/app/node_modules/.bin:$PATH +ENV NODE_OPTIONS="--max_old_space_size=4096 --openssl-legacy-provider" # Fetch and cache all (but only) the dependencies COPY gui/yarn.lock gui/package.json ./ @@ -123,11 +123,11 @@ COPY tests/states/archives/dft.json /app/tests/states/archives/dft.json COPY gui . RUN echo "REACT_APP_BACKEND_URL=/fairdi/nomad/latest" > .env -FROM dev_node as build_node +FROM dev_node AS build_node RUN yarn run build -FROM dev_python as dev_package +FROM dev_python AS dev_package WORKDIR /app @@ -185,7 +185,7 @@ RUN uv build --sdist # ================================================================================ # We use slim for the final image # ================================================================================ -FROM base_builder as builder +FROM base_builder AS builder # install COPY --from=dev_package /app/dist/nomad-lab-*.tar.gz . @@ -223,6 +223,9 @@ RUN mkdir -p /app/.volumes/fs \ && chown -R nomad:1000 /app \ && chown -R nomad:1000 /usr/local/lib/python3.12/site-packages/nomad +# for attaching profiler to running processes +RUN echo "kernel.yama.ptrace_scope = 0" > /etc/sysctl.d/10-ptrace.conf + USER nomad # The application ports diff --git a/nomad/app/v1/main.py b/nomad/app/v1/main.py index 808c8e169d3fd5a06e38af35dda6de3b7e88dcd0..9573d1a35de112b91c542c757d9be8944dd36146 100644 --- a/nomad/app/v1/main.py +++ b/nomad/app/v1/main.py @@ -16,18 +16,19 @@ # limitations under the License. # -from typing import Any, cast +import traceback + from fastapi import FastAPI, status, Request from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse, RedirectResponse -from starlette.types import ASGIApp, Message, Receive, Scope, Send -from fastapi.routing import APIRoute -import traceback -import orjson +from fastapi.responses import JSONResponse, RedirectResponse, ORJSONResponse +from pyinstrument import Profiler +from starlette.middleware import Middleware +from starlette.middleware.base import BaseHTTPMiddleware +from starlette.responses import HTMLResponse +from starlette.types import ASGIApp, Receive, Scope, Send from nomad import utils from nomad.config import config - from .common import root_path from .routers import ( users, @@ -49,13 +50,23 @@ from .routers import ( logger = utils.get_logger(__name__) -class ORJSONResponse(JSONResponse): - media_type = 'application/json' +class LoggingMiddleware: + def __init__(self, app: ASGIApp) -> None: + self.app = app + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + with utils.timer(logger, 'request handled', path=scope.get('path')): + await self.app(scope, receive, send) + + +async def profile_request(request: Request, call_next): + if not request.query_params.get('__profile__', False): + return await call_next(request) + + with Profiler(async_mode='enabled') as profiler: + await call_next(request) - def render(self, content: Any) -> bytes: - return orjson.dumps( - content, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS - ) # pylint: disable=maybe-no-member + return HTMLResponse(profiler.output_html()) app = FastAPI( @@ -73,19 +84,22 @@ app = FastAPI( """ ), default_response_class=ORJSONResponse, -) - -app.add_middleware( - CORSMiddleware, - allow_origins=['*'], - allow_credentials=True, - allow_methods=['*'], - allow_headers=['*'], - expose_headers=['Content-Disposition'], + middleware=[ + Middleware( + CORSMiddleware, + allow_origins=['*'], + allow_credentials=True, + allow_methods=['*'], + allow_headers=['*'], + expose_headers=['Content-Disposition'], + ), + Middleware(LoggingMiddleware), + Middleware(BaseHTTPMiddleware, dispatch=profile_request), + ], ) -async def redirect_to_docs(req: Request): +async def redirect_to_docs(_): return RedirectResponse(f'{root_path}/extensions/docs') @@ -93,18 +107,6 @@ async def redirect_to_docs(req: Request): app.add_route('/', redirect_to_docs, include_in_schema=False) -class LoggingMiddleware: - def __init__(self, app: ASGIApp) -> None: - self.app = app - - async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: - with utils.timer(logger, 'request handled', path=scope.get('path')): - await self.app(scope, receive, send) - - -app.add_middleware(LoggingMiddleware) - - @app.exception_handler(Exception) async def unicorn_exception_handler(request: Request, e: Exception): logger.error('unexpected exception in API', url=request.url, exc_info=e) diff --git a/pyproject.toml b/pyproject.toml index c62ef02da0f168ccd075961680cc44394adcdec4..9936fbad142055a644b56be674d80dba3fb1b5f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,8 +26,9 @@ dependencies = [ 'httpx>=0.23.3', 'importlib_metadata~=7.1.0', 'jmespath>=0.10.0', - 'lxml>=5.2', + 'kaleido==0.2.1', 'lxml-html-clean>=0.1.0', + 'lxml>=5.2', 'matid>=2.1.3', 'nptyping~=1.4.4', 'numpy>=1.22.4,<2.0.0', @@ -37,7 +38,9 @@ dependencies = [ 'panedr>=0.2', 'parmed>=3.0.0', 'pint==0.17', + 'py-spy', # for on-server profiling 'pydantic>=1.10.8,<2.0.0', + 'pyinstrument', # for endpoint profiling 'pymatgen>=2023.5.10', 'python-keycloak>=0.26.1', 'python-magic==0.4.24', @@ -49,10 +52,9 @@ dependencies = [ 'scipy>=1.7.1', 'toposort>=1.0', 'typing-extensions>=4.12', - 'kaleido==0.2.1', + 'unidecode==1.3.2', 'wrapt>=1.12.1', 'xarray>=0.20.2', - 'unidecode==1.3.2', ] [project.urls] @@ -75,7 +77,7 @@ infrastructure = [ 'celery>=5.0', 'dockerspawner==13.0.0', 'elasticsearch>=7.0,<8', - 'fastapi<0.100', # later versions pending pydantic v2 upgrade + 'fastapi<0.100', # later versions pending pydantic v2 upgrade 'filelock==3.3.1', 'gitpython>=3.0', 'gunicorn>=21.2.0,<22.0.0', @@ -118,7 +120,7 @@ dev = [ 'mkdocs-material>=9.0', 'mkdocs-redirects>=1.0', 'mkdocs>=1.0', - 'mypy==1.0.1', # bug: incompatible with derived models of pydantic v1 + 'mypy==1.0.1', # bug: incompatible with derived models of pydantic v1 'names==0.3.0', 'uv>=0.2.35', 'pytest-asyncio>=0.23', @@ -131,7 +133,7 @@ dev = [ 'rope==0.21.0', 'ruamel.yaml>=0.1', 'ruff>=0.6', - 'setuptools>=70', # py3.12 doesn't bundle in setuptools, but this is required by mongomock lib + 'setuptools>=70', # py3.12 doesn't bundle in setuptools, but this is required by mongomock lib ] @@ -148,15 +150,15 @@ indent-width = 4 [tool.ruff.lint] select = [ - "E", # pycodestyle - "W", # pycodestyle + "E", # pycodestyle + "W", # pycodestyle "PL", # pylint ] ignore = [ - "E501", # Line too long ({width} > {limit} characters) - "E701", # Multiple statements on one line (colon) - "E731", # Do not assign a lambda expression, use a def - "E402", # Module level import not at top of file + "E501", # Line too long ({width} > {limit} characters) + "E701", # Multiple statements on one line (colon) + "E731", # Do not assign a lambda expression, use a def + "E402", # Module level import not at top of file "PLR0911", # Too many return statements "PLR0912", # Too many branches "PLR0913", # Too many arguments in function definition @@ -201,7 +203,7 @@ disable_error_code = "import, annotation-unchecked" extra-index-url = [ "https://gitlab.mpcdf.mpg.de/api/v4/projects/2187/packages/pypi/simple", ] -constraint-dependencies = [ # can be removed once pynxtools removes kikuchipy restriction +constraint-dependencies = [# can be removed once pynxtools removes kikuchipy restriction "hyperspy>=1.7.6", "pillow<10.1", ] diff --git a/requirements-dev.txt b/requirements-dev.txt index bead3ebf40b6cc8e7e64aaf1d84b6afc371420e0..c1fc5c84edb6120d30f90962b654ca6319609563 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ # uv pip compile --universal -p 3.11 --annotation-style=line --extra=dev --extra=infrastructure --extra=parsing --output-file=requirements-dev.txt requirements.txt pyproject.toml aiosmtpd==1.4.6 # via nomad-lab (pyproject.toml) alabaster==1.0.0 # via sphinx, -r requirements.txt -alembic==1.13.3 # via jupyterhub, -r requirements.txt +alembic==1.14.0 # via jupyterhub, -r requirements.txt amqp==5.2.0 # via kombu, -r requirements.txt aniso8601==9.0.1 # via -r requirements.txt, nomad-lab (pyproject.toml) anyio==4.6.2.post1 # via httpx, starlette, watchfiles, -r requirements.txt @@ -108,9 +108,9 @@ mkdocs-get-deps==0.2.0 # via mkdocs mkdocs-git-revision-date-localized-plugin==1.3.0 # via nomad-lab (pyproject.toml) mkdocs-glightbox==0.4.0 # via nomad-lab (pyproject.toml) mkdocs-macros-plugin==1.3.7 # via nomad-lab (pyproject.toml) -mkdocs-material==9.5.42 # via nomad-lab (pyproject.toml) +mkdocs-material==9.5.44 # via nomad-lab (pyproject.toml) mkdocs-material-extensions==1.3.1 # via mkdocs-material, nomad-lab (pyproject.toml) -mkdocs-redirects==1.2.1 # via nomad-lab (pyproject.toml) +mkdocs-redirects==1.2.2 # via nomad-lab (pyproject.toml) mongoengine==0.29.1 # via -r requirements.txt, nomad-lab (pyproject.toml) mongomock==4.2.0.post1 # via optimade, -r requirements.txt monty==2024.10.21 # via pymatgen, -r requirements.txt @@ -128,8 +128,8 @@ oauthenticator==15.1.0 # via -r requirements.txt, nomad-lab (pyproject.toml) oauthlib==3.2.2 # via jupyterhub, -r requirements.txt openpyxl==3.1.5 # via -r requirements.txt, nomad-lab (pyproject.toml) optimade==0.22.1 # via -r requirements.txt, nomad-lab (pyproject.toml) -orjson==3.10.10 # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml) -packaging==24.1 # via deprecation, gunicorn, jupyterhub, matplotlib, mkdocs, mkdocs-macros-plugin, mongomock, pint, plotly, pytest, sphinx, xarray, -r requirements.txt +orjson==3.10.11 # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml) +packaging==24.2 # via deprecation, gunicorn, jupyterhub, matplotlib, mkdocs, mkdocs-macros-plugin, mongomock, pint, plotly, pytest, sphinx, xarray, -r requirements.txt paginate==0.5.7 # via mkdocs-material palettable==3.3.3 # via pymatgen, -r requirements.txt pamela==1.2.0 ; sys_platform != 'win32' # via jupyterhub, -r requirements.txt @@ -145,13 +145,15 @@ pluggy==1.5.0 # via pytest prometheus-client==0.21.0 # via jupyterhub, -r requirements.txt prompt-toolkit==3.0.48 # via click-repl, -r requirements.txt psutil==6.1.0 ; sys_platform == 'win32' # via jupyterhub, -r requirements.txt +py-spy==0.4.0 # via -r requirements.txt, nomad-lab (pyproject.toml) pyasn1==0.6.1 # via pyasn1-modules, rfc3161ng, -r requirements.txt pyasn1-modules==0.4.1 # via rfc3161ng, -r requirements.txt pybtex==0.24.0 # via pymatgen, -r requirements.txt pycparser==2.22 ; platform_python_implementation != 'PyPy' # via cffi, -r requirements.txt -pydantic==1.10.18 # via fastapi, optimade, -r requirements.txt, nomad-lab (pyproject.toml) +pydantic==1.10.19 # via fastapi, optimade, -r requirements.txt, nomad-lab (pyproject.toml) pyedr==0.8.0 # via panedr, -r requirements.txt pygments==2.18.0 # via devtools, mkdocs-material, sphinx, -r requirements.txt +pyinstrument==5.0.0 # via -r requirements.txt, nomad-lab (pyproject.toml) pyjwt==2.6.0 # via -r requirements.txt, nomad-lab (pyproject.toml) pymatgen==2024.5.1 # via -r requirements.txt, nomad-lab (pyproject.toml) pymdown-extensions==10.12 # via mkdocs-material @@ -168,7 +170,7 @@ python-dateutil==2.9.0.post0 # via arrow, celery, elasticsearch-dsl, ghp-import python-dotenv==1.0.1 # via uvicorn, -r requirements.txt python-gitlab==2.10.1 # via nomad-lab (pyproject.toml) python-json-logger==2.0.2 # via jupyter-telemetry, -r requirements.txt, nomad-lab (pyproject.toml) -python-keycloak==4.6.3 # via -r requirements.txt, nomad-lab (pyproject.toml) +python-keycloak==4.7.0 # via -r requirements.txt, nomad-lab (pyproject.toml) python-logstash==0.4.6 # via -r requirements.txt, nomad-lab (pyproject.toml) python-magic==0.4.24 # via -r requirements.txt, nomad-lab (pyproject.toml) python-magic-bin==0.4.14 ; sys_platform == 'win32' # via -r requirements.txt, nomad-lab (pyproject.toml) @@ -180,7 +182,7 @@ pyyaml-env-tag==0.1 # via mkdocs rdflib==5.0.0 # via -r requirements.txt, nomad-lab (pyproject.toml) rdkit==2023.9.5 # via -r requirements.txt, nomad-lab (pyproject.toml) recommonmark==0.7.1 # via -r requirements.txt, nomad-lab (pyproject.toml) -regex==2024.9.11 # via mkdocs-material +regex==2024.11.6 # via mkdocs-material requests==2.31.0 # via docker, jupyterhub, mkdocs-material, oauthenticator, optimade, pymatgen, python-gitlab, python-keycloak, requests-toolbelt, rfc3161ng, sphinx, -r requirements.txt, nomad-lab (pyproject.toml) requests-toolbelt==1.0.0 # via python-gitlab, python-keycloak, -r requirements.txt rfc3161ng==2.1.3 # via -r requirements.txt, nomad-lab (pyproject.toml) @@ -189,7 +191,7 @@ rfc3987==1.3.8 # via jsonschema, -r requirements.txt rope==0.21.0 # via nomad-lab (pyproject.toml) ruamel-yaml==0.18.6 # via jupyter-telemetry, monty, oauthenticator, pymatgen, -r requirements.txt, nomad-lab (pyproject.toml) ruamel-yaml-clib==0.2.12 ; python_full_version < '3.13' and platform_python_implementation == 'CPython' # via ruamel-yaml, -r requirements.txt -ruff==0.7.1 # via nomad-lab (pyproject.toml) +ruff==0.7.3 # via nomad-lab (pyproject.toml) runstats==2.0.0 # via -r requirements.txt, nomad-lab (pyproject.toml) scikit-learn==1.5.2 # via matid, -r requirements.txt, nomad-lab (pyproject.toml) scipy==1.14.1 # via ase, pymatgen, scikit-learn, -r requirements.txt, nomad-lab (pyproject.toml) @@ -221,7 +223,7 @@ tifffile==2024.9.20 # via h5grove, -r requirements.txt tomli==2.0.2 ; python_full_version <= '3.11' # via coverage toposort==1.10 # via -r requirements.txt, nomad-lab (pyproject.toml) tornado==6.4.1 # via jupyterhub, -r requirements.txt -tqdm==4.66.6 # via pyedr, pymatgen, -r requirements.txt +tqdm==4.67.0 # via pyedr, pymatgen, -r requirements.txt traitlets==5.14.3 # via jupyter-telemetry, jupyterhub, -r requirements.txt types-python-dateutil==2.9.0.20241003 # via arrow, -r requirements.txt typing-extensions==4.12.2 # via alembic, fastapi, jwcrypto, mypy, pydantic, sqlalchemy, -r requirements.txt, nomad-lab (pyproject.toml) @@ -231,18 +233,18 @@ uncertainties==3.2.2 # via pymatgen, -r requirements.txt unidecode==1.3.2 # via -r requirements.txt, nomad-lab (pyproject.toml) uri-template==1.3.0 # via jsonschema, -r requirements.txt urllib3==1.26.20 # via docker, elasticsearch, requests, -r requirements.txt -uv==0.4.29 # via nomad-lab (pyproject.toml) +uv==0.5.1 # via nomad-lab (pyproject.toml) uvicorn==0.32.0 # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml) uvloop==0.21.0 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32' # via uvicorn, -r requirements.txt validators==0.18.2 # via -r requirements.txt, nomad-lab (pyproject.toml) vine==5.1.0 # via amqp, celery, kombu, -r requirements.txt -watchdog==5.0.3 # via mkdocs +watchdog==6.0.0 # via mkdocs watchfiles==0.24.0 # via uvicorn, -r requirements.txt wcwidth==0.2.13 # via prompt-toolkit, -r requirements.txt webcolors==24.8.0 # via jsonschema, -r requirements.txt webencodings==0.5.1 # via html5lib, -r requirements.txt -websockets==13.1 # via uvicorn, -r requirements.txt +websockets==14.0 # via uvicorn, -r requirements.txt wrapt==1.16.0 # via -r requirements.txt, nomad-lab (pyproject.toml) xarray==2024.10.0 # via -r requirements.txt, nomad-lab (pyproject.toml) -zipp==3.20.2 # via importlib-metadata, -r requirements.txt +zipp==3.21.0 # via importlib-metadata, -r requirements.txt zipstream-new==1.1.5 # via -r requirements.txt, nomad-lab (pyproject.toml) diff --git a/requirements-plugins.txt b/requirements-plugins.txt index 4b9816a7833895f9f35e2c755516bdd6526e4090..5b0fdaf241de497801e17a7184ba48fe252618dd 100644 --- a/requirements-plugins.txt +++ b/requirements-plugins.txt @@ -166,8 +166,8 @@ numexpr==2.10.1 # via blosc2, hyperspy, pyfai, pyxem, tables numpy==1.26.4 # via ase, blosc2, cftime, contourpy, dask, diffpy-structure, diffsims, fabio, fairmat-readers-xrd, findiff, griddataformats, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, igor2, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, monty, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nomad-lab, nptyping, numba, numcodecs, numexpr, orix, pandas, phonopy, pycifrw, pyedr, pyfai, pymatgen, pynxtools, pynxtools-apm, pynxtools-em, pynxtools-xps, pyxem, radioactivedecay, rdkit, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, transforms3d, xarray, xraydb, zarr, -c requirements-dev.txt openpyxl==3.1.5 # via nomad-lab, perovskite-solar-cell-database, -c requirements-dev.txt orix==0.13.2 # via diffsims, kikuchipy, pyxem -orjson==3.10.10 # via h5grove, nomad-lab, -c requirements-dev.txt -packaging==24.1 # via dask, deprecation, hyperspy, ipykernel, jupyter-server, jupyterlab, jupyterlab-server, lazy-loader, matplotlib, mdanalysis, nbconvert, pint, plotly, pooch, scikit-image, silx, tables, xarray, xraydb, -c requirements-dev.txt +orjson==3.10.11 # via h5grove, nomad-lab, -c requirements-dev.txt +packaging==24.2 # via dask, deprecation, hyperspy, ipykernel, jupyter-server, jupyterlab, jupyterlab-server, lazy-loader, matplotlib, mdanalysis, nbconvert, pint, plotly, pooch, scikit-image, silx, tables, xarray, xraydb, -c requirements-dev.txt palettable==3.3.3 # via pymatgen, -c requirements-dev.txt pandas==2.2.3 # via eelsdbconverter, ifes-apt-tc-data-modeling, nomad-lab, nomad-openbis, panedr, pymatgen, pynxtools, radioactivedecay, xarray, -c requirements-dev.txt pandocfilters==1.5.1 # via nbconvert @@ -197,7 +197,7 @@ pyasn1-modules==0.4.1 # via rfc3161ng, -c requirements-dev.txt pybtex==0.24.0 # via pymatgen, -c requirements-dev.txt pycifrw==4.4.6 # via diffpy-structure, orix pycparser==2.22 # via cffi, -c requirements-dev.txt -pydantic==1.10.18 # via nomad-lab, nomad-parser-plugins-atomistic, nomad-parser-plugins-database, nomad-parser-plugins-electronic, nomad-parser-plugins-workflow, nomad-porous-materials, -c requirements-dev.txt +pydantic==1.10.19 # via nomad-lab, nomad-parser-plugins-atomistic, nomad-parser-plugins-database, nomad-parser-plugins-electronic, nomad-parser-plugins-workflow, nomad-porous-materials, -c requirements-dev.txt pyedr==0.8.0 # via panedr, -c requirements-dev.txt pyfai==2024.9.0 # via pyxem pygments==2.18.0 # via ipython, jupyter-console, nbconvert, -c requirements-dev.txt @@ -216,7 +216,7 @@ pyrsistent==0.20.0 # via jsonschema, -c requirements-dev.txt python-box==7.2.0 # via rosettasciio python-dateutil==2.9.0.post0 # via arrow, elasticsearch-dsl, hyperspy, ipyparallel, jupyter-client, matplotlib, nomad-openbis, pandas, rfc3161ng, rosettasciio, -c requirements-dev.txt python-json-logger==2.0.2 # via jupyter-events, -c requirements-dev.txt -python-keycloak==4.6.3 # via nomad-lab, -c requirements-dev.txt +python-keycloak==4.7.0 # via nomad-lab, -c requirements-dev.txt python-magic==0.4.24 # via nomad-lab, -c requirements-dev.txt pytz==2024.2 # via nionswift, nomad-lab, pandas, -c requirements-dev.txt pywin32==308 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' # via jupyter-core, -c requirements-dev.txt @@ -260,7 +260,7 @@ tinycss2==1.3.0 # via nbconvert toolz==1.0.0 # via dask, hyperspy, partd toposort==1.10 # via nomad-lab, -c requirements-dev.txt tornado==6.4.1 # via ipykernel, ipyparallel, jupyter-client, jupyter-server, jupyterlab, notebook, terminado, -c requirements-dev.txt -tqdm==4.66.6 # via diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pyedr, pymatgen, pyxem, -c requirements-dev.txt +tqdm==4.67.0 # via diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pyedr, pymatgen, pyxem, -c requirements-dev.txt traitlets==5.14.3 # via comm, ipykernel, ipyparallel, ipython, ipywidgets, jupyter-client, jupyter-console, jupyter-core, jupyter-events, jupyter-server, jupyterlab, matplotlib-inline, nbclient, nbconvert, nbformat, -c requirements-dev.txt traits==6.4.3 # via hyperspy, pyxem transforms3d==0.4.2 # via diffsims, pyxem @@ -284,7 +284,7 @@ xarray==2024.10.0 # via nomad-lab, nomad-parser-plugins-workflow, pynxto xmltodict==0.13.0 # via fairmat-readers-xrd, ifes-apt-tc-data-modeling, pynxtools-em, pynxtools-xrd xraydb==4.5.4 # via pynxtools-em zarr==2.18.3 ; platform_machine == 'AMD64' or platform_machine == 'x86_64' # via hyperspy -zipp==3.20.2 # via importlib-metadata, -c requirements-dev.txt +zipp==3.21.0 # via importlib-metadata, -c requirements-dev.txt # The following packages were excluded from the output: # nomad-lab diff --git a/requirements.txt b/requirements.txt index 4f2fe81d3c6885b3010150a5c6d14af267d2091e..e312909155c3ce3b08692461b8433935ad20e48c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # This file was autogenerated by uv via the following command: # uv pip compile --universal -p 3.11 --annotation-style=line --extra=infrastructure --extra=parsing --output-file=requirements.txt pyproject.toml alabaster==1.0.0 # via sphinx -alembic==1.13.3 # via jupyterhub +alembic==1.14.0 # via jupyterhub amqp==5.2.0 # via kombu aniso8601==9.0.1 # via nomad-lab (pyproject.toml) anyio==4.6.2.post1 # via httpx, starlette, watchfiles @@ -104,8 +104,8 @@ oauthenticator==15.1.0 # via nomad-lab (pyproject.toml) oauthlib==3.2.2 # via jupyterhub openpyxl==3.1.5 # via nomad-lab (pyproject.toml) optimade==0.22.1 # via nomad-lab (pyproject.toml) -orjson==3.10.10 # via h5grove, nomad-lab (pyproject.toml) -packaging==24.1 # via deprecation, gunicorn, jupyterhub, matplotlib, mongomock, pint, plotly, sphinx, xarray +orjson==3.10.11 # via h5grove, nomad-lab (pyproject.toml) +packaging==24.2 # via deprecation, gunicorn, jupyterhub, matplotlib, mongomock, pint, plotly, sphinx, xarray palettable==3.3.3 # via pymatgen pamela==1.2.0 ; sys_platform != 'win32' # via jupyterhub pandas==2.2.3 # via panedr, pymatgen, xarray, nomad-lab (pyproject.toml) @@ -117,13 +117,15 @@ plotly==5.24.1 # via pymatgen prometheus-client==0.21.0 # via jupyterhub prompt-toolkit==3.0.48 # via click-repl psutil==6.1.0 ; sys_platform == 'win32' # via jupyterhub +py-spy==0.4.0 # via nomad-lab (pyproject.toml) pyasn1==0.6.1 # via pyasn1-modules, rfc3161ng pyasn1-modules==0.4.1 # via rfc3161ng pybtex==0.24.0 # via pymatgen pycparser==2.22 ; platform_python_implementation != 'PyPy' # via cffi -pydantic==1.10.18 # via fastapi, optimade, nomad-lab (pyproject.toml) +pydantic==1.10.19 # via fastapi, optimade, nomad-lab (pyproject.toml) pyedr==0.8.0 # via panedr pygments==2.18.0 # via sphinx +pyinstrument==5.0.0 # via nomad-lab (pyproject.toml) pyjwt==2.6.0 # via nomad-lab (pyproject.toml) pymatgen==2024.5.1 # via nomad-lab (pyproject.toml) pymongo==4.6.3 # via mongoengine, optimade, nomad-lab (pyproject.toml) @@ -132,7 +134,7 @@ pyrsistent==0.20.0 # via jsonschema python-dateutil==2.9.0.post0 # via arrow, celery, elasticsearch-dsl, jupyterhub, matplotlib, pandas, rfc3161ng python-dotenv==1.0.1 # via uvicorn python-json-logger==2.0.2 # via jupyter-telemetry, nomad-lab (pyproject.toml) -python-keycloak==4.6.3 # via nomad-lab (pyproject.toml) +python-keycloak==4.7.0 # via nomad-lab (pyproject.toml) python-logstash==0.4.6 # via nomad-lab (pyproject.toml) python-magic==0.4.24 # via nomad-lab (pyproject.toml) python-magic-bin==0.4.14 ; sys_platform == 'win32' # via nomad-lab (pyproject.toml) @@ -177,7 +179,7 @@ threadpoolctl==3.5.0 # via scikit-learn tifffile==2024.9.20 # via h5grove toposort==1.10 # via nomad-lab (pyproject.toml) tornado==6.4.1 # via jupyterhub -tqdm==4.66.6 # via pyedr, pymatgen +tqdm==4.67.0 # via pyedr, pymatgen traitlets==5.14.3 # via jupyter-telemetry, jupyterhub types-python-dateutil==2.9.0.20241003 # via arrow typing-extensions==4.12.2 # via alembic, fastapi, jwcrypto, pydantic, sqlalchemy, nomad-lab (pyproject.toml) @@ -195,8 +197,8 @@ watchfiles==0.24.0 # via uvicorn wcwidth==0.2.13 # via prompt-toolkit webcolors==24.8.0 # via jsonschema webencodings==0.5.1 # via html5lib -websockets==13.1 # via uvicorn +websockets==14.0 # via uvicorn wrapt==1.16.0 # via nomad-lab (pyproject.toml) xarray==2024.10.0 # via nomad-lab (pyproject.toml) -zipp==3.20.2 # via importlib-metadata +zipp==3.21.0 # via importlib-metadata zipstream-new==1.1.5 # via nomad-lab (pyproject.toml)