-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add hook to check for fuzzy messages (#19)
- Loading branch information
Showing
6 changed files
with
182 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
[bumpversion] | ||
current_version = 1.6.1 | ||
current_version = 1.7.0 | ||
|
||
[bumpversion:file:setup.cfg] | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
"""Checks for fuzzy messages in PO files. | ||
Returns an error code if a PO file has a fuzzy message. | ||
""" | ||
|
||
import argparse | ||
import sys | ||
|
||
|
||
def check_fuzzy_messages(filenames, quiet=False): | ||
"""Warns about all fuzzy messages found in a set of PO files. | ||
Parameters | ||
---------- | ||
filenames : list | ||
Set of file names to check. | ||
quiet : bool, optional | ||
Enabled, don't print output to stderr when an fuzzy message is found. | ||
Returns | ||
------- | ||
int: 0 if no fuzzy messages found, 1 otherwise. | ||
""" | ||
exitcode = 0 | ||
for filename in filenames: | ||
with open(filename) as f: | ||
content_lines = f.readlines() | ||
|
||
for i, line in enumerate(content_lines): | ||
if line.startswith("#,") and "fuzzy" in line: | ||
exitcode = 1 | ||
if not quiet: | ||
sys.stderr.write(f"Found fuzzy message at {filename}:{i + 1}\n") | ||
|
||
return exitcode | ||
|
||
|
||
def main(): | ||
parser = argparse.ArgumentParser() | ||
parser.add_argument( | ||
"filenames", nargs="*", help="Filenames to check for fuzzy messages" | ||
) | ||
parser.add_argument("-q", "--quiet", action="store_true", help="Supress output") | ||
args = parser.parse_args() | ||
return check_fuzzy_messages(args.filenames, quiet=args.quiet) | ||
|
||
|
||
if __name__ == "__main__": | ||
exit(main()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
"""Obsolete messages hook tests.""" | ||
|
||
import contextlib | ||
import io | ||
import os | ||
import uuid | ||
|
||
import pytest | ||
|
||
from hooks.fuzzy_messages import check_fuzzy_messages | ||
|
||
|
||
""" | ||
( | ||
[ | ||
( | ||
'#\nmsgid ""\nmsgstr ""\n\n#~ msgid "Obsolete "\n#~ "message"' | ||
'\n#~ msgstr "Mensaje obsoleto"\n' | ||
), | ||
'#\nmsgid ""\nmsgstr ""\n\nmsgid "Hello"\nmsgstr "Hola"\n', | ||
( | ||
'#\nmsgid ""\nmsgstr ""\n\n#~ msgid "Hello"\n#~ msgstr "Hola"\n' | ||
'\nmsgid "Foo"\nmsgstr "Bar"\n' | ||
), | ||
], | ||
2, | ||
1, | ||
[5, 5], | ||
), | ||
( | ||
['#\nmsgid ""\nmsgstr ""\n\nmsgid "Current"\nmsgstr "Actual"\n'], | ||
0, | ||
0, | ||
None, | ||
), | ||
""" | ||
|
||
|
||
@pytest.mark.parametrize("quiet", (False, True), ids=("quiet=False", "quiet=True")) | ||
@pytest.mark.parametrize( | ||
("contents", "n_printed_errors", "expected_exitcode", "expected_line_numbers"), | ||
( | ||
pytest.param( | ||
[ | ||
( | ||
'#\nmsgid ""\nmsgstr ""\n\n' | ||
'#, fuzzy\n#~ msgid "Obsolete"\n#~ msgstr "Obsoleto"\n' | ||
) | ||
], | ||
1, | ||
1, | ||
[5], | ||
id="one-fuzzy-message", | ||
), | ||
pytest.param( | ||
[ | ||
( | ||
'#\nmsgid ""\nmsgstr ""\n\n' | ||
'#, fuzzy\n#~ msgid "Obsolete"\n#~ msgstr "Obsoleto"\n' | ||
), | ||
( | ||
'#\nmsgid ""\nmsgstr ""\n\n' | ||
'#, fuzzy\nmsgid "Foo"\nmsgstr "Foo es"\n\n' | ||
'msgid "Bar"\nmsgstr "Bar es"\n' | ||
), | ||
], | ||
2, | ||
1, | ||
[5, 5], | ||
id="two-fuzzy-messages-in-two-files", | ||
), | ||
pytest.param( | ||
['#\nmsgid ""\nmsgstr ""\n\nmsgid "Current"\nmsgstr "Actual"\n'], | ||
0, | ||
0, | ||
None, | ||
id="no-fuzzy-messages", | ||
), | ||
), | ||
) | ||
def test_check_fuzzy_messages( | ||
quiet, | ||
contents, | ||
n_printed_errors, | ||
expected_exitcode, | ||
expected_line_numbers, | ||
tmp_path, | ||
): | ||
filenames = [] | ||
for content in contents: | ||
filename = tmp_path / f"{uuid.uuid4().hex[:16]}.po" | ||
|
||
with open(filename, "w") as f: | ||
f.write(content) | ||
|
||
filenames.append(filename) | ||
|
||
stderr = io.StringIO() | ||
with contextlib.redirect_stderr(stderr): | ||
assert check_fuzzy_messages(filenames, quiet=quiet) == expected_exitcode | ||
|
||
stderr_lines = stderr.getvalue().splitlines() | ||
if quiet: | ||
n_printed_errors = 0 | ||
assert len(stderr_lines) == n_printed_errors | ||
|
||
if n_printed_errors: | ||
assert len(stderr_lines) == len(expected_line_numbers) | ||
|
||
for i, line in enumerate(stderr_lines): | ||
line_number = int(line.split(":")[-1]) | ||
assert line_number == expected_line_numbers[i] | ||
|
||
for filename in filenames: | ||
os.remove(filename) |