Commit 50c68cb0 authored by Michal Čihař's avatar Michal Čihař

Merge pull request #982 from phw/angularjs-interpolation-check

Angularjs interpolation check
parents d0d63413 06bc1031
......@@ -130,6 +130,7 @@ CHECK_LIST = getvalue('CHECK_LIST', (
'weblate.trans.checks.format.PHPFormatCheck',
'weblate.trans.checks.format.CFormatCheck',
'weblate.trans.checks.format.JavascriptFormatCheck',
'weblate.trans.checks.angularjs.AngularJSInterpolationCheck',
'weblate.trans.checks.consistency.PluralsCheck',
'weblate.trans.checks.consistency.ConsistencyCheck',
'weblate.trans.checks.chars.NewlineCountingCheck',
......
# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2015 Michal Čihař <michal@cihar.com>
# Copyright © 2015 Philipp Wolfer <ph.wolfer@gmail.com>
#
# This file is part of Weblate <http://weblate.org/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import re
from django.utils.translation import ugettext_lazy as _
from weblate.trans.checks.base import TargetCheck
ANGULARJS_INTERPOLATION_MATCH = re.compile(
r'''
{{ # start symbol
\s* # ignore whitespace
(.+?)
\s* # ignore whitespace
}} # end symbol
''',
re.VERBOSE
)
WHITESPACE = re.compile(r'\s+')
class AngularJSInterpolationCheck(TargetCheck):
'''
Check for AngularJS interpolation string
'''
check_id = 'angularjs_format'
name = _('AngularJS interpolation string')
description = _('AngularJS interpolation strings do not match source')
default_disabled = True
severity = 'danger'
def check_single(self, source, target, unit):
src_match = ANGULARJS_INTERPOLATION_MATCH.findall(source)
# Any interpolation strings in source?
if len(src_match) == 0:
return False
tgt_match = ANGULARJS_INTERPOLATION_MATCH.findall(target)
# Fail the check if the number of matches is different
if len(src_match) != len(tgt_match):
return True
# Remove whitespace
src_tags = set([re.sub(WHITESPACE, '', x) for x in src_match])
tgt_tags = set([re.sub(WHITESPACE, '', x) for x in tgt_match])
return src_tags != tgt_tags
# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2015 Michal Čihař <michal@cihar.com>
# Copyright © 2015 Philipp Wolfer <ph.wolfer@gmail.com>
#
# This file is part of Weblate <http://weblate.org/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Tests for AngularJS checks.
"""
from unittest import TestCase
from weblate.trans.checks.angularjs import AngularJSInterpolationCheck
from weblate.trans.tests.test_checks import MockUnit
class AngularJSInterpolationCheckTest(TestCase):
def setUp(self):
self.check = AngularJSInterpolationCheck()
def test_no_format(self):
self.assertFalse(self.check.check_single(
'strins',
'string',
MockUnit('angularjs_no_format', flags='angularjs-format')
))
def test_format(self):
self.assertFalse(self.check.check_single(
u'{{name}} string {{other}}',
u'{{name}} {{other}} string',
MockUnit('angularjs_format', flags='angularjs-format')
))
def test_format_ignore_position(self):
self.assertFalse(self.check.check_single(
u'{{name}} string {{other}}',
u'{{other}} string {{name}}',
MockUnit('angularjs_format_ignore_position',
flags='angularjs-format')
))
def test_different_whitespace(self):
self.assertFalse(self.check.check_single(
u'{{ name }} string',
u'{{name}} string',
MockUnit('angularjs_different_whitespace',
flags='angularjs-format')
))
def test_missing_format(self):
self.assertTrue(self.check.check_single(
u'{{name}} string',
u'string',
MockUnit('angularjs_missing_format', flags='angularjs-format')
))
def test_wrong_value(self):
self.assertTrue(self.check.check_single(
u'{{name}} string',
u'{{nameerror}} string',
MockUnit('angularjs_wrong_value', flags='angularjs-format')
))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment