diff --git a/bear-requirements.txt b/bear-requirements.txt index 491dfb5661..c7ed7f57a0 100644 --- a/bear-requirements.txt +++ b/bear-requirements.txt @@ -4,6 +4,7 @@ bandit~=1.2 cmakelint~=1.3 cppclean~=0.12.0 cpplint~=1.3 +dennis~=0.8 eradicate~=0.1.6 guess-language-spirit~=0.5.2 html-linter~=0.3.0 diff --git a/bears/gettext/DennisBear.py b/bears/gettext/DennisBear.py new file mode 100644 index 0000000000..a2a3e2f0e3 --- /dev/null +++ b/bears/gettext/DennisBear.py @@ -0,0 +1,41 @@ +from coalib.bearlib.abstractions.Linter import linter +from coalib.results.RESULT_SEVERITY import RESULT_SEVERITY +from dependency_management.requirements.PipRequirement import PipRequirement + + +@linter(executable='dennis-cmd', + output_format='regex', + output_regex=r'(?P(?P[EW])[0-9]{3}: .*)' + r'\n(?P[0-9]+):.*\n(?P[0-9]+):.*', + severity_map={'W': RESULT_SEVERITY.NORMAL, + 'E': RESULT_SEVERITY.MAJOR}) +class DennisBear: + """ + Lints your translated PO and POT files! + + Check multiple lint rules on all the strings in the PO file + generating a list of errors and a list of warnings. + + See http://dennis.readthedocs.io/en/latest/linting.html for + list of all error codes. + + http://dennis.readthedocs.io/ + """ + + LANGUAGES = {'po', 'pot'} + REQUIREMENTS = {PipRequirement('dennis', '0.8')} + AUTHORS = {'The coala developers'} + AUTHORS_EMAILS = {'coala-devel@googlegroups.com'} + LICENSE = 'AGPL-3.0' + CAN_DETECT = {'Syntax'} + + @staticmethod + def create_arguments(filename, file, config_file, allow_untranslated=True): + """ + :param allow_untranslated: Set to false to display unchanged + translation warning. + """ + if allow_untranslated: + return ('lint', filename, '--excluderules', 'W302') + else: + return ('lint', filename) diff --git a/bears/gettext/__init__.py b/bears/gettext/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/gettext/DennisBearTest.py b/tests/gettext/DennisBearTest.py new file mode 100644 index 0000000000..e3ca6c845b --- /dev/null +++ b/tests/gettext/DennisBearTest.py @@ -0,0 +1,30 @@ +import os +from queue import Queue + + +from bears.gettext.DennisBear import DennisBear +from coalib.testing.LocalBearTestHelper import LocalBearTestHelper +from coalib.settings.Section import Section +from coalib.settings.Setting import Setting + + +class DennisBearTest(LocalBearTestHelper): + + def setUp(self): + self.section = Section('test section') + self.uut = DennisBear(self.section, Queue()) + self.valid_test_file = os.path.join(os.path.dirname(__file__), + 'test_files', + 'dennis_valid_test.po') + self.invalid_test_file = os.path.join(os.path.dirname(__file__), + 'test_files', + 'dennis_invalid_test.po') + + def test_valid(self): + self.check_validity(self.uut, [], self.valid_test_file) + + def test_invalid(self): + self.check_validity(self.uut, [], self.invalid_test_file, valid=False) + # Test without ignoring W302 + self.section.append(Setting('allow_untranslated', 'False')) + self.check_validity(self.uut, [], self.valid_test_file, valid=False) diff --git a/tests/gettext/__init__.py b/tests/gettext/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/gettext/test_files/__init__.py b/tests/gettext/test_files/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/gettext/test_files/dennis_invalid_test.po b/tests/gettext/test_files/dennis_invalid_test.po new file mode 100644 index 0000000000..e9094722ce --- /dev/null +++ b/tests/gettext/test_files/dennis_invalid_test.po @@ -0,0 +1,4 @@ +msgid 'Foo' +msgstr 'Foo' +msgid 'Foo' +msgstr ' ' diff --git a/tests/gettext/test_files/dennis_valid_test.po b/tests/gettext/test_files/dennis_valid_test.po new file mode 100644 index 0000000000..9c67d1e3ef --- /dev/null +++ b/tests/gettext/test_files/dennis_valid_test.po @@ -0,0 +1,6 @@ +msgid 'Foo' +msgstr 'Foo' +msgid '{Foo} hi' +msgstr '{Foo}' +msgid '%s Foo' +msgstr '%s Foo'