22from collections .abc import Callable
33from datetime import datetime
44from pathlib import Path
5+ from typing import Any , Union
56
67import anyio
78from pydantic import Field
1920class File (BaseRemoteFile ):
2021 record : CatalogFile = Field (exclude = True )
2122 type : str = "remote"
23+ dataset : Any
24+ group : Any = None
2225
2326 @property
2427 def basename (self ) -> str :
@@ -51,6 +54,7 @@ async def _download(
5154 ) -> Path :
5255 if not output :
5356 output = CACHEPATH / self .name
57+
5458 return await self .client ._download_file (
5559 self ,
5660 output ,
@@ -72,41 +76,7 @@ def _calculate():
7276 return actual_hash == self .sha256
7377
7478
75- class Group (BaseRemoteGroup ):
76- record : DatasetGroup = Field (exclude = True )
77- dataset : "Dataset" = Field (exclude = True )
78-
79- @property
80- def name (self ) -> str :
81- return self .record .name
82-
83- @property
84- def long_name (self ) -> str :
85- return (
86- self .record .group_metadata .long_name
87- if self .record .group_metadata
88- else self .name
89- )
90-
91- @property
92- def description (self ) -> str :
93- if self .record .group_metadata :
94- return self .record .group_metadata .description
95- return ""
96-
97- async def _fetch_files (self ) -> list [BaseRemoteFile ]:
98- return [
99- File (
100- path = f .path ,
101- record = f ,
102- group = self ,
103- dataset = self .dataset ,
104- )
105- for f in self .record .files
106- ]
107-
108-
109- class Dataset (BaseRemoteDataset ):
79+ class DuckDataset (BaseRemoteDataset ):
11080 record : CatalogDataset = Field (exclude = True )
11181 client : BaseRemoteClient = Field (exclude = True )
11282
@@ -133,14 +103,12 @@ def description(self) -> str:
133103 else ""
134104 )
135105
136- async def _fetch_content (
137- self ,
138- ) -> list [Group | File ]:
139- items : list [Group | File ] = []
106+ async def _fetch_content (self ) -> list [Union ["DuckGroup" , File ]]:
107+ items : list [Union ["DuckGroup" , File ]] = []
140108
141109 if self .record .groups :
142110 items .extend (
143- [Group (record = g , dataset = self ) for g in self .record .groups ],
111+ [DuckGroup (record = g , dataset = self ) for g in self .record .groups ]
144112 )
145113
146114 if self .record .files :
@@ -152,7 +120,42 @@ async def _fetch_content(
152120 dataset = self ,
153121 )
154122 for f in self .record .files
155- ],
123+ ]
156124 )
157125
158126 return items
127+
128+
129+ class DuckGroup (BaseRemoteGroup ):
130+ record : DatasetGroup = Field (exclude = True )
131+ dataset : DuckDataset = Field (exclude = True )
132+
133+ @property
134+ def name (self ) -> str :
135+ return self .record .name
136+
137+ @property
138+ def long_name (self ) -> str :
139+ return (
140+ self .record .group_metadata .long_name
141+ if self .record .group_metadata
142+ else self .name
143+ )
144+
145+ @property
146+ def description (self ) -> str :
147+ if self .record .group_metadata :
148+ return self .record .group_metadata .description
149+ return ""
150+
151+ async def _fetch_files (self ) -> list [BaseRemoteFile ]:
152+ files : list [BaseRemoteFile ] = [
153+ File (
154+ path = f .path ,
155+ record = f ,
156+ group = self ,
157+ dataset = self .dataset ,
158+ )
159+ for f in self .record .files
160+ ]
161+ return files
0 commit comments