# ccp4i2 server runtime dependency lock (CCP4-environment install).
#
# AUTO-GENERATED by scripts/gen_runtime_lock.py from a clean-venv pip-freeze of
# the ccp4i2 wheel, with CCP4-provided ABI-native packages stripped. Do not hand-
# edit pins; change pyproject deps then regenerate and re-test (see below).
#
# WHY: the desktop app installs ccp4i2 into the user's ccp4-python, whose hand-
# rolled distros carry corrupt *.dist-info that crashes pip's RESOLVER. The only
# reliable install there is `pip install --no-deps` (resolver never runs), which
# means WE must supply the full closure — this file. It includes a MODERN
# django/asgiref because CCP4 bundles django 3.2 / asgiref 3.3 (present solely
# for ccp4i2, which has moved past them) and modern cors-headers/DRF need
# asgiref>=3.4 (the iscoroutinefunction skew).
#
# EXCLUDED (CCP4 provides as compiled/ABI-native — never overwrite): numpy,
# gemmi, lxml, scipy, pandas, cffi, cryptography, psutil, biopython,
# charset-normalizer. The server import path needs none of the heavy ones; they
# are job-execution-only and CCP4's copies are correct.
#
# APPLIED (both --no-deps so the broken resolver is never touched):
#   pip install --no-deps --upgrade "ccp4i2>=<floor>"
#   pip install --no-deps --upgrade -r <site-packages>/ccp4i2/requirements-runtime.txt
# then `import ccp4i2.config.asgi` (the readiness probe) is the success authority.
#
# PLATFORM-CONDITIONAL TAIL: a pip-freeze only ever captures the *generating*
# machine's platform, so the Windows/Linux halves of keyring's closure can never
# appear in it. gen_runtime_lock.py therefore appends a fixed, marker-bearing
# block (KEYCHAIN_CONDITIONAL) after the frozen lines. Regeneration preserves it.
#
# REGENERATE:
#   python3 -m venv /tmp/lockenv
#   /tmp/lockenv/bin/pip install dist/ccp4i2-<ver>-py3-none-any.whl
#   /tmp/lockenv/bin/python server/scripts/gen_runtime_lock.py --freeze-from /tmp/lockenv \
#     > server/ccp4i2/requirements-runtime.txt
#   # then re-test the server ASGI import on a target CCP4 build before committing.

asgiref==3.11.1
attrs==26.1.0
cattrs==26.1.0
ccp4i2-api==0.4.0
certifi==2026.6.17
click==8.4.2
django-cors-headers==4.9.0
django-filter==25.2
Django==5.2.15
djangorestframework==3.17.1
elementpath==5.1.3
et_xmlfile==2.0.0
future==1.0.0
h11==0.16.0
idna==3.18
lxml_html_clean==0.4.5
openpyxl==3.1.5
platformdirs==4.10.0
pycparser==3.0
PyJWT==2.13.0
python-docx==1.2.0
pytz==2026.2
requests-cache==1.3.2
requests==2.34.2
sqlparse==0.5.5
typing_extensions==4.15.0
url-normalize==3.0.0
urllib3==2.7.0
uvicorn==0.49.0
xmlschema==4.3.1

# --- OS keychain support (config/credentials.py) ---------------------------
# Markers matter here: a lock generated on one platform must still install the
# right backend on the other two, and CCP4's python is 3.11 so the <3.12
# backports are real requirements, not no-ops. Without these, keyring imports
# but selects no backend, and credentials silently fall back to a 0600 file.
# cryptography (SecretStorage's dep) is deliberately absent - CCP4 provides it.
keyring==25.7.0
jaraco.classes==3.4.0
jaraco.context==6.1.2
jaraco.functools==4.6.0
more-itertools==11.1.0
backports.tarfile==1.2.0 ; python_version < "3.12"
importlib_metadata==9.0.0 ; python_version < "3.12"
zipp==4.1.0 ; python_version < "3.12"
pywin32-ctypes==0.2.3 ; sys_platform == "win32"
SecretStorage==3.5.0 ; sys_platform == "linux"
jeepney==0.9.0 ; sys_platform == "linux"
