diff --git a/.python-version b/.python-version index c10780c6..3e388a4a 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.13.1 +3.13.2 diff --git a/pdoc/doc.py b/pdoc/doc.py index a09cddb2..cfd375de 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -1095,7 +1095,7 @@ def __repr__(self): default = f" = {self.default_value_str}" else: default = "" - return f'' + return f"" @cached_property def is_classvar(self) -> bool: diff --git a/pdoc/doc_ast.py b/pdoc/doc_ast.py index 880f4b00..0d68adc5 100644 --- a/pdoc/doc_ast.py +++ b/pdoc/doc_ast.py @@ -273,7 +273,7 @@ def _parse( try: return ast.parse(_dedent(source)) except Exception as e: - warnings.warn(f"Error parsing source code: {e}\n" f"===\n" f"{source}\n" f"===") + warnings.warn(f"Error parsing source code: {e}\n===\n{source}\n===") return ast.parse("") diff --git a/test/test_docstrings.py b/test/test_docstrings.py index 68ec70be..8a172538 100644 --- a/test/test_docstrings.py +++ b/test/test_docstrings.py @@ -49,7 +49,7 @@ def test_rst_extract_options(): "alpha": "beta", "charlie": "delta:foxtrot", } - assert content == ("\nrest of content\n" ":option ignored: as follows content\n") + assert content == ("\nrest of content\n:option ignored: as follows content\n") def test_rst_include_trim_lines(): diff --git a/test/testdata/ast_parsing.html b/test/testdata/ast_parsing.html index face783a..7f39b593 100644 --- a/test/testdata/ast_parsing.html +++ b/test/testdata/ast_parsing.html @@ -56,8 +56,8 @@

-
1class Foo:
-2    def __init__(self):
+                        
1class Foo:
+2    def __init__(self):
 3        self.no_docstring = 42
 4        self.with_docstring = 43
 5        """This is an attribute docstring."""
@@ -76,8 +76,8 @@ 

-
2class Foo:
-3    def __init__(self):
+            
2class Foo:
+3    def __init__(self):
 4        self.no_docstring = 42
 5        self.with_docstring = 43
 6        """This is an attribute docstring."""
diff --git a/test/testdata/collections_abc.html b/test/testdata/collections_abc.html
index 7959f996..78084956 100644
--- a/test/testdata/collections_abc.html
+++ b/test/testdata/collections_abc.html
@@ -60,21 +60,21 @@ 

 1"""Test that we remove 'collections.abc' from type signatures."""
  2
- 3from collections.abc import Awaitable
- 4from collections.abc import Container
+ 3from collections.abc import Awaitable
+ 4from collections.abc import Container
  5
  6
- 7def func(bar: Awaitable[None]) -> Awaitable[None]:
+ 7def func(bar: Awaitable[None]) -> Awaitable[None]:
  8    return bar
  9
 10
-11class Class(Container[str]):
+11class Class(Container[str]):
 12    """
 13    For subclasses, we currently display the full classname.
 14    Mostly because it's easier, but it also makes a bit more sense here.
 15    """
 16
-17    def __contains__(self, item):
+17    def __contains__(self, item):
 18        return item == "Bar"
 19
 20
@@ -94,7 +94,7 @@ 

-
8def func(bar: Awaitable[None]) -> Awaitable[None]:
+            
8def func(bar: Awaitable[None]) -> Awaitable[None]:
 9    return bar
 
@@ -113,13 +113,13 @@

-
12class Class(Container[str]):
+            
12class Class(Container[str]):
 13    """
 14    For subclasses, we currently display the full classname.
 15    Mostly because it's easier, but it also makes a bit more sense here.
 16    """
 17
-18    def __contains__(self, item):
+18    def __contains__(self, item):
 19        return item == "Bar"
 
diff --git a/test/testdata/demo.html b/test/testdata/demo.html index 0dab4fdf..cc5e0941 100644 --- a/test/testdata/demo.html +++ b/test/testdata/demo.html @@ -68,19 +68,19 @@

2A small `pdoc` example. 3""" 4 - 5class Dog: + 5class Dog: 6 """🐕""" 7 name: str 8 """The name of our dog.""" 9 friends: list["Dog"] 10 """The friends of our dog.""" 11 -12 def __init__(self, name: str): +12 def __init__(self, name: str): 13 """Make a Dog without any friends (yet).""" 14 self.name = name 15 self.friends = [] 16 -17 def bark(self, loud: bool = True): +17 def bark(self, loud: bool = True): 18 """*woof*"""

@@ -97,19 +97,19 @@

-
 6class Dog:
+            
 6class Dog:
  7    """🐕"""
  8    name: str
  9    """The name of our dog."""
 10    friends: list["Dog"]
 11    """The friends of our dog."""
 12
-13    def __init__(self, name: str):
+13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
 17
-18    def bark(self, loud: bool = True):
+18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
@@ -128,7 +128,7 @@

-
13    def __init__(self, name: str):
+            
13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
@@ -177,7 +177,7 @@ 

-
18    def bark(self, loud: bool = True):
+            
18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
diff --git a/test/testdata/demo_eager.html b/test/testdata/demo_eager.html index 97565711..b6948d0c 100644 --- a/test/testdata/demo_eager.html +++ b/test/testdata/demo_eager.html @@ -51,16 +51,16 @@

 1# no from __future__ import annotations!
- 2from typing import List
- 3from typing import Literal
- 4from typing import Union
+ 2from typing import List
+ 3from typing import Literal
+ 4from typing import Union
  5
  6
- 7def foo(x: Literal["r", "w"]) -> Union[str, int]:
+ 7def foo(x: Literal["r", "w"]) -> Union[str, int]:
  8    raise NotImplementedError
  9
 10
-11def bar(x: list["int"], /) -> List["int"]:
+11def bar(x: list["int"], /) -> List["int"]:
 12    raise NotImplementedError
 
@@ -77,7 +77,7 @@

-
8def foo(x: Literal["r", "w"]) -> Union[str, int]:
+            
8def foo(x: Literal["r", "w"]) -> Union[str, int]:
 9    raise NotImplementedError
 
@@ -96,7 +96,7 @@

-
12def bar(x: list["int"], /) -> List["int"]:
+            
12def bar(x: list["int"], /) -> List["int"]:
 13    raise NotImplementedError
 
diff --git a/test/testdata/demo_long.html b/test/testdata/demo_long.html index 4d4ecdcb..da10bd52 100644 --- a/test/testdata/demo_long.html +++ b/test/testdata/demo_long.html @@ -252,21 +252,21 @@

A Second Section

21which will also show up in the navigation. 22""" 23 - 24from __future__ import annotations + 24from __future__ import annotations 25 - 26import abc - 27from dataclasses import dataclass - 28from dataclasses import field - 29import enum - 30from functools import cache - 31from functools import cached_property - 32import os - 33from typing import ClassVar - 34from typing import List - 35from typing import Optional - 36from typing import Sequence - 37from typing import TypeVar - 38from typing import Union + 26import abc + 27from dataclasses import dataclass + 28from dataclasses import field + 29import enum + 30from functools import cache + 31from functools import cached_property + 32import os + 33from typing import ClassVar + 34from typing import List + 35from typing import Optional + 36from typing import Sequence + 37from typing import TypeVar + 38from typing import Union 39 40FOO_CONSTANT: int = 42 41""" @@ -293,7 +293,7 @@

A Second Section

62# this variable has a type annotation but not docstring. 63 64 - 65def a_simple_function(a: str) -> str: + 65def a_simple_function(a: str) -> str: 66 """ 67 This is a basic module-level function. 68 @@ -305,7 +305,7 @@

A Second Section

