Skip to content

Commit e66abfd

Browse files
committed
Move private dandi.files classes to _private.py
1 parent 550cc7c commit e66abfd

File tree

2 files changed

+99
-84
lines changed

2 files changed

+99
-84
lines changed

dandi/files/__init__.py

+2-84
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,14 @@
1313

1414
from collections import deque
1515
from collections.abc import Iterator
16-
from dataclasses import dataclass
17-
from enum import Enum
1816
from pathlib import Path
1917
from typing import Optional
20-
import weakref
2118

2219
from dandi import get_logger
23-
from dandi.consts import (
24-
BIDS_DATASET_DESCRIPTION,
25-
VIDEO_FILE_EXTENSIONS,
26-
ZARR_EXTENSIONS,
27-
dandiset_metadata_file,
28-
)
20+
from dandi.consts import BIDS_DATASET_DESCRIPTION, dandiset_metadata_file
2921
from dandi.exceptions import UnknownAssetError
3022

23+
from ._private import BIDSFileFactory, DandiFileFactory
3124
from .bases import (
3225
DandiFile,
3326
DandisetMetadataFile,
@@ -196,81 +189,6 @@ def dandi_file(
196189
return factory(filepath, path)
197190

198191

199-
class DandiFileType(Enum):
200-
""":meta private:"""
201-
202-
NWB = 1
203-
ZARR = 2
204-
VIDEO = 3
205-
GENERIC = 4
206-
BIDS_DATASET_DESCRIPTION = 5
207-
208-
@staticmethod
209-
def classify(path: Path) -> DandiFileType:
210-
if path.is_dir():
211-
if not any(path.iterdir()):
212-
raise UnknownAssetError("Empty directories cannot be assets")
213-
if path.suffix in ZARR_EXTENSIONS:
214-
return DandiFileType.ZARR
215-
raise UnknownAssetError(
216-
f"Directory has unrecognized suffix {path.suffix!r}"
217-
)
218-
elif path.name == BIDS_DATASET_DESCRIPTION:
219-
return DandiFileType.BIDS_DATASET_DESCRIPTION
220-
elif path.suffix == ".nwb":
221-
return DandiFileType.NWB
222-
elif path.suffix in VIDEO_FILE_EXTENSIONS:
223-
return DandiFileType.VIDEO
224-
else:
225-
return DandiFileType.GENERIC
226-
227-
228-
class DandiFileFactory:
229-
""":meta private:"""
230-
231-
CLASSES: dict[DandiFileType, type[LocalAsset]] = {
232-
DandiFileType.NWB: NWBAsset,
233-
DandiFileType.ZARR: ZarrAsset,
234-
DandiFileType.VIDEO: VideoAsset,
235-
DandiFileType.GENERIC: GenericAsset,
236-
DandiFileType.BIDS_DATASET_DESCRIPTION: BIDSDatasetDescriptionAsset,
237-
}
238-
239-
def __call__(self, filepath: Path, path: str) -> DandiFile:
240-
return self.CLASSES[DandiFileType.classify(filepath)](
241-
filepath=filepath, path=path
242-
)
243-
244-
245-
@dataclass
246-
class BIDSFileFactory(DandiFileFactory):
247-
""":meta private:"""
248-
249-
bids_dataset_description: BIDSDatasetDescriptionAsset
250-
251-
CLASSES = {
252-
DandiFileType.NWB: NWBBIDSAsset,
253-
DandiFileType.ZARR: ZarrBIDSAsset,
254-
DandiFileType.VIDEO: GenericBIDSAsset,
255-
DandiFileType.GENERIC: GenericBIDSAsset,
256-
}
257-
258-
def __call__(self, filepath: Path, path: str) -> DandiFile:
259-
ftype = DandiFileType.classify(filepath)
260-
if ftype is DandiFileType.BIDS_DATASET_DESCRIPTION:
261-
if filepath == self.bids_dataset_description.filepath:
262-
return self.bids_dataset_description
263-
else:
264-
return BIDSDatasetDescriptionAsset(filepath=filepath, path=path)
265-
df = self.CLASSES[ftype](
266-
filepath=filepath,
267-
path=path,
268-
bids_dataset_description_ref=weakref.ref(self.bids_dataset_description),
269-
)
270-
self.bids_dataset_description.dataset_files.append(df)
271-
return df
272-
273-
274192
def find_bids_dataset_description(
275193
dirpath: str | Path, dandiset_path: Optional[str | Path] = None
276194
) -> Optional[BIDSDatasetDescriptionAsset]:

dandi/files/_private.py

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
from __future__ import annotations
2+
3+
from dataclasses import dataclass
4+
from enum import Enum
5+
from pathlib import Path
6+
import weakref
7+
8+
from dandi.consts import (
9+
BIDS_DATASET_DESCRIPTION,
10+
VIDEO_FILE_EXTENSIONS,
11+
ZARR_EXTENSIONS,
12+
)
13+
from dandi.exceptions import UnknownAssetError
14+
15+
from .bases import DandiFile, GenericAsset, LocalAsset, NWBAsset, VideoAsset
16+
from .bids import (
17+
BIDSDatasetDescriptionAsset,
18+
GenericBIDSAsset,
19+
NWBBIDSAsset,
20+
ZarrBIDSAsset,
21+
)
22+
from .zarr import ZarrAsset
23+
24+
25+
class DandiFileType(Enum):
26+
""":meta private:"""
27+
28+
NWB = 1
29+
ZARR = 2
30+
VIDEO = 3
31+
GENERIC = 4
32+
BIDS_DATASET_DESCRIPTION = 5
33+
34+
@staticmethod
35+
def classify(path: Path) -> DandiFileType:
36+
if path.is_dir():
37+
if not any(path.iterdir()):
38+
raise UnknownAssetError("Empty directories cannot be assets")
39+
if path.suffix in ZARR_EXTENSIONS:
40+
return DandiFileType.ZARR
41+
raise UnknownAssetError(
42+
f"Directory has unrecognized suffix {path.suffix!r}"
43+
)
44+
elif path.name == BIDS_DATASET_DESCRIPTION:
45+
return DandiFileType.BIDS_DATASET_DESCRIPTION
46+
elif path.suffix == ".nwb":
47+
return DandiFileType.NWB
48+
elif path.suffix in VIDEO_FILE_EXTENSIONS:
49+
return DandiFileType.VIDEO
50+
else:
51+
return DandiFileType.GENERIC
52+
53+
54+
class DandiFileFactory:
55+
""":meta private:"""
56+
57+
CLASSES: dict[DandiFileType, type[LocalAsset]] = {
58+
DandiFileType.NWB: NWBAsset,
59+
DandiFileType.ZARR: ZarrAsset,
60+
DandiFileType.VIDEO: VideoAsset,
61+
DandiFileType.GENERIC: GenericAsset,
62+
DandiFileType.BIDS_DATASET_DESCRIPTION: BIDSDatasetDescriptionAsset,
63+
}
64+
65+
def __call__(self, filepath: Path, path: str) -> DandiFile:
66+
return self.CLASSES[DandiFileType.classify(filepath)](
67+
filepath=filepath, path=path
68+
)
69+
70+
71+
@dataclass
72+
class BIDSFileFactory(DandiFileFactory):
73+
""":meta private:"""
74+
75+
bids_dataset_description: BIDSDatasetDescriptionAsset
76+
77+
CLASSES = {
78+
DandiFileType.NWB: NWBBIDSAsset,
79+
DandiFileType.ZARR: ZarrBIDSAsset,
80+
DandiFileType.VIDEO: GenericBIDSAsset,
81+
DandiFileType.GENERIC: GenericBIDSAsset,
82+
}
83+
84+
def __call__(self, filepath: Path, path: str) -> DandiFile:
85+
ftype = DandiFileType.classify(filepath)
86+
if ftype is DandiFileType.BIDS_DATASET_DESCRIPTION:
87+
if filepath == self.bids_dataset_description.filepath:
88+
return self.bids_dataset_description
89+
else:
90+
return BIDSDatasetDescriptionAsset(filepath=filepath, path=path)
91+
df = self.CLASSES[ftype](
92+
filepath=filepath,
93+
path=path,
94+
bids_dataset_description_ref=weakref.ref(self.bids_dataset_description),
95+
)
96+
self.bids_dataset_description.dataset_files.append(df)
97+
return df

0 commit comments

Comments
 (0)