Skip to content

Commit 9bdff7c

Browse files
Permit to change the formatters given to Run
For easier testing
1 parent ebb3397 commit 9bdff7c

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

pydocstringformatter/formatting/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__all__ = ["FORMATTERS"]
1+
__all__ = ["FORMATTERS", "Formatter"]
22

33
from typing import List
44

pydocstringformatter/run.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,28 @@
66
import sys
77
import tokenize
88
from pathlib import Path
9-
from typing import List, Union
9+
from typing import List, Optional, Union
1010

1111
from pydocstringformatter import __version__, formatting, utils
1212

1313

1414
class _Run:
1515
"""Main class that represent a run of the program."""
1616

17-
def __init__(self, argv: Union[List[str], None]) -> None:
17+
def __init__(
18+
self,
19+
argv: Union[List[str], None],
20+
formatters: Optional[List[formatting.Formatter]] = None,
21+
) -> None:
22+
if formatters is None:
23+
formatters = formatting.FORMATTERS
24+
self.formatters = formatters
1825
self.arg_parser = utils._register_arguments(__version__)
19-
utils._register_arguments_formatters(self.arg_parser, formatting.FORMATTERS)
26+
utils._register_arguments_formatters(self.arg_parser, self.formatters)
2027
self.config = argparse.Namespace()
2128

2229
if argv := argv or sys.argv[1:]:
23-
utils._parse_options(
24-
self.arg_parser, self.config, argv, formatting.FORMATTERS
25-
)
30+
utils._parse_options(self.arg_parser, self.config, argv, self.formatters)
2631
self._check_files(self.config.files)
2732
else:
2833
self.arg_parser.print_help()

tests/test_run.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
import os
33
import sys
44
from pathlib import Path
5+
from tokenize import TokenInfo
56
from typing import List
67
from unittest.mock import patch
78

89
import pytest
910

1011
import pydocstringformatter
11-
from pydocstringformatter.formatting import FORMATTERS
12+
from pydocstringformatter.formatting import FORMATTERS, Formatter
13+
from pydocstringformatter.run import _Run
1214

1315

1416
def test_no_arguments(capsys: pytest.CaptureFixture[str]) -> None:
@@ -115,6 +117,28 @@ def test_output_message_two_files(
115117
assert not output.err
116118

117119

120+
def test_optional_formatter(capsys: pytest.CaptureFixture[str]) -> None:
121+
"""If a Formatter is optional we handle that in _load_default_formatter."""
122+
123+
class OptionalFormatter(Formatter):
124+
"""Non-optional docstring."""
125+
126+
optional = True
127+
name = "optional-formatter"
128+
129+
def treat_token(self, tokeninfo: TokenInfo) -> TokenInfo:
130+
"""This does nothing"""
131+
return tokeninfo
132+
133+
with pytest.raises(SystemExit):
134+
_Run(argv=["--help"], formatters=[OptionalFormatter()])
135+
out, err = capsys.readouterr()
136+
assert not err
137+
assert "--optional-formatter" in out
138+
assert "optional docstring." in out
139+
assert "--no-optional-formatter" in out
140+
141+
118142
@pytest.mark.parametrize(
119143
"args,should_format",
120144
[

0 commit comments

Comments
 (0)