Skip to content

Commit 88e02da

Browse files
committed
prefixfs -> dirfs
1 parent fb5e113 commit 88e02da

File tree

4 files changed

+368
-173
lines changed

4 files changed

+368
-173
lines changed

docs/source/api.rst

+3-3
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ Built-in Implementations
119119
fsspec.implementations.libarchive.LibArchiveFileSystem
120120
fsspec.implementations.dbfs.DatabricksFileSystem
121121
fsspec.implementations.reference.ReferenceFileSystem
122-
fsspec.implementations.prefix.PrefixFileSystem
122+
fsspec.implementations.dirfs.DirFileSystem
123123

124124
.. autoclass:: fsspec.implementations.ftp.FTPFileSystem
125125
:members: __init__
@@ -184,8 +184,8 @@ Built-in Implementations
184184
.. autoclass:: fsspec.implementations.reference.ReferenceFileSystem
185185
:members: __init__
186186

187-
.. autoclass:: fsspec.implementations.prefix.PrefixFileSystem
188-
:members: __init__, open
187+
.. autoclass:: fsspec.implementations.dirfs.DirFileSystem
188+
:members: __init__
189189

190190
Other Known Implementations
191191
---------------------------

fsspec/implementations/dirfs.py

+321
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
from ..asyn import AsyncFileSystem
2+
3+
4+
class DirFileSystem(AsyncFileSystem):
5+
def __init__(self, path, fs, *args, **storage_options):
6+
"""
7+
Parameters
8+
----------
9+
path: str
10+
Path to the directory.
11+
fs: AbstractFileSystem
12+
An instantiated filesystem to wrap.
13+
"""
14+
super().__init__(*args, **storage_options)
15+
16+
if self.asynchronous and not fs.async_impl:
17+
raise ValueError("can't use asynchronous with non-async fs")
18+
19+
if self.asynchronous != fs.asynchronous:
20+
raise ValueError("both dirfs and fs should be in the same sync/async mode")
21+
22+
self.path = fs._strip_protocol(path)
23+
self.fs = fs
24+
25+
def _join(self, path):
26+
if isinstance(path, str):
27+
if not self.path:
28+
return path
29+
if not path:
30+
return self.path
31+
return self.fs.sep.join((self.path, path))
32+
return [self._join(_path) for _path in path]
33+
34+
def _relpath(self, path):
35+
if isinstance(path, str):
36+
if not self.path:
37+
return path
38+
if path == self.path:
39+
return ""
40+
prefix = self.path + self.fs.sep
41+
assert path.startswith(prefix)
42+
return path[len(prefix) :]
43+
return [self._relpath(_path) for _path in path]
44+
45+
# Wrappers below
46+
47+
async def set_session(self, *args, **kwargs):
48+
return await self.fs.set_session(*args, **kwargs)
49+
50+
async def _rm_file(self, path, **kwargs):
51+
return await self.fs._rm_file(self._join(path), **kwargs)
52+
53+
def rm_file(self, path, **kwargs):
54+
return self.fs.rm_file(self._join(path), **kwargs)
55+
56+
async def _rm(self, path, *args, **kwargs):
57+
return await self.fs._rm(self._join(path), *args, **kwargs)
58+
59+
def rm(self, path, *args, **kwargs):
60+
return self.fs.rm(self._join(path), *args, **kwargs)
61+
62+
async def _cp_file(self, path1, path2, **kwargs):
63+
return await self.fs._cp_file(self._join(path1), self._join(path2), **kwargs)
64+
65+
def cp_file(self, path1, path2, **kwargs):
66+
return self.fs.cp_file(self._join(path1), self._join(path2), **kwargs)
67+
68+
async def _copy(
69+
self,
70+
path1,
71+
path2,
72+
*args,
73+
**kwargs,
74+
):
75+
return await self.fs._copy(
76+
self._join(path1),
77+
self._join(path2),
78+
*args,
79+
**kwargs,
80+
)
81+
82+
def copy(self, path1, path2, *args, **kwargs):
83+
return self.fs.copy(
84+
self._join(path1),
85+
self._join(path2),
86+
*args,
87+
**kwargs,
88+
)
89+
90+
async def _pipe(self, path, *args, **kwargs):
91+
return await self.fs._pipe(self._join(path), *args, **kwargs)
92+
93+
def pipe(self, path, *args, **kwargs):
94+
return self.fs.pipe(self._join(path), *args, **kwargs)
95+
96+
async def _cat_file(self, path, *args, **kwargs):
97+
return await self.fs._cat_file(self._join(path), *args, **kwargs)
98+
99+
def cat_file(self, path, *args, **kwargs):
100+
return self.fs.cat_file(self._join(path), *args, **kwargs)
101+
102+
async def _cat(self, path, *args, **kwargs):
103+
ret = await self.fs._cat(
104+
self._join(path),
105+
*args,
106+
**kwargs,
107+
)
108+
109+
if isinstance(ret, dict):
110+
return {self._relpath(key): value for key, value in ret.items()}
111+
112+
return ret
113+
114+
def cat(self, path, *args, **kwargs):
115+
ret = self.fs.cat(
116+
self._join(path),
117+
*args,
118+
**kwargs,
119+
)
120+
121+
if isinstance(ret, dict):
122+
return {self._relpath(key): value for key, value in ret.items()}
123+
124+
return ret
125+
126+
async def _put_file(self, lpath, rpath, **kwargs):
127+
return await self.fs._put_file(lpath, self._join(rpath), **kwargs)
128+
129+
def put_file(self, lpath, rpath, **kwargs):
130+
return self.fs.put_file(lpath, self._join(rpath), **kwargs)
131+
132+
async def _put(
133+
self,
134+
lpath,
135+
rpath,
136+
*args,
137+
**kwargs,
138+
):
139+
return await self.fs._put(
140+
lpath,
141+
self._join(rpath),
142+
*args,
143+
**kwargs,
144+
)
145+
146+
def put(self, lpath, rpath, *args, **kwargs):
147+
return self.fs.put(
148+
lpath,
149+
self._join(rpath),
150+
*args,
151+
**kwargs,
152+
)
153+
154+
async def _get_file(self, rpath, lpath, **kwargs):
155+
return await self.fs._get_file(self._join(rpath), lpath, **kwargs)
156+
157+
def get_file(self, rpath, lpath, **kwargs):
158+
return self.fs.get_file(self._join(rpath), lpath, **kwargs)
159+
160+
async def _get(self, rpath, *args, **kwargs):
161+
return await self.fs._get(self._join(rpath), *args, **kwargs)
162+
163+
def get(self, rpath, *args, **kwargs):
164+
return self.fs.get(self._join(rpath), *args, **kwargs)
165+
166+
async def _isfile(self, path):
167+
return await self.fs._isfile(self._join(path))
168+
169+
def isfile(self, path):
170+
return self.fs.isfile(self._join(path))
171+
172+
async def _isdir(self, path):
173+
return await self.fs._isdir(self._join(path))
174+
175+
def isdir(self, path):
176+
return self.fs.isdir(self._join(path))
177+
178+
async def _size(self, path):
179+
return await self.fs._size(self._join(path))
180+
181+
def size(self, path):
182+
return self.fs.size(self._join(path))
183+
184+
async def _exists(self, path):
185+
return await self.fs._exists(self._join(path))
186+
187+
def exists(self, path):
188+
return self.fs.exists(self._join(path))
189+
190+
async def _info(self, path, **kwargs):
191+
return await self.fs._info(self._join(path), **kwargs)
192+
193+
def info(self, path, **kwargs):
194+
return self.fs.info(self._join(path), **kwargs)
195+
196+
async def _ls(self, path, detail=True, **kwargs):
197+
ret = await self.fs._ls(self._join(path), detail=detail, **kwargs)
198+
if detail:
199+
for entry in ret:
200+
entry["name"] = self._relpath(entry["name"])
201+
return ret
202+
203+
return self._relpath(ret)
204+
205+
def ls(self, path, detail=True, **kwargs):
206+
ret = self.fs.ls(self._join(path), detail=detail, **kwargs)
207+
if detail:
208+
for entry in ret:
209+
entry["name"] = self._relpath(entry["name"])
210+
return ret
211+
212+
return self._relpath(ret)
213+
214+
async def _walk(self, path, *args, **kwargs):
215+
async for root, dirs, files in self.fs._walk(self._join(path), *args, **kwargs):
216+
yield self._relpath(root), dirs, files
217+
218+
def walk(self, path, *args, **kwargs):
219+
for root, dirs, files in self.fs.walk(self._join(path), *args, **kwargs):
220+
yield self._relpath(root), dirs, files
221+
222+
async def _glob(self, path, **kwargs):
223+
detail = kwargs.get("detail", False)
224+
ret = await self.fs._glob(self._join(path), **kwargs)
225+
if detail:
226+
return {self._relpath(path): info for path, info in ret.items()}
227+
return self._relpath(ret)
228+
229+
def glob(self, path, **kwargs):
230+
detail = kwargs.get("detail", False)
231+
ret = self.fs.glob(self._join(path), **kwargs)
232+
if detail:
233+
return {self._relpath(path): info for path, info in ret.items()}
234+
return self._relpath(ret)
235+
236+
async def _du(self, path, *args, **kwargs):
237+
total = kwargs.get("total", True)
238+
ret = await self.fs._du(self._join(path), *args, **kwargs)
239+
if total:
240+
return ret
241+
242+
return {self._relpath(path): size for path, size in ret.items()}
243+
244+
def du(self, path, *args, **kwargs):
245+
total = kwargs.get("total", True)
246+
ret = self.fs.du(self._join(path), *args, **kwargs)
247+
if total:
248+
return ret
249+
250+
return {self._relpath(path): size for path, size in ret.items()}
251+
252+
async def _find(self, path, *args, **kwargs):
253+
detail = kwargs.get("detail", False)
254+
ret = await self.fs._find(self._join(path), *args, **kwargs)
255+
if detail:
256+
return {self._relpath(path): info for path, info in ret.items()}
257+
return self._relpath(ret)
258+
259+
def find(self, path, *args, **kwargs):
260+
detail = kwargs.get("detail", False)
261+
ret = self.fs.find(self._join(path), *args, **kwargs)
262+
if detail:
263+
return {self._relpath(path): info for path, info in ret.items()}
264+
return self._relpath(ret)
265+
266+
async def _expand_path(self, path, *args, **kwargs):
267+
return self._relpath(
268+
await self.fs._expand_path(self._join(path), *args, **kwargs)
269+
)
270+
271+
def expand_path(self, path, *args, **kwargs):
272+
return self._relpath(self.fs.expand_path(self._join(path), *args, **kwargs))
273+
274+
async def _mkdir(self, path, *args, **kwargs):
275+
return await self.fs._mkdir(self._join(path), *args, **kwargs)
276+
277+
def mkdir(self, path, *args, **kwargs):
278+
return self.fs.mkdir(self._join(path), *args, **kwargs)
279+
280+
async def _makedirs(self, path, *args, **kwargs):
281+
return await self.fs._makedirs(self._join(path), *args, **kwargs)
282+
283+
def makedirs(self, path, *args, **kwargs):
284+
return self.fs.makedirs(self._join(path), *args, **kwargs)
285+
286+
def rmdir(self, path):
287+
return self.fs.rmdir(self._join(path))
288+
289+
def mv_file(self, path1, path2, **kwargs):
290+
return self.fs.mv_file(
291+
self._join(path1),
292+
self._join(path2),
293+
**kwargs,
294+
)
295+
296+
def touch(self, path, **kwargs):
297+
return self.fs.touch(self._join(path), **kwargs)
298+
299+
def created(self, path):
300+
return self.fs.created(self._join(path))
301+
302+
def modified(self, path):
303+
return self.fs.modified(self._join(path))
304+
305+
def sign(self, path, *args, **kwargs):
306+
return self.fs.sign(self._join(path), *args, **kwargs)
307+
308+
def __repr__(self):
309+
return f"{self.__class__.__qualname__}(path='{self.path}', fs={self.fs})"
310+
311+
def open(
312+
self,
313+
path,
314+
*args,
315+
**kwargs,
316+
):
317+
return self.fs.open(
318+
self._join(path),
319+
*args,
320+
**kwargs,
321+
)

0 commit comments

Comments
 (0)