From 57f7e5bfde36b06427d49b23a531489e01b710fd Mon Sep 17 00:00:00 2001 From: Jacob Nesbitt Date: Thu, 19 Feb 2026 11:59:16 -0500 Subject: [PATCH 01/20] Add test to ensure cli-minimal-version is accurate --- dandiapi/api/tests/test_info.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/dandiapi/api/tests/test_info.py b/dandiapi/api/tests/test_info.py index da82b8b2b..e19fe0bd6 100644 --- a/dandiapi/api/tests/test_info.py +++ b/dandiapi/api/tests/test_info.py @@ -1,7 +1,11 @@ from __future__ import annotations +import importlib.metadata + from dandischema.conf import get_instance_config +from packaging.specifiers import SpecifierSet import pytest +import requests @pytest.mark.django_db @@ -16,3 +20,22 @@ def test_rest_info_instance_config_include_none(api_client): resp.json()['instance_config'].keys() == get_instance_config().model_dump(mode='json', exclude_none=False).keys() ) + + +def test_cli_minimal_version_matches_dandischema(api_client): + """Test that local dandischema and minimal cli dandischema are compatible.""" + # Get CLI version info from pypi + minimal_version = api_client.get('/api/info/').json()['cli-minimal-version'] + data = requests.get(f'https://pypi.org/pypi/dandi/{minimal_version}/json').json() + + # Extract the dandischema requirement + dandischema_requires = [x for x in data['info']['requires_dist'] if x.startswith('dandischema')] + assert len(dandischema_requires) == 1 + dandischema_version: str = dandischema_requires[0] + version_range = SpecifierSet( + dandischema_version.split(';', maxsplit=1)[0].removeprefix('dandischema').strip() + ) + + # Ensure that local dandischema is compatible with the CLI version + local_version = importlib.metadata.version('dandischema') + assert version_range.contains(local_version) From 0db90e46817f41b9368fc4e30ae7c930a288a5ea Mon Sep 17 00:00:00 2001 From: Jacob Nesbitt Date: Thu, 19 Feb 2026 11:59:46 -0500 Subject: [PATCH 02/20] Update cli-minimal-version --- dandiapi/api/views/info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandiapi/api/views/info.py b/dandiapi/api/views/info.py index 69b1752a2..efb49f844 100644 --- a/dandiapi/api/views/info.py +++ b/dandiapi/api/views/info.py @@ -84,7 +84,7 @@ def info_view(request): 'schema_url': get_schema_url(), 'allowed_schema_versions': ALLOWED_INPUT_SCHEMAS, 'version': importlib.metadata.version('dandiapi'), - 'cli-minimal-version': '0.60.0', + 'cli-minimal-version': '0.74.0', 'cli-bad-versions': [], 'services': { 'api': {'url': api_url}, From 8403e0fe6de196c6a6d804f447f5813c9795aa0b Mon Sep 17 00:00:00 2001 From: Jacob Nesbitt Date: Thu, 19 Feb 2026 12:11:21 -0500 Subject: [PATCH 03/20] Use cli-minimal-version in download dialog --- web/src/types/index.ts | 1 + web/src/views/DandisetLandingView/DownloadDialog.vue | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/web/src/types/index.ts b/web/src/types/index.ts index 71a2db668..bc7b4e0d1 100644 --- a/web/src/types/index.ts +++ b/web/src/types/index.ts @@ -88,6 +88,7 @@ export interface Info { }; schema_url: string; schema_version: string; + 'cli-minimal-version': string; } export interface DandisetStats { diff --git a/web/src/views/DandisetLandingView/DownloadDialog.vue b/web/src/views/DandisetLandingView/DownloadDialog.vue index b3ef95374..b48a621b8 100644 --- a/web/src/views/DandisetLandingView/DownloadDialog.vue +++ b/web/src/views/DandisetLandingView/DownloadDialog.vue @@ -119,7 +119,7 @@ in a Python 3.8+ environment using command: - pip install "dandi>=0.60.0" + pip install "dandi>={{ cliMinimalVersion }}" @@ -130,10 +130,11 @@