Skip to content

Bump actions/upload-artifact from 4 to 7 - #101

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/upload-artifact-7
Closed

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/upload-artifact-7

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 14, 2026 •

Copy link
Copy Markdown

Bumps actions/upload-artifact from 4 to 7.

Release notes

Sourced from actions/upload-artifact's releases.

v7.0.0

v7 What's new

Direct Uploads

Adds support for uploading single files directly (unzipped). Callers can set the new archive parameter to false to skip zipping the file during upload. Right now, we only support single files. The action will fail if the glob passed resolves to multiple files. The name parameter is also ignored with this setting. Instead, the name of the artifact will be the name of the uploaded file.

ESM

To support new versions of the @actions/* packages, we've upgraded the package to ESM.

What's Changed

New Contributors

Full Changelog: actions/upload-artifact@v6...v7.0.0

v6.0.0

v6 - What's new

[!IMPORTANT] actions/upload-artifact@v6 now runs on Node.js 24 (runs.using: node24) and requires a minimum Actions Runner version of 2.327.1. If you are using self-hosted runners, ensure they are updated before upgrading.

Node.js 24

This release updates the runtime to Node.js 24. v5 had preliminary support for Node.js 24, however this action was by default still running on Node.js 20. Now this action by default will run on Node.js 24.

What's Changed

Full Changelog: actions/upload-artifact@v5.0.0...v6.0.0

v5.0.0

What's Changed

BREAKING CHANGE: this update supports Node v24.x. This is not a breaking change per-se but we're treating it as such.

... (truncated)

Commits
  • 043fb46 Merge pull request #797 from actions/yacaovsnc/update-dependency
  • 634250c Include changes in typespec/ts-http-runtime 0.3.5
  • e454baa Readme: bump all the example versions to v7 (#796)
  • 74fad66 Update the readme with direct upload details (#795)
  • bbbca2d Support direct file uploads (#764)
  • 589182c Upgrade the module to ESM and bump dependencies (#762)
  • 47309c9 Merge pull request #754 from actions/Link-/add-proxy-integration-tests
  • 02a8460 Add proxy integration test
  • b7c566a Merge pull request #745 from actions/upload-artifact-v6-release
  • e516bc8 docs: correct description of Node.js 24 support in README
  • Additional commits viewable in compare view

Dependabot compatibility score

You can trigger a rebase of this PR by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Note

Low Risk
Single GitHub Actions version pin in CI with no changes to runtime code or artifact inputs; v6+ may require newer self-hosted runners if those are used.

Overview
Updates the CI workflow step that publishes pytest HTML reports so it uses actions/upload-artifact@v7 instead of v4. Artifact name, path (report.html), and if: always() behavior are unchanged.

This is a Dependabot-driven dependency bump only; no application or test code is modified.

Reviewed by Cursor Bugbot for commit 3b3153c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note
Automatic rebases have been disabled on this pull request as it has been open for over 30 days.

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Aug 14, 2026
@dependabot
dependabot Bot requested a review from a team as a code owner August 14, 2026 04:28
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Aug 14, 2026
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/github_actions/actions/upload-artifact-7 branch October 22, 2026 16:20
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 github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant