Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
toxenv: ["test", "pytest7"]
fail-fast: false
steps:
Expand Down
34 changes: 17 additions & 17 deletions deps/check.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#
# This file is autogenerated by pip-compile with Python 3.9
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --annotation-style=line --output-file=deps/check.txt deps/check.in
# pip-compile --annotation-style=line --no-strip-extras --output-file=deps/check.txt deps/check.in
#
anyio==4.11.0 # via starlette
attrs==25.3.0 # via hypothesis, outcome, trio
attrs==25.4.0 # via outcome, trio
black==25.9.0 # via shed
click==8.1.8 # via black
click==8.3.0 # via black
com2ann==0.3.0 # via shed
exceptiongroup==1.3.0 # via anyio, hypercorn, hypothesis, pytest, taskgroup, trio
flake8==7.3.0 # via pep8-naming
Expand All @@ -16,39 +16,39 @@ h2==4.3.0 # via hypercorn
hpack==4.1.0 # via h2
hypercorn==0.17.3 # via -r deps/check.in
hyperframe==6.1.0 # via h2
hypothesis==6.140.2 # via -r deps/check.in
idna==3.10 # via anyio, trio
iniconfig==2.1.0 # via pytest
libcst==1.8.5 # via shed
hypothesis==6.145.1 # via -r deps/check.in
idna==3.11 # via anyio, trio
iniconfig==2.3.0 # via pytest
libcst==1.8.6 # via shed
mccabe==0.7.0 # via flake8
mypy==1.18.2 # via -r deps/check.in
mypy-extensions==1.1.0 # via black, mypy
outcome==1.3.0.post0 # via trio
packaging==25.0 # via black, pytest
pathspec==0.12.1 # via black, mypy
pep8-naming==0.15.1 # via -r deps/check.in
platformdirs==4.4.0 # via black
platformdirs==4.5.0 # via black
pluggy==1.6.0 # via pytest
priority==2.0.0 # via hypercorn
psutil==7.1.0 # via -r deps/check.in
psutil==7.1.3 # via -r deps/check.in
pycodestyle==2.14.0 # via flake8
pyflakes==3.4.0 # via flake8
pygments==2.19.2 # via pytest
pytest==8.4.2 # via -r deps/check.in
pytokens==0.1.10 # via black
pyupgrade==3.20.0 # via shed
pytokens==0.2.0 # via black
pyupgrade==3.21.0 # via shed
pyyaml==6.0.3 # via libcst
ruff==0.13.2 # via -r deps/check.in, shed
ruff==0.14.3 # via -r deps/check.in, shed
shed==2025.6.1 # via -r deps/check.in
sniffio==1.3.1 # via anyio, trio
sortedcontainers==2.4.0 # via hypothesis, sortedcontainers-stubs, trio
sortedcontainers-stubs==2.4.3 # via -r deps/check.in
starlette==0.48.0 # via -r deps/check.in
starlette==0.50.0 # via -r deps/check.in
taskgroup==0.2.2 # via hypercorn
tokenize-rt==6.2.0 # via pyupgrade
tomli==2.2.1 # via black, hypercorn, mypy, pytest
trio==0.31.0 # via -r deps/check.in
tomli==2.3.0 # via black, hypercorn, mypy, pytest
trio==0.32.0 # via -r deps/check.in
types-requests==2.32.4.20250913 # via -r deps/check.in
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, libcst, mypy, sortedcontainers-stubs, starlette, taskgroup
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, mypy, sortedcontainers-stubs, starlette, taskgroup
urllib3==2.5.0 # via types-requests
wsproto==1.2.0 # via hypercorn
50 changes: 24 additions & 26 deletions deps/docs.txt
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
#
# This file is autogenerated by pip-compile with Python 3.9
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --annotation-style=line --output-file=deps/docs.txt deps/docs.in pyproject.toml
# pip-compile --annotation-style=line --no-strip-extras --output-file=deps/docs.txt deps/docs.in pyproject.toml
#
accessible-pygments==0.0.5 # via furo
alabaster==0.7.16 # via sphinx
alabaster==1.0.0 # via sphinx
anyio==4.11.0 # via starlette
attrs==25.3.0 # via hypothesis, outcome, trio
attrs==25.4.0 # via outcome, trio
babel==2.17.0 # via sphinx
beautifulsoup4==4.14.0 # via furo
beautifulsoup4==4.14.2 # via furo
black==25.9.0 # via hypofuzz (pyproject.toml), hypothesis
certifi==2025.8.3 # via requests
charset-normalizer==3.4.3 # via requests
click==8.1.8 # via black, hypothesis
coverage==7.10.7 # via hypofuzz (pyproject.toml)
certifi==2025.10.5 # via requests
charset-normalizer==3.4.4 # via requests
click==8.3.0 # via black, hypothesis
coverage==7.11.0 # via hypofuzz (pyproject.toml)
docutils==0.21.2 # via myst-parser, pybtex-docutils, sphinx, sphinxcontrib-bibtex
exceptiongroup==1.3.0 # via anyio, hypercorn, hypothesis, pytest, taskgroup, trio
furo==2025.9.25 # via -r deps/docs.in
Expand All @@ -23,40 +23,39 @@ h2==4.3.0 # via hypercorn
hpack==4.1.0 # via h2
hypercorn==0.17.3 # via hypofuzz (pyproject.toml)
hyperframe==6.1.0 # via h2
hypothesis[cli,watchdog]==6.140.2 # via hypofuzz (pyproject.toml)
idna==3.10 # via anyio, requests, trio
hypothesis[cli,watchdog]==6.145.1 # via hypofuzz (pyproject.toml)
idna==3.11 # via anyio, requests, trio
imagesize==1.4.1 # via sphinx
importlib-metadata==8.7.0 # via pybtex, sphinx, sphinxcontrib-bibtex
iniconfig==2.1.0 # via pytest
iniconfig==2.3.0 # via pytest
jinja2==3.1.6 # via myst-parser, sphinx
latexcodec==3.0.1 # via pybtex
libcst==1.8.5 # via hypofuzz (pyproject.toml)
libcst==1.8.6 # via hypofuzz (pyproject.toml)
markdown-it-py==3.0.0 # via mdit-py-plugins, myst-parser, rich
markupsafe==3.0.3 # via jinja2
mdit-py-plugins==0.4.2 # via myst-parser
mdit-py-plugins==0.5.0 # via myst-parser
mdurl==0.1.2 # via markdown-it-py
mypy-extensions==1.1.0 # via black
myst-parser==3.0.1 # via -r deps/docs.in
myst-parser==4.0.1 # via -r deps/docs.in
outcome==1.3.0.post0 # via trio
packaging==25.0 # via black, pytest, sphinx
pathspec==0.12.1 # via black
platformdirs==4.4.0 # via black
platformdirs==4.5.0 # via black
pluggy==1.6.0 # via pytest
priority==2.0.0 # via hypercorn
psutil==7.1.0 # via hypofuzz (pyproject.toml)
psutil==7.1.3 # via hypofuzz (pyproject.toml)
pybtex==0.25.1 # via pybtex-docutils, sphinxcontrib-bibtex
pybtex-docutils==1.0.3 # via sphinxcontrib-bibtex
pygments==2.19.2 # via accessible-pygments, furo, pytest, rich, sphinx
pytest==8.4.2 # via hypofuzz (pyproject.toml)
pytokens==0.1.10 # via black
pytokens==0.2.0 # via black
pyyaml==6.0.3 # via libcst, myst-parser, pybtex
requests==2.32.5 # via sphinx
rich==14.1.0 # via hypothesis
rich==14.2.0 # via hypothesis
sniffio==1.3.1 # via anyio, trio
snowballstemmer==3.0.1 # via sphinx
sortedcontainers==2.4.0 # via hypothesis, trio
soupsieve==2.8 # via beautifulsoup4
sphinx==7.4.7 # via -r deps/docs.in, furo, myst-parser, sphinx-basic-ng, sphinxcontrib-bibtex
sphinx==8.1.3 # via -r deps/docs.in, furo, myst-parser, sphinx-basic-ng, sphinxcontrib-bibtex
sphinx-basic-ng==1.0.0b2 # via furo
sphinxcontrib-applehelp==2.0.0 # via sphinx
sphinxcontrib-bibtex==2.6.5 # via -r deps/docs.in
Expand All @@ -65,12 +64,11 @@ sphinxcontrib-htmlhelp==2.1.0 # via sphinx
sphinxcontrib-jsmath==1.0.1 # via sphinx
sphinxcontrib-qthelp==2.0.0 # via sphinx
sphinxcontrib-serializinghtml==2.0.0 # via sphinx
starlette==0.48.0 # via hypofuzz (pyproject.toml)
starlette==0.50.0 # via hypofuzz (pyproject.toml)
taskgroup==0.2.2 # via hypercorn
tomli==2.2.1 # via black, hypercorn, pytest, sphinx
trio==0.31.0 # via hypofuzz (pyproject.toml)
typing-extensions==4.15.0 # via anyio, beautifulsoup4, black, exceptiongroup, hypercorn, libcst, starlette, taskgroup
tomli==2.3.0 # via black, hypercorn, pytest, sphinx
trio==0.32.0 # via hypofuzz (pyproject.toml)
typing-extensions==4.15.0 # via anyio, beautifulsoup4, black, exceptiongroup, hypercorn, starlette, taskgroup
urllib3==2.5.0 # via requests
watchdog==6.0.0 # via hypothesis
wsproto==1.2.0 # via hypercorn
zipp==3.23.0 # via importlib-metadata
40 changes: 20 additions & 20 deletions deps/test.txt
Original file line number Diff line number Diff line change
@@ -1,52 +1,52 @@
#
# This file is autogenerated by pip-compile with Python 3.9
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --annotation-style=line --output-file=deps/test.txt deps/test.in pyproject.toml
# pip-compile --annotation-style=line --no-strip-extras --output-file=deps/test.txt deps/test.in pyproject.toml
#
anyio==4.11.0 # via starlette
attrs==25.3.0 # via hypothesis, outcome, trio
attrs==25.4.0 # via outcome, trio
black==25.9.0 # via hypofuzz (pyproject.toml), hypothesis
certifi==2025.8.3 # via requests
charset-normalizer==3.4.3 # via requests
click==8.1.8 # via black, hypothesis
coverage[toml]==7.10.7 # via hypofuzz (pyproject.toml), pytest-cov
certifi==2025.10.5 # via requests
charset-normalizer==3.4.4 # via requests
click==8.3.0 # via black, hypothesis
coverage[toml]==7.11.0 # via hypofuzz (pyproject.toml), pytest-cov
exceptiongroup==1.3.0 # via anyio, hypercorn, hypothesis, pytest, taskgroup, trio
execnet==2.1.1 # via pytest-xdist
h11==0.16.0 # via hypercorn, wsproto
h2==4.3.0 # via hypercorn
hpack==4.1.0 # via h2
hypercorn==0.17.3 # via hypofuzz (pyproject.toml)
hyperframe==6.1.0 # via h2
hypothesis[cli,watchdog]==6.140.2 # via hypofuzz (pyproject.toml)
idna==3.10 # via anyio, requests, trio
iniconfig==2.1.0 # via pytest
libcst==1.8.5 # via hypofuzz (pyproject.toml)
markdown-it-py==3.0.0 # via rich
hypothesis[cli,watchdog]==6.145.1 # via hypofuzz (pyproject.toml)
idna==3.11 # via anyio, requests, trio
iniconfig==2.3.0 # via pytest
libcst==1.8.6 # via hypofuzz (pyproject.toml)
markdown-it-py==4.0.0 # via rich
mdurl==0.1.2 # via markdown-it-py
mypy-extensions==1.1.0 # via black
outcome==1.3.0.post0 # via trio
packaging==25.0 # via black, pytest
pathspec==0.12.1 # via black
platformdirs==4.4.0 # via black
platformdirs==4.5.0 # via black
pluggy==1.6.0 # via pytest, pytest-cov
priority==2.0.0 # via hypercorn
psutil==7.1.0 # via hypofuzz (pyproject.toml)
psutil==7.1.3 # via hypofuzz (pyproject.toml)
pygments==2.19.2 # via pytest, rich
pytest==8.4.2 # via -r deps/test.in, hypofuzz (pyproject.toml), pytest-cov, pytest-xdist
pytest-cov==7.0.0 # via -r deps/test.in
pytest-xdist==3.8.0 # via -r deps/test.in
pytokens==0.1.10 # via black
pytokens==0.2.0 # via black
pyyaml==6.0.3 # via libcst
requests==2.32.5 # via -r deps/test.in
rich==14.1.0 # via hypothesis
rich==14.2.0 # via hypothesis
sniffio==1.3.1 # via anyio, trio
sortedcontainers==2.4.0 # via hypothesis, trio
starlette==0.48.0 # via hypofuzz (pyproject.toml)
starlette==0.50.0 # via hypofuzz (pyproject.toml)
taskgroup==0.2.2 # via hypercorn
tomli==2.2.1 # via black, coverage, hypercorn, pytest
trio==0.31.0 # via hypofuzz (pyproject.toml)
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, libcst, starlette, taskgroup
tomli==2.3.0 # via black, coverage, hypercorn, pytest
trio==0.32.0 # via hypofuzz (pyproject.toml)
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, starlette, taskgroup
urllib3==2.5.0 # via requests
watchdog==6.0.0 # via hypothesis
wsproto==1.2.0 # via hypercorn
42 changes: 21 additions & 21 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -153,27 +153,27 @@
<div class="features__feature__text">
We'll have plenty to share as we roll out new features! The first place you'll hear about them is our low-volume newsletter.
</div>
<form
action="https://hypofuzz.us17.list-manage.com/subscribe/post?u=7c7cccd93480e9b723c4696ee&amp;id=e6284f13ed"
method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form"
target="_blank" style="max-width: 600px; margin-top: 1rem;">
<div id="mc_embed_signup_scroll">
<div class="mc-field-group" style="display: flex; gap: 0.5rem; align-items: center;">
<input type="email" placeholder="me@example.com" value="" name="EMAIL"
id="mce-EMAIL" required
style="flex: 1; padding: 0.75rem; border: 1px solid #ccc; border-radius: 0.375rem;">
<button type="submit" name="subscribe"
id="mc-embedded-subscribe" class="button button--primary mailing-button">Subscribe</button>
</div>
<div id="mce-responses" class="clear">
<div class="response" id="mce-error-response" style="display:none"></div>
<div class="response" id="mce-success-response" style="display:none"></div>
</div>
<!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
<div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text"
name="b_7c7cccd93480e9b723c4696ee_e6284f13ed" tabindex="-1" value=""></div>
</div>
</form>
<form
action="https://hypofuzz.us17.list-manage.com/subscribe/post?u=7c7cccd93480e9b723c4696ee&amp;id=e6284f13ed"
method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form"
target="_blank" style="max-width: 600px; margin-top: 1rem;">
<div id="mc_embed_signup_scroll">
<div class="mc-field-group" style="display: flex; gap: 0.5rem; align-items: center;">
<input type="email" placeholder="me@example.com" value="" name="EMAIL"
id="mce-EMAIL" required
style="flex: 1; padding: 0.75rem; border: 1px solid #ccc; border-radius: 0.375rem;">
<button type="submit" name="subscribe"
id="mc-embedded-subscribe" class="button button--primary mailing-button">Subscribe</button>
</div>
<div id="mce-responses" class="clear">
<div class="response" id="mce-error-response" style="display:none"></div>
<div class="response" id="mce-success-response" style="display:none"></div>
</div>
<!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
<div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text"
name="b_7c7cccd93480e9b723c4696ee_e6284f13ed" tabindex="-1" value=""></div>
</div>
</form>
</div>
</div>
</div>
Expand Down
13 changes: 5 additions & 8 deletions example_suite/src/example_suite/boyer_moore.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
from typing import Dict, List


