12273 Commits

Author SHA1 Message Date
Isaac Flath
3030e6a26f Quiet CLI dev runner on success 2026-06-04 13:28:55 -04:00
Isaac Flath
7bdcd2adde Add CLI dev runner 2026-06-04 13:28:55 -04:00
Isaac Flath
fa5e4d58b0 Add initial Anki CLI 2026-06-04 13:28:55 -04:00
Fernando Lins
a62e6f7370 docs: expand contributing guide with PR process and test requirements (#4946)
## Linked issue

Closes #4945

## Summary / motivation 

Two small clarifications to the contributing guide:

- Added a **Pull Request Description** section pointing contributors to
the
  PR template (`.github/pull_request_template.md`), so they know upfront
  what fields are required before opening a PR.
- Strengthened the test coverage requirement from "please consider" to a
clear rule, with explicit exceptions (version bumps, docs, translations,
  dependency updates, chore).
2026-06-02 15:09:47 -03:00
Fernando Lins
c71c13b56e fix: prevent duplicate "missing linked issue" comments on PR edits (#4937)
Fixes #4936

## Problem

The `check-linked-issue` workflow runs on every `opened` and `edited` PR
event. When a PR had no linked issue, each edit triggered a new bot
comment, resulting in duplicates (e.g. #4934).

## Solution

Before posting the comment, list the existing PR comments and skip
posting if the bot has already left one with the same message.
The `missing-issue` label re-application is harmless since GitHub
deduplicates labels automatically.
2026-06-02 15:09:20 -03:00
Luc Mcgrady
fc5103bc33 chore(ci):Use commit SHAs for github actions (#4916)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

<!-- Fixes #123 / Closes #123 / Refs #123 -->
closes #4722

## Summary / motivation (required)

<!-- What this PR does and why. For larger changes, add enough context
for reviewers. -->
I used this nice script I found:
https://gist.github.com/onnimonni/3462f958c7d235417863651974514525

For the reasons behind this change see:
- #4722

## Steps to reproduce (required, use N/A if not applicable)

<!-- Steps to reproduce: how to trigger the bug in the broken state (the
"before").
 - Mainly for bugfixes;
    - For bugs: numbered steps before the fix. For non-bugs: write N/A.
 - use N/A for features, refactors, docs, chore, etc.
-->
(N/A)

## How to test (required)

<!--- How to test: how you verified the change (checks, unit tests,
manual steps, edge cases — the "after" or general validation). --->
See it run in my repo here:
https://github.com/Luc-Mcgrady/anki/actions/runs/26718877866

### Checklist (minimum)

- [X] I ran `./ninja check` or an equivalent relevant check locally.
- [ ] I added or updated tests when the change is non-trivial or
behavior changed.

### Details

<!-- Commands, manual steps, edge cases, and what you observed -->
## Before / after behavior (optional)

<!-- For bugfixes: behavior before vs after. For other types: N/A or a
short note. -->

## Risk / compatibility / migration (optional)

<!-- Breaking changes, rollout notes, or N/A for small / low-risk PRs
-->

## UI evidence (required for visual changes; otherwise N/A)

<!-- Screenshot or short video -->

## Scope

- [X] This PR is focused on one change (no unrelated edits).
2026-06-02 10:35:32 -03:00
Abdo
398b51b2ed fix: wrong path of mpv libs in anki-audio wheel (#4919)
## Linked issue

Closes #4918 

## Summary

The anki-audio wheel build script was accidentally using `lib` instead
of `libs` for copied mpv libraries.

## Steps to reproduce (before)

Follow reproduction steps in the forum report and confirm you see the
issue.

## How to test (after)


- Build the wheel: `./qt/audio/build.sh`.
- Confirm `qt/audio/anki_audio/libs` is created.
- Extract `out/wheels/anki_audio-0.2.0-*.whl` and confirm it has the
correct structure.
- Run mpv in the extracted wheel: `./mpv` and confirm no library errors.
2026-06-02 12:30:45 +03:00
Abdo
2f3cff1b38 chore: Exclude github-actions[bot] from contributor check (#4923)
Closes #4922
2026-06-01 16:50:06 +03:00
Abdo
743b6bbb0d fix: Use Powershell to run just commands on Windows (#4921)
## Linked issue

Closes #4920

## Summary

Default to PowerShell 7+ to run just commands on Windows for more
consistent argument quoting rules.

## Steps to reproduce (before)

- Trigger the release workflow: `just release::build --ref main`.
- Inspect the logs of the `prepare` step on GitHub and notice that the
version has literal double quotes.

## How to test (after)

Repeat the same steps and confirm quotes are not passed literally.
2026-06-01 16:49:39 +03:00
Abdo
1822a7c76c feat: Bump anki-audio package (#4913)
## Linked issue

Closes #4699

## Summary

This bumps `anki-audio` to the newly published 0.2.0 release.

## How to test

Confirm audio recording & playback is working by using the record button
in the editor.
2026-05-29 22:52:19 +03:00
Abdo
60dcc5f3c5 fix: Update GitHub environments (#4912)
## Linked issue

Closes #4911

## Summary

Update release/publish workflows to use the new environments.
2026-05-29 20:26:32 +03:00
Fernando Lins
4702443f31 ci: enforce linked issue requirement on PRs (#4910)
## Linked issue 

Closes #4816 

## Summary / motivation

Adds two workflows to enforce the rule that every PR must be linked to
an existing issue:

- **check-linked-issue**: triggers on PR open/edit, applies the
`missing-issue` label and notifies the author if no linked issue is
found. Removes the label if the author later links one.
- **auto-close-missing-issue**: runs daily and closes any PR that has
had the `missing-issue` label for more than 4 days.

Hotfixes (title contains `hotfix`) and Dependabot PRs are exempt.

## How to test

1. Open a PR without a linked issue, the `missing-issue` label should be
applied and a comment posted.
2. Edit the PR description to add `Closes #<number>`, the label should
be removed.
3. Trigger the auto-close workflow manually via Actions → `Auto-close
PRs without linked issue` → Run workflow, and verify it closes PRs that
have had the label for over 4 days.
2026-05-29 14:24:42 -03:00
Abdo
e5ea3fb40a feat: Allow MSI installer downgrades (#4909)
## Linked issue

Closes #4908

## Summary / motivation

Update the Wix template to allow users to install older versions of the
app, overwriting an existing newer version. See changes in the template:
f4b00da7d0

## Steps to reproduce (before)

1. Build the installer (`./tools/ninja installer:package`) with the
current main branch.
2. Install the MSI package at out/installer/dist.
3. Remove the out/installer folder, modify the .version file to decrease
the version (e.g. `25.09.1`) and build the installer again.
4. Try to install the package - you should get an error message.

## How to test (after)

Repeat the same process and confirm you can install the older version
with no errors.
2026-05-28 18:43:37 +03:00
Abdo
5e46fc4494 fix: Validate add-on's zip entries (#4901)
This validates add-on's zip paths to skip things such as UNC paths
2026-05-27 16:30:06 +03:00
Abdo
56d93bb3da fix: Parameterize inputs of prop:cd* queries (#4905)
It was possible to construct invalid SQLite queries for browser searches
in some cases, for example by searching for `prop:cds:foo=';`.
2026-05-27 16:29:42 +03:00
Tim Arnold
9c72a8b828 feat: render sync server messages as rich text (#4560)
## Summary
- Pass `type="rich"` to `showText()` when displaying the sync server
message, enabling HTML rendering via `QTextBrowser.setHtml()`
- Plain-text messages continue to render identically — `setHtml()`
handles plain strings the same as `setPlainText()`
- Allows self-hosted sync servers to send formatted post-sync messages
(e.g. styled statistics, notices with links, tables)

## Context

The `/sync/meta` response includes a `msg` field that is displayed to
the user after sync. The display widget is already a `QTextBrowser`
(which supports Qt rich text/HTML), but `showText()` is called with the
default `type="text"`, routing through `setPlainText()`.

The `showText` helper already has full HTML support — it just needs
`type="rich"`:

```python
# qt/aqt/utils.py
text = QTextBrowser()
text.setOpenExternalLinks(True)
if type == "text":
    text.setPlainText(txt)    # current path
else:
    text.setHtml(txt)         # proposed path
```

**Security:** `QTextBrowser` does not execute JavaScript — only static
HTML/CSS. The sync server is explicitly configured and trusted by the
user.
2026-05-26 21:59:23 +03:00
Abdo
5d1266eb8e fix: Strip HTML from note type names in Empty Cards (#4902)
Strip HTML from note type and template names in the Empty Cards screen.

## How to test
```
cargo test -p anki --lib notetype::emptycards
```

---------

Co-authored-by: Fernando Lins <1887601+fernandolins@users.noreply.github.com>
2026-05-26 18:55:43 +03:00
Abdo
6f332d3a6b refactor: import some modules lazily (#4831)
## Linked issue

A slight improvement related to #4314

## Summary

Import some modules like `jsonschema`, `bs4` and `aqt.mediasrv` lazily
to speed up startup a bit.

## Steps to reproduce

Run Anki with `-X importtime` passed to Python:
```diff
diff --git a/run b/run
index 3051345b1..a907b2925 100755
--- a/run
+++ b/run
@@ -17,4 +17,4 @@ export ANKI_API_PORT=${ANKI_API_PORT-40000}
 export ANKI_API_HOST=${ANKI_API_HOST-127.0.0.1}

 ./ninja pylib qt
-${PYENV}/bin/python tools/run.py $*
+${PYENV}/bin/python -X importtime tools/run.py 2> importtime.txt $*
diff --git a/run.bat b/run.bat
index aecbf2491..69a721641 100755
--- a/run.bat
+++ b/run.bat
@@ -12,5 +12,5 @@ set ANKI_API_HOST=127.0.0.1
 @if not defined PYENV set PYENV=out\pyenv

 call tools\ninja pylib qt || exit /b 1
-%PYENV%\Scripts\python tools\run.py %* || exit /b 1
+%PYENV%\Scripts\python -X importtime tools\run.py %* 2> importtime.txt || exit /b 1
 popd
```

Then import `importtime.txt` to
[https://github.com/kmichel/python-importtime-graph](https://github.com/kmichel/python-importtime-graph)
to visualize timings. You should see `jsonschema` and `bs4` are loaded
at startup.

## How to test

Run profiling again and confirm `jsonschema` and `bs4` are not loaded at
startup. `aqt.mediasrv` will still be loaded at startup (because it's
immediately used in the main screen) but at a later stage.

---------

Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>
2026-05-26 18:51:31 +03:00
Abdo
88ef75f363 fix: Limit taskbar pinning fix to launcher builds (#4849)
This just limits the fix added in
469fd763c7
to the launcher so it has no effect on Briefcase builds. It looks
harmless, but just in case it does cause subtle issues.

---------

Co-authored-by: Fernando Lins <1887601+fernandolins@users.noreply.github.com>
2026-05-26 13:22:18 +03:00
Abdo
6d42e37b72 fix: app unresponsive after clicking on Help button in modal dialogs (#4897)
## Linked issue

Closes #4896

## Summary

On macOS, clicking the Help button in error dialogs shown on top of
modal dialogs such as the Filtered deck screen was causing the app to
become unresponsive after the recent Qt upgrade. This was fixed by:

1. Setting a parent widget for `QMessageBox`.
2. Limiting the `.disconnect()` calls to the `clicked` signal.

## Steps to reproduce (before)

I was not able to reproduce the issue in a dev environment. I had to
build and run the Briefcase package. Follow the steps in the
[forums](https://forums.ankiweb.net/t/anki-26-05-beta-1/69707/43?u=abdo)
and confirm you can reproduce the issue.

## How to test (after)

Run the Briefcase package with the changes and follow reproduction steps
and confirm the issue is fixed.
2026-05-26 13:03:02 +03:00
Abdo
892aa9c7a9 fix: Avoid broad warnings filter (#4900)
This replaces a broad `warnings.filterwarnings("ignore")` call triggered
when `ANKI_NOVERIFYSSL` is set.
2026-05-26 13:00:49 +03:00
Abdo
e05a7aace7 feat: Install required system dependencies in install.sh (#4895)
## Linked issue

Closes #4834

## Summary

This installs required Linux system dependencies in the install.sh
script for Debian-based distributions.

## Steps to reproduce (before)

No system dependencies are installed automatically. Users have to refer
to the
[manual](https://docs.ankiweb.net/platform/linux/installing.html#requirements)
to find a (partial) list of required packages.

## How to test (after)

Build the installer and run install.sh in any supported distro and
confirm dependencies are installed.
2026-05-26 13:00:37 +03:00
Fernando Lins
3f6378aee7 ci(coverage): fail PR if line coverage regresses (#4876)
## Linked issue

Closes #4874

## Summary / motivation

Adds `tools/coverage/check-coverage-regression.py` to compare line
coverage percentages from the current PR against the baseline saved from
main (introduced in #4875). If any stack regresses beyond the
configured tolerance (0.10%), the CI fails with a clear message showing
the delta.

Stacks checked: Rust, python-pylib, python-qt, TypeScript.

## How to test

Try to add some new code without any tests. The Ci must fail.

## Before / after behavior

Before: no signal when a PR reduces coverage below the current main
level.
After: CI fails on `Check coverage regression` with output like:
```
[rust] REGRESSION: 62.64% -> 61.00% (delta: -1.64%, tolerance: 0.10%)
1 stack(s) with coverage regression: rust
```
2026-05-25 13:46:57 -03:00
llama
e9830169b7 feat(check-media): case-insensitively dedupe media filenames (#4852)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

- #4433
- #4716 

## Summary / motivation (required)

This PR modifies `Check Media` to dedupe filenames case-insensitively so
as to avoid files that were added on case-sensitive filesystems
potentially being overwritten on case-insensitive ones

## Steps to reproduce (required, use N/A if not applicable)

N/A

## How to test (required)

Given a.jpg (hash 1), A.JPG (hash 2) and a.JPG (hash 1) as existing
media files on a case-sensitive fs, see that `Check Media` renames A.JPG
to a-2.jpg and a.JPG to a.jpg

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [ ] I added or updated tests when the change is non-trivial or
behavior changed.

## Scope

- [x] This PR is focused on one change (no unrelated edits).
2026-05-25 14:05:34 +03:00
llama
57e67f8408 fix(check-media): case-sensitivity in unused/missing check (#4861)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

- #4716

## Summary / motivation (required)

Currently, on filesystems where the media folder is treated as
case-insensitive, `[sound:BLAH.mp3]` and `[sound:blah.mp3]` point to the
same file on disk (if any), but one of the two would be considered as a
ref pointing to a missing file by the media checker which assumes
case-sensitivity

## Steps to reproduce (required, use N/A if not applicable)

See linked pr

## How to test (required)

On windows/macos, add `blah.mp3`, rename `blah.mp3` to `Blah.mp3` in the
ref, run `Check Media` and see that `Blah.mp3` isn't considered missing

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [ ] I added or updated tests when the change is non-trivial or
behavior changed.

## Scope

- [x] This PR is focused on one change (no unrelated edits).
2026-05-25 12:09:14 +03:00
David Sauerwein
e13092ef74 Replace print() logging in pylib with Python logging (#4666)
Use Python logging facilities instead of printing directly to stdout
with print(). This prevents library consumers from being spammed with
unwanted debug logs and stack traces.

Closes #4665

---

My approach to the log levels is `warning` for any deprecation warning
and `debug` for the "blocked main thread" messages.

The pylib is used in the qt parts of the anki code. To the best of my
understanding, logging is already correctly set up there and no
adjustments are needed.

The [issue I created](https://github.com/ankitects/anki/issues/4665) for
this has a reproducer. With this change applied, the messages are gone
when configuring the anki logger accordingly.

```python3
from anki.collection import Collection
import logging

logging.basicConfig(level=logging.DEBUG)
logging.getLogger("anki").setLevel(logging.INFO)

col = Collection("collection.anki2")
auth = col.sync_login(
    username=r"<username>",
    password=r"<password>",
    endpoint="https://sync.ankiweb.net/",
)
col.close()
```

setting the anki logger back to `DEBUG` makes the message appear again.
Note that the format is only slightly different then previously.

```txt
DEBUG:anki._backend:blocked main thread for 309ms
Stack (most recent call last):
  File "/home/david/coding_stuff/anki/repro.py", line 8, in <module>
    auth = col.sync_login(
  File "/home/david/coding_stuff/anki/.venv/lib/python3.14/site-packages/anki/collection.py", line 1141, in sync_login
    return self._backend.sync_login(
  File "/home/david/coding_stuff/anki/.venv/lib/python3.14/site-packages/anki/_backend_generated.py", line 83, in sync_login
    raw_bytes = self._run_command(1, 3, message.SerializeToString())
  File "/home/david/coding_stuff/anki/.venv/lib/python3.14/site-packages/anki/_backend.py", line 168, in _run_command
    logger.debug(
```
2026-05-25 10:55:54 +03:00
Abdo
a754a9c847 feat: Bundle Fcitx plugin (#4886)
## Linked issue

Closes #4873

## Summary

Build and package the fcitx5-qt6 plugin.

Latest release CI run:
https://github.com/ankitects/anki/actions/runs/26294296416


## How to test

1. Run installer build on Linux: `./ninja installer:build`.
2. Go to the Qt build directory
(`out/installer/build/anki/linux/zip/anki/app_packages/PyQt6/Qt6`) and
confirm you see the following files:
1.
`plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so`
    2. `plugins/dbusaddons/libFcitx5Qt6DBusAddons.so*`
2026-05-22 22:33:36 +03:00
Fernando Lins
3ca006dd47 chore(CI): cache coverage baseline from main for regression checks (#4875)
## Linked issue

Refs #4874

## Summary / motivation

Stores the coverage results from every push to `main` in a GitHub
Actions
cache (`coverage-baseline-linux-{sha}`). This is the foundation for a
follow-up PR that will compare PR coverage against this baseline and
fail
if any stack regresses.

No behavior change for PRs yet — the baseline is only saved, not used.

## Before / after behavior

Before: no coverage data persisted between CI runs.
After: each push to `main` saves `out/coverage/` as a cache entry, keyed
by commit SHA, retrievable by prefix `coverage-baseline-linux-`.
2026-05-22 16:01:11 -03:00
Fernando Lins
a140d39329 chore(e2e): add Playwright end-to-end test infrastructure (#4864)
## Linked issue

Closes #4863

## Summary / motivation

Adds Playwright as the e2e test framework so contributors can write
browser-based tests against a real headless Anki instance. There was no
automated way to exercise mediasrv pages, SvelteKit routes, or the
`/_anki/` RPC surface from a browser, this PR establishes that harness.

Key pieces:
- `qt/tests/launch_anki_for_e2e.py` — spawns a throwaway Anki instance
(temp `ANKI_BASE`, `QT_QPA_PLATFORM=offscreen`). Pre-seeds `prefs21.db`
so Anki skips the language picker and profile chooser and goes straight
  to serving mediasrv.
- `playwright.config.ts` — points `webServer` at the launcher; polls
  `/favicon.ico` as the readiness probe.
- `ts/tests/e2e/` — `fixtures.ts` base and a sanity spec that verifies
  mediasrv is reachable and a SvelteKit page hydrates.
- `justfile` — `just test-e2e` recipe; Chromium installed to
  `out/playwright-browsers/`.
- CI — e2e step in `check-linux`; failed-run artifacts uploaded for 7
days.
- `docs/e2e-testing.md` — contributor guide covering setup, managed vs
  reuse-server modes, and writing new tests.

## How to test

Build the project once, then run the e2e suite in managed mode (no
separate `./run` needed — the launcher is started automatically):

```shell
just build
just test-e2e
```

## Before / after behavior (optional)
Before: no browser-level test harness existed.
After: `just test-e2e` drives a real headless Anki instance via
Playwright.

## Risk / compatibility / migration
No production code changed. New dev-only files and CI step only.
Chromium is installed to `out/playwright-browsers/` (gitignored) and
does not affect the regular build.

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-22 15:59:42 -03:00
Abdo
1394540217 test: Add tests for build_installer.py (#4868)
## Linked issue

Closes #4859

## Summary

Add tests for the build_installer.py script with 100% coverage.

## How to test

Run `just test-py --coverage --html` and browse coverage data.
2026-05-21 07:10:27 +03:00
Abdo
0519275682 fix: border color of browser cells in macOS (#4872)
## Linked issue

Closes #4870

## Summary

This fixes the border color of browser cells in macOS not following
Anki's theme after Qt 6.10+

## Steps to reproduce (before)

1. Set Anki's theme from _Anki (`python` in dev environment) >
Preferences > Theme_ to be the opposite of your system theme.
2. Open the Browse screen and notice the cell borders have the opposite
color of your Anki theme, matching the system theme.

## How to test (after)

Notice cell borders are more subtle now.

### Details

## UI evidence

Before:
<img width="628" height="346" alt="image"
src="https://github.com/user-attachments/assets/3b46c9fe-5eb8-4e03-ac93-5429d1768344"
/>

After:
<img width="628" height="346" alt="image"
src="https://github.com/user-attachments/assets/aeea6867-ebfe-46cc-8b4a-6f7440da16f4"
/>
2026-05-21 07:10:11 +03:00
Fernando Lins
c1b824258e feat: add test coverage docs (#4844)
## Linked issue

Refs #4838 #4839 #4840

## Summary / motivation

Adds a contributor-facing guide for the test coverage setup introduced
across the three coverage PRs, and updates CLAUDE.md to reflect that
`just` is now the single entry point for all build, test, lint, and
format commands.

## How to test

- Read `docs/testing-coverage.md` — verify it covers all three stacks,
  thresholds, and the known gaps section.
- Run `just docs` and open `out/docs/html/index.html` to confirm
  `testing-coverage` appears in the sidebar under Contributing.
- Read `CLAUDE.md` — verify `./ninja` / `./tools` references are gone
  and `just test-rust`, `just test-py`, `just test-ts` are mentioned.

### Details

- `docs/testing-coverage.md`: documents tools, thresholds, per-stack
  entry points, and known gaps for all three coverage stacks.
- `docs/index.md`: wired `testing-coverage` into the Sphinx toctree
  after `contributing`.
- `CLAUDE.md`: replaced raw `./ninja` / `./tools` invocations with
  `just` equivalents; added top-level note directing contributors to
  `just --list`; added `just test-rust`, `just test-py`, `just test-ts`
  to the Quick iteration section.

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-20 16:21:23 -03:00
Abdo
bb13a2bb69 fix: Avoid loading unused cacert.pem (#4858)
## Linked issue

See
https://github.com/ankitects/anki/issues/4314#issuecomment-3289709713

## Summary

We got reports that certifi's cacert.pem generates a lot of IO events at
startup. This file is no longer directly used by Anki, as we use
truststore to force libraries such as requests to use system stores, but
it's apparently being loaded by requests in any case.

## How to test

Run tests: `./ninja check:pytest`
2026-05-20 06:46:41 +03:00
llama
dfbd7d2399 fix(import): force lowercasing before adding hash suffix as well (#4860)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

- #4851

## Summary / motivation (required)

I made a mistake in #4851 by not lowercasing in the case where a file
with the same name but different contents already exists, leading to
inconsistent behaviour across platforms

## Steps to reproduce (required, use N/A if not applicable)

See linked pr

## How to test (required)

Run ./check on linux and windows and see that the same lowercasing
behaviour occurs on both

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [ ] I added or updated tests when the change is non-trivial or
behavior changed.

## Scope

- [x] This PR is focused on one change (no unrelated edits).
2026-05-19 06:58:47 +03:00
llama
3479499569 fix(import): avoid case-folding already existing media filenames (#4851)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

Fixes #4716 

## Summary / motivation (required)

#4435 made it so that all new added media would have lowercased names,
but this was bugged and led to media refs pointing to inexistent files
on case-insensitive filesystems

The fix proposed is to try adding new files with lowercased names only
if they don't already exist, using the existing file otherwise

## Steps to reproduce (required, use N/A if not applicable)

See linked issue

## How to test (required)

Try copy-pasting a media file from the Edit window of an existing note
to the Add window and see that the filename in the resulting media ref
isn't forced to be lowercased

When pasting a new file, see that the filename is now lowercased

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [ ] I added or updated tests when the change is non-trivial or
behavior changed.

## Scope

- [x] This PR is focused on one change (no unrelated edits).
2026-05-18 18:56:54 +03:00
Fernando Lins
f9a5b36c82 feat: add TS test coverage (#4843)
## Linked issue

Closes #4840

## Summary / motivation

Adds Vitest V8 coverage for TypeScript/Svelte tests via
`@vitest/coverage-v8`.
Introduces `just test-ts --coverage` and `just test-ts --coverage
--html`,
and wires TypeScript into the `just test --coverage` umbrella —
completing
coverage support across all three stacks (Python, Rust, TypeScript).

The threshold is set to 5% — intentionally low because the Vitest test
count is small relative to the TypeScript/Svelte source surface. It is
meant to be raised as more tests are added.

## How to test

```sh
# Existing behavior unchanged
just test-ts

# Terminal summary + enforces 5% line coverage threshold
just test-ts --coverage

# Terminal summary + HTML report under out/coverage/typescript/
just test-ts --coverage --html

# Full umbrella — all three stacks
just test --coverage
just test --coverage --html
```

### Checklist

- [x] I ran `./ninja check` or an equivalent relevant check locally.

### Details

- `@vitest/coverage-v8` pinned at `3.2.4` in `package.json`.
- Reports are written to `out/coverage/typescript/` via
`--coverage.reportsDirectory=../out/coverage/typescript` (relative to
the `ts/` working directory where vitest runs).
- V8 provider is preferred over Istanbul: faster and requires no Babel
transform for TypeScript projects.
- Coverage measures only code reachable through Vitest's module graph —
Svelte component rendering is not covered.
- The `yarn` justfile variable is added for platform-aware yarn
invocation (Windows vs Unix).

## Before / after behavior

Before: no `just test-ts`, no TypeScript coverage.
After: `just test-ts` runs Vitest via ninja; `just test-ts --coverage`
runs with V8 instrumentation.
`just test --coverage` now spans all three stacks.

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-18 11:54:16 -03:00
Abdo
c9cd85dd97 feat: Distribute compiled sources in Briefcase bundle (#4856)
## Linked issue

#4855

## Summary

Compile .pyc files and package them in the Briefcase bundle instead of
the .py sources.

## How to test

You can run this Powershell script to do a basic benchmark of startup
performance on Windows (Requires
[py-spy](https://github.com/benfred/py-spy)):
```powershell
function Remove-Build {
    Remove-Item -LiteralPath "./out/installer" -Force -Recurse
}

function Start-Anki {
    param (
        [Parameter()]
        [string]
        $OutputPath
    )

    Start-Process -FilePath "py-spy" -ArgumentList "record --output $OutputPath -- ./out/installer/build/anki/windows/app/src/Anki.exe --safemode"
    Start-Sleep -Seconds 10
    Stop-Process -Name Anki
}

if ($null -eq (Get-Command "py-spy" -ErrorAction SilentlyContinue)) {
    Write-Error "py-spy not found. See https://github.com/benfred/py-spy"
    Exit 1
}

git checkout main
Remove-Build
./tools/ninja installer:build
Start-Anki -OutputPath "main.svg"

git checkout briefcase-compile-pyc
Remove-Build
./tools/ninja installer:build
Start-Anki -OutputPath "pyc.svg"
```

Output is written to `main.svg` and `pyc.svg`. Here's an example run
(using default 100 sampling rate):
<img width="950" height="559" alt="image"
src="https://github.com/user-attachments/assets/5da6a06a-3393-4f0e-80fe-ced735d50c2c"
/>
<img width="830" height="352" alt="image"
src="https://github.com/user-attachments/assets/ca9e5d8d-c3d4-4a0b-bd86-7aa2d6c5cee2"
/>
2026-05-18 17:47:03 +03:00
Fernando Lins
f76fcec48f feat: add Rust test coverage (#4842)
## Linked issue

Closes #4839

## Summary / motivation

Adds `cargo-llvm-cov`-based test coverage for the full Rust workspace.
Introduces `just test-rust --coverage` and `just test-rust --coverage
--html`, and wires Rust into the `just test --coverage` umbrella.

`cargo-llvm-cov` is installed on demand into `out/bin/` to avoid
polluting the global cargo install. The `llvm-tools-preview` rustup
component is now installed in CI so the tool can instrument binaries.

## How to test (required)

```sh
# Existing behavior unchanged
just test-rust

# Terminal summary
just test-rust --coverage

# Terminal summary + HTML report under out/coverage/rust/html/
just test-rust --coverage --html

# Umbrella (Rust + Python)
just test --coverage
just test --coverage --html
```

Note: first run of `--coverage` will install `cargo-llvm-cov` into
`out/bin/` (~30s). Subsequent runs skip the install step.

### Checklist

- [x] I ran `./ninja check` or an equivalent relevant check locally.

### Details

- `cargo-llvm-cov` pinned at `0.8.4`, installed into `out/bin/` via
`cargo install --root out`.
- `--workspace --locked` measures all crates and respects the lockfile.
- `llvm-tools-preview` added to `setup-anki` action so CI can instrument
Rust binaries.
- Coverage runs are slower than plain `just test-rust` because
`cargo-llvm-cov` rebuilds with instrumentation — this is expected.

## Before / after behavior

Before: no `just test-rust`, no Rust coverage support.

After: `just test-rust` runs Rust tests via ninja; `just test-rust
--coverage` runs them with `cargo-llvm-cov`

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-18 11:38:37 -03:00
Abdo
03b9fc4814 ci: Fix Windows ARM packaging failing (#4857)
Fixes a CI failure introduced in #4822

See failing run:
https://github.com/ankitects/anki/actions/runs/26009152225/job/76447663427
2026-05-18 17:13:56 +03:00
Tim Gatzke
82eeda9d4f fix(export): preserve browser focus after note export (#4845)
## Linked issue (required)

Fixes #4833

## Summary / motivation (required)

Keep the Browser window focused after exporting selected notes.

The export dialog was opened from the Browser, but the background export
progress and completion tooltip were still parented to the main window.
That could leave the main screen focused after the export completed.
This change carries the dialog parent through the export options and
uses it for progress, errors, and the completion tooltip.

## Steps to reproduce (required, use N/A if not applicable)

1. Open the Browser.
2. Right-click a note and choose Notes > Export Notes.
3. Click Export, choose a save location, and save.
4. Observe that the main screen receives focus after export completion.

## How to test (required)

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [x] I added or updated tests when the change is non-trivial or
behavior changed.

### Details

- Ran `./ninja check` successfully.
- Tested behavior on macOS, however I currently don't have a Windows or
Linux environment set up to test on right now as I'm on vacation. The
change is limited to dialog parenting, so I expect it to work the same
across platforms. Would appreciate testing on other platforms if
possible.

## Before / after behavior (optional)

Before: exporting selected notes from the Browser could focus the main
window after completion.

After: export progress and completion UI remain parented to the Browser,
so focus is returned to the Browser.

## Risk / compatibility / migration (optional)

Low risk. The change is limited to export UI parenting and falls back to
the main window when no dialog parent is available.

## UI evidence (required for visual changes; otherwise N/A)

N/A

## Scope

- [x] This PR is focused on one change (no unrelated edits).

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-18 05:30:57 +03:00
Abdo
4b01f78aa3 fix: Prevent Windows elevation errors when running ninja_gen's update binaries (#4848)
## Linked issue

Closes #4847

## Summary

Prevent Windows elevation errors when running ninja_gen's update
binaries by embedding a manifest with `asInvoker`.


## How to test

Run `./tools/ninja check` or `cargo run --bin update_node` and confirm
no elevation errors.
2026-05-16 11:55:11 +03:00
Fernando Lins
2ea8e5731a feat: add Python test coverage (#4841)
## Linked issue

Closes #4838

## Summary/motivation

Adds `coverage.py`-based test coverage for both Python test suites
(`pylib` and `qt`). Introduces `just test-py --coverage` and `just
test-py --coverage --html`, plus the `just test --coverage`.

Coverage reports are written to `out/coverage/`.

## How to test
```sh
# Existing behavior unchanged
just test-py

# Terminal summary + enforces thresholds
just test-py --coverage

# Terminal summary + HTML reports under out/coverage/
just test-py --coverage --html

# Umbrella (Python only for now)
just test --coverage
just test --coverage --html
```
### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.

### Details

- `coverage` dependency pinned to >=7.13.5 in pyproject.toml.
- The `coverage` umbrella recipe currently delegates to Python only for
now

## Before / after behavior

Before: no `just test-py`, no coverage support.
After: `just test-py` runs Python tests via ninja; `just test-py
--coverage`
runs them with `coverage.py` and enforces minimum line coverage.

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-15 21:34:38 -03:00
Jeremy Fleischman
1482fb0937 fix: atomic_rename now works with single component relative paths (#4773)
## Linked issue (required)

[[<!-- Fixes #123 / Closes #123 / Refs #123
-->](https://forums.ankiweb.net/t/anki-collection-collection-export-anki-package-crashes-if-given-a-relative-path-with-one-component/69562)](https://forums.ankiweb.net/t/anki-collection-collection-export-anki-package-crashes-if-given-a-relative-path-with-one-component/69562)

## Summary / motivation (required)

See discussion about this on [the

forum](https://forums.ankiweb.net/t/anki-collection-collection-export-anki-package-crashes-if-given-a-relative-path-with-one-component/69562)

## Steps to reproduce (required, use N/A if not applicable)

`demo.py`:

```python
import tempfile
from pathlib import Path

import anki.collection

with tempfile.TemporaryDirectory() as tempdir:
    tempdir = Path(tempdir)
    col = anki.collection.Collection(str(tempdir / "temp.anki2"))
    col.export_anki_package(
        out_path="output.apkg",
        options=anki.collection.ExportAnkiPackageOptions(),
        limit=None,
    )
```

```console
$ python demo.py
Traceback (most recent call last):
  [... some noise elided here ...]
  File "/nix/store/1w7swjzmjp7171yspih1q07a9vgacjzb-dev-env/lib/python3.14/site-packages/anki/_backend_generated.py", line 2037, in export_anki_package
    raw_bytes = self._run_command(37, 4, message.SerializeToString())
  File "/nix/store/1w7swjzmjp7171yspih1q07a9vgacjzb-dev-env/lib/python3.14/site-packages/anki/_backend.py", line 171, in _run_command
    raise backend_exception_to_pylib(err)
anki.errors.BackendIOError: Failed to open '': No such file or directory (os error 2)
```

## How to test (required)

I added a unit test. It passes.

### Checklist (minimum)

- [ ] I ran `./ninja check` or an equivalent relevant check locally.
- [x] I added or updated tests when the change is non-trivial or
behavior changed.

### Details

<!-- Commands, manual steps, edge cases, and what you observed -->

## Before / after behavior (optional)

<!-- For bugfixes: behavior before vs after. For other types: N/A or a
short note. -->

## Risk / compatibility / migration (optional)

<!-- Breaking changes, rollout notes, or N/A for small / low-risk PRs
-->

## UI evidence (required for visual changes; otherwise N/A)

<!-- Screenshot or short video -->

## Scope

- [x] This PR is focused on one change (no unrelated edits).

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-15 16:53:17 +03:00
chiragjagga
a2262809c4 fix: regex error fix (#4837)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

Fixes #4835 

## Summary / motivation (required)

<!-- What this PR does and why. For larger changes, add enough context
for reviewers. -->

Fixes the issue #4835 with a minor change in InvalidRegex error.

## Steps to reproduce (required, use N/A if not applicable)

<!-- Steps to reproduce: how to trigger the bug in the broken state (the
"before").
 - Mainly for bugfixes;
    - For bugs: numbered steps before the fix. For non-bugs: write N/A.
 - use N/A for features, refactors, docs, chore, etc.
-->

1. Open the browser and do a find & replace.
2. Put b[ in “Find”.
3. Enable the regex option.
4. Confirm.

## How to test (required)

<!--- How to test: how you verified the change (checks, unit tests,
manual steps, edge cases — the "after" or general validation). --->
Reproduce the fix and verify the regex error is not within the `<pre>`
tag.

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [x] I added or updated tests when the change is non-trivial or
behavior changed.

### Details

Regex error was return with `<pre>` tags which are removed now so that
the text in the error box is displayed correctly.

## Before / after behavior (optional)
<img width="372" height="211" alt="image"
src="https://github.com/user-attachments/assets/91f53745-301b-4679-b1a5-53fafd628de7"
/>

<!-- For bugfixes: behavior before vs after. For other types: N/A or a
short note. -->

## Risk / compatibility / migration (optional)

<!-- Breaking changes, rollout notes, or N/A for small / low-risk PRs
-->

## UI evidence (required for visual changes; otherwise N/A)

<img width="360" height="226" alt="image"
src="https://github.com/user-attachments/assets/3b7b3f23-9f35-423e-9b10-62834e0a0dd6"
/>

<!-- Screenshot or short video -->

## Scope

- [x] This PR is focused on one change (no unrelated edits).

---------

Co-authored-by: Abdo <abdo@abdnh.net>
2026-05-15 16:45:41 +03:00
Abdo
cc1605aab3 fix: beta/rc suffix handling in int_version() (#4828)
## Linked issue

#4827

## Summary

Strip beta/rc numbers from the version before conversion so they map to
the same number as the stable version.

## Steps to reproduce

See the linked issue

## How to test

Run Python tests: `./ninja check:pytest`
2026-05-14 15:12:06 +03:00
dependabot[bot]
1f0fc05f93 chore(deps): bump the python-minor-patch group across 1 directory with 16 updates (#4829)
Bumps the python-minor-patch group with 16 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [pre-commit](https://github.com/pre-commit/pre-commit) | `4.5.1` |
`4.6.0` |
| [mypy](https://github.com/python/mypy) | `1.16.1` | `1.17.1` |
| [ruff](https://github.com/astral-sh/ruff) | `0.12.1` | `0.13.3` |
| [wheel](https://github.com/pypa/wheel) | `0.46.3` | `0.47.0` |
| [hatchling](https://github.com/pypa/hatch) | `1.27.0` | `1.29.0` |
| [types-requests](https://github.com/python/typeshed) |
`2.32.4.20250611` | `2.33.0.20260503` |
| [types-markdown](https://github.com/python/typeshed) |
`3.8.0.20250415` | `3.10.2.20260408` |
|
[sphinx-book-theme](https://github.com/executablebooks/sphinx-book-theme)
| `1.1.4` | `1.2.0` |
| [sphinx-autoapi](https://github.com/readthedocs/sphinx-autoapi) |
`3.6.0` | `3.8.0` |
|
[sphinxcontrib-mermaid](https://github.com/mgaitan/sphinxcontrib-mermaid)
| `2.0.1` | `2.0.2` |
| [markdown](https://github.com/Python-Markdown/markdown) | `3.8.2` |
`3.10.2` |
| [orjson](https://github.com/ijl/orjson) | `3.10.18` | `3.11.8` |
| [typing-extensions](https://github.com/python/typing_extensions) |
`4.14.0` | `4.15.0` |
| [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) |
`4.13.4` | `4.14.3` |
| [flask-cors](https://github.com/corydolphin/flask-cors) | `6.0.1` |
`6.0.2` |
| [jsonschema](https://github.com/python-jsonschema/jsonschema) |
`4.24.0` | `4.26.0` |


Updates `pre-commit` from 4.5.1 to 4.6.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pre-commit/pre-commit/releases">pre-commit's
releases</a>.</em></p>
<blockquote>
<h2>pre-commit v4.6.0</h2>
<h3>Features</h3>
<ul>
<li><code>pre-commit hook-impl</code>: allow <code>--hook-dir</code> to
be missing to enable easier usage with <code>git</code> 2.54+ git hooks.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3662">#3662</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>pre-commit hook-impl</code>: <code>--hook-type</code> is
required.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3661">#3661</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md">pre-commit's
changelog</a>.</em></p>
<blockquote>
<h1>4.6.0 - 2026-04-21</h1>
<h3>Features</h3>
<ul>
<li><code>pre-commit hook-impl</code>: allow <code>--hook-dir</code> to
be missing to enable easier
usage with <code>git</code> 2.54+ git hooks.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3662">#3662</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>pre-commit hook-impl</code>: <code>--hook-type</code> is
required.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3661">#3661</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f35134b050"><code>f35134b</code></a>
v4.6.0</li>
<li><a
href="2a51ffcb81"><code>2a51ffc</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3662">#3662</a>
from pre-commit/hook-impl-optional-hook-dir</li>
<li><a
href="d7dee322ab"><code>d7dee32</code></a>
make --hook-dir optional for hook-impl</li>
<li><a
href="965aeb1c68"><code>965aeb1</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3661">#3661</a>
from pre-commit/hook-impl-required</li>
<li><a
href="2eacc064aa"><code>2eacc06</code></a>
--hook-type is required for hook-impl</li>
<li><a
href="f5678bf4ac"><code>f5678bf</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3657">#3657</a>
from pre-commit/pre-commit-ci-update-config</li>
<li><a
href="054cc5bd6b"><code>054cc5b</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="5c0f3024d2"><code>5c0f302</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3652">#3652</a>
from pre-commit/pre-commit-ci-update-config</li>
<li><a
href="a5d9114267"><code>a5d9114</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="129a1f5ca1"><code>129a1f5</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3641">#3641</a>
from pre-commit/mxr-patch-1</li>
<li>Additional commits viewable in <a
href="https://github.com/pre-commit/pre-commit/compare/v4.5.1...v4.6.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `mypy` from 1.16.1 to 1.17.1
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/python/mypy/blob/master/CHANGELOG.md">mypy's
changelog</a>.</em></p>
<blockquote>
<h3>Mypy 1.17.1</h3>
<ul>
<li>Retain <code>None</code> as constraints bottom if no bottoms were
provided (Stanislav Terliakov, PR <a
href="https://redirect.github.com/python/mypy/pull/19485">19485</a>)</li>
<li>Fix &quot;ignored exception in <code>hasattr</code>&quot; in dmypy
(Stanislav Terliakov, PR <a
href="https://redirect.github.com/python/mypy/pull/19428">19428</a>)</li>
<li>Prevent a crash when InitVar is redefined with a method in a
subclass (Stanislav Terliakov, PR <a
href="https://redirect.github.com/python/mypy/pull/19453">19453</a>)</li>
</ul>
<h3>Mypy 1.17</h3>
<ul>
<li>Optionally check that match is exhaustive (<code>--enable-error-code
exhaustive-match</code>) (Donal Burns, PR <a
href="https://redirect.github.com/python/mypy/pull/19144">19144</a>)</li>
<li>Further improvements to attribute resolution and protocol subtyping
(Ivan Levkivskyi)</li>
<li>Fixes to nondeterministic type checking (Shantanu)</li>
<li>Remove support for targeting Python 3.8 (Marc Mueller)</li>
<li>Initial support for Python 3.14 (Marc Mueller)</li>
<li>Stricter checking of <code>type: ignore</code> comments — must now
specify error code(s)</li>
</ul>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>Additional commits viewable in <a
href="https://github.com/python/mypy/compare/v1.16.1...v1.17.1">compare
view</a></li>
</ul>
</details>
<br />
Updates `ruff` from 0.12.1 to 0.13.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.13.3</h2>
<p>Released on 2025-10-02.</p>
<h3>Preview features</h3>
<ul>
<li>Display diffs for <code>ruff format --check</code> and add support
for different output formats (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20443">#20443</a>)</li>
<li>[<code>pyflakes</code>] Handle some common submodule import
situations for <code>unused-import</code> (<code>F401</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20200">#20200</a>)</li>
<li>[<code>ruff</code>] Do not flag <code>%r</code> +
<code>repr()</code> combinations (<code>RUF065</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20600">#20600</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>cli</code>] Add conflict between <code>--add-noqa</code> and
<code>--diff</code> options (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20642">#20642</a>)</li>
<li>[<code>pylint</code>] Exempt required imports from
<code>PLR0402</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20381">#20381</a>)</li>
<li>[<code>pylint</code>] Fix missing <code>max-nested-blocks</code> in
settings display (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20574">#20574</a>)</li>
<li>[<code>pyupgrade</code>] Prevent infinite loop with
<code>I002</code> and <code>UP026</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20634">#20634</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-simplify</code>] Improve help message clarity
(<code>SIM105</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/20548">#20548</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a href="https://github.com/TaKO8Ki"><code>@​TaKO8Ki</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
<li><a href="https://github.com/dylwil3"><code>@​dylwil3</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/danparizher"><code>@​danparizher</code></a></li>
</ul>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.12.1...0.13.3">compare
view</a></li>
</ul>
</details>
<br />
Updates `wheel` from 0.46.3 to 0.47.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pypa/wheel/releases">wheel's
releases</a>.</em></p>
<blockquote>
<h2>0.47.0</h2>
<ul>
<li>Added the <code>wheel info</code> subcommand to display metadata
about wheel files without unpacking them (<a
href="https://redirect.github.com/pypa/wheel/issues/639">#639</a>)</li>
<li>Fixed <code>WheelFile</code> raising <code>Missing RECORD
file</code> when the wheel filename contains uppercase characters (e.g.
<code>Django-3.2.5.whl</code>) but the <code>.dist-info</code> directory
inside uses normalized lowercase naming (<a
href="https://redirect.github.com/pypa/wheel/issues/411">#411</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pypa/wheel/blob/main/docs/news.rst">wheel's
changelog</a>.</em></p>
<blockquote>
<h1>Release Notes</h1>
<p><strong>0.47.0 (2026-04-22)</strong></p>
<ul>
<li>Added the <code>wheel info</code> subcommand to display metadata
about wheel files without
unpacking them (<code>[#639](https://github.com/pypa/wheel/issues/639)
&lt;https://github.com/pypa/wheel/issues/639&gt;</code>_)</li>
<li>Fixed <code>WheelFile</code> raising <code>Missing RECORD
file</code> when the wheel filename contains
uppercase characters (e.g. <code>Django-3.2.5.whl</code>) but the
<code>.dist-info</code> directory
inside uses normalized lowercase naming
(<code>[#411](https://github.com/pypa/wheel/issues/411)
&lt;https://github.com/pypa/wheel/issues/411&gt;</code>_)</li>
</ul>
<p><strong>0.46.3 (2026-01-22)</strong></p>
<ul>
<li>Fixed <code>ImportError: cannot import name '_setuptools_logging'
from 'wheel'</code> when
installed alongside an old version of setuptools and running the
<code>bdist_wheel</code>
command (<code>[#676](https://github.com/pypa/wheel/issues/676)
&lt;https://github.com/pypa/wheel/issues/676&gt;</code>_)</li>
</ul>
<p><strong>0.46.2 (2026-01-22)</strong></p>
<ul>
<li>Restored the <code>bdist_wheel</code> command for compatibility with
<code>setuptools</code> older than
v70.1</li>
<li>Importing <code>wheel.bdist_wheel</code> now emits a
<code>FutureWarning</code> instead of a
<code>DeprecationWarning</code></li>
<li>Fixed <code>wheel unpack</code> potentially altering the permissions
of files outside of the
destination tree with maliciously crafted wheels (CVE-2026-24049)</li>
</ul>
<p><strong>0.46.1 (2025-04-08)</strong></p>
<ul>
<li>Temporarily restored the <code>wheel.macosx_libfile</code> module
(<code>[#659](https://github.com/pypa/wheel/issues/659)
&lt;https://github.com/pypa/wheel/issues/659&gt;</code>_)</li>
</ul>
<p><strong>0.46.0 (2025-04-03)</strong></p>
<ul>
<li>Dropped support for Python 3.8</li>
<li>Removed the <code>bdist_wheel</code> setuptools command
implementation and entry point.
The <code>wheel.bdist_wheel</code> module is now just an alias to
<code>setuptools.command.bdist_wheel</code>, emitting a deprecation
warning on import.</li>
<li>Removed vendored <code>packaging</code> in favor of a run-time
dependency on it</li>
<li>Made the <code>wheel.metadata</code> module private (with a
deprecation warning if it's
imported</li>
<li>Made the <code>wheel.cli</code> package private (no deprecation
warning)</li>
<li>Fixed an exception when calling the <code>convert</code> command
with an empty description
field</li>
</ul>
<p><strong>0.45.1 (2024-11-23)</strong></p>
<ul>
<li>Fixed pure Python wheels converted from eggs and wininst files
having the ABI tag in
the file name</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="efd83a750f"><code>efd83a7</code></a>
Created a new release</li>
<li><a
href="bb69216d35"><code>bb69216</code></a>
Reordered the changelog entries</li>
<li><a
href="d5a1763ce9"><code>d5a1763</code></a>
fix(wheelfile): resolve .dist-info path case-insensitively when reading
wheel...</li>
<li><a
href="5718957928"><code>5718957</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/pypa/wheel/issues/685">#685</a>)</li>
<li><a
href="625806845a"><code>6258068</code></a>
chore: log_level is better than log_cli_level (<a
href="https://redirect.github.com/pypa/wheel/issues/684">#684</a>)</li>
<li><a
href="2975debc78"><code>2975deb</code></a>
Require tox &gt;= 4.22</li>
<li><a
href="47674ba770"><code>47674ba</code></a>
chore: add check-sdist to checks (<a
href="https://redirect.github.com/pypa/wheel/issues/681">#681</a>)</li>
<li><a
href="56223f6f8d"><code>56223f6</code></a>
<code>__package__</code> → <code>__spec__.parent</code> (<a
href="https://redirect.github.com/pypa/wheel/issues/679">#679</a>)</li>
<li><a
href="0ce509e02d"><code>0ce509e</code></a>
Added the wheel info subcommand (<a
href="https://redirect.github.com/pypa/wheel/issues/669">#669</a>)</li>
<li><a
href="39039c0f34"><code>39039c0</code></a>
Improved the index page</li>
<li>Additional commits viewable in <a
href="https://github.com/pypa/wheel/compare/0.46.3...0.47.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `hatchling` from 1.27.0 to 1.29.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pypa/hatch/releases">hatchling's
releases</a>.</em></p>
<blockquote>
<h2>Hatchling v1.29.0</h2>
<p><em><strong>Fixed:</strong></em></p>
<ul>
<li>Source Date Epoch no longer fails when set to date before 1980.</li>
</ul>
<h2>Hatchling v1.28.0</h2>
<p><em><strong>Changed:</strong></em></p>
<ul>
<li>Drop support for Python 3.9</li>
</ul>
<p><em><strong>Added:</strong></em></p>
<ul>
<li>Add <code>sbom-files</code> option and <code>sbom_files</code> build
data to the <code>wheel</code> build target for including Software Bill
of Materials files.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1a74daa6f5"><code>1a74daa</code></a>
Noqa release command to unblock GHA for PRs</li>
<li><a
href="78065f4c54"><code>78065f4</code></a>
For Immutable Releases (<a
href="https://redirect.github.com/pypa/hatch/issues/2188">#2188</a>)</li>
<li><a
href="592c0a9c8c"><code>592c0a9</code></a>
release Hatchling v1.29.0 (<a
href="https://redirect.github.com/pypa/hatch/issues/2186">#2186</a>)</li>
<li><a
href="874059b82d"><code>874059b</code></a>
Prerelease doc updates. (<a
href="https://redirect.github.com/pypa/hatch/issues/2183">#2183</a>)</li>
<li><a
href="0e31bb64ec"><code>0e31bb6</code></a>
Immutable releases ci (<a
href="https://redirect.github.com/pypa/hatch/issues/2182">#2182</a>)</li>
<li><a
href="f400be159b"><code>f400be1</code></a>
Support a SOURCE_DATE_EPOCH prior to 1980 (<a
href="https://redirect.github.com/pypa/hatch/issues/1999">#1999</a>)</li>
<li><a
href="47b55ce0a9"><code>47b55ce</code></a>
Fixing failing tests for changes in Rich markdown rendering (<a
href="https://redirect.github.com/pypa/hatch/issues/2172">#2172</a>)</li>
<li><a
href="cc4acd6686"><code>cc4acd6</code></a>
Add a note guiding users to include SBOM files in the source
distribution (<a
href="https://redirect.github.com/pypa/hatch/issues/2">#2</a>...</li>
<li><a
href="9068758886"><code>9068758</code></a>
Fix <a
href="https://redirect.github.com/pypa/hatch/issues/2164">#2164</a>
keep_env type error for hatch shell (<a
href="https://redirect.github.com/pypa/hatch/issues/2165">#2165</a>)</li>
<li><a
href="bc31cfccc1"><code>bc31cfc</code></a>
Fix warning and tests with packaging 26.0 (<a
href="https://redirect.github.com/pypa/hatch/issues/2159">#2159</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pypa/hatch/compare/hatchling-v1.27.0...hatchling-v1.29.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `types-requests` from 2.32.4.20250611 to 2.33.0.20260503
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/python/typeshed/commits">compare view</a></li>
</ul>
</details>
<br />

Updates `types-markdown` from 3.8.0.20250415 to 3.10.2.20260408
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/python/typeshed/commits">compare view</a></li>
</ul>
</details>
<br />

Updates `sphinx-book-theme` from 1.1.4 to 1.2.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/executablebooks/sphinx-book-theme/releases">sphinx-book-theme's
releases</a>.</em></p>
<blockquote>
<h2>v1.2.0 -- 2026-03-09</h2>
<ul>
<li>Jupyterlite button - patched, merged version of <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/issues/655">#655</a>
by <a
href="https://github.com/matthew-brett"><code>@​matthew-brett</code></a>
in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/914">executablebooks/sphinx-book-theme#914</a></li>
<li>[ENH] Show source text on GitLab projects by <a
href="https://github.com/tymcauley"><code>@​tymcauley</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/916">executablebooks/sphinx-book-theme#916</a></li>
<li>Fix typo in docs by <a
href="https://github.com/user27182"><code>@​user27182</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/913">executablebooks/sphinx-book-theme#913</a></li>
<li>prepare for latest pydata and python releases by <a
href="https://github.com/choldgraf"><code>@​choldgraf</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/920">executablebooks/sphinx-book-theme#920</a></li>
<li>Ignore PendingDeprecationWarning about parser_name deprecation with
Docutils 0.22 by <a
href="https://github.com/mitya57"><code>@​mitya57</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/919">executablebooks/sphinx-book-theme#919</a></li>
<li>CI: adding cronjob by <a
href="https://github.com/bsipocz"><code>@​bsipocz</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/926">executablebooks/sphinx-book-theme#926</a></li>
<li>DOC: Fix margin directive documentation by <a
href="https://github.com/melissawm"><code>@​melissawm</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/930">executablebooks/sphinx-book-theme#930</a></li>
<li>MAINT: adding sphinx9 and python3.14 support and bumping minimum
sphinx to 7 and python to 3.11 by <a
href="https://github.com/bsipocz"><code>@​bsipocz</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/927">executablebooks/sphinx-book-theme#927</a></li>
</ul>
<p><strong>Full Changelog</strong>:
<a
href="https://github.com/executablebooks/sphinx-book-theme/compare/v1.1.4...v1.2">https://github.com/executablebooks/sphinx-book-theme/compare/v1.1.4...v1.2</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/executablebooks/sphinx-book-theme/blob/main/CHANGELOG.md">sphinx-book-theme's
changelog</a>.</em></p>
<blockquote>
<h2>v1.2.0 -- 2026-03-09</h2>
<ul>
<li>Jupyterlite button - patched, merged version of <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/issues/655">#655</a>
by <a
href="https://github.com/matthew-brett"><code>@​matthew-brett</code></a>
in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/914">executablebooks/sphinx-book-theme#914</a></li>
<li>[ENH] Show source text on GitLab projects by <a
href="https://github.com/tymcauley"><code>@​tymcauley</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/916">executablebooks/sphinx-book-theme#916</a></li>
<li>Fix typo in docs by <a
href="https://github.com/user27182"><code>@​user27182</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/913">executablebooks/sphinx-book-theme#913</a></li>
<li>prepare for latest pydata and python releases by <a
href="https://github.com/choldgraf"><code>@​choldgraf</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/920">executablebooks/sphinx-book-theme#920</a></li>
<li>Ignore PendingDeprecationWarning about parser_name deprecation with
Docutils 0.22 by <a
href="https://github.com/mitya57"><code>@​mitya57</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/919">executablebooks/sphinx-book-theme#919</a></li>
<li>CI: adding cronjob by <a
href="https://github.com/bsipocz"><code>@​bsipocz</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/926">executablebooks/sphinx-book-theme#926</a></li>
<li>DOC: Fix margin directive documentation by <a
href="https://github.com/melissawm"><code>@​melissawm</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/930">executablebooks/sphinx-book-theme#930</a></li>
<li>MAINT: adding sphinx9 and python3.14 support and bumping minimum
sphinx to 7 and python to 3.11 by <a
href="https://github.com/bsipocz"><code>@​bsipocz</code></a> in <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/927">executablebooks/sphinx-book-theme#927</a></li>
</ul>
<p><strong>Full Changelog</strong>:
<a
href="https://github.com/executablebooks/sphinx-book-theme/compare/v1.1.4...v1.2">https://github.com/executablebooks/sphinx-book-theme/compare/v1.1.4...v1.2</a></p>
<h2>v1.1.2 -- 2024-02-13</h2>
<p>(<a
href="https://github.com/executablebooks/sphinx-book-theme/compare/v1.1.1...3da24da74f6042599fe6c9e2d612f5cbdef42280">full
changelog</a>)</p>
<h3>Enhancements made</h3>
<ul>
<li>ENH: bump version <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/818">#818</a>
(<a href="https://github.com/agoose77"><code>@​agoose77</code></a>)</li>
</ul>
<h3>Bugs fixed</h3>
<ul>
<li>FIX: correct event-handler signature <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/817">#817</a>
(<a href="https://github.com/agoose77"><code>@​agoose77</code></a>)</li>
</ul>
<h3>Contributors to this release</h3>
<p>(<a
href="https://github.com/executablebooks/sphinx-book-theme/graphs/contributors?from=2024-02-13&amp;to=2024-02-13&amp;type=c">GitHub
contributors page for this release</a>)</p>
<p><a
href="https://github.com/search?q=repo%3Aexecutablebooks%2Fsphinx-book-theme+involves%3Aagoose77+updated%3A2024-02-13..2024-02-13&amp;type=Issues"><code>@​agoose77</code></a></p>
<h2>v1.1.1 -- 2024-02-13</h2>
<p>(<a
href="https://github.com/executablebooks/sphinx-book-theme/compare/v1.1.0...9335ab99b0bc77b826cb2c5afcef3432f14e8780">full
changelog</a>)</p>
<h3>Enhancements made</h3>
<ul>
<li>ENH: bump version for 1.1.1 <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/815">#815</a>
(<a href="https://github.com/agoose77"><code>@​agoose77</code></a>)</li>
</ul>
<h3>Bugs fixed</h3>
<ul>
<li>FIX: use <code>config-inited</code> event to register config <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/814">#814</a>
(<a href="https://github.com/agoose77"><code>@​agoose77</code></a>)</li>
</ul>
<h3>Other merged PRs</h3>
<ul>
<li>Build(deps): Bump actions/setup-python from 4 to 5 <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/803">#803</a>
(<a
href="https://github.com/dependabot"><code>@​dependabot</code></a>)</li>
<li>[pre-commit.ci] pre-commit autoupdate <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/pull/801">#801</a>
(<a
href="https://github.com/pre-commit-ci"><code>@​pre-commit-ci</code></a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="30f968ff99"><code>30f968f</code></a>
Release v1.2.0</li>
<li><a
href="b78d24f610"><code>b78d24f</code></a>
Finalizing changelog for v1.2.0</li>
<li><a
href="0415925b13"><code>0415925</code></a>
MAINT: ignore bots in release notes</li>
<li><a
href="5797d88ca3"><code>5797d88</code></a>
Merge pull request <a
href="https://redirect.github.com/executablebooks/sphinx-book-theme/issues/927">#927</a>
from bsipocz/MAINT_sphinx_dev</li>
<li><a
href="f23d0946c7"><code>f23d094</code></a>
CI: Adding workaround for autodoc typehint parsing issue</li>
<li><a
href="8747e975f9"><code>8747e97</code></a>
MAINT: dropping sphinx&lt;7 and python&lt;3.11 support</li>
<li><a
href="ffac4dee87"><code>ffac4de</code></a>
MAINT: using python 3.12 for RTD</li>
<li><a
href="cb587276c9"><code>cb58727</code></a>
MAINT: min pin for ablog due to sphinx9 incompatibility</li>
<li><a
href="8cc45e4ef5"><code>8cc45e4</code></a>
CI: ignore linkchecking URLs where anchors throw 403</li>
<li><a
href="d521920234"><code>d521920</code></a>
MAINT: adding sphinx9 and python 3.14 to testing</li>
<li>Additional commits viewable in <a
href="https://github.com/executablebooks/sphinx-book-theme/compare/v1.1.4...v1.2.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `sphinx-autoapi` from 3.6.0 to 3.8.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/readthedocs/sphinx-autoapi/releases">sphinx-autoapi's
releases</a>.</em></p>
<blockquote>
<h2>v3.8.0</h2>
<h1>Features</h1>
<ul>
<li>Autodoc-style directives can access members excluded by
autoapi_options</li>
</ul>
<h1>Misc</h1>
<ul>
<li><a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/553">#553</a></li>
</ul>
<h2>v3.7.0</h2>
<h1>Features</h1>
<ul>
<li>Added autoapi.import warning for when AutoAPI directives are given
non-existent objects</li>
<li>Adding autoapi_follow_symlinks, which allows api to traverse into
symlinked directories when generating the API documentation.</li>
<li>Drop support for Python 3.9 and officially support Python 3.14</li>
<li>Support rendering PEP-695 type parameters</li>
</ul>
<h1>Bugfixes</h1>
<ul>
<li>Render typing_extensions.TypeAlias like other type aliases (<a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/520">#520</a>)</li>
<li>Fix PythonFunction.overloads typing when source code overload(s) do
not provide a return type (<a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/523">#523</a>)</li>
</ul>
<h1>Misc</h1>
<ul>
<li>Fix deprecation warnings raised by astroid and sphinx</li>
<li>Handling case where match returns None to fix mypy unit test.</li>
</ul>
<h2>v3.6.1</h2>
<h1>Bugfixes</h1>
<ul>
<li>Update the supported versions of astroid. Fix the breaking change to
Import and pass in the AstroidManager to the AstroidBuilder (<a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/536">#536</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/readthedocs/sphinx-autoapi/blob/main/CHANGELOG.rst">sphinx-autoapi's
changelog</a>.</em></p>
<blockquote>
<h2>v3.8.0 (2026-03-07)</h2>
<p>Features
^^^^^^^^</p>
<ul>
<li>Autodoc-style directives can access members excluded by
autoapi_options</li>
</ul>
<p>Misc
^^^^</p>
<ul>
<li><a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/553">#553</a></li>
</ul>
<h2>v3.7.0 (2026-02-10)</h2>
<p>Features
^^^^^^^^</p>
<ul>
<li>Added autoapi.import warning for when AutoAPI directives are given
non-existent objects</li>
<li>Adding <code>autoapi_follow_symlinks</code>, which allows api to
traverse into symlinked directories when generating the API
documentation.</li>
<li>Drop support for Python 3.9 and officially support Python 3.14</li>
<li>Support rendering PEP-695 type parameters</li>
</ul>
<p>Bugfixes
^^^^^^^^</p>
<ul>
<li>Render typing_extensions.TypeAlias like other type aliases (<a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/520">#520</a>)</li>
<li>Fix <code>PythonFunction.overloads</code> typing when source code
overload(s) do not provide a return type (<a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/523">#523</a>)</li>
</ul>
<p>Misc
^^^^</p>
<ul>
<li>Fix deprecation warnings raised by astroid and sphinx</li>
<li>Handling case where match returns None to fix mypy unit test.</li>
</ul>
<h2>v3.6.1 (2025-10-06)</h2>
<p>Bugfixes
^^^^^^^^</p>
<ul>
<li>Update the supported versions of astroid.
Fix the breaking change to Import and pass in the AstroidManager to the
AstroidBuilder (<a
href="https://redirect.github.com/readthedocs/sphinx-autoapi/issues/536">#536</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="75cbffdea0"><code>75cbffd</code></a>
Version 3.8.0</li>
<li><a
href="7838cf6937"><code>7838cf6</code></a>
Bump the github-actions group with 2 updates</li>
<li><a
href="f1cdd30233"><code>f1cdd30</code></a>
Attempt to fix macos-latest build</li>
<li><a
href="34bb24ccc9"><code>34bb24c</code></a>
Autodoc-style directives can access members excluded by
autoapi_options</li>
<li><a
href="ccb2e898cb"><code>ccb2e89</code></a>
astroid requirement is consistent across all versions of Python</li>
<li><a
href="0917ed2d4a"><code>0917ed2</code></a>
Version 3.7.0</li>
<li><a
href="394beb4532"><code>394beb4</code></a>
Add warning for missing import</li>
<li><a
href="96cd74d1a0"><code>96cd74d</code></a>
Update changelog</li>
<li><a
href="c248b85d66"><code>c248b85</code></a>
Render typing_extensions.TypeAlias like other type aliases</li>
<li><a
href="a2f49c9689"><code>a2f49c9</code></a>
Fix deprecation warnings raised by astroid and sphinx</li>
<li>Additional commits viewable in <a
href="https://github.com/readthedocs/sphinx-autoapi/compare/v3.6.0...v3.8.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `sphinxcontrib-mermaid` from 2.0.1 to 2.0.2
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/mgaitan/sphinxcontrib-mermaid/blob/master/CHANGELOG.md">sphinxcontrib-mermaid's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2>Unreleased</h2>
<ul>
<li>Add <code>mermaid_dark_theme</code> and
<code>mermaid_light_theme</code> config options for configurable theme
switching</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="19be468202"><code>19be468</code></a>
Merge pull request <a
href="https://redirect.github.com/mgaitan/sphinxcontrib-mermaid/issues/240">#240</a>
from timkpaine/tkp/hatch</li>
<li><a
href="e1f9eccc13"><code>e1f9ecc</code></a>
Switch to hatchling</li>
<li><a
href="42aa20a010"><code>42aa20a</code></a>
Merge pull request <a
href="https://redirect.github.com/mgaitan/sphinxcontrib-mermaid/issues/239">#239</a>
from timkpaine/tkp/202</li>
<li><a
href="2db5b555ff"><code>2db5b55</code></a>
bump to 2.0.2</li>
<li><a
href="25c7ef7b8f"><code>25c7ef7</code></a>
Merge pull request <a
href="https://redirect.github.com/mgaitan/sphinxcontrib-mermaid/issues/237">#237</a>
from kartben/local_paths</li>
<li><a
href="e98c6f8b88"><code>e98c6f8</code></a>
increase test coverage for _use_local options</li>
<li><a
href="1422b452a5"><code>1422b45</code></a>
Resolve local Mermaid/ELK/ZenUML/D3 JS paths under html_static_path</li>
<li><a
href="d6d874c4fb"><code>d6d874c</code></a>
Merge pull request <a
href="https://redirect.github.com/mgaitan/sphinxcontrib-mermaid/issues/236">#236</a>
from jensens/configurable-theme</li>
<li><a
href="bce597640b"><code>bce5976</code></a>
Document mermaid_dark_theme and mermaid_light_theme config options</li>
<li><a
href="12bb2ac696"><code>12bb2ac</code></a>
Add mermaid_dark_theme and mermaid_light_theme config options</li>
<li>See full diff in <a
href="https://github.com/mgaitan/sphinxcontrib-mermaid/compare/2.0.1...2.0.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `markdown` from 3.8.2 to 3.10.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Python-Markdown/markdown/releases">markdown's
releases</a>.</em></p>
<blockquote>
<h2>Release 3.10.2</h2>
<h3>Fixed</h3>
<ul>
<li>Fix a regression related to comment handling (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1590">#1590</a>).</li>
<li>More reliable fix for <code>&lt;/</code> (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1593">#1593</a>).</li>
</ul>
<h2>Release 3.10.1</h2>
<h3>Fixed</h3>
<ul>
<li>Ensure nested elements inside inline comments are properly unescaped
(<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1571">#1571</a>).</li>
<li>Make the docs build successfully with mkdocstrings-python 2.0 (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1575">#1575</a>).</li>
<li>Fix infinite loop when multiple bogus or unclosed HTML comments
appear in input (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1578">#1578</a>).</li>
<li>Fix another infinite loop when handling bad comments (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1586">#1586</a>).</li>
</ul>
<h2>Release 3.10.0</h2>
<h3>Changed</h3>
<ul>
<li>Officially support Python 3.14 and PyPy 3.11 and drop support for
Python 3.9
and PyPy 3.9.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix an HTML comment parsing case in some Python versions that can
cause an
infinite loop (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1554">#1554</a>).</li>
<li>Revert the default behavior of <code>USE_DEFINITION_ORDER</code> (to
<code>True</code>). The new
behavior introduced in 3.9.0 is experimental and results are
inconsistent.
It should not have been made the default behavior (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1561">#1561</a>).</li>
</ul>
<h2>Release 3.9.0</h2>
<h3>Changed</h3>
<ul>
<li>Footnotes are now ordered by the occurrence of their references in
the
document. A new configuration option for the footnotes extension,
<code>USE_DEFINITION_ORDER</code>, has been added to support restoring
the previous
behavior of ordering footnotes by the occurrence of definitions (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1367">#1367</a>).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Ensure inline processing iterates through elements in document order
(<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1546">#1546</a>).</li>
<li>Fix handling of incomplete HTML tags in code spans in Python 3.14
(<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1547">#1547</a>).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md">markdown's
changelog</a>.</em></p>
<blockquote>
<h2>[3.10.2] - 2026-02-09</h2>
<h3>Fixed</h3>
<ul>
<li>Fix a regression related to comment handling (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1590">#1590</a>).</li>
<li>More reliable fix for <code>&lt;/</code> (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1593">#1593</a>).</li>
</ul>
<h2>[3.10.1] - 2026-01-21</h2>
<h3>Fixed</h3>
<ul>
<li>Ensure nested elements inside inline comments are properly unescaped
(<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1571">#1571</a>).</li>
<li>Make the docs build successfully with mkdocstrings-python 2.0 (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1575">#1575</a>).</li>
<li>Fix infinite loop when multiple bogus or unclosed HTML comments
appear in input (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1578">#1578</a>).</li>
<li>Fix another infinite loop when handling bad comments (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1586">#1586</a>).</li>
</ul>
<h2>[3.10.0] - 2025-11-03</h2>
<h3>Changed</h3>
<ul>
<li>Officially support Python 3.14 and PyPy 3.11 and drop support for
Python 3.9
and PyPy 3.9.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix an HTML comment parsing case in some Python versions that can
cause an
infinite loop (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1554">#1554</a>).</li>
<li>Revert the default behavior of <code>USE_DEFINITION_ORDER</code> (to
<code>True</code>). The new
behavior introduced in 3.9.0 is experimental and results are
inconsistent.
It should not have been made the default behavior (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1561">#1561</a>).</li>
</ul>
<h2>[3.9.0] - 2025-09-04</h2>
<h3>Changed</h3>
<ul>
<li>Footnotes are now ordered by the occurrence of their references in
the
document. A new configuration option for the footnotes extension,
<code>USE_DEFINITION_ORDER</code>, has been added to support restoring
the previous
behavior of ordering footnotes by the occurrence of definitions (<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1367">#1367</a>).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Ensure inline processing iterates through elements in document order
(<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1546">#1546</a>).</li>
<li>Fix handling of incomplete HTML tags in code spans in Python 3.14
(<a
href="https://redirect.github.com/Python-Markdown/markdown/issues/1547">#1547</a>).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e7a0efb3a7"><code>e7a0efb</code></a>
Bump version to 3.10.2</li>
<li><a
href="630183336b"><code>6301833</code></a>
Document HTML sanitation policy</li>
<li><a
href="7f29f1a69d"><code>7f29f1a</code></a>
More reliable fix for <code>&lt;/</code></li>
<li><a
href="c4386475a6"><code>c438647</code></a>
Fix regression of special comments</li>
<li><a
href="e5fa5b86e8"><code>e5fa5b8</code></a>
Bump version to 3.10.1</li>
<li><a
href="f9253495f5"><code>f925349</code></a>
More HTML fixes</li>
<li><a
href="9933a0a469"><code>9933a0a</code></a>
Revert &quot;Allow reference links with backticks&quot;</li>
<li><a
href="07dfa4eb43"><code>07dfa4e</code></a>
Allow reference links with backticks</li>
<li><a
href="fb6b27a6ff"><code>fb6b27a</code></a>
Fix infinite loop when text contains multiple unclosed comments</li>
<li><a
href="89112c293f"><code>89112c2</code></a>
Make the docs build successfully with mkdocstrings-python 2.0</li>
<li>Additional commits viewable in <a
href="https://github.com/Python-Markdown/markdown/compare/3.8.2...3.10.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `orjson` from 3.10.18 to 3.11.8
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ijl/orjson/releases">orjson's
releases</a>.</em></p>
<blockquote>
<h2>3.11.8</h2>
<h3>Changed</h3>
<ul>
<li>Build and compatibility improvements.</li>
</ul>
<h2>3.11.7</h2>
<h3>Changed</h3>
<ul>
<li>Use a faster library to serialize <code>float</code>. Users with
byte-exact regression
tests should note positive exponents are now written using a
<code>+</code>, e.g.,
<code>1.2e+30</code> instead of <code>1.2e30</code>. Both formats are
spec-compliant.</li>
<li>ABI compatibility with CPython 3.15 alpha 5 free-threading.</li>
</ul>
<h2>3.11.6</h2>
<h3>Changed</h3>
<ul>
<li>orjson now includes code licensed under the Mozilla Public License
2.0 (MPL-2.0).</li>
<li>Drop support for Python 3.9.</li>
<li>ABI compatibility with CPython 3.15 alpha 5.</li>
<li>Build now depends on Rust 1.89 or later instead of 1.85.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix sporadic crash serializing deeply nested <code>list</code> of
<code>dict</code>.</li>
</ul>
<h2>3.11.5</h2>
<h3>Changed</h3>
<ul>
<li>Show simple error message instead of traceback when attempting to
build on unsupported Python versions.</li>
</ul>
<h2>3.11.4</h2>
<h3>Changed</h3>
<ul>
<li>ABI compatibility with CPython 3.15 alpha 1.</li>
<li>Publish PyPI wheels for 3.14 and manylinux i686, manylinux arm7,
manylinux ppc64le, manylinux s390x.</li>
<li>Build now requires a C compiler.</li>
</ul>
<h2>3.11.3</h2>
<h3>Fixed</h3>
<ul>
<li>Fix PyPI project metadata when using maturin 1.9.2 or later.</li>
</ul>
<h2>3.11.2</h2>
<h3>Fixed</h3>
<ul>
<li>Fix build using Rust 1.89 on amd64.</li>
</ul>
<h3>Changed</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ijl/orjson/blob/master/CHANGELOG.md">orjson's
changelog</a>.</em></p>
<blockquote>
<h2>3.11.8 - 2026-03-31</h2>
<h3>Changed</h3>
<ul>
<li>Build and compatibility improvements.</li>
</ul>
<h2>3.11.7 - 2026-02-02</h2>
<h3>Changed</h3>
<ul>
<li>Use a faster library to serialize <code>float</code>. Users with
byte-exact regression
tests should note positive exponents are now written using a
<code>+</code>, e.g.,
<code>1.2e+30</code> instead of <code>1.2e30</code>. Both formats are
spec-compliant.</li>
<li>ABI compatibility with CPython 3.15 alpha 5 free-threading.</li>
</ul>
<h2>3.11.6 - 2026-01-29</h2>
<h3>Changed</h3>
<ul>
<li>orjson now includes code licensed under the Mozilla Public License
2.0 (MPL-2.0).</li>
<li>Drop support for Python 3.9.</li>
<li>ABI compatibility with CPython 3.15 alpha 5.</li>
<li>Build now depends on Rust 1.89 or later instead of 1.85.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix sporadic crash serializing deeply nested <code>list</code> of
<code>dict</code>.</li>
</ul>
<h2>3.11.5 - 2025-12-06</h2>
<h3>Changed</h3>
<ul>
<li>Show simple error message instead of traceback when attempting to
build on unsupported Python versions.</li>
</ul>
<h2>3.11.4 - 2025-10-24</h2>
<h3>Changed</h3>
<ul>
<li>ABI compatibility with CPython 3.15 alpha 1.</li>
<li>Publish PyPI wheels for 3.14 and manylinux i686, manylinux arm7,
manylinux ppc64le, manylinux s390x.</li>
<li>Build now requires a C compiler.</li>
</ul>
<h2>3.11.3 - 2025-08-26</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5cbb3d0398"><code>5cbb3d0</code></a>
3.11.8</li>
<li><a
href="4195d7f263"><code>4195d7f</code></a>
writer::half</li>
<li><a
href="d00641b694"><code>d00641b</code></a>
writer::uuid</li>
<li><a
href="c84d9b4ba4"><code>c84d9b4</code></a>
build and compatibility misc</li>
<li><a
href="4547234b68"><code>4547234</code></a>
ffi::numpy</li>
<li><a
href="0d4a5ad1f1"><code>0d4a5ad</code></a>
datetime PyRef idiom</li>
<li><a
href="e93a13d372"><code>e93a13d</code></a>
Cross-compile avoids maturin v1.12 build-details.json error</li>
<li><a
href="ec2b066cae"><code>ec2b066</code></a>
3.11.7</li>
<li><a
href="1ca01f78cf"><code>1ca01f7</code></a>
zmij</li>
<li><a
href="1716a226bd"><code>1716a22</code></a>
cargo update</li>
<li>Additional commits viewable in <a
href="https://github.com/ijl/orjson/compare/3.10.18...3.11.8">compare
view</a></li>
</ul>
</details>
<br />

Updates `typing-extensions` from 4.14.0 to 4.15.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/python/typing_extensions/releases">typing-extensions's
releases</a>.</em></p>
<blockquote>
<h2>4.15.0</h2>
<p>No user-facing changes since 4.15.0rc1.</p>
<p>New features since 4.14.1:</p>
<ul>
<li>Add the <code>@typing_extensions.disjoint_base</code> decorator, as
specified
in PEP 800. Patch by Jelle Zijlstra.</li>
<li>Add <code>typing_extensions.type_repr</code>, a backport of
<a
href="https://docs.python.org/3.14/library/annotationlib.html#annotationlib.type_repr"><code>annotationlib.type_repr</code></a>,
introduced in Python 3.14 (CPython PR <a
href="https://redirect.github.com/python/cpython/pull/124551">#124551</a>,
originally by Jelle Zijlstra). Patch by Semyon Moroz.</li>
<li>Fix behavior of type params in
<code>typing_extensions.evaluate_forward_ref</code>. Backport of
CPython PR <a
href="https://redirect.github.com/python/cpython/pull/137227">#137227</a>
by Jelle Zijlstra.</li>
</ul>
<h2>4.15.0rc1</h2>
<ul>
<li>Add the <code>@typing_extensions.disjoint_base</code> decorator, as
specified
in PEP 800. Patch by Jelle Zijlstra.</li>
<li>Add <code>typing_extensions.type_repr</code>, a backport of
<a
href="https://docs.python.org/3.14/library/annotationlib.html#annotationlib.type_repr"><code>annotationlib.type_repr</code></a>,
introduced in Python 3.14 (CPython PR <a
href="https://redirect.github.com/python/cpython/pull/124551">#124551</a>,
originally by Jelle Zijlstra). Patch by Semyon Moroz.</li>
<li>Fix behavior of type params in
<code>typing_extensions.evaluate_forward_ref</code>. Backport of
CPython PR <a
href="https://redirect.github.com/python/cpython/pull/137227">#137227</a>
by Jelle Zijlstra.</li>
</ul>
<h2>4.14.1</h2>
<h1>Release 4.14.1 (July 4, 2025)</h1>
<ul>
<li>Fix usage of <code>typing_extensions.TypedDict</code> nested inside
other types
(e.g., <code>typing.Type[typing_extensions.TypedDict]</code>). This is
not allowed by the
type system but worked on older versions, so we maintain support.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/python/typing_extensions/blob/main/CHANGELOG.md">typing-extensions's
changelog</a>.</em></p>
<blockquote>
<h1>Release 4.15.0 (August 25, 2025)</h1>
<p>No user-facing changes since 4.15.0rc1.</p>
<h1>Release 4.15.0rc1 (August 18, 2025)</h1>
<ul>
<li>Add the <code>@typing_extensions.disjoint_base</code> decorator, as
specified
in PEP 800. Patch by Jelle Zijlstra.</li>
<li>Add <code>typing_extensions.type_repr</code>, a backport of
<a
href="https://docs.python.org/3.14/library/annotationlib.html#annotationlib.type_repr"><code>annotationlib.type_repr</code></a>,
introduced in Python 3.14 (CPython PR <a
href="https://redirect.github.com/python/cpython/pull/124551">#124551</a>,
originally by Jelle Zijlstra). Patch by Semyon Moroz.</li>
<li>Fix behavior of type params in
<code>typing_extensions.evaluate_forward_ref</code>. Backport of
CPython PR <a
href="https://redirect.github.com/python/cpython/pull/137227">#137227</a>
by Jelle Zijlstra.</li>
</ul>
<h1>Release 4.14.1 (July 4, 2025)</h1>
<ul>
<li>Fix usage of <code>typing_extensions.TypedDict</code> nested inside
other types
(e.g., <code>typing.Type[typing_extensions.TypedDict]</code>). This is
not allowed by the
type system but worked on older versions, so we maintain support.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9d1637e264"><code>9d1637e</code></a>
Prepare release 4.15.0 (<a
href="https://redirect.github.com/python/typing_extensions/issues/658">#658</a>)</li>
<li><a
href="4bd67c5be5"><code>4bd67c5</code></a>
Coverage: exclude some noise (<a
href="https://redirect.github.com/python/typing_extensions/issues/656">#656</a>)</li>
<li><a
href="e589a26da7"><code>e589a26</code></a>
Coverage: add detailed report to job summary (<a
href="https://redirect.github.com/python/typing_extensions/issues/655">#655</a>)</li>
<li><a
href="67d37fed12"><code>67d37fe</code></a>
Coverage: Implement fail_under (<a
href="https://redirect.github.com/python/typing_extensions/issues/654">#654</a>)</li>
<li><a
href="e9ae26f528"><code>e9ae26f</code></a>
Don't delete previous coverage comment (<a
href="https://redirect.github.com/python/typing_extensions/issues/653">#653</a>)</li>
<li><a
href="ac80bb728a"><code>ac80bb7</code></a>
Add Coverage workflow (<a href="https://redirect.gith...

_Description has been truncated_
zsh:1: command not found: dump_zsh_state

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Fernando Lins <1887601+fernandolins@users.noreply.github.com>
2026-05-13 11:53:14 -03:00
dependabot[bot]
81abe9e0ad chore(deps): bump pip from 26.0.1 to 26.1 (#4783)
Bumps [pip](https://github.com/pypa/pip) from 26.0.1 to 26.1.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pypa/pip/blob/main/NEWS.rst">pip's
changelog</a>.</em></p>
<blockquote>
<h1>26.1 (2026-04-26)</h1>
<h2>Deprecations and Removals</h2>
<ul>
<li>Drop support for Python 3.9.
(<code>[#13795](https://github.com/pypa/pip/issues/13795)
&lt;https://github.com/pypa/pip/issues/13795&gt;</code>_)</li>
</ul>
<h2>Features</h2>
<ul>
<li>Add experimental support to read requirements from standardized
pylock.toml files (<code>-r pylock.toml</code>).
(<code>[#13876](https://github.com/pypa/pip/issues/13876)
&lt;https://github.com/pypa/pip/issues/13876&gt;</code>_)</li>
<li>Allow <code>--uploaded-prior-to</code> to accept a duration in days
(e.g., <code>P3D</code> for 3 days ago).
(<code>[#13674](https://github.com/pypa/pip/issues/13674)
&lt;https://github.com/pypa/pip/issues/13674&gt;</code>_)</li>
</ul>
<h2>Enhancements</h2>
<ul>
<li>Speed up dependency resolution when there are complex conflicts.
(<code>[#13859](https://github.com/pypa/pip/issues/13859)
&lt;https://github.com/pypa/pip/issues/13859&gt;</code>_)</li>
<li>Reduce memory usage when resolving large dependency trees.
(<code>[#13843](https://github.com/pypa/pip/issues/13843)
&lt;https://github.com/pypa/pip/issues/13843&gt;</code>_)</li>
<li>Emit a deprecation warning when pip imports an unexpected module
after
installation of a distribution has started.
(<code>[#13912](https://github.com/pypa/pip/issues/13912)
&lt;https://github.com/pypa/pip/issues/13912&gt;</code>_)</li>
<li>Allow URL constraints to apply to requirements with extras.
(<code>[#12018](https://github.com/pypa/pip/issues/12018)
&lt;https://github.com/pypa/pip/issues/12018&gt;</code>_)</li>
<li>Allow unpinned requirements to use hashes from constraints.
Constraints
like <code>{name}=={version} --hash=...</code> feeds into hash
verification for
a corresponding requirement.
(<code>[#9243](https://github.com/pypa/pip/issues/9243)
&lt;https://github.com/pypa/pip/issues/9243&gt;</code>_)</li>
<li>Improve conflict reports that involve direct URLs.
(<code>[#13932](https://github.com/pypa/pip/issues/13932)
&lt;https://github.com/pypa/pip/issues/13932&gt;</code>_)</li>
<li>Show all errors instead of first error for faulty
<code>dependency_groups</code> definitions.
(<code>[#13917](https://github.com/pypa/pip/issues/13917)
&lt;https://github.com/pypa/pip/issues/13917&gt;</code>_)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fix recovery hint for missing RECORD file to use
<code>--ignore-installed</code>
instead of <code>--force-reinstall</code>.
(<code>[#12645](https://github.com/pypa/pip/issues/12645)
&lt;https://github.com/pypa/pip/issues/12645&gt;</code>_)</li>
<li>Fix misleading error message when a constraint file cannot be
opened. (<code>[#13226](https://github.com/pypa/pip/issues/13226)
&lt;https://github.com/pypa/pip/issues/13226&gt;</code>_)</li>
<li>Show the filename rather than the full URL when downloading files
from non-PyPI indexes in non-verbose mode.
(<code>[#13494](https://github.com/pypa/pip/issues/13494)
&lt;https://github.com/pypa/pip/issues/13494&gt;</code>_)</li>
<li>Remove the adjacent <code>__pycache__</code> directory when a .py
file is removed.
(<code>[#13725](https://github.com/pypa/pip/issues/13725)
&lt;https://github.com/pypa/pip/issues/13725&gt;</code>_)</li>
<li>Force UTF-8 encoding for :pep:<code>723</code> metadata.
(<code>[#13861](https://github.com/pypa/pip/issues/13861)
&lt;https://github.com/pypa/pip/issues/13861&gt;</code>_)</li>
<li>Minor performance improvement when filtering candidates during
resolution. (<code>[#13916](https://github.com/pypa/pip/issues/13916)
&lt;https://github.com/pypa/pip/issues/13916&gt;</code>_)</li>
<li>Fix a hang on Windows when stdout is closed during verbose output.
(<code>[#13927](https://github.com/pypa/pip/issues/13927)
&lt;https://github.com/pypa/pip/issues/13927&gt;</code>_)</li>
<li>Common path prefixes are determined by path segment, not character
by character. (<code>[#13847](https://github.com/pypa/pip/issues/13847)
&lt;https://github.com/pypa/pip/issues/13847&gt;</code>_)</li>
<li>Fix installing <code>.tar.gz</code> source distributions that look
like a zip file.
(<code>[#13867](https://github.com/pypa/pip/issues/13867)
&lt;https://github.com/pypa/pip/issues/13867&gt;</code>_)</li>
</ul>
<h2>Vendored Libraries</h2>
<ul>
<li>Upgrade certifi to 2026.2.25</li>
<li>Upgrade packaging to 26.2</li>
<li>Upgrade requests to 2.33.1</li>
<li>Upgrade tomli to 2.3.1</li>
<li>Upgrade urllib3 to 2.6.3</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="90b2b3e0f7"><code>90b2b3e</code></a>
Bump for release</li>
<li><a
href="193f289a62"><code>193f289</code></a>
Update AUTHORS.txt</li>
<li><a
href="63c3709071"><code>63c3709</code></a>
Merge pull request <a
href="https://redirect.github.com/pypa/pip/issues/13876">#13876</a> from
sbidoul/install-from-pylock-reqs-sbi</li>
<li><a
href="e5fe7023ff"><code>e5fe702</code></a>
Merge pull request <a
href="https://redirect.github.com/pypa/pip/issues/13949">#13949</a> from
pypa/revert-13888-resolver-editable-links</li>
<li><a
href="122a14a8cd"><code>122a14a</code></a>
Revert &quot;Allow editable installs to satisfy direct-URL dependencies
(<a
href="https://redirect.github.com/pypa/pip/issues/13888">#13888</a>)&quot;</li>
<li><a
href="c3352524aa"><code>c335252</code></a>
-r pylock.toml: add pip-wheel -r pylock.toml test</li>
<li><a
href="ba2fc12b7f"><code>ba2fc12</code></a>
-r pylock.toml: proper error with remote pylock.toml containing
directory ent...</li>
<li><a
href="747c4ae888"><code>747c4ae</code></a>
Merge pull request <a
href="https://redirect.github.com/pypa/pip/issues/13948">#13948</a> from
ichard26/reword-news</li>
<li><a
href="3517841c5e"><code>3517841</code></a>
-r pylock: refine filename pylock-ness test</li>
<li><a
href="2f7ad8caee"><code>2f7ad8c</code></a>
-r pylock.toml: fix crash with pip wheel and pip lock</li>
<li>Additional commits viewable in <a
href="https://github.com/pypa/pip/compare/26.0.1...26.1">compare
view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Fernando Lins <1887601+fernandolins@users.noreply.github.com>
2026-05-13 10:44:44 -03:00
dependabot[bot]
68518d59a3 chore(deps): bump types-decorator from 5.2.0.20250324 to 5.2.0.20260408 (#4730)
Bumps [types-decorator](https://github.com/python/typeshed) from
5.2.0.20250324 to 5.2.0.20260408.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/python/typeshed/commits">compare view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-13 10:07:43 -03:00
Abdo
8ee11614e1 fix: optimize Briefcase bundle size (#4822)
## Linked issue

Closes #4820

## Summary

Optimize size of the Briefcase bundle by removing unused dependency
files:
- Remove large *.debug.pak/*.debug.bin files included in Qt.
- Remove packaging/typing/testing metadata.
- Remove app_packages/bin binaries.
- Remove miscellaneous unused files in PyQt6/pywin32.
- Trim large qtwebengine_locales files by only keeping files for
languages we support.
- Set MSI compression level in the Wix template to "high".

This reduces the size of the Windows MSI by ~30 MB. I was tempted to go
further and prune unused Qt modules since the bulk of the app size comes
from Qt, but that proved to be error-prone: We can't simply remove
modules not imported by Anki as they can be possibly used by add-ons and
other modules might have hidden dependencies on them.

## How to test

Build the installer and confirm installation works.
2026-05-12 22:44:24 +03:00
Fernando Lins
22b7b36bbc Add missing PyPI metadata to anki package (#4817)
## Summary/motivation 

The `anki` package on PyPI was missing key metadata fields.


## Changes
- `description`: short summary shown on the PyPI package page
- `readme`: points to `pylib/README.md` so PyPI renders the long
description
- `authors`: identifies the Anki Team as the package author
- `urls`: links back to the GitHub repository
2026-05-12 13:04:17 -03:00