Skip to content

Commit 255ab1d

Browse files
committed
chore(ruff) Automated fixes for typing annotations
Fixed 215 errors: - docs/conf.py: 2 × UP007 (non-pep604-annotation) 2 × UP037 (quoted-annotation) 1 × I002 (missing-required-import) 1 × I001 (unsorted-imports) - src/django_docutils/__about__.py: 1 × I002 (missing-required-import) - src/django_docutils/_internal/types.py: 2 × UP037 (quoted-annotation) 1 × I002 (missing-required-import) - src/django_docutils/exc.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/directives/code.py: 1 × TC003 (typing-only-standard-library-import) 1 × I002 (missing-required-import) 1 × UP037 (quoted-annotation) 1 × I001 (unsorted-imports) - src/django_docutils/lib/directives/registry.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/metadata/extract.py: 2 × UP007 (non-pep604-annotation) 1 × F401 (unused-import) 1 × I002 (missing-required-import) 1 × I001 (unsorted-imports) - src/django_docutils/lib/metadata/process.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/metadata/processors.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/metadata/tests/test_extract.py: 1 × I001 (unsorted-imports) 1 × TC003 (typing-only-standard-library-import) 1 × I002 (missing-required-import) - src/django_docutils/lib/metadata/tests/test_process.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/publisher.py: 11 × UP007 (non-pep604-annotation) 2 × UP037 (quoted-annotation) 1 × I002 (missing-required-import) 1 × TC002 (typing-only-third-party-import) 1 × I001 (unsorted-imports) - src/django_docutils/lib/roles/common.py: 3 × UP037 (quoted-annotation) 2 × UP007 (non-pep604-annotation) 1 × I002 (missing-required-import) - src/django_docutils/lib/roles/email.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × TC001 (typing-only-first-party-import) 1 × I002 (missing-required-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/file.py: 6 × UP007 (non-pep604-annotation) 1 × TC002 (typing-only-third-party-import) 1 × I002 (missing-required-import) - src/django_docutils/lib/roles/github.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × I002 (missing-required-import) 1 × TC001 (typing-only-first-party-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/hackernews.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × I002 (missing-required-import) 1 × TC001 (typing-only-first-party-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/kbd.py: 2 × UP007 (non-pep604-annotation) 1 × TC002 (typing-only-third-party-import) 1 × I002 (missing-required-import) - src/django_docutils/lib/roles/leanpub.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × I002 (missing-required-import) 1 × TC001 (typing-only-first-party-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/pypi.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × I002 (missing-required-import) 1 × TC001 (typing-only-first-party-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/readthedocs.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × TC001 (typing-only-first-party-import) 1 × I002 (missing-required-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/registry.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/roles/twitter.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × I002 (missing-required-import) 1 × TC001 (typing-only-first-party-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/types.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/roles/url.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × I002 (missing-required-import) 1 × TC001 (typing-only-first-party-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/roles/wikipedia.py: 2 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 1 × TC001 (typing-only-first-party-import) 1 × I002 (missing-required-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/lib/settings.py: 1 × UP007 (non-pep604-annotation) 1 × I002 (missing-required-import) - src/django_docutils/lib/tests/test_utils.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/tests/test_writers.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/text.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/transforms/code.py: 8 × UP037 (quoted-annotation) 1 × UP007 (non-pep604-annotation) 1 × I002 (missing-required-import) - src/django_docutils/lib/transforms/toc.py: 2 × UP007 (non-pep604-annotation) 1 × I002 (missing-required-import) - src/django_docutils/lib/types.py: 1 × I002 (missing-required-import) - src/django_docutils/lib/utils.py: 1 × TC003 (typing-only-standard-library-import) 1 × I002 (missing-required-import) 1 × UP037 (quoted-annotation) 1 × I001 (unsorted-imports) - src/django_docutils/lib/views.py: 7 × UP007 (non-pep604-annotation) 2 × I001 (unsorted-imports) 2 × TC002 (typing-only-third-party-import) 1 × I002 (missing-required-import) 1 × TC001 (typing-only-first-party-import) - src/django_docutils/lib/writers.py: 4 × UP007 (non-pep604-annotation) 1 × TC002 (typing-only-third-party-import) 1 × I002 (missing-required-import) - src/django_docutils/template.py: 4 × UP037 (quoted-annotation) 2 × UP007 (non-pep604-annotation) 1 × I002 (missing-required-import) 1 × TC002 (typing-only-third-party-import) - src/django_docutils/templatetags/django_docutils.py: 7 × UP007 (non-pep604-annotation) 1 × F401 (unused-import) 1 × I002 (missing-required-import) 1 × I001 (unsorted-imports) - src/django_docutils/views.py: 11 × UP007 (non-pep604-annotation) 2 × TC002 (typing-only-third-party-import) 1 × I002 (missing-required-import) 1 × I001 (unsorted-imports) - tests/constants.py: 1 × I002 (missing-required-import) - tests/settings.py: 1 × I002 (missing-required-import) 1 × UP037 (quoted-annotation) - tests/test_docutils_roles.py: 2 × TC002 (typing-only-third-party-import) 1 × UP007 (non-pep604-annotation) 1 × I002 (missing-required-import) 1 × TC003 (typing-only-standard-library-import) 1 × I001 (unsorted-imports) - tests/test_template.py: 1 × TC003 (typing-only-standard-library-import) 1 × I002 (missing-required-import) 1 × UP037 (quoted-annotation) 1 × I001 (unsorted-imports) - tests/test_templatetag.py: 1 × I002 (missing-required-import) Found 567 errors (215 fixed, 352 remaining). 43 files reformatted, 12 files left unchanged uv run ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; uv run ruff format .
1 parent e1e5759 commit 255ab1d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+267
-144
lines changed

docs/conf.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""Sphinx configuration for Django Docutils."""
22

33
# flake8: noqa: E501
4+
from __future__ import annotations
5+
46
import inspect
57
import os
68
import pathlib
@@ -77,7 +79,7 @@
7779
html_extra_path = ["manifest.json"]
7880
html_theme = "furo"
7981
html_theme_path: list[str] = []
80-
html_theme_options: dict[str, t.Union[str, list[dict[str, str]]]] = {
82+
html_theme_options: dict[str, str | list[dict[str, str]]] = {
8183
"light_logo": "img/icons/logo.svg",
8284
"dark_logo": "img/icons/logo-dark.svg",
8385
"footer_icons": [
@@ -147,7 +149,7 @@
147149
}
148150

149151

150-
def linkcode_resolve(domain: str, info: dict[str, str]) -> t.Union[None, str]:
152+
def linkcode_resolve(domain: str, info: dict[str, str]) -> None | str:
151153
"""
152154
Determine the URL corresponding to Python object.
153155
@@ -217,13 +219,13 @@ def linkcode_resolve(domain: str, info: dict[str, str]) -> t.Union[None, str]:
217219
)
218220

219221

220-
def remove_tabs_js(app: "Sphinx", exc: Exception) -> None:
222+
def remove_tabs_js(app: Sphinx, exc: Exception) -> None:
221223
"""Fix for sphinx-inline-tabs#18."""
222224
if app.builder.format == "html" and not exc:
223225
tabs_js = pathlib.Path(app.builder.outdir) / "_static" / "tabs.js"
224226
tabs_js.unlink(missing_ok=True)
225227

226228

227-
def setup(app: "Sphinx") -> None:
229+
def setup(app: Sphinx) -> None:
228230
"""Sphinx setup hook."""
229231
app.connect("build-finished", remove_tabs_js)

src/django_docutils/__about__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Metadata package for Django Docutils."""
22

3+
from __future__ import annotations
4+
35
__title__ = "django-docutils"
46
__package_name__ = "django_docutils"
57
__description__ = "Docutils (a.k.a. reStructuredText, reST, RST) support for django."

src/django_docutils/_internal/types.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,19 @@
77
.. _typeshed's: https://github.com/python/typeshed/blob/5df8de7/stdlib/_typeshed/__init__.pyi#L115-L118
88
""" # E501
99

10+
from __future__ import annotations
11+
1012
from typing import TYPE_CHECKING, Union
1113

1214
if TYPE_CHECKING:
1315
from os import PathLike
1416

1517
from typing_extensions import TypeAlias
1618

17-
StrPath: "TypeAlias" = Union[str, "PathLike[str]"] # stable
19+
StrPath: TypeAlias = Union[str, "PathLike[str]"] # stable
1820
""":class:`os.PathLike` or :class:`str`"""
1921

20-
StrOrBytesPath: "TypeAlias" = Union[
22+
StrOrBytesPath: TypeAlias = Union[
2123
str,
2224
bytes,
2325
"PathLike[str]",

src/django_docutils/exc.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Exceptions for Django Docutils."""
22

3+
from __future__ import annotations
4+
35

46
class DjangoDocutilsException(Exception):
57
"""Base exception for Django Docutils package."""

src/django_docutils/lib/directives/code.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@
3636
:license: BSD, see LICENSE for details.
3737
"""
3838

39+
from __future__ import annotations
40+
3941
import re
4042
import typing as t
41-
from collections.abc import Callable
4243

4344
from docutils import nodes
4445
from docutils.parsers.rst import Directive, directives
@@ -48,6 +49,8 @@
4849
from pygments.lexers.special import TextLexer
4950

5051
if t.TYPE_CHECKING:
52+
from collections.abc import Callable
53+
5154
from pygments.formatter import Formatter
5255

5356

@@ -72,7 +75,7 @@ def patch_bash_session_lexer() -> None:
7275
DEFAULT = HtmlFormatter(cssclass="highlight code-block", noclasses=INLINESTYLES)
7376

7477
#: Add name -> formatter pairs for every variant you want to use
75-
VARIANTS: dict[str, "Formatter[str]"] = {
78+
VARIANTS: dict[str, Formatter[str]] = {
7679
# 'linenos': HtmlFormatter(noclasses=INLINESTYLES, linenos=True),
7780
}
7881

src/django_docutils/lib/directives/registry.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Register douctils directives for django-docutils."""
22

3+
from __future__ import annotations
4+
35
from django.utils.module_loading import import_string
46
from docutils.parsers.rst import directives
57

src/django_docutils/lib/metadata/extract.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
"""Title, Subtitle, and Metadata extraction of reStructuredText."""
22

3-
import typing as t
3+
from __future__ import annotations
44

55
from django.template.defaultfilters import truncatewords
66
from django.utils.html import strip_tags
77
from docutils import nodes
88

99

10-
def extract_title(document: nodes.document) -> t.Optional[str]:
10+
def extract_title(document: nodes.document) -> str | None:
1111
"""Return the title of the document.
1212
1313
Parameters
@@ -77,7 +77,7 @@ def extract_metadata(document: nodes.document) -> dict[str, str]:
7777
return output
7878

7979

80-
def extract_subtitle(document: nodes.document) -> t.Optional[str]:
80+
def extract_subtitle(document: nodes.document) -> str | None:
8181
"""Return the subtitle of the document."""
8282
for node in document.traverse(nodes.PreBibliographic): # type:ignore
8383
if isinstance(node, nodes.subtitle):

src/django_docutils/lib/metadata/process.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ def process_datetime(metadata):
3030
See *processors.py* for more examples.
3131
"""
3232

33+
from __future__ import annotations
34+
3335
from django.utils.module_loading import import_string
3436

3537
from django_docutils.lib.settings import DJANGO_DOCUTILS_LIB_RST

src/django_docutils/lib/metadata/processors.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Metadata processing for Django Docutils."""
22

3+
from __future__ import annotations
4+
35
import datetime
46
import typing as t
57

src/django_docutils/lib/metadata/tests/test_extract.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""Test metadata and title extraction from reStructuredText."""
22

3-
import pathlib
3+
from __future__ import annotations
4+
5+
from typing import TYPE_CHECKING
46

57
from django.utils.encoding import force_bytes
68
from docutils.core import publish_doctree
@@ -12,6 +14,9 @@
1214
)
1315
from django_docutils.lib.settings import DJANGO_DOCUTILS_LIB_RST
1416

17+
if TYPE_CHECKING:
18+
import pathlib
19+
1520

1621
def test_extract_title() -> None:
1722
"""Assert title extraction from reStructuredText."""

src/django_docutils/lib/metadata/tests/test_process.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Test docutils metadata (docinfo) processing in Django Docutils."""
22

3+
from __future__ import annotations
4+
35
import datetime
46

57
from django.utils.encoding import force_bytes

src/django_docutils/lib/publisher.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
"""Docutils Publisher fors for Django Docutils."""
22

3+
from __future__ import annotations
4+
35
import typing as t
46

57
from django.utils.encoding import force_bytes, force_str
68
from django.utils.safestring import mark_safe
79
from docutils import io, nodes
810
from docutils.core import Publisher, publish_doctree as docutils_publish_doctree
911
from docutils.readers.doctree import Reader
10-
from docutils.writers.html5_polyglot import Writer
1112

1213
from .directives.registry import register_django_docutils_directives
1314
from .roles.registry import register_django_docutils_roles
@@ -17,19 +18,20 @@
1718

1819
if t.TYPE_CHECKING:
1920
from docutils import SettingsSpec
21+
from docutils.writers.html5_polyglot import Writer
2022

2123
docutils_settings = DJANGO_DOCUTILS_LIB_RST.get("docutils", {})
2224

2325

2426
def publish_parts_from_doctree(
2527
document: nodes.document,
26-
destination_path: t.Optional[str] = None,
27-
writer: t.Optional[Writer] = None,
28+
destination_path: str | None = None,
29+
writer: Writer | None = None,
2830
writer_name: str = "pseudoxml",
29-
settings: t.Optional[t.Any] = None,
30-
settings_spec: "t.Optional[SettingsSpec]" = None,
31-
settings_overrides: t.Optional[t.Any] = None,
32-
config_section: t.Optional[str] = None,
31+
settings: t.Any | None = None,
32+
settings_spec: SettingsSpec | None = None,
33+
settings_overrides: t.Any | None = None,
34+
config_section: str | None = None,
3335
enable_exit_status: bool = False,
3436
) -> dict[str, str]:
3537
"""Render docutils doctree into docutils parts."""
@@ -56,8 +58,8 @@ def publish_parts_from_doctree(
5658

5759
def publish_toc_from_doctree(
5860
doctree: nodes.document,
59-
writer: t.Optional[Writer] = None,
60-
) -> t.Optional[str]:
61+
writer: Writer | None = None,
62+
) -> str | None:
6163
"""Publish table of contents from docutils doctree."""
6264
if not writer:
6365
writer = DjangoDocutilsWriter()
@@ -98,7 +100,7 @@ def publish_toc_from_doctree(
98100

99101

100102
def publish_doctree(
101-
source: t.Union[str, bytes],
103+
source: str | bytes,
102104
settings_overrides: t.Any = docutils_settings,
103105
) -> nodes.document:
104106
"""Split off ability to get doctree (a.k.a. document).
@@ -139,8 +141,8 @@ class PublishHtmlDocTreeKwargs(TypedDict):
139141

140142
def publish_html_from_source(
141143
source: str,
142-
**kwargs: "Unpack[PublishHtmlDocTreeKwargs]",
143-
) -> t.Optional[str]:
144+
**kwargs: Unpack[PublishHtmlDocTreeKwargs],
145+
) -> str | None:
144146
"""Return HTML from reStructuredText source string."""
145147
doctree = publish_doctree(source)
146148
return publish_html_from_doctree(doctree, **kwargs)
@@ -150,7 +152,7 @@ def publish_html_from_doctree(
150152
doctree: nodes.document,
151153
show_title: bool = True,
152154
toc_only: bool = False,
153-
) -> t.Optional[str]:
155+
) -> str | None:
154156
"""Return HTML from reStructuredText document (doctree).
155157
156158
Parameters

src/django_docutils/lib/roles/common.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Core parts for Django Docutils roles."""
22

3+
from __future__ import annotations
4+
35
import typing as t
46

57
from docutils import nodes, utils
@@ -13,9 +15,9 @@
1315
def generic_url_role(
1416
name: str,
1517
text: str,
16-
url_handler_fn: "UrlHandlerFn",
17-
innernodeclass: type[t.Union[nodes.Text, nodes.TextElement]] = nodes.Text,
18-
) -> "RoleFnReturnValue":
18+
url_handler_fn: UrlHandlerFn,
19+
innernodeclass: type[nodes.Text | nodes.TextElement] = nodes.Text,
20+
) -> RoleFnReturnValue:
1921
"""Docutils Role for Django Docutils.
2022
2123
This generic role also handles explicit titles (``:role:`yata yata <target>```)
@@ -78,8 +80,8 @@ def url_handler(target):
7880
def generic_remote_url_role(
7981
name: str,
8082
text: str,
81-
url_handler_fn: "RemoteUrlHandlerFn",
82-
innernodeclass: type[t.Union[nodes.Text, nodes.TextElement]] = nodes.Text,
83+
url_handler_fn: RemoteUrlHandlerFn,
84+
innernodeclass: type[nodes.Text | nodes.TextElement] = nodes.Text,
8385
) -> tuple[list[nodes.reference], list[t.Any]]:
8486
"""Docutils Role that can call an external data source for title and URL.
8587

src/django_docutils/lib/roles/email.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
"""Email role for docutils."""
22

3-
import typing as t
3+
from __future__ import annotations
44

5-
from docutils.parsers.rst.states import Inliner
5+
import typing as t
66

77
from .common import generic_url_role
8-
from .types import RoleFnReturnValue
8+
9+
if t.TYPE_CHECKING:
10+
from docutils.parsers.rst.states import Inliner
11+
12+
from .types import RoleFnReturnValue
913

1014

1115
def email_role(
@@ -14,8 +18,8 @@ def email_role(
1418
text: str,
1519
lineno: int,
1620
inliner: Inliner,
17-
options: t.Optional[dict[str, t.Any]] = None,
18-
content: t.Optional[str] = None,
21+
options: dict[str, t.Any] | None = None,
22+
content: str | None = None,
1923
) -> RoleFnReturnValue:
2024
"""Role for linking to email articles.
2125

src/django_docutils/lib/roles/file.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
"""File role for Docutils."""
22

3+
from __future__ import annotations
4+
35
import os
46
import typing as t
57

68
from docutils import nodes, utils
7-
from docutils.parsers.rst.states import Inliner
9+
10+
if t.TYPE_CHECKING:
11+
from docutils.parsers.rst.states import Inliner
812

913

1014
def file_role(
@@ -13,8 +17,8 @@ def file_role(
1317
text: str,
1418
lineno: int,
1519
inliner: Inliner,
16-
options: t.Optional[dict[str, t.Any]] = None,
17-
content: t.Optional[str] = None,
20+
options: dict[str, t.Any] | None = None,
21+
content: str | None = None,
1822
) -> tuple[list[nodes.emphasis], list[t.Any]]:
1923
"""Role for files.
2024
@@ -66,8 +70,8 @@ def manifest_role(
6670
text: str,
6771
lineno: int,
6872
inliner: Inliner,
69-
options: t.Optional[dict[str, t.Any]] = None,
70-
content: t.Optional[str] = None,
73+
options: dict[str, t.Any] | None = None,
74+
content: str | None = None,
7175
) -> tuple[list[nodes.emphasis], list[t.Any]]:
7276
"""Role for manifests (package.json, file outputs).
7377
@@ -103,8 +107,8 @@ def exe_role(
103107
text: str,
104108
lineno: int,
105109
inliner: Inliner,
106-
options: t.Optional[dict[str, t.Any]] = None,
107-
content: t.Optional[str] = None,
110+
options: dict[str, t.Any] | None = None,
111+
content: str | None = None,
108112
) -> tuple[list[nodes.emphasis], list[t.Any]]:
109113
"""Role for executables.
110114

0 commit comments

Comments
 (0)