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.
- {fsspec-2025.9.0 → fsspec-2025.12.0}/.github/workflows/main.yaml +6 -6
- {fsspec-2025.9.0 → fsspec-2025.12.0}/.github/workflows/pypipublish.yaml +2 -2
- {fsspec-2025.9.0 → fsspec-2025.12.0}/.pre-commit-config.yaml +1 -2
- {fsspec-2025.9.0 → fsspec-2025.12.0}/PKG-INFO +4 -4
- {fsspec-2025.9.0 → fsspec-2025.12.0}/README.md +1 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/environment.yml +1 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/api.rst +61 -61
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/changelog.rst +47 -0
- fsspec-2025.12.0/docs/source/code-of-conduct.rst +126 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/features.rst +3 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/index.rst +5 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/_version.py +2 -2
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/asyn.py +7 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/caching.py +52 -45
- fsspec-2025.12.0/fsspec/conftest.py +125 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/core.py +21 -4
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/generic.py +2 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/arrow.py +13 -7
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/asyn_wrapper.py +3 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/cache_metadata.py +1 -3
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/cached.py +9 -4
- fsspec-2025.12.0/fsspec/implementations/chained.py +23 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/data.py +1 -2
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/dirfs.py +2 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/gist.py +25 -16
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/http.py +8 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/http_sync.py +7 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/jupyter.py +7 -2
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/libarchive.py +1 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/memory.py +4 -4
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/reference.py +15 -9
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/sftp.py +7 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/webhdfs.py +1 -1
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/json.py +7 -12
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/parquet.py +100 -61
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/registry.py +3 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/spec.py +17 -6
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/utils.py +11 -10
- {fsspec-2025.9.0 → fsspec-2025.12.0}/pyproject.toml +4 -4
- fsspec-2025.9.0/fsspec/conftest.py +0 -55
- {fsspec-2025.9.0 → fsspec-2025.12.0}/.codespellrc +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/.coveragerc +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/.gitattributes +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/.gitignore +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/LICENSE +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-downstream.yml +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-friends.yml +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-linux.yml +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/ci/environment-win.yml +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/Makefile +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/README.md +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/make.bat +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/_static/custom.css +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/async.rst +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/conf.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/copying.rst +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/developer.rst +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/img/gui.png +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/intro.rst +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/docs/source/usage.rst +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/__init__.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/archive.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/callbacks.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/compression.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/config.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/dircache.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/exceptions.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/fuse.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/gui.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/__init__.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/cache_mapper.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/dask.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/dbfs.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/ftp.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/git.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/github.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/local.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/smb.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/tar.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/implementations/zip.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/mapping.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/__init__.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/common.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/copy.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/get.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/mv.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/open.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/pipe.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/tests/abstract/put.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/fsspec/transaction.py +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/install_s3fs.sh +0 -0
- {fsspec-2025.9.0 → fsspec-2025.12.0}/readthedocs.yml +0 -0
- {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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
11
|
+
- uses: actions/checkout@v5
|
|
12
12
|
- name: Set up Python
|
|
13
|
-
uses: actions/setup-python@
|
|
13
|
+
uses: actions/setup-python@v6
|
|
14
14
|
with:
|
|
15
15
|
python-version: "3.x"
|
|
16
16
|
- name: Install dependencies
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fsspec
|
|
3
|
-
Version: 2025.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
@@ -7,17 +7,17 @@ User Functions
|
|
|
7
7
|
--------------
|
|
8
8
|
|
|
9
9
|
.. autosummary::
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
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.
|
|
32
|
-
__version_tuple__ = version_tuple = (2025,
|
|
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=
|
|
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 =
|
|
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
|
-
|
|
664
|
-
|
|
665
|
-
|
|
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
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
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
|
-
|
|
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]):
|