74T = TypeVar("T") 75 76 - 77def a_complex_function( + 77def a_complex_function( 78 a: str, b: Union["Foo", str], *, c: Optional[T] = None 79) -> Optional[T]: 80 """ @@ -316,7 +316,7 @@

A Second Section

85 return None 86 87 - 88class Foo: + 88class Foo: 89 """ 90 `Foo` is a basic class without any parent classes (except for the implicit `object` class). 91 @@ -331,7 +331,7 @@

A Second Section

100 a_class_attribute: ClassVar[str] = "lots of foo!" 101 """An attribute with a ClassVar annotation.""" 102 -103 def __init__(self) -> None: +103 def __init__(self) -> None: 104 """ 105 The constructor is currently always listed first as this feels most natural.""" 106 self.a_constructor_only_attribute: int = 42 @@ -340,47 +340,47 @@

A Second Section

109 self.undocumented_constructor_attribute = 42 110 a_complex_function("a", "Foo") 111 -112 def a_regular_function(self) -> "Foo": +112 def a_regular_function(self) -> "Foo": 113 """This is a regular method, returning the object itself.""" 114 return self 115 116 @property -117 def a_property(self) -> str: +117 def a_property(self) -> str: 118 """This is a `@property` attribute. pdoc will display it as a variable.""" 119 return "true foo" 120 121 @cached_property -122 def a_cached_property(self) -> str: +122 def a_cached_property(self) -> str: 123 """This is a `@functools.cached_property` attribute. pdoc will display it as a variable as well.""" 124 return "true foo" 125 126 @cache -127 def a_cached_function(self) -> str: +127 def a_cached_function(self) -> str: 128 """This is method with `@cache` decoration.""" 129 return "true foo" 130 131 @classmethod -132 def a_class_method(cls) -> int: +132 def a_class_method(cls) -> int: 133 """This is what a `@classmethod` looks like.""" 134 return 24 135 136 @classmethod # type: ignore 137 @property -138 def a_class_property(cls) -> int: +138 def a_class_property(cls) -> int: 139 """This is what a `@classmethod @property` looks like.""" 140 return 24 141 142 @staticmethod -143 def a_static_method(): +143 def a_static_method(): 144 """This is what a `@staticmethod` looks like.""" 145 print("Hello World") 146 147 -148class Bar(Foo): +148class Bar(Foo): 149 bar: str 150 """A new attribute defined on this subclass.""" 151 -152 class Baz: +152 class Baz: 153 """ 154 This class is an attribute of `Bar`. 155 To not create overwhelmingly complex trees, pdoc flattens the class hierarchy in the documentation @@ -392,12 +392,12 @@

A Second Section

161 This class has no __init__ method defined, so pdoc will not show a constructor. 162 """ 163 -164 def wat(self): +164 def wat(self): 165 """A regular method. Above, you see what happens if a class has no constructor defined and 166 no constructor docstring.""" 167 168 -169async def i_am_async(self) -> int: +169async def i_am_async(self) -> int: 170 """ 171 This is an example of an async function. 172 @@ -409,7 +409,7 @@

A Second Section

178 179 180@cache -181def fib(n): +181def fib(n): 182 """ 183 This is an example of decorated function. Decorators are included in the documentation as well. 184 This is often useful when documenting web APIs, for example. @@ -419,7 +419,7 @@

A Second Section

188 return fib(n - 1) + fib(n - 2) 189 190 -191def security(test=os.environ): +191def security(test=os.environ): 192 """ 193 Default values are generally rendered using repr(), 194 but some special cases -- like os.environ -- are overridden to avoid leaking sensitive data. @@ -427,7 +427,7 @@

A Second Section

196 return False 197 198 -199class DoubleInherit(Foo, Bar.Baz, abc.ABC): +199class DoubleInherit(Foo, Bar.Baz, abc.ABC): 200 """This is an example of a class that inherits from multiple parent classes.""" 201 202 @@ -438,7 +438,7 @@

A Second Section

207 208 209@dataclass -210class DataDemo: +210class DataDemo: 211 """ 212 This is an example for a dataclass. 213 @@ -458,12 +458,12 @@

A Second Section

227 228 229@dataclass -230class DataDemoExtended(DataDemo): +230class DataDemoExtended(DataDemo): 231 c: str = "42" 232 """A new attribute.""" 233 234 -235class EnumDemo(enum.Enum): +235class EnumDemo(enum.Enum): 236 """ 237 This is an example of an Enum. 238 @@ -477,7 +477,7 @@

A Second Section

246 BLUE = enum.auto() 247 248 -249def embed_image(): +249def embed_image(): 250 """ 251 This docstring includes an embedded image: 252 @@ -489,7 +489,7 @@

A Second Section

258 """ 259 260 -261def admonitions(): +261def admonitions(): 262 """ 263 pdoc also supports basic reStructuredText admonitions or GitHub's Markdown alerts: 264 @@ -576,7 +576,7 @@

A Second Section

-
66def a_simple_function(a: str) -> str:
+            
66def a_simple_function(a: str) -> str:
 67    """
 68    This is a basic module-level function.
 69
@@ -604,7 +604,7 @@ 

A Second Section

-
78def a_complex_function(
+            
78def a_complex_function(
 79    a: str, b: Union["Foo", str], *, c: Optional[T] = None
 80) -> Optional[T]:
 81    """
@@ -634,7 +634,7 @@ 

A Second Section

-
 89class Foo:
+            
 89class Foo:
  90    """
  91    `Foo` is a basic class without any parent classes (except for the implicit `object` class).
  92
@@ -649,7 +649,7 @@ 

A Second Section

101 a_class_attribute: ClassVar[str] = "lots of foo!" 102 """An attribute with a ClassVar annotation.""" 103 -104 def __init__(self) -> None: +104 def __init__(self) -> None: 105 """ 106 The constructor is currently always listed first as this feels most natural.""" 107 self.a_constructor_only_attribute: int = 42 @@ -658,38 +658,38 @@

A Second Section

110 self.undocumented_constructor_attribute = 42 111 a_complex_function("a", "Foo") 112 -113 def a_regular_function(self) -> "Foo": +113 def a_regular_function(self) -> "Foo": 114 """This is a regular method, returning the object itself.""" 115 return self 116 117 @property -118 def a_property(self) -> str: +118 def a_property(self) -> str: 119 """This is a `@property` attribute. pdoc will display it as a variable.""" 120 return "true foo" 121 122 @cached_property -123 def a_cached_property(self) -> str: +123 def a_cached_property(self) -> str: 124 """This is a `@functools.cached_property` attribute. pdoc will display it as a variable as well.""" 125 return "true foo" 126 127 @cache -128 def a_cached_function(self) -> str: +128 def a_cached_function(self) -> str: 129 """This is method with `@cache` decoration.""" 130 return "true foo" 131 132 @classmethod -133 def a_class_method(cls) -> int: +133 def a_class_method(cls) -> int: 134 """This is what a `@classmethod` looks like.""" 135 return 24 136 137 @classmethod # type: ignore 138 @property -139 def a_class_property(cls) -> int: +139 def a_class_property(cls) -> int: 140 """This is what a `@classmethod @property` looks like.""" 141 return 24 142 143 @staticmethod -144 def a_static_method(): +144 def a_static_method(): 145 """This is what a `@staticmethod` looks like.""" 146 print("Hello World")
@@ -713,7 +713,7 @@

A Second Section

-
104    def __init__(self) -> None:
+            
104    def __init__(self) -> None:
 105        """
 106        The constructor is currently always listed first as this feels most natural."""
 107        self.a_constructor_only_attribute: int = 42
@@ -791,7 +791,7 @@ 

A Second Section

-
113    def a_regular_function(self) -> "Foo":
+            
113    def a_regular_function(self) -> "Foo":
 114        """This is a regular method, returning the object itself."""
 115        return self
 
@@ -812,7 +812,7 @@

A Second Section

117    @property
-118    def a_property(self) -> str:
+118    def a_property(self) -> str:
 119        """This is a `@property` attribute. pdoc will display it as a variable."""
 120        return "true foo"
 
@@ -833,7 +833,7 @@

A Second Section

122    @cached_property
-123    def a_cached_property(self) -> str:
+123    def a_cached_property(self) -> str:
 124        """This is a `@functools.cached_property` attribute. pdoc will display it as a variable as well."""
 125        return "true foo"
 
@@ -857,7 +857,7 @@

A Second Section

127    @cache
-128    def a_cached_function(self) -> str:
+128    def a_cached_function(self) -> str:
 129        """This is method with `@cache` decoration."""
 130        return "true foo"
 
@@ -881,7 +881,7 @@

A Second Section

132    @classmethod
-133    def a_class_method(cls) -> int:
+133    def a_class_method(cls) -> int:
 134        """This is what a `@classmethod` looks like."""
 135        return 24
 
@@ -903,7 +903,7 @@

A Second Section

137    @classmethod  # type: ignore
 138    @property
-139    def a_class_property(cls) -> int:
+139    def a_class_property(cls) -> int:
 140        """This is what a `@classmethod @property` looks like."""
 141        return 24
 
@@ -927,7 +927,7 @@

A Second Section

143    @staticmethod
-144    def a_static_method():
+144    def a_static_method():
 145        """This is what a `@staticmethod` looks like."""
 146        print("Hello World")
 
@@ -950,11 +950,11 @@

A Second Section

-
149class Bar(Foo):
+            
149class Bar(Foo):
 150    bar: str
 151    """A new attribute defined on this subclass."""
 152
-153    class Baz:
+153    class Baz:
 154        """
 155        This class is an attribute of `Bar`.
 156        To not create overwhelmingly complex trees, pdoc flattens the class hierarchy in the documentation
@@ -966,7 +966,7 @@ 

A Second Section

162 This class has no __init__ method defined, so pdoc will not show a constructor. 163 """ 164 -165 def wat(self): +165 def wat(self): 166 """A regular method. Above, you see what happens if a class has no constructor defined and 167 no constructor docstring."""
@@ -1025,7 +1025,7 @@
Inherited Members
-
153    class Baz:
+            
153    class Baz:
 154        """
 155        This class is an attribute of `Bar`.
 156        To not create overwhelmingly complex trees, pdoc flattens the class hierarchy in the documentation
@@ -1037,7 +1037,7 @@ 
Inherited Members
162 This class has no __init__ method defined, so pdoc will not show a constructor. 163 """ 164 -165 def wat(self): +165 def wat(self): 166 """A regular method. Above, you see what happens if a class has no constructor defined and 167 no constructor docstring."""
@@ -1065,7 +1065,7 @@
Inherited Members
-
165        def wat(self):
+            
165        def wat(self):
 166            """A regular method. Above, you see what happens if a class has no constructor defined and
 167            no constructor docstring."""
 
@@ -1089,7 +1089,7 @@
Inherited Members
-
170async def i_am_async(self) -> int:
+            
170async def i_am_async(self) -> int:
 171    """
 172    This is an example of an async function.
 173
@@ -1125,7 +1125,7 @@ 
Inherited Members
181@cache
-182def fib(n):
+182def fib(n):
 183    """
 184    This is an example of decorated function. Decorators are included in the documentation as well.
 185    This is often useful when documenting web APIs, for example.
@@ -1153,7 +1153,7 @@ 
Inherited Members
-
192def security(test=os.environ):
+            
192def security(test=os.environ):
 193    """
 194    Default values are generally rendered using repr(),
 195    but some special cases -- like os.environ -- are overridden to avoid leaking sensitive data.
@@ -1179,7 +1179,7 @@ 
Inherited Members
-
200class DoubleInherit(Foo, Bar.Baz, abc.ABC):
+            
200class DoubleInherit(Foo, Bar.Baz, abc.ABC):
 201    """This is an example of a class that inherits from multiple parent classes."""
 
@@ -1252,7 +1252,7 @@
Inherited Members
210@dataclass
-211class DataDemo:
+211class DataDemo:
 212    """
 213    This is an example for a dataclass.
 214
@@ -1366,7 +1366,7 @@ 
Inherited Members
230@dataclass
-231class DataDemoExtended(DataDemo):
+231class DataDemoExtended(DataDemo):
 232    c: str = "42"
 233    """A new attribute."""
 
@@ -1425,7 +1425,7 @@
Inherited Members
-
236class EnumDemo(enum.Enum):
+            
236class EnumDemo(enum.Enum):
 237    """
 238    This is an example of an Enum.
 239
@@ -1498,7 +1498,7 @@ 
Inherited Members
-
250def embed_image():
+            
250def embed_image():
 251    """
 252    This docstring includes an embedded image:
 253
@@ -1532,7 +1532,7 @@ 
Inherited Members
-
262def admonitions():
+            
262def admonitions():
 263    """
 264    pdoc also supports basic reStructuredText admonitions or GitHub's Markdown alerts:
 265
diff --git a/test/testdata/demopackage.html b/test/testdata/demopackage.html
index ecbe55fa..7afd1f5c 100644
--- a/test/testdata/demopackage.html
+++ b/test/testdata/demopackage.html
@@ -109,15 +109,15 @@ 

 1"""A test package with a sub-package at `.subpackage`."""
  2
- 3import demopackage2
+ 3import demopackage2
  4
- 5from . import _child_e
- 6from . import child_b
- 7from ._child_d import Test
- 8from .child_b import B
- 9from .child_c import C
-10from .child_f import F
-11from .subpackage import G
+ 5from . import _child_e
+ 6from . import child_b
+ 7from ._child_d import Test
+ 8from .child_b import B
+ 9from .child_c import C
+10from .child_f import F
+11from .subpackage import G
 12
 13if demopackage2:
 14    pass
@@ -151,10 +151,10 @@ 

-
5class Test:
+            
5class Test:
 6    """The Test class from _child_d."""
 7
-8    def foo(self, a: int):
+8    def foo(self, a: int):
 9        """Do foo."""
 
@@ -174,7 +174,7 @@

-
8    def foo(self, a: int):
+            
8    def foo(self, a: int):
 9        """Do foo."""
 
@@ -196,13 +196,13 @@

-
 9class B:
+            
 9class B:
 10    """This class is defined in .child_b. It has a B.b method."""
 11
 12    b_type: typing.Type[B]
 13    """we have a self-referential attribute here"""
 14
-15    def b(self):
+15    def b(self):
 16        return 1
 
@@ -235,7 +235,7 @@

-
15    def b(self):
+            
15    def b(self):
 16        return 1
 
@@ -255,10 +255,10 @@

-
 7class C(child_b.B):
+            
 7class C(child_b.B):
  8    """This class is defined in .child_c and inherits from .child_b.B."""
  9
-10    def c(self):
+10    def c(self):
 11        return 2
 
@@ -278,7 +278,7 @@

-
10    def c(self):
+            
10    def c(self):
 11        return 2
 
@@ -308,7 +308,7 @@
Inherited Members
-
 7class F:
+            
 7class F:
  8    """
  9    This class defined in .child_f links to subpackage's G which is re-exposed as `G` directly in demopackage.
 10
@@ -319,7 +319,7 @@ 
Inherited Members
15 - demopackage.subpackage.child_g.G 16 """ 17 -18 def g(self) -> subpackage.G: +18 def g(self) -> subpackage.G: 19 return subpackage.G() 20 21 G = subpackage.G @@ -349,7 +349,7 @@
Inherited Members
-
18    def g(self) -> subpackage.G:
+            
18    def g(self) -> subpackage.G:
 19        return subpackage.G()
 
@@ -369,10 +369,10 @@
Inherited Members
-
5class G:
+            
5class G:
 6    """This class is defined in subpackage's child_g, but reexposed in the `demopackage.subpackage` namespace."""
 7
-8    def g(self):
+8    def g(self):
 9        pass
 
@@ -393,10 +393,10 @@
Inherited Members
-
5class G:
+            
5class G:
 6    """This class is defined in subpackage's child_g, but reexposed in the `demopackage.subpackage` namespace."""
 7
-8    def g(self):
+8    def g(self):
 9        pass
 
@@ -416,7 +416,7 @@
Inherited Members
-
8    def g(self):
+            
8    def g(self):
 9        pass
 
diff --git a/test/testdata/demopackage_dir.html b/test/testdata/demopackage_dir.html index b5328eac..db019d45 100644 --- a/test/testdata/demopackage_dir.html +++ b/test/testdata/demopackage_dir.html @@ -662,15 +662,15 @@

 1"""A test package with a sub-package at `.subpackage`."""
  2
- 3import demopackage2
+ 3import demopackage2
  4
- 5from . import _child_e
- 6from . import child_b
- 7from ._child_d import Test
- 8from .child_b import B
- 9from .child_c import C
-10from .child_f import F
-11from .subpackage import G
+ 5from . import _child_e
+ 6from . import child_b
+ 7from ._child_d import Test
+ 8from .child_b import B
+ 9from .child_c import C
+10from .child_f import F
+11from .subpackage import G
 12
 13if demopackage2:
 14    pass
@@ -704,10 +704,10 @@ 

-
5class Test:
+            
5class Test:
 6    """The Test class from _child_d."""
 7
-8    def foo(self, a: int):
+8    def foo(self, a: int):
 9        """Do foo."""
 
@@ -727,7 +727,7 @@

-
8    def foo(self, a: int):
+            
8    def foo(self, a: int):
 9        """Do foo."""
 
@@ -749,13 +749,13 @@

-
 9class B:
+            
 9class B:
 10    """This class is defined in .child_b. It has a B.b method."""
 11
 12    b_type: typing.Type[B]
 13    """we have a self-referential attribute here"""
 14
-15    def b(self):
+15    def b(self):
 16        return 1
 
@@ -788,7 +788,7 @@

-
15    def b(self):
+            
15    def b(self):
 16        return 1
 
@@ -808,10 +808,10 @@

-
 7class C(child_b.B):
+            
 7class C(child_b.B):
  8    """This class is defined in .child_c and inherits from .child_b.B."""
  9
-10    def c(self):
+10    def c(self):
 11        return 2
 
@@ -831,7 +831,7 @@

-
10    def c(self):
+            
10    def c(self):
 11        return 2
 
@@ -861,7 +861,7 @@
Inherited Members
-
 7class F:
+            
 7class F:
  8    """
  9    This class defined in .child_f links to subpackage's G which is re-exposed as `G` directly in demopackage.
 10
@@ -872,7 +872,7 @@ 
Inherited Members
15 - demopackage.subpackage.child_g.G 16 """ 17 -18 def g(self) -> subpackage.G: +18 def g(self) -> subpackage.G: 19 return subpackage.G() 20 21 G = subpackage.G @@ -902,7 +902,7 @@
Inherited Members
-
18    def g(self) -> subpackage.G:
+            
18    def g(self) -> subpackage.G:
 19        return subpackage.G()
 
@@ -922,10 +922,10 @@
Inherited Members
-
5class G:
+            
5class G:
 6    """This class is defined in subpackage's child_g, but reexposed in the `demopackage.subpackage` namespace."""
 7
-8    def g(self):
+8    def g(self):
 9        pass
 
@@ -946,10 +946,10 @@
Inherited Members
-
5class G:
+            
5class G:
 6    """This class is defined in subpackage's child_g, but reexposed in the `demopackage.subpackage` namespace."""
 7
-8    def g(self):
+8    def g(self):
 9        pass
 
@@ -969,7 +969,7 @@
Inherited Members
-
8    def g(self):
+            
8    def g(self):
 9        pass
 
@@ -1265,8 +1265,8 @@

10- demopackage.subpackage.child_g.G 11""" 12 -13from ..child_b import B -14from .child_g import G +13from ..child_b import B +14from .child_g import G 15 16__all__ = ["B", "G"]

@@ -1284,13 +1284,13 @@

-
 9class B:
+            
 9class B:
 10    """This class is defined in .child_b. It has a B.b method."""
 11
 12    b_type: typing.Type[B]
 13    """we have a self-referential attribute here"""
 14
-15    def b(self):
+15    def b(self):
 16        return 1
 
@@ -1323,7 +1323,7 @@

-
15    def b(self):
+            
15    def b(self):
 16        return 1
 
@@ -1343,10 +1343,10 @@

-
5class G:
+            
5class G:
 6    """This class is defined in subpackage's child_g, but reexposed in the `demopackage.subpackage` namespace."""
 7
-8    def g(self):
+8    def g(self):
 9        pass
 
@@ -1366,7 +1366,7 @@

-
8    def g(self):
+            
8    def g(self):
 9        pass
 
@@ -1633,10 +1633,10 @@

 1"""child_f docstr"""
  2
- 3from . import subpackage
+ 3from . import subpackage
  4
  5
- 6class F:
+ 6class F:
  7    """
  8    This class defined in .child_f links to subpackage's G which is re-exposed as `G` directly in demopackage.
  9
@@ -1647,7 +1647,7 @@ 

14 - demopackage.subpackage.child_g.G 15 """ 16 -17 def g(self) -> subpackage.G: +17 def g(self) -> subpackage.G: 18 return subpackage.G() 19 20 G = subpackage.G @@ -1666,7 +1666,7 @@

-
 7class F:
+            
 7class F:
  8    """
  9    This class defined in .child_f links to subpackage's G which is re-exposed as `G` directly in demopackage.
 10
@@ -1677,7 +1677,7 @@ 

15 - demopackage.subpackage.child_g.G 16 """ 17 -18 def g(self) -> subpackage.G: +18 def g(self) -> subpackage.G: 19 return subpackage.G() 20 21 G = subpackage.G @@ -1707,7 +1707,7 @@

-
18    def g(self) -> subpackage.G:
+            
18    def g(self) -> subpackage.G:
 19        return subpackage.G()
 
@@ -1727,10 +1727,10 @@

-
5class G:
+            
5class G:
 6    """This class is defined in subpackage's child_g, but reexposed in the `demopackage.subpackage` namespace."""
 7
-8    def g(self):
+8    def g(self):
 9        pass
 
@@ -1995,13 +1995,13 @@

 1"""child_c docstr"""
  2
- 3from . import child_b
+ 3from . import child_b
  4
  5
- 6class C(child_b.B):
+ 6class C(child_b.B):
  7    """This class is defined in .child_c and inherits from .child_b.B."""
  8
- 9    def c(self):
+ 9    def c(self):
 10        return 2
 
@@ -2018,10 +2018,10 @@

-
 7class C(child_b.B):
+            
 7class C(child_b.B):
  8    """This class is defined in .child_c and inherits from .child_b.B."""
  9
-10    def c(self):
+10    def c(self):
 11        return 2
 
@@ -2041,7 +2041,7 @@

-
10    def c(self):
+            
10    def c(self):
 11        return 2
 
@@ -2318,18 +2318,18 @@

 1"""child_b docstr"""
  2
- 3from __future__ import annotations
+ 3from __future__ import annotations
  4
- 5import typing
+ 5import typing
  6
  7
- 8class B:
+ 8class B:
  9    """This class is defined in .child_b. It has a B.b method."""
 10
 11    b_type: typing.Type[B]
 12    """we have a self-referential attribute here"""
 13
-14    def b(self):
+14    def b(self):
 15        return 1
 
@@ -2346,13 +2346,13 @@

-
 9class B:
+            
 9class B:
 10    """This class is defined in .child_b. It has a B.b method."""
 11
 12    b_type: typing.Type[B]
 13    """we have a self-referential attribute here"""
 14
-15    def b(self):
+15    def b(self):
 16        return 1
 
@@ -2385,7 +2385,7 @@

-
15    def b(self):
+            
15    def b(self):
 16        return 1
 
diff --git a/test/testdata/enums.html b/test/testdata/enums.html index 1dcd4fb1..850f3442 100644 --- a/test/testdata/enums.html +++ b/test/testdata/enums.html @@ -95,10 +95,10 @@

-
 1import enum
+                        
 1import enum
  2
  3
- 4class EnumDemo(enum.Enum):
+ 4class EnumDemo(enum.Enum):
  5    """
  6    This is an example of an Enum.
  7
@@ -112,17 +112,17 @@ 

15 BLUE = enum.auto() 16 17 -18class EnumWithoutDocstrings(enum.Enum): +18class EnumWithoutDocstrings(enum.Enum): 19 FOO = enum.auto() 20 BAR = enum.auto() 21 22 -23class IntEnum(enum.IntEnum): +23class IntEnum(enum.IntEnum): 24 FOO = enum.auto() 25 BAR = enum.auto() 26 27 -28class StrEnum(enum.StrEnum): +28class StrEnum(enum.StrEnum): 29 FOO = enum.auto() 30 BAR = enum.auto()

@@ -140,7 +140,7 @@

-
 5class EnumDemo(enum.Enum):
+            
 5class EnumDemo(enum.Enum):
  6    """
  7    This is an example of an Enum.
  8
@@ -213,7 +213,7 @@ 

-
19class EnumWithoutDocstrings(enum.Enum):
+            
19class EnumWithoutDocstrings(enum.Enum):
 20    FOO = enum.auto()
 21    BAR = enum.auto()
 
@@ -257,7 +257,7 @@

-
24class IntEnum(enum.IntEnum):
+            
24class IntEnum(enum.IntEnum):
 25    FOO = enum.auto()
 26    BAR = enum.auto()
 
@@ -301,7 +301,7 @@

-
29class StrEnum(enum.StrEnum):
+            
29class StrEnum(enum.StrEnum):
 30    FOO = enum.auto()
 31    BAR = enum.auto()
 
diff --git a/test/testdata/example_customtemplate.html b/test/testdata/example_customtemplate.html index 0849170f..602928b6 100644 --- a/test/testdata/example_customtemplate.html +++ b/test/testdata/example_customtemplate.html @@ -70,19 +70,19 @@

2A small `pdoc` example. 3""" 4 - 5class Dog: + 5class Dog: 6 """🐕""" 7 name: str 8 """The name of our dog.""" 9 friends: list["Dog"] 10 """The friends of our dog.""" 11 -12 def __init__(self, name: str): +12 def __init__(self, name: str): 13 """Make a Dog without any friends (yet).""" 14 self.name = name 15 self.friends = [] 16 -17 def bark(self, loud: bool = True): +17 def bark(self, loud: bool = True): 18 """*woof*"""

@@ -99,19 +99,19 @@

-
 6class Dog:
+            
 6class Dog:
  7    """🐕"""
  8    name: str
  9    """The name of our dog."""
 10    friends: list["Dog"]
 11    """The friends of our dog."""
 12
-13    def __init__(self, name: str):
+13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
 17
-18    def bark(self, loud: bool = True):
+18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
@@ -130,7 +130,7 @@

-
13    def __init__(self, name: str):
+            
13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
@@ -179,7 +179,7 @@ 

-
18    def bark(self, loud: bool = True):
+            
18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
diff --git a/test/testdata/example_darkmode.html b/test/testdata/example_darkmode.html index f353639c..06bce496 100644 --- a/test/testdata/example_darkmode.html +++ b/test/testdata/example_darkmode.html @@ -68,19 +68,19 @@

2A small `pdoc` example. 3""" 4 - 5class Dog: + 5class Dog: 6 """🐕""" 7 name: str 8 """The name of our dog.""" 9 friends: list["Dog"] 10 """The friends of our dog.""" 11 -12 def __init__(self, name: str): +12 def __init__(self, name: str): 13 """Make a Dog without any friends (yet).""" 14 self.name = name 15 self.friends = [] 16 -17 def bark(self, loud: bool = True): +17 def bark(self, loud: bool = True): 18 """*woof*"""

@@ -97,19 +97,19 @@

-
 6class Dog:
+            
 6class Dog:
  7    """🐕"""
  8    name: str
  9    """The name of our dog."""
 10    friends: list["Dog"]
 11    """The friends of our dog."""
 12
-13    def __init__(self, name: str):
+13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
 17
-18    def bark(self, loud: bool = True):
+18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
@@ -128,7 +128,7 @@

-
13    def __init__(self, name: str):
+            
13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
@@ -177,7 +177,7 @@ 

-
18    def bark(self, loud: bool = True):
+            
18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
diff --git a/test/testdata/example_mkdocs.html b/test/testdata/example_mkdocs.html index 2fa73e97..d95182ee 100644 --- a/test/testdata/example_mkdocs.html +++ b/test/testdata/example_mkdocs.html @@ -19,19 +19,19 @@

2A small `pdoc` example. 3""" 4 - 5class Dog: + 5class Dog: 6 """🐕""" 7 name: str 8 """The name of our dog.""" 9 friends: list["Dog"] 10 """The friends of our dog.""" 11 -12 def __init__(self, name: str): +12 def __init__(self, name: str): 13 """Make a Dog without any friends (yet).""" 14 self.name = name 15 self.friends = [] 16 -17 def bark(self, loud: bool = True): +17 def bark(self, loud: bool = True): 18 """*woof*"""

@@ -48,19 +48,19 @@

-
 6class Dog:
+            
 6class Dog:
  7    """🐕"""
  8    name: str
  9    """The name of our dog."""
 10    friends: list["Dog"]
 11    """The friends of our dog."""
 12
-13    def __init__(self, name: str):
+13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
 17
-18    def bark(self, loud: bool = True):
+18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
@@ -79,7 +79,7 @@

-
13    def __init__(self, name: str):
+            
13    def __init__(self, name: str):
 14        """Make a Dog without any friends (yet)."""
 15        self.name = name
 16        self.friends = []
@@ -128,7 +128,7 @@ 

-
18    def bark(self, loud: bool = True):
+            
18    def bark(self, loud: bool = True):
 19        """*woof*"""
 
diff --git a/test/testdata/flavors_google.html b/test/testdata/flavors_google.html index 5cff5f80..ccc56f7c 100644 --- a/test/testdata/flavors_google.html +++ b/test/testdata/flavors_google.html @@ -237,7 +237,7 @@
Todo:
42""" 43__docformat__ = "google" 44 - 45from typing import Any, Mapping, Sequence, Tuple + 45from typing import Any, Mapping, Sequence, Tuple 46 47 48module_level_variable1 = 12345 @@ -250,7 +250,7 @@
Todo:
55""" 56 57 - 58def function_with_types_in_docstring(param1, param2): + 58def function_with_types_in_docstring(param1, param2): 59 """Example function with types documented in the docstring. 60 61 `PEP 484`_ type annotations are supported. If attribute, parameter, and @@ -270,7 +270,7 @@
Todo:
75 """ 76 77 - 78def function_with_pep484_type_annotations(param1: int, param2: str) -> bool: + 78def function_with_pep484_type_annotations(param1: int, param2: str) -> bool: 79 """Example function with PEP 484 type annotations. 80 81 Args: @@ -284,7 +284,7 @@
Todo:
89 raise NotImplementedError 90 91 - 92def module_level_function(param1, param2=None, *args, **kwargs): + 92def module_level_function(param1, param2=None, *args, **kwargs): 93 """This is an example of a module level function. 94 95 Function parameters should be documented in the ``Args`` section. The name @@ -338,7 +338,7 @@
Todo:
143 return True 144 145 -146def example_generator(n): +146def example_generator(n): 147 """Generators have a ``Yields`` section instead of a ``Returns`` section. 148 149 Args: @@ -359,7 +359,7 @@
Todo:
164 yield i 165 166 -167class ExampleError(Exception): +167class ExampleError(Exception): 168 """Exceptions are documented in the same way as classes. 169 170 The __init__ method may be documented in either the class level @@ -381,17 +381,17 @@
Todo:
186 187 """ 188 -189 def __init__(self, msg, code): +189 def __init__(self, msg, code): 190 self.msg = msg 191 self.code = code 192 -193 def add_note(self, note: str): +193 def add_note(self, note: str): 194 """This method is present on Python 3.11+ and manually added here so that snapshots are consistent.""" 195 -196 def with_traceback(self, object, /): +196 def with_traceback(self, object, /): 197 """This method has a changed docstring in Python 3.13+ and is manually added here so that snapshots are consistent.""" 198 -199class ExampleClass(object): +199class ExampleClass(object): 200 """The summary line for a class docstring should fit on one line. 201 202 If the class has public attributes, they may be documented here @@ -408,7 +408,7 @@
Todo:
213 214 """ 215 -216 def __init__(self, param1, param2, param3): +216 def __init__(self, param1, param2, param3): 217 """Example of docstring on the __init__ method. 218 219 The __init__ method may be documented in either the class level @@ -438,12 +438,12 @@
Todo:
243 """str: Docstring *after* attribute, with type specified.""" 244 245 @property -246 def readonly_property(self): +246 def readonly_property(self): 247 """str: Properties should be documented in their getter method.""" 248 return 'readonly_property' 249 250 @property -251 def readwrite_property(self): +251 def readwrite_property(self): 252 """:obj:`list` of :obj:`str`: Properties with both a getter and setter 253 should only be documented in their getter method. 254 @@ -453,10 +453,10 @@
Todo:
258 return ['readwrite_property'] 259 260 @readwrite_property.setter -261 def readwrite_property(self, value): +261 def readwrite_property(self, value): 262 value 263 -264 def example_method(self, param1, param2): +264 def example_method(self, param1, param2): 265 """Class methods are similar to regular functions. 266 267 Note: @@ -472,7 +472,7 @@
Todo:
277 """ 278 return True 279 -280 def __special__(self): +280 def __special__(self): 281 """By default special members with docstrings are not included. 282 283 Special members are any methods or attributes that start with and @@ -488,10 +488,10 @@
Todo:
293 """ 294 pass 295 -296 def __special_without_docstring__(self): +296 def __special_without_docstring__(self): 297 pass 298 -299 def _private(self): +299 def _private(self): 300 """By default private members are not included. 301 302 Private members are any methods or attributes that start with an @@ -506,11 +506,11 @@
Todo:
311 """ 312 pass 313 -314 def _private_without_docstring(self): +314 def _private_without_docstring(self): 315 pass 316 317 -318def fetch_smalltable_rows(table_handle: Any, +318def fetch_smalltable_rows(table_handle: Any, 319 keys: Sequence[str], 320 require_all_keys: bool = False, 321) -> Mapping[bytes, Tuple[str]]: @@ -545,7 +545,7 @@
Todo:
350 raise NotImplementedError 351 352 -353def fetch_smalltable_rows2(table_handle: Any, +353def fetch_smalltable_rows2(table_handle: Any, 354 keys: Sequence[str], 355 require_all_keys: bool = False, 356) -> Mapping[bytes, Tuple[str]]: @@ -583,7 +583,7 @@
Todo:
388 raise NotImplementedError 389 390 -391class SampleClass: +391class SampleClass: 392 """Summary of class here. 393 394 Longer class information.... @@ -594,16 +594,16 @@
Todo:
399 eggs: An integer count of the eggs we have laid. 400 """ 401 -402 def __init__(self, likes_spam=False): +402 def __init__(self, likes_spam=False): 403 """Inits SampleClass with blah.""" 404 self.likes_spam = likes_spam 405 self.eggs = 0 406 -407 def public_method(self): +407 def public_method(self): 408 """Performs operation blah.""" 409 410 -411def invalid_format(test): +411def invalid_format(test): 412 """ 413 In this example, there is no colon after the argument and an empty section. 414 @@ -615,7 +615,7 @@
Todo:
420 """ 421 422 -423def example_code(): +423def example_code(): 424 """ 425 Test case for https://github.com/mitmproxy/pdoc/issues/264. 426 @@ -629,7 +629,7 @@
Todo:
434 """ 435 436 -437def newline_after_args(test: str): +437def newline_after_args(test: str): 438 """ 439 Test case for https://github.com/mitmproxy/pdoc/pull/458. 440 @@ -640,7 +640,7 @@
Todo:
445 """ 446 447 -448def alternative_section_names(test: str): +448def alternative_section_names(test: str): 449 """ 450 In this example, we check whether alternative section names aliased to 451 'Args' are handled properly. @@ -692,7 +692,7 @@
Todo:
-
59def function_with_types_in_docstring(param1, param2):
+            
59def function_with_types_in_docstring(param1, param2):
 60    """Example function with types documented in the docstring.
 61
 62    `PEP 484`_ type annotations are supported. If attribute, parameter, and
@@ -746,7 +746,7 @@ 
Returns:
-
79def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
+            
79def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
 80    """Example function with PEP 484 type annotations.
 81
 82    Args:
@@ -790,7 +790,7 @@ 
Returns:
-
 93def module_level_function(param1, param2=None, *args, **kwargs):
+            
 93def module_level_function(param1, param2=None, *args, **kwargs):
  94    """This is an example of a module level function.
  95
  96    Function parameters should be documented in the ``Args`` section. The name
@@ -917,7 +917,7 @@ 
Raises:
-
147def example_generator(n):
+            
147def example_generator(n):
 148    """Generators have a ``Yields`` section instead of a ``Returns`` section.
 149
 150    Args:
@@ -980,7 +980,7 @@ 
Examples:
-
168class ExampleError(Exception):
+            
168class ExampleError(Exception):
 169    """Exceptions are documented in the same way as classes.
 170
 171    The __init__ method may be documented in either the class level
@@ -1002,14 +1002,14 @@ 
Examples:
187 188 """ 189 -190 def __init__(self, msg, code): +190 def __init__(self, msg, code): 191 self.msg = msg 192 self.code = code 193 -194 def add_note(self, note: str): +194 def add_note(self, note: str): 195 """This method is present on Python 3.11+ and manually added here so that snapshots are consistent.""" 196 -197 def with_traceback(self, object, /): +197 def with_traceback(self, object, /): 198 """This method has a changed docstring in Python 3.13+ and is manually added here so that snapshots are consistent."""
@@ -1054,7 +1054,7 @@
Attributes:
-
190    def __init__(self, msg, code):
+            
190    def __init__(self, msg, code):
 191        self.msg = msg
 192        self.code = code
 
@@ -1096,7 +1096,7 @@
Attributes:
-
194    def add_note(self, note: str):
+            
194    def add_note(self, note: str):
 195        """This method is present on Python 3.11+ and manually added here so that snapshots are consistent."""
 
@@ -1117,7 +1117,7 @@
Attributes:
-
197    def with_traceback(self, object, /):
+            
197    def with_traceback(self, object, /):
 198        """This method has a changed docstring in Python 3.13+ and is manually added here so that snapshots are consistent."""
 
@@ -1139,7 +1139,7 @@
Attributes:
-
200class ExampleClass(object):
+            
200class ExampleClass(object):
 201    """The summary line for a class docstring should fit on one line.
 202
 203    If the class has public attributes, they may be documented here
@@ -1156,7 +1156,7 @@ 
Attributes:
214 215 """ 216 -217 def __init__(self, param1, param2, param3): +217 def __init__(self, param1, param2, param3): 218 """Example of docstring on the __init__ method. 219 220 The __init__ method may be documented in either the class level @@ -1186,12 +1186,12 @@
Attributes:
244 """str: Docstring *after* attribute, with type specified.""" 245 246 @property -247 def readonly_property(self): +247 def readonly_property(self): 248 """str: Properties should be documented in their getter method.""" 249 return 'readonly_property' 250 251 @property -252 def readwrite_property(self): +252 def readwrite_property(self): 253 """:obj:`list` of :obj:`str`: Properties with both a getter and setter 254 should only be documented in their getter method. 255 @@ -1201,10 +1201,10 @@
Attributes:
259 return ['readwrite_property'] 260 261 @readwrite_property.setter -262 def readwrite_property(self, value): +262 def readwrite_property(self, value): 263 value 264 -265 def example_method(self, param1, param2): +265 def example_method(self, param1, param2): 266 """Class methods are similar to regular functions. 267 268 Note: @@ -1220,7 +1220,7 @@
Attributes:
278 """ 279 return True 280 -281 def __special__(self): +281 def __special__(self): 282 """By default special members with docstrings are not included. 283 284 Special members are any methods or attributes that start with and @@ -1236,10 +1236,10 @@
Attributes:
294 """ 295 pass 296 -297 def __special_without_docstring__(self): +297 def __special_without_docstring__(self): 298 pass 299 -300 def _private(self): +300 def _private(self): 301 """By default private members are not included. 302 303 Private members are any methods or attributes that start with an @@ -1254,7 +1254,7 @@
Attributes:
312 """ 313 pass 314 -315 def _private_without_docstring(self): +315 def _private_without_docstring(self): 316 pass
@@ -1288,7 +1288,7 @@
Attributes:
-
217    def __init__(self, param1, param2, param3):
+            
217    def __init__(self, param1, param2, param3):
 218        """Example of docstring on the __init__ method.
 219
 220        The __init__ method may be documented in either the class level
@@ -1412,7 +1412,7 @@ 
Arguments:
246    @property
-247    def readonly_property(self):
+247    def readonly_property(self):
 248        """str: Properties should be documented in their getter method."""
 249        return 'readonly_property'
 
@@ -1433,7 +1433,7 @@
Arguments:
251    @property
-252    def readwrite_property(self):
+252    def readwrite_property(self):
 253        """:obj:`list` of :obj:`str`: Properties with both a getter and setter
 254        should only be documented in their getter method.
 255
@@ -1464,7 +1464,7 @@ 
Arguments:
-
265    def example_method(self, param1, param2):
+            
265    def example_method(self, param1, param2):
 266        """Class methods are similar to regular functions.
 267
 268        Note:
@@ -1518,7 +1518,7 @@ 
Returns:
-
319def fetch_smalltable_rows(table_handle: Any,
+            
319def fetch_smalltable_rows(table_handle: Any,
 320                          keys: Sequence[str],
 321                          require_all_keys: bool = False,
 322) -> Mapping[bytes, Tuple[str]]:
@@ -1605,7 +1605,7 @@ 
Raises:
-
354def fetch_smalltable_rows2(table_handle: Any,
+            
354def fetch_smalltable_rows2(table_handle: Any,
 355                          keys: Sequence[str],
 356                          require_all_keys: bool = False,
 357) -> Mapping[bytes, Tuple[str]]:
@@ -1695,7 +1695,7 @@ 
Raises:
-
392class SampleClass:
+            
392class SampleClass:
 393    """Summary of class here.
 394
 395    Longer class information....
@@ -1706,12 +1706,12 @@ 
Raises:
400 eggs: An integer count of the eggs we have laid. 401 """ 402 -403 def __init__(self, likes_spam=False): +403 def __init__(self, likes_spam=False): 404 """Inits SampleClass with blah.""" 405 self.likes_spam = likes_spam 406 self.eggs = 0 407 -408 def public_method(self): +408 def public_method(self): 409 """Performs operation blah."""
@@ -1740,7 +1740,7 @@
Attributes:
-
403    def __init__(self, likes_spam=False):
+            
403    def __init__(self, likes_spam=False):
 404        """Inits SampleClass with blah."""
 405        self.likes_spam = likes_spam
 406        self.eggs = 0
@@ -1785,7 +1785,7 @@ 
Attributes:
-
408    def public_method(self):
+            
408    def public_method(self):
 409        """Performs operation blah."""
 
@@ -1807,7 +1807,7 @@
Attributes:
-
412def invalid_format(test):
+            
412def invalid_format(test):
 413    """
 414    In this example, there is no colon after the argument and an empty section.
 415
@@ -1845,7 +1845,7 @@ 
Arguments:
-
424def example_code():
+            
424def example_code():
 425    """
 426    Test case for https://github.com/mitmproxy/pdoc/issues/264.
 427
@@ -1887,7 +1887,7 @@ 
Example:
-
438def newline_after_args(test: str):
+            
438def newline_after_args(test: str):
 439    """
 440    Test case for https://github.com/mitmproxy/pdoc/pull/458.
 441
@@ -1922,7 +1922,7 @@ 
Arguments:
-
449def alternative_section_names(test: str):
+            
449def alternative_section_names(test: str):
 450    """
 451    In this example, we check whether alternative section names aliased to
 452    'Args' are handled properly.
diff --git a/test/testdata/flavors_numpy.html b/test/testdata/flavors_numpy.html
index bdaec6de..bcf8e4ff 100644
--- a/test/testdata/flavors_numpy.html
+++ b/test/testdata/flavors_numpy.html
@@ -226,7 +226,7 @@ 
Attributes
63""" 64 65 - 66def function_with_types_in_docstring(param1, param2): + 66def function_with_types_in_docstring(param1, param2): 67 """Example function with types documented in the docstring. 68 69 `PEP 484`_ type annotations are supported. If attribute, parameter, and @@ -251,7 +251,7 @@
Attributes
88 """ 89 90 - 91def function_with_pep484_type_annotations(param1: int, param2: str) -> bool: + 91def function_with_pep484_type_annotations(param1: int, param2: str) -> bool: 92 """Example function with PEP 484 type annotations. 93 94 The return type must be duplicated in the docstring to comply @@ -273,7 +273,7 @@
Attributes
110 raise NotImplementedError 111 112 -113def module_level_function(param1, param2=None, *args, **kwargs): +113def module_level_function(param1, param2=None, *args, **kwargs): 114 """This is an example of a module level function. 115 116 Function parameters should be documented in the ``Parameters`` section. @@ -337,7 +337,7 @@
Attributes
174 return True 175 176 -177def example_generator(n): +177def example_generator(n): 178 """Generators have a ``Yields`` section instead of a ``Returns`` section. 179 180 Parameters @@ -363,7 +363,7 @@
Attributes
200 yield i 201 202 -203class ExampleError(Exception): +203class ExampleError(Exception): 204 """Exceptions are documented in the same way as classes. 205 206 The __init__ method may be documented in either the class level @@ -392,17 +392,17 @@
Attributes
229 230 """ 231 -232 def __init__(self, msg, code): +232 def __init__(self, msg, code): 233 self.msg = msg 234 self.code = code 235 -236 def add_note(self, note: str): +236 def add_note(self, note: str): 237 """This method is present on Python 3.11+ and manually added here so that snapshots are consistent.""" 238 -239 def with_traceback(self, object, /): +239 def with_traceback(self, object, /): 240 """This method has a changed docstring in Python 3.13+ and is manually added here so that snapshots are consistent.""" 241 -242class ExampleClass(object): +242class ExampleClass(object): 243 """The summary line for a class docstring should fit on one line. 244 245 If the class has public attributes, they may be documented here @@ -422,7 +422,7 @@
Attributes
259 260 """ 261 -262 def __init__(self, param1, param2, param3): +262 def __init__(self, param1, param2, param3): 263 """Example of docstring on the __init__ method. 264 265 The __init__ method may be documented in either the class level @@ -457,12 +457,12 @@
Attributes
294 """str: Docstring *after* attribute, with type specified.""" 295 296 @property -297 def readonly_property(self): +297 def readonly_property(self): 298 """str: Properties should be documented in their getter method.""" 299 return "readonly_property" 300 301 @property -302 def readwrite_property(self): +302 def readwrite_property(self): 303 """:obj:`list` of :obj:`str`: Properties with both a getter and setter 304 should only be documented in their getter method. 305 @@ -472,10 +472,10 @@
Attributes
309 return ["readwrite_property"] 310 311 @readwrite_property.setter -312 def readwrite_property(self, value): +312 def readwrite_property(self, value): 313 value 314 -315 def example_method(self, param1, param2): +315 def example_method(self, param1, param2): 316 """Class methods are similar to regular functions. 317 318 Note @@ -497,7 +497,7 @@
Attributes
334 """ 335 return True 336 -337 def __special__(self): +337 def __special__(self): 338 """By default special members with docstrings are not included. 339 340 Special members are any methods or attributes that start with and @@ -513,10 +513,10 @@
Attributes
350 """ 351 pass 352 -353 def __special_without_docstring__(self): +353 def __special_without_docstring__(self): 354 pass 355 -356 def _private(self): +356 def _private(self): 357 """By default private members are not included. 358 359 Private members are any methods or attributes that start with an @@ -531,11 +531,11 @@
Attributes
368 """ 369 pass 370 -371 def _private_without_docstring(self): +371 def _private_without_docstring(self): 372 pass 373 374 -375def foo(var1, var2, *args, long_var_name='hi', **kwargs): +375def foo(var1, var2, *args, long_var_name='hi', **kwargs): 376 r"""Summarize the function in one line. 377 378 Several sentences providing an extended description. Refer to @@ -629,7 +629,7 @@
Attributes
466 pass 467 468 -469def invalid_format(test): +469def invalid_format(test): 470 """ 471 In this example, there is no description for the test argument 472 @@ -682,7 +682,7 @@
Attributes
-
67def function_with_types_in_docstring(param1, param2):
+            
67def function_with_types_in_docstring(param1, param2):
 68    """Example function with types documented in the docstring.
 69
 70    `PEP 484`_ type annotations are supported. If attribute, parameter, and
@@ -743,7 +743,7 @@ 
Returns
-
 92def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
+            
 92def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
  93    """Example function with PEP 484 type annotations.
  94
  95    The return type must be duplicated in the docstring to comply
@@ -798,7 +798,7 @@ 
Returns
-
114def module_level_function(param1, param2=None, *args, **kwargs):
+            
114def module_level_function(param1, param2=None, *args, **kwargs):
 115    """This is an example of a module level function.
 116
 117    Function parameters should be documented in the ``Parameters`` section.
@@ -937,7 +937,7 @@ 
Raises
-
178def example_generator(n):
+            
178def example_generator(n):
 179    """Generators have a ``Yields`` section instead of a ``Returns`` section.
 180
 181    Parameters
@@ -1004,7 +1004,7 @@ 
Examples
-
204class ExampleError(Exception):
+            
204class ExampleError(Exception):
 205    """Exceptions are documented in the same way as classes.
 206
 207    The __init__ method may be documented in either the class level
@@ -1033,14 +1033,14 @@ 
Examples
230 231 """ 232 -233 def __init__(self, msg, code): +233 def __init__(self, msg, code): 234 self.msg = msg 235 self.code = code 236 -237 def add_note(self, note: str): +237 def add_note(self, note: str): 238 """This method is present on Python 3.11+ and manually added here so that snapshots are consistent.""" 239 -240 def with_traceback(self, object, /): +240 def with_traceback(self, object, /): 241 """This method has a changed docstring in Python 3.13+ and is manually added here so that snapshots are consistent."""
@@ -1087,7 +1087,7 @@
Attributes
-
233    def __init__(self, msg, code):
+            
233    def __init__(self, msg, code):
 234        self.msg = msg
 235        self.code = code
 
@@ -1129,7 +1129,7 @@
Attributes
-
237    def add_note(self, note: str):
+            
237    def add_note(self, note: str):
 238        """This method is present on Python 3.11+ and manually added here so that snapshots are consistent."""
 
@@ -1150,7 +1150,7 @@
Attributes
-
240    def with_traceback(self, object, /):
+            
240    def with_traceback(self, object, /):
 241        """This method has a changed docstring in Python 3.13+ and is manually added here so that snapshots are consistent."""
 
@@ -1172,7 +1172,7 @@
Attributes
-
243class ExampleClass(object):
+            
243class ExampleClass(object):
 244    """The summary line for a class docstring should fit on one line.
 245
 246    If the class has public attributes, they may be documented here
@@ -1192,7 +1192,7 @@ 
Attributes
260 261 """ 262 -263 def __init__(self, param1, param2, param3): +263 def __init__(self, param1, param2, param3): 264 """Example of docstring on the __init__ method. 265 266 The __init__ method may be documented in either the class level @@ -1227,12 +1227,12 @@
Attributes
295 """str: Docstring *after* attribute, with type specified.""" 296 297 @property -298 def readonly_property(self): +298 def readonly_property(self): 299 """str: Properties should be documented in their getter method.""" 300 return "readonly_property" 301 302 @property -303 def readwrite_property(self): +303 def readwrite_property(self): 304 """:obj:`list` of :obj:`str`: Properties with both a getter and setter 305 should only be documented in their getter method. 306 @@ -1242,10 +1242,10 @@
Attributes
310 return ["readwrite_property"] 311 312 @readwrite_property.setter -313 def readwrite_property(self, value): +313 def readwrite_property(self, value): 314 value 315 -316 def example_method(self, param1, param2): +316 def example_method(self, param1, param2): 317 """Class methods are similar to regular functions. 318 319 Note @@ -1267,7 +1267,7 @@
Attributes
335 """ 336 return True 337 -338 def __special__(self): +338 def __special__(self): 339 """By default special members with docstrings are not included. 340 341 Special members are any methods or attributes that start with and @@ -1283,10 +1283,10 @@
Attributes
351 """ 352 pass 353 -354 def __special_without_docstring__(self): +354 def __special_without_docstring__(self): 355 pass 356 -357 def _private(self): +357 def _private(self): 358 """By default private members are not included. 359 360 Private members are any methods or attributes that start with an @@ -1301,7 +1301,7 @@
Attributes
369 """ 370 pass 371 -372 def _private_without_docstring(self): +372 def _private_without_docstring(self): 373 pass
@@ -1337,7 +1337,7 @@
Attributes
-
263    def __init__(self, param1, param2, param3):
+            
263    def __init__(self, param1, param2, param3):
 264        """Example of docstring on the __init__ method.
 265
 266        The __init__ method may be documented in either the class level
@@ -1467,7 +1467,7 @@ 
Parameters
297    @property
-298    def readonly_property(self):
+298    def readonly_property(self):
 299        """str: Properties should be documented in their getter method."""
 300        return "readonly_property"
 
@@ -1488,7 +1488,7 @@
Parameters
302    @property
-303    def readwrite_property(self):
+303    def readwrite_property(self):
 304        """:obj:`list` of :obj:`str`: Properties with both a getter and setter
 305        should only be documented in their getter method.
 306
@@ -1519,7 +1519,7 @@ 
Parameters
-
316    def example_method(self, param1, param2):
+            
316    def example_method(self, param1, param2):
 317        """Class methods are similar to regular functions.
 318
 319        Note
@@ -1577,7 +1577,7 @@ 
Returns
-
376def foo(var1, var2, *args, long_var_name='hi', **kwargs):
+            
376def foo(var1, var2, *args, long_var_name='hi', **kwargs):
 377    r"""Summarize the function in one line.
 378
 379    Several sentences providing an extended description. Refer to
@@ -1788,7 +1788,7 @@ 
Examples
-
470def invalid_format(test):
+            
470def invalid_format(test):
 471    """
 472    In this example, there is no description for the test argument
 473
diff --git a/test/testdata/flavors_rst.html b/test/testdata/flavors_rst.html
index be423bf1..6d266ed6 100644
--- a/test/testdata/flavors_rst.html
+++ b/test/testdata/flavors_rst.html
@@ -95,7 +95,7 @@ 

  1__docformat__ = "restructuredtext"
   2
   3
-  4def links():
+  4def links():
   5    """
   6    For type hints, read `PEP 484`_.
   7    See the `Python home page <http://www.python.org>`_ for info.
@@ -106,11 +106,11 @@ 

12 """ 13 14 - 15def refs(): + 15def refs(): 16 """Here we have refs to :py:obj:`links` and :func:`admonitions`.""" 17 18 - 19def admonitions(): + 19def admonitions(): 20 """ 21 22 .. note:: @@ -146,7 +146,7 @@

52 """ 53 54 - 55def seealso(): + 55def seealso(): 56 # this is not properly supported yet 57 """ 58 .. seealso:: @@ -159,14 +159,14 @@

65 """ 66 67 - 68def seealso_short(): + 68def seealso_short(): 69 # this is not properly supported yet 70 """ 71 .. seealso:: modules :py:mod:`zipfile`, :py:mod:`tarfile` 72 """ 73 74 - 75def tables(): + 75def tables(): 76 """ 77 | Header 1 | *Header* 2 | 78 | -------- | -------- | @@ -175,7 +175,7 @@

81 """ 82 83 - 84def footnote1(): + 84def footnote1(): 85 """ 86 Cite the relevant literature, e.g. [1]_. You may also cite these 87 references in the notes section above. @@ -188,7 +188,7 @@

94 """ 95 96 - 97def footnote2(): + 97def footnote2(): 98 """ 99 Autonumbered footnotes are 100 possible, like using [#]_ and [#]_. @@ -206,7 +206,7 @@

112 """ 113 114 -115def footnote3(): +115def footnote3(): 116 """ 117 Auto-symbol footnotes are also 118 possible, like this: [*]_ and [*]_. @@ -216,13 +216,13 @@

122 """ 123 124 -125def footnote4(): +125def footnote4(): 126 """ 127 There is no footnote for this reference [#]_. 128 """ 129 130 -131def include(): +131def include(): 132 """ 133 Included from another file: 134 @@ -230,7 +230,7 @@

136 """ 137 138 -139def include_options(): +139def include_options(): 140 """ 141 Included from another file: 142 @@ -247,7 +247,7 @@

153 """ 154 155 -156def fields(foo: str = "foo", bar: bool = True) -> str: +156def fields(foo: str = "foo", bar: bool = True) -> str: 157 """This method has field descriptions. 158 159 :param foo: A string, @@ -262,7 +262,7 @@

168 raise NotImplementedError 169 170 -171def fields_text_after_param(foo): +171def fields_text_after_param(foo): 172 """This method has text after the `:param` fields. 173 174 :param foo: Some text. @@ -271,7 +271,7 @@

177 """ 178 179 -180def fields_invalid(foo: str = "foo") -> str: +180def fields_invalid(foo: str = "foo") -> str: 181 """This method has invalid `:param` definitions. 182 183 :param: What is this for? @@ -281,7 +281,7 @@

187 raise NotImplementedError 188 189 -190def fields_exception(): +190def fields_exception(): 191 """ 192 :raises RuntimeError: Some multi-line 193 exception description. @@ -301,7 +301,7 @@

-
 5def links():
+            
 5def links():
  6    """
  7    For type hints, read `PEP 484`_.
  8    See the `Python home page <http://www.python.org>`_ for info.
@@ -330,7 +330,7 @@ 

-
16def refs():
+            
16def refs():
 17    """Here we have refs to :py:obj:`links` and :func:`admonitions`."""
 
@@ -351,7 +351,7 @@

-
20def admonitions():
+            
20def admonitions():
 21    """
 22
 23    .. note::
@@ -450,7 +450,7 @@ 
This warning has a title only.
-
56def seealso():
+            
56def seealso():
 57    # this is not properly supported yet
 58    """
 59    .. seealso::
@@ -485,7 +485,7 @@ 
This warning has a title only.
-
69def seealso_short():
+            
69def seealso_short():
 70    # this is not properly supported yet
 71    """
 72    .. seealso:: modules :py:mod:`zipfile`, :py:mod:`tarfile`
@@ -509,7 +509,7 @@ 
This warning has a title only.
-
76def tables():
+            
76def tables():
 77    """
 78    | Header 1 | *Header* 2 |
 79    | -------- | -------- |
@@ -552,7 +552,7 @@ 
This warning has a title only.
-
85def footnote1():
+            
85def footnote1():
 86    """
 87    Cite the relevant literature, e.g. [1]_.  You may also cite these
 88    references in the notes section above.
@@ -596,7 +596,7 @@ 
This warning has a title only.
-
 98def footnote2():
+            
 98def footnote2():
  99    """
 100    Autonumbered footnotes are
 101    possible, like using [#]_ and [#]_.
@@ -657,7 +657,7 @@ 
This warning has a title only.
-
116def footnote3():
+            
116def footnote3():
 117    """
 118    Auto-symbol footnotes are also
 119    possible, like this: [*]_ and [*]_.
@@ -698,7 +698,7 @@ 
This warning has a title only.
-
126def footnote4():
+            
126def footnote4():
 127    """
 128    There is no footnote for this reference [#]_.
 129    """
@@ -721,7 +721,7 @@ 
This warning has a title only.
-
132def include():
+            
132def include():
 133    """
 134    Included from another file:
 135
@@ -754,7 +754,7 @@ 
This warning has a title only.
-
140def include_options():
+            
140def include_options():
 141    """
 142    Included from another file:
 143
@@ -801,7 +801,7 @@ 
This warning has a title only.
-
157def fields(foo: str = "foo", bar: bool = True) -> str:
+            
157def fields(foo: str = "foo", bar: bool = True) -> str:
 158    """This method has field descriptions.
 159
 160    :param foo: A string,
@@ -849,7 +849,7 @@ 
Returns
-
172def fields_text_after_param(foo):
+            
172def fields_text_after_param(foo):
 173    """This method has text after the `:param` fields.
 174
 175    :param foo: Some text.
@@ -883,7 +883,7 @@ 
Parameters
-
181def fields_invalid(foo: str = "foo") -> str:
+            
181def fields_invalid(foo: str = "foo") -> str:
 182    """This method has invalid `:param` definitions.
 183
 184    :param: What is this for?
@@ -918,7 +918,7 @@ 
Parameters
-
191def fields_exception():
+            
191def fields_exception():
 192    """
 193    :raises RuntimeError: Some multi-line
 194        exception description.
diff --git a/test/testdata/math_demo.html b/test/testdata/math_demo.html
index 6fa22199..55c75cdb 100644
--- a/test/testdata/math_demo.html
+++ b/test/testdata/math_demo.html
@@ -82,7 +82,7 @@ 

Using Math in Docstrings

You can either escape a backslash with a second backslash:

-
def foo():
+
def foo():
     """docstring with $\\frac{x}{y}$."""
 
@@ -92,7 +92,7 @@

Using Math in Docstrings

where backslashes are not processed:

-
def foo():
+
def foo():
     r"""raw docstring with $\frac{x}{y}$."""
 
@@ -145,10 +145,10 @@

Example

32# Example 33''' 34 -35import math +35import math 36 37 -38def binom_coef(n: int, k: int) -> int: +38def binom_coef(n: int, k: int) -> int: 39 """ 40 Return the number of ways to choose $k$ items from $n$ items without repetition and without order. 41 @@ -157,7 +157,7 @@

Example

44 return math.comb(n, k) 45 46 -47def long_formula(): +47def long_formula(): 48 r""" 49 $$ 50 \Delta = @@ -192,7 +192,7 @@

Example

-
39def binom_coef(n: int, k: int) -> int:
+            
39def binom_coef(n: int, k: int) -> int:
 40    """
 41    Return the number of ways to choose $k$ items from $n$ items without repetition and without order.
 42
@@ -220,7 +220,7 @@ 

Example

-
48def long_formula():
+            
48def long_formula():
 49    r"""
 50    $$
 51        \Delta =
diff --git a/test/testdata/math_misc.html b/test/testdata/math_misc.html
index b91a738d..7fb73843 100644
--- a/test/testdata/math_misc.html
+++ b/test/testdata/math_misc.html
@@ -87,7 +87,7 @@ 

4""" 5 6 - 7def test_stars(): + 7def test_stars(): 8 r""" 9 Markdown emphasis tokens (`*`) should not be captured in math mode. 10 @@ -100,7 +100,7 @@

17 """ 18 19 -20def test_math_newline(): +20def test_math_newline(): 21 r""" 22 Markdown should not consume double backslashes (math newlines) in math mode. 23 @@ -124,7 +124,7 @@

41 """ 42 43 -44def test_markdown_newline(): +44def test_markdown_newline(): 45 r""" 46 Markdown newlines (`\n\n`) should not emit a paragraph break in math mode. 47 @@ -146,7 +146,7 @@

63 """ 64 65 -66def test_macros(): +66def test_macros(): 67 r""" 68 Markdown should not capture headings (`#`) in math mode. 69 Currently broken: @@ -182,7 +182,7 @@

-
 8def test_stars():
+            
 8def test_stars():
  9    r"""
 10    Markdown emphasis tokens (`*`) should not be captured in math mode.
 11
@@ -218,7 +218,7 @@ 

-
21def test_math_newline():
+            
21def test_math_newline():
 22    r"""
 23    Markdown should not consume double backslashes (math newlines) in math mode.
 24
@@ -277,7 +277,7 @@ 

-
45def test_markdown_newline():
+            
45def test_markdown_newline():
 46    r"""
 47    Markdown newlines (`\n\n`) should not emit a paragraph break in math mode.
 48
@@ -332,7 +332,7 @@ 

-
67def test_macros():
+            
67def test_macros():
 68    r"""
 69    Markdown should not capture headings (`#`) in math mode.
 70    Currently broken:
diff --git a/test/testdata/mermaid_demo.html b/test/testdata/mermaid_demo.html
index 4b7775da..7cd045db 100644
--- a/test/testdata/mermaid_demo.html
+++ b/test/testdata/mermaid_demo.html
@@ -116,22 +116,22 @@ 

16""" 17 18 -19class Pet: +19class Pet: 20 name: str 21 """The name of our pet.""" 22 friends: list["Pet"] 23 """The friends of our pet.""" 24 -25 def __init__(self, name: str): +25 def __init__(self, name: str): 26 """Make a Pet without any friends (yet).""" 27 self.name = name 28 self.friends = [] 29 30 -31class Dog(Pet): +31class Dog(Pet): 32 """🐕""" 33 -34 def bark(self, loud: bool = True): +34 def bark(self, loud: bool = True): 35 """*woof*"""

@@ -148,13 +148,13 @@

-
20class Pet:
+            
20class Pet:
 21    name: str
 22    """The name of our pet."""
 23    friends: list["Pet"]
 24    """The friends of our pet."""
 25
-26    def __init__(self, name: str):
+26    def __init__(self, name: str):
 27        """Make a Pet without any friends (yet)."""
 28        self.name = name
 29        self.friends = []
@@ -173,7 +173,7 @@ 

-
26    def __init__(self, name: str):
+            
26    def __init__(self, name: str):
 27        """Make a Pet without any friends (yet)."""
 28        self.name = name
 29        self.friends = []
@@ -223,10 +223,10 @@ 

-
32class Dog(Pet):
+            
32class Dog(Pet):
 33    """🐕"""
 34
-35    def bark(self, loud: bool = True):
+35    def bark(self, loud: bool = True):
 36        """*woof*"""
 
@@ -246,7 +246,7 @@

-
35    def bark(self, loud: bool = True):
+            
35    def bark(self, loud: bool = True):
 36        """*woof*"""
 
diff --git a/test/testdata/misc.html b/test/testdata/misc.html index dd4c3d82..64923bb0 100644 --- a/test/testdata/misc.html +++ b/test/testdata/misc.html @@ -326,41 +326,41 @@

-
  1import abc
-  2from ctypes import Structure
-  3from dataclasses import dataclass
-  4import functools
-  5from functools import cached_property
-  6from functools import lru_cache
-  7import sched
-  8from typing import Generic
-  9from typing import TypeVar
- 10from typing import Union
+                        
  1import abc
+  2from ctypes import Structure
+  3from dataclasses import dataclass
+  4import functools
+  5from functools import cached_property
+  6from functools import lru_cache
+  7import sched
+  8from typing import Generic
+  9from typing import TypeVar
+ 10from typing import Union
  11
  12# https://github.com/mitmproxy/pdoc/issues/226
  13
  14
- 15class Descriptor:
- 16    def __init__(self, func):
+ 15class Descriptor:
+ 16    def __init__(self, func):
  17        self.__doc__ = func.__doc__
  18
- 19    def __get__(self, instance, owner):
+ 19    def __get__(self, instance, owner):
  20        return self if instance is None else getattr(instance, "_x", 0)
  21
- 22    def __set__(self, instance, value):
+ 22    def __set__(self, instance, value):
  23        instance._x = value
  24
  25
- 26class Issue226:
+ 26class Issue226:
  27    @Descriptor
- 28    def size(self):
+ 28    def size(self):
  29        """This is the size"""
  30
  31
  32# Testing function and object default values
  33
  34
- 35def default_func():
+ 35def default_func():
  36    pass
  37
  38
@@ -372,13 +372,13 @@ 

44"""this just renders like a normal function""" 45 46 - 47def func_with_defaults(a=default_obj, b=default_func): + 47def func_with_defaults(a=default_obj, b=default_func): 48 """this shouldn't render object or function addresses""" 49 pass 50 51 52# Testing classmethod links in code - 53class ClassmethodLink: + 53class ClassmethodLink: 54 """ 55 You can either do 56 @@ -395,7 +395,7 @@

67 """ 68 69 @classmethod - 70 def bar(cls): + 70 def bar(cls): 71 return 42 72 73 @@ -404,43 +404,43 @@

76T = TypeVar("T") 77 78 - 79class GenericParent(Generic[T]): + 79class GenericParent(Generic[T]): 80 """GenericParent""" 81 82 - 83class NonGenericChild(GenericParent[str]): + 83class NonGenericChild(GenericParent[str]): 84 """NonGenericChild""" 85 86 87# Testing docstring inheritance 88 89 - 90class Base: - 91 def __init__(self): + 90class Base: + 91 def __init__(self): 92 """init""" 93 super().__init__() 94 - 95 def foo(self): + 95 def foo(self): 96 """foo""" 97 pass 98 99 @classmethod -100 def bar(cls): +100 def bar(cls): 101 """bar""" 102 pass 103 104 @staticmethod -105 def baz(): +105 def baz(): 106 """baz""" 107 pass 108 109 @property -110 def qux(self): +110 def qux(self): 111 """qux""" 112 return 113 114 @cached_property -115 def quux(self): +115 def quux(self): 116 """quux""" 117 return 118 @@ -448,27 +448,27 @@

120 """quuux""" 121 122 -123class Child(Base): -124 def __init__(self): +123class Child(Base): +124 def __init__(self): 125 super().__init__() 126 -127 def foo(self): +127 def foo(self): 128 pass 129 130 @classmethod -131 def bar(cls): +131 def bar(cls): 132 pass 133 134 @staticmethod -135 def baz(): +135 def baz(): 136 pass 137 138 @property -139 def qux(self): +139 def qux(self): 140 return 141 142 @cached_property -143 def quux(self): +143 def quux(self): 144 return 145 146 quuux: int = 42 @@ -482,19 +482,19 @@

154# Testing that a private class in __all__ is displayed 155 156 -157class _Private: +157class _Private: 158 """private class""" 159 160 pass 161 -162 def _do(self): +162 def _do(self): 163 """private method""" 164 165 166# Testing a class attribute that is a lambda (which generates quirky sources) 167 168 -169class LambdaAttr: +169class LambdaAttr: 170 # not really supported, but also shouldn't crash. 171 attr = lambda x: 42 # noqa 172 @@ -503,66 +503,66 @@

175# fmt: off 176 177 -178def foo(): +178def foo(): 179 """no indents""" 180 181 -182def bar(): +182def bar(): 183 """no 184indents""" 185 186 -187def baz(): +187def baz(): 188 """one 189 indent""" 190 191 -192def qux(): +192def qux(): 193 """ 194 two 195 indents 196 """ 197 198 -199class Indented: -200 def foo(self): +199class Indented: +200 def foo(self): 201 """no indents""" 202 -203 def bar(self): +203 def bar(self): 204 """no 205indents""" 206 -207 def baz(self): +207 def baz(self): 208 """one 209 indent""" 210 -211 def qux(self): +211 def qux(self): 212 """ 213 two 214 indents 215 """ 216 217 @lru_cache() -218 def foo_decorated(self): +218 def foo_decorated(self): 219 """no indents""" 220 221 @lru_cache() 222 # comment -223 def foo_commented(self): +223 def foo_commented(self): 224 """no indents""" 225 226 @lru_cache() -227 def bar_decorated(self): +227 def bar_decorated(self): 228 """no 229indents""" 230 231 @lru_cache() -232 def baz_decorated(self): +232 def baz_decorated(self): 233 """one 234 indent""" 235 236 @lru_cache() -237 def qux_decorated(self): +237 def qux_decorated(self): 238 """ 239 two 240 indents @@ -571,21 +571,21 @@

243 @lru_cache( 244 maxsize=42 245 ) -246 def quux_decorated(self): +246 def quux_decorated(self): 247 """multi-line decorator, https://github.com/mitmproxy/pdoc/issues/246""" 248 249 -250def _protected_decorator(f): +250def _protected_decorator(f): 251 return f 252 253 254@_protected_decorator -255def fun_with_protected_decorator(): +255def fun_with_protected_decorator(): 256 """This function has a protected decorator (name starting with a single `_`).""" 257 258 -259class UnhashableDataDescriptor: -260 def __get__(self): +259class UnhashableDataDescriptor: +260 def __get__(self): 261 pass 262 __hash__ = None # type: ignore 263 @@ -593,17 +593,17 @@

265unhashable = UnhashableDataDescriptor() 266 267 -268class AbstractClass(metaclass=abc.ABCMeta): +268class AbstractClass(metaclass=abc.ABCMeta): 269 """This class shouldn't show a constructor as it's abstract.""" 270 @abc.abstractmethod -271 def foo(self): +271 def foo(self): 272 pass 273 274 275# Adapted from https://github.com/mitmproxy/pdoc/issues/320 276 -277def make_adder(a: int): -278 def add_func(b: int) -> int: +277def make_adder(a: int): +278 def add_func(b: int) -> int: 279 """This function adds two numbers.""" 280 return a + b 281 return add_func @@ -617,7 +617,7 @@

289 290 291# Adapted from https://github.com/mitmproxy/pdoc/issues/335 -292def linkify_links(): +292def linkify_links(): 293 """ 294 This docstring contains links that are also identifiers: 295 @@ -630,35 +630,35 @@

302 """ 303 304 -305class Issue352aMeta(type): -306 def __call__(cls, *args, **kwargs): +305class Issue352aMeta(type): +306 def __call__(cls, *args, **kwargs): 307 """Meta.__call__""" 308 309 -310class Issue352a(metaclass=Issue352aMeta): -311 def __init__(self): +310class Issue352a(metaclass=Issue352aMeta): +311 def __init__(self): 312 """Issue352.__init__ should be preferred over Meta.__call__.""" 313 314 -315class Issue352bMeta(type): -316 def __call__(cls, *args, **kwargs): +315class Issue352bMeta(type): +316 def __call__(cls, *args, **kwargs): 317 pass 318 319 -320class Issue352b(metaclass=Issue352bMeta): +320class Issue352b(metaclass=Issue352bMeta): 321 """No docstrings for the constructor here.""" 322 323 -324class CustomCallMeta(type): -325 def __call__(cls, *args, **kwargs): +324class CustomCallMeta(type): +325 def __call__(cls, *args, **kwargs): 326 """Custom docstring in metaclass.`__call__`""" 327 328 -329class CustomCall(metaclass=CustomCallMeta): +329class CustomCall(metaclass=CustomCallMeta): 330 """A class where the constructor is defined by its metaclass.""" 331 332 -333class Headings: +333class Headings: 334 """ 335 # Heading 1 336 @@ -687,36 +687,36 @@

359 """ 360 361 -362class CustomRepr: -363 def __repr__(self): +362class CustomRepr: +363 def __repr__(self): 364 return "°<script>alert(1)</script>" 365 366 -367def repr_not_syntax_highlightable(x=CustomRepr()): +367def repr_not_syntax_highlightable(x=CustomRepr()): 368 """The default value for x fails to highlight with pygments.""" 369 370 -371class ClassDecorator: +371class ClassDecorator: 372 """This is a class that wraps a function. It will be documented correctly.""" -373 def __init__(self, func): +373 def __init__(self, func): 374 self._func = func 375 376 377@ClassDecorator -378def another_decorated_function(arg: str) -> str: +378def another_decorated_function(arg: str) -> str: 379 """This is another decorated function. It will not be documented correctly.""" 380 raise NotImplementedError 381 382 -383class SubclassRef: -384 class SubClass: +383class SubclassRef: +384 class SubClass: 385 pass 386 -387 def __init__(self, x: "SubClass"): +387 def __init__(self, x: "SubClass"): 388 print(x) 389 390 -391class ClassAsAttribute: +391class ClassAsAttribute: 392 static_attr_to_class = ClassDecorator 393 """this is a static attribute that point to a Class (not an instance)""" 394 @@ -724,19 +724,19 @@

396 """this is a static attribute that point to an instance""" 397 398 -399class scheduler(sched.scheduler): +399class scheduler(sched.scheduler): 400 """Test for broken links for inherited methods, https://github.com/mitmproxy/pdoc/issues/490""" 401 402 -403class __init__: +403class __init__: 404 """https://github.com/mitmproxy/pdoc/issues/519""" 405 406 -407def dynamically_modify_docstring1(): +407def dynamically_modify_docstring1(): 408 """this should **not** be the docstring.""" 409 410 -411def dynamically_modify_docstring2(): +411def dynamically_modify_docstring2(): 412 pass 413 414 @@ -744,23 +744,23 @@

416dynamically_modify_docstring2.__doc__ = "https://github.com/mitmproxy/pdoc/issues/536" 417 418 -419def _docstring_modifier(fn): +419def _docstring_modifier(fn): 420 fn.__doc__ = "https://github.com/mitmproxy/pdoc/issues/536" 421 return fn 422 423 424@_docstring_modifier -425def dynamically_modify_docstring3(): +425def dynamically_modify_docstring3(): 426 """This should **not** be the docstring.""" 427 428 429@_docstring_modifier -430def dynamically_modify_docstring4(): +430def dynamically_modify_docstring4(): 431 pass 432 433 -434class DocstringFromNew: -435 def __new__(cls, *args, **kwargs): +434class DocstringFromNew: +435 def __new__(cls, *args, **kwargs): 436 """This is a class with a docstring inferred from `__new__`.""" 437 438 @@ -768,9 +768,9 @@

440 441 442 -443class SingleDispatchMethodExample: +443class SingleDispatchMethodExample: 444 @functools.singledispatchmethod -445 def fancymethod(self, str_or_int: Union[str, int]): +445 def fancymethod(self, str_or_int: Union[str, int]): 446 """A fancy method which is capable of handling either `str` or `int`. 447 448 :param str_or_int: string or integer to handle @@ -778,7 +778,7 @@

450 raise NotImplementedError(f"{type(str_or_int)=} not implemented!") 451 452 @fancymethod.register -453 def fancymethod_handle_str(self, str_to_handle: str): +453 def fancymethod_handle_str(self, str_to_handle: str): 454 """Fancy method handles a string. 455 456 :param str_to_handle: string which will be handled @@ -786,7 +786,7 @@

458 print(f"{type(str_to_handle)} = '{str_to_handle}") 459 460 @fancymethod.register -461 def _fancymethod_handle_int(self, int_to_handle: int): +461 def _fancymethod_handle_int(self, int_to_handle: int): 462 """Fancy method handles int (not shown in doc). 463 464 :param int_to_handle: int which will be handled @@ -795,7 +795,7 @@

467 468 469@dataclass(init=False) -470class DataclassStructure(Structure): +470class DataclassStructure(Structure): 471 """DataclassStructure raises for `inspect.signature`.""" 472 473 @@ -857,9 +857,9 @@

-
27class Issue226:
+            
27class Issue226:
 28    @Descriptor
-29    def size(self):
+29    def size(self):
 30        """This is the size"""
 
@@ -905,7 +905,7 @@

-
36def default_func():
+            
36def default_func():
 37    pass
 
@@ -926,7 +926,7 @@

-
48def func_with_defaults(a=default_obj, b=default_func):
+            
48def func_with_defaults(a=default_obj, b=default_func):
 49    """this shouldn't render object or function addresses"""
 50    pass
 
@@ -948,7 +948,7 @@

-
54class ClassmethodLink:
+            
54class ClassmethodLink:
 55    """
 56    You can either do
 57
@@ -965,7 +965,7 @@ 

68 """ 69 70 @classmethod -71 def bar(cls): +71 def bar(cls): 72 return 42

@@ -1002,7 +1002,7 @@

70    @classmethod
-71    def bar(cls):
+71    def bar(cls):
 72        return 42
 
@@ -1022,7 +1022,7 @@

-
80class GenericParent(Generic[T]):
+            
80class GenericParent(Generic[T]):
 81    """GenericParent"""
 
@@ -1043,7 +1043,7 @@

-
84class NonGenericChild(GenericParent[str]):
+            
84class NonGenericChild(GenericParent[str]):
 85    """NonGenericChild"""
 
@@ -1064,27 +1064,27 @@

-
124class Child(Base):
-125    def __init__(self):
+            
124class Child(Base):
+125    def __init__(self):
 126        super().__init__()
 127
-128    def foo(self):
+128    def foo(self):
 129        pass
 130
 131    @classmethod
-132    def bar(cls):
+132    def bar(cls):
 133        pass
 134
 135    @staticmethod
-136    def baz():
+136    def baz():
 137        pass
 138
 139    @property
-140    def qux(self):
+140    def qux(self):
 141        return
 142
 143    @cached_property
-144    def quux(self):
+144    def quux(self):
 145        return
 146
 147    quuux: int = 42
@@ -1103,7 +1103,7 @@ 

-
125    def __init__(self):
+            
125    def __init__(self):
 126        super().__init__()
 
@@ -1124,7 +1124,7 @@

-
128    def foo(self):
+            
128    def foo(self):
 129        pass
 
@@ -1147,7 +1147,7 @@

131    @classmethod
-132    def bar(cls):
+132    def bar(cls):
 133        pass
 
@@ -1170,7 +1170,7 @@

135    @staticmethod
-136    def baz():
+136    def baz():
 137        pass
 
@@ -1190,7 +1190,7 @@

139    @property
-140    def qux(self):
+140    def qux(self):
 141        return
 
@@ -1210,7 +1210,7 @@

143    @cached_property
-144    def quux(self):
+144    def quux(self):
 145        return
 
@@ -1257,12 +1257,12 @@

-
158class _Private:
+            
158class _Private:
 159    """private class"""
 160
 161    pass
 162
-163    def _do(self):
+163    def _do(self):
 164        """private method"""
 
@@ -1283,7 +1283,7 @@

-
170class LambdaAttr:
+            
170class LambdaAttr:
 171    # not really supported, but also shouldn't crash.
 172    attr = lambda x: 42  # noqa
 
@@ -1321,7 +1321,7 @@

-
179def foo():
+            
179def foo():
 180    """no indents"""
 
@@ -1342,7 +1342,7 @@

-
183def bar():
+            
183def bar():
 184    """no
 185indents"""
 
@@ -1365,7 +1365,7 @@

-
188def baz():
+            
188def baz():
 189    """one
 190    indent"""
 
@@ -1388,7 +1388,7 @@

-
193def qux():
+            
193def qux():
 194    """
 195    two
 196    indents
@@ -1413,45 +1413,45 @@ 

-
200class Indented:
-201    def foo(self):
+            
200class Indented:
+201    def foo(self):
 202        """no indents"""
 203
-204    def bar(self):
+204    def bar(self):
 205        """no
 206indents"""
 207
-208    def baz(self):
+208    def baz(self):
 209        """one
 210        indent"""
 211
-212    def qux(self):
+212    def qux(self):
 213        """
 214        two
 215        indents
 216        """
 217
 218    @lru_cache()
-219    def foo_decorated(self):
+219    def foo_decorated(self):
 220        """no indents"""
 221
 222    @lru_cache()
 223    # comment
-224    def foo_commented(self):
+224    def foo_commented(self):
 225        """no indents"""
 226
 227    @lru_cache()
-228    def bar_decorated(self):
+228    def bar_decorated(self):
 229        """no
 230indents"""
 231
 232    @lru_cache()
-233    def baz_decorated(self):
+233    def baz_decorated(self):
 234        """one
 235        indent"""
 236
 237    @lru_cache()
-238    def qux_decorated(self):
+238    def qux_decorated(self):
 239        """
 240        two
 241        indents
@@ -1460,7 +1460,7 @@ 

244 @lru_cache( 245 maxsize=42 246 ) -247 def quux_decorated(self): +247 def quux_decorated(self): 248 """multi-line decorator, https://github.com/mitmproxy/pdoc/issues/246"""

@@ -1478,7 +1478,7 @@

-
201    def foo(self):
+            
201    def foo(self):
 202        """no indents"""
 
@@ -1499,7 +1499,7 @@

-
204    def bar(self):
+            
204    def bar(self):
 205        """no
 206indents"""
 
@@ -1522,7 +1522,7 @@

-
208    def baz(self):
+            
208    def baz(self):
 209        """one
 210        indent"""
 
@@ -1545,7 +1545,7 @@

-
212    def qux(self):
+            
212    def qux(self):
 213        """
 214        two
 215        indents
@@ -1572,7 +1572,7 @@ 

218    @lru_cache()
-219    def foo_decorated(self):
+219    def foo_decorated(self):
 220        """no indents"""
 
@@ -1596,7 +1596,7 @@

222    @lru_cache()
 223    # comment
-224    def foo_commented(self):
+224    def foo_commented(self):
 225        """no indents"""
 
@@ -1619,7 +1619,7 @@

227    @lru_cache()
-228    def bar_decorated(self):
+228    def bar_decorated(self):
 229        """no
 230indents"""
 
@@ -1644,7 +1644,7 @@

232    @lru_cache()
-233    def baz_decorated(self):
+233    def baz_decorated(self):
 234        """one
 235        indent"""
 
@@ -1669,7 +1669,7 @@

237    @lru_cache()
-238    def qux_decorated(self):
+238    def qux_decorated(self):
 239        """
 240        two
 241        indents
@@ -1698,7 +1698,7 @@ 

244    @lru_cache(
 245        maxsize=42
 246    )
-247    def quux_decorated(self):
+247    def quux_decorated(self):
 248        """multi-line decorator, https://github.com/mitmproxy/pdoc/issues/246"""
 
@@ -1721,7 +1721,7 @@

255@_protected_decorator
-256def fun_with_protected_decorator():
+256def fun_with_protected_decorator():
 257    """This function has a protected decorator (name starting with a single `_`)."""
 
@@ -1755,10 +1755,10 @@

-
269class AbstractClass(metaclass=abc.ABCMeta):
+            
269class AbstractClass(metaclass=abc.ABCMeta):
 270    """This class shouldn't show a constructor as it's abstract."""
 271    @abc.abstractmethod
-272    def foo(self):
+272    def foo(self):
 273        pass
 
@@ -1780,7 +1780,7 @@

271    @abc.abstractmethod
-272    def foo(self):
+272    def foo(self):
 273        pass
 
@@ -1800,7 +1800,7 @@

-
279    def add_func(b: int) -> int:
+            
279    def add_func(b: int) -> int:
 280        """This function adds two numbers."""
 281        return a + b
 
@@ -1822,7 +1822,7 @@

-
279    def add_func(b: int) -> int:
+            
279    def add_func(b: int) -> int:
 280        """This function adds two numbers."""
 281        return a + b
 
@@ -1844,7 +1844,7 @@

-
279    def add_func(b: int) -> int:
+            
279    def add_func(b: int) -> int:
 280        """This function adds two numbers."""
 281        return a + b
 
@@ -1866,7 +1866,7 @@

-
293def linkify_links():
+            
293def linkify_links():
 294    """
 295    This docstring contains links that are also identifiers:
 296
@@ -1905,8 +1905,8 @@ 

-
311class Issue352a(metaclass=Issue352aMeta):
-312    def __init__(self):
+            
311class Issue352a(metaclass=Issue352aMeta):
+312    def __init__(self):
 313        """Issue352.__init__ should be preferred over Meta.__call__."""
 
@@ -1923,7 +1923,7 @@

-
312    def __init__(self):
+            
312    def __init__(self):
 313        """Issue352.__init__ should be preferred over Meta.__call__."""
 
@@ -1945,7 +1945,7 @@

-
321class Issue352b(metaclass=Issue352bMeta):
+            
321class Issue352b(metaclass=Issue352bMeta):
 322    """No docstrings for the constructor here."""
 
@@ -1966,7 +1966,7 @@

-
330class CustomCall(metaclass=CustomCallMeta):
+            
330class CustomCall(metaclass=CustomCallMeta):
 331    """A class where the constructor is defined by its metaclass."""
 
@@ -1985,7 +1985,7 @@

-
326    def __call__(cls, *args, **kwargs):
+            
326    def __call__(cls, *args, **kwargs):
 327        """Custom docstring in metaclass.`__call__`"""
 
@@ -2007,7 +2007,7 @@

-
334class Headings:
+            
334class Headings:
 335    """
 336    # Heading 1
 337
@@ -2075,7 +2075,7 @@ 
Heading 6
-
368def repr_not_syntax_highlightable(x=CustomRepr()):
+            
368def repr_not_syntax_highlightable(x=CustomRepr()):
 369    """The default value for x fails to highlight with pygments."""
 
@@ -2096,9 +2096,9 @@
Heading 6
-
372class ClassDecorator:
+            
372class ClassDecorator:
 373    """This is a class that wraps a function. It will be documented correctly."""
-374    def __init__(self, func):
+374    def __init__(self, func):
 375        self._func = func
 
@@ -2117,7 +2117,7 @@
Heading 6
-
374    def __init__(self, func):
+            
374    def __init__(self, func):
 375        self._func = func
 
@@ -2151,11 +2151,11 @@
Heading 6
-
384class SubclassRef:
-385    class SubClass:
+            
384class SubclassRef:
+385    class SubClass:
 386        pass
 387
-388    def __init__(self, x: "SubClass"):
+388    def __init__(self, x: "SubClass"):
 389        print(x)
 
@@ -2172,7 +2172,7 @@
Heading 6
-
388    def __init__(self, x: "SubClass"):
+            
388    def __init__(self, x: "SubClass"):
 389        print(x)
 
@@ -2192,7 +2192,7 @@
Heading 6
-
385    class SubClass:
+            
385    class SubClass:
 386        pass
 
@@ -2211,7 +2211,7 @@
Heading 6
-
392class ClassAsAttribute:
+            
392class ClassAsAttribute:
 393    static_attr_to_class = ClassDecorator
 394    """this is a static attribute that point to a Class (not an instance)"""
 395
@@ -2262,7 +2262,7 @@ 
Heading 6
-
400class scheduler(sched.scheduler):
+            
400class scheduler(sched.scheduler):
 401    """Test for broken links for inherited methods, https://github.com/mitmproxy/pdoc/issues/490"""
 
@@ -2283,7 +2283,7 @@
Heading 6
-
404class __init__:
+            
404class __init__:
 405    """https://github.com/mitmproxy/pdoc/issues/519"""
 
@@ -2304,7 +2304,7 @@
Heading 6
-
408def dynamically_modify_docstring1():
+            
408def dynamically_modify_docstring1():
 409    """this should **not** be the docstring."""
 
@@ -2325,7 +2325,7 @@
Heading 6
-
412def dynamically_modify_docstring2():
+            
412def dynamically_modify_docstring2():
 413    pass
 
@@ -2347,7 +2347,7 @@
Heading 6
425@_docstring_modifier
-426def dynamically_modify_docstring3():
+426def dynamically_modify_docstring3():
 427    """This should **not** be the docstring."""
 
@@ -2369,7 +2369,7 @@
Heading 6
430@_docstring_modifier
-431def dynamically_modify_docstring4():
+431def dynamically_modify_docstring4():
 432    pass
 
@@ -2390,8 +2390,8 @@
Heading 6
-
435class DocstringFromNew:
-436    def __new__(cls, *args, **kwargs):
+            
435class DocstringFromNew:
+436    def __new__(cls, *args, **kwargs):
 437        """This is a class with a docstring inferred from `__new__`."""
 
@@ -2408,7 +2408,7 @@
Heading 6
-
436    def __new__(cls, *args, **kwargs):
+            
436    def __new__(cls, *args, **kwargs):
 437        """This is a class with a docstring inferred from `__new__`."""
 
@@ -2430,9 +2430,9 @@
Heading 6
-
444class SingleDispatchMethodExample:
+            
444class SingleDispatchMethodExample:
 445    @functools.singledispatchmethod
-446    def fancymethod(self, str_or_int: Union[str, int]):
+446    def fancymethod(self, str_or_int: Union[str, int]):
 447        """A fancy method which is capable of handling either `str` or `int`.
 448
 449        :param str_or_int: string or integer to handle
@@ -2440,7 +2440,7 @@ 
Heading 6
451 raise NotImplementedError(f"{type(str_or_int)=} not implemented!") 452 453 @fancymethod.register -454 def fancymethod_handle_str(self, str_to_handle: str): +454 def fancymethod_handle_str(self, str_to_handle: str): 455 """Fancy method handles a string. 456 457 :param str_to_handle: string which will be handled @@ -2448,7 +2448,7 @@
Heading 6
459 print(f"{type(str_to_handle)} = '{str_to_handle}") 460 461 @fancymethod.register -462 def _fancymethod_handle_int(self, int_to_handle: int): +462 def _fancymethod_handle_int(self, int_to_handle: int): 463 """Fancy method handles int (not shown in doc). 464 465 :param int_to_handle: int which will be handled @@ -2472,7 +2472,7 @@
Heading 6
445    @functools.singledispatchmethod
-446    def fancymethod(self, str_or_int: Union[str, int]):
+446    def fancymethod(self, str_or_int: Union[str, int]):
 447        """A fancy method which is capable of handling either `str` or `int`.
 448
 449        :param str_or_int: string or integer to handle
@@ -2505,7 +2505,7 @@ 
Parameters
453    @fancymethod.register
-454    def fancymethod_handle_str(self, str_to_handle: str):
+454    def fancymethod_handle_str(self, str_to_handle: str):
 455        """Fancy method handles a string.
 456
 457        :param str_to_handle: string which will be handled
@@ -2539,7 +2539,7 @@ 
Parameters
470@dataclass(init=False)
-471class DataclassStructure(Structure):
+471class DataclassStructure(Structure):
 472    """DataclassStructure raises for `inspect.signature`."""
 
diff --git a/test/testdata/misc_py310.html b/test/testdata/misc_py310.html index f27f23fd..8a29352d 100644 --- a/test/testdata/misc_py310.html +++ b/test/testdata/misc_py310.html @@ -59,14 +59,14 @@

-
 1from typing import Dict
+                        
 1from typing import Dict
  2
  3
- 4def new_union(a: int | dict[str, "Foo"]) -> bool | None:
+ 4def new_union(a: int | dict[str, "Foo"]) -> bool | None:
  5    """Testing Python 3.10's new type union syntax."""
  6
  7
- 8class Foo:
+ 8class Foo:
  9    pass
 10
 11
@@ -90,7 +90,7 @@ 

-
5def new_union(a: int | dict[str, "Foo"]) -> bool | None:
+            
5def new_union(a: int | dict[str, "Foo"]) -> bool | None:
 6    """Testing Python 3.10's new type union syntax."""
 
@@ -111,7 +111,7 @@

-
 9class Foo:
+            
 9class Foo:
 10    pass
 
diff --git a/test/testdata/misc_py312.html b/test/testdata/misc_py312.html index 7942eff3..e7b4ccaa 100755 --- a/test/testdata/misc_py312.html +++ b/test/testdata/misc_py312.html @@ -79,10 +79,10 @@

4Testing features that either are 3.12+ only or render slightly different on 3.12. 5""" 6 - 7from __future__ import annotations + 7from __future__ import annotations 8 - 9import typing -10from typing import NamedTuple + 9import typing +10from typing import NamedTuple 11 12# Testing the new Python 3.12 `type` statement. 13type MyType = int @@ -102,7 +102,7 @@

27# the typing version is superior for documentation and a drop-in replacement. 28 29 -30class NamedTupleExample(NamedTuple): +30class NamedTupleExample(NamedTuple): 31 """ 32 An example for a typing.NamedTuple. 33 """ @@ -178,7 +178,7 @@

-
31class NamedTupleExample(NamedTuple):
+            
31class NamedTupleExample(NamedTuple):
 32    """
 33    An example for a typing.NamedTuple.
 34    """
diff --git a/test/testdata/misc_py313.html b/test/testdata/misc_py313.html
index c9f3ba97..9a85a327 100644
--- a/test/testdata/misc_py313.html
+++ b/test/testdata/misc_py313.html
@@ -59,19 +59,19 @@ 

-
 1from warnings import deprecated
+                        
 1from warnings import deprecated
  2
  3
- 4class MyDict(dict):
+ 4class MyDict(dict):
  5    pass
  6
  7
- 8class CustomException(RuntimeError):
+ 8class CustomException(RuntimeError):
  9    """custom exception type"""
 10
 11
 12@deprecated("Do not use this anymore")
-13def deprecated_func():
+13def deprecated_func():
 14    pass
 
@@ -88,7 +88,7 @@

-
5class MyDict(dict):
+            
5class MyDict(dict):
 6    pass
 
@@ -107,7 +107,7 @@

-
 9class CustomException(RuntimeError):
+            
 9class CustomException(RuntimeError):
 10    """custom exception type"""
 
@@ -130,7 +130,7 @@

13@deprecated("Do not use this anymore")
-14def deprecated_func():
+14def deprecated_func():
 15    pass
 
diff --git a/test/testdata/pyo3_sample_library.html b/test/testdata/pyo3_sample_library.html index 794d639b..2b3fa23e 100644 --- a/test/testdata/pyo3_sample_library.html +++ b/test/testdata/pyo3_sample_library.html @@ -50,7 +50,7 @@

-
1from .pdoc_pyo3_sample_library import *
+                        
1from .pdoc_pyo3_sample_library import *
 2
 3__doc__ = pdoc_pyo3_sample_library.__doc__
 4if hasattr(pdoc_pyo3_sample_library, "__all__"):
diff --git a/test/testdata/render_options.html b/test/testdata/render_options.html
index 9145d56c..1e82ec2a 100644
--- a/test/testdata/render_options.html
+++ b/test/testdata/render_options.html
@@ -134,7 +134,7 @@ 

Using Math in Docstrings

You can either escape a backslash with a second backslash:

-
def foo():
+
def foo():
     &quot;&quot;&quot;docstring with $\\frac{x}{y}$.&quot;&quot;&quot;
 
@@ -144,7 +144,7 @@

Using Math in Docstrings

where backslashes are not processed:

-
def foo():
+
def foo():
     r&quot;&quot;&quot;raw docstring with $\frac{x}{y}$.&quot;&quot;&quot;
 
diff --git a/test/testdata/top_level_reimports.html b/test/testdata/top_level_reimports.html index cf429d89..34147cbd 100644 --- a/test/testdata/top_level_reimports.html +++ b/test/testdata/top_level_reimports.html @@ -83,9 +83,9 @@

7 - `top_level_reimports._internal.baz()` 8""" 9 -10from ._internal import Bar -11from ._internal import Foo -12from ._internal import baz +10from ._internal import Bar +11from ._internal import Foo +12from ._internal import baz 13 14__all__ = ["Foo", "Bar", "baz"]

@@ -103,8 +103,8 @@

-
2class Foo:
-3    class FooSub:
+            
2class Foo:
+3    class FooSub:
 4        pass
 
@@ -123,7 +123,7 @@

-
3    class FooSub:
+            
3    class FooSub:
 4        pass
 
@@ -142,7 +142,7 @@

-
7class Bar(Foo):
+            
7class Bar(Foo):
 8    pass
 
@@ -161,7 +161,7 @@

-
11def baz(f: Foo) -> Foo.FooSub:
+            
11def baz(f: Foo) -> Foo.FooSub:
 12    raise NotImplementedError
 
diff --git a/test/testdata/type_checking_imports.html b/test/testdata/type_checking_imports.html index 26dfe9ad..2aeab16f 100755 --- a/test/testdata/type_checking_imports.html +++ b/test/testdata/type_checking_imports.html @@ -56,26 +56,26 @@

-
 1from __future__ import annotations
+                        
 1from __future__ import annotations
  2
- 3import typing
- 4from typing import TYPE_CHECKING
+ 3import typing
+ 4from typing import TYPE_CHECKING
  5
- 6from . import cached_submodule
+ 6from . import cached_submodule
  7
  8if typing.TYPE_CHECKING:
- 9    from typing import Sequence
+ 9    from typing import Sequence
 10
 11if TYPE_CHECKING:
-12    from typing import Dict
+12    from typing import Dict
 13
-14    from .cached_submodule import StrOrInt
-15    from .uncached_submodule import StrOrBool
+14    from .cached_submodule import StrOrInt
+15    from .uncached_submodule import StrOrBool
 16
 17assert cached_submodule
 18
 19
-20def foo(a: Sequence[str], b: Dict[str, str]):
+20def foo(a: Sequence[str], b: Dict[str, str]):
 21    """A method with TYPE_CHECKING type annotations."""
 22
 23
@@ -111,7 +111,7 @@ 

-
21def foo(a: Sequence[str], b: Dict[str, str]):
+            
21def foo(a: Sequence[str], b: Dict[str, str]):
 22    """A method with TYPE_CHECKING type annotations."""
 
diff --git a/test/testdata/type_stubs.html b/test/testdata/type_stubs.html index 5a432c59..89964291 100644 --- a/test/testdata/type_stubs.html +++ b/test/testdata/type_stubs.html @@ -92,10 +92,10 @@

2This module has an accompanying .pyi file with type stubs. 3""" 4 - 5from ._utils import ImportedClass + 5from ._utils import ImportedClass 6 7 - 8def func(x, y): + 8def func(x, y): 9 """A simple function.""" 10 11 @@ -103,24 +103,24 @@

13"""A simple variable.""" 14 15 -16class Class: +16class Class: 17 attr = 42 18 """An attribute""" 19 -20 def meth(self, y): +20 def meth(self, y): 21 """A simple method.""" 22 -23 class Subclass: +23 class Subclass: 24 attr = "42" 25 """An attribute""" 26 -27 def meth(self, y): +27 def meth(self, y): 28 """A simple method.""" 29 -30 def no_type_annotation(self, z): +30 def no_type_annotation(self, z): 31 """A method not present in the .pyi file.""" 32 -33 def overloaded(self, x): +33 def overloaded(self, x): 34 """An overloaded method.""" 35 36 @@ -145,7 +145,7 @@

-
 9def func(x, y):
+            
 9def func(x, y):
 10    """A simple function."""
 
@@ -180,24 +180,24 @@

-
17class Class:
+            
17class Class:
 18    attr = 42
 19    """An attribute"""
 20
-21    def meth(self, y):
+21    def meth(self, y):
 22        """A simple method."""
 23
-24    class Subclass:
+24    class Subclass:
 25        attr = "42"
 26        """An attribute"""
 27
-28        def meth(self, y):
+28        def meth(self, y):
 29            """A simple method."""
 30
-31    def no_type_annotation(self, z):
+31    def no_type_annotation(self, z):
 32        """A method not present in the .pyi file."""
 33
-34    def overloaded(self, x):
+34    def overloaded(self, x):
 35        """An overloaded method."""
 
@@ -229,7 +229,7 @@

-
21    def meth(self, y):
+            
21    def meth(self, y):
 22        """A simple method."""
 
@@ -250,7 +250,7 @@

-
31    def no_type_annotation(self, z):
+            
31    def no_type_annotation(self, z):
 32        """A method not present in the .pyi file."""
 
@@ -271,7 +271,7 @@

-
34    def overloaded(self, x):
+            
34    def overloaded(self, x):
 35        """An overloaded method."""
 
@@ -293,11 +293,11 @@

-
24    class Subclass:
+            
24    class Subclass:
 25        attr = "42"
 26        """An attribute"""
 27
-28        def meth(self, y):
+28        def meth(self, y):
 29            """A simple method."""
 
@@ -329,7 +329,7 @@

-
28        def meth(self, y):
+            
28        def meth(self, y):
 29            """A simple method."""
 
@@ -351,7 +351,7 @@

-
2class ImportedClass:
+            
2class ImportedClass:
 3    """Docstring from imported py file - ideally this should be overridden."""
 
diff --git a/test/testdata/typed_dict.html b/test/testdata/typed_dict.html index 100ef3bb..3efe753d 100644 --- a/test/testdata/typed_dict.html +++ b/test/testdata/typed_dict.html @@ -74,16 +74,16 @@

-
 1from typing import Optional
- 2from typing import TypedDict
+                        
 1from typing import Optional
+ 2from typing import TypedDict
  3
  4
- 5class Foo(TypedDict):
+ 5class Foo(TypedDict):
  6    a: Optional[int]
  7    """First attribute."""
  8
  9
-10class Bar(Foo, total=False):
+10class Bar(Foo, total=False):
 11    """A TypedDict subclass. Before 3.12, TypedDict botches __mro__."""
 12
 13    b: int
@@ -92,7 +92,7 @@ 

16 # undocumented attribute 17 18 -19class Baz(Bar): +19class Baz(Bar): 20 """A TypedDict subsubclass.""" 21 22 d: bool @@ -112,7 +112,7 @@

-
6class Foo(TypedDict):
+            
6class Foo(TypedDict):
 7    a: Optional[int]
 8    """First attribute."""
 
@@ -145,7 +145,7 @@

-
11class Bar(Foo, total=False):
+            
11class Bar(Foo, total=False):
 12    """A TypedDict subclass. Before 3.12, TypedDict botches __mro__."""
 13
 14    b: int
@@ -204,7 +204,7 @@ 
Inherited Members
-
20class Baz(Bar):
+            
20class Baz(Bar):
 21    """A TypedDict subsubclass."""
 22
 23    d: bool
diff --git a/test/testdata/visibility.html b/test/testdata/visibility.html
index ebf6efc0..8effd7a0 100644
--- a/test/testdata/visibility.html
+++ b/test/testdata/visibility.html
@@ -64,37 +64,37 @@ 

5""" 6 7 - 8class Undocumented: + 8class Undocumented: 9 # Not shown because no docstring. 10 pass 11 12 -13def public_func_marked_private(): +13def public_func_marked_private(): 14 """ 15 This is a public method that's not shown because it's marked as @private. 16 """ 17 18 -19def _protected_func(): +19def _protected_func(): 20 """ 21 This is a protected method that's not shown because its name starts with _. 22 """ 23 24 -25def __private_func(): +25def __private_func(): 26 """ 27 This is a private method that's not shown because its name starts with __. 28 """ 29 30 -31def __private_func_explicitly_public(): +31def __private_func_explicitly_public(): 32 """@public 33 This is a private method that's shown because it is explicitly marked 34 as public. 35 """ 36 37 -38def public_func(): +38def public_func(): 39 """ 40 This is another public method that's shown. It should show without additional 41 whitespace above. @@ -114,7 +114,7 @@

-
32def __private_func_explicitly_public():
+            
32def __private_func_explicitly_public():
 33    """@public
 34    This is a private method that's shown because it is explicitly marked
 35    as public.
@@ -139,7 +139,7 @@ 

-
39def public_func():
+            
39def public_func():
 40    """
 41    This is another public method that's shown. It should show without additional
 42    whitespace above.
diff --git a/uv.lock b/uv.lock
index 3a95c4b4..1c5525b4 100644
--- a/uv.lock
+++ b/uv.lock
@@ -3,20 +3,20 @@ requires-python = ">=3.9"
 
 [[package]]
 name = "attrs"
-version = "24.2.0"
+version = "25.3.0"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678 }
+sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 },
+    { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 },
 ]
 
 [[package]]
 name = "cachetools"
-version = "5.5.0"
+version = "5.5.2"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/c3/38/a0f315319737ecf45b4319a8cd1f3a908e29d9277b46942263292115eee7/cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a", size = 27661 }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/a4/07/14f8ad37f2d12a5ce41206c21820d8cb6561b728e51fad4530dff0552a67/cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", size = 9524 },
+    { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 },
 ]
 
 [[package]]
@@ -39,71 +39,72 @@ wheels = [
 
 [[package]]
 name = "coverage"
-version = "7.6.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/9a/60/e781e8302e7b28f21ce06e30af077f856aa2cb4cf2253287dae9a593d509/coverage-7.6.2.tar.gz", hash = "sha256:a5f81e68aa62bc0cfca04f7b19eaa8f9c826b53fc82ab9e2121976dc74f131f3", size = 797872 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/16/14/fb75c01b8427fb567c90ce920c90ed2bd314ad6960d54e8b377928607fd1/coverage-7.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9df1950fb92d49970cce38100d7e7293c84ed3606eaa16ea0b6bc27175bb667", size = 206561 },
-    { url = "https://files.pythonhosted.org/packages/93/b4/dcbf15f5583507415d0a78ce206e19d76699f1161e8b1ff6e1a21e9f9743/coverage-7.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:24500f4b0e03aab60ce575c85365beab64b44d4db837021e08339f61d1fbfe52", size = 206994 },
-    { url = "https://files.pythonhosted.org/packages/47/ee/57d607e14479fb760721ea1784608ade532665934bd75f260b250dc6c877/coverage-7.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a663b180b6669c400b4630a24cc776f23a992d38ce7ae72ede2a397ce6b0f170", size = 235429 },
-    { url = "https://files.pythonhosted.org/packages/76/e1/cd263fd750fdb115aab11a086e3584d99d46fca1f201b5493cc3972aea28/coverage-7.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfde025e2793a22efe8c21f807d276bd1d6a4bcc5ba6f19dbdfc4e7a12160909", size = 233329 },
-    { url = "https://files.pythonhosted.org/packages/30/3b/a1623d50fcd6ba532cef0c3c1059eec2a08a311676ffa84dbe4beb2b8a33/coverage-7.6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087932079c065d7b8ebadd3a0160656c55954144af6439886c8bcf78bbbcde7f", size = 234491 },
-    { url = "https://files.pythonhosted.org/packages/b1/a6/8f3b3fd1f9b9400f3df38a7159362622546e2d951cc4984cf4617d0fd4d7/coverage-7.6.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9c6b0c1cafd96213a0327cf680acb39f70e452caf8e9a25aeb05316db9c07f89", size = 233589 },
-    { url = "https://files.pythonhosted.org/packages/e3/40/37d64093f57b372435d87679956607ecab066d2aede76c6d215815a35fa3/coverage-7.6.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6e85830eed5b5263ffa0c62428e43cb844296f3b4461f09e4bdb0d44ec190bc2", size = 232050 },
-    { url = "https://files.pythonhosted.org/packages/80/63/cbb76298b4f42bffe0030f1bc129a26a26255857c6beaa20419259ac07cc/coverage-7.6.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62ab4231c01e156ece1b3a187c87173f31cbeee83a5e1f6dff17f288dca93345", size = 233180 },
-    { url = "https://files.pythonhosted.org/packages/7a/6a/eafa81503e905d473b799920927b06aa6ffba12db035fc98735b55bc1741/coverage-7.6.2-cp310-cp310-win32.whl", hash = "sha256:7b80fbb0da3aebde102a37ef0138aeedff45997e22f8962e5f16ae1742852676", size = 209281 },
-    { url = "https://files.pythonhosted.org/packages/19/d1/6b354c2cd52e0244944c097aaa71896869878df999f5f8e75fcd37eaf0f3/coverage-7.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:d20c3d1f31f14d6962a4e2f549c21d31e670b90f777ef4171be540fb7fb70f02", size = 210092 },
-    { url = "https://files.pythonhosted.org/packages/a5/29/72da824da4182f518b054c21552b7ed2473a4e4c6ac616298209808a1a5c/coverage-7.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb21bac7783c1bf6f4bbe68b1e0ff0d20e7e7732cfb7995bc8d96e23aa90fc7b", size = 206667 },
-    { url = "https://files.pythonhosted.org/packages/23/52/c15dcf3cf575256c7c0992e441cd41092a6c519d65abe1eb5567aab3d8e8/coverage-7.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7b2e437fbd8fae5bc7716b9c7ff97aecc95f0b4d56e4ca08b3c8d8adcaadb84", size = 207111 },
-    { url = "https://files.pythonhosted.org/packages/92/61/0d46dc26cf9f711b7b6078a54680665a5c2d62ec15991adb51e79236c699/coverage-7.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:536f77f2bf5797983652d1d55f1a7272a29afcc89e3ae51caa99b2db4e89d658", size = 239050 },
-    { url = "https://files.pythonhosted.org/packages/3b/cb/9de71bade0343a0793f645f78a0e409248d85a2e5b4c4a9a1697c3b2e3d2/coverage-7.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f361296ca7054f0936b02525646b2731b32c8074ba6defab524b79b2b7eeac72", size = 236454 },
-    { url = "https://files.pythonhosted.org/packages/f2/81/b0dc02487447c4a56cf2eed5c57735097f77aeff582277a35f1f70713a8d/coverage-7.6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7926d8d034e06b479797c199747dd774d5e86179f2ce44294423327a88d66ca7", size = 238320 },
-    { url = "https://files.pythonhosted.org/packages/60/90/76815a76234050a87d0d1438a34820c1b857dd17353855c02bddabbedea8/coverage-7.6.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0bbae11c138585c89fb4e991faefb174a80112e1a7557d507aaa07675c62e66b", size = 237250 },
-    { url = "https://files.pythonhosted.org/packages/f6/bd/760a599c08c882d97382855264586bba2604901029c3f6bec5710477ae81/coverage-7.6.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fcad7d5d2bbfeae1026b395036a8aa5abf67e8038ae7e6a25c7d0f88b10a8e6a", size = 235880 },
-    { url = "https://files.pythonhosted.org/packages/83/de/41c3b90a779e473ae1ca325542aa5fa5464b7d2061288e9c22ba5f1deaa3/coverage-7.6.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f01e53575f27097d75d42de33b1b289c74b16891ce576d767ad8c48d17aeb5e0", size = 236653 },
-    { url = "https://files.pythonhosted.org/packages/f4/90/61fe2721b9a9d9446e6c3ca33b6569e81d2a9a795ddfe786a66bf54035b7/coverage-7.6.2-cp311-cp311-win32.whl", hash = "sha256:7781f4f70c9b0b39e1b129b10c7d43a4e0c91f90c60435e6da8288efc2b73438", size = 209251 },
-    { url = "https://files.pythonhosted.org/packages/96/87/d586f2b12b98288fc874d366cd8d5601f5a374cb75853647a3e4d02e4eb0/coverage-7.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:9bcd51eeca35a80e76dc5794a9dd7cb04b97f0e8af620d54711793bfc1fbba4b", size = 210083 },
-    { url = "https://files.pythonhosted.org/packages/3f/ac/1cca5ed5cf512a71cdd6e3afb75a5ef196f7ef9772be9192dadaaa5cfc1c/coverage-7.6.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ebc94fadbd4a3f4215993326a6a00e47d79889391f5659bf310f55fe5d9f581c", size = 206856 },
-    { url = "https://files.pythonhosted.org/packages/e4/58/030354d250f107a95e7aca24c7fd238709a3c7df3083cb206368798e637a/coverage-7.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9681516288e3dcf0aa7c26231178cc0be6cac9705cac06709f2353c5b406cfea", size = 207098 },
-    { url = "https://files.pythonhosted.org/packages/03/df/5f2cd6048d44a54bb5f58f8ece4efbc5b686ed49f8bd8dbf41eb2a6a687f/coverage-7.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d9c5d13927d77af4fbe453953810db766f75401e764727e73a6ee4f82527b3e", size = 240109 },
-    { url = "https://files.pythonhosted.org/packages/d3/18/7c53887643d921faa95529643b1b33e60ebba30ab835c8b5abd4e54d946b/coverage-7.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92f9ca04b3e719d69b02dc4a69debb795af84cb7afd09c5eb5d54b4a1ae2191", size = 237141 },
-    { url = "https://files.pythonhosted.org/packages/d2/79/339bdf597d128374e6150c089b37436ba694585d769cabf6d5abd73a1365/coverage-7.6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ff2ef83d6d0b527b5c9dad73819b24a2f76fdddcfd6c4e7a4d7e73ecb0656b4", size = 239210 },
-    { url = "https://files.pythonhosted.org/packages/a9/62/7310c6de2bcb8a42f91094d41f0d4793ccda5a54621be3db76a156556cf2/coverage-7.6.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47ccb6e99a3031ffbbd6e7cc041e70770b4fe405370c66a54dbf26a500ded80b", size = 238698 },
-    { url = "https://files.pythonhosted.org/packages/f2/cb/ccb23c084d7f581f770dc7ed547dc5b50763334ad6ce26087a9ad0b5b26d/coverage-7.6.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a867d26f06bcd047ef716175b2696b315cb7571ccb951006d61ca80bbc356e9e", size = 237000 },
-    { url = "https://files.pythonhosted.org/packages/e7/ab/58de9e2f94e4dc91b84d6e2705aa1e9d5447a2669fe113b4bbce6d2224a1/coverage-7.6.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cdfcf2e914e2ba653101157458afd0ad92a16731eeba9a611b5cbb3e7124e74b", size = 238666 },
-    { url = "https://files.pythonhosted.org/packages/6c/dc/8be87b9ed5dbd4892b603f41088b41982768e928734e5bdce67d2ddd460a/coverage-7.6.2-cp312-cp312-win32.whl", hash = "sha256:f9035695dadfb397bee9eeaf1dc7fbeda483bf7664a7397a629846800ce6e276", size = 209489 },
-    { url = "https://files.pythonhosted.org/packages/64/3a/3f44e55273a58bfb39b87ad76541bbb81d14de916b034fdb39971cc99ffe/coverage-7.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:5ed69befa9a9fc796fe015a7040c9398722d6b97df73a6b608e9e275fa0932b0", size = 210270 },
-    { url = "https://files.pythonhosted.org/packages/ae/99/c9676a75b57438a19c5174dfcf39798b42728ad56650497286379dc0c2c3/coverage-7.6.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eea60c79d36a8f39475b1af887663bc3ae4f31289cd216f514ce18d5938df40", size = 206888 },
-    { url = "https://files.pythonhosted.org/packages/e0/de/820ecb42e892049c5f384430e98b35b899da3451dd0cdb2f867baf26abfa/coverage-7.6.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa68a6cdbe1bc6793a9dbfc38302c11599bbe1837392ae9b1d238b9ef3dafcf1", size = 207142 },
-    { url = "https://files.pythonhosted.org/packages/dd/59/81fc7ad855d65eeb68fe9e7809cbb339946adb07be7ac32d3fc24dc17bd7/coverage-7.6.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec528ae69f0a139690fad6deac8a7d33629fa61ccce693fdd07ddf7e9931fba", size = 239658 },
-    { url = "https://files.pythonhosted.org/packages/cd/a7/865de3eb9e78ffbf7afd92f86d2580b18edfb6f0481bd3c39b205e05a762/coverage-7.6.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed5ac02126f74d190fa2cc14a9eb2a5d9837d5863920fa472b02eb1595cdc925", size = 236802 },
-    { url = "https://files.pythonhosted.org/packages/36/94/3b8f3abf88b7c451f97fd14c98f536bcee364e74250d928d57cc97c38ddd/coverage-7.6.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21c0ea0d4db8a36b275cb6fb2437a3715697a4ba3cb7b918d3525cc75f726304", size = 238793 },
-    { url = "https://files.pythonhosted.org/packages/d5/4b/57f95e41a10525002f524f3dbd577a3a9871d67998f8a8eb192fe697dc7b/coverage-7.6.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35a51598f29b2a19e26d0908bd196f771a9b1c5d9a07bf20be0adf28f1ad4f77", size = 238455 },
-    { url = "https://files.pythonhosted.org/packages/99/c9/9fbe5b841628e1d9030c8044844afef4f4735586289eb9237eeb5b97f0d7/coverage-7.6.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c9192925acc33e146864b8cf037e2ed32a91fdf7644ae875f5d46cd2ef086a5f", size = 236538 },
-    { url = "https://files.pythonhosted.org/packages/43/0d/2200a0d447e30de94d48e4851c04d8dce37340815e7eda27457a7043c037/coverage-7.6.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf4eeecc9e10f5403ec06138978235af79c9a79af494eb6b1d60a50b49ed2869", size = 238383 },
-    { url = "https://files.pythonhosted.org/packages/ec/8a/106c66faafb4a87002b698769d6de3c4db0b6c29a7aeb72de13b893c333e/coverage-7.6.2-cp313-cp313-win32.whl", hash = "sha256:e4ee15b267d2dad3e8759ca441ad450c334f3733304c55210c2a44516e8d5530", size = 209551 },
-    { url = "https://files.pythonhosted.org/packages/c4/f5/1b39e2faaf5b9cc7eed568c444df5991ce7ff7138e2e735a6801be1bdadb/coverage-7.6.2-cp313-cp313-win_amd64.whl", hash = "sha256:c71965d1ced48bf97aab79fad56df82c566b4c498ffc09c2094605727c4b7e36", size = 210282 },
-    { url = "https://files.pythonhosted.org/packages/79/a3/8dd4e6c09f5286094cd6c7edb115b3fbf06ad8304d45431722a4e3bc2508/coverage-7.6.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7571e8bbecc6ac066256f9de40365ff833553e2e0c0c004f4482facb131820ef", size = 207629 },
-    { url = "https://files.pythonhosted.org/packages/8e/db/a9aa7009bbdc570a235e1ac781c0a83aa323cac6db8f8f13c2127b110978/coverage-7.6.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:078a87519057dacb5d77e333f740708ec2a8f768655f1db07f8dfd28d7a005f0", size = 207902 },
-    { url = "https://files.pythonhosted.org/packages/54/08/d0962be62d4335599ca2ff3a48bb68c9bfb80df74e28ca689ff5f392087b/coverage-7.6.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5e92e3e84a8718d2de36cd8387459cba9a4508337b8c5f450ce42b87a9e760", size = 250617 },
-    { url = "https://files.pythonhosted.org/packages/a5/a2/158570aff1dd88b661a6c11281cbb190e8696e77798b4b2e47c74bfb2f39/coverage-7.6.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebabdf1c76593a09ee18c1a06cd3022919861365219ea3aca0247ededf6facd6", size = 246334 },
-    { url = "https://files.pythonhosted.org/packages/aa/fe/b00428cca325b6585ca77422e4f64d7d86a225b14664b98682ea501efb57/coverage-7.6.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12179eb0575b8900912711688e45474f04ab3934aaa7b624dea7b3c511ecc90f", size = 248692 },
-    { url = "https://files.pythonhosted.org/packages/30/21/0a15fefc13039450bc45e7159f3add92489f004555eb7dab9c7ad4365dd0/coverage-7.6.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:39d3b964abfe1519b9d313ab28abf1d02faea26cd14b27f5283849bf59479ff5", size = 248188 },
-    { url = "https://files.pythonhosted.org/packages/de/b8/5c093526046a8450a7a3d62ad09517cf38e638f6b3ee9433dd6a73360501/coverage-7.6.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:84c4315577f7cd511d6250ffd0f695c825efe729f4205c0340f7004eda51191f", size = 246072 },
-    { url = "https://files.pythonhosted.org/packages/1e/8b/542b607d2cff56e5a90a6948f5a9040b693761d2be2d3c3bf88957b02361/coverage-7.6.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ff797320dcbff57caa6b2301c3913784a010e13b1f6cf4ab3f563f3c5e7919db", size = 247354 },
-    { url = "https://files.pythonhosted.org/packages/95/82/2e9111aa5e59f42b332d387f64e3205c2263518d1e660154d0c9fc54390e/coverage-7.6.2-cp313-cp313t-win32.whl", hash = "sha256:2b636a301e53964550e2f3094484fa5a96e699db318d65398cfba438c5c92171", size = 210194 },
-    { url = "https://files.pythonhosted.org/packages/9d/46/aabe4305cfc57cab4865f788ceceef746c422469720c32ed7a5b44e20f5e/coverage-7.6.2-cp313-cp313t-win_amd64.whl", hash = "sha256:d03a060ac1a08e10589c27d509bbdb35b65f2d7f3f8d81cf2fa199877c7bc58a", size = 211346 },
-    { url = "https://files.pythonhosted.org/packages/6a/a9/85d14426f2449252f302f12c1c2a957a0a7ae7f35317ca3eaa365e1d6453/coverage-7.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c37faddc8acd826cfc5e2392531aba734b229741d3daec7f4c777a8f0d4993e5", size = 206555 },
-    { url = "https://files.pythonhosted.org/packages/71/ff/bc4d5697a55edf1ff077c47df5637ff4518ba2760ada82c142aca79ea3fe/coverage-7.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab31fdd643f162c467cfe6a86e9cb5f1965b632e5e65c072d90854ff486d02cf", size = 206990 },
-    { url = "https://files.pythonhosted.org/packages/34/65/1301721d09f5b58da9decfd62eb42eaef07fdb854dae904c3482e59cc309/coverage-7.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97df87e1a20deb75ac7d920c812e9326096aa00a9a4b6d07679b4f1f14b06c90", size = 235022 },
-    { url = "https://files.pythonhosted.org/packages/9f/ec/7a2f361485226e6934a8f5d1f6eef7e8b7faf228fb6107476fa584700a32/coverage-7.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:343056c5e0737487a5291f5691f4dfeb25b3e3c8699b4d36b92bb0e586219d14", size = 232943 },
-    { url = "https://files.pythonhosted.org/packages/2d/60/b23e61a372bef93c9d13d87efa2ea3a870130be498e5b81740616b6e6200/coverage-7.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4ef1c56b47b6b9024b939d503ab487231df1f722065a48f4fc61832130b90e", size = 234074 },
-    { url = "https://files.pythonhosted.org/packages/89/ec/4a56d9b310b2413987682ae3a858e30ea11d6f6d05366ecab4d73385fbef/coverage-7.6.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fca4a92c8a7a73dee6946471bce6d1443d94155694b893b79e19ca2a540d86e", size = 233226 },
-    { url = "https://files.pythonhosted.org/packages/8c/77/31ecc00c525dea216d59090b807e9d1268a07d289f9dbe0cfc6795e33b68/coverage-7.6.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69f251804e052fc46d29d0e7348cdc5fcbfc4861dc4a1ebedef7e78d241ad39e", size = 231706 },
-    { url = "https://files.pythonhosted.org/packages/7b/02/3f84bdd286a9db9b816cb5ca0adfa001575f8e496ba39da26f0ded2f0849/coverage-7.6.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e8ea055b3ea046c0f66217af65bc193bbbeca1c8661dc5fd42698db5795d2627", size = 232697 },
-    { url = "https://files.pythonhosted.org/packages/7c/34/158b73026cbc2d2b3a56fbc71d955c0eea52953e49de97f820b3060f62b9/coverage-7.6.2-cp39-cp39-win32.whl", hash = "sha256:6c2ba1e0c24d8fae8f2cf0aeb2fc0a2a7f69b6d20bd8d3749fd6b36ecef5edf0", size = 209278 },
-    { url = "https://files.pythonhosted.org/packages/d1/05/4326e4ea071176f0bddc30b5a3555b48fa96c45a8f6a09b6c2e4041dfcc0/coverage-7.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:2186369a654a15628e9c1c9921409a6b3eda833e4b91f3ca2a7d9f77abb4987c", size = 210057 },
-    { url = "https://files.pythonhosted.org/packages/9d/5c/88f15b7614ba9ed1dbb1c0bd2c9073184b96c2bead0b93199487b44d04b3/coverage-7.6.2-pp39.pp310-none-any.whl", hash = "sha256:667952739daafe9616db19fbedbdb87917eee253ac4f31d70c7587f7ab531b4e", size = 198799 },
+version = "7.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/02/36/465f5492443265e1278f9a82ffe6aeed3f1db779da0d6e7d4611a5cfb6af/coverage-7.7.0.tar.gz", hash = "sha256:cd879d4646055a573775a1cec863d00c9ff8c55860f8b17f6d8eee9140c06166", size = 809969 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/10/f5/2b801fe88f199707cf9ec66dcee036e7073b5a208a4a161b64371b3f1e35/coverage-7.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a538a23119d1e2e2ce077e902d02ea3d8e0641786ef6e0faf11ce82324743944", size = 210608 },
+    { url = "https://files.pythonhosted.org/packages/07/44/bcc030cf977d1069a28742c0a67284c6e831ef172f914055b3d45da83f89/coverage-7.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1586ad158523f4133499a4f322b230e2cfef9cc724820dbd58595a5a236186f4", size = 211042 },
+    { url = "https://files.pythonhosted.org/packages/2c/3f/b427f17e1bcf3e1f5ac42fc0b6cb623616f2aedcfc7fde17a058afb62568/coverage-7.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6c96d69928a3a6767fab8dc1ce8a02cf0156836ccb1e820c7f45a423570d98", size = 240168 },
+    { url = "https://files.pythonhosted.org/packages/58/92/6e8d71c5e651f152ffc518ec4cd7add87035533e88af29e233635c0f0dfb/coverage-7.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f18d47641282664276977c604b5a261e51fefc2980f5271d547d706b06a837f", size = 238079 },
+    { url = "https://files.pythonhosted.org/packages/40/33/1c25ae35c16972dc379c24cd7dde20359d076dee00687825c92a53e43b02/coverage-7.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a1e18a85bd066c7c556d85277a7adf4651f259b2579113844835ba1a74aafd", size = 239216 },
+    { url = "https://files.pythonhosted.org/packages/4d/3d/adf40bdd07a49e1880632c1bc6b31f42d32cf0bfe6b4d294a8f706d70078/coverage-7.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:70f0925c4e2bfc965369f417e7cc72538fd1ba91639cf1e4ef4b1a6b50439b3b", size = 239126 },
+    { url = "https://files.pythonhosted.org/packages/72/a5/51e39811cd0ec0569a25fe8e6bac0a00efa222a3e49d51d64f5ba0dce24a/coverage-7.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b0fac2088ec4aaeb5468b814bd3ff5e5978364bfbce5e567c44c9e2854469f6c", size = 237842 },
+    { url = "https://files.pythonhosted.org/packages/ab/b7/c5796906cd9eed6d258138f1fddc8d6af01b6d07b3c183bac4a9731ac383/coverage-7.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b3e212a894d8ae07fde2ca8b43d666a6d49bbbddb10da0f6a74ca7bd31f20054", size = 238136 },
+    { url = "https://files.pythonhosted.org/packages/d7/8a/bd34ea3c602b3ef323a001d375f9b1d663e901079bb26b5f9b8f96fae32b/coverage-7.7.0-cp310-cp310-win32.whl", hash = "sha256:f32b165bf6dfea0846a9c9c38b7e1d68f313956d60a15cde5d1709fddcaf3bee", size = 213320 },
+    { url = "https://files.pythonhosted.org/packages/94/60/6e7efe849e305a233623a80aaeba7ebb02809fa63ab8a1e49c4323b8083b/coverage-7.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:a2454b12a3f12cc4698f3508912e6225ec63682e2ca5a96f80a2b93cef9e63f3", size = 214219 },
+    { url = "https://files.pythonhosted.org/packages/e8/ec/9e0c9358a3bd56b1ddbf266b889ea9d51ee29e58fb72712d5600663fa806/coverage-7.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a0a207c87a9f743c8072d059b4711f8d13c456eb42dac778a7d2e5d4f3c253a7", size = 210722 },
+    { url = "https://files.pythonhosted.org/packages/be/bd/7b47a4302423a13960ee30682900d7ca20cee15c978b1d9ea9594d59d352/coverage-7.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d673e3add00048215c2cc507f1228a7523fd8bf34f279ac98334c9b07bd2656", size = 211154 },
+    { url = "https://files.pythonhosted.org/packages/c6/7c/ae54d9022440196bf9f3fad535388678a3db186980ff58a4956ddeb849a2/coverage-7.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f81fe93dc1b8e5673f33443c0786c14b77e36f1025973b85e07c70353e46882b", size = 243787 },
+    { url = "https://files.pythonhosted.org/packages/2d/21/913a2a2d89a2221f4410fbea4ff84e64ddf4367a4b9eb2c328bd01a1a401/coverage-7.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8c7524779003d59948c51b4fcbf1ca4e27c26a7d75984f63488f3625c328b9b", size = 241473 },
+    { url = "https://files.pythonhosted.org/packages/40/f1/5ae36fffd542fb86ab3b2d5e012af0840265f3dd001ad0ffabe9e4dbdcf6/coverage-7.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c124025430249118d018dcedc8b7426f39373527c845093132196f2a483b6dd", size = 243259 },
+    { url = "https://files.pythonhosted.org/packages/47/1b/abc87bad7f606a4df321bd8300413fe13700099a163e7d63453c7c70c1b2/coverage-7.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e7f559c36d5cdc448ee13e7e56ed7b6b5d44a40a511d584d388a0f5d940977ba", size = 242904 },
+    { url = "https://files.pythonhosted.org/packages/e0/b3/ff0cf15f5709996727dda2fa00af6f4da92ea3e16168400346f2f742341a/coverage-7.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:37cbc7b0d93dfd133e33c7ec01123fbb90401dce174c3b6661d8d36fb1e30608", size = 241079 },
+    { url = "https://files.pythonhosted.org/packages/05/c9/fcad82aad05b1eb8040e6c25ae7a1303716cc05718d4dd326e0fab31aa14/coverage-7.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7d2a65876274acf544703e943c010b60bd79404e3623a1e5d52b64a6e2728de5", size = 241617 },
+    { url = "https://files.pythonhosted.org/packages/59/9f/d1efe149afa5c3a459c08bf04f7e6917ef4ee8e3440df5c3e87d6b972870/coverage-7.7.0-cp311-cp311-win32.whl", hash = "sha256:f5a2f71d6a91238e7628f23538c26aa464d390cbdedf12ee2a7a0fb92a24482a", size = 213372 },
+    { url = "https://files.pythonhosted.org/packages/88/d2/4b58f03e399185b01fb3168d4b870882de9c7a10e273f99c8f25ec690302/coverage-7.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ae8006772c6b0fa53c33747913473e064985dac4d65f77fd2fdc6474e7cd54e4", size = 214285 },
+    { url = "https://files.pythonhosted.org/packages/b7/47/f7b870caa26082ff8033be074ac61dc175a6b0c965adf7b910f92a6d7cfe/coverage-7.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:056d3017ed67e7ddf266e6f57378ece543755a4c9231e997789ab3bd11392c94", size = 210907 },
+    { url = "https://files.pythonhosted.org/packages/ea/eb/40b39bdc6c1da403257f0fcb2c1b2fd81ff9f66c13abbe3862f42780e1c1/coverage-7.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33c1394d8407e2771547583b66a85d07ed441ff8fae5a4adb4237ad39ece60db", size = 211162 },
+    { url = "https://files.pythonhosted.org/packages/53/08/42a2db41b4646d6261122773e222dd7105e2306526f2d7846de6fee808ec/coverage-7.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fbb7a0c3c21908520149d7751cf5b74eb9b38b54d62997b1e9b3ac19a8ee2fe", size = 245223 },
+    { url = "https://files.pythonhosted.org/packages/78/2a/0ceb328a7e67e8639d5c7800b8161d4b5f489073ac8d5ac33b11eadee218/coverage-7.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb356e7ae7c2da13f404bf8f75be90f743c6df8d4607022e759f5d7d89fe83f8", size = 242114 },
+    { url = "https://files.pythonhosted.org/packages/ba/68/42b13b849d40af1581830ff06c60f4ec84649764f4a58d5c6e20ae11cbd4/coverage-7.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce730d484038e97f27ea2dbe5d392ec5c2261f28c319a3bb266f6b213650135", size = 244371 },
+    { url = "https://files.pythonhosted.org/packages/68/66/ab7c3b9fdbeb8bdd322f5b67b1886463834dba2014a534caba60fb0075ea/coverage-7.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa4dff57fc21a575672176d5ab0ef15a927199e775c5e8a3d75162ab2b0c7705", size = 244134 },
+    { url = "https://files.pythonhosted.org/packages/01/74/b833d299a479681957d6b238e16a0725586e1d56ec1e43658f3184550bb0/coverage-7.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b667b91f4f714b17af2a18e220015c941d1cf8b07c17f2160033dbe1e64149f0", size = 242353 },
+    { url = "https://files.pythonhosted.org/packages/f9/c5/0ed656d65da39bbab8e8fc367dc3d465a7501fea0f2b1caccfb4f6361c9f/coverage-7.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:693d921621a0c8043bfdc61f7d4df5ea6d22165fe8b807cac21eb80dd94e4bbd", size = 243543 },
+    { url = "https://files.pythonhosted.org/packages/87/b5/142bcff3828e4cce5d4c9ddc9222de1664464263acca09638e4eb0dbda7c/coverage-7.7.0-cp312-cp312-win32.whl", hash = "sha256:52fc89602cde411a4196c8c6894afb384f2125f34c031774f82a4f2608c59d7d", size = 213543 },
+    { url = "https://files.pythonhosted.org/packages/29/74/99d226985def03284bad6a9aff27a1079a8881ec7523b5980b00a5260527/coverage-7.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ce8cf59e09d31a4915ff4c3b94c6514af4c84b22c4cc8ad7c3c546a86150a92", size = 214344 },
+    { url = "https://files.pythonhosted.org/packages/45/2f/df6235ec963b9eb6b6b2f3c24f70448f1ffa13b9a481c155a6caff176395/coverage-7.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4545485fef7a8a2d8f30e6f79ce719eb154aab7e44217eb444c1d38239af2072", size = 210934 },
+    { url = "https://files.pythonhosted.org/packages/f3/85/ff19510bf642e334845318ddb73a550d2b17082831fa9ae053ce72288be7/coverage-7.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1393e5aa9441dafb0162c36c8506c648b89aea9565b31f6bfa351e66c11bcd82", size = 211212 },
+    { url = "https://files.pythonhosted.org/packages/2d/6a/af6582a419550d35eacc3e1bf9f4a936dda0ae559632a0bc4e3aef694ac8/coverage-7.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:316f29cc3392fa3912493ee4c83afa4a0e2db04ff69600711f8c03997c39baaa", size = 244727 },
+    { url = "https://files.pythonhosted.org/packages/55/62/7c49526111c91f3d7d27e111c22c8d08722f5b661c3f031b625b4d7bc4d9/coverage-7.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1ffde1d6bc2a92f9c9207d1ad808550873748ac2d4d923c815b866baa343b3f", size = 241768 },
+    { url = "https://files.pythonhosted.org/packages/62/4b/2dc27700782be9795cbbbe98394dd19ef74815d78d5027ed894972cd1b4a/coverage-7.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:416e2a8845eaff288f97eaf76ab40367deafb9073ffc47bf2a583f26b05e5265", size = 243790 },
+    { url = "https://files.pythonhosted.org/packages/d3/11/9cc1ae56d3015edca69437f3121c2b44de309f6828980b29e4cc9b13246d/coverage-7.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5efdeff5f353ed3352c04e6b318ab05c6ce9249c25ed3c2090c6e9cadda1e3b2", size = 243861 },
+    { url = "https://files.pythonhosted.org/packages/db/e4/2398ed93edcf42ff43002d91c37be11514d825cec382606654fd44f4b8fa/coverage-7.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:57f3bd0d29bf2bd9325c0ff9cc532a175110c4bf8f412c05b2405fd35745266d", size = 241942 },
+    { url = "https://files.pythonhosted.org/packages/ec/fe/b6bd35b17a2b8d26bdb21d5ea4351a837ec01edf552655e833629af05b90/coverage-7.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ab7090f04b12dc6469882ce81244572779d3a4b67eea1c96fb9ecc8c607ef39", size = 243228 },
+    { url = "https://files.pythonhosted.org/packages/6d/06/d8701bae1e5d865edeb00a6c2a71bd7659ca6af349789271c6fd16a57909/coverage-7.7.0-cp313-cp313-win32.whl", hash = "sha256:180e3fc68ee4dc5af8b33b6ca4e3bb8aa1abe25eedcb958ba5cff7123071af68", size = 213572 },
+    { url = "https://files.pythonhosted.org/packages/d7/c1/7e67780bfcaed6bed20100c9e1b2645e3414577b4bdad169578325249045/coverage-7.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:55143aa13c49491f5606f05b49ed88663446dce3a4d3c5d77baa4e36a16d3573", size = 214372 },
+    { url = "https://files.pythonhosted.org/packages/ed/25/50b0447442a415ad3da33093c589d9ef945dd6933225f1ce0ac97476397e/coverage-7.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:cc41374d2f27d81d6558f8a24e5c114580ffefc197fd43eabd7058182f743322", size = 211774 },
+    { url = "https://files.pythonhosted.org/packages/13/cc/3daddc707e934d3c0aafaa4a9b217f53fcf4133d4e40cc6ae63aa51243b8/coverage-7.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:89078312f06237417adda7c021c33f80f7a6d2db8572a5f6c330d89b080061ce", size = 211995 },
+    { url = "https://files.pythonhosted.org/packages/98/99/c92f43355d3d67f6bf8c946a350f2174e18f9ea7c8a1e36c9eb84ab7d20b/coverage-7.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b2f144444879363ea8834cd7b6869d79ac796cb8f864b0cfdde50296cd95816", size = 256226 },
+    { url = "https://files.pythonhosted.org/packages/25/62/65f0f33c08e0a1632f1e487b9c2d252e8bad6a77a942836043972b0ba6d2/coverage-7.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60e6347d1ed882b1159ffea172cb8466ee46c665af4ca397edbf10ff53e9ffaf", size = 251937 },
+    { url = "https://files.pythonhosted.org/packages/b2/10/99a9565aaeb159aade178c6509c8324a9c9e825b01f02242a37c2a8869f8/coverage-7.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb203c0afffaf1a8f5b9659a013f8f16a1b2cad3a80a8733ceedc968c0cf4c57", size = 254276 },
+    { url = "https://files.pythonhosted.org/packages/a7/12/206196edbf0b82250b11bf5c252fe25ebaa2b7c8d66edb0c194e7b3403fe/coverage-7.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ad0edaa97cb983d9f2ff48cadddc3e1fb09f24aa558abeb4dc9a0dbacd12cbb4", size = 255366 },
+    { url = "https://files.pythonhosted.org/packages/a5/82/a2abb8d4cdd99c6a443ab6682c0eee5797490a2113a45ffaa8b6b31c5dcc/coverage-7.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c5f8a5364fc37b2f172c26a038bc7ec4885f429de4a05fc10fdcb53fb5834c5c", size = 253536 },
+    { url = "https://files.pythonhosted.org/packages/4d/7d/3747e000e60ad5dd8157bd978f99979967d56cb35c55235980c85305db86/coverage-7.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4e09534037933bf6eb31d804e72c52ec23219b32c1730f9152feabbd7499463", size = 254344 },
+    { url = "https://files.pythonhosted.org/packages/45/56/7c33f8a6de1b3b079374d2ae490ccf76fb7c094a23f72d10f071989fc3ef/coverage-7.7.0-cp313-cp313t-win32.whl", hash = "sha256:1b336d06af14f8da5b1f391e8dec03634daf54dfcb4d1c4fb6d04c09d83cef90", size = 214284 },
+    { url = "https://files.pythonhosted.org/packages/95/ab/657bfa6171800a67bd1c005402f06d6b78610820ef1364ea4f85b04bbb5b/coverage-7.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b54a1ee4c6f1905a436cbaa04b26626d27925a41cbc3a337e2d3ff7038187f07", size = 215445 },
+    { url = "https://files.pythonhosted.org/packages/d1/42/0e77be6f2fafe7f3de88ddf9f8d9a0d8e9a75f9517081d261d31439908c7/coverage-7.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c8fbce80b2b8bf135d105aa8f5b36eae0c57d702a1cc3ebdea2a6f03f6cdde5", size = 210604 },
+    { url = "https://files.pythonhosted.org/packages/0e/62/a82adc7818545fca3987367c6b20f239645678438f7da5827a4960bcbe7f/coverage-7.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9710521f07f526de30ccdead67e6b236fe996d214e1a7fba8b36e2ba2cd8261", size = 211031 },
+    { url = "https://files.pythonhosted.org/packages/a6/50/a98b418fcaf531b2829b2a06f47f8c5cbc0dcce4a9aa63c5f30bf47d1a92/coverage-7.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7789e700f33f2b133adae582c9f437523cd5db8de845774988a58c360fc88253", size = 239791 },
+    { url = "https://files.pythonhosted.org/packages/58/f7/0a8f891fce6f389b1062a520aff130fa6974433efeb549dd19cbdccc76b3/coverage-7.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c36093aca722db73633cf2359026ed7782a239eb1c6db2abcff876012dc4cf", size = 237718 },
+    { url = "https://files.pythonhosted.org/packages/a9/8f/362c91661e6c43ff86b65b15bbb60ad1ad4924e9d1e35a0d5f08eb3337c4/coverage-7.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c075d167a6ec99b798c1fdf6e391a1d5a2d054caffe9593ba0f97e3df2c04f0e", size = 238820 },
+    { url = "https://files.pythonhosted.org/packages/dd/4b/56520dba6f38ad59e96cdeb8c7eafa47781576d2baabdfa10f8c1813b37b/coverage-7.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d013c07061751ae81861cae6ec3a4fe04e84781b11fd4b6b4201590234b25c7b", size = 238595 },
+    { url = "https://files.pythonhosted.org/packages/4d/e6/acfae468bd1f9b691b29d42f93bfd7080c05021103f03580934c066a3844/coverage-7.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:104bf640f408f4e115b85110047c7f27377e1a8b7ba86f7db4fa47aa49dc9a8e", size = 236820 },
+    { url = "https://files.pythonhosted.org/packages/22/4f/9b65332326b0c5b7de197a52e766e2bd547beec6948e1d5c4063289e3281/coverage-7.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:39abcacd1ed54e2c33c54bdc488b310e8ef6705833f7148b6eb9a547199d375d", size = 237800 },
+    { url = "https://files.pythonhosted.org/packages/bb/99/1c2214678731517d91774b75ed5c0f72feefee3270c232c286b314518d7d/coverage-7.7.0-cp39-cp39-win32.whl", hash = "sha256:8e336b56301774ace6be0017ff85c3566c556d938359b61b840796a0202f805c", size = 213341 },
+    { url = "https://files.pythonhosted.org/packages/21/30/4d9ae5544f839da30e42e03850d1dfe4ab184d6307ed971e70178760a68d/coverage-7.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:8c938c6ae59be67ac19a7204e079efc94b38222cd7d0269f96e45e18cddeaa59", size = 214227 },
+    { url = "https://files.pythonhosted.org/packages/cb/69/6a5eac32d2e8721274ef75df1b9fd6a8f7e8231e41ff7bc5501f19835f25/coverage-7.7.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:3b0e6e54591ae0d7427def8a4d40fca99df6b899d10354bab73cd5609807261c", size = 202813 },
+    { url = "https://files.pythonhosted.org/packages/2a/ac/60f409a448e5b0e9b8539716f683568aa5848c1be903cdbbc805a552cdf8/coverage-7.7.0-py3-none-any.whl", hash = "sha256:708f0a1105ef2b11c79ed54ed31f17e6325ac936501fc373f24be3e6a578146a", size = 202803 },
 ]
 
 [package.optional-dependencies]
@@ -131,25 +132,25 @@ wheels = [
 
 [[package]]
 name = "filelock"
-version = "3.16.1"
+version = "3.18.0"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 }
+sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 },
+    { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 },
 ]
 
 [[package]]
 name = "hypothesis"
-version = "6.114.1"
+version = "6.129.4"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "attrs" },
     { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
     { name = "sortedcontainers" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/c9/03/1348ccb88bd3df1f1848afdea74c4c1dd42e75d1be9d022123d8f3cb180a/hypothesis-6.114.1.tar.gz", hash = "sha256:15ea6e4bb297276351ada18f172c60049c117a91040154ea620c632cc4c53e88", size = 407177 }
+sdist = { url = "https://files.pythonhosted.org/packages/bb/98/0051e770d36f7e0a55bcfa3590790448d57ed2f355da9adbb957b1f545d9/hypothesis-6.129.4.tar.gz", hash = "sha256:e9fd66c25b8f0aa6395ce6728360892c3af22529cc16cae7512a4672776d4781", size = 425235 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/40/f8/1bbde9c5853d711979c27f9b6a16365aedf8dfefba5e2dc1c38ab81c9bc7/hypothesis-6.114.1-py3-none-any.whl", hash = "sha256:117f2d065d3f2ec5b2b37c89150c2350be7feb43dfb9ccc30f30d5293b34e607", size = 468274 },
+    { url = "https://files.pythonhosted.org/packages/8d/7c/7266143385cbd19c839f9b61cc660d74c5ce2626fea41d8b215ccc5cfba3/hypothesis-6.129.4-py3-none-any.whl", hash = "sha256:45a31fe2b936688b2954f375c7f87e9dfefa4f2cddfa31cdeba15d77600e1286", size = 489542 },
 ]
 
 [[package]]
@@ -163,116 +164,126 @@ wheels = [
 
 [[package]]
 name = "jinja2"
-version = "3.1.4"
+version = "3.1.6"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "markupsafe" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 }
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 },
+    { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 },
 ]
 
 [[package]]
 name = "markupsafe"
