Skip to content

Commit 9398f1f

Browse files
committed
prefixfs -> dirfs
1 parent c49b112 commit 9398f1f

File tree

4 files changed

+372
-173
lines changed

4 files changed

+372
-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

+325
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
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 fs.async_impl and 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+
@property
48+
def sep(self):
49+
return self.fs.sep
50+
51+
async def set_session(self, *args, **kwargs):
52+
return await self.fs.set_session(*args, **kwargs)
53+
54+
async def _rm_file(self, path, **kwargs):
55+
return await self.fs._rm_file(self._join(path), **kwargs)
56+
57+
def rm_file(self, path, **kwargs):
58+
return self.fs.rm_file(self._join(path), **kwargs)
59+
60+
async def _rm(self, path, *args, **kwargs):
61+
return await self.fs._rm(self._join(path), *args, **kwargs)
62+
63+
def rm(self, path, *args, **kwargs):
64+
return self.fs.rm(self._join(path), *args, **kwargs)
65+
66+
async def _cp_file(self, path1, path2, **kwargs):
67+
return await self.fs._cp_file(self._join(path1), self._join(path2), **kwargs)
68+
69+
def cp_file(self, path1, path2, **kwargs):
70+
return self.fs.cp_file(self._join(path1), self._join(path2), **kwargs)
71+
72+
async def _copy(
73+
self,
74+
path1,
75+
path2,
76+
*args,
77+
**kwargs,
78+
):
79+
return await self.fs._copy(
80+
self._join(path1),
81+
self._join(path2),
82+
*args,
83+
**kwargs,
84+
)
85+
86+
def copy(self, path1, path2, *args, **kwargs):
87+
return self.fs.copy(
88+
self._join(path1),
89+
self._join(path2),
90+
*args,
91+
**kwargs,
92+
)
93+
94+
async def _pipe(self, path, *args, **kwargs):
95+
return await self.fs._pipe(self._join(path), *args, **kwargs)
96+
97+
def pipe(self, path, *args, **kwargs):
98+
return self.fs.pipe(self._join(path), *args, **kwargs)
99+
100+
async def _cat_file(self, path, *args, **kwargs):
101+
return await self.fs._cat_file(self._join(path), *args, **kwargs)
102+
103+
def cat_file(self, path, *args, **kwargs):
104+
return self.fs.cat_file(self._join(path), *args, **kwargs)
105+
106+
async def _cat(self, path, *args, **kwargs):
107+
ret = await self.fs._cat(
108+
self._join(path),
109+
*args,
110+
**kwargs,
111+
)
112+
113+
if isinstance(ret, dict):
114+
return {self._relpath(key): value for key, value in ret.items()}
115+
116+
return ret
117+
118+
def cat(self, path, *args, **kwargs):
119+
ret = self.fs.cat(
120+
self._join(path),
121+
*args,
122+
**kwargs,
123+
)
124+
125+
if isinstance(ret, dict):
126+
return {self._relpath(key): value for key, value in ret.items()}
127+
128+
return ret
129+
130+
async def _put_file(self, lpath, rpath, **kwargs):
131+
return await self.fs._put_file(lpath, self._join(rpath), **kwargs)
132+
133+
def put_file(self, lpath, rpath, **kwargs):
134+
return self.fs.put_file(lpath, self._join(rpath), **kwargs)
135+
136+
async def _put(
137+
self,
138+
lpath,
139+
rpath,
140+
*args,
141+
**kwargs,
142+
):
143+
return await self.fs._put(
144+
lpath,
145+
self._join(rpath),
146+
*args,
147+
**kwargs,
148+
)
149+
150+
def put(self, lpath, rpath, *args, **kwargs):
151+
return self.fs.put(
152+
lpath,
153+
self._join(rpath),
154+
*args,
155+
**kwargs,
156+
)
157+
158+
async def _get_file(self, rpath, lpath, **kwargs):
159+
return await self.fs._get_file(self._join(rpath), lpath, **kwargs)
160+
161+
def get_file(self, rpath, lpath, **kwargs):
162+
return self.fs.get_file(self._join(rpath), lpath, **kwargs)
163+
164+
async def _get(self, rpath, *args, **kwargs):
165+
return await self.fs._get(self._join(rpath), *args, **kwargs)
166+
167+
def get(self, rpath, *args, **kwargs):
168+
return self.fs.get(self._join(rpath), *args, **kwargs)
169+
170+
async def _isfile(self, path):
171+
return await self.fs._isfile(self._join(path))
172+
173+
def isfile(self, path):
174+
return self.fs.isfile(self._join(path))
175+
176+
async def _isdir(self, path):
177+
return await self.fs._isdir(self._join(path))
178+
179+
def isdir(self, path):
180+
return self.fs.isdir(self._join(path))
181+
182+
async def _size(self, path):
183+
return await self.fs._size(self._join(path))
184+
185+
def size(self, path):
186+
return self.fs.size(self._join(path))
187+
188+
async def _exists(self, path):
189+
return await self.fs._exists(self._join(path))
190+
191+
def exists(self, path):
192+
return self.fs.exists(self._join(path))
193+
194+
async def _info(self, path, **kwargs):
195+
return await self.fs._info(self._join(path), **kwargs)
196+
197+
def info(self, path, **kwargs):
198+
return self.fs.info(self._join(path), **kwargs)
199+
200+
async def _ls(self, path, detail=True, **kwargs):
201+
ret = await self.fs._ls(self._join(path), detail=detail, **kwargs)
202+
if detail:
203+
for entry in ret:
204+
entry["name"] = self._relpath(entry["name"])
205+
return ret
206+
207+
return self._relpath(ret)
208+
209+
def ls(self, path, detail=True, **kwargs):
210+
ret = self.fs.ls(self._join(path), detail=detail, **kwargs)
211+
if detail:
212+
for entry in ret:
213+
entry["name"] = self._relpath(entry["name"])
214+
return ret
215+
216+
return self._relpath(ret)
217+
218+
async def _walk(self, path, *args, **kwargs):
219+
async for root, dirs, files in self.fs._walk(self._join(path), *args, **kwargs):
220+
yield self._relpath(root), dirs, files
221+
222+
def walk(self, path, *args, **kwargs):
223+
for root, dirs, files in self.fs.walk(self._join(path), *args, **kwargs):
224+
yield self._relpath(root), dirs, files
225+
226+
async def _glob(self, path, **kwargs):
227+
detail = kwargs.get("detail", False)
228+
ret = await self.fs._glob(self._join(path), **kwargs)
229+
if detail:
230+
return {self._relpath(path): info for path, info in ret.items()}
231+
return self._relpath(ret)
232+
233+
def glob(self, path, **kwargs):
234+
detail = kwargs.get("detail", False)
235+
ret = self.fs.glob(self._join(path), **kwargs)
236+
if detail:
237+
return {self._relpath(path): info for path, info in ret.items()}
238+
return self._relpath(ret)
239+
240+
async def _du(self, path, *args, **kwargs):
241+
total = kwargs.get("total", True)
242+
ret = await self.fs._du(self._join(path), *args, **kwargs)
243+
if total:
244+
return ret
245+
246+
return {self._relpath(path): size for path, size in ret.items()}
247+
248+
def du(self, path, *args, **kwargs):
249+
total = kwargs.get("total", True)
250+
ret = self.fs.du(self._join(path), *args, **kwargs)
251+
if total:
252+
return ret
253+
254+
return {self._relpath(path): size for path, size in ret.items()}
255+
256+
async def _find(self, path, *args, **kwargs):
257+
detail = kwargs.get("detail", False)
258+
ret = await self.fs._find(self._join(path), *args, **kwargs)
259+
if detail:
260+
return {self._relpath(path): info for path, info in ret.items()}
261+
return self._relpath(ret)
262+
263+
def find(self, path, *args, **kwargs):
264+
detail = kwargs.get("detail", False)
265+
ret = self.fs.find(self._join(path), *args, **kwargs)
266+
if detail:
267+
return {self._relpath(path): info for path, info in ret.items()}
268+
return self._relpath(ret)
269+
270+
async def _expand_path(self, path, *args, **kwargs):
271+
return self._relpath(
272+
await self.fs._expand_path(self._join(path), *args, **kwargs)
273+
)
274+
275+
def expand_path(self, path, *args, **kwargs):
276+
return self._relpath(self.fs.expand_path(self._join(path), *args, **kwargs))
277+
278+
async def _mkdir(self, path, *args, **kwargs):
279+
return await self.fs._mkdir(self._join(path), *args, **kwargs)
280+
281+
def mkdir(self, path, *args, **kwargs):
282+
return self.fs.mkdir(self._join(path), *args, **kwargs)
283+
284+
async def _makedirs(self, path, *args, **kwargs):
285+
return await self.fs._makedirs(self._join(path), *args, **kwargs)
286+
287+
def makedirs(self, path, *args, **kwargs):
288+
return self.fs.makedirs(self._join(path), *args, **kwargs)
289+
290+
def rmdir(self, path):
291+
return self.fs.rmdir(self._join(path))
292+
293+
def mv_file(self, path1, path2, **kwargs):
294+
return self.fs.mv_file(
295+
self._join(path1),
296+
self._join(path2),
297+
**kwargs,
298+
)
299+
300+
def touch(self, path, **kwargs):
301+
return self.fs.touch(self._join(path), **kwargs)
302+
303+
def created(self, path):
304+
return self.fs.created(self._join(path))
305+
306+
def modified(self, path):
307+
return self.fs.modified(self._join(path))
308+
309+
def sign(self, path, *args, **kwargs):
310+
return self.fs.sign(self._join(path), *args, **kwargs)
311+
312+
def __repr__(self):
313+
return f"{self.__class__.__qualname__}(path='{self.path}', fs={self.fs})"
314+
315+
def open(
316+
self,
317+
path,
318+
*args,
319+
**kwargs,
320+
):
321+
return self.fs.open(
322+
self._join(path),
323+
*args,
324+
**kwargs,
325+
)

0 commit comments

Comments
 (0)