Skip to content

Commit f19fbf7

Browse files
authored
Add support for Python 3.14 (#843)
* add support for Python 3.14 * adjust tests
1 parent 8aa648f commit f19fbf7

30 files changed

+1029
-1030
lines changed

.github/workflows/docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
persist-credentials: false
2424
- uses: actions/setup-python@v6
2525
with:
26-
python-version: '3.13'
26+
python-version: '3.14'
2727

2828
# ADJUST THIS: install all dependencies (including pdoc)
2929
- run: pip install -e .

.github/workflows/main.yml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,22 @@ jobs:
3737
matrix:
3838
include:
3939
- os: windows-latest
40-
py: 3.13.0
40+
py: 3.14.0
4141
args: --cov-fail-under=100
4242
- os: macos-latest
43-
py: 3.13.0
43+
py: 3.14.0
4444
args: --cov-fail-under=100
4545
- os: ubuntu-latest
46-
py: 3.13.0
46+
py: 3.14.0
4747
args: --cov-fail-under=100
4848
- os: ubuntu-latest
49-
py: 3.12.4
49+
py: 3.13.7
5050
- os: ubuntu-latest
51-
py: 3.11.5
51+
py: 3.12.11
5252
- os: ubuntu-latest
53-
py: 3.10.13
53+
py: 3.11.13
54+
- os: ubuntu-latest
55+
py: 3.10.18
5456
runs-on: ${{ matrix.os }}
5557
steps:
5658
- uses: mhils/workflows/checkout@8a2bdd081227cbdd6f5d3bbb54a759607feac0b6

.python-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.13.2
1+
3.14.0

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
- pdoc has a new logo. 🐍
88
([#838](https://github.com/mitmproxy/pdoc/pull/838), @mhils)
9+
- Add support for Python 3.14.
10+
([#843](https://github.com/mitmproxy/pdoc/pull/843), @mhils)
911
- Drop support for Python 3.9, which as reached
1012
[end of life](https://devguide.python.org/versions/).
1113
([#842](https://github.com/mitmproxy/pdoc/pull/842), @mhils)

pdoc/doc_types.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -183,24 +183,22 @@ def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
183183
# https://github.com/python/cpython/blob/4f51fa9e2d3ea9316e674fb9a9f3e3112e83661c/Lib/typing.py#L684-L707
184184
if t.__forward_arg__ in recursive_guard: # pragma: no cover
185185
return t
186-
if not t.__forward_evaluated__ or localns is not globalns:
187-
if globalns is None and localns is None: # pragma: no cover
188-
globalns = localns = {}
189-
elif globalns is None: # pragma: no cover
190-
globalns = localns
191-
elif localns is None: # pragma: no cover
192-
localns = globalns
193-
__forward_module__ = getattr(t, "__forward_module__", None)
194-
if __forward_module__ is not None:
195-
globalns = getattr(
196-
sys.modules.get(__forward_module__, None), "__dict__", globalns
197-
)
198-
(type_,) = (eval(t.__forward_code__, globalns, localns),)
199-
t.__forward_value__ = _eval_type(
200-
type_, globalns, localns, recursive_guard | {t.__forward_arg__}
186+
187+
if globalns is None and localns is None: # pragma: no cover
188+
globalns = localns = {}
189+
elif globalns is None: # pragma: no cover
190+
globalns = localns
191+
elif localns is None: # pragma: no cover
192+
localns = globalns
193+
__forward_module__ = getattr(t, "__forward_module__", None)
194+
if __forward_module__ is not None:
195+
globalns = getattr(
196+
sys.modules.get(__forward_module__, None), "__dict__", globalns
201197
)
202-
t.__forward_evaluated__ = True
203-
return t.__forward_value__
198+
(type_,) = (eval(t.__forward_code__, globalns, localns),)
199+
return _eval_type(
200+
type_, globalns, localns, recursive_guard | {t.__forward_arg__}
201+
)
204202

205203
# https://github.com/python/cpython/blob/main/Lib/typing.py#L333-L343
206204
# fmt: off

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ classifiers = [
2727
"Programming Language :: Python :: 3.11",
2828
"Programming Language :: Python :: 3.12",
2929
"Programming Language :: Python :: 3.13",
30+
"Programming Language :: Python :: 3.14",
3031
"Typing :: Typed",
3132
]
3233

test/test_snapshot.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def outfile(self, format: str) -> Path:
136136
Snapshot("misc_py310", min_version=(3, 10)),
137137
Snapshot("misc_py312", min_version=(3, 12)),
138138
Snapshot("misc_py313", min_version=(3, 13)),
139+
Snapshot("misc_py313", min_version=(3, 14)),
139140
Snapshot("math_demo", render_options={"math": True}),
140141
Snapshot("math_misc", render_options={"math": True}),
141142
Snapshot("mermaid_demo", render_options={"mermaid": True}),

test/testdata/demo_eager.html

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,14 @@ <h1 class="modulename">
5353
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1"># no from __future__ import annotations!</span>
5454
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span>
5555
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Literal</span>
56-
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Union</span>
56+
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a>
5757
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a>
58-
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a>
59-
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span>
60-
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
58+
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">int</span><span class="p">:</span>
59+
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
60+
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a>
6161
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a>
62-
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
63-
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="k">def</span><span class="w"> </span><span class="nf">bar</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">],</span> <span class="o">/</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">]:</span>
64-
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
62+
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a><span class="k">def</span><span class="w"> </span><span class="nf">bar</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">],</span> <span class="o">/</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">]:</span>
63+
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
6564
</span></pre></div>
6665

6766

@@ -71,14 +70,14 @@ <h1 class="modulename">
7170
<div class="attr function">
7271

7372
<span class="def">def</span>
74-
<span class="name">foo</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span>:</span></span>
73+
<span class="name">foo</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="nb">str</span> <span class="o">|</span> <span class="nb">int</span>:</span></span>
7574

7675
<label class="view-source-button" for="foo-view-source"><span>View Source</span></label>
7776

7877
</div>
7978
<a class="headerlink" href="#foo"></a>
80-
<div class="pdoc-code codehilite"><pre><span></span><span id="foo-8"><a href="#foo-8"><span class="linenos">8</span></a><span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span>
81-
</span><span id="foo-9"><a href="#foo-9"><span class="linenos">9</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
79+
<div class="pdoc-code codehilite"><pre><span></span><span id="foo-7"><a href="#foo-7"><span class="linenos">7</span></a><span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">int</span><span class="p">:</span>
80+
</span><span id="foo-8"><a href="#foo-8"><span class="linenos">8</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
8281
</span></pre></div>
8382

8483

@@ -96,8 +95,8 @@ <h1 class="modulename">
9695

9796
</div>
9897
<a class="headerlink" href="#bar"></a>
99-
<div class="pdoc-code codehilite"><pre><span></span><span id="bar-12"><a href="#bar-12"><span class="linenos">12</span></a><span class="k">def</span><span class="w"> </span><span class="nf">bar</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">],</span> <span class="o">/</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">]:</span>
100-
</span><span id="bar-13"><a href="#bar-13"><span class="linenos">13</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
98+
<div class="pdoc-code codehilite"><pre><span></span><span id="bar-11"><a href="#bar-11"><span class="linenos">11</span></a><span class="k">def</span><span class="w"> </span><span class="nf">bar</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">],</span> <span class="o">/</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="s2">&quot;int&quot;</span><span class="p">]:</span>
99+
</span><span id="bar-12"><a href="#bar-12"><span class="linenos">12</span></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
101100
</span></pre></div>
102101

103102

test/testdata/demo_eager.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
# no from __future__ import annotations!
22
from typing import List
33
from typing import Literal
4-
from typing import Union
54

65

7-
def foo(x: Literal["r", "w"]) -> Union[str, int]:
6+
def foo(x: Literal["r", "w"]) -> str | int:
87
raise NotImplementedError
98

109

test/testdata/demo_eager.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<module demo_eager
2-
<function def foo(x: Literal['r', 'w']) -> Union[str, int]: ...>
2+
<function def foo(x: Literal['r', 'w']) -> str | int: ...>
33
<function def bar(x: list[int], /) -> List[int]: ...>
44
>

0 commit comments

Comments
 (0)