Skip to content

Commit 5f58e9a

Browse files
authored
Merge pull request #242 from Zac-HD/next
Bump to 3.10, support new Hypothesis, update license field
2 parents 2e12fdf + 71d1488 commit 5f58e9a

31 files changed

+261
-251
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ jobs:
134134
runs-on: ubuntu-latest
135135
strategy:
136136
matrix:
137-
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
137+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
138138
toxenv: ["test", "pytest7"]
139139
fail-fast: false
140140
steps:

deps/check.txt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#
2-
# This file is autogenerated by pip-compile with Python 3.9
2+
# This file is autogenerated by pip-compile with Python 3.10
33
# by the following command:
44
#
5-
# pip-compile --annotation-style=line --output-file=deps/check.txt deps/check.in
5+
# pip-compile --annotation-style=line --no-strip-extras --output-file=deps/check.txt deps/check.in
66
#
77
anyio==4.11.0 # via starlette
8-
attrs==25.3.0 # via hypothesis, outcome, trio
8+
attrs==25.4.0 # via outcome, trio
99
black==25.9.0 # via shed
10-
click==8.1.8 # via black
10+
click==8.3.0 # via black
1111
com2ann==0.3.0 # via shed
1212
exceptiongroup==1.3.0 # via anyio, hypercorn, hypothesis, pytest, taskgroup, trio
1313
flake8==7.3.0 # via pep8-naming
@@ -16,39 +16,39 @@ h2==4.3.0 # via hypercorn
1616
hpack==4.1.0 # via h2
1717
hypercorn==0.17.3 # via -r deps/check.in
1818
hyperframe==6.1.0 # via h2
19-
hypothesis==6.140.2 # via -r deps/check.in
20-
idna==3.10 # via anyio, trio
21-
iniconfig==2.1.0 # via pytest
22-
libcst==1.8.5 # via shed
19+
hypothesis==6.145.1 # via -r deps/check.in
20+
idna==3.11 # via anyio, trio
21+
iniconfig==2.3.0 # via pytest
22+
libcst==1.8.6 # via shed
2323
mccabe==0.7.0 # via flake8
2424
mypy==1.18.2 # via -r deps/check.in
2525
mypy-extensions==1.1.0 # via black, mypy
2626
outcome==1.3.0.post0 # via trio
2727
packaging==25.0 # via black, pytest
2828
pathspec==0.12.1 # via black, mypy
2929
pep8-naming==0.15.1 # via -r deps/check.in
30-
platformdirs==4.4.0 # via black
30+
platformdirs==4.5.0 # via black
3131
pluggy==1.6.0 # via pytest
3232
priority==2.0.0 # via hypercorn
33-
psutil==7.1.0 # via -r deps/check.in
33+
psutil==7.1.3 # via -r deps/check.in
3434
pycodestyle==2.14.0 # via flake8
3535
pyflakes==3.4.0 # via flake8
3636
pygments==2.19.2 # via pytest
3737
pytest==8.4.2 # via -r deps/check.in
38-
pytokens==0.1.10 # via black
39-
pyupgrade==3.20.0 # via shed
38+
pytokens==0.2.0 # via black
39+
pyupgrade==3.21.0 # via shed
4040
pyyaml==6.0.3 # via libcst
41-
ruff==0.13.2 # via -r deps/check.in, shed
41+
ruff==0.14.3 # via -r deps/check.in, shed
4242
shed==2025.6.1 # via -r deps/check.in
4343
sniffio==1.3.1 # via anyio, trio
4444
sortedcontainers==2.4.0 # via hypothesis, sortedcontainers-stubs, trio
4545
sortedcontainers-stubs==2.4.3 # via -r deps/check.in
46-
starlette==0.48.0 # via -r deps/check.in
46+
starlette==0.50.0 # via -r deps/check.in
4747
taskgroup==0.2.2 # via hypercorn
4848
tokenize-rt==6.2.0 # via pyupgrade
49-
tomli==2.2.1 # via black, hypercorn, mypy, pytest
50-
trio==0.31.0 # via -r deps/check.in
49+
tomli==2.3.0 # via black, hypercorn, mypy, pytest
50+
trio==0.32.0 # via -r deps/check.in
5151
types-requests==2.32.4.20250913 # via -r deps/check.in
52-
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, libcst, mypy, sortedcontainers-stubs, starlette, taskgroup
52+
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, mypy, sortedcontainers-stubs, starlette, taskgroup
5353
urllib3==2.5.0 # via types-requests
5454
wsproto==1.2.0 # via hypercorn