def boyer_moore_search(text: str, pattern: str) -> List[int]:
def boyer_moore_search(text: str, pattern: str) -> list[int]:
"""
Full Boyer-Moore string search algorithm implementation.

Expand Down Expand Up @@ -48,7 +45,7 @@ def boyer_moore_search(text: str, pattern: str) -> List[int]:
return matches


def _build_bad_char_table(pattern: str) -> Dict[str, int]:
def _build_bad_char_table(pattern: str) -> dict[str, int]:
"""
Build the bad character rule table.

Expand All @@ -64,7 +61,7 @@ def _build_bad_char_table(pattern: str) -> Dict[str, int]:
return table


def _get_bad_char_shift(table: Dict[str, int], char: str, j: int, m: int) -> int:
def _get_bad_char_shift(table: dict[str, int], char: str, j: int, m: int) -> int:
"""
Calculate shift using bad character rule.

Expand All @@ -83,7 +80,7 @@ def _get_bad_char_shift(table: Dict[str, int], char: str, j: int, m: int) -> int
return max(1, m - j)


def _build_border_table(pattern: str) -> List[int]:
def _build_border_table(pattern: str) -> list[int]:
"""
Build the border table for the good suffix rule.

Expand All @@ -109,7 +106,7 @@ def _build_border_table(pattern: str) -> List[int]:
return border


def _build_good_suffix_table(pattern: str) -> List[int]:
def _build_good_suffix_table(pattern: str) -> list[int]:
"""
Build the good suffix rule table.

Expand Down
12 changes: 6 additions & 6 deletions example_suite/src/example_suite/timsort.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from collections.abc import Iterable, Sequence
from typing import List, TypeVar
from typing import TypeVar

T = TypeVar("T")


def timsort(values: Sequence[T]) -> List[T]:
def timsort(values: Sequence[T]) -> list[T]:
"""
Sort and return a new list using a simplified Timsort-style algorithm.

Expand All @@ -19,7 +19,7 @@ def timsort(values: Sequence[T]) -> List[T]:
if n <= 1:
return list(values)

runs: List[List[T]] = []
runs: list[list[T]] = []

i = 0
while i < n:
Expand All @@ -44,7 +44,7 @@ def timsort(values: Sequence[T]) -> List[T]:

# Simple pairwise merge until one run remains.
while len(runs) > 1:
merged: List[List[T]] = []
merged: list[list[T]] = []
for k in range(0, len(runs), 2):
if k + 1 == len(runs):
merged.append(runs[k])
Expand All @@ -55,12 +55,12 @@ def timsort(values: Sequence[T]) -> List[T]:
return runs[0]


def _merge_two_sorted(left: Iterable[T], right: Iterable[T]) -> List[T]:
def _merge_two_sorted(left: Iterable[T], right: Iterable[T]) -> list[T]:
li = list(left)
ri = list(right)
i = 0
j = 0
out: List[T] = []
out: list[T] = []

while i < len(li) and j < len(ri):
if li[i] <= ri[j]:
Expand Down
Loading