fsspec 2024.9.0__py3-none-any.whl → 2024.10.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
fsspec/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2024.9.0'
16
- __version_tuple__ = version_tuple = (2024, 9, 0)
15
+ __version__ = version = '2024.10.0'
16
+ __version_tuple__ = version_tuple = (2024, 10, 0)
fsspec/asyn.py CHANGED
@@ -344,6 +344,10 @@ class AsyncFileSystem(AbstractFileSystem):
344
344
  async def _cp_file(self, path1, path2, **kwargs):
345
345
  raise NotImplementedError
346
346
 
347
+ async def _mv_file(self, path1, path2):
348
+ await self._cp_file(path1, path2)
349
+ await self._rm_file(path1)
350
+
347
351
  async def _copy(
348
352
  self,
349
353
  path1,
fsspec/core.py CHANGED
@@ -346,7 +346,10 @@ def _un_chain(path, kwargs):
346
346
  kws = kwargs.pop(protocol, {})
347
347
  if bit is bits[0]:
348
348
  kws.update(kwargs)
349
- kw = dict(**extra_kwargs, **kws)
349
+ kw = dict(
350
+ **{k: v for k, v in extra_kwargs.items() if k not in kws or v != kws[k]},
351
+ **kws,
352
+ )
350
353
  bit = cls._strip_protocol(bit)
351
354
  if (
352
355
  protocol in {"blockcache", "filecache", "simplecache"}
@@ -578,7 +581,7 @@ def expand_paths_if_needed(paths, mode, num, fs, name_function):
578
581
  paths = list(paths)
579
582
 
580
583
  if "w" in mode: # read mode
581
- if sum([1 for p in paths if "*" in p]) > 1:
584
+ if sum(1 for p in paths if "*" in p) > 1:
582
585
  raise ValueError(
583
586
  "When writing data, only one filename mask can be specified."
584
587
  )
@@ -370,3 +370,15 @@ class DirFileSystem(AsyncFileSystem):
370
370
  *args,
371
371
  **kwargs,
372
372
  )
373
+
374
+ async def open_async(
375
+ self,
376
+ path,
377
+ *args,
378
+ **kwargs,
379
+ ):
380
+ return await self.fs.open_async(
381
+ self._join(path),
382
+ *args,
383
+ **kwargs,
384
+ )
@@ -55,6 +55,8 @@ class GitFileSystem(AbstractFileSystem):
55
55
  tree = comm.tree
56
56
  for part in parts:
57
57
  if part and isinstance(tree, pygit2.Tree):
58
+ if part not in tree:
59
+ raise FileNotFoundError(path)
58
60
  tree = tree[part]
59
61
  return tree
60
62
 
@@ -69,46 +71,32 @@ class GitFileSystem(AbstractFileSystem):
69
71
  out["ref"], path = path.split("@", 1)
70
72
  return out
71
73
 
74
+ @staticmethod
75
+ def _object_to_info(obj, path=None):
76
+ # obj.name and obj.filemode are None for the root tree!
77
+ is_dir = isinstance(obj, pygit2.Tree)
78
+ return {
79
+ "type": "directory" if is_dir else "file",
80
+ "name": (
81
+ "/".join([path, obj.name or ""]).lstrip("/") if path else obj.name
82
+ ),
83
+ "hex": str(obj.id),
84
+ "mode": "100644" if obj.filemode is None else f"{obj.filemode:o}",
85
+ "size": 0 if is_dir else obj.size,
86
+ }
87
+
72
88
  def ls(self, path, detail=True, ref=None, **kwargs):
73
- path = self._strip_protocol(path)
74
- tree = self._path_to_object(path, ref)
75
- if isinstance(tree, pygit2.Tree):
76
- out = []
77
- for obj in tree:
78
- if isinstance(obj, pygit2.Tree):
79
- out.append(
80
- {
81
- "type": "directory",
82
- "name": "/".join([path, obj.name]).lstrip("/"),
83
- "hex": obj.hex,
84
- "mode": f"{obj.filemode:o}",
85
- "size": 0,
86
- }
87
- )
88
- else:
89
- out.append(
90
- {
91
- "type": "file",
92
- "name": "/".join([path, obj.name]).lstrip("/"),
93
- "hex": obj.hex,
94
- "mode": f"{obj.filemode:o}",
95
- "size": obj.size,
96
- }
97
- )
98
- else:
99
- obj = tree
100
- out = [
101
- {
102
- "type": "file",
103
- "name": obj.name,
104
- "hex": obj.hex,
105
- "mode": f"{obj.filemode:o}",
106
- "size": obj.size,
107
- }
108
- ]
109
- if detail:
110
- return out
111
- return [o["name"] for o in out]
89
+ tree = self._path_to_object(self._strip_protocol(path), ref)
90
+ return [
91
+ GitFileSystem._object_to_info(obj, path)
92
+ if detail
93
+ else GitFileSystem._object_to_info(obj, path)["name"]
94
+ for obj in (tree if isinstance(tree, pygit2.Tree) else [tree])
95
+ ]
96
+
97
+ def info(self, path, ref=None, **kwargs):
98
+ tree = self._path_to_object(self._strip_protocol(path), ref)
99
+ return GitFileSystem._object_to_info(tree, path)
112
100
 
113
101
  def ukey(self, path, ref=None):
114
102
  return self.info(path, ref=ref)["hex"]
@@ -358,9 +358,10 @@ class HTTPFileSystem(AsyncFileSystem):
358
358
  kw = self.kwargs.copy()
359
359
  kw["asynchronous"] = self.asynchronous
360
360
  kw.update(kwargs)
361
- size = size or self.info(path, **kwargs)["size"]
361
+ info = {}
362
+ size = size or info.update(self.info(path, **kwargs)) or info["size"]
362
363
  session = sync(self.loop, self.set_session)
363
- if block_size and size:
364
+ if block_size and size and info.get("partial", True):
364
365
  return HTTPFile(
365
366
  self,
366
367
  path,
@@ -520,9 +521,9 @@ class HTTPFileSystem(AsyncFileSystem):
520
521
 
521
522
  class HTTPFile(AbstractBufferedFile):
522
523
  """
523
- A file-like object pointing to a remove HTTP(S) resource
524
+ A file-like object pointing to a remote HTTP(S) resource
524
525
 
525
- Supports only reading, with read-ahead of a predermined block-size.
526
+ Supports only reading, with read-ahead of a predetermined block-size.
526
527
 
527
528
  In the case that the server does not supply the filesize, only reading of
528
529
  the complete file in one go is supported.
@@ -835,10 +836,6 @@ async def _file_info(url, session, size_policy="head", **kwargs):
835
836
  async with r:
836
837
  r.raise_for_status()
837
838
 
838
- # TODO:
839
- # recognise lack of 'Accept-Ranges',
840
- # or 'Accept-Ranges': 'none' (not 'bytes')
841
- # to mean streaming only, no random access => return None
842
839
  if "Content-Length" in r.headers:
843
840
  # Some servers may choose to ignore Accept-Encoding and return
844
841
  # compressed content, in which case the returned size is unreliable.
@@ -853,6 +850,11 @@ async def _file_info(url, session, size_policy="head", **kwargs):
853
850
  if "Content-Type" in r.headers:
854
851
  info["mimetype"] = r.headers["Content-Type"].partition(";")[0]
855
852
 
853
+ if r.headers.get("Accept-Ranges") == "none":
854
+ # Some servers may explicitly discourage partial content requests, but
855
+ # the lack of "Accept-Ranges" does not always indicate they would fail
856
+ info["partial"] = False
857
+
856
858
  info["url"] = str(r.url)
857
859
 
858
860
  for checksum_field in ["ETag", "Content-MD5", "Digest"]:
@@ -248,6 +248,10 @@ class MemoryFileSystem(AbstractFileSystem):
248
248
  except KeyError as e:
249
249
  raise FileNotFoundError(path) from e
250
250
 
251
+ def isfile(self, path):
252
+ path = self._strip_protocol(path)
253
+ return path in self.store
254
+
251
255
  def rm(self, path, recursive=False, maxdepth=None):
252
256
  if isinstance(path, str):
253
257
  path = self._strip_protocol(path)
@@ -255,14 +259,14 @@ class MemoryFileSystem(AbstractFileSystem):
255
259
  path = [self._strip_protocol(p) for p in path]
256
260
  paths = self.expand_path(path, recursive=recursive, maxdepth=maxdepth)
257
261
  for p in reversed(paths):
262
+ if self.isfile(p):
263
+ self.rm_file(p)
258
264
  # If the expanded path doesn't exist, it is only because the expanded
259
265
  # path was a directory that does not exist in self.pseudo_dirs. This
260
266
  # is possible if you directly create files without making the
261
267
  # directories first.
262
- if not self.exists(p):
268
+ elif not self.exists(p):
263
269
  continue
264
- if self.isfile(p):
265
- self.rm_file(p)
266
270
  else:
267
271
  self.rmdir(p)
268
272
 
@@ -7,7 +7,7 @@ import math
7
7
  import os
8
8
  from itertools import chain
9
9
  from functools import lru_cache
10
- from typing import TYPE_CHECKING
10
+ from typing import TYPE_CHECKING, Literal
11
11
 
12
12
  import fsspec.core
13
13
 
@@ -104,7 +104,13 @@ class LazyReferenceMapper(collections.abc.MutableMapping):
104
104
  return pd
105
105
 
106
106
  def __init__(
107
- self, root, fs=None, out_root=None, cache_size=128, categorical_threshold=10
107
+ self,
108
+ root,
109
+ fs=None,
110
+ out_root=None,
111
+ cache_size=128,
112
+ categorical_threshold=10,
113
+ engine: Literal["fastparquet", "pyarrow"] = "fastparquet",
108
114
  ):
109
115
  """
110
116
 
@@ -126,16 +132,25 @@ class LazyReferenceMapper(collections.abc.MutableMapping):
126
132
  Encode urls as pandas.Categorical to reduce memory footprint if the ratio
127
133
  of the number of unique urls to total number of refs for each variable
128
134
  is greater than or equal to this number. (default 10)
135
+ engine: Literal["fastparquet","pyarrow"]
136
+ Engine choice for reading parquet files. (default is "fastparquet")
129
137
  """
138
+
130
139
  self.root = root
131
140
  self.chunk_sizes = {}
132
141
  self.out_root = out_root or self.root
133
142
  self.cat_thresh = categorical_threshold
143
+ self.engine = engine
134
144
  self.cache_size = cache_size
135
145
  self.url = self.root + "/{field}/refs.{record}.parq"
136
146
  # TODO: derive fs from `root`
137
147
  self.fs = fsspec.filesystem("file") if fs is None else fs
138
148
 
149
+ from importlib.util import find_spec
150
+
151
+ if self.engine == "pyarrow" and find_spec("pyarrow") is None:
152
+ raise ImportError("engine choice `pyarrow` is not installed.")
153
+
139
154
  def __getattr__(self, item):
140
155
  if item in ("_items", "record_size", "zmetadata"):
141
156
  self.setup()
@@ -158,7 +173,7 @@ class LazyReferenceMapper(collections.abc.MutableMapping):
158
173
  """cached parquet file loader"""
159
174
  path = self.url.format(field=field, record=record)
160
175
  data = io.BytesIO(self.fs.cat_file(path))
161
- df = self.pd.read_parquet(data, engine="fastparquet")
176
+ df = self.pd.read_parquet(data, engine=self.engine)
162
177
  refs = {c: df[c].to_numpy() for c in df.columns}
163
178
  return refs
164
179
 
@@ -463,18 +478,28 @@ class LazyReferenceMapper(collections.abc.MutableMapping):
463
478
 
464
479
  fn = f"{base_url or self.out_root}/{field}/refs.{record}.parq"
465
480
  self.fs.mkdirs(f"{base_url or self.out_root}/{field}", exist_ok=True)
481
+
482
+ if self.engine == "pyarrow":
483
+ df_backend_kwargs = {"write_statistics": False}
484
+ elif self.engine == "fastparquet":
485
+ df_backend_kwargs = {
486
+ "stats": False,
487
+ "object_encoding": object_encoding,
488
+ "has_nulls": has_nulls,
489
+ }
490
+ else:
491
+ raise NotImplementedError(f"{self.engine} not supported")
492
+
466
493
  df.to_parquet(
467
494
  fn,
468
- engine="fastparquet",
495
+ engine=self.engine,
469
496
  storage_options=storage_options
470
497
  or getattr(self.fs, "storage_options", None),
471
498
  compression="zstd",
472
499
  index=False,
473
- stats=False,
474
- object_encoding=object_encoding,
475
- has_nulls=has_nulls,
476
- # **kwargs,
500
+ **df_backend_kwargs,
477
501
  )
502
+
478
503
  partition.clear()
479
504
  self._items.pop((field, record))
480
505
 
@@ -486,6 +511,7 @@ class LazyReferenceMapper(collections.abc.MutableMapping):
486
511
  base_url: str
487
512
  Location of the output
488
513
  """
514
+
489
515
  # write what we have so far and clear sub chunks
490
516
  for thing in list(self._items):
491
517
  if isinstance(thing, tuple):
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import zipfile
2
3
 
3
4
  import fsspec
@@ -48,7 +49,7 @@ class ZipFileSystem(AbstractArchiveFileSystem):
48
49
  if mode not in set("rwa"):
49
50
  raise ValueError(f"mode '{mode}' no understood")
50
51
  self.mode = mode
51
- if isinstance(fo, str):
52
+ if isinstance(fo, (str, os.PathLike)):
52
53
  if mode == "a":
53
54
  m = "r+b"
54
55
  else:
fsspec/spec.py CHANGED
@@ -428,11 +428,9 @@ class AbstractFileSystem(metaclass=_Cached):
428
428
  except (FileNotFoundError, OSError) as e:
429
429
  if on_error == "raise":
430
430
  raise
431
- elif callable(on_error):
431
+ if callable(on_error):
432
432
  on_error(e)
433
- if detail:
434
- return path, {}, {}
435
- return path, [], []
433
+ return
436
434
 
437
435
  for info in listing:
438
436
  # each info name must be at least [path]/part , but here
@@ -650,7 +648,7 @@ class AbstractFileSystem(metaclass=_Cached):
650
648
  Returns a single dictionary, with exactly the same information as ``ls``
651
649
  would with ``detail=True``.
652
650
 
653
- The default implementation should calls ls and could be overridden by a
651
+ The default implementation calls ls and could be overridden by a
654
652
  shortcut. kwargs are passed on to ```ls()``.
655
653
 
656
654
  Some file systems might not be able to measure the file's size, in
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fsspec
3
- Version: 2024.9.0
3
+ Version: 2024.10.0
4
4
  Summary: File-system specification
5
5
  Project-URL: Changelog, https://filesystem-spec.readthedocs.io/en/latest/changelog.html
6
6
  Project-URL: Documentation, https://filesystem-spec.readthedocs.io/en/latest/
@@ -1,13 +1,13 @@
1
1
  fsspec/__init__.py,sha256=l9MJaNNV2d4wKpCtMvXDr55n92DkdrAayGy3F9ICjzk,1998
2
- fsspec/_version.py,sha256=1O0P6wbwqtkyltAT0n4UISDOJbtOp9uOwvifb7ASk-U,417
2
+ fsspec/_version.py,sha256=TRFHcujqz6-GeA85-A44TpoeoMj1E4TmW_pLohsSakA,419
3
3
  fsspec/archive.py,sha256=S__DzfZj-urAN3tp2W6jJ6YDiXG1fAl7FjvWUN73qIE,2386
4
- fsspec/asyn.py,sha256=MTe85f2Rmvwg-uhZbckpU_GemYYYSZ3AAj8Et9CCgmk,36390
4
+ fsspec/asyn.py,sha256=KUi-txo8VDtMUbrgEOu7i6tnJzMPTR2XHU0u70t7nCY,36512
5
5
  fsspec/caching.py,sha256=x6IEdxtR3cMDjy40sNHyawR2SLtNSahVuP5i_TImdso,31600
6
6
  fsspec/callbacks.py,sha256=BDIwLzK6rr_0V5ch557fSzsivCElpdqhXr5dZ9Te-EE,9210
7
7
  fsspec/compression.py,sha256=jCSUMJu-zSNyrusnHT0wKXgOd1tTJR6vM126i5SR5Zc,4865
8
8
  fsspec/config.py,sha256=LF4Zmu1vhJW7Je9Q-cwkRc3xP7Rhyy7Xnwj26Z6sv2g,4279
9
9
  fsspec/conftest.py,sha256=fVfx-NLrH_OZS1TIpYNoPzM7efEcMoL62reHOdYeFCA,1245
10
- fsspec/core.py,sha256=299qCp0H3w3e6zbiK5YOm3pJjxuPr4IYcK6Yg1Zgcos,23684
10
+ fsspec/core.py,sha256=pXNmJ0qgMO-BTOKPoPWkBdeScXdrKJZ2gjOtdK8x0b0,23775
11
11
  fsspec/dircache.py,sha256=YzogWJrhEastHU7vWz-cJiJ7sdtLXFXhEpInGKd4EcM,2717
12
12
  fsspec/exceptions.py,sha256=pauSLDMxzTJMOjvX1WEUK0cMyFkrFxpWJsyFywav7A8,331
13
13
  fsspec/fuse.py,sha256=Q-3NOOyLqBfYa4Db5E19z_ZY36zzYHtIs1mOUasItBQ,10177
@@ -17,7 +17,7 @@ fsspec/json.py,sha256=65sQ0Y7mTj33u_Y4IId5up4abQ3bAel4E4QzbKMiQSg,3826
17
17
  fsspec/mapping.py,sha256=CtD_GEmyYgXefQHndkxu7Zb_kbTS3mlFP2zIwlAoQTY,8289
18
18
  fsspec/parquet.py,sha256=ONG29Enesp0ToCH2bQ7zkpimnVIsZ2S4xCLj35-fY78,19455
19
19
  fsspec/registry.py,sha256=HVC-4HWDZnA6rycJwAu8F8ZXzON_85MTQVIyS6LOHxo,11320
20
- fsspec/spec.py,sha256=A48RUDL50AwSOGB1VT114GC1TY93SGlr3fkBO1Yp0Fk,69572
20
+ fsspec/spec.py,sha256=7RkKPudVJnBJ1zfM6SCPwovsQyPxvt3hXkI7rpZMePk,69491
21
21
  fsspec/transaction.py,sha256=xliRG6U2Zf3khG4xcw9WiB-yAoqJSHEGK_VjHOdtgo0,2398
22
22
  fsspec/utils.py,sha256=dVaokocjhMOnO3B1KmKlgxYqojQJyzb3mgIfaAaz8Pk,22941
23
23
  fsspec/implementations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -28,28 +28,28 @@ fsspec/implementations/cached.py,sha256=t5atYATgjuABm-mUyReqjGqVyyP1XBSuROX92aMe
28
28
  fsspec/implementations/dask.py,sha256=CXZbJzIVOhKV8ILcxuy3bTvcacCueAbyQxmvAkbPkrk,4466
29
29
  fsspec/implementations/data.py,sha256=LDLczxRh8h7x39Zjrd-GgzdQHr78yYxDlrv2C9Uxb5E,1658
30
30
  fsspec/implementations/dbfs.py,sha256=a0eNjLxyfFK7pbEa52U8K-PhNHukzdGVx1eLcVniaXY,15092
31
- fsspec/implementations/dirfs.py,sha256=VPSJhy2wFZodY5BB-o1tkWGYecvU2EmbgubmX3lOwuw,11815
31
+ fsspec/implementations/dirfs.py,sha256=ymakitNNQ07tW76EShyw3rC9RvIDHl4gtuOhE_h1vUg,12032
32
32
  fsspec/implementations/ftp.py,sha256=VpJWnQscdEKRu4fzkCtuf3jD9A74mBaerS2ijUwZ-_I,11936
33
- fsspec/implementations/git.py,sha256=vKGI-Vd5q4H2RrvhebkPc9NwlfkZ980OUGhebeCw-M0,4034
33
+ fsspec/implementations/git.py,sha256=4SElW9U5d3k3_ITlvUAx59Yk7XLNRTqkGa2C3hCUkWM,3754
34
34
  fsspec/implementations/github.py,sha256=eAn1kJ7VeWR6gVoVRLBYclF_rQDXSJU-xzMXpvPQWqs,8002
35
- fsspec/implementations/http.py,sha256=BjDJ72IoUCe_EHKc44J__sy8VHCOdc98gVEq27sWUk8,29695
35
+ fsspec/implementations/http.py,sha256=RLklsE1WG0eQ271haPRA_4Fz4q3wfnz5n4LifH447Eg,29826
36
36
  fsspec/implementations/jupyter.py,sha256=B2uj7OEm7yIk-vRSsO37_ND0t0EBvn4B-Su43ibN4Pg,3811
37
37
  fsspec/implementations/libarchive.py,sha256=5_I2DiLXwQ1JC8x-K7jXu-tBwhO9dj7tFLnb0bTnVMQ,7102
38
38
  fsspec/implementations/local.py,sha256=DNBZhF9LYYTPR4PKedeWuk32Tztc9jlgXtGRFGX7nv4,15103
39
- fsspec/implementations/memory.py,sha256=-0AedWR-jBaw2zamEuL4ku73lJQwRdp-Muia0u1j6pU,10170
40
- fsspec/implementations/reference.py,sha256=43lG6cq9GP0JfMv_n_CyPznRcpEaWAaxG-rgeZt9BV4,44375
39
+ fsspec/implementations/memory.py,sha256=Z-eADtiIQ5_rhhPzX3t-NQVmWCsRtnxKuN-dTWKzrnM,10277
40
+ fsspec/implementations/reference.py,sha256=FxQ20HcV8SMB6DpHW33hpVOOsy8S_2xcVtDJRCtZ9rQ,45145
41
41
  fsspec/implementations/sftp.py,sha256=fMY9XZcmpjszQ2tCqO_TPaJesaeD_Dv7ptYzgUPGoO0,5631
42
42
  fsspec/implementations/smb.py,sha256=5fhu8h06nOLBPh2c48aT7WBRqh9cEcbIwtyu06wTjec,15236
43
43
  fsspec/implementations/tar.py,sha256=dam78Tp_CozybNqCY2JYgGBS3Uc9FuJUAT9oB0lolOs,4111
44
44
  fsspec/implementations/webhdfs.py,sha256=aet-AOfMoK91C3jNu5xBxK0Mu2iaAWiL9Xfu12KyjQI,16705
45
- fsspec/implementations/zip.py,sha256=XoRukvrnJWngLbE8Exp2XCVf3SgSPmOqdeCqQ3NpSr0,6047
45
+ fsspec/implementations/zip.py,sha256=9LBMHPft2OutJl2Ft-r9u_z3GptLkc2n91ur2A3bCbg,6072
46
46
  fsspec/tests/abstract/__init__.py,sha256=o3rQBCeTTTdji0OxKdTvBvwL7q78sEIh5J5-Q-If6z0,10046
47
47
  fsspec/tests/abstract/common.py,sha256=1GQwNo5AONzAnzZj0fWgn8NJPLXALehbsuGxS3FzWVU,4973
48
48
  fsspec/tests/abstract/copy.py,sha256=gU5-d97U3RSde35Vp4RxPY4rWwL744HiSrJ8IBOp9-8,19967
49
49
  fsspec/tests/abstract/get.py,sha256=vNR4HztvTR7Cj56AMo7_tx7TeYz1Jgr_2Wb8Lv-UiBY,20755
50
50
  fsspec/tests/abstract/mv.py,sha256=k8eUEBIrRrGMsBY5OOaDXdGnQUKGwDIfQyduB6YD3Ns,1982
51
51
  fsspec/tests/abstract/put.py,sha256=7aih17OKB_IZZh1Mkq1eBDIjobhtMQmI8x-Pw-S_aZk,21201
52
- fsspec-2024.9.0.dist-info/METADATA,sha256=Jgjl4t19VdvyQ81LzLYeXagQpe2Om5QJDQ4nDfKdGbc,11749
53
- fsspec-2024.9.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
54
- fsspec-2024.9.0.dist-info/licenses/LICENSE,sha256=LcNUls5TpzB5FcAIqESq1T53K0mzTN0ARFBnaRQH7JQ,1513
55
- fsspec-2024.9.0.dist-info/RECORD,,
52
+ fsspec-2024.10.0.dist-info/METADATA,sha256=l8HZ_K6qpTaPGBm3jOSHa1DX6Gja2hM3t5yBrdkmv7E,11750
53
+ fsspec-2024.10.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
54
+ fsspec-2024.10.0.dist-info/licenses/LICENSE,sha256=LcNUls5TpzB5FcAIqESq1T53K0mzTN0ARFBnaRQH7JQ,1513
55
+ fsspec-2024.10.0.dist-info/RECORD,,