deps/docs.txt

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
#
2-
# This file is autogenerated by pip-compile with Python 3.9
2+
# This file is autogenerated by pip-compile with Python 3.10
33
# by the following command:
44
#
5-
# pip-compile --annotation-style=line --output-file=deps/docs.txt deps/docs.in pyproject.toml
5+
# pip-compile --annotation-style=line --no-strip-extras --output-file=deps/docs.txt deps/docs.in pyproject.toml
66
#
77
accessible-pygments==0.0.5 # via furo
8-
alabaster==0.7.16 # via sphinx
8+
alabaster==1.0.0 # via sphinx
99
anyio==4.11.0 # via starlette
10-
attrs==25.3.0 # via hypothesis, outcome, trio
10+
attrs==25.4.0 # via outcome, trio
1111
babel==2.17.0 # via sphinx
12-
beautifulsoup4==4.14.0 # via furo
12+
beautifulsoup4==4.14.2 # via furo
1313
black==25.9.0 # via hypofuzz (pyproject.toml), hypothesis
14-
certifi==2025.8.3 # via requests
15-
charset-normalizer==3.4.3 # via requests
16-
click==8.1.8 # via black, hypothesis
17-
coverage==7.10.7 # via hypofuzz (pyproject.toml)
14+
certifi==2025.10.5 # via requests
15+
charset-normalizer==3.4.4 # via requests
16+
click==8.3.0 # via black, hypothesis
17+
coverage==7.11.0 # via hypofuzz (pyproject.toml)
1818
docutils==0.21.2 # via myst-parser, pybtex-docutils, sphinx, sphinxcontrib-bibtex
1919
exceptiongroup==1.3.0 # via anyio, hypercorn, hypothesis, pytest, taskgroup, trio
2020
furo==2025.9.25 # via -r deps/docs.in
@@ -23,40 +23,39 @@ h2==4.3.0 # via hypercorn
2323
hpack==4.1.0 # via h2
2424
hypercorn==0.17.3 # via hypofuzz (pyproject.toml)
2525
hyperframe==6.1.0 # via h2
26-
hypothesis[cli,watchdog]==6.140.2 # via hypofuzz (pyproject.toml)
27-
idna==3.10 # via anyio, requests, trio
26+
hypothesis[cli,watchdog]==6.145.1 # via hypofuzz (pyproject.toml)
27+
idna==3.11 # via anyio, requests, trio
2828
imagesize==1.4.1 # via sphinx
29-
importlib-metadata==8.7.0 # via pybtex, sphinx, sphinxcontrib-bibtex
30-
iniconfig==2.1.0 # via pytest
29+
iniconfig==2.3.0 # via pytest
3130
jinja2==3.1.6 # via myst-parser, sphinx
3231
latexcodec==3.0.1 # via pybtex
33-
libcst==1.8.5 # via hypofuzz (pyproject.toml)
32+
libcst==1.8.6 # via hypofuzz (pyproject.toml)
3433
markdown-it-py==3.0.0 # via mdit-py-plugins, myst-parser, rich
3534
markupsafe==3.0.3 # via jinja2
36-
mdit-py-plugins==0.4.2 # via myst-parser
35+
mdit-py-plugins==0.5.0 # via myst-parser
3736
mdurl==0.1.2 # via markdown-it-py
3837
mypy-extensions==1.1.0 # via black
39-
myst-parser==3.0.1 # via -r deps/docs.in
38+
myst-parser==4.0.1 # via -r deps/docs.in
4039
outcome==1.3.0.post0 # via trio
4140
packaging==25.0 # via black, pytest, sphinx
4241
pathspec==0.12.1 # via black
43-
platformdirs==4.4.0 # via black
42+
platformdirs==4.5.0 # via black
4443
pluggy==1.6.0 # via pytest
4544
priority==2.0.0 # via hypercorn
46-
psutil==7.1.0 # via hypofuzz (pyproject.toml)
45+
psutil==7.1.3 # via hypofuzz (pyproject.toml)
4746
pybtex==0.25.1 # via pybtex-docutils, sphinxcontrib-bibtex
4847
pybtex-docutils==1.0.3 # via sphinxcontrib-bibtex
4948
pygments==2.19.2 # via accessible-pygments, furo, pytest, rich, sphinx
5049
pytest==8.4.2 # via hypofuzz (pyproject.toml)
51-
pytokens==0.1.10 # via black
50+
pytokens==0.2.0 # via black
5251
pyyaml==6.0.3 # via libcst, myst-parser, pybtex
5352
requests==2.32.5 # via sphinx
54-
rich==14.1.0 # via hypothesis
53+
rich==14.2.0 # via hypothesis
5554
sniffio==1.3.1 # via anyio, trio
5655
snowballstemmer==3.0.1 # via sphinx
5756
sortedcontainers==2.4.0 # via hypothesis, trio
5857
soupsieve==2.8 # via beautifulsoup4
59-
sphinx==7.4.7 # via -r deps/docs.in, furo, myst-parser, sphinx-basic-ng, sphinxcontrib-bibtex
58+
sphinx==8.1.3 # via -r deps/docs.in, furo, myst-parser, sphinx-basic-ng, sphinxcontrib-bibtex
6059
sphinx-basic-ng==1.0.0b2 # via furo
6160
sphinxcontrib-applehelp==2.0.0 # via sphinx
6261
sphinxcontrib-bibtex==2.6.5 # via -r deps/docs.in
@@ -65,12 +64,11 @@ sphinxcontrib-htmlhelp==2.1.0 # via sphinx
6564
sphinxcontrib-jsmath==1.0.1 # via sphinx
6665
sphinxcontrib-qthelp==2.0.0 # via sphinx
6766
sphinxcontrib-serializinghtml==2.0.0 # via sphinx
68-
starlette==0.48.0 # via hypofuzz (pyproject.toml)
67+
starlette==0.50.0 # via hypofuzz (pyproject.toml)
6968
taskgroup==0.2.2 # via hypercorn
70-
tomli==2.2.1 # via black, hypercorn, pytest, sphinx
71-
trio==0.31.0 # via hypofuzz (pyproject.toml)
72-
typing-extensions==4.15.0 # via anyio, beautifulsoup4, black, exceptiongroup, hypercorn, libcst, starlette, taskgroup
69+
tomli==2.3.0 # via black, hypercorn, pytest, sphinx
70+
trio==0.32.0 # via hypofuzz (pyproject.toml)
71+
typing-extensions==4.15.0 # via anyio, beautifulsoup4, black, exceptiongroup, hypercorn, starlette, taskgroup
7372
urllib3==2.5.0 # via requests
7473
watchdog==6.0.0 # via hypothesis
7574
wsproto==1.2.0 # via hypercorn
76-
zipp==3.23.0 # via importlib-metadata

