fsspec 2025.7.0__tar.gz → 2025.10.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 (93) hide show
  1. {fsspec-2025.7.0 → fsspec-2025.10.0}/PKG-INFO +2 -31
  2. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/api.rst +61 -61
  3. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/changelog.rst +45 -0
  4. fsspec-2025.10.0/docs/source/code-of-conduct.rst +126 -0
  5. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/features.rst +3 -1
  6. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/index.rst +5 -0
  7. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/_version.py +16 -3
  8. fsspec-2025.10.0/fsspec/conftest.py +125 -0
  9. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/core.py +2 -2
  10. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/generic.py +2 -0
  11. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/arrow.py +7 -4
  12. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/asyn_wrapper.py +10 -2
  13. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/cached.py +9 -4
  14. fsspec-2025.10.0/fsspec/implementations/chained.py +23 -0
  15. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/dbfs.py +31 -3
  16. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/gist.py +25 -16
  17. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/http.py +2 -1
  18. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/jupyter.py +7 -2
  19. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/memory.py +4 -4
  20. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/reference.py +14 -8
  21. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/sftp.py +7 -0
  22. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/webhdfs.py +1 -1
  23. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/spec.py +17 -6
  24. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/utils.py +8 -0
  25. {fsspec-2025.7.0 → fsspec-2025.10.0}/pyproject.toml +3 -3
  26. fsspec-2025.7.0/fsspec/conftest.py +0 -55
  27. {fsspec-2025.7.0 → fsspec-2025.10.0}/.codespellrc +0 -0
  28. {fsspec-2025.7.0 → fsspec-2025.10.0}/.coveragerc +0 -0
  29. {fsspec-2025.7.0 → fsspec-2025.10.0}/.gitattributes +0 -0
  30. {fsspec-2025.7.0 → fsspec-2025.10.0}/.github/workflows/main.yaml +0 -0
  31. {fsspec-2025.7.0 → fsspec-2025.10.0}/.github/workflows/pypipublish.yaml +0 -0
  32. {fsspec-2025.7.0 → fsspec-2025.10.0}/.gitignore +0 -0
  33. {fsspec-2025.7.0 → fsspec-2025.10.0}/.pre-commit-config.yaml +0 -0
  34. {fsspec-2025.7.0 → fsspec-2025.10.0}/LICENSE +0 -0
  35. {fsspec-2025.7.0 → fsspec-2025.10.0}/README.md +0 -0
  36. {fsspec-2025.7.0 → fsspec-2025.10.0}/ci/environment-downstream.yml +0 -0
  37. {fsspec-2025.7.0 → fsspec-2025.10.0}/ci/environment-friends.yml +0 -0
  38. {fsspec-2025.7.0 → fsspec-2025.10.0}/ci/environment-linux.yml +0 -0
  39. {fsspec-2025.7.0 → fsspec-2025.10.0}/ci/environment-win.yml +0 -0
  40. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/Makefile +0 -0
  41. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/README.md +0 -0
  42. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/environment.yml +0 -0
  43. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/make.bat +0 -0
  44. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/_static/custom.css +0 -0
  45. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/async.rst +0 -0
  46. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/conf.py +0 -0
  47. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/copying.rst +0 -0
  48. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/developer.rst +0 -0
  49. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/img/gui.png +0 -0
  50. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/intro.rst +0 -0
  51. {fsspec-2025.7.0 → fsspec-2025.10.0}/docs/source/usage.rst +0 -0
  52. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/__init__.py +0 -0
  53. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/archive.py +0 -0
  54. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/asyn.py +0 -0
  55. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/caching.py +0 -0
  56. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/callbacks.py +0 -0
  57. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/compression.py +0 -0
  58. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/config.py +0 -0
  59. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/dircache.py +0 -0
  60. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/exceptions.py +0 -0
  61. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/fuse.py +0 -0
  62. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/gui.py +0 -0
  63. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/__init__.py +0 -0
  64. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/cache_mapper.py +0 -0
  65. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/cache_metadata.py +0 -0
  66. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/dask.py +0 -0
  67. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/data.py +0 -0
  68. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/dirfs.py +0 -0
  69. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/ftp.py +0 -0
  70. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/git.py +0 -0
  71. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/github.py +0 -0
  72. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/http_sync.py +0 -0
  73. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/libarchive.py +0 -0
  74. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/local.py +0 -0
  75. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/smb.py +0 -0
  76. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/tar.py +0 -0
  77. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/implementations/zip.py +0 -0
  78. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/json.py +0 -0
  79. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/mapping.py +0 -0
  80. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/parquet.py +0 -0
  81. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/registry.py +0 -0
  82. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/__init__.py +0 -0
  83. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/common.py +0 -0
  84. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/copy.py +0 -0
  85. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/get.py +0 -0
  86. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/mv.py +0 -0
  87. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/open.py +0 -0
  88. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/pipe.py +0 -0
  89. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/tests/abstract/put.py +0 -0
  90. {fsspec-2025.7.0 → fsspec-2025.10.0}/fsspec/transaction.py +0 -0
  91. {fsspec-2025.7.0 → fsspec-2025.10.0}/install_s3fs.sh +0 -0
  92. {fsspec-2025.7.0 → fsspec-2025.10.0}/readthedocs.yml +0 -0
  93. {fsspec-2025.7.0 → fsspec-2025.10.0}/setup.cfg +0 -0