-version = "3.0.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b4/d2/38ff920762f2247c3af5cbbbbc40756f575d9692d381d7c520f45deb9b8f/markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344", size = 20249 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/43/a2/0482d1a157f5f10f72fc4fe8c3be9ffa3651c1f7a12b60a3ab71b2635e13/MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1", size = 14391 },
-    { url = "https://files.pythonhosted.org/packages/3b/25/5ea6500d200fd2dc3ea25c765f69dea0a1a8d42ec80a38cd896ad47cb85d/MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a", size = 12414 },
-    { url = "https://files.pythonhosted.org/packages/92/41/cf5397dd6bb18895d148aa402cafa71018f2ffc5f6e9d6e90d85b523c741/MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589", size = 21787 },
-    { url = "https://files.pythonhosted.org/packages/2e/0d/5d91ef2b4f30afa87483a3a7c108c777d144b1c42d7113459296a8a2bfa0/MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170", size = 20954 },
-    { url = "https://files.pythonhosted.org/packages/f6/de/12a4110c2c7c7b502fe0e6f911367726dbb7a37e03e207495135d064bb48/MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca", size = 21086 },
-    { url = "https://files.pythonhosted.org/packages/96/55/59389babc6e8ed206849a9958de9da7c23f3a75d294f46e99624fa38fb79/MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea", size = 21685 },
-    { url = "https://files.pythonhosted.org/packages/3d/cb/cbad5f093e12cd79ceea3e2957ba5bd4c2706810f333d0a3422ab2aef358/MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6", size = 21348 },
-    { url = "https://files.pythonhosted.org/packages/8e/70/e19c4f39d68a52406012ee118667b57efb0bbe6e950be21187cd7a1b4b80/MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25", size = 21098 },
-    { url = "https://files.pythonhosted.org/packages/30/95/ca809c01624428d427e9b3a4500f9068eca941e0c520328954ce84ad966a/MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97", size = 15075 },
-    { url = "https://files.pythonhosted.org/packages/23/41/decb99ab07793656821a86f827a394700ce28402ebb02dc6d003210d9859/MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9", size = 15535 },
-    { url = "https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad", size = 14387 },
-    { url = "https://files.pythonhosted.org/packages/8d/43/fd588ef5d192308c5e05974bac659bf6ae29c202b7ea2c4194bcf01eacee/MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583", size = 12410 },
-    { url = "https://files.pythonhosted.org/packages/58/26/78f161d602fb03804118905e5faacafc0ec592bbad71aaee62537529813a/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7", size = 24006 },
-    { url = "https://files.pythonhosted.org/packages/ae/1d/7d5ec8bcfd9c2db235d720fa51d818b7e2abc45250ce5f53dd6cb60409ca/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b", size = 23303 },
-    { url = "https://files.pythonhosted.org/packages/26/ce/703ca3b03a709e3bd1fbffa407789e56b9fa664456538092617dd665fc1d/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3", size = 23205 },
-    { url = "https://files.pythonhosted.org/packages/88/60/40be0493decabc2344b12d3a709fd6ccdd15a5ebaee1e8d878315d107ad3/MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50", size = 23684 },
-    { url = "https://files.pythonhosted.org/packages/6d/f8/8fd52a66e8f62a9add62b4a0b5a3ab4092027437f2ef027f812d94ae91cf/MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915", size = 23472 },
-    { url = "https://files.pythonhosted.org/packages/d4/0b/998b17b9e06ea45ad1646fea586f1b83d02dfdb14d47dd2fd81fba5a08c9/MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91", size = 23388 },
-    { url = "https://files.pythonhosted.org/packages/5a/57/b6b7aa23b2e26d68d601718f8ce3161fbdaf967b31752c7dec52bef828c9/MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635", size = 15106 },
-    { url = "https://files.pythonhosted.org/packages/fc/b5/20cb1d714596acb553c810009c8004c809823947da63e13c19a7decfcb6c/MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf", size = 15542 },
-    { url = "https://files.pythonhosted.org/packages/45/6d/72ed58d42a12bd9fc288dbff6dd8d03ea973a232ac0538d7f88d105b5251/MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4", size = 14322 },
-    { url = "https://files.pythonhosted.org/packages/86/f5/241238f89cdd6461ac9f521af8389f9a48fab97e4f315c69e9e0d52bc919/MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5", size = 12380 },
-    { url = "https://files.pythonhosted.org/packages/27/94/79751928bca5841416d8ca02e22198672e021d5c7120338e2a6e3771f8fc/MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346", size = 24099 },
-    { url = "https://files.pythonhosted.org/packages/10/6e/1b8070bbfc467429c7983cd5ffd4ec57e1d501763d974c7caaa0a9a79f4c/MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729", size = 23249 },
-    { url = "https://files.pythonhosted.org/packages/66/50/9389ae6cdff78d7481a2a2641830b5eb1d1f62177550e73355a810a889c9/MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc", size = 23149 },
-    { url = "https://files.pythonhosted.org/packages/16/02/5dddff5366fde47133186efb847fa88bddef85914bbe623e25cfeccb3517/MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9", size = 23864 },
-    { url = "https://files.pythonhosted.org/packages/f3/f1/700ee6655561cfda986e03f7afc309e3738918551afa7dedd99225586227/MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b", size = 23440 },
-    { url = "https://files.pythonhosted.org/packages/fb/3e/d26623ac7f16709823b4c80e0b4a1c9196eeb46182a6c1d47b5e0c8434f4/MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38", size = 23610 },
-    { url = "https://files.pythonhosted.org/packages/51/04/1f8da0810c39cb9fcff96b6baed62272c97065e9cf11471965a161439e20/MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa", size = 15113 },
-    { url = "https://files.pythonhosted.org/packages/eb/24/a36dc37365bdd358b1e583cc40475593e36ab02cb7da6b3d0b9c05b0da7a/MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f", size = 15611 },
-    { url = "https://files.pythonhosted.org/packages/b1/60/4572a8aa1beccbc24b133aa0670781a5d2697f4fa3fecf0a87b46383174b/MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772", size = 14325 },
-    { url = "https://files.pythonhosted.org/packages/38/42/849915b99a765ec104bfd07ee933de5fc9c58fa9570efa7db81717f495d8/MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da", size = 12373 },
-    { url = "https://files.pythonhosted.org/packages/ef/82/4caaebd963c6d60b28e4445f38841d24f8b49bc10594a09956c9d73bfc08/MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a", size = 24059 },
-    { url = "https://files.pythonhosted.org/packages/20/15/6b319be2f79fcfa3173f479d69f4e950b5c9b642db4f22cf73ae5ade745f/MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c", size = 23211 },
-    { url = "https://files.pythonhosted.org/packages/9d/3f/8963bdf4962feb2154475acb7dc350f04217b5e0be7763a39b432291e229/MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd", size = 23095 },
-    { url = "https://files.pythonhosted.org/packages/af/93/f770bc70953d32de0c6ce4bcb76271512123a1ead91aaef625a020c5bfaf/MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7", size = 23901 },
-    { url = "https://files.pythonhosted.org/packages/11/92/1e5a33aa0a1190161238628fb68eb1bc5e67b56a5c89f0636328704b463a/MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd", size = 23463 },
-    { url = "https://files.pythonhosted.org/packages/0d/fe/657efdfe385d2a3a701f2c4fcc9577c63c438aeefdd642d0d956c4ecd225/MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5", size = 23569 },
-    { url = "https://files.pythonhosted.org/packages/cf/24/587dea40304046ace60f846cedaebc0d33d967a3ce46c11395a10e7a78ba/MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c", size = 15117 },
-    { url = "https://files.pythonhosted.org/packages/32/8f/d8961d633f26a011b4fe054f3bfff52f673423b8c431553268741dfb089e/MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f", size = 15613 },
-    { url = "https://files.pythonhosted.org/packages/9e/93/d6367ffbcd0c5c371370767f768eaa32af60bc411245b8517e383c6a2b12/MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a", size = 14563 },
-    { url = "https://files.pythonhosted.org/packages/4a/37/f813c3835747dec08fe19ac9b9eced01fdf93a4b3e626521675dc7f423a9/MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d", size = 12505 },
-    { url = "https://files.pythonhosted.org/packages/72/bf/800b4d1580298ca91ccd6c95915bbd147142dad1b8cf91d57b93b28670dd/MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396", size = 25358 },
-    { url = "https://files.pythonhosted.org/packages/fd/78/26e209abc8f0a379f031f0acc151231974e5b153d7eda5759d17d8f329f2/MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453", size = 23797 },
-    { url = "https://files.pythonhosted.org/packages/09/e1/918496a9390891756efee818880e71c1bbaf587f4dc8ede3f3852357310a/MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4", size = 23743 },
-    { url = "https://files.pythonhosted.org/packages/cd/c6/26f576cd58d6c2decd9045e4e3f3c5dbc01ea6cb710916e7bbb6ebd95b6b/MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8", size = 25076 },
-    { url = "https://files.pythonhosted.org/packages/b5/fa/10b24fb3b0e15fe5389dc88ecc6226ede08297e0ba7130610efbe0cdfb27/MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984", size = 24037 },
-    { url = "https://files.pythonhosted.org/packages/c8/81/4b3f5537d9f6cc4f5c80d6c4b78af9a5247fd37b5aba95807b2cbc336b9a/MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a", size = 24015 },
-    { url = "https://files.pythonhosted.org/packages/5f/07/8e8dcecd53216c5e01a51e84c32a2bce166690ed19c184774b38cd41921d/MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b", size = 15213 },
-    { url = "https://files.pythonhosted.org/packages/0d/87/4c364e0f109eea2402079abecbe33fef4f347b551a11423d1f4e187ea497/MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295", size = 15741 },
-    { url = "https://files.pythonhosted.org/packages/6f/4f/420741fb39fa3d40396fb1731a1ca78e6f9fbb225dcf15e5185b1fa954bc/MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132", size = 14376 },
-    { url = "https://files.pythonhosted.org/packages/91/71/0c4782b9ce7fb68b140b94e1eb9d2b6292990bda91dc3d3b5a34e8bd41f3/MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a", size = 12408 },
-    { url = "https://files.pythonhosted.org/packages/3e/3c/cbf30bf7ac1da2e013e3d338e1582db85fc3b27bf9f8863137423ad4b0b6/MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8", size = 21654 },
-    { url = "https://files.pythonhosted.org/packages/0b/28/229e797b8727427845b79cbd58019f598e478f974730fa705fa23904b18e/MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6", size = 20817 },
-    { url = "https://files.pythonhosted.org/packages/e8/b4/1121f3b2614de93cbb3deec7f44df283df44c2258ea9368bb1302b4a0b45/MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b", size = 20956 },
-    { url = "https://files.pythonhosted.org/packages/a8/8b/b4d57bafca01c8b1e1fbb037660869fa4f6725983c4105a02bd1242f0066/MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b", size = 21548 },
-    { url = "https://files.pythonhosted.org/packages/83/87/04806f7096ba1d4f1b8c61f35c1d7c0b507c6a3cf7ed495393bf97eb5af7/MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd", size = 21222 },
-    { url = "https://files.pythonhosted.org/packages/e9/96/1ecb2bb5ee7298e628cff95833beba7da6a774df7fe890a6d2f0ec460590/MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a", size = 20952 },
-    { url = "https://files.pythonhosted.org/packages/fd/70/b937a12df7bbff14e1ca3385929f464c7af2ca72c8183c95dad26c3bf754/MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8", size = 15075 },
-    { url = "https://files.pythonhosted.org/packages/e3/c4/262fac0328552da9a75a7786d7c0f43adaba4afb5f295979d33fa0f324c7/MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b", size = 15527 },
+version = "3.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 },
+    { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 },
+    { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 },
+    { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 },
+    { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 },
+    { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 },
+    { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 },
+    { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 },
+    { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 },
+    { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 },
+    { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 },
+    { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 },
+    { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 },
+    { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 },
+    { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 },
+    { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 },
+    { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 },
+    { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 },
+    { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 },
+    { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 },
+    { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 },
+    { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 },
+    { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 },
+    { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 },
+    { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 },
+    { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 },
+    { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 },
+    { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 },
+    { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 },
+    { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 },
+    { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 },
+    { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 },
+    { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 },
+    { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 },
+    { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 },
+    { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 },
+    { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 },
+    { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 },
+    { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 },
+    { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 },
+    { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 },
+    { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 },
+    { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 },
+    { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 },
+    { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 },
+    { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 },
+    { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 },
+    { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 },
+    { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 },
+    { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
+    { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344 },
+    { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389 },
+    { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607 },
+    { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728 },
+    { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826 },
+    { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843 },
+    { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219 },
+    { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946 },
+    { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063 },
+    { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506 },
 ]
 
 [[package]]
 name = "mypy"
