Skip to content

Commit

Permalink
Disallow --unique alongside --ignore-cases in file-contents-sorter
Browse files Browse the repository at this point in the history
Closes #794: using these flags at the same time results in undefined
behavior - the final ordering is not guaranteed as --unique breaks
sorting due to passing the contents through a set.

NOTE: I added a newline before and after the mutex group to be
consistent with other usages of mutex groups (e.g.,
check_builtin_literals.py) in this repo.
  • Loading branch information
nemacysts committed Oct 7, 2024
1 parent cef0300 commit f9e6386
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 14 deletions.
7 changes: 5 additions & 2 deletions pre_commit_hooks/file_contents_sorter.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,21 @@ def sort_file_contents(
def main(argv: Sequence[str] | None = None) -> int:
parser = argparse.ArgumentParser()
parser.add_argument('filenames', nargs='+', help='Files to sort')
parser.add_argument(

mutex = parser.add_mutually_exclusive_group(required=False)
mutex.add_argument(
'--ignore-case',
action='store_const',
const=bytes.lower,
default=None,
help='fold lower case to upper case characters',
)
parser.add_argument(
mutex.add_argument(
'--unique',
action='store_true',
help='ensure each line is unique',
)

args = parser.parse_args(argv)

retv = PASS
Expand Down
32 changes: 20 additions & 12 deletions tests/file_contents_sorter_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,6 @@
FAIL,
b'Fie\nFoe\nfee\nfum\n',
),
(
b'fee\nFie\nFoe\nfum\n',
['--unique', '--ignore-case'],
PASS,
b'fee\nFie\nFoe\nfum\n',
),
(
b'fee\nfee\nFie\nFoe\nfum\n',
['--unique', '--ignore-case'],
FAIL,
b'fee\nFie\nFoe\nfum\n',
),
),
)
def test_integration(input_s, argv, expected_retval, output, tmpdir):
Expand All @@ -89,3 +77,23 @@ def test_integration(input_s, argv, expected_retval, output, tmpdir):

assert path.read_binary() == output
assert output_retval == expected_retval

@pytest.mark.parametrize(
("input_s", "argv"),
(
(
b"fee\nFie\nFoe\nfum\n",
["--unique", "--ignore-case"],
),
(
b"fee\nfee\nFie\nFoe\nfum\n",
["--unique", "--ignore-case"],
),
),
)
def test_integration_invalid_args(input_s, argv, tmpdir):
path = tmpdir.join("file.txt")
path.write_binary(input_s)

with pytest.raises(SystemExit):
main([str(path)] + argv)

0 comments on commit f9e6386

Please sign in to comment.