@@ -1,45 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fsspec
3
- Version: 2025.7.0
3
+ Version: 2025.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/
7
7
  Project-URL: Homepage, https://github.com/fsspec/filesystem_spec
8
8
  Maintainer-email: Martin Durant <mdurant@anaconda.com>
9
- License: BSD 3-Clause License
10
-
11
- Copyright (c) 2018, Martin Durant
12
- All rights reserved.
13
-
14
- Redistribution and use in source and binary forms, with or without
15
- modification, are permitted provided that the following conditions are met:
16
-
17
- * Redistributions of source code must retain the above copyright notice, this
18
- list of conditions and the following disclaimer.
19
-
20
- * Redistributions in binary form must reproduce the above copyright notice,
21
- this list of conditions and the following disclaimer in the documentation
22
- and/or other materials provided with the distribution.
23
-
24
- * Neither the name of the copyright holder nor the names of its
25
- contributors may be used to endorse or promote products derived from
26
- this software without specific prior written permission.
27
-
28
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
32
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9
+ License-Expression: BSD-3-Clause
38
10
  License-File: LICENSE
39
11
  Keywords: file
40
12
  Classifier: Development Status :: 4 - Beta
41
13
  Classifier: Intended Audience :: Developers
42
- Classifier: License :: OSI Approved :: BSD License
43
14
  Classifier: Operating System :: OS Independent
44
15
  Classifier: Programming Language :: Python :: 3.9
45
16
  Classifier: Programming Language :: Python :: 3.10
@@ -7,17 +7,17 @@ User Functions
7
7
  --------------
8
8
 
9
9
  .. autosummary::
10
- fsspec.available_compressions
11
- fsspec.available_protocols
12
- fsspec.filesystem
13
- fsspec.fuse.run
14
- fsspec.generic.rsync
15
- fsspec.get_filesystem_class
16
- fsspec.get_mapper
17
- fsspec.gui.FileSelector
18
- fsspec.open
19
- fsspec.open_files
20
- fsspec.open_local
10
+ available_compressions
11
+ available_protocols
12
+ filesystem
13
+ fuse.run
14
+ generic.rsync
15
+ get_filesystem_class
16
+ get_mapper
17
+ gui.FileSelector
18
+ open
19
+ open_files
20
+ open_local
21
21
 
22
22
  .. autofunction:: fsspec.available_compressions
23
23
  .. autofunction:: fsspec.available_protocols
@@ -36,24 +36,24 @@ Base Classes
36
36
  ------------
