Skip to content

Commit 4f7d154

Browse files
yarikopticclaude
andcommitted
fix: resolve lint (E402) and typing errors for dandischema compat
Move _SCHEMA_BAREASSET_HAS_DATASTANDARD guard block after all imports to fix E402. Use getattr/setattr for dataStandard access and type: ignore[call-arg] for StandardsType(version=...) to satisfy mypy against released dandischema that lacks these fields. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7170ec3 commit 4f7d154

3 files changed

Lines changed: 41 additions & 32 deletions

File tree

dandi/files/bases.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,6 @@
2121
from dandischema.models import StandardsType, get_schema_version, nwb_standard
2222
from packaging.version import Version
2323
from pydantic import ValidationError
24-
25-
# True when the installed dandischema exposes the per-asset dataStandard field
26-
# and related StandardsType enhancements (version, extensions). All these
27-
# fields ship together starting with dandischema 0.12.2.
28-
# TODO: remove this guard (and all branches that check it) once the minimum
29-
# required dandischema version is >= 0.12.2.
30-
_SCHEMA_BAREASSET_HAS_DATASTANDARD = "dataStandard" in BareAsset.model_fields
31-
if not _SCHEMA_BAREASSET_HAS_DATASTANDARD and Version(
32-
dandischema.__version__
33-
) >= Version("0.12.2"):
34-
raise RuntimeError(
35-
f"dandischema {dandischema.__version__} should have "
36-
f"'dataStandard' field on BareAsset"
37-
)
3824
from pydantic_core import ErrorDetails
3925
import requests
4026

@@ -55,6 +41,20 @@
5541
Validator,
5642
)
5743

44+
# True when the installed dandischema exposes the per-asset dataStandard field
45+
# and related StandardsType enhancements (version, extensions). All these
46+
# fields ship together starting with dandischema 0.12.2.
47+
# TODO: remove this guard (and all branches that check it) once the minimum
48+
# required dandischema version is >= 0.12.2.
49+
_SCHEMA_BAREASSET_HAS_DATASTANDARD = "dataStandard" in BareAsset.model_fields
50+
if not _SCHEMA_BAREASSET_HAS_DATASTANDARD and Version(
51+
dandischema.__version__
52+
) >= Version("0.12.2"):
53+
raise RuntimeError(
54+
f"dandischema {dandischema.__version__} should have "
55+
f"'dataStandard' field on BareAsset"
56+
)
57+
5858
lgr = dandi.get_logger()
5959

6060
# TODO -- should come from schema. This is just a simplistic example for now
@@ -534,16 +534,18 @@ def get_metadata(
534534
nwb_exts = {}
535535
if nwb_exts:
536536
kwargs["extensions"] = [
537-
StandardsType(name=name, version=ver).model_dump(
537+
StandardsType(name=name, version=ver).model_dump( # type: ignore[call-arg]
538538
mode="json", exclude_none=True
539539
)
540540
for name, ver in sorted(nwb_exts.items())
541541
]
542542
nwb = StandardsType(**kwargs)
543-
if metadata.dataStandard is None:
544-
metadata.dataStandard = [nwb]
545-
elif nwb not in metadata.dataStandard:
546-
metadata.dataStandard.append(nwb)
543+
# TODO: use metadata.dataStandard directly once min dandischema >= 0.12.2
544+
cur = getattr(metadata, "dataStandard", None)
545+
if cur is None:
546+
setattr(metadata, "dataStandard", [nwb])
547+
elif nwb not in cur:
548+
cur.append(nwb)
547549
return metadata
548550

549551
# TODO: @validate_cache.memoize_path

dandi/files/bids.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,15 @@
1818
import dandi
1919
from dandi.bids_validator_deno import bids_validate
2020

21-
from .bases import GenericAsset, LocalFileAsset, NWBAsset, _SCHEMA_BAREASSET_HAS_DATASTANDARD
21+
from .bases import (
22+
_SCHEMA_BAREASSET_HAS_DATASTANDARD,
23+
GenericAsset,
24+
LocalFileAsset,
25+
NWBAsset,
26+
)
2227

2328
if _SCHEMA_BAREASSET_HAS_DATASTANDARD:
24-
from dandischema.models import hed_standard
29+
from dandischema.models import hed_standard # type: ignore[attr-defined]
2530
else:
2631
hed_standard = None # type: ignore[assignment]
2732
from .zarr import ZarrAsset
@@ -42,7 +47,7 @@
4247

4348

4449
def _add_standard(
45-
metadata, # type: ignore[no-untyped-def]
50+
metadata: BareAsset,
4651
standard_dict: dict,
4752
version: str | None = None,
4853
) -> None:
@@ -53,10 +58,12 @@ def _add_standard(
5358
if version:
5459
kwargs["version"] = version
5560
standard = StandardsType(**kwargs)
56-
if metadata.dataStandard is None:
57-
metadata.dataStandard = [standard]
58-
elif standard not in metadata.dataStandard:
59-
metadata.dataStandard.append(standard)
61+
# TODO: use metadata.dataStandard directly once min dandischema >= 0.12.2
62+
cur = getattr(metadata, "dataStandard", None)
63+
if cur is None:
64+
setattr(metadata, "dataStandard", [standard])
65+
elif standard not in cur:
66+
cur.append(standard)
6067

6168

6269
@dataclass
@@ -260,10 +267,8 @@ def get_metadata(
260267
lib_name, lib_ver = str(entry).split(":", 1)
261268
else:
262269
lib_name, lib_ver = str(entry), None
263-
ext = StandardsType(name=lib_name, version=lib_ver)
264-
extensions.append(
265-
ext.model_dump(mode="json", exclude_none=True)
266-
)
270+
ext = StandardsType(name=lib_name, version=lib_ver) # type: ignore[call-arg]
271+
extensions.append(ext.model_dump(mode="json", exclude_none=True))
267272
if extensions:
268273
kwargs["extensions"] = extensions
269274
_add_standard(metadata, kwargs)

dandi/tests/test_files.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from ..consts import ZARR_MIME_TYPE, dandiset_metadata_file
1818
from ..dandiapi import AssetType, RemoteZarrAsset
1919
from ..exceptions import UnknownAssetError
20-
from ..files.bases import _SCHEMA_BAREASSET_HAS_DATASTANDARD
2120
from ..files import (
2221
BIDSDatasetDescriptionAsset,
2322
DandisetMetadataFile,
@@ -31,6 +30,7 @@
3130
dandi_file,
3231
find_dandi_files,
3332
)
33+
from ..files.bases import _SCHEMA_BAREASSET_HAS_DATASTANDARD
3434

3535
lgr = get_logger()
3636

@@ -684,7 +684,9 @@ def test_hed_library_schemas_as_extensions(self, tmp_path: Path) -> None:
684684
)
685685
metadata = asset.get_metadata()
686686
hed_standards = [
687-
s for s in (metadata.dataStandard or [])
687+
# TODO: use metadata.dataStandard directly once min dandischema >= 0.12.2
688+
s
689+
for s in (getattr(metadata, "dataStandard", None) or [])
688690
if s.name == "Hierarchical Event Descriptors (HED)"
689691
]
690692
assert len(hed_standards) == 1

0 commit comments

Comments
 (0)