fsspec 2025.9.0__tar.gz → 2025.12.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.9.0 → fsspec-2025.12.0}/.github/workflows/main.yaml +6 -6
  2. {fsspec-2025.9.0 → fsspec-2025.12.0}/.github/workflows/pypipublish.yaml +2 -2
  3. {fsspec-2025.9.0 → fsspec-2025.12.0}/.pre-commit-config.yaml +1 -2
  4. {fsspec-2025.9.0 → fsspec-2025.12.0}/PKG-INFO +4 -4
  5. {fsspec-2025.9.0 → fsspec-2025.12.0}/README.md +1 -1
  6. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/environment.yml +1 -1
  7. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/api.rst +61 -61
  8. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/changelog.rst +47 -0
  9. fsspec-2025.12.0/docs/source/code-of-conduct.rst +126 -0
  10. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/features.rst +3 -1
  11. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/index.rst +5 -0
  12. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/_version.py +2 -2
  13. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/asyn.py +7 -1
  14. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/caching.py +52 -45
  15. fsspec-2025.12.0/fsspec/conftest.py +125 -0
  16. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/core.py +21 -4
  17. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/generic.py +2 -0
  18. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/arrow.py +13 -7
  19. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/asyn_wrapper.py +3 -1
  20. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/cache_metadata.py +1 -3
  21. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/cached.py +9 -4
  22. fsspec-2025.12.0/fsspec/implementations/chained.py +23 -0
  23. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/data.py +1 -2
  24. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/dirfs.py +2 -1
  25. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/gist.py +25 -16
  26. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/http.py +8 -1
  27. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/http_sync.py +7 -1
  28. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/jupyter.py +7 -2
  29. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/libarchive.py +1 -1
  30. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/memory.py +4 -4
  31. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/reference.py +15 -9
  32. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/sftp.py +7 -0
  33. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/webhdfs.py +1 -1
  34. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/json.py +7 -12
  35. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/parquet.py +100 -61
  36. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/registry.py +3 -0
  37. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/spec.py +17 -6
  38. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/utils.py +11 -10
  39. {fsspec-2025.9.0 → fsspec-2025.12.0}/pyproject.toml +4 -4
  40. fsspec-2025.9.0/fsspec/conftest.py +0 -55
  41. {fsspec-2025.9.0 → fsspec-2025.12.0}/.codespellrc +0 -0
  42. {fsspec-2025.9.0 → fsspec-2025.12.0}/.coveragerc +0 -0
  43. {fsspec-2025.9.0 → fsspec-2025.12.0}/.gitattributes +0 -0
  44. {fsspec-2025.9.0 → fsspec-2025.12.0}/.gitignore +0 -0
  45. {fsspec-2025.9.0 → fsspec-2025.12.0}/LICENSE +0 -0
  46. {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-downstream.yml +0 -0
  47. {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-friends.yml +0 -0
  48. {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-linux.yml +0 -0
  49. {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-win.yml +0 -0
  50. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/Makefile +0 -0
  51. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/README.md +0 -0
  52. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/make.bat +0 -0
  53. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/_static/custom.css +0 -0
  54. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/async.rst +0 -0
  55. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/conf.py +0 -0
  56. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/copying.rst +0 -0
  57. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/developer.rst +0 -0
  58. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/img/gui.png +0 -0
  59. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/intro.rst +0 -0
  60. {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/usage.rst +0 -0
  61. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/__init__.py +0 -0
  62. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/archive.py +0 -0
  63. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/callbacks.py +0 -0
  64. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/compression.py +0 -0
  65. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/config.py +0 -0
  66. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/dircache.py +0 -0
  67. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/exceptions.py +0 -0
  68. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/fuse.py +0 -0
  69. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/gui.py +0 -0
  70. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/__init__.py +0 -0
  71. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/cache_mapper.py +0 -0
  72. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/dask.py +0 -0
  73. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/dbfs.py +0 -0
  74. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/ftp.py +0 -0
  75. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/git.py +0 -0
  76. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/github.py +0 -0
  77. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/local.py +0 -0
  78. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/smb.py +0 -0
  79. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/tar.py +0 -0
  80. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/zip.py +0 -0
  81. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/mapping.py +0 -0
  82. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/__init__.py +0 -0
  83. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/common.py +0 -0
  84. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/copy.py +0 -0
  85. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/get.py +0 -0
  86. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/mv.py +0 -0
  87. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/open.py +0 -0
  88. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/pipe.py +0 -0
  89. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/put.py +0 -0
  90. {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/transaction.py +0 -0
  91. {fsspec-2025.9.0 → fsspec-2025.12.0}/install_s3fs.sh +0 -0
  92. {fsspec-2025.9.0 → fsspec-2025.12.0}/readthedocs.yml +0 -0
  93. {fsspec-2025.9.0 → fsspec-2025.12.0}/setup.cfg +0 -0
@@ -14,18 +14,18 @@ jobs:
14
14
  fail-fast: false
15
15
  matrix:
16
16
  PY:
17
- - "3.9"
18
17
  - "3.10"
19
18
  - "3.11"
20
19
  - "3.12"
21
20
  - "3.13"
21
+ - "3.14"
22
22
 
23
23
  env:
24
24
  CIRUN: true
25
25
 
26
26
  steps:
27
27
  - name: Checkout
28
- uses: actions/checkout@v4
28
+ uses: actions/checkout@v5
29
29
  with:
30
30
  fetch-depth: 0
31
31
 
@@ -50,7 +50,7 @@ jobs:
50
50
 
51
51
  steps:
52
52
  - name: Checkout
53
- uses: actions/checkout@v4
53
+ uses: actions/checkout@v5
54
54
  with:
55
55
  fetch-depth: 0
56
56
 
@@ -81,7 +81,7 @@ jobs:
81
81
 
82
82
  steps:
83
83
  - name: Checkout
84
- uses: actions/checkout@v4
84
+ uses: actions/checkout@v5
85
85
  with:
86
86
  fetch-depth: 0
87
87
 
@@ -124,7 +124,7 @@ jobs:
124
124
 
125
125
  steps:
126
126
  - name: Checkout
127
- uses: actions/checkout@v4
127
+ uses: actions/checkout@v5
128
128
 
129
129
  - name: Setup conda
130
130
  uses: conda-incubator/setup-miniconda@v3
@@ -145,5 +145,5 @@ jobs:
145
145
  shell: bash -l {0}
146
146
  run: |
147
147
  cd ${{ matrix.FRIEND }}
148
- pytest -v
148
+ pytest -v -W ignore::pytest.PytestRemovedIn9Warning
149
149
  cd ..
@@ -8,9 +8,9 @@ jobs:
8
8
  deploy:
9
9
  runs-on: ubuntu-latest
10
10
  steps:
11
- - uses: actions/checkout@v4
11
+ - uses: actions/checkout@v5
12
12
  - name: Set up Python
13
- uses: actions/setup-python@v4
13
+ uses: actions/setup-python@v6
14
14
  with:
15
15
  python-version: "3.x"
16
16
  - name: Install dependencies
@@ -13,9 +13,8 @@ repos:
13
13
  - id: check-json
14
14
  - id: check-yaml
15
15
  - repo: https://github.com/astral-sh/ruff-pre-commit
16
- rev: v0.12.2
16
+ rev: v0.14.3
17
17
  hooks:
18
- # Run the linter.
19
18
  - id: ruff-check
20
19
  args: [ --fix, "--show-fixes"]
21
20
  - id: ruff-format
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fsspec
3
- Version: 2025.9.0
3
+ Version: 2025.12.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/
@@ -12,12 +12,12 @@ Keywords: file
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: Operating System :: OS Independent
15
- Classifier: Programming Language :: Python :: 3.9
16
15
  Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
18
17
  Classifier: Programming Language :: Python :: 3.12
19
18
  Classifier: Programming Language :: Python :: 3.13
20
- Requires-Python: >=3.9
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Requires-Python: >=3.10
21
21
  Provides-Extra: abfs
22
22
  Requires-Dist: adlfs; extra == 'abfs'
23
23
  Provides-Extra: adl
@@ -197,7 +197,7 @@ CI runtime. For local use, pick a version suitable for you.
197
197
 
198
198
  ```bash
199
199
  # For a new environment (mamba / conda).
200
- mamba create -n fsspec -c conda-forge python=3.9 -y
200
+ mamba create -n fsspec -c conda-forge python=3.10 -y
201
201
  conda activate fsspec
202
202
 
203
203
  # Standard dev install with docs and tests.
@@ -47,7 +47,7 @@ CI runtime. For local use, pick a version suitable for you.
47
47
 
48
48
  ```bash
49
49
  # For a new environment (mamba / conda).
50
- mamba create -n fsspec -c conda-forge python=3.9 -y
50
+ mamba create -n fsspec -c conda-forge python=3.10 -y
51
51
  conda activate fsspec
52
52
 
53
53
  # Standard dev install with docs and tests.
@@ -2,4 +2,4 @@ name: fsspec
2
2
  channels:
3
3
  - defaults
4
4
  dependencies:
5
- - python=3.9
5
+ - 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,53 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 2025.12.0
5
+ ---------
6
+
7
+ Enhancements
8
+
9
+ - fsspec.parquet to support filters and multiple files (#1945)
10
+
11
+ Fixes
12
+
13
+ - passing withdirs in aync _glob() (#1953)
14
+ - fix _rm_file/_rm redirection in async (#1951)
15
+ - allow arrowFile to be seekable (#1950)
16
+ - add size attribute to arrowFile (#1944)
17
+
18
+
19
+ Other
20
+
21
+ - support py3.14 and drop 3.9 (#1946)
22
+ - avoid ruff warning (#1942)
23
+
24
+ 2025.10.0
25
+ ---------
26
+
27
+ Enhancements
28
+
29
+ - specify storage_options not use use for tokenising; test instance cache (#1933)
30
+ - base class "chained" for FSs that pass through operations (#1929)
31
+
32
+ Fixes
33
+
34
+ - strip protocol for sftp (#1940)
35
+ - use one-step mv in jupyterfs (#1937)
36
+ - raise errors in jupyterfs, not return (#1936)
37
+ - add protocol attribute to http(#1935)
38
+ - allow ls() on a single file for arrowFS (#1931)
39
+ - support kwargs in webhdfs ls() (#1928)
40
+ - better discrimination for parquet in referenceFS (#1923)
41
+ - accept all mode= types in memoryFS (#1922)
42
+ - pass path list to put() in localtempfile for efficiency (#1920)
43
+ - fix docs errors (#1917)
44
+
45
+ Other
46
+
47
+ - add CoC (#1924)
48
+ - restrict github/gist tests because of rate limiting (#1918)
49
+
50
+
4
51
  2025.9.0
5
52
  --------
6
53
 
@@ -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
 
@@ -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.9.0'
32
- __version_tuple__ = version_tuple = (2025, 9, 0)
31
+ __version__ = version = '2025.12.0'
32
+ __version_tuple__ = version_tuple = (2025, 12, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -328,6 +328,11 @@ class AsyncFileSystem(AbstractFileSystem):
328
328
  return self._loop
329
329
 
330
330
  async def _rm_file(self, path, **kwargs):
331
+ if (
332
+ inspect.iscoroutinefunction(self._rm)
333
+ and type(self)._rm is not AsyncFileSystem._rm
334
+ ):
335
+ return await self._rm(path, recursive=False, batch_size=1, **kwargs)
331
336
  raise NotImplementedError
332
337
 
333
338
  async def _rm(self, path, recursive=False, batch_size=None, **kwargs):
@@ -776,6 +781,7 @@ class AsyncFileSystem(AbstractFileSystem):
776
781
  min_idx = min(idx_star, idx_qmark, idx_brace)
777
782
 
778
783
  detail = kwargs.pop("detail", False)
784
+ withdirs = kwargs.pop("withdirs", True)
779
785
 
780
786
  if not has_magic(path):
781
787
  if await self._exists(path, **kwargs):
@@ -805,7 +811,7 @@ class AsyncFileSystem(AbstractFileSystem):
805
811
  depth = None
806
812
 
807
813
  allpaths = await self._find(
808
- root, maxdepth=depth, withdirs=True, detail=True, **kwargs
814
+ root, maxdepth=depth, withdirs=withdirs, detail=True, **kwargs
809
815
  )
810
816
 
811
817
  pattern = glob_translate(path + ("/" if ends_with_sep else ""))
@@ -6,20 +6,12 @@ import logging
6
6
  import math
7
7
  import os
8
8
  import threading
9
- import warnings
10
9
  from collections import OrderedDict
10
+ from collections.abc import Callable
11
11
  from concurrent.futures import Future, ThreadPoolExecutor
12
12
  from itertools import groupby
13
13
  from operator import itemgetter
14
- from typing import (
15
- TYPE_CHECKING,
16
- Any,
17
- Callable,
18
- ClassVar,
19
- Generic,
20
- NamedTuple,
21
- TypeVar,
22
- )
14
+ from typing import TYPE_CHECKING, Any, ClassVar, Generic, NamedTuple, TypeVar
23
15
 
24
16
  if TYPE_CHECKING:
25
17
  import mmap
@@ -629,7 +621,7 @@ class KnownPartsOfAFile(BaseCache):
629
621
  fetcher: Fetcher,
630
622
  size: int,
631
623
  data: dict[tuple[int, int], bytes] | None = None,
632
- strict: bool = True,
624
+ strict: bool = False,
633
625
  **_: Any,
634
626
  ):
635
627
  super().__init__(blocksize, fetcher, size)
@@ -653,50 +645,65 @@ class KnownPartsOfAFile(BaseCache):
653
645
  else:
654
646
  self.data = {}
655
647
 
648
+ @property
649
+ def size(self):
650
+ return sum(_[1] - _[0] for _ in self.data)
651
+
652
+ @size.setter
653
+ def size(self, value):
654
+ pass
655
+
656
+ @property
657
+ def nblocks(self):
658
+ return len(self.data)
659
+
660
+ @nblocks.setter
661
+ def nblocks(self, value):
662
+ pass
663
+
656
664
  def _fetch(self, start: int | None, stop: int | None) -> bytes:
657
665
  if start is None:
658
666
  start = 0
659
667
  if stop is None:
660
668
  stop = self.size
669
+ self.total_requested_bytes += stop - start
661
670
 
662
671
  out = b""
663
- for (loc0, loc1), data in self.data.items():
664
- # If self.strict=False, use zero-padded data
665
- # for reads beyond the end of a "known" buffer
672
+ started = False
673
+ loc_old = 0
674
+ for loc0, loc1 in sorted(self.data):
675
+ if (loc0 <= start < loc1) and (loc0 <= stop <= loc1):
676
+ # entirely within the block
677
+ off = start - loc0
678
+ self.hit_count += 1
679
+ return self.data[(loc0, loc1)][off : off + stop - start]
680
+ if stop <= loc0:
681
+ break
682
+ if started and loc0 > loc_old:
683
+ # a gap where we need data
684
+ self.miss_count += 1
685
+ if self.strict:
686
+ raise ValueError
687
+ out += b"\x00" * (loc0 - loc_old)
666
688
  if loc0 <= start < loc1:
689
+ # found the start
690
+ self.hit_count += 1
667
691
  off = start - loc0
668
- out = data[off : off + stop - start]
669
- if not self.strict or loc0 <= stop <= loc1:
670
- # The request is within a known range, or
671
- # it begins within a known range, and we
672
- # are allowed to pad reads beyond the
673
- # buffer with zero
674
- out += b"\x00" * (stop - start - len(out))
675
- self.hit_count += 1
676
- return out
677
- else:
678
- # The request ends outside a known range,
679
- # and we are being "strict" about reads
680
- # beyond the buffer
681
- start = loc1
682
- break
683
-
684
- # We only get here if there is a request outside the
685
- # known parts of the file. In an ideal world, this
686
- # should never happen
687
- if self.fetcher is None:
688
- # We cannot fetch the data, so raise an error
689
- raise ValueError(f"Read is outside the known file parts: {(start, stop)}. ")
690
- # We can fetch the data, but should warn the user
691
- # that this may be slow
692
- warnings.warn(
693
- f"Read is outside the known file parts: {(start, stop)}. "
694
- f"IO/caching performance may be poor!"
695
- )
696
- logger.debug(f"KnownPartsOfAFile cache fetching {start}-{stop}")
697
- self.total_requested_bytes += stop - start
692
+ out = self.data[(loc0, loc1)][off : off + stop - start]
693
+ started = True
694
+ elif start < loc0 and stop > loc1:
695
+ # the whole block
696
+ self.hit_count += 1
697
+ out += self.data[(loc0, loc1)]
698
+ elif loc0 <= stop <= loc1:
699
+ # end block
700
+ self.hit_count += 1
701
+ return out + self.data[(loc0, loc1)][: stop - loc0]
702
+ loc_old = loc1
698
703
  self.miss_count += 1
699
- return out + super()._fetch(start, stop)
704
+ if started and not self.strict:
705
+ return out + b"\x00" * (stop - loc_old)
706
+ raise ValueError
700
707
 
701
708
 
702
709
  class UpdatableLRU(Generic[P, T]):