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.
Files changed (92) hide show
  1. {fsspec-2025.12.0 → fsspec-2026.1.0}/PKG-INFO +4 -4
  2. {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-friends.yml +1 -0
  3. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/api.rst +8 -2
  4. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/changelog.rst +20 -0
  5. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/features.rst +1 -1
  6. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/_version.py +2 -2
  7. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/compression.py +7 -18
  8. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/ftp.py +54 -4
  9. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/local.py +4 -0
  10. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/registry.py +1 -1
  11. {fsspec-2025.12.0 → fsspec-2026.1.0}/pyproject.toml +3 -3
  12. {fsspec-2025.12.0 → fsspec-2026.1.0}/.codespellrc +0 -0
  13. {fsspec-2025.12.0 → fsspec-2026.1.0}/.coveragerc +0 -0
  14. {fsspec-2025.12.0 → fsspec-2026.1.0}/.gitattributes +0 -0
  15. {fsspec-2025.12.0 → fsspec-2026.1.0}/.github/workflows/main.yaml +0 -0
  16. {fsspec-2025.12.0 → fsspec-2026.1.0}/.github/workflows/pypipublish.yaml +0 -0
  17. {fsspec-2025.12.0 → fsspec-2026.1.0}/.gitignore +0 -0
  18. {fsspec-2025.12.0 → fsspec-2026.1.0}/.pre-commit-config.yaml +0 -0
  19. {fsspec-2025.12.0 → fsspec-2026.1.0}/LICENSE +0 -0
  20. {fsspec-2025.12.0 → fsspec-2026.1.0}/README.md +0 -0
  21. {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-downstream.yml +0 -0
  22. {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-linux.yml +0 -0
  23. {fsspec-2025.12.0 → fsspec-2026.1.0}/ci/environment-win.yml +0 -0
  24. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/Makefile +0 -0
  25. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/README.md +0 -0
  26. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/environment.yml +0 -0
  27. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/make.bat +0 -0
  28. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/_static/custom.css +0 -0
  29. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/async.rst +0 -0
  30. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/code-of-conduct.rst +0 -0
  31. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/conf.py +0 -0
  32. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/copying.rst +0 -0
  33. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/developer.rst +0 -0
  34. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/img/gui.png +0 -0
  35. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/index.rst +0 -0
  36. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/intro.rst +0 -0
  37. {fsspec-2025.12.0 → fsspec-2026.1.0}/docs/source/usage.rst +0 -0
  38. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/__init__.py +0 -0
  39. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/archive.py +0 -0
  40. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/asyn.py +0 -0
  41. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/caching.py +0 -0
  42. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/callbacks.py +0 -0
  43. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/config.py +0 -0
  44. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/conftest.py +0 -0
  45. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/core.py +0 -0
  46. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/dircache.py +0 -0
  47. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/exceptions.py +0 -0
  48. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/fuse.py +0 -0
  49. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/generic.py +0 -0
  50. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/gui.py +0 -0
  51. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/__init__.py +0 -0
  52. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/arrow.py +0 -0
  53. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/asyn_wrapper.py +0 -0
  54. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/cache_mapper.py +0 -0
  55. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/cache_metadata.py +0 -0
  56. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/cached.py +0 -0
  57. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/chained.py +0 -0
  58. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/dask.py +0 -0
  59. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/data.py +0 -0
  60. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/dbfs.py +0 -0
  61. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/dirfs.py +0 -0
  62. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/gist.py +0 -0
  63. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/git.py +0 -0
  64. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/github.py +0 -0
  65. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/http.py +0 -0
  66. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/http_sync.py +0 -0
  67. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/jupyter.py +0 -0
  68. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/libarchive.py +0 -0
  69. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/memory.py +0 -0
  70. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/reference.py +0 -0
  71. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/sftp.py +0 -0
  72. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/smb.py +0 -0
  73. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/tar.py +0 -0
  74. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/webhdfs.py +0 -0
  75. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/implementations/zip.py +0 -0
  76. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/json.py +0 -0
  77. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/mapping.py +0 -0
  78. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/parquet.py +0 -0
  79. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/spec.py +0 -0
  80. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/__init__.py +0 -0
  81. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/common.py +0 -0
  82. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/copy.py +0 -0
  83. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/get.py +0 -0
  84. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/mv.py +0 -0
  85. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/open.py +0 -0
  86. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/pipe.py +0 -0
  87. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/tests/abstract/put.py +0 -0
  88. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/transaction.py +0 -0
  89. {fsspec-2025.12.0 → fsspec-2026.1.0}/fsspec/utils.py +0 -0
  90. {fsspec-2025.12.0 → fsspec-2026.1.0}/install_s3fs.sh +0 -0
  91. {fsspec-2025.12.0 → fsspec-2026.1.0}/readthedocs.yml +0 -0
  92. {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: 2025.12.0
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
@@ -18,6 +18,7 @@ dependencies:
18
18
  - google-auth-oauthlib
19
19
  - flake8
20
20
  - black
21
+ - psutil
21
22
  - google-cloud-core
22
23
  - google-cloud-storage
23
24
  - google-api-core
@@ -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
- In a file-system implementation class is marked as *cachable* (attribute ``.cachable``),
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 = '2025.12.0'
32
- __version_tuple__ = version_tuple = (2025, 12, 0)
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
- # zstd in the standard library for python >= 3.14
159
- from compression.zstd import ZstdFile
160
-
161
- register_compression("zstd", ZstdFile, "zst")
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
- try:
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
- Use FTP-TLS, by default False
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
- ftp_cls = FTP_TLS
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": "Install requests (cpython) or run in pyscript",
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
- 'zstandard; python_version < "3.14"',
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