o
    V\                     @   sd   d Z ddlmZmZ ddlmZmZ h dddhh dgZdd	 Zd
d Z	dd Z
dd Ze ZdS )z
    babel.messages.checkers
    ~~~~~~~~~~~~~~~~~~~~~~~

    Various routines that help with validation of translations.

    :since: version 0.9

    :copyright: (c) 2013-2019 by the Babel Team.
    :license: BSD, see LICENSE for more details.
    )TranslationErrorPYTHON_FORMAT)string_typesizip>   diuxX>   FGfgc                 C   sd   |j st|jtstddS | du rdS |j}t|ttfs"|f}t|| jkr0td| j dS )z0Verify the number of plurals in the translation.z/Found plural forms for non-pluralizable messageNz*Wrong number of plural forms (expected %d))	pluralizable
isinstancestringr   r   listtuplelennum_plurals)catalogmessagemsgstrs r   9/usr/lib/python3/dist-packages/babel/messages/checkers.pyr      s   r   c                 C   sh   d|j vrdS |j}t|ttfs|f}|j}t|ttfs!|f}t||D ]\}}|r1t|| q&dS )z9Verify the format string placeholders in the translation.zpython-formatN)flagsidr   r   r   r   r   _validate_format)r   r   msgidsr   msgidmsgstrr   r   r   python_format.   s   

r!   c                 C   s  dd }dd }dd }t || |f\}}t |||f\}}|r(|s(|s(td||kr0td|rbt|t|kr>td	tt||D ]\}	\\}
}\}
}|||s_td
|	d ||f qEdS t|}|D ] \}}||vrvtd| |||| std|||| f qhdS )a  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
    c                 S   sJ   g }t | D ]}| \}}}|dkr|d u rq||t|f q|S )N%)r   finditergroupsappendstr)r   resultmatchnameformattypecharr   r   r   _parse^   s   z _validate_format.<locals>._parsec                 S   s0   | |krdS t D ]}| |v r||v r dS qdS )NTF)_string_format_compatibilities)absetr   r   r   _compatibleg   s   z%_validate_format.<locals>._compatiblec                 S   s@   d }| D ]\}}|d u r|d u }q|d u |krt dqt|S )Nz5format string mixes positional and named placeholders)r   bool)results
positionalr)   charr   r   r   _check_positionalo   s   
z+_validate_format.<locals>._check_positionalzplaceholders are incompatiblez)the format strings are of different kindsz-positional format placeholders are unbalancedzDincompatible format for placeholder %d: %r and %r are not compatible   zunknown named placeholder %rzDincompatible format for placeholder %r: %r and %r are not compatibleN)mapr   r   	enumerater   dict)r*   alternativer,   r1   r6   r.   r/   a_positionalb_positionalidx_firstsecondtype_mapr)   r+   r   r   r   r   >   s:    	"
	r   c                  C   s^   g } zddl m} W n	 ty   Y nw |dD ]	}| |  qt| dkr-ttgS | S )Nr   )working_setzbabel.checkers)	pkg_resourcesrC   ImportErroriter_entry_pointsr%   loadr   r   r!   )checkersrC   entry_pointr   r   r   _find_checkers   s   rJ   N)__doc__babel.messages.catalogr   r   babel._compatr   r   r-   r   r!   r   rJ   rH   r   r   r   r   <module>   s   _
