Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to force unions (and options) to be rendered with bars #418

Merged
merged 9 commits into from
Feb 8, 2024
10 changes: 9 additions & 1 deletion src/sphinx_autodoc_typehints/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,13 @@ def format_annotation(annotation: Any, config: Config) -> str: # noqa: C901, PL
args_format = "\\[{}]"
formatted_args: str | None = ""

always_use_bars_union: bool = getattr(config, "always_use_bars_union", False)
gaborbernat marked this conversation as resolved.
Show resolved Hide resolved
isbarsunion = full_name == "types.UnionType" or (
hoodmane marked this conversation as resolved.
Show resolved Hide resolved
always_use_bars_union and type(annotation).__qualname__ == "_UnionGenericAlias"
)
if isbarsunion:
full_name = ""

# Some types require special handling
if full_name == "typing.NewType":
args_format = f"\\(``{annotation.__name__}``, {{}})"
Expand Down Expand Up @@ -247,7 +254,7 @@ def format_annotation(annotation: Any, config: Config) -> str: # noqa: C901, PL
formatted_args = f"\\[\\[{', '.join(fmt[:-1])}], {fmt[-1]}]"
elif full_name == "typing.Literal":
formatted_args = f"\\[{', '.join(f'``{arg!r}``' for arg in args)}]"
elif full_name == "types.UnionType":
elif isbarsunion:
return " | ".join([format_annotation(arg, config) for arg in args])

if args and not formatted_args:
Expand Down Expand Up @@ -930,6 +937,7 @@ def setup(app: Sphinx) -> dict[str, bool]:
app.add_config_value("typehints_use_rtype", True, "env") # noqa: FBT003
app.add_config_value("typehints_defaults", None, "env")
app.add_config_value("simplify_optional_unions", True, "env") # noqa: FBT003
app.add_config_value("always_use_bars_union", False, "env") # noqa: FBT003
app.add_config_value("typehints_formatter", None, "env")
app.add_config_value("typehints_use_signature", False, "env") # noqa: FBT003
app.add_config_value("typehints_use_signature_return", False, "env") # noqa: FBT003
Expand Down
19 changes: 19 additions & 0 deletions tests/test_sphinx_autodoc_typehints.py
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,25 @@ def test_format_annotation(inv: Inventory, annotation: Any, expected_result: str
assert m.group("role") == expected_role


@pytest.mark.parametrize(
("annotation", "expected_result"),
[
(int | float, ":py:class:`int` | :py:class:`float`"),
(int | float | None, ":py:class:`int` | :py:class:`float` | :py:obj:`None`"),
(Union[int, float], ":py:class:`int` | :py:class:`float`"),
(Union[int, float, None], ":py:class:`int` | :py:class:`float` | :py:obj:`None`"),
(Optional[int | float], ":py:class:`int` | :py:class:`float` | :py:obj:`None`"),
(Optional[Union[int, float]], ":py:class:`int` | :py:class:`float` | :py:obj:`None`"),
(Union[int | float, str], ":py:class:`int` | :py:class:`float` | :py:class:`str`"),
(Union[int, float] | str, ":py:class:`int` | :py:class:`float` | :py:class:`str`"),
],
)
def test_always_use_bars_union(annotation: Any, expected_result: str) -> None:
conf = create_autospec(Config, always_use_bars_union=True)
result = format_annotation(annotation, conf)
assert result == expected_result


@pytest.mark.parametrize("library", [typing, typing_extensions], ids=["typing", "typing_extensions"])
@pytest.mark.parametrize(
("annotation", "params", "expected_result"),
Expand Down
Loading