Esempio n. 1
0
    def _get_translated_strings(self, contents_callback, not_sorted):
        strings = {}
        languages = set()
        for lang in self._LANGS:
            filename = '%s/%s.lang' % (self._TEMPLATES_PATH, lang)
            languages.add(lang)
            last_key = ''
            for lineno, line in enumerate(
                    contents_callback(filename).split(b'\n')[:-1]):
                try:
                    row = line.decode('utf-8')
                    key, value = re.compile(r'\s+=\s+').split(row.strip(), 1)
                    if last_key >= key:
                        not_sorted.add(lang)
                    last_key = key
                    if key not in strings:
                        strings[key] = collections.defaultdict(str)
                    match = re.compile(r'^"((?:[^"]|\\")*)"$').match(value)
                    if match is None:
                        raise Exception("Invalid value")
                    strings[key][lang] = match.group(1).replace(r'\"', '"')
                except:  # pylint: disable=bare-except
                    raise linters.LinterException(
                        'Invalid i18n line "%s" in %s:%d' %
                        (row.strip(), filename, lineno + 1),
                        fixable=False)

        if not_sorted:
            raise linters.LinterException('Entries in %s are not sorted.' %
                                          ', '.join(sorted(not_sorted)),
                                          fixable=False)

        self._check_missing_entries(strings, languages)
        return strings
Esempio n. 2
0
    def _get_translated_strings(self, contents_callback):
        strings = {}
        languages = set()
        for lang in self._LANGS:
            filename = '%s/%s.lang' % (self._TEMPLATES_PATH, lang)
            languages.add(lang)
            for lineno, line in enumerate(contents_callback(
                    filename).split(b'\n')[:-1]):
                try:
                    row = line.decode('utf-8')
                    key, value = re.compile(r'\s+=\s+').split(row.strip(), 1)
                    if key not in strings:
                        strings[key] = collections.defaultdict(str)
                    match = re.compile(r'^"((?:[^"]|\\")*)"$').match(value)
                    if match is None:
                        raise Exception("Invalid value")
                    strings[key][lang] = match.group(1).replace(r'\"', '"')
                except:  # noqa: bare-except
                    raise linters.LinterException(
                        'Invalid i18n line "%s" in %s:%d' %
                        (row.strip(), filename, lineno + 1),
                        fixable=False)

        # Removing badges entries
        return {
            k: v for k, v in strings.items() if not k.startswith('badge_')
        }
Esempio n. 3
0
    def _check_missing_entries(self, strings, languages):
        missing_items_lang = set()
        for key, values in strings.items():
            missing_languages = languages.difference(list(values.keys()))
            if 'pseudo' in missing_languages:
                missing_languages.remove('pseudo')

            if missing_languages:
                print('%s%s%s' % (self._HEADER, key, self._NORMAL),
                      file=sys.stderr)

                for lang in sorted(languages):
                    if lang in values:
                        print(
                            '\t%s%-10s%s %s' %
                            (self._OKGREEN, lang, self._NORMAL, values[lang]),
                            file=sys.stderr)
                    else:
                        print('\t%s%-10s%s missing%s' %
                              (self._OKGREEN, lang, self._FAIL, self._NORMAL),
                              file=sys.stderr)
                        missing_items_lang.add(lang)

                raise linters.LinterException(
                    'There are missing items in the %s.lang'
                    ' file' % missing_items_lang,
                    fixable=False)

            if key == 'locale':
                values['pseudo'] = 'pseudo'
            else:
                values['pseudo'] = self._pseudoloc(values['en'])
 def run_one(self, filename: str, contents: bytes) -> linters.SingleResult:
     '''Runs the linter against |contents|.'''
     diagnostics: List[linters.Diagnostic] = []
     for lineno, line in enumerate(contents.decode('utf-8').split('\n'),
                                   start=1):
         if filename.endswith('.tpl'):
             regex = _TEMPLATE_RE
         else:
             regex = _FRONTEND_RE
         for match in regex.finditer(line):
             if match[1] in self.__valid_strings:
                 continue
             diagnostics.append(
                 linters.Diagnostic(
                     f'Missing translation string {match[1]!r}',
                     filename,
                     lineno=lineno,
                     line=line,
                     col=match.start(1) + 1,
                     col_end=match.end(1) + 1))
     if diagnostics:
         raise linters.LinterException('Missing translation strings',
                                       fixable=False,
                                       diagnostics=diagnostics)
     return linters.SingleResult(contents, ['translation_strings'])