-version = "1.11.2"
+version = "1.15.0"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "mypy-extensions" },
     { name = "tomli", marker = "python_full_version < '3.11'" },
     { name = "typing-extensions" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/5c/86/5d7cbc4974fd564550b80fbb8103c05501ea11aa7835edf3351d90095896/mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79", size = 3078806 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/78/cd/815368cd83c3a31873e5e55b317551500b12f2d1d7549720632f32630333/mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a", size = 10939401 },
-    { url = "https://files.pythonhosted.org/packages/f1/27/e18c93a195d2fad75eb96e1f1cbc431842c332e8eba2e2b77eaf7313c6b7/mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef", size = 10111697 },
-    { url = "https://files.pythonhosted.org/packages/dc/08/cdc1fc6d0d5a67d354741344cc4aa7d53f7128902ebcbe699ddd4f15a61c/mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383", size = 12500508 },
-    { url = "https://files.pythonhosted.org/packages/64/12/aad3af008c92c2d5d0720ea3b6674ba94a98cdb86888d389acdb5f218c30/mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8", size = 13020712 },
-    { url = "https://files.pythonhosted.org/packages/03/e6/a7d97cc124a565be5e9b7d5c2a6ebf082379ffba99646e4863ed5bbcb3c3/mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7", size = 9567319 },
-    { url = "https://files.pythonhosted.org/packages/e2/aa/cc56fb53ebe14c64f1fe91d32d838d6f4db948b9494e200d2f61b820b85d/mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385", size = 10859630 },
-    { url = "https://files.pythonhosted.org/packages/04/c8/b19a760fab491c22c51975cf74e3d253b8c8ce2be7afaa2490fbf95a8c59/mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca", size = 10037973 },
-    { url = "https://files.pythonhosted.org/packages/88/57/7e7e39f2619c8f74a22efb9a4c4eff32b09d3798335625a124436d121d89/mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104", size = 12416659 },
-    { url = "https://files.pythonhosted.org/packages/fc/a6/37f7544666b63a27e46c48f49caeee388bf3ce95f9c570eb5cfba5234405/mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4", size = 12897010 },
-    { url = "https://files.pythonhosted.org/packages/84/8b/459a513badc4d34acb31c736a0101c22d2bd0697b969796ad93294165cfb/mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6", size = 9562873 },
-    { url = "https://files.pythonhosted.org/packages/35/3a/ed7b12ecc3f6db2f664ccf85cb2e004d3e90bec928e9d7be6aa2f16b7cdf/mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318", size = 10990335 },
-    { url = "https://files.pythonhosted.org/packages/04/e4/1a9051e2ef10296d206519f1df13d2cc896aea39e8683302f89bf5792a59/mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36", size = 10007119 },
-    { url = "https://files.pythonhosted.org/packages/f3/3c/350a9da895f8a7e87ade0028b962be0252d152e0c2fbaafa6f0658b4d0d4/mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987", size = 12506856 },
-    { url = "https://files.pythonhosted.org/packages/b6/49/ee5adf6a49ff13f4202d949544d3d08abb0ea1f3e7f2a6d5b4c10ba0360a/mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca", size = 12952066 },
-    { url = "https://files.pythonhosted.org/packages/27/c0/b19d709a42b24004d720db37446a42abadf844d5c46a2c442e2a074d70d9/mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70", size = 9664000 },
-    { url = "https://files.pythonhosted.org/packages/16/64/bb5ed751487e2bea0dfaa6f640a7e3bb88083648f522e766d5ef4a76f578/mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6", size = 10937294 },
-    { url = "https://files.pythonhosted.org/packages/a9/a3/67a0069abed93c3bf3b0bebb8857e2979a02828a4a3fd82f107f8f1143e8/mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70", size = 10107707 },
-    { url = "https://files.pythonhosted.org/packages/2f/4d/0379daf4258b454b1f9ed589a9dabd072c17f97496daea7b72fdacf7c248/mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d", size = 12498367 },
-    { url = "https://files.pythonhosted.org/packages/3b/dc/3976a988c280b3571b8eb6928882dc4b723a403b21735a6d8ae6ed20e82b/mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d", size = 13018014 },
-    { url = "https://files.pythonhosted.org/packages/83/84/adffc7138fb970e7e2a167bd20b33bb78958370179853a4ebe9008139342/mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24", size = 9568056 },
-    { url = "https://files.pythonhosted.org/packages/42/3a/bdf730640ac523229dd6578e8a581795720a9321399de494374afc437ec5/mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12", size = 2619625 },
+sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/68/f8/65a7ce8d0e09b6329ad0c8d40330d100ea343bd4dd04c4f8ae26462d0a17/mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", size = 10738433 },
+    { url = "https://files.pythonhosted.org/packages/b4/95/9c0ecb8eacfe048583706249439ff52105b3f552ea9c4024166c03224270/mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", size = 9861472 },
+    { url = "https://files.pythonhosted.org/packages/84/09/9ec95e982e282e20c0d5407bc65031dfd0f0f8ecc66b69538296e06fcbee/mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", size = 11611424 },
+    { url = "https://files.pythonhosted.org/packages/78/13/f7d14e55865036a1e6a0a69580c240f43bc1f37407fe9235c0d4ef25ffb0/mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", size = 12365450 },
+    { url = "https://files.pythonhosted.org/packages/48/e1/301a73852d40c241e915ac6d7bcd7fedd47d519246db2d7b86b9d7e7a0cb/mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", size = 12551765 },
+    { url = "https://files.pythonhosted.org/packages/77/ba/c37bc323ae5fe7f3f15a28e06ab012cd0b7552886118943e90b15af31195/mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", size = 9274701 },
+    { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338 },
+    { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540 },
+    { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051 },
+    { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751 },
+    { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783 },
+    { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618 },
+    { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 },
+    { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 },
+    { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 },
+    { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 },
+    { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 },
+    { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 },
+    { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 },
+    { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 },
+    { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 },
+    { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 },
+    { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 },
+    { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 },
+    { url = "https://files.pythonhosted.org/packages/5a/fa/79cf41a55b682794abe71372151dbbf856e3008f6767057229e6649d294a/mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078", size = 10737129 },
+    { url = "https://files.pythonhosted.org/packages/d3/33/dd8feb2597d648de29e3da0a8bf4e1afbda472964d2a4a0052203a6f3594/mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba", size = 9856335 },
+    { url = "https://files.pythonhosted.org/packages/e4/b5/74508959c1b06b96674b364ffeb7ae5802646b32929b7701fc6b18447592/mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5", size = 11611935 },
+    { url = "https://files.pythonhosted.org/packages/6c/53/da61b9d9973efcd6507183fdad96606996191657fe79701b2c818714d573/mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b", size = 12365827 },
+    { url = "https://files.pythonhosted.org/packages/c1/72/965bd9ee89540c79a25778cc080c7e6ef40aa1eeac4d52cec7eae6eb5228/mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2", size = 12541924 },
+    { url = "https://files.pythonhosted.org/packages/46/d0/f41645c2eb263e6c77ada7d76f894c580c9ddb20d77f0c24d34273a4dab2/mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980", size = 9271176 },
+    { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 },
 ]
 
 [[package]]
@@ -286,16 +297,16 @@ wheels = [
 
 [[package]]
 name = "packaging"
-version = "24.1"
+version = "24.2"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 },
+    { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
 ]
 
 [[package]]
 name = "pdoc"
-version = "15.0.0"
+version = "15.0.1"
 source = { editable = "." }
 dependencies = [
     { name = "jinja2" },
@@ -369,29 +380,29 @@ wheels = [
 
 [[package]]
 name = "pygments"
-version = "2.18.0"
+version = "2.19.1"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 },
+    { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
 ]
 
 [[package]]
 name = "pyproject-api"
-version = "1.8.0"
+version = "1.9.0"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "packaging" },
     { name = "tomli", marker = "python_full_version < '3.11'" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/bb/19/441e0624a8afedd15bbcce96df1b80479dd0ff0d965f5ce8fde4f2f6ffad/pyproject_api-1.8.0.tar.gz", hash = "sha256:77b8049f2feb5d33eefcc21b57f1e279636277a8ac8ad6b5871037b243778496", size = 22340 }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/66/fdc17e94486836eda4ba7113c0db9ac7e2f4eea1b968ee09de2fe75e391b/pyproject_api-1.9.0.tar.gz", hash = "sha256:7e8a9854b2dfb49454fae421cb86af43efbb2b2454e5646ffb7623540321ae6e", size = 22714 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/ba/f4/3c4ddfcc0c19c217c6de513842d286de8021af2f2ab79bbb86c00342d778/pyproject_api-1.8.0-py3-none-any.whl", hash = "sha256:3d7d347a047afe796fd5d1885b1e391ba29be7169bd2f102fcd378f04273d228", size = 13100 },
+    { url = "https://files.pythonhosted.org/packages/b0/1d/92b7c765df46f454889d9610292b0ccab15362be3119b9a624458455e8d5/pyproject_api-1.9.0-py3-none-any.whl", hash = "sha256:326df9d68dea22d9d98b5243c46e3ca3161b07a1b9b18e213d1e24fd0e605766", size = 13131 },
 ]
 
 [[package]]
 name = "pytest"
-version = "8.3.3"
+version = "8.3.5"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -401,22 +412,22 @@ dependencies = [
     { name = "pluggy" },
     { name = "tomli", marker = "python_full_version < '3.11'" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 },
+    { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 },
 ]
 
 [[package]]
 name = "pytest-cov"
-version = "5.0.0"
+version = "6.0.0"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "coverage", extra = ["toml"] },
     { name = "pytest" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 }
+sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990 },
+    { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 },
 ]
 
 [[package]]
@@ -433,27 +444,27 @@ wheels = [
 
 [[package]]
 name = "ruff"
-version = "0.6.9"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/26/0d/6148a48dab5662ca1d5a93b7c0d13c03abd3cc7e2f35db08410e47cef15d/ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2", size = 3095355 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/6e/8f/f7a0a0ef1818662efb32ed6df16078c95da7a0a3248d64c2410c1e27799f/ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd", size = 10440526 },
-    { url = "https://files.pythonhosted.org/packages/8b/69/b179a5faf936a9e2ab45bb412a668e4661eded964ccfa19d533f29463ef6/ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec", size = 10034612 },
-    { url = "https://files.pythonhosted.org/packages/c7/ef/fd1b4be979c579d191eeac37b5cfc0ec906de72c8bcd8595e2c81bb700c1/ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c", size = 9706197 },
-    { url = "https://files.pythonhosted.org/packages/29/61/b376d775deb5851cb48d893c568b511a6d3625ef2c129ad5698b64fb523c/ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e", size = 10751855 },
-    { url = "https://files.pythonhosted.org/packages/13/d7/def9e5f446d75b9a9c19b24231a3a658c075d79163b08582e56fa5dcfa38/ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577", size = 10200889 },
-    { url = "https://files.pythonhosted.org/packages/6c/d6/7f34160818bcb6e84ce293a5966cba368d9112ff0289b273fbb689046047/ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829", size = 11038678 },
-    { url = "https://files.pythonhosted.org/packages/13/34/a40ff8ae62fb1b26fb8e6fa7e64bc0e0a834b47317880de22edd6bfb54fb/ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5", size = 11808682 },
-    { url = "https://files.pythonhosted.org/packages/2e/6d/25a4386ae4009fc798bd10ba48c942d1b0b3e459b5403028f1214b6dd161/ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7", size = 11330446 },
-    { url = "https://files.pythonhosted.org/packages/f7/f6/bdf891a9200d692c94ebcd06ae5a2fa5894e522f2c66c2a12dd5d8cb2654/ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f", size = 12483048 },
-    { url = "https://files.pythonhosted.org/packages/a7/86/96f4252f41840e325b3fa6c48297e661abb9f564bd7dcc0572398c8daa42/ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa", size = 10936855 },
-    { url = "https://files.pythonhosted.org/packages/45/87/801a52d26c8dbf73424238e9908b9ceac430d903c8ef35eab1b44fcfa2bd/ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb", size = 10713007 },
-    { url = "https://files.pythonhosted.org/packages/be/27/6f7161d90320a389695e32b6ebdbfbedde28ccbf52451e4b723d7ce744ad/ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0", size = 10274594 },
-    { url = "https://files.pythonhosted.org/packages/00/52/dc311775e7b5f5b19831563cb1572ecce63e62681bccc609867711fae317/ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625", size = 10608024 },
-    { url = "https://files.pythonhosted.org/packages/98/b6/be0a1ddcbac65a30c985cf7224c4fce786ba2c51e7efeb5178fe410ed3cf/ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039", size = 10982085 },
-    { url = "https://files.pythonhosted.org/packages/bb/a4/c84bc13d0b573cf7bb7d17b16d6d29f84267c92d79b2f478d4ce322e8e72/ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d", size = 8522088 },
-    { url = "https://files.pythonhosted.org/packages/74/be/fc352bd8ca40daae8740b54c1c3e905a7efe470d420a268cd62150248c91/ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117", size = 9359275 },
-    { url = "https://files.pythonhosted.org/packages/3e/14/fd026bc74ded05e2351681545a5f626e78ef831f8edce064d61acd2e6ec7/ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93", size = 8679879 },
+version = "0.11.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/77/2b/7ca27e854d92df5e681e6527dc0f9254c9dc06c8408317893cf96c851cdd/ruff-0.11.0.tar.gz", hash = "sha256:e55c620690a4a7ee6f1cccb256ec2157dc597d109400ae75bbf944fc9d6462e2", size = 3799407 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/48/40/3d0340a9e5edc77d37852c0cd98c5985a5a8081fc3befaeb2ae90aaafd2b/ruff-0.11.0-py3-none-linux_armv6l.whl", hash = "sha256:dc67e32bc3b29557513eb7eeabb23efdb25753684b913bebb8a0c62495095acb", size = 10098158 },
+    { url = "https://files.pythonhosted.org/packages/ec/a9/d8f5abb3b87b973b007649ac7bf63665a05b2ae2b2af39217b09f52abbbf/ruff-0.11.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38c23fd9bdec4eb437b4c1e3595905a0a8edfccd63a790f818b28c78fe345639", size = 10879071 },
+    { url = "https://files.pythonhosted.org/packages/ab/62/aaa198614c6211677913ec480415c5e6509586d7b796356cec73a2f8a3e6/ruff-0.11.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7c8661b0be91a38bd56db593e9331beaf9064a79028adee2d5f392674bbc5e88", size = 10247944 },
+    { url = "https://files.pythonhosted.org/packages/9f/52/59e0a9f2cf1ce5e6cbe336b6dd0144725c8ea3b97cac60688f4e7880bf13/ruff-0.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6c0e8d3d2db7e9f6efd884f44b8dc542d5b6b590fc4bb334fdbc624d93a29a2", size = 10421725 },
+    { url = "https://files.pythonhosted.org/packages/a6/c3/dcd71acc6dff72ce66d13f4be5bca1dbed4db678dff2f0f6f307b04e5c02/ruff-0.11.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c3156d3f4b42e57247275a0a7e15a851c165a4fc89c5e8fa30ea6da4f7407b8", size = 9954435 },
+    { url = "https://files.pythonhosted.org/packages/a6/9a/342d336c7c52dbd136dee97d4c7797e66c3f92df804f8f3b30da59b92e9c/ruff-0.11.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:490b1e147c1260545f6d041c4092483e3f6d8eba81dc2875eaebcf9140b53905", size = 11492664 },
+    { url = "https://files.pythonhosted.org/packages/84/35/6e7defd2d7ca95cc385ac1bd9f7f2e4a61b9cc35d60a263aebc8e590c462/ruff-0.11.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1bc09a7419e09662983b1312f6fa5dab829d6ab5d11f18c3760be7ca521c9329", size = 12207856 },
+    { url = "https://files.pythonhosted.org/packages/22/78/da669c8731bacf40001c880ada6d31bcfb81f89cc996230c3b80d319993e/ruff-0.11.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcfa478daf61ac8002214eb2ca5f3e9365048506a9d52b11bea3ecea822bb844", size = 11645156 },
+    { url = "https://files.pythonhosted.org/packages/ee/47/e27d17d83530a208f4a9ab2e94f758574a04c51e492aa58f91a3ed7cbbcb/ruff-0.11.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fbb2aed66fe742a6a3a0075ed467a459b7cedc5ae01008340075909d819df1e", size = 13884167 },
+    { url = "https://files.pythonhosted.org/packages/9f/5e/42ffbb0a5d4b07bbc642b7d58357b4e19a0f4774275ca6ca7d1f7b5452cd/ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c0c1ff014351c0b0cdfdb1e35fa83b780f1e065667167bb9502d47ca41e6db", size = 11348311 },
+    { url = "https://files.pythonhosted.org/packages/c8/51/dc3ce0c5ce1a586727a3444a32f98b83ba99599bb1ebca29d9302886e87f/ruff-0.11.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e4fd5ff5de5f83e0458a138e8a869c7c5e907541aec32b707f57cf9a5e124445", size = 10305039 },
+    { url = "https://files.pythonhosted.org/packages/60/e0/475f0c2f26280f46f2d6d1df1ba96b3399e0234cf368cc4c88e6ad10dcd9/ruff-0.11.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:96bc89a5c5fd21a04939773f9e0e276308be0935de06845110f43fd5c2e4ead7", size = 9937939 },
+    { url = "https://files.pythonhosted.org/packages/e2/d3/3e61b7fd3e9cdd1e5b8c7ac188bec12975c824e51c5cd3d64caf81b0331e/ruff-0.11.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a9352b9d767889ec5df1483f94870564e8102d4d7e99da52ebf564b882cdc2c7", size = 10923259 },
+    { url = "https://files.pythonhosted.org/packages/30/32/cd74149ebb40b62ddd14bd2d1842149aeb7f74191fb0f49bd45c76909ff2/ruff-0.11.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:049a191969a10897fe052ef9cc7491b3ef6de79acd7790af7d7897b7a9bfbcb6", size = 11406212 },
+    { url = "https://files.pythonhosted.org/packages/00/ef/033022a6b104be32e899b00de704d7c6d1723a54d4c9e09d147368f14b62/ruff-0.11.0-py3-none-win32.whl", hash = "sha256:3191e9116b6b5bbe187447656f0c8526f0d36b6fd89ad78ccaad6bdc2fad7df2", size = 10310905 },
+    { url = "https://files.pythonhosted.org/packages/ed/8a/163f2e78c37757d035bd56cd60c8d96312904ca4a6deeab8442d7b3cbf89/ruff-0.11.0-py3-none-win_amd64.whl", hash = "sha256:c58bfa00e740ca0a6c43d41fb004cd22d165302f360aaa56f7126d544db31a21", size = 11411730 },
+    { url = "https://files.pythonhosted.org/packages/4e/f7/096f6efabe69b49d7ca61052fc70289c05d8d35735c137ef5ba5ef423662/ruff-0.11.0-py3-none-win_arm64.whl", hash = "sha256:868364fc23f5aa122b00c6f794211e85f7e78f5dffdf7c590ab90b8c4e69b657", size = 10538956 },
 ]
 
 [[package]]
