Skip to content

Commit e757c8c

Browse files
Permit to change the formatters given to Run
For easier testing
1 parent 0ded93a commit e757c8c

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,12 +2,14 @@
22
import os
33
import sys
44
from pathlib import Path
5+
from tokenize import TokenInfo
56
from typing import List
67

78
import pytest
89

910
import pydocstringformatter
10-
from pydocstringformatter.formatting import FORMATTERS
11+
from pydocstringformatter.formatting import FORMATTERS, Formatter
12+
from pydocstringformatter.run import _Run
1113

1214

1315
def test_no_arguments(capsys: pytest.CaptureFixture[str]) -> None:
@@ -116,6 +118,28 @@ def test_output_message_two_files(
116118
assert not output.err
117119

118120

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

0 commit comments

Comments
 (0)