Skip to content

Bump fsspec from 2026.1.0 to 2026.6.0 - #111

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/uv/fsspec-2026.6.0
Closed

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/uv/fsspec-2026.6.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Oct 20, 2026 •

Copy link
Copy Markdown

Bumps fsspec from 2026.1.0 to 2026.6.0.

Commits
  • a245700 changelog (#2049)
  • 652325d Fix async cat ranges on error (#2045)
  • 073aac8 Forward kwargs from cat_ranges to cat_file (#2044)
  • 2818611 FTP: preserve filenames containing whitespace in _mlsd2 (#2043)
  • c879384 Prevent attribute error by checking for 'forced' attribute before flushing ca...
  • 71b8a6b Reflect async _walk correctly (#2040)
  • 5eec9f9 Fix: Omit threading.get_ident() from cache token for async implementations ...
  • 8643878 Small safety improvements (#2039)
  • a1c16ab Honour simple_templates everywhere in referenceFS (#2029)
  • 85facaa Fix infinite recursion in expand_path when resolving paths with glob magic ch...
  • Additional commits viewable in compare view

@dependabot
dependabot Bot requested a review from a team as a code owner October 20, 2026 10:20
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code labels Oct 20, 2026
Bumps [fsspec](https://github.com/fsspec/filesystem_spec) from 2026.1.0 to 2026.6.0.
- [Commits](fsspec/filesystem_spec@2026.1.0...2026.6.0)

---
updated-dependencies:
- dependency-name: fsspec
  dependency-version: 2026.6.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot
dependabot Bot force-pushed the dependabot/uv/fsspec-2026.6.0 branch from b28c12b to 4582cfb Compare October 22, 2026 15:46
jhamon added a commit that referenced this pull request Oct 22, 2026
…ns (#114)

## Intent

Put together fixes for all of the open dependency PRs on
https://github.com/pinecone-io/pinecone-datasets/pulls.

Open Dependabot PRs at intake (2026-10-22): #112 multidict 6.7.1->6.9.1;
#111 fsspec 2026.1.0->2026.6.0; #110 aiohttp 3.14.3->3.14.4; #109
minor-and-patch group of 10 (fsspec 2026.9.0, gcsfs 2026.10.1, s3fs
2026.9.0, pydantic 2.14.1, tenacity 9.2.1, ipykernel 7.3.0, ruff 0.17.0,
pytest-cov 7.1.0, tuna 0.5.15, tqdm 4.70.1); #108 urllib3 2.7.0->2.8.0;
#107 tornado 6.5.7->6.5.9; #106 oauthlib 3.3.1->4.0.0 (major); #104 mypy
1.19.1->2.3.0 (major); GitHub Actions majors #102 setup-python 5->7,
#101 upload-artifact 4->7, #100 deploy-pages 1->5, #99
upload-pages-artifact 1->5, #98 checkout 4->7. Several of these PRs have
failing test runs (e.g. #106 and #104: "Run tests" fail on 3.11-3.13;
#106 also fails "Dependency audit").

## What Changed
- Updated `uv.lock` to the versions from the open Dependabot PRs:
aiohttp 3.14.4, multidict 6.9.1, fsspec/s3fs 2026.9.0, gcsfs 2026.10.1,
urllib3 2.8.0, tornado 6.5.9, oauthlib 4.0.0, mypy 2.3.0, pydantic
2.14.1, tenacity 9.2.1, ipykernel 7.3.0, ruff 0.17.0, pytest-cov 7.1.0,
tuna 0.5.15, tqdm 4.70.1, plus the transitive updates they pull in (e.g.
`nest-asyncio` is replaced by `nest-asyncio2`, and `ast-serialize` is
added). `pyproject.toml` is unchanged.
- Bumped GitHub Actions in `ci.yml`, `cd.yml`, and `docs.yml`:
`actions/checkout` v4→v7, `actions/setup-python` v5→v7,
`actions/upload-artifact` v4→v7, `actions/upload-pages-artifact` v1→v5,
`actions/deploy-pages` v1→v5.
- Set `FETCH_RAW_TOKEN_EXPIRY=false` in the two GCS raw-token tests in
`tests/unit/test_fs_errors.py`, because the new gcsfs checks raw tokens
against Google's tokeninfo endpoint. Applied ruff 0.17 formatting to the
Python snippets in `README.md` and `MAINTAINERS.md`.

## Why the Dependabot PRs failed CI

- **"Run tests" (3.11–3.13) fails only on the Dependabot branches, not
on main.** The failing step is `Run pytest (integration tests)`: GCS
answers 401 "Anonymous caller does not have storage.objects.create
access" because Dependabot-triggered runs receive no Actions secrets, so
`GCS_SERVICE_ACCOUNT_CREDS_BASE64` is empty. Unit tests passed on those
runs, and main plus non-Dependabot PRs (e.g. #113) pass the integration
tests. It is a missing-secret problem, not a code incompatibility.
- **"Dependency audit"** failed on those branches because their lock
still carried vulnerable urllib3 2.7.0 and tornado 6.5.7; this PR bumps
both and pip-audit is clean.
- Two real incompatibilities only appear with the full set applied, and
are fixed here: ruff 0.17 formats Python blocks in Markdown (the format
check also failed on #109 alone), and gcsfs 2026.10.1 validates raw
string tokens against Google's tokeninfo endpoint at construction, which
broke two unit tests that pass fake tokens.

## Superseded Dependabot PRs (close after merge)

- #98
- #99
- #100
- #101
- #102
- #104
- #106
- #107
- #108
- #109
- #110
- #111
- #112

## Risk Assessment

✅ Low: The change only bumps the dev lockfile and GitHub Actions
versions, and it covers every Dependabot PR listed in the intent (all 13
version targets are in uv.lock or the workflows). pyproject constraints
and runtime code are unchanged. The only code edits are ruff-0.17
markdown reformatting and test env isolation for gcsfs's new raw-token
validation.

## Testing

Each Python version got an isolated locked environment, and the CI gates
the failing PRs tripped all passed: unit tests on 3.11, 3.12 and 3.13,
mypy 2.3.0 and pip-audit. Running the base commit's test file against
gcsfs 2026.10.1 fails the two raw-token tests with "Provided token is
either not valid, or expired"; the updated tests pass. The real library
completed a local catalog save/load round trip and downloaded a live
public dataset (6952 docs, dim 1536). A pdoc docs build succeeded. For
the bumped GitHub Actions, the new major tags exist and still accept the
inputs the workflows use; the workflows themselves can only run in
GitHub CI, and no workflow was run here. One mistake to report: the
first public-dataset run wrote about 64MB of parquet cache to
~/.pinecone-datasets, outside the worktree. That directory did not exist
before the run and was deleted; the re-run used an isolated cache dir.
All other temp venvs and caches were also removed, and the worktree is
clean. Nothing is UI-facing, so no screenshots were needed.

- Live validation: ✅ go - 8 of 9 scenarios driven live against the
product

| Scenario | Result | Live | Evidence |
| --- | --- | --- | --- |
| Developer syncs the updated lock on Python 3.11/3.12/3.13 and gets
every Dependabot target version | ✅ pass | live | unit-py3.11.txt /
unit-py3.12.txt / unit-py3.13.txt (version line) |
| CI &#39;Run tests&#39; unit suite passes on 3.11, 3.12 and 3.13 with
the new deps (previously failing on #104/#106) | ✅ pass | live |
unit-py3.*.txt: 160 passed, 3 skipped on each version |
| Adversarial: unmodified raw-token tests break under gcsfs 2026.10.1,
and the updated tests pass | ✅ pass | live | fs-token-regression.txt:
base file 2 failed (ValueError: Provided token is either not valid, or
expired), target file 2 passed |
| Lint gate: mypy 2.3.0 (major bump #104) type-checks the repo cleanly |
✅ pass | live | mypy.txt |
| Dependency audit gate (failing on #106) reports no known
vulnerabilities in the locked deps | ✅ pass | live | pip-audit.txt |
| End user saves a dataset to a local catalog, lists it, reloads it and
iterates documents | ✅ pass | live | e2e-py3.11.txt, e2e-py3.13.txt:
catalog list [&#39;e2e-ds&#39;], 5 docs / 1 query round-tripped |
| End user lists the public catalog and downloads a public dataset over
gcsfs/fsspec/aiohttp | ✅ pass | live | e2e-py3.11.txt, e2e-py3.13.txt:
32 public datasets; langchain-python-docs-text-embedding-ada-002 loaded,
6952 docs, dim 1536 |
| Docs workflow pdoc build produces HTML with the new deps | ✅ pass |
live | pdoc-dataset.html |
| Bumped GitHub Actions majors (checkout@v7, setup-python@v7,
upload-artifact@v7, upload-pages-artifact@v5, deploy-pages@v5) run
successfully in CI/docs/release workflows | ⏸️ untested | no |
GitHub-hosted workflows run only on GitHub&#39;s runners, and only after
a push, which this phase must not do. No local runner (e.g. act) is on
PATH. The Pages deploy and the PyPI release also need reposi… |

<details>
<summary>Evidence: Unit tests py3.11 (versions + result)</summary>

```text
3.11.15 fsspec 2026.9.0 gcsfs 2026.10.1 s3fs 2026.9.0 pydantic 2.14.1 aiohttp 3.14.4 multidict 6.9.1 urllib3 2.8.0 oauthlib 4.0.0 tornado 6.5.9 mypy 2.3.0

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
160 passed, 3 skipped, 7 warnings in 53.66s
```
</details>
<details>
<summary>Evidence: Unit tests py3.12</summary>

```text
3.12.13 fsspec 2026.9.0 gcsfs 2026.10.1 s3fs 2026.9.0 pydantic 2.14.1 aiohttp 3.14.4 multidict 6.9.1 urllib3 2.8.0 oauthlib 4.0.0 tornado 6.5.9 mypy 2.3.0

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
160 passed, 3 skipped, 7 warnings in 63.08s (0:01:03)
```
</details>
<details>
<summary>Evidence: Unit tests py3.13</summary>

```text
3.13.14 fsspec 2026.9.0 gcsfs 2026.10.1 s3fs 2026.9.0 pydantic 2.14.1 aiohttp 3.14.4 multidict 6.9.1 urllib3 2.8.0 oauthlib 4.0.0 tornado 6.5.9 mypy 2.3.0

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
160 passed, 3 skipped, 7 warnings in 56.71s
```
</details>
<details>
<summary>Evidence: gcsfs raw-token test: base file fails, target file
passes</summary>

```text
## base-commit test file vs new locked deps (gcsfs 2026.10.1):
>               raise ValueError("Provided token is either not valid, or expired.")
E               ValueError: Provided token is either not valid, or expired.
/var/folders/ty/3v2j9df158g6mhwgbrkwy3m00000gp/T/tmp.yK8sgkYBCE/venv3.12/lib/python3.12/site-packages/gcsfs/credentials.py:59: ValueError
FAILED ../../../../../../var/folders/ty/3v2j9df158g6mhwgbrkwy3m00000gp/T/tmp.yK8sgkYBCE/test_fs_errors_base.py::TestFSErrorPaths::test_get_cloud_fs_with_invalid_token
FAILED ../../../../../../var/folders/ty/3v2j9df158g6mhwgbrkwy3m00000gp/T/tmp.yK8sgkYBCE/test_fs_errors_base.py::TestFSErrorPaths::test_get_cloud_fs_gcs_with_custom_token
2 failed, 40 deselected in 1.56s
## target-commit test file:
..                                                                       [100%]
2 passed, 40 deselected in 0.97s
```
</details>
<details>
<summary>Evidence: mypy 2.3.0</summary>

`Success: no issues found in 36 source files`

```text
$ uv run mypy .
Success: no issues found in 36 source files
```
</details>
<details>
<summary>Evidence: pip-audit on locked deps</summary>

`No known vulnerabilities found`

```text
$ uv export ... && uvx pip-audit -r requirements-audit.txt
No known vulnerabilities found
```
</details>
<details>
<summary>Evidence: E2E local round trip + public dataset load
py3.11</summary>

```text
python 3.11.15
local catalog list: ['e2e-ds']
local round-trip docs: 5 queries: 1 first batch ids: ['0', '1', '2', '3', '4']
public catalog count: 32 sample: ['ANN_DEEP1B_d96_angular', 'ANN_Fashion-MNIST_d784_euclidean', 'ANN_GIST_d960_euclidean']
public dataset langchain-python-docs-text-embedding-ada-002 docs: 6952 dim: 1536
```
</details>
<details>
<summary>Evidence: E2E local round trip + public dataset load
py3.13</summary>

```text
python 3.13.14
local catalog list: ['e2e-ds']
local round-trip docs: 5 queries: 1 first batch ids: ['0', '1', '2', '3', '4']
public catalog count: 32 sample: ['ANN_DEEP1B_d96_angular', 'ANN_Fashion-MNIST_d784_euclidean', 'ANN_GIST_d960_euclidean']
public dataset langchain-python-docs-text-embedding-ada-002 docs: 6952 dim: 1536
```
</details>
<details>
<summary>Evidence: Action tags and inputs at new majors</summary>

```text
actions/checkout@v7 -> 3d3c42e5aac5ba805825da76410c181273ba90b1
actions/setup-python@v7 -> 6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
actions/upload-artifact@v7 -> cf430e030ddbb5b0abf93d22962f4752f3646cd9
actions/upload-pages-artifact@v5 -> fc324d3547104276b827a68afc52ff2a11cc49c9
actions/deploy-pages@v5 -> 368f82528645a54fb793d4d04e342629a3f51346
astral-sh/setup-uv@v5 -> e58605a9b6da7c637471fab8847a5e5a6b8df081
actions/checkout action.yml runs.using@major: node24 inputs: ['allow-unsafe-pr-checkout', 'clean', 'fetch-depth', 'fetch-tags', 'filter', 'github-server-url', 'lfs', 'path', 'persist-credentials', 'ref', 'repository', 'set-safe-directory', 'show-progress', 'sparse-checkout', 'sparse-checkout-cone-mode', 'ssh-key', 'ssh-known-hosts', 'ssh-strict', 'ssh-user', 'submodules', 'token']
actions/setup-python action.yml runs.using@major: node24 inputs: ['allow-prereleases', 'architecture', 'cache', 'cache-dependency-path', 'check-latest', 'freethreaded', 'mirror', 'mirror-token', 'pip-version', 'python-version', 'python-version-file', 'token', 'update-environment']
actions/upload-artifact action.yml runs.using@major: node24 inputs: ['archive', 'compression-level', 'if-no-files-found', 'include-hidden-files', 'name', 'overwrite', 'path', 'retention-days']
actions/upload-pages-artifact action.yml runs.using@major: composite inputs: ['include-hidden-files', 'name', 'path', 'retention-days']
actions/deploy-pages action.yml runs.using@major: node24 inputs: ['artifact_name', 'error_count', 'preview', 'reporting_interval', 'timeout', 'token']
```
</details>
<details>
<summary>Evidence: Rendered pdoc page from docs build</summary>

```text
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="generator" content="pdoc 16.0.0"/>
    <title>pinecone_datasets.dataset API documentation</title>

    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#49483e}.pdoc-code{background:#272822; color:#f8f8f2}.pdoc-code .c{color:#75715e}.pdoc-code .err{color:#960050; background-color:#1e0010}.pdoc-code .esc{color:#f8f8f2}.pdoc-code .g{color:#f8f8f2}.pdoc-code .k{color:#66d9ef}.pdoc-code .l{color:#ae81ff}.pdoc-code .n{color:#f8f8f2}.pdoc-code .o{color:#f92672}.pdoc-code .x{color:#f8f8f2}.pdoc-code .p{color:#f8f8f2}.pdoc-code .ch{color:#75715e}.pdoc-code .cm{color:#75715e}.pdoc-code .cp{color:#75715e}.pdoc-code .cpf{color:#75715e}.pdoc-code .c1{color:#75715e}.pdoc-code .cs{color:#75715e}.pdoc-code .gd{color:#f92672}.pdoc-code .ge{color:#f8f8f2; font-style:italic}.pdoc-code .gr{color:#f8f8f2}.pdoc-code .gh{color:#f8f8f2}.pdoc-code .gi{color:#a6e22e}.pdoc-code .go{color:#66d9ef}.pdoc-code .gp{color:#f92672; font-weight:bold}.pdoc-code .gs{color:#f8f8f2; font-weight:bold}.pdoc-code .gu{color:#75715e}.pdoc-code .gt{color:#f8f8f2}.pdoc-code .kc{color:#66d9ef}.pdoc-code .kd{color:#66d9ef}.pdoc-code .kn{color:#f92672}.pdoc-code .kp{color:#66d9ef}.pdoc-code .kr{color:#66d9ef}.pdoc-code .kt{color:#66d9ef}.pdoc-code .ld{color:#e6db74}.pdoc-code .m{color:#ae81ff}.pdoc-code .s{color:#e6db74}.pdoc-code .na{color:#a6e22e}.pdoc-code .nb{color:#f8f8f2}.pdoc-code .nc{color:#a6e22e}.pdoc-code .no{color:#66d9ef}.pdoc-code .nd{color:#a6e22e}.pdoc-code .ni{color:#f8f8f2}.pdoc-code .ne{color:#a6e22e}.pdoc-code .nf{color:#a6e22e}.pdoc-code .nl{color:#f8f8f2}.pdoc-code .nn{color:#f8f8f2}.pdoc-code .nx{color:#a6e22e}.pdoc-code .py{color:#f8f8f2}.pdoc-code .nt{color:#f92672}.pdoc-code .nv{color:#f8f8f2}.pdoc-code .ow{color:#f92672}.pdoc-code .w{color:#f8f8f2}.pdoc-code .mb{color:#ae81ff}.pdoc-code .mf{color:#ae81ff}.pdoc-code .mh{color:#ae81ff}.pdoc-code .mi{color:#ae81ff}.pdoc-code .mo{color:#ae81ff}.pdoc-code .sa{color:#e6db74}.pdoc-code .sb{color:#e6db74}.pdoc-code .sc{color:#e6db74}.pdoc-code .dl{color:#e6db74}.pdoc-code .sd{color:#e6db74}.pdoc-code .s2{color:#e6db74}.pdoc-code .se{color:#ae81ff}.pdoc-code .sh{color:#e6db74}.pdoc-code .si{color:#e6db74}.pdoc-code .sx{color:#e6db74}.pdoc-code .sr{color:#e6db74}.pdoc-code .s1{color:#e6db74}.pdoc-code .ss{color:#e6db74}.pdoc-code .bp{color:#f8f8f2}.pdoc-code .fm{color:#a6e22e}.pdoc-code .vc{color:#f8f8f2}.pdoc-code .vg{color:#f8f8f2}.pdoc-code .vi{color:#f8f8f2}.pdoc-code .vm{color:#f8f8f2}</style>
    <style>/*! theme.css */:root{--pdoc-background:#212529;}.pdoc{--text:#f7f7f7;--muted:#9d9d9d;--link:#58a6ff;--link-hover:#3989ff;--code:#333;--active:#555;--accent:#343434;--accent2:#555;--nav-hover:rgba(0, 0, 0, 0.1);--name:#77C1FF;--def:#0cdd0c;--annotation:#00c037;}</style>
    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;z-index:999;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem;}.git-button{displ

... [205188 bytes truncated] ...

o_pinecone_index-276"><span class="linenos">276</span></a><span class="sd">        DEPRECATED: This method has been removed. Please use the `pinecone.Index.upsert` method instead from the `pinecone` SDK package.</span>
</span><span id="Dataset.to_pinecone_index-277"><a href="#Dataset.to_pinecone_index-277"><span class="linenos">277</span></a><span class="sd">        &quot;&quot;&quot;</span>
</span><span id="Dataset.to_pinecone_index-278"><a href="#Dataset.to_pinecone_index-278"><span class="linenos">278</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
</span><span id="Dataset.to_pinecone_index-279"><a href="#Dataset.to_pinecone_index-279"><span class="linenos">279</span></a>            <span class="s2">&quot;This method has been removed. Please use the `pinecone.Index.upsert` method instead from the `pinecone` SDK package.&quot;</span>
</span><span id="Dataset.to_pinecone_index-280"><a href="#Dataset.to_pinecone_index-280"><span class="linenos">280</span></a>        <span class="p">)</span>
</span></pre></div>


            <div class="docstring"><p>DEPRECATED: This method has been removed. Please use the <code>pinecone.Index.upsert</code> method instead from the <code>pinecone</code> SDK package.</p>
</div>


                            </div>
                </section>
    </main>
<script>
    function escapeHTML(html) {
        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
    }

    const originalContent = document.querySelector("main.pdoc");
    let currentContent = originalContent;

    function setContent(innerHTML) {
        let elem;
        if (innerHTML) {
            elem = document.createElement("main");
            elem.classList.add("pdoc");
            elem.innerHTML = innerHTML;
        } else {
            elem = originalContent;
        }
        if (currentContent !== elem) {
            currentContent.replaceWith(elem);
            currentContent = elem;
        }
    }

    function getSearchTerm() {
        return (new URL(window.location)).searchParams.get("search");
    }

    const searchBox = document.querySelector(".pdoc input[type=search]");
    searchBox.addEventListener("input", function () {
        let url = new URL(window.location);
        if (searchBox.value.trim()) {
            url.hash = "";
            url.searchParams.set("search", searchBox.value);
        } else {
            url.searchParams.delete("search");
        }
        history.replaceState("", "", url.toString());
        onInput();
    });
    window.addEventListener("popstate", onInput);


    let search, searchErr;

    async function initialize() {
        try {
            search = await new Promise((resolve, reject) => {
                const script = document.createElement("script");
                script.type = "text/javascript";
                script.async = true;
                script.onload = () => resolve(window.pdocSearch);
                script.onerror = (e) => reject(e);
                script.src = "../search.js";
                document.getElementsByTagName("head")[0].appendChild(script);
            });
        } catch (e) {
            console.error("Cannot fetch pdoc search index");
            searchErr = "Cannot fetch search index.";
        }
        onInput();

        document.querySelector("nav.pdoc").addEventListener("click", e => {
            if (e.target.hash) {
                searchBox.value = "";
                searchBox.dispatchEvent(new Event("input"));
            }
        });
    }

    function onInput() {
        setContent((() => {
            const term = getSearchTerm();
            if (!term) {
                return null
            }
            if (searchErr) {
                return `<h3>Error: ${searchErr}</h3>`
            }
            if (!search) {
                return "<h3>Searching...</h3>"
            }

            window.scrollTo({top: 0, left: 0, behavior: 'auto'});

            const results = search(term);

            let html;
            if (results.length === 0) {
                html = `No search results for '${escapeHTML(term)}'.`
            } else {
                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
            }
            for (let result of results.slice(0, 10)) {
                let doc = result.doc;
                let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
                if (doc.qualname) {
                    url += `#${doc.qualname}`;
                }

                let heading;
                switch (result.doc.kind) {
                    case "function":
                        if (doc.fullname.endsWith(".__init__")) {
                            heading = `<span class="name">${doc.fullname.replace(/\.__init__$/, "")}</span>${doc.signature}`;
                        } else {
                            heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span>${doc.signature}`;
                        }
                        break;
                    case "class":
                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
                        if (doc.bases)
                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
                        heading += `:`;
                        break;
                    case "variable":
                        heading = `<span class="name">${doc.fullname}</span>`;
                        if (doc.annotation)
                            heading += `<span class="annotation">${doc.annotation}</span>`;
                        if (doc.default_value)
                            heading += `<span class="default_value"> = ${doc.default_value}</span>`;
                        break;
                    default:
                        heading = `<span class="name">${doc.fullname}</span>`;
                        break;
                }
                html += `
                        <section class="search-result">
                        <a href="${url}" class="attr ${doc.kind}">${heading}</a>
                        <div class="docstring">${doc.doc}</div>
                        </section>
                    `;

            }
            return html;
        })());
    }

    if (getSearchTerm()) {
        initialize();
        searchBox.value = getSearchTerm();
        onInput();
    } else {
        searchBox.addEventListener("focus", initialize, {once: true});
    }

    searchBox.addEventListener("keydown", e => {
        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
            let focused = currentContent.querySelector(".search-result.focused");
            if (!focused) {
                currentContent.querySelector(".search-result").classList.add("focused");
            } else if (
                e.key === "ArrowDown"
                && focused.nextElementSibling
                && focused.nextElementSibling.classList.contains("search-result")
            ) {
                focused.classList.remove("focused");
                focused.nextElementSibling.classList.add("focused");
                focused.nextElementSibling.scrollIntoView({
                    behavior: "smooth",
                    block: "nearest",
                    inline: "nearest"
                });
            } else if (
                e.key === "ArrowUp"
                && focused.previousElementSibling
                && focused.previousElementSibling.classList.contains("search-result")
            ) {
                focused.classList.remove("focused");
                focused.previousElementSibling.classList.add("focused");
                focused.previousElementSibling.scrollIntoView({
                    behavior: "smooth",
                    block: "nearest",
                    inline: "nearest"
                });
            } else if (
                e.key === "Enter"
            ) {
                focused.querySelector("a").click();
            }
        }
    });
</script></body>
</html>
```
</details>
- Outcome: ⚠️ 1 info across 1 run (7m51s)

## Pipeline

Updates from [git push
no-mistakes](https://github.com/kunchenguid/no-mistakes)

<!-- no-mistakes-pipeline-attestation:v1
{"head_sha":"4ddd5672706d621c5270d35c91569f2485c7d74b","steps":[{"step":"intent","status":"completed"},{"step":"rebase","status":"completed"},{"step":"review","status":"completed"},{"step":"test","status":"completed"},{"step":"document","status":"completed"},{"step":"lint","status":"completed"},{"step":"push","status":"completed"},{"step":"pr","status":"running"},{"step":"ci","status":"pending"}],"live_validation":{"verdict":"go","live":8,"total":9}}
-->

<details>
<summary>✅ **intent** - passed</summary>

✅ No issues found.
</details>

<details>
<summary>✅ **Rebase** - passed</summary>

✅ No issues found.
</details>

<details>
<summary>✅ **Review** - passed</summary>

✅ No issues found.
</details>

<details>
<summary>⚠️ **Test** - 1 info</summary>

- ℹ️ `tests/unit/test_fs_errors.py:24` - gcsfs 2026.10.1 now checks a
raw `token=` string against Google&#39;s tokeninfo endpoint when the
filesystem is created. As a result, get_cloud_fs(&#39;gs://...&#39;,
token=&lt;invalid&gt;) now raises ValueError right away instead of
failing on first use, and every raw token costs a network call. The
tests set FETCH_RAW_TOKEN_EXPIRY=false to avoid this, but library users
who pass raw tokens will see the change. It may be worth a release-notes
mention.
- Live validation: ✅ go - 8 of 9 scenarios driven live against the
product

| Scenario | Result | Live | Evidence |
| --- | --- | --- | --- |
| Developer syncs the updated lock on Python 3.11/3.12/3.13 and gets
every Dependabot target version | ✅ pass | live | unit-py3.11.txt /
unit-py3.12.txt / unit-py3.13.txt (version line) |
| CI &#39;Run tests&#39; unit suite passes on 3.11, 3.12 and 3.13 with
the new deps (previously failing on #104/#106) | ✅ pass | live |
unit-py3.*.txt: 160 passed, 3 skipped on each version |
| Adversarial: unmodified raw-token tests break under gcsfs 2026.10.1,
and the updated tests pass | ✅ pass | live | fs-token-regression.txt:
base file 2 failed (ValueError: Provided token is either not valid, or
expired), target file 2 passed |
| Lint gate: mypy 2.3.0 (major bump #104) type-checks the repo cleanly |
✅ pass | live | mypy.txt |
| Dependency audit gate (failing on #106) reports no known
vulnerabilities in the locked deps | ✅ pass | live | pip-audit.txt |
| End user saves a dataset to a local catalog, lists it, reloads it and
iterates documents | ✅ pass | live | e2e-py3.11.txt, e2e-py3.13.txt:
catalog list [&#39;e2e-ds&#39;], 5 docs / 1 query round-tripped |
| End user lists the public catalog and downloads a public dataset over
gcsfs/fsspec/aiohttp | ✅ pass | live | e2e-py3.11.txt, e2e-py3.13.txt:
32 public datasets; langchain-python-docs-text-embedding-ada-002 loaded,
6952 docs, dim 1536 |
| Docs workflow pdoc build produces HTML with the new deps | ✅ pass |
live | pdoc-dataset.html |
| Bumped GitHub Actions majors (checkout@v7, setup-python@v7,
upload-artifact@v7, upload-pages-artifact@v5, deploy-pages@v5) run
successfully in CI/docs/release workflows | ⏸️ untested | no |
GitHub-hosted workflows run only on GitHub&#39;s runners, and only after
a push, which this phase must not do. No local runner (e.g. act) is on
PATH. The Pages deploy and the PyPI release also need reposi… |

- <code>`uv sync --locked --all-extras --python {3.11,3.12,3.13}` into
separate temp venvs (UV_PROJECT_ENVIRONMENT), then imported each package
to confirm the resolved versions (fsspec 2026.9.0, gcsfs 2026.10.1, s3fs
2026.9.0, pydantic 2.14.1, aiohttp 3.14.4, multidict 6.9.1, urllib3
2.8.0, oauthlib 4.0.0, tornado 6.5.9, mypy 2.3.0)</code>
- <code>`uv run pytest -n 4 tests/unit` on 3.11, 3.12 and 3.13 (the CI
&#39;Run tests&#39; step that failed on #104/#106)</code>
- `Ran the base commit's tests/unit/test_fs_errors.py against the new
lock (-k 'invalid_token or gcs_with_custom_token') to reproduce the
gcsfs failure, then ran the target commit's version of the file`
- <code>`uv run mypy .` with mypy 2.3.0 (CI lint gate)</code>
- <code>`uv export --format requirements-txt --all-extras
--no-emit-project` + `uvx pip-audit -r` (CI Dependency audit
gate)</code>
- `End-to-end script on 3.11 and 3.13: Dataset.from_pandas ->
Catalog(base_path=tmp).save_dataset -> list/load_dataset ->
iter_documents; then list_datasets() +
load_dataset('langchain-python-docs-text-embedding-ada-002') from the
real public GCS catalog, with PINECONE_DATASETS_CACHE_DIR isolated`
- <code>`uv run pdoc -d google -o &lt;tmp&gt; --search -t pdoc_theme
./pinecone_datasets` (the docs.yml build step)</code>
- <code>`gh api repos/&lt;action&gt;/git/ref/tags/&lt;major&gt;` plus a
parse of each action&#39;s action.yml at the new major, to confirm the
tags exist and that the inputs the workflows use (python-version, name,
path) are still accepted</code>
</details>

<details>
<summary>✅ **Document** - passed</summary>

✅ No issues found.
</details>

<details>
<summary>✅ **Lint** - passed</summary>

✅ No issues found.
</details>

<details>
<summary>✅ **Push** - passed</summary>

✅ No issues found.
</details>

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Mostly CI, lockfile, and doc/test housekeeping; the main runtime
caveat is gcsfs now validating raw GCS tokens earlier, which can affect
callers that pass `token=` strings directly.
> 
> **Overview**
> Bumps **GitHub Actions** across `ci.yml`, `cd.yml`, and `docs.yml`:
`actions/checkout` and `actions/setup-python` to **v7**,
`actions/upload-artifact` to **v7**, and Pages deploy steps to
**upload-pages-artifact@v5** and **deploy-pages@v5**.
> 
> Updates **GCS filesystem unit tests** in `test_fs_errors.py` so raw
`token=` cases set `FETCH_RAW_TOKEN_EXPIRY=false`, matching newer
**gcsfs** behavior that validates raw tokens at construction time (tests
were failing without this).
> 
> Applies **ruff 0.17**-style formatting to Python examples in
`README.md` and `MAINTAINERS.md` (quotes and line wrapping only). The PR
also rolls up open **Dependabot** lockfile updates (fsspec/gcsfs/s3fs,
mypy 2.x, oauthlib 4.x, etc.) per the branch intent; `pyproject.toml`
and library runtime code are unchanged aside from the test env tweak
above.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
4ddd567. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@jhamon

jhamon commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

Superseded by #114, which applied this update together with the other open dependency updates.

@jhamon jhamon closed this Oct 22, 2026
@dependabot @github

dependabot Bot commented on behalf of github Oct 22, 2026

Copy link
Copy Markdown
Author

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot
dependabot Bot deleted the dependabot/uv/fsspec-2026.6.0 branch October 22, 2026 16:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant