8889841có ™‚Mc@s©dZddlmZddlmZmZddlmZedddgƒedd gƒed d d d gƒgZd„Z d„Z d„Z d„Z e ƒZ dS(sQVarious routines that help with validation of translations. :since: version 0.9 iÿÿÿÿ(tizip(tTranslationErrort PYTHON_FORMAT(tsettitdtutxtXtftFtgtGcCs—|js.t|jtƒs*tdƒ‚ndS|dkr>dS|j}t|ttfƒsh|f}nt|ƒ|j kr“td|j ƒ‚ndS(s0Verify the number of plurals in the translation.s/Found plural forms for non-pluralizable messageNs*Wrong number of plural forms (expected %d)( t pluralizablet isinstancetstringt basestringRtNonetlistttupletlent num_plurals(tcatalogtmessagetmsgstrs((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyRs    cCs¡d|jkrdS|j}t|ttfƒs=|f}n|j}t|ttfƒsg|f}nx3t||ƒD]"\}}|rwt||ƒqwqwWdS(s9Verify the format string placeholders in the translation.s python-formatN(tflagstidRRRRRt_validate_format(RRtmsgidsRtmsgidtmsgstr((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt python_format3s    c CsŸd„}d„}d„}t|||fƒ\}}t|||fƒ\}}|rt| rt| rttdƒ‚n||krtdƒ‚n|r&t|ƒt|ƒkr¼tdƒ‚nxÜtt||ƒƒD]M\} \\} } \} } || | ƒsÒtd| d| | fƒ‚qÒqÒWnut|ƒ} xf|D]^\}}|| krdtd |ƒ‚q9||| |ƒs9td ||| |fƒ‚q9q9Wd S( s¨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 :return: None on success :raises TranslationError: on formatting errors cSspg}xctj|ƒD]R}|jƒ\}}}|dkrO|dkrOqn|j|t|ƒfƒqW|S(Nt%(RtfinditertgroupsRtappendtstr(Rtresulttmatchtnametformatttypechar((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt_parsedscSsA||krtSx*tD]"}||kr||krtSqWtS(N(tTruet_string_format_compatibilitiestFalse(tatbR((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt _compatiblems   cSscd}xP|D]H\}}|dkr4|dk}q |dk|kr tdƒ‚q q Wt|ƒS(Ns5format string mixes positional and named placeholders(RRtbool(tresultst positionalR'tchar((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt_check_positionalus splaceholders are incompatibles)the format strings are of different kindss-positional format placeholders are unbalancedsDincompatible format for placeholder %d: %r and %r are not compatibleisunknown named placeholder %rsDincompatible format for placeholder %r: %r and %r are not compatibleN(tmapRRt enumerateRtdict(R(t alternativeR*R0R5R.R/t a_positionalt b_positionaltidxt_tfirsttsecondttype_mapR'R)((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyRCs.!   4!  cCsfyddlm}Wntk r.ttgSXg}x*|jdƒD]}|j|jƒƒqEW|S(Niÿÿÿÿ(t working_setsbabel.checkers(t pkg_resourcesRAt ImportErrorRRtiter_entry_pointsR#tload(RAtcheckerst entry_point((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt_find_checkers£s  N(t__doc__t itertoolsRtbabel.messages.catalogRRt babel.utilRR,RRRRHRF(((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyts   `