Skip to content

Commit fb6b701

Browse files
Read additional args from file with with @<path>.
1 parent 0eff305 commit fb6b701

3 files changed

Lines changed: 44 additions & 1 deletion

File tree

README.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,13 @@ instead of these invalid entries:
229229
230230
.. _tomli: https://pypi.org/project/tomli/
231231

232+
Reading arguments from file
233+
---------------------------
234+
235+
Additional arguments can be read from a file with ``@PATH``. Arguments are
236+
extracted using ``shlex.split()``.
237+
238+
232239
pre-commit hook
233240
---------------
234241

codespell_lib/_codespell.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import itertools
2424
import os
2525
import re
26+
import shlex
2627
import sys
2728
import textwrap
2829
from collections.abc import Iterable, Sequence
@@ -388,7 +389,20 @@ def _supports_ansi_colors() -> bool:
388389
def parse_options(
389390
args: Sequence[str],
390391
) -> tuple[argparse.Namespace, argparse.ArgumentParser, list[str]]:
391-
parser = argparse.ArgumentParser(formatter_class=NewlineHelpFormatter)
392+
393+
# Split lines read from `@PATH` using shlex.split(), otherwise default
394+
# behaviour is to have one arg per line. See:
395+
# https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.convert_arg_line_to_args
396+
class ArgumentParser(argparse.ArgumentParser):
397+
def convert_arg_line_to_args(self, arg_line: str
398+
) -> list[str]:
399+
return shlex.split(arg_line)
400+
401+
parser = ArgumentParser(
402+
formatter_class=NewlineHelpFormatter,
403+
fromfile_prefix_chars="@",
404+
epilog="Use @PATH to read additional arguments from file PATH.",
405+
)
392406

393407
parser.set_defaults(colors=_supports_ansi_colors())
394408
parser.add_argument("--version", action="version", version=VERSION)

codespell_lib/tests/test_basic.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,3 +1458,25 @@ def test_stdin(tmp_path: Path, capsys: pytest.CaptureFixture[str]) -> None:
14581458
code, stdout, _ = result
14591459
assert stdout == "1: Thsi ==> This\n"
14601460
assert code == 1
1461+
1462+
def test_args_from_file(
1463+
tmp_path: Path,
1464+
capsys: pytest.CaptureFixture[str],
1465+
) -> None:
1466+
fname1 = tmp_path / "tmp1"
1467+
fname2 = tmp_path / "tmp2"
1468+
fname3 = tmp_path / "tmp3"
1469+
fname_list = tmp_path / "tmp_list"
1470+
fname_list.write_text(f"{fname1} {fname2}\n{fname3}")
1471+
fname1.write_text("abandonned\ncode")
1472+
fname2.write_text("exmaple\n")
1473+
fname3.write_text("abilty\n")
1474+
print(f'@{fname_list}')
1475+
result = cs.main(f"@{fname_list}", std=True)
1476+
assert isinstance(result, tuple)
1477+
code, stdout, stderr = result
1478+
print(f"{code=} {stdout=} {stderr=}")
1479+
assert "tmp1:1: abandonned ==> abandoned\n" in stdout, f"{stdout=}"
1480+
assert "tmp2:1: exmaple ==> example\n" in stdout, f"{stdout=}"
1481+
assert "tmp3:1: abilty ==> ability\n" in stdout, f"{stdout=}"
1482+
assert code == 3, f"{code=}"

0 commit comments

Comments
 (0)