Esempio n. 5
0
    def _check_missing_entries(
        self,
        strings: Dict[str, Dict[str, str]],
        languages: Set[str],
    ) -> None:
        diagnostics: List[linters.Diagnostic] = []
        for key, values in strings.items():
            missing_languages = languages.difference(list(values.keys()))
            if missing_languages:
                for lang in missing_languages:
                    diagnostics.append(
                        linters.Diagnostic(f'Missing entry: {key!r}',
                                           filename=os.path.join(
                                               self._TEMPLATES_PATH,
                                               f'{lang}.lang')))
                continue

            if key == 'locale':
                values['pseudo'] = 'pseudo'
            else:
                values['pseudo'] = self._pseudoloc(values['en'])
        if diagnostics:
            raise linters.LinterException(
                'There are missing items in some files',
                diagnostics=diagnostics)
Esempio n. 6
0
    def _get_translated_strings(
        self,
        contents_callback: linters.ContentsCallback,
    ) -> Dict[str, Dict[str, str]]:
        strings: Dict[str, DefaultDict[str, str]] = {}
        languages: Set[str] = set()
        diagnostics: List[linters.Diagnostic] = []
        for lang in self._LANGS:
            filename = '%s/%s.lang' % (self._TEMPLATES_PATH, lang)
            languages.add(lang)
            for lineno, line in enumerate(
                    contents_callback(filename).split(b'\n')[:-1]):
                try:
                    row = line.decode('utf-8')
                    key, value = re.compile(r'\s+=\s+').split(row.strip(), 1)
                    if key not in strings:
                        strings[key] = collections.defaultdict(str)
                    match = re.compile(r'^"((?:[^"]|\\")*)"$').match(value)
                    if match is None:
                        raise Exception(f'Invalid line {row.strip()!r}')
                    strings[key][lang] = match.group(1).replace(r'\"', '"')
                except Exception as exc:  # pylint: disable=broad-except
                    diagnostics.append(
                        linters.Diagnostic(str(exc),
                                           filename=filename,
                                           lineno=lineno + 1,
                                           line=row.strip()))
        if diagnostics:
            raise linters.LinterException('Invalid i18n files',
                                          fixable=False,
                                          diagnostics=diagnostics)

        # Removing badges entries
        return {k: v for k, v in strings.items() if not k.startswith('badge_')}
Esempio n. 7
0
def _run_linter_one(
        linter: linters.Linter, filename: Text, contents: bytes,
        validate_only: bool,
        diagnostics_output: DiagnosticsOutput) -> Tuple[Optional[Text], bool]:
    '''Runs the linter against one file.'''
    try:
        try:
            new_contents, violations = linter.run_one(filename, contents)
        except linters.LinterException:
            raise
        except:  # noqa: bare-except
            exc_type, exc_value, exc_traceback = sys.exc_info()
            raise linters.LinterException(
                'Linter error',
                fixable=False,
                diagnostics=[
                    linters.Diagnostic(
                        message=''.join(
                            traceback.format_exception(exc_type, exc_value,
                                                       exc_traceback)),
                        filename=filename,
                    ),
                ],
            ) from None
    except linters.LinterException as lex:
        _report_linter_exception(filename, lex, diagnostics_output)
        return filename, lex.fixable

    if contents == new_contents:
        return None, False

    return _report_linter_results(filename, new_contents, validate_only,
                                  violations, True)
Esempio n. 8
0
def _run_linter_all(
    args: argparse.Namespace, linter: linters.Linter, files: Sequence[Text],
    validate_only: bool, diagnostics_output: DiagnosticsOutput
) -> Sequence[Tuple[Optional[Text], bool]]:
    try:
        try:
            new_file_contents, original_contents, violations = linter.run_all(
                files, lambda filename: git_tools.file_contents(
                    args, _ROOT, filename))
        except linters.LinterException:
            raise
        except:  # noqa: bare-except
            exc_type, exc_value, exc_traceback = sys.exc_info()
            raise linters.LinterException(
                'Linter error',
                fixable=False,
                diagnostics=[
                    linters.Diagnostic(
                        message=''.join(
                            traceback.format_exception(exc_type, exc_value,
                                                       exc_traceback)),
                        filename=', '.join(files),
                    ),
                ],
            ) from None
    except linters.LinterException as lex:
        _report_linter_exception(', '.join(files), lex, diagnostics_output)
        return [(filename, lex.fixable) for filename in files]

    result: List[Tuple[Optional[Text], bool]] = []
    for filename in new_file_contents:
        if original_contents[filename] == new_file_contents[filename]:
            result.append((None, False))
        else:
            result.append(
                _report_linter_results(filename, new_file_contents[filename],
                                       validate_only, violations, True))
    return result