fsspec 2025.12.0__tar.gz → 2026.1.0__tar.gz
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-2025.12.0 → fsspec-2026.1.0}/PKG-INFO +4 -4
- {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-friends.yml +1 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/api.rst +8 -2
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/changelog.rst +20 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/features.rst +1 -1
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/_version.py +2 -2
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/compression.py +7 -18
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/ftp.py +54 -4
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/local.py +4 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/registry.py +1 -1
- {fsspec-2025.12.0 → fsspec-2026.1.0}/pyproject.toml +3 -3
- {fsspec-2025.12.0 → fsspec-2026.1.0}/.codespellrc +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/.coveragerc +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/.gitattributes +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/.github/workflows/main.yaml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/.github/workflows/pypipublish.yaml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/.gitignore +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/.pre-commit-config.yaml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/LICENSE +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/README.md +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-downstream.yml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-linux.yml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-win.yml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/Makefile +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/README.md +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/environment.yml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/make.bat +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/_static/custom.css +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/async.rst +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/code-of-conduct.rst +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/conf.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/copying.rst +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/developer.rst +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/img/gui.png +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/index.rst +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/intro.rst +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/usage.rst +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/__init__.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/archive.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/asyn.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/caching.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/callbacks.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/config.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/conftest.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/core.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/dircache.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/exceptions.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/fuse.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/generic.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/gui.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/__init__.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/arrow.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/asyn_wrapper.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/cache_mapper.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/cache_metadata.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/cached.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/chained.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/dask.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/data.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/dbfs.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/dirfs.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/gist.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/git.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/github.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/http.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/http_sync.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/jupyter.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/libarchive.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/memory.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/reference.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/sftp.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/smb.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/tar.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/webhdfs.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/zip.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/json.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/mapping.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/parquet.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/spec.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/__init__.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/common.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/copy.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/get.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/mv.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/open.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/pipe.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/put.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/transaction.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/utils.py +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/install_s3fs.sh +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/readthedocs.yml +0 -0
- {fsspec-2025.12.0 → fsspec-2026.1.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fsspec
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2026.1.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/
|
|
@@ -49,7 +49,7 @@ Requires-Dist: distributed; extra == 'full'
|
|
|
49
49
|
Requires-Dist: dropbox; extra == 'full'
|
|
50
50
|
Requires-Dist: dropboxdrivefs; extra == 'full'
|
|
51
51
|
Requires-Dist: fusepy; extra == 'full'
|
|
52
|
-
Requires-Dist: gcsfs; extra == 'full'
|
|
52
|
+
Requires-Dist: gcsfs>2024.2.0; extra == 'full'
|
|
53
53
|
Requires-Dist: libarchive-c; extra == 'full'
|
|
54
54
|
Requires-Dist: ocifs; extra == 'full'
|
|
55
55
|
Requires-Dist: panel; extra == 'full'
|
|
@@ -57,7 +57,7 @@ Requires-Dist: paramiko; extra == 'full'
|
|
|
57
57
|
Requires-Dist: pyarrow>=1; extra == 'full'
|
|
58
58
|
Requires-Dist: pygit2; extra == 'full'
|
|
59
59
|
Requires-Dist: requests; extra == 'full'
|
|
60
|
-
Requires-Dist: s3fs; extra == 'full'
|
|
60
|
+
Requires-Dist: s3fs>2024.2.0; extra == 'full'
|
|
61
61
|
Requires-Dist: smbprotocol; extra == 'full'
|
|
62
62
|
Requires-Dist: tqdm; extra == 'full'
|
|
63
63
|
Provides-Extra: fuse
|
|
@@ -108,6 +108,7 @@ Requires-Dist: xarray; extra == 'test-downstream'
|
|
|
108
108
|
Provides-Extra: test-full
|
|
109
109
|
Requires-Dist: adlfs; extra == 'test-full'
|
|
110
110
|
Requires-Dist: aiohttp!=4.0.0a0,!=4.0.0a1; extra == 'test-full'
|
|
111
|
+
Requires-Dist: backports-zstd; (python_version < '3.14') and extra == 'test-full'
|
|
111
112
|
Requires-Dist: cloudpickle; extra == 'test-full'
|
|
112
113
|
Requires-Dist: dask; extra == 'test-full'
|
|
113
114
|
Requires-Dist: distributed; extra == 'test-full'
|
|
@@ -143,7 +144,6 @@ Requires-Dist: smbprotocol; extra == 'test-full'
|
|
|
143
144
|
Requires-Dist: tqdm; extra == 'test-full'
|
|
144
145
|
Requires-Dist: urllib3; extra == 'test-full'
|
|
145
146
|
Requires-Dist: zarr; extra == 'test-full'
|
|
146
|
-
Requires-Dist: zstandard; (python_version < '3.14') and extra == 'test-full'
|
|
147
147
|
Provides-Extra: tqdm
|
|
148
148
|
Requires-Dist: tqdm; extra == 'tqdm'
|
|
149
149
|
Description-Content-Type: text/markdown
|
|
@@ -235,23 +235,26 @@ documentation carefully before using any particular package.
|
|
|
235
235
|
- `irods`_ for access to iRODS servers, with protocol "irods://"
|
|
236
236
|
- `lakefs`_ for lakeFS data lakes, with protocol "lakefs://"
|
|
237
237
|
- `morefs`_ for `OverlayFileSystem`, `DictFileSystem`, and others
|
|
238
|
+
- `msgraphfs`_ for Microsoft storage (ie Sharepoint) using the drive API through Microsoft Graph, with protocol "msgd://"
|
|
238
239
|
- `obstore`_: zero-dependency access to Amazon S3, Google Cloud Storage, and Azure Blob Storage using the underlying Rust `object_store`_ library, with protocols "s3://", "gs://", and "abfs://".
|
|
239
240
|
- `ocifs`_ for access to Oracle Cloud Object Storage, with protocol "oci://"
|
|
240
241
|
- `ocilake`_ for OCI Data Lake storage
|
|
241
242
|
- `ossfs`_ for Alibaba Cloud (Aliyun) Object Storage System (OSS)
|
|
242
243
|
- `p9fs`_ for 9P (Plan 9 Filesystem Protocol) servers
|
|
243
244
|
- `PyAthena`_ for S3 access to Amazon Athena, with protocol "s3://" or "s3a://"
|
|
245
|
+
- `fsspec-pydantic`_: Pydantic models to represent file and directory types
|
|
244
246
|
- `PyDrive2`_ for Google Drive access
|
|
247
|
+
- `fsspec-python`_: A chained filesystem that connects to Python's import system, to allow for importing from an fsspec backend
|
|
245
248
|
- `fsspec-proxy`_ for "pyscript:" URLs via a proxy server
|
|
246
249
|
- `s3fs`_ for Amazon S3 and other compatible stores, with protocol "s3://"
|
|
247
250
|
- `sshfs`_ for access to SSH servers, with protocol "ssh://" or "sftp://"
|
|
248
251
|
- `swiftspec`_ for OpenStack SWIFT, with protocol "swift://"
|
|
249
252
|
- `tosfs`_ for ByteDance volcano engine Tinder Object Storage (TOS)
|
|
253
|
+
- `fsspec-union`_: A chained filesystem that unions multiple fsspec backends as a read-through cache
|
|
250
254
|
- `wandbfs`_ to access Wandb run data (experimental)
|
|
251
255
|
- `wandbfsspec`_ to access Weights & Biases (experimental)
|
|
252
256
|
- `webdav4`_ for WebDAV, with protocol "webdav://" or "dav://"
|
|
253
257
|
- `xrootd`_ for xrootd, with protocol "root://"
|
|
254
|
-
- `msgraphfs`_ for Microsoft storage (ie Sharepoint) using the drive API through Microsoft Graph, with protocol "msgd://"
|
|
255
258
|
|
|
256
259
|
.. _abfs: https://github.com/dask/adlfs
|
|
257
260
|
.. _adl: https://github.com/dask/adlfs
|
|
@@ -272,6 +275,7 @@ documentation carefully before using any particular package.
|
|
|
272
275
|
.. _irods: https://github.com/xwcl/irods_fsspec
|
|
273
276
|
.. _lakefs: https://github.com/aai-institute/lakefs-spec
|
|
274
277
|
.. _morefs: https://github.com/iterative/morefs
|
|
278
|
+
.. _msgraphfs: https://github.com/acsone/msgraphfs
|
|
275
279
|
.. _object_store: https://docs.rs/object_store/latest/object_store/
|
|
276
280
|
.. _obstore: https://developmentseed.org/obstore/latest/
|
|
277
281
|
.. _ocifs: https://ocifs.readthedocs.io/en/latest/
|
|
@@ -279,16 +283,18 @@ documentation carefully before using any particular package.
|
|
|
279
283
|
.. _ossfs: https://github.com/fsspec/ossfs
|
|
280
284
|
.. _p9fs: https://github.com/pbchekin/p9fs-py
|
|
281
285
|
.. _PyAthena: https://github.com/laughingman7743/PyAthena
|
|
286
|
+
.. _fsspec-pydantic: https://github.com/1kbgz/fsspec-pydantic
|
|
282
287
|
.. _PyDrive2: https://github.com/iterative/PyDrive2
|
|
288
|
+
.. _fsspec-python: https://github.com/1kbgz/fsspec-python
|
|
283
289
|
.. _s3fs: https://s3fs.readthedocs.io/en/latest/
|
|
284
290
|
.. _sshfs: https://github.com/fsspec/sshfs
|
|
285
291
|
.. _swiftspec: https://github.com/fsspec/swiftspec
|
|
286
292
|
.. _tosfs: https://tosfs.readthedocs.io/en/latest/
|
|
293
|
+
.. _fsspec-union: https://github.com/1kbgz/fsspec-union
|
|
287
294
|
.. _wandbfs: https://github.com/jkulhanek/wandbfs
|
|
288
295
|
.. _wandbfsspec: https://github.com/alvarobartt/wandbfsspec
|
|
289
296
|
.. _webdav4: https://github.com/skshetry/webdav4
|
|
290
297
|
.. _xrootd: https://github.com/CoffeaTeam/fsspec-xrootd
|
|
291
|
-
.. _msgraphfs: https://github.com/acsone/msgraphfs
|
|
292
298
|
|
|
293
299
|
.. _readbuffering:
|
|
294
300
|
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
2026.1.0
|
|
5
|
+
--------
|
|
6
|
+
|
|
7
|
+
Put limits on install extras for s3fs/gcsfs to prevent installing
|
|
8
|
+
ancient versions via pip.
|
|
9
|
+
|
|
10
|
+
Enhancements
|
|
11
|
+
|
|
12
|
+
- configure TLS protocol version for FTP (#1958)
|
|
13
|
+
|
|
14
|
+
Fixes
|
|
15
|
+
|
|
16
|
+
- Respect auto_mkdir in mv for local (#1957)
|
|
17
|
+
|
|
18
|
+
Other
|
|
19
|
+
|
|
20
|
+
- link to pydantic, code and union implementations ($1956)
|
|
21
|
+
- use backport.zstd or builtin (#1962)
|
|
22
|
+
- docs typo (#1963)
|
|
23
|
+
|
|
4
24
|
2025.12.0
|
|
5
25
|
---------
|
|
6
26
|
|
|
@@ -161,7 +161,7 @@ be possible to reach all paths on the remote.
|
|
|
161
161
|
Instance Caching
|
|
162
162
|
----------------
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
If a file-system implementation class is marked as *cachable* (attribute ``.cachable``),
|
|
165
165
|
then its instances will
|
|
166
166
|
get stored in a class attribute, to enable quick look-up instead of needing to regenerate
|
|
167
167
|
potentially expensive connections and sessions. They key in the cache is a tokenisation of
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '
|
|
32
|
-
__version_tuple__ = version_tuple = (
|
|
31
|
+
__version__ = version = '2026.1.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (2026, 1, 0)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Helper functions for a standard streaming compression API"""
|
|
2
2
|
|
|
3
|
+
import sys
|
|
3
4
|
from zipfile import ZipFile
|
|
4
5
|
|
|
5
6
|
import fsspec.utils
|
|
@@ -155,26 +156,14 @@ except ImportError:
|
|
|
155
156
|
pass
|
|
156
157
|
|
|
157
158
|
try:
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
if sys.version_info >= (3, 14):
|
|
160
|
+
from compression import zstd
|
|
161
|
+
else:
|
|
162
|
+
from backports import zstd
|
|
162
163
|
|
|
164
|
+
register_compression("zstd", zstd.ZstdFile, "zst")
|
|
163
165
|
except ImportError:
|
|
164
|
-
|
|
165
|
-
import zstandard as zstd
|
|
166
|
-
|
|
167
|
-
def zstandard_file(infile, mode="rb"):
|
|
168
|
-
if "r" in mode:
|
|
169
|
-
cctx = zstd.ZstdDecompressor()
|
|
170
|
-
return cctx.stream_reader(infile)
|
|
171
|
-
else:
|
|
172
|
-
cctx = zstd.ZstdCompressor(level=10)
|
|
173
|
-
return cctx.stream_writer(infile)
|
|
174
|
-
|
|
175
|
-
register_compression("zstd", zstandard_file, "zst")
|
|
176
|
-
except ImportError:
|
|
177
|
-
pass
|
|
166
|
+
pass
|
|
178
167
|
|
|
179
168
|
|
|
180
169
|
def available_compressions():
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import ssl
|
|
2
3
|
import uuid
|
|
3
4
|
from ftplib import FTP, FTP_TLS, Error, error_perm
|
|
4
5
|
from typing import Any
|
|
@@ -6,6 +7,37 @@ from typing import Any
|
|
|
6
7
|
from ..spec import AbstractBufferedFile, AbstractFileSystem
|
|
7
8
|
from ..utils import infer_storage_options, isfilelike
|
|
8
9
|
|
|
10
|
+
SECURITY_PROTOCOL_MAP = {
|
|
11
|
+
"tls": ssl.PROTOCOL_TLS,
|
|
12
|
+
"tlsv1": ssl.PROTOCOL_TLSv1,
|
|
13
|
+
"tlsv1_1": ssl.PROTOCOL_TLSv1_1,
|
|
14
|
+
"tlsv1_2": ssl.PROTOCOL_TLSv1_2,
|
|
15
|
+
"sslv23": ssl.PROTOCOL_SSLv23,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ImplicitFTPTLS(FTP_TLS):
|
|
20
|
+
"""
|
|
21
|
+
FTP_TLS subclass that automatically wraps sockets in SSL
|
|
22
|
+
to support implicit FTPS.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, *args, **kwargs):
|
|
26
|
+
super().__init__(*args, **kwargs)
|
|
27
|
+
self._sock = None
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def sock(self):
|
|
31
|
+
"""Return the socket."""
|
|
32
|
+
return self._sock
|
|
33
|
+
|
|
34
|
+
@sock.setter
|
|
35
|
+
def sock(self, value):
|
|
36
|
+
"""When modifying the socket, ensure that it is ssl wrapped."""
|
|
37
|
+
if value is not None and not isinstance(value, ssl.SSLSocket):
|
|
38
|
+
value = self.context.wrap_socket(value)
|
|
39
|
+
self._sock = value
|
|
40
|
+
|
|
9
41
|
|
|
10
42
|
class FTPFileSystem(AbstractFileSystem):
|
|
11
43
|
"""A filesystem over classic FTP"""
|
|
@@ -55,8 +87,14 @@ class FTPFileSystem(AbstractFileSystem):
|
|
|
55
87
|
Timeout of the ftp connection in seconds
|
|
56
88
|
encoding: str
|
|
57
89
|
Encoding to use for directories and filenames in FTP connection
|
|
58
|
-
tls: bool
|
|
59
|
-
|
|
90
|
+
tls: bool or str
|
|
91
|
+
Enable FTP-TLS for secure connections:
|
|
92
|
+
- False: Plain FTP (default)
|
|
93
|
+
- True: Explicit TLS (FTPS with AUTH TLS command)
|
|
94
|
+
- "tls": Auto-negotiate highest protocol
|
|
95
|
+
- "tlsv1": TLS v1.0
|
|
96
|
+
- "tlsv1_1": TLS v1.1
|
|
97
|
+
- "tlsv1_2": TLS v1.2
|
|
60
98
|
"""
|
|
61
99
|
super().__init__(**kwargs)
|
|
62
100
|
self.host = host
|
|
@@ -71,15 +109,27 @@ class FTPFileSystem(AbstractFileSystem):
|
|
|
71
109
|
self.blocksize = 2**16
|
|
72
110
|
self.tls = tls
|
|
73
111
|
self._connect()
|
|
74
|
-
if self.tls:
|
|
112
|
+
if isinstance(self.tls, bool) and self.tls:
|
|
75
113
|
self.ftp.prot_p()
|
|
76
114
|
|
|
77
115
|
def _connect(self):
|
|
116
|
+
security = None
|
|
78
117
|
if self.tls:
|
|
79
|
-
|
|
118
|
+
if isinstance(self.tls, str):
|
|
119
|
+
ftp_cls = ImplicitFTPTLS
|
|
120
|
+
security = SECURITY_PROTOCOL_MAP.get(
|
|
121
|
+
self.tls,
|
|
122
|
+
f"Not supported {self.tls} protocol",
|
|
123
|
+
)
|
|
124
|
+
if isinstance(security, str):
|
|
125
|
+
raise ValueError(security)
|
|
126
|
+
else:
|
|
127
|
+
ftp_cls = FTP_TLS
|
|
80
128
|
else:
|
|
81
129
|
ftp_cls = FTP
|
|
82
130
|
self.ftp = ftp_cls(timeout=self.timeout, encoding=self.encoding)
|
|
131
|
+
if security:
|
|
132
|
+
self.ftp.ssl_version = security
|
|
83
133
|
self.ftp.connect(self.host, self.port)
|
|
84
134
|
self.ftp.login(*self.cred)
|
|
85
135
|
|
|
@@ -166,6 +166,10 @@ class LocalFileSystem(AbstractFileSystem):
|
|
|
166
166
|
"""
|
|
167
167
|
path1 = self._strip_protocol(path1)
|
|
168
168
|
path2 = self._strip_protocol(path2)
|
|
169
|
+
|
|
170
|
+
if self.auto_mkdir:
|
|
171
|
+
self.makedirs(self._parent(path2), exist_ok=True)
|
|
172
|
+
|
|
169
173
|
shutil.move(path1, path2)
|
|
170
174
|
|
|
171
175
|
def link(self, src, dst, **kwargs):
|
|
@@ -189,7 +189,7 @@ known_implementations = {
|
|
|
189
189
|
},
|
|
190
190
|
"pyscript": {
|
|
191
191
|
"class": "pyscript_fsspec_client.client.PyscriptFileSystem",
|
|
192
|
-
"err": "
|
|
192
|
+
"err": "This only runs in a pyscript context",
|
|
193
193
|
},
|
|
194
194
|
"reference": {"class": "fsspec.implementations.reference.ReferenceFileSystem"},
|
|
195
195
|
"root": {
|
|
@@ -40,7 +40,7 @@ full = [
|
|
|
40
40
|
'dropbox',
|
|
41
41
|
'dropboxdrivefs',
|
|
42
42
|
'fusepy',
|
|
43
|
-
'gcsfs',
|
|
43
|
+
'gcsfs >2024.2.0',
|
|
44
44
|
'libarchive-c',
|
|
45
45
|
'ocifs',
|
|
46
46
|
'panel',
|
|
@@ -48,7 +48,7 @@ full = [
|
|
|
48
48
|
'pyarrow >= 1',
|
|
49
49
|
'pygit2',
|
|
50
50
|
'requests',
|
|
51
|
-
's3fs',
|
|
51
|
+
's3fs >2024.2.0',
|
|
52
52
|
'smbprotocol',
|
|
53
53
|
'tqdm',
|
|
54
54
|
]
|
|
@@ -117,7 +117,7 @@ test_full = [
|
|
|
117
117
|
'tqdm',
|
|
118
118
|
'urllib3',
|
|
119
119
|
'zarr',
|
|
120
|
-
'
|
|
120
|
+
'backports.zstd; python_version < "3.14"',
|
|
121
121
|
]
|
|
122
122
|
test_downstream = [
|
|
123
123
|
"dask[dataframe,test]",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|