37
37
 
38
38
  .. autosummary::
39
- fsspec.archive.AbstractArchiveFileSystem
40
- fsspec.asyn.AsyncFileSystem
41
- fsspec.callbacks.Callback
42
- fsspec.callbacks.DotPrinterCallback
43
- fsspec.callbacks.NoOpCallback
44
- fsspec.callbacks.TqdmCallback
45
- fsspec.core.BaseCache
46
- fsspec.core.OpenFile
47
- fsspec.core.OpenFiles
48
- fsspec.core.get_fs_token_paths
49
- fsspec.core.url_to_fs
50
- fsspec.dircache.DirCache
51
- fsspec.FSMap
52
- fsspec.generic.GenericFileSystem
53
- fsspec.registry.register_implementation
54
- fsspec.spec.AbstractBufferedFile
55
- fsspec.spec.AbstractFileSystem
56
- fsspec.spec.Transaction
39
+ archive.AbstractArchiveFileSystem
40
+ asyn.AsyncFileSystem
41
+ callbacks.Callback
42
+ callbacks.DotPrinterCallback
43
+ callbacks.NoOpCallback
44
+ callbacks.TqdmCallback
45
+ core.BaseCache
46
+ core.OpenFile
47
+ core.OpenFiles
48
+ core.get_fs_token_paths
49
+ core.url_to_fs
50
+ dircache.DirCache
51
+ FSMap
52
+ generic.GenericFileSystem
53
+ registry.register_implementation
54
+ spec.AbstractBufferedFile
55
+ spec.AbstractFileSystem
56
+ spec.Transaction
57
57
 
58
58
  .. autoclass:: fsspec.archive.AbstractArchiveFileSystem
59
59
  :members:
@@ -107,31 +107,31 @@ Built-in Implementations
107
107
  ------------------------
108
108
 
109
109
  .. autosummary::
110
- fsspec.implementations.arrow.ArrowFSWrapper
111
- fsspec.implementations.arrow.HadoopFileSystem
112
- fsspec.implementations.cached.CachingFileSystem
113
- fsspec.implementations.cached.SimpleCacheFileSystem
114
- fsspec.implementations.cached.WholeFileCacheFileSystem
115
- fsspec.implementations.dask.DaskWorkerFileSystem
116
- fsspec.implementations.data.DataFileSystem
117
- fsspec.implementations.dbfs.DatabricksFileSystem
118
- fsspec.implementations.dirfs.DirFileSystem
119
- fsspec.implementations.ftp.FTPFileSystem
120
- fsspec.implementations.gist.GistFileSystem
121
- fsspec.implementations.git.GitFileSystem
122
- fsspec.implementations.github.GithubFileSystem
123
- fsspec.implementations.http.HTTPFileSystem
124
- fsspec.implementations.jupyter.JupyterFileSystem
125
- fsspec.implementations.libarchive.LibArchiveFileSystem
126
- fsspec.implementations.local.LocalFileSystem
127
- fsspec.implementations.memory.MemoryFileSystem
128
- fsspec.implementations.reference.ReferenceFileSystem
129
- fsspec.implementations.reference.LazyReferenceMapper
130
- fsspec.implementations.sftp.SFTPFileSystem
131
- fsspec.implementations.smb.SMBFileSystem
132
- fsspec.implementations.tar.TarFileSystem
133
- fsspec.implementations.webhdfs.WebHDFS
134
- fsspec.implementations.zip.ZipFileSystem
110
+ implementations.arrow.ArrowFSWrapper
111
+ implementations.arrow.HadoopFileSystem
112
+ implementations.cached.CachingFileSystem
113
+ implementations.cached.SimpleCacheFileSystem
114
+ implementations.cached.WholeFileCacheFileSystem
115
+ implementations.dask.DaskWorkerFileSystem
116
+ implementations.data.DataFileSystem
117
+ implementations.dbfs.DatabricksFileSystem
118
+ implementations.dirfs.DirFileSystem
119
+ implementations.ftp.FTPFileSystem
120
+ implementations.gist.GistFileSystem
121
+ implementations.git.GitFileSystem
122
+ implementations.github.GithubFileSystem
123
+ implementations.http.HTTPFileSystem
124
+ implementations.jupyter.JupyterFileSystem
125
+ implementations.libarchive.LibArchiveFileSystem
126
+ implementations.local.LocalFileSystem
127
+ implementations.memory.MemoryFileSystem
128
+ implementations.reference.ReferenceFileSystem
129
+ implementations.reference.LazyReferenceMapper
130
+ implementations.sftp.SFTPFileSystem
131
+ implementations.smb.SMBFileSystem
132
+ implementations.tar.TarFileSystem
133
+ implementations.webhdfs.WebHDFS
134
+ implementations.zip.ZipFileSystem
135
135
 