@@ -467,16 +478,46 @@ wheels = [
 
 [[package]]
 name = "tomli"
-version = "2.0.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/35/b9/de2a5c0144d7d75a57ff355c0c24054f965b2dc3036456ae03a51ea6264b/tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed", size = 16096 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/cf/db/ce8eda256fa131af12e0a76d481711abe4681b6923c27efb9a255c9e4594/tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", size = 13237 },
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 },
+    { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 },
+    { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 },
+    { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 },
+    { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 },
+    { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 },
+    { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 },
+    { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 },
+    { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 },
+    { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 },
+    { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
+    { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
+    { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
+    { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
+    { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
+    { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
+    { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
+    { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
+    { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
+    { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
+    { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
+    { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
+    { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
+    { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
+    { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
+    { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
+    { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
+    { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
+    { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
+    { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
+    { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
 ]
 
 [[package]]
 name = "tox"
-version = "4.21.2"
+version = "4.24.2"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "cachetools" },
@@ -491,14 +532,14 @@ dependencies = [
     { name = "typing-extensions", marker = "python_full_version < '3.11'" },
     { name = "virtualenv" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/2a/db/ba5b1a4cf664f221a33c3cbb1adf40ccccbbd13f5eec6d9d7291c7a39e44/tox-4.21.2.tar.gz", hash = "sha256:49381ff102296753e378fa5ff30e42a35e695f149b4dbf8a2c49d15fdb5797b2", size = 188539 }
+sdist = { url = "https://files.pythonhosted.org/packages/51/93/30e4d662748d8451acde46feca03886b85bd74a453691d56abc44ef4bd37/tox-4.24.2.tar.gz", hash = "sha256:d5948b350f76fae436d6545a5e87c2b676ab7a0d7d88c1308651245eadbe8aea", size = 195354 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/f8/20/168300f3f334e255b618322dce14b86a5c423aab05f28be14d1a2d6af14a/tox-4.21.2-py3-none-any.whl", hash = "sha256:13d996adcd792e7c82994b0e116d85efd84f0c6d185254d83d156f73f86b2038", size = 165698 },
+    { url = "https://files.pythonhosted.org/packages/7b/eb/f7e6e77a664a96163cc1e7f9829f2e01b5b99aeb1edf0cdf1cd95859f310/tox-4.24.2-py3-none-any.whl", hash = "sha256:92e8290e76ad4e15748860a205865696409a2d014eedeb796a34a0f3b5e7336e", size = 172155 },
 ]
 
 [[package]]
 name = "tox-uv"
-version = "1.13.0"
+version = "1.25.0"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "packaging" },
@@ -506,40 +547,30 @@ dependencies = [
     { name = "typing-extensions", marker = "python_full_version < '3.10'" },
     { name = "uv" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/31/23/752b7bc25013d2958df6adac2bce983b0984930444f2f23926cc325e2848/tox_uv-1.13.0.tar.gz", hash = "sha256:fb087b8b4ff779c72b48fc72ea1995387bb1c0dfb37910c20e46cef8b5f98c15", size = 15643 }
+sdist = { url = "https://files.pythonhosted.org/packages/5d/3a/3e445f25978a716ba6674f33f687d9336d0312086a277a778a5e9e9220d7/tox_uv-1.25.0.tar.gz", hash = "sha256:59ee5e694c41fef7bbcf058f22a5f9b6a8509698def2ea60c08554f4e36b9fcc", size = 21114 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/40/93/1b0b0c27177f4816594683cd4e008e07137756f5b8ba55483c30789bf08c/tox_uv-1.13.0-py3-none-any.whl", hash = "sha256:1037e4abad15a3b708b5970ed7a17a0765d7249b641a92b155bc3343b8b0145b", size = 13383 },
+    { url = "https://files.pythonhosted.org/packages/3c/a7/f5c29e0e6faaccefcab607f672b176927144e9412c8183d21301ea2a6f6c/tox_uv-1.25.0-py3-none-any.whl", hash = "sha256:50cfe7795dcd49b2160d7d65b5ece8717f38cfedc242c852a40ec0a71e159bf7", size = 16431 },
 ]
 
 [[package]]
 name = "types-docutils"
-version = "0.21.0.20241005"
+version = "0.21.0.20241128"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/23/31/6f51a6b05ad750fd7875ffd45e7a88063258782f35e5dff1f291061e394e/types-docutils-0.21.0.20241005.tar.gz", hash = "sha256:48f804a2b50da3a1b1681c4ca1b6184416a6e4129e302d15c44e9d97c59b3365", size = 20701 }
+sdist = { url = "https://files.pythonhosted.org/packages/dd/df/64e7ab01a4fc5ce46895dc94e31cffc8b8087c8d91ee54c45ac2d8d82445/types_docutils-0.21.0.20241128.tar.gz", hash = "sha256:4dd059805b83ac6ec5a223699195c4e9eeb0446a4f7f2aeff1759a4a7cc17473", size = 26739 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/20/73/8ccc09357cfe9f4b8a5b31af3276dd270924bf4915a13cf816b585221b59/types_docutils-0.21.0.20241005-py3-none-any.whl", hash = "sha256:4d9021422f2f3fca8b0726fb8949395f66a06c0d951479eb3b1387d75b134430", size = 28520 },
+    { url = "https://files.pythonhosted.org/packages/59/b6/10ba95739f2cbb9c5bd2f6568148d62b468afe01a94c633e8892a2936d8a/types_docutils-0.21.0.20241128-py3-none-any.whl", hash = "sha256:e0409204009639e9b0bf4521eeabe58b5e574ce9c0db08421c2ac26c32be0039", size = 34677 },
 ]
 
 [[package]]
 name = "types-pygments"
-version = "2.18.0.20240506"
+version = "2.19.0.20250305"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "types-docutils" },
-    { name = "types-setuptools" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/f0/ed/0a70203637650ecaa74731faf441d128edb908ed6ca184013bfc498283ba/types-Pygments-2.18.0.20240506.tar.gz", hash = "sha256:4b4c37812c87bbde687dbf27adf5bac593745a321e57f678dbc311571ba2ac9d", size = 13516 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/4a/52/1a740a823dcfbe7fe7c44c2ff83528df2c2b5b6e93c299e8db7bf4205c1b/types_Pygments-2.18.0.20240506-py3-none-any.whl", hash = "sha256:11c90bc1737c9af55e5569558b88df7c2233e12325cb516215f722271444e91d", size = 20775 },
 ]
-
-[[package]]
-name = "types-setuptools"
-version = "75.1.0.20240917"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/48/91/c1168caa2a5ba14c01b146b516fab2d8646887cb5db7e78e13b9c6da88d2/types-setuptools-75.1.0.20240917.tar.gz", hash = "sha256:12f12a165e7ed383f31def705e5c0fa1c26215dd466b0af34bd042f7d5331f55", size = 42585 }
+sdist = { url = "https://files.pythonhosted.org/packages/e6/be/88f777c75022b111f9e9fe4cdb430bf92892fe90188b0fd037601ded2ea1/types_pygments-2.19.0.20250305.tar.gz", hash = "sha256:044c50e80ecd4128c00a7268f20355e16f5c55466d3d49dfda09be920af40b4b", size = 18521 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/40/4c/a4c87d86ba18ff00773ab8591c79c23a6938293ab3e2cec2b2eb4ca5b644/types_setuptools-75.1.0.20240917-py3-none-any.whl", hash = "sha256:06f78307e68d1bbde6938072c57b81cf8a99bc84bd6dc7e4c5014730b097dc0c", size = 65516 },
+    { url = "https://files.pythonhosted.org/packages/6f/c6/b6d3ad345b76425e46d25a2da1758603d80c3a59405bdcbbbaa86d8c8070/types_pygments-2.19.0.20250305-py3-none-any.whl", hash = "sha256:ca88aae5ec426f9b107c0f7adc36dc096d2882d930a49f679eaf4b8b643db35d", size = 25638 },
 ]
 
 [[package]]
@@ -553,39 +584,39 @@ wheels = [
 
 [[package]]
 name = "uv"
-version = "0.4.20"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/bb/98/1e634c30f8c0739d131caf98213825063354eb9d4ca868a20c82550150e5/uv-0.4.20.tar.gz", hash = "sha256:b4c8a2027b1f19f8b8949132e728a750e4f9b4bb0ec02544d9b21df3f525ab1a", size = 1994432 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/d0/b4/c66c38772657ef8406f99f89abe5e575c6083dc517fbd32c70b60f2bb7d1/uv-0.4.20-py3-none-linux_armv6l.whl", hash = "sha256:d0566f3ce596b0192099f7a01be08e1f37061d7399e0128804794cf83cdf2806", size = 12508957 },
-    { url = "https://files.pythonhosted.org/packages/2f/bd/3efaa2d65fcec0b262d77809371e0748533255408d98d0142200de393576/uv-0.4.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:1f20251b5a6a1cc92d844153b128b346bd0be8178beb4945df63d1a76a905176", size = 12741985 },
-    { url = "https://files.pythonhosted.org/packages/b8/69/aa5772e11dc9283b33e137094ca07a1c3592a9f8777d360641badb6d65f3/uv-0.4.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d37f02ae48540104d9c13d2dfe27bf84b246d5945b55d91568404da08e2a3bd8", size = 11813095 },
-    { url = "https://files.pythonhosted.org/packages/72/3a/9ba6c5c143bf466ec4df3c5cd57fa3c875da2dbca4c86707c4cb060eb328/uv-0.4.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:555f0275c3db5b1cd13f6a6825b0b0f23e116a58a46da65f55d4f07915b36b16", size = 12053904 },
-    { url = "https://files.pythonhosted.org/packages/87/a5/4799e1414e89a2f6ed45bdada2ebd939337aa8f8cca68c019900915ca56f/uv-0.4.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6faba47d13c1b916bfe9a1828a792ba21558871b4b81dbb79c157077f558fb3", size = 12311173 },
-    { url = "https://files.pythonhosted.org/packages/ed/fb/7c049230e50883a7c36d1a181818f2f0e2b4cba653b8256a50f1d77149d3/uv-0.4.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:092d4d3cee4a9680832c16d5c1a5e816b2d07a31328580f04e4ddf437821b1f3", size = 13033187 },
-    { url = "https://files.pythonhosted.org/packages/99/13/0ac3247923c20f8dd41cc08c98e84c22f1f3083b6da7befba50145120d7b/uv-0.4.20-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5d62655450d173a4dbe76b70b9af81ffa501501d97224f311f126b30924b42f7", size = 13659720 },
-    { url = "https://files.pythonhosted.org/packages/5a/04/b155211be91dfc0bbd7debadece4f7444b268f94eda7a7fd592c81078374/uv-0.4.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:865c5fbc2ebe73b4f4b71cbcc1b1bae90a335b15f6eaa9fa6495f77a6e86455e", size = 13412833 },
-    { url = "https://files.pythonhosted.org/packages/d0/53/0e16496b7f192143c7ca16291831e422735a56bbe038403e75a80f62886f/uv-0.4.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a65eaec88b084094f5b08c2ad73f0ae972f7d6afd0d3ee1d0eb29a76c010a39b", size = 17514011 },
-    { url = "https://files.pythonhosted.org/packages/fb/5d/c66b95e81c0d5886ddc469ceb507beee8209f515626ccd7a5a662883aeba/uv-0.4.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8e3492d5f1613e88201b6f68a2e5fba48b0bdbe0f11179df9b222e9dd8d89d3", size = 13201373 },
-    { url = "https://files.pythonhosted.org/packages/f8/78/7e6db5e4c1f1dd285cd66046c4591e0fd028ddae4e22ad3829c79396d805/uv-0.4.20-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:8ec4a7d0ab131ea749702d4885ff0f6734e1aca1dc26ebbc1c7c67969ba3c0fc", size = 12216621 },
-    { url = "https://files.pythonhosted.org/packages/75/f1/9046850aaddc67d16a95ede0fe9698eb4a34b0c498a3fbaffa0487f70fb8/uv-0.4.20-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:588aedc47fe02f8cf0dfe0dec3fd5e1f3a707fdf674964b3d31f0523351db9d2", size = 12307322 },
-    { url = "https://files.pythonhosted.org/packages/77/af/9751877609daacd1565298c4f06afc22e045d24f96f45122450c605fb583/uv-0.4.20-py3-none-musllinux_1_1_i686.whl", hash = "sha256:309539e9b29f3fbbedb3835297a324a9206b42005e15b0af3fa73343ab966349", size = 12795806 },
-    { url = "https://files.pythonhosted.org/packages/3a/59/f21395330083937668e5afe238aa1f5ed23312088e2610e803ec32c1106f/uv-0.4.20-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad94fb135bec5c061ba21b1f081f349c3de2b0f8660e168e5afc829d3069e6d", size = 14500131 },
-    { url = "https://files.pythonhosted.org/packages/fd/a6/f77ca7cd9f6421e96c551aebeb118ea2c079bc93e156a778286ee55ed112/uv-0.4.20-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:74f78748e72893a674351ca9d708003629ddc1a00bc51100c901b5d47db73e43", size = 13320918 },
-    { url = "https://files.pythonhosted.org/packages/79/bf/5ea3fcf6e0b769c2c1f8cf919a4cacef3112a0e3e5dd26de31b991c3074c/uv-0.4.20-py3-none-win32.whl", hash = "sha256:dbf454b6f56f9181886426c7aed7a8dfc8258f80082365fe99b2044ff92261ba", size = 12431997 },
-    { url = "https://files.pythonhosted.org/packages/16/37/505d6dbfb6056c45833d1062a510b547fb7ef8cd48914ca7268a0a4797d9/uv-0.4.20-py3-none-win_amd64.whl", hash = "sha256:653bfec188d199384451804a6c055fb1d28662adfee7697fe7108c6fb78924ba", size = 14181507 },
+version = "0.6.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8e/58/917d104f948aea6580d789189028f02835f5c57729c5bc8f7f4a2e588456/uv-0.6.7.tar.gz", hash = "sha256:aa558764265fb69c89c6b5dc7124265d74fb8265d81a91079912df376ff4a3b2", size = 3096401 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/e5/14/988fceeca6a73cb68fa89d4d4e252b13de456ba7cfed6cccf1f7d5c68d09/uv-0.6.7-py3-none-linux_armv6l.whl", hash = "sha256:d069bf5f02a5ccc7bff5f4a047e9b11569cb8c1f26db5ec3ee78e30b36ade0a6", size = 15779511 },
+    { url = "https://files.pythonhosted.org/packages/d1/24/43951bfb8af81149a93dddde3aab6a1dfbda3d39eeb5e80445614e1b7bfa/uv-0.6.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b4beed4004f3cc9b2691d21c40a9a2ff3ddb0e2bb42cacc9545b58bec19c9df7", size = 15862170 },
+    { url = "https://files.pythonhosted.org/packages/1a/32/14cc6acf5179eca4a595ae90a08178e8e1741b9a62ea5688a16f01250bfb/uv-0.6.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:33707fba877cf58cc47406d5910cbfd22cdb2e19451e8b79857d4699650ed37c", size = 14671575 },
+    { url = "https://files.pythonhosted.org/packages/f9/79/477931ef7169dcb2378711c99540657fe04fd6f0ee45a6647f0a0be5bc83/uv-0.6.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:04125921e6c670480254f8e63b863b1040bc84d6286f7a8c0b5a4d29f0aa55e9", size = 15116241 },
+    { url = "https://files.pythonhosted.org/packages/99/6e/7a7c811e3220f62464390134c7c68b167785d96fc10c5d03a9b99b83fe72/uv-0.6.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f09db1158bcc3edad033ee0b5b6a4848af8291e3b271cd76ace3524825d84ea", size = 15500884 },
+    { url = "https://files.pythonhosted.org/packages/bc/95/8123440acb3efa4f5779026d27b9a54da76c75fdc74aa53e2243b4c3e1cc/uv-0.6.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ba45607c9140e8d391a5fd22d5d0b22fc7e0ce76988a39c6aeeb0065bc348a", size = 16150549 },
+    { url = "https://files.pythonhosted.org/packages/6c/c5/71eeeee0626719d47dc3cdb563f3b04c46bba566917f8aa572d76e1decbb/uv-0.6.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:02bcb6e57aaa147b89bdcd55f5ef6c23b18883c8ce0859dafb2f1cf32ae010e3", size = 17065356 },
+    { url = "https://files.pythonhosted.org/packages/bc/a9/2b509469393b27380fa20e08c800898c07427887eb46f6472df69253ac29/uv-0.6.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04832e48d87328f75d7b59a2d00ee3ed3060eaca4777924dba1515f0c00ff5ac", size = 16824191 },
+    { url = "https://files.pythonhosted.org/packages/85/fb/6bd6006ac1832ccb93aab19d154b75bbcab543183f3faf15be24145e2bc7/uv-0.6.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8efd1da986f1380d4b225e1a2e39d5870697487775a3db5a24358b09946a431d", size = 20906822 },
+    { url = "https://files.pythonhosted.org/packages/fb/ff/4d56098d39638b69255b4e2377bbf0243a177745f703ab2af8c26002c071/uv-0.6.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840aa6212289f27d56b2c0cbeb4e95cb5726da8674663ab27d4ec80e3be2a081", size = 16478439 },
+    { url = "https://files.pythonhosted.org/packages/15/55/fddb1bb590e6d9782b16ab120e5c96ec95a29663c9b9e55e7655475767e7/uv-0.6.7-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:97e57773e6107ee578d2483e2cb1342dc2b9379d20f9e559668f053599347caf", size = 15388620 },
+    { url = "https://files.pythonhosted.org/packages/6b/c5/091019d977fddb22a5c3fa1109959a23ca6e8467b4bcb24daa7926157e96/uv-0.6.7-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:2cfc48a4b0cd10df5950d41503798f1b785f33eb0ab1cadf9ceb4a03839e5a48", size = 15481199 },
+    { url = "https://files.pythonhosted.org/packages/b5/33/435769870724bcace2b7feb94db1563fc44cb8142c864fef9cffe88f0eb9/uv-0.6.7-py3-none-musllinux_1_1_i686.whl", hash = "sha256:a572ce4c1286092414ada69ed05de4b2aca3666f30aa5b119191ccb30c7d96d6", size = 15735517 },
+    { url = "https://files.pythonhosted.org/packages/a0/3f/a9cb127a8a27a8f11554363f247e7a999ffd5710817c5a3b93d5be817415/uv-0.6.7-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:57be4e71104bf0244c9b19940bc877d1a7966c0ef43851950f56d2b8d18a8a5b", size = 16609927 },
+    { url = "https://files.pythonhosted.org/packages/42/7c/2b5613e08cb21696e1a5fc39a5a223bfec65f3ca9e33a46756760d11dfc9/uv-0.6.7-py3-none-win32.whl", hash = "sha256:10465c6ec8a02b75deeef45f7b97fe74ae1ee9148b8f6fdd4c84fc4876de5745", size = 15932231 },
+    { url = "https://files.pythonhosted.org/packages/da/88/f4801ec3a702d62d3f8ccb07ff01a80ed191deb7d0dd698928a289c2b18b/uv-0.6.7-py3-none-win_amd64.whl", hash = "sha256:9bccdef3983f0d31830f3cbe6d00384a1d2d5a7175023ba6c5a8acea2804106a", size = 17309492 },
+    { url = "https://files.pythonhosted.org/packages/e6/ae/7272683b14691e80ef840bed206cc5530727d07a98af6f9c4844315ee07d/uv-0.6.7-py3-none-win_arm64.whl", hash = "sha256:8c968ecabb39f3a6909435afc1ed84dc58cae05c99398f1975a0c5e22e4e8b1e", size = 16068268 },
 ]
 
 [[package]]
 name = "virtualenv"
-version = "20.26.6"
+version = "20.29.3"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "distlib" },
     { name = "filelock" },
     { name = "platformdirs" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/3f/40/abc5a766da6b0b2457f819feab8e9203cbeae29327bd241359f866a3da9d/virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48", size = 9372482 }
+sdist = { url = "https://files.pythonhosted.org/packages/c7/9c/57d19fa093bcf5ac61a48087dd44d00655f85421d1aa9722f8befbf3f40a/virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac", size = 4320280 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2", size = 5999862 },
+    { url = "https://files.pythonhosted.org/packages/c2/eb/c6db6e3001d58c6a9e67c74bb7b4206767caa3ccc28c6b9eaf4c23fb4e34/virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170", size = 4301458 },
 ]