File: //snap/core22/2111/lib/python3/dist-packages/babel/messages/__pycache__/checkers.cpython-310.pyc
o
V��\� � @ sd d Z ddlmZmZ ddlmZmZ h d�ddhh d�gZdd � Zd
d� Z dd
� Z
dd� Ze� ZdS )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 st|jt�s
td��dS | du rdS |j}t|ttf�s"|f}t|�| jkr0td| j ��dS )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 vrdS |j}t|ttf�s|f}|j}t|ttf�s!|f}t||�D ]\}}|r1t||� q&dS )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 dd� }dd� }dd� }t || |f�\}}t |||f�\}}|r(|s(|s(td��||kr0td��|rbt|�t|�kr>td ��tt||��D ]\} \\}
}\}
}|||�s_td
| d ||f ��qEdS t|�}
|D ] \}}||
vrvtd| ��|||
| �s�td
|||
| f ��qhdS )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 ]}|�� \}}}|dkr|d u rq|�|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 | |krdS t D ]
}| |v r||v r dS qdS )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 |krt d��qt|�S )Nz5format string mixes positional and named placeholders)r �bool)�results�
positionalr) �charr r r �_check_positionalo s
�z+_validate_format.<locals>._check_positionalzplaceholders are incompatiblez)the format strings are of different kindsz-positional format placeholders are unbalancedzDincompatible format for placeholder %d: %r and %r are not compatible� zunknown 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 >