136
136
  .. autoclass:: fsspec.implementations.arrow.ArrowFSWrapper
137
137
  :members: __init__
@@ -296,12 +296,12 @@ Read Buffering
296
296
  --------------
297
297
 
298
298
  .. autosummary::
299
- fsspec.caching.BlockCache
300
- fsspec.caching.BytesCache
301
- fsspec.caching.MMapCache
302
- fsspec.caching.ReadAheadCache
303
- fsspec.caching.FirstChunkCache
304
- fsspec.caching.BackgroundBlockCache
299
+ caching.BlockCache
300
+ caching.BytesCache
301
+ caching.MMapCache
302
+ caching.ReadAheadCache
303
+ caching.FirstChunkCache
304
+ caching.BackgroundBlockCache
305
305
 
306
306
  .. autoclass:: fsspec.caching.BlockCache
307
307
  :members:
@@ -326,7 +326,7 @@ Utilities
326
326
 
327
327
  .. autosummary::
328
328
 
329
- fsspec.utils.read_block
329
+ utils.read_block
330
330
 
331
331
  .. autofunction:: fsspec.utils.read_block
332
332
 
@@ -1,6 +1,51 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 2025.10.0
5
+ ---------
6
+
7
+ Enhancements
8
+
9
+ - specify storage_options not use use for tokenising; test instance cache (#1933)
10
+ - base class "chained" for FSs that pass through operations (#1929)
11
+
12
+ Fixes
13
+
14
+ - strip protocol for sftp (#1940)
15
+ - use one-step mv in jupyterfs (#1937)
16
+ - raise errors in jupyterfs, not return (#1936)
17
+ - add protocol attribute to http(#1935)
18
+ - allow ls() on a single file for arrowFS (#1931)
19
+ - support kwargs in webhdfs ls() (#1928)
20
+ - better discrimination for parquet in referenceFS (#1923)
21
+ - accept all mode= types in memoryFS (#1922)
22
+ - pass path list to put() in localtempfile for efficiency (#1920)
23
+ - fix docs errors (#1917)
24
+
25
+ Other
26
+
27
+ - add CoC (#1924)
28
+ - restrict github/gist tests because of rate limiting (#1918)
29
+
30
+
31
+ 2025.9.0
32
+ --------
33
+
34
+ Enhancements
35
+
36
+ - include Last_modified info from HTTP headers to info (#1909)
37
+ - add optional semaphore to async-wrapper (#1908)
38
+
39
+ Fixes
40
+
41
+ - ensure cachingFSs show correct protocol (#1897)
42
+ - fix simplecache cat_ranges (#1892)
43
+
44
+ Other
45
+
46
+ - Style (#1894)
47
+
48
+
4
49
  2025.7.0
5
50
  --------
6
51
 
@@ -0,0 +1,126 @@
1
+ Code of Conduct
2
+ ===============
3
+
4
+ All participants in the fsspec community are expected to adhere to a Code of Conduct.
5
+
6
+ As contributors and maintainers of this project, and in the interest of
7
+ fostering an open and welcoming community, we pledge to respect all people who
8
+ contribute through reporting issues, posting feature requests, updating
9
+ documentation, submitting pull requests or patches, and other activities.
10
+
11
+ We are committed to making participation in this project a harassment-free
12
+ experience for everyone, treating everyone as unique humans deserving of
13
+ respect.
14
+
15
+ Examples of unacceptable behaviour by participants include:
16
+
17
+ - The use of sexualized language or imagery
18
+ - Personal attacks
19
+ - Trolling or insulting/derogatory comments
20
+ - Public or private harassment
21
+ - Publishing other's private information, such as physical or electronic
22
+ addresses, without explicit permission
23
+ - Other unethical or unprofessional conduct
24
+
25
+ Project maintainers have the right and responsibility to remove, edit, or
26
+ reject comments, commits, code, wiki edits, issues, and other contributions
27
+ that are not aligned to this Code of Conduct, or to ban temporarily or
28
+ permanently any contributor for other behaviours that they deem inappropriate,
29
+ threatening, offensive, or harmful.
30
+
31
+ By adopting this Code of Conduct, project maintainers commit themselves
32
+ to fairly and consistently applying these principles to every aspect of
33
+ managing this project. Project maintainers who do not follow or enforce
34
+ the Code of Conduct may be permanently removed from the project team.
35
+
36
+ This code of conduct applies both within project spaces and in public
37
+ spaces when an individual is representing the project or its community.
38
+
39
+ If you feel the code of conduct has been violated, please report the
40
+ incident to the fsspec core team.
41
+
42
+ Reporting
43
+ ---------
44
+
45
+ If you believe someone is violating theCode of Conduct we ask that you report it
46
+ to the Project by emailing community@anaconda.com. All reports will be kept
47
+ confidential. In some cases we may determine that a public statement will need
48
+ to be made. If that's the case, the identities of all victims and reporters
49
+ will remain confidential unless those individuals instruct us otherwise.
50
+ If you believe anyone is in physical danger, please notify appropriate law
51
+ enforcement first.
52
+
53
+ In your report please include:
54
+
55
+ - Your contact info
56
+ - Names (real, nicknames, or pseudonyms) of any individuals involved.
57
+ If there were other witnesses besides you, please try to include them as well.
58
+ - When and where the incident occurred. Please be as specific as possible.
59
+ - Your account of what occurred. If there is a publicly available record
60
+ please include a link.
61
+ - Any extra context you believe existed for the incident.
62
+ - If you believe this incident is ongoing.
63
+ - If you believe any member of the core team has a conflict of interest
64
+ in adjudicating the incident.
65
+ - What, if any, corrective response you believe would be appropriate.
66
+ - Any other information you believe we should have.
67
+
68
+ Core team members are obligated to maintain confidentiality with regard
69
+ to the reporter and details of an incident.
70
+
71
+ What happens next?
72
+ ~~~~~~~~~~~~~~~~~~
73
+
74
+ You will receive an email acknowledging receipt of your complaint.
75
+ The core team will immediately meet to review the incident and determine:
76
+
77
+ - What happened.
78
+ - Whether this event constitutes a code of conduct violation.
79
+ - Who the bad actor was.
80
+ - Whether this is an ongoing situation, or if there is a threat to anyone's
81
+ physical safety.
82
+ - If this is determined to be an ongoing incident or a threat to physical safety,
83
+ the working groups' immediate priority will be to protect everyone involved.
84
+
85
+ If a member of the core team is one of the named parties, they will not be
86
+ included in any discussions, and will not be provided with any confidential
87
+ details from the reporter.
88
+
89
+ If anyone on the core team believes they have a conflict of interest in
90
+ adjudicating on a reported issue, they will inform the other core team
91
+ members, and exempt themselves from any discussion about the issue.
92
+ Following this declaration, they will not be provided with any confidential
93
+ details from the reporter.
94
+
95
+ Once the working group has a complete account of the events they will make a
96
+ decision as to how to response. Responses may include:
97
+
98
+ - Nothing (if we determine no violation occurred).
99
+ - A private reprimand from the working group to the individual(s) involved.
100
+ - A public reprimand.
101
+ - An imposed vacation
102
+ - A permanent or temporary ban from some or all spaces (GitHub repositories, etc.)
103
+ - A request for a public or private apology.
104
+
105
+ We'll respond within one week to the person who filed the report with either a
106
+ resolution or an explanation of why the situation is not yet resolved.
107
+
108
+ Once we've determined our final action, we'll contact the original reporter
109
+ to let them know what action (if any) we'll be taking. We'll take into account
110
+ feedback from the reporter on the appropriateness of our response, but we
111
+ don't guarantee we'll act on it.
112
+
113
+ Acknowledgement
114
+ ---------------
115
+
116
+ This CoC is modified from the one by `BeeWare`_, which in turn refers to
117
+ the `Contributor Covenant`_ and the `Django`_ project.
118
+
119
+ .. _BeeWare: https://beeware.org/community/behavior/code-of-conduct/
120
+ .. _Contributor Covenant: https://www.contributor-covenant.org/version/1/3/0/code-of-conduct/
121
+ .. _Django: https://www.djangoproject.com/conduct/reporting/
122
+
123
+ .. raw:: html
124
+
125
+ <script data-goatcounter="https://projspec.goatcounter.com/count"
126
+ async src="//gc.zgo.at/count.js"></script>
@@ -241,7 +241,9 @@ reads the same zip-file, but extracts the CSV files and stores them locally in t
241
241
  **For developers**: this "chaining" methods works by formatting the arguments passed to ``open_*``
242
242
  into ``target_protocol`` (a simple string) and ``target_options`` (a dict) and also optionally
243
243
  ``fo`` (target path, if a specific file is required). In order for an implementation to chain
244
- successfully like this, it must look for exactly those named arguments.
244
+ successfully like this, it must look for exactly those named arguments. Implementations that
245
+ require access to the target path of their nested targets should inherit from ``ChainedFileSystem``,
246
+ which will trigger pass-through of the nested path automatically.
245
247
 
246
248
  Caching Files Locally
247
249
  ---------------------
@@ -119,6 +119,11 @@ The current list of known implementations can be found as follows
119
119
  async.rst
120
120
  api.rst
121
121
  changelog.rst
122
+ code-of-conduct.rst
123
+
124
+
125
+ These docs pages collect anonymous tracking data using goatcounter, and the
126
+ dashboard is available to the public: https://fsspec.goatcounter.com/ .
122
127
 
123
128
  .. raw:: html
124
129
 
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '2025.7.0'
21
- __version_tuple__ = version_tuple = (2025, 7, 0)
31
+ __version__ = version = '2025.10.0'
32
+ __version_tuple__ = version_tuple = (2025, 10, 0)
33
+
34
+ __commit_id__ = commit_id = None
@@ -0,0 +1,125 @@
1
+ import os
2
+ import shutil
3
+ import subprocess
4
+ import sys
5
+ import time
6
+ from collections import deque
7
+ from collections.abc import Generator, Sequence
8
+
9
+ import pytest
10
+
11
+ import fsspec
12
+
13
+
14
+ @pytest.fixture()
15
+ def m():
16
+ """
17
+ Fixture providing a memory filesystem.
18
+ """
19
+ m = fsspec.filesystem("memory")
20
+ m.store.clear()
21
+ m.pseudo_dirs.clear()
22
+ m.pseudo_dirs.append("")
23
+ try:
24
+ yield m
25
+ finally:
26
+ m.store.clear()
27
+ m.pseudo_dirs.clear()
28
+ m.pseudo_dirs.append("")
29
+
30
+
31
+ class InstanceCacheInspector:
32
+ """
33
+ Helper class to inspect instance caches of filesystem classes in tests.
34
+ """
35
+
36
+ def clear(self) -> None:
37
+ """
38
+ Clear instance caches of all currently imported filesystem classes.
39
+ """
40
+ classes = deque([fsspec.spec.AbstractFileSystem])
41
+ while classes:
42
+ cls = classes.popleft()
43
+ cls.clear_instance_cache()
44
+ classes.extend(cls.__subclasses__())
45
+
46
+ def gather_counts(self, *, omit_zero: bool = True) -> dict[str, int]:
47
+ """
48
+ Gather counts of filesystem instances in the instance caches
49
+ of all currently imported filesystem classes.
50
+
51
+ Parameters
52
+ ----------
53
+ omit_zero:
54
+ Whether to omit instance types with no cached instances.
55
+ """
56
+ out: dict[str, int] = {}
57
+ classes = deque([fsspec.spec.AbstractFileSystem])
58
+ while classes:
59
+ cls = classes.popleft()
60
+ count = len(cls._cache) # there is no public interface for the cache
61
+ # note: skip intermediate AbstractFileSystem subclasses
62
+ # if they proxy the protocol attribute via a property.
63
+ if isinstance(cls.protocol, (Sequence, str)):
64
+ key = cls.protocol if isinstance(cls.protocol, str) else cls.protocol[0]
65
+ if count or not omit_zero:
66
+ out[key] = count
67
+ classes.extend(cls.__subclasses__())
68
+ return out
69
+
70
+
71
+ @pytest.fixture(scope="function", autouse=True)
72
+ def instance_caches() -> Generator[InstanceCacheInspector, None, None]:
73
+ """
74
+ Fixture to ensure empty filesystem instance caches before and after a test.
75
+
76
+ Used by default for all tests.
77
+ Clears caches of all imported filesystem classes.
78
+ Can be used to write test assertions about instance caches.
79
+
80
+ Usage:
81
+
82
+ def test_something(instance_caches):
83
+ # Test code here
84
+ fsspec.open("file://abc")
85
+ fsspec.open("memory://foo/bar")
86
+
87
+ # Test assertion
88
+ assert instance_caches.gather_counts() == {"file": 1, "memory": 1}
89
+
90
+ Returns
91
+ -------
92
+ instance_caches: An instance cache inspector for clearing and inspecting caches.
93
+ """
94
+ ic = InstanceCacheInspector()
95
+
96
+ ic.clear()
97
+ try:
98
+ yield ic
99
+ finally:
100
+ ic.clear()
101
+
102
+
103
+ @pytest.fixture(scope="function")
104
+ def ftp_writable(tmpdir):
105
+ """
106
+ Fixture providing a writable FTP filesystem.
107
+ """
108
+ pytest.importorskip("pyftpdlib")
109
+
110
+ d = str(tmpdir)
111
+ with open(os.path.join(d, "out"), "wb") as f:
112
+ f.write(b"hello" * 10000)
113
+ P = subprocess.Popen(
114
+ [sys.executable, "-m", "pyftpdlib", "-d", d, "-u", "user", "-P", "pass", "-w"]
115
+ )
116
+ try:
117
+ time.sleep(1)
118
+ yield "localhost", 2121, "user", "pass"
119
+ finally:
120
+ P.terminate()
121
+ P.wait()
122
+ try:
123
+ shutil.rmtree(tmpdir)
124
+ except Exception:
125
+ pass
@@ -330,7 +330,7 @@ def open_files(
330
330
 
331
331
  def _un_chain(path, kwargs):
332
332
  # Avoid a circular import
333
- from fsspec.implementations.cached import CachingFileSystem
333
+ from fsspec.implementations.chained import ChainedFileSystem
334
334
 
335
335
  if "::" in path:
336
336
  x = re.compile(".*[^a-z]+.*") # test for non protocol-like single word
@@ -358,7 +358,7 @@ def _un_chain(path, kwargs):
358
358
  **kws,
359
359
  )
360
360
  bit = cls._strip_protocol(bit)
361
- if "target_protocol" not in kw and issubclass(cls, CachingFileSystem):
361
+ if "target_protocol" not in kw and issubclass(cls, ChainedFileSystem):
362
362
  bit = previous_bit
363
363
  out.append((bit, protocol, kw))
364
364
  previous_bit = bit
@@ -118,6 +118,8 @@ def rsync(
118
118
  if otherfile in otherfiles:
119
119
  if update_cond == "always":
120
120
  allfiles[k] = otherfile
121
+ elif update_cond == "never":
122
+ allfiles.pop(k)
121
123
  elif update_cond == "different":
122
124
  inf1 = source_field(v) if callable(source_field) else v[source_field]
123
125
  v2 = otherfiles[otherfile]
@@ -75,10 +75,13 @@ class ArrowFSWrapper(AbstractFileSystem):
75
75
  path = self._strip_protocol(path)
76
76
  from pyarrow.fs import FileSelector
77
77
 
78
- entries = [
79
- self._make_entry(entry)
80
- for entry in self.fs.get_file_info(FileSelector(path))
81
- ]
78
+ try:
79
+ entries = [
80
+ self._make_entry(entry)
81
+ for entry in self.fs.get_file_info(FileSelector(path))
82
+ ]
83
+ except (FileNotFoundError, NotADirectoryError):
84
+ entries = [self.info(path, **kwargs)]
82
85
  if detail:
83
86
  return entries
84
87
  else:
@@ -6,7 +6,7 @@ import fsspec
6
6
  from fsspec.asyn import AsyncFileSystem, running_async
7
7
 
8
8
 
9
- def async_wrapper(func, obj=None):
9
+ def async_wrapper(func, obj=None, semaphore=None):
10
10
  """
11
11
  Wraps a synchronous function to make it awaitable.
12
12
 
@@ -16,6 +16,8 @@ def async_wrapper(func, obj=None):
16
16
  The synchronous function to wrap.
17
17
  obj : object, optional
18
18
  The instance to bind the function to, if applicable.
19
+ semaphore : asyncio.Semaphore, optional
20
+ A semaphore to limit concurrent calls.
19
21
 
20
22
  Returns
21
23
  -------
@@ -25,6 +27,9 @@ def async_wrapper(func, obj=None):
25
27
 
26
28
  @functools.wraps(func)
27
29
  async def wrapper(*args, **kwargs):
30
+ if semaphore:
31
+ async with semaphore:
32
+ return await asyncio.to_thread(func, *args, **kwargs)
28
33
  return await asyncio.to_thread(func, *args, **kwargs)
29
34
 
30
35
  return wrapper
@@ -52,6 +57,8 @@ class AsyncFileSystemWrapper(AsyncFileSystem):
52
57
  asynchronous=None,
53
58
  target_protocol=None,
54
59
  target_options=None,
60
+ semaphore=None,
61
+ max_concurrent_tasks=None,
55
62
  **kwargs,
56
63
  ):
57
64
  if asynchronous is None:
@@ -62,6 +69,7 @@ class AsyncFileSystemWrapper(AsyncFileSystem):
62
69
  else:
63
70
  self.sync_fs = fsspec.filesystem(target_protocol, **target_options)
64
71
  self.protocol = self.sync_fs.protocol
72
+ self.semaphore = semaphore
65
73
  self._wrap_all_sync_methods()
66
74
 
67
75
  @property
@@ -83,7 +91,7 @@ class AsyncFileSystemWrapper(AsyncFileSystem):
83
91
 
84
92
  method = getattr(self.sync_fs, method_name)
85
93
  if callable(method) and not inspect.iscoroutinefunction(method):
86
- async_method = async_wrapper(method, obj=self)
94
+ async_method = async_wrapper(method, obj=self, semaphore=self.semaphore)
87
95
  setattr(self, f"_{method_name}", async_method)
88
96
 
89
97
  @classmethod