summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
Diffstat (limited to 'odoo')
-rw-r--r--odoo/addons/test_lint/tests/test_jstranslate.py68
1 files changed, 50 insertions, 18 deletions
diff --git a/odoo/addons/test_lint/tests/test_jstranslate.py b/odoo/addons/test_lint/tests/test_jstranslate.py
index 696b8bef62d..64a73a3d474 100644
--- a/odoo/addons/test_lint/tests/test_jstranslate.py
+++ b/odoo/addons/test_lint/tests/test_jstranslate.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+# pylint: disable=unbalanced-tuple-unpacking
import logging
import re
@@ -13,13 +14,16 @@ _logger = logging.getLogger(__name__)
TSTRING_RE = re.compile(r'_l?t\(\s*`.*?\s*`\s*\)', re.DOTALL)
EXPRESSION_RE = re.compile(r'\$\{.+?\}')
+UNDERSCORE_RE = re.compile(r'\b_\(\s*[\'"]')
class TestJsTranslations(lint_case.LintCase):
def check_text(self, text):
- """ Search for translated template strings that contains an expression
- :param text: The js text to search
- :return: A list of tuple with line number and invalid template string or an empty list
+ """ Search for translation errors in the text
+
+ :param text: The js text to search
+ :return: A list of tuple with line number and invalid template string,
+ or None for underscore errors
"""
error_list = list()
for m in TSTRING_RE.finditer(text):
@@ -27,6 +31,11 @@ class TestJsTranslations(lint_case.LintCase):
if EXPRESSION_RE.search(template_string):
line_nb = text[:m.start()].count('\n') + 1
error_list.append((line_nb, template_string))
+
+ for m in UNDERSCORE_RE.finditer(text):
+ lineno = text[:m.start()].count('\n') + 1
+ error_list.append((lineno, None))
+
return error_list
def test_regular_expression(self):
@@ -39,11 +48,10 @@ class TestJsTranslations(lint_case.LintCase):
"""
error_list = self.check_text(bad_js)
self.assertEqual(len(error_list), 1)
- for line, template_string in error_list:
- template_string = error_list[0][1]
- self.assertIn('invalid template-string', template_string)
- self.assertNotIn('but valid template-string', template_string)
- self.assertEqual(line, 4)
+ [(line, template_string)] = error_list
+ self.assertEqual(line, 4)
+ self.assertIn('invalid template-string', template_string)
+ self.assertNotIn('but valid template-string', template_string)
def test_regular_expression_long(self):
bad_js = """
@@ -54,25 +62,49 @@ class TestJsTranslations(lint_case.LintCase):
error_list = self.check_text(bad_js)
self.assertEqual(len(error_list), 1)
- for line, template_string in error_list:
- template_string = error_list[0][1]
- self.assertIn('foo ${this + is(a, very) - long == expression}', template_string)
- self.assertEqual(line, 2)
+ [(line, template_string)] = error_list
+ self.assertEqual(line, 2)
+ self.assertIn('foo ${this + is(a, very) - long == expression}', template_string)
+
+ def test_matches_underscore(self):
+ bad_js = """
+ const thing1 = _('literal0');
+ const thing0 = _([]);
+ const thing2 = _("literal1");
+ """
+ self.assertEqual(
+ self.check_text(bad_js),
+ [(2, None), (4, None)]
+ )
def test_js_translations(self):
- """ Test that there are no translation of JS template strings """
+ """ Test that there are no translation of JS template strings or underscore
+ calls misused as translation markers
+ """
counter = 0
failures = 0
for js_file in self.iter_module_files('*.js'):
+ # lodash has string methods and occurrences of `_('text')` in its comments
+ if js_file.endswith('/lodash.js'):
+ continue
+
counter += 1
with tools.file_open(js_file, 'r') as f:
js_txt = f.read()
- error_list = self.check_text(js_txt)
- for line_number, template_string in error_list:
- failures += 1
- mod, relative_path, _ = get_resource_from_path(js_file)
- _logger.error("Translation of a template string found in `%s/%s` at line %s: %s", mod, relative_path, line_number, template_string)
+
+ error_list = self.check_text(js_txt)
+ for line_number, template_string in error_list:
+ failures += 1
+ mod, relative_path, _ = get_resource_from_path(js_file)
+ if template_string:
+ prefix = "Translation of a template string"
+ suffix = template_string
+ else:
+ prefix = "underscore.js used as translation function"
+ suffix = "_t and _lt are the JS translation functions"
+
+ _logger.error("%s found in `%s/%s` at line %s: %s", prefix, mod, relative_path, line_number, suffix)
_logger.info('%s files tested', counter)
if failures > 0: