def python_format(catalog, message): """Verify the format string placeholders in the translation.""" if 'python-format' not in message.flags: return msgids = message.id if not isinstance(msgids, (list, tuple)): msgids = (msgids,) msgstrs = message.string if not isinstance(msgstrs, (list, tuple)): msgstrs = (msgstrs,) for msgid, msgstr in izip(msgids, msgstrs): if msgstr: _validate_format(msgid, msgstr)
def python_format(catalog, message): """Verify the format string placeholders in the translation.""" if 'python-format' not in message.flags: return msgids = message.id if not isinstance(msgids, (list, tuple)): msgids = (msgids, ) msgstrs = message.string if not isinstance(msgstrs, (list, tuple)): msgstrs = (msgstrs, ) for msgid, msgstr in izip(msgids, msgstrs): if msgstr: _validate_format(msgid, msgstr)
def test_success(self, taskqueue, users_len=3): pswd_users_emails = [mommy.save_one(PswdUserEmail, email='*****@*****.**' % i) for i in range(users_len)] pswd_users = [mommy.save_one(PswdUser) for i in range(users_len)] keys = [us.key for us in pswd_users] for e, u in izip(pswd_users_emails, pswd_users): CreateEmailUser(e, u)() def task_add_mock(url): cursor = router.to_handler(url)[1][0] tasks(cursor) taskqueue.add = task_add_mock tasks() self.assertIsNone(PswdUser.query().get()) main_users = ndb.get_multi(keys) for user, pswd_user_email, pswd_user in izip(main_users, pswd_users_emails, pswd_users): self.assertIsInstance(user, MainUser) self.assertEqual(pswd_user_email.email, user.email) self.assertEqual(pswd_user_email.email, user.name) self.assertEqual(pswd_user.creation, user.creation) self.assertListEqual([''], user.groups)
def test_success(self, taskqueue, users_len=3): pswd_users_emails = [mommy.save_one(PswdUserEmail, email="*****@*****.**" % i) for i in range(users_len)] pswd_users = [mommy.save_one(PswdUser) for i in range(users_len)] keys = [us.key for us in pswd_users] for e, u in izip(pswd_users_emails, pswd_users): CreateEmailUser(e, u)() def task_add_mock(url): cursor = router.to_handler(url)[1][0] tasks(cursor) taskqueue.add = task_add_mock tasks() self.assertIsNone(PswdUser.query().get()) main_users = ndb.get_multi(keys) for user, pswd_user_email, pswd_user in izip(main_users, pswd_users_emails, pswd_users): self.assertIsInstance(user, MainUser) self.assertEqual(pswd_user_email.email, user.email) self.assertEqual(pswd_user_email.email, user.name) self.assertEqual(pswd_user.creation, user.creation) self.assertListEqual([""], user.groups)
def _validate_format(format, alternative): """Test format string `alternative` against `format`. `format` can be the msgid of a message and `alternative` one of the `msgstr`\s. The two arguments are not interchangeable as `alternative` may contain less placeholders if `format` uses named placeholders. The behavior of this function is undefined if the string does not use string formattings. If the string formatting of `alternative` is compatible to `format` the function returns `None`, otherwise a `TranslationError` is raised. Examples for compatible format strings: >>> _validate_format('Hello %s!', 'Hallo %s!') >>> _validate_format('Hello %i!', 'Hallo %d!') Example for an incompatible format strings: >>> _validate_format('Hello %(name)s!', 'Hallo %s!') Traceback (most recent call last): ... TranslationError: the format strings are of different kinds This function is used by the `python_format` checker. :param format: The original format string :param alternative: The alternative format string that should be checked against format :raises TranslationError: on formatting errors """ def _parse(string): result = [] for match in PYTHON_FORMAT.finditer(string): name, format, typechar = match.groups() if typechar == '%' and name is None: continue result.append((name, str(typechar))) return result def _compatible(a, b): if a == b: return True for set in _string_format_compatibilities: if a in set and b in set: return True return False def _check_positional(results): positional = None for name, char in results: if positional is None: positional = name is None else: if (name is None) != positional: raise TranslationError('format string mixes positional ' 'and named placeholders') return bool(positional) a, b = map(_parse, (format, alternative)) # now check if both strings are positional or named a_positional, b_positional = map(_check_positional, (a, b)) if a_positional and not b_positional and not b: raise TranslationError('placeholders are incompatible') elif a_positional != b_positional: raise TranslationError('the format strings are of different kinds') # if we are operating on positional strings both must have the # same number of format chars and those must be compatible if a_positional: if len(a) != len(b): raise TranslationError('positional format placeholders are ' 'unbalanced') for idx, ((_, first), (_, second)) in enumerate(izip(a, b)): if not _compatible(first, second): raise TranslationError('incompatible format for placeholder ' '%d: %r and %r are not compatible' % (idx + 1, first, second)) # otherwise the second string must not have names the first one # doesn't have and the types of those included must be compatible else: type_map = dict(a) for name, typechar in b: if name not in type_map: raise TranslationError('unknown named placeholder %r' % name) elif not _compatible(typechar, type_map[name]): raise TranslationError('incompatible format for ' 'placeholder %r: ' '%r and %r are not compatible' % (name, typechar, type_map[name]))
def iteritems(self): return izip(self._keys, self.itervalues())