deps/test.txt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,52 @@
11
#
2-
# This file is autogenerated by pip-compile with Python 3.9
2+
# This file is autogenerated by pip-compile with Python 3.10
33
# by the following command:
44
#
5-
# pip-compile --annotation-style=line --output-file=deps/test.txt deps/test.in pyproject.toml
5+
# pip-compile --annotation-style=line --no-strip-extras --output-file=deps/test.txt deps/test.in pyproject.toml
66
#
77
anyio==4.11.0 # via starlette
8-
attrs==25.3.0 # via hypothesis, outcome, trio
8+
attrs==25.4.0 # via outcome, trio
99
black==25.9.0 # via hypofuzz (pyproject.toml), hypothesis
10-
certifi==2025.8.3 # via requests
11-
charset-normalizer==3.4.3 # via requests
12-
click==8.1.8 # via black, hypothesis
13-
coverage[toml]==7.10.7 # via hypofuzz (pyproject.toml), pytest-cov
10+
certifi==2025.10.5 # via requests
11+
charset-normalizer==3.4.4 # via requests
12+
click==8.3.0 # via black, hypothesis
13+
coverage[toml]==7.11.0 # via hypofuzz (pyproject.toml), pytest-cov
1414
exceptiongroup==1.3.0 # via anyio, hypercorn, hypothesis, pytest, taskgroup, trio
1515
execnet==2.1.1 # via pytest-xdist
1616
h11==0.16.0 # via hypercorn, wsproto
1717
h2==4.3.0 # via hypercorn
1818
hpack==4.1.0 # via h2
1919
hypercorn==0.17.3 # via hypofuzz (pyproject.toml)
2020
hyperframe==6.1.0 # via h2
21-
hypothesis[cli,watchdog]==6.140.2 # via hypofuzz (pyproject.toml)
22-
idna==3.10 # via anyio, requests, trio
23-
iniconfig==2.1.0 # via pytest
24-
libcst==1.8.5 # via hypofuzz (pyproject.toml)
25-
markdown-it-py==3.0.0 # via rich
21+
hypothesis[cli,watchdog]==6.145.1 # via hypofuzz (pyproject.toml)
22+
idna==3.11 # via anyio, requests, trio
23+
iniconfig==2.3.0 # via pytest
24+
libcst==1.8.6 # via hypofuzz (pyproject.toml)
25+
markdown-it-py==4.0.0 # via rich
2626
mdurl==0.1.2 # via markdown-it-py
2727
mypy-extensions==1.1.0 # via black
2828
outcome==1.3.0.post0 # via trio
2929
packaging==25.0 # via black, pytest
3030
pathspec==0.12.1 # via black
31-
platformdirs==4.4.0 # via black
31+
platformdirs==4.5.0 # via black
3232
pluggy==1.6.0 # via pytest, pytest-cov
3333
priority==2.0.0 # via hypercorn
34-
psutil==7.1.0 # via hypofuzz (pyproject.toml)
34+
psutil==7.1.3 # via hypofuzz (pyproject.toml)
3535
pygments==2.19.2 # via pytest, rich
3636
pytest==8.4.2 # via -r deps/test.in, hypofuzz (pyproject.toml), pytest-cov, pytest-xdist
3737
pytest-cov==7.0.0 # via -r deps/test.in
3838
pytest-xdist==3.8.0 # via -r deps/test.in
39-
pytokens==0.1.10 # via black
39+
pytokens==0.2.0 # via black
4040
pyyaml==6.0.3 # via libcst
4141
requests==2.32.5 # via -r deps/test.in
42-
rich==14.1.0 # via hypothesis
42+
rich==14.2.0 # via hypothesis
4343
sniffio==1.3.1 # via anyio, trio
4444
sortedcontainers==2.4.0 # via hypothesis, trio
45-
starlette==0.48.0 # via hypofuzz (pyproject.toml)
45+
starlette==0.50.0 # via hypofuzz (pyproject.toml)
4646
taskgroup==0.2.2 # via hypercorn
47-
tomli==2.2.1 # via black, coverage, hypercorn, pytest
48-
trio==0.31.0 # via hypofuzz (pyproject.toml)
49-
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, libcst, starlette, taskgroup
47+
tomli==2.3.0 # via black, coverage, hypercorn, pytest
48+
trio==0.32.0 # via hypofuzz (pyproject.toml)
49+
typing-extensions==4.15.0 # via anyio, black, exceptiongroup, hypercorn, starlette, taskgroup
5050
urllib3==2.5.0 # via requests
5151
watchdog==6.0.0 # via hypothesis
5252
wsproto==1.2.0 # via hypercorn

docs/index.html

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -153,27 +153,27 @@
153153
<div class="features__feature__text">
154154
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.
155155
</div>
156-
<form
157-
action="https://hypofuzz.us17.list-manage.com/subscribe/post?u=7c7cccd93480e9b723c4696ee&amp;id=e6284f13ed"
158-
method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form"
159-
target="_blank" style="max-width: 600px; margin-top: 1rem;">
160-
<div id="mc_embed_signup_scroll">
161-
<div class="mc-field-group" style="display: flex; gap: 0.5rem; align-items: center;">
162-
<input type="email" placeholder="me@example.com" value="" name="EMAIL"
163-
id="mce-EMAIL" required
164-
style="flex: 1; padding: 0.75rem; border: 1px solid #ccc; border-radius: 0.375rem;">
165-
<button type="submit" name="subscribe"
166-
id="mc-embedded-subscribe" class="button button--primary mailing-button">Subscribe</button>
167-
</div>
168-
<div id="mce-responses" class="clear">
169-
<div class="response" id="mce-error-response" style="display:none"></div>
170-
<div class="response" id="mce-success-response" style="display:none"></div>
171-
</div>
172-
<!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
173-
<div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text"
174-
name="b_7c7cccd93480e9b723c4696ee_e6284f13ed" tabindex="-1" value=""></div>
175-
</div>
176-
</form>
156+
<form
157+
action="https://hypofuzz.us17.list-manage.com/subscribe/post?u=7c7cccd93480e9b723c4696ee&amp;id=e6284f13ed"
158+
method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form"
159+
target="_blank" style="max-width: 600px; margin-top: 1rem;">
160+
<div id="mc_embed_signup_scroll">
161+
<div class="mc-field-group" style="display: flex; gap: 0.5rem; align-items: center;">
162+
<input type="email" placeholder="me@example.com" value="" name="EMAIL"
163+
id="mce-EMAIL" required
164+
style="flex: 1; padding: 0.75rem; border: 1px solid #ccc; border-radius: 0.375rem;">
165+
<button type="submit" name="subscribe"
166+
id="mc-embedded-subscribe" class="button button--primary mailing-button">Subscribe</button>
167+
</div>
168+
<div id="mce-responses" class="clear">
169+
<div class="response" id="mce-error-response" style="display:none"></div>
170+
<div class="response" id="mce-success-response" style="display:none"></div>
171+
</div>
172+
<!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
173+
<div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text"
174+
name="b_7c7cccd93480e9b723c4696ee_e6284f13ed" tabindex="-1" value=""></div>
175+
</div>
176+
</form>
177177
</div>
178178
</div>
179179
</div>

example_suite/src/example_suite/boyer_moore.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
from typing import Dict, List
2-
3-
4-
def boyer_moore_search(text: str, pattern: str) -> List[int]:
1+
def boyer_moore_search(text: str, pattern: str) -> list[int]:
52
"""
63
Full Boyer-Moore string search algorithm implementation.
74
@@ -48,7 +45,7 @@ def boyer_moore_search(text: str, pattern: str) -> List[int]:
4845
return matches
4946

5047

51-
def _build_bad_char_table(pattern: str) -> Dict[str, int]:
48+
def _build_bad_char_table(pattern: str) -> dict[str, int]:
5249
"""
5350
Build the bad character rule table.
5451
@@ -64,7 +61,7 @@ def _build_bad_char_table(pattern: str) -> Dict[str, int]:
6461
return table
6562

6663

67-
def _get_bad_char_shift(table: Dict[str, int], char: str, j: int, m: int) -> int:
64+
def _get_bad_char_shift(table: dict[str, int], char: str, j: int, m: int) -> int:
6865
"""
6966
Calculate shift using bad character rule.
7067
@@ -83,7 +80,7 @@ def _get_bad_char_shift(table: Dict[str, int], char: str, j: int, m: int) -> int
8380
return max(1, m - j)
8481

8582

86-
def _build_border_table(pattern: str) -> List[int]:
83+
def _build_border_table(pattern: str) -> list[int]:
8784
"""
8885
Build the border table for the good suffix rule.
8986
@@ -109,7 +106,7 @@ def _build_border_table(pattern: str) -> List[int]:
109106
return border
110107

111108

112-
def _build_good_suffix_table(pattern: str) -> List[int]:
109+
def _build_good_suffix_table(pattern: str) -> list[int]:
113110
"""
114111
Build the good suffix rule table.
115112

example_suite/src/example_suite/timsort.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from collections.abc import Iterable, Sequence
2-
from typing import List, TypeVar
2+
from typing import TypeVar
33

44
T = TypeVar("T")
55

66

7-
def timsort(values: Sequence[T]) -> List[T]:
7+
def timsort(values: Sequence[T]) -> list[T]:
88
"""
99
Sort and return a new list using a simplified Timsort-style algorithm.
1010
@@ -19,7 +19,7 @@ def timsort(values: Sequence[T]) -> List[T]:
1919
if n <= 1:
2020
return list(values)
2121

22-
runs: List[List[T]] = []
22+
runs: list[list[T]] = []
2323

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

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

5757

58-
def _merge_two_sorted(left: Iterable[T], right: Iterable[T]) -> List[T]:
58+
def _merge_two_sorted(left: Iterable[T], right: Iterable[T]) -> list[T]:
5959
li = list(left)
6060
ri = list(right)
6161
i = 0
6262
j = 0
63-
out: List[T] = []
63+
out: list[T] = []
6464

6565
while i < len(li) and j < len(ri):
6666
if li[i] <= ri[j]:

0 commit comments

Comments
 (0)