Skip to content

Commit b848277

Browse files
committed
fix: Warn when formatting signature if Black is not installed
1 parent dc4bfc4 commit b848277

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

src/mkdocstrings_handlers/python/renderer.py

+22-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import re
77
import sys
88
from collections import ChainMap
9+
from functools import lru_cache
910
from typing import Any, Sequence
1011

1112
from griffe.dataclasses import Alias, Object
@@ -14,7 +15,9 @@
1415

1516
from mkdocstrings.extension import PluginError
1617
from mkdocstrings.handlers.base import BaseRenderer, CollectorItem
18+
from mkdocstrings.loggers import get_logger
1719

20+
logger = get_logger(__name__)
1821
# TODO: CSS classes everywhere in templates
1922
# TODO: name normalization (filenames, Jinja2 variables, HTML tags, CSS classes)
2023
# TODO: Jinja2 blocks everywhere in templates
@@ -145,15 +148,11 @@ def do_format_signature(self, signature: str, line_length: int) -> str:
145148
Returns:
146149
The same code, formatted.
147150
"""
148-
from black import Mode, format_str
149-
150151
code = signature.strip()
151152
if len(code) < line_length:
152153
return code
153-
mode = Mode(line_length=line_length)
154-
formatted = format_str(f"def {code}: pass", mode=mode)
155-
# remove starting `def ` and trailing `: pass`
156-
return formatted[4:-5].strip()[:-1]
154+
formatter = _get_black_formatter()
155+
return formatter(code, line_length)
157156

158157
def do_order_members(self, members: Sequence[Object | Alias], order: Order) -> Sequence[Object | Alias]:
159158
"""Order members given an ordering method.
@@ -209,3 +208,20 @@ def repl(match): # noqa: WPS430
209208
if code:
210209
text = f"<code>{text}</code>"
211210
return Markup(text).format(**variables)
211+
212+
213+
@lru_cache(maxsize=1)
214+
def _get_black_formatter():
215+
try:
216+
from black import Mode, format_str
217+
except ModuleNotFoundError:
218+
logger.warning("Formatting signatures requires Black to be installed.")
219+
return lambda text, _: text
220+
221+
def formatter(code, line_length): # noqa: WPS430
222+
mode = Mode(line_length=line_length)
223+
formatted = format_str(f"def {code}: pass", mode=mode)
224+
# remove starting `def ` and trailing `: pass`
225+
return formatted[4:-5].strip()[:-1]
226+
227+
return formatter

0 commit comments

Comments
 (0)