§
    ŠŸj3  ã                   óz   — d dl mZ d dlmZ d dlZddlmZmZ ddlmZ ddl	m
Z
 d„ Z G d	„ d
¦  «        Zd„ Zd„ ZdS )é    )ÚOrderedDict)ÚDecimalNé   )ÚJsonSchemaValueExceptionÚJsonSchemaDefinitionException)Úindent)ÚRefResolverc                 ó6   — t          | t          ¦  «        r| S | gS ©N)Ú
isinstanceÚlist)Úvariables    úe/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/fastjsonschema/generator.pyÚenforce_listr   
   s!   € Ý�(�DÑ!Ô!ð ØˆØˆ:Ðó    c                   óÔ   — e Zd ZdZdZdd„Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	d	„ Z
d
„ Zd„ Zdd„Zd„ Zd„ Zd„ Zed„ ¦   «         Zd„ Zdddœd„Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚCodeGeneratora7  
    This class is not supposed to be used directly. Anything
    inside of this class can be changed without noticing.

    This class generates code of validation function from JSON
    schema object as string. Example:

    .. code-block:: python

        CodeGenerator(json_schema_definition).func_code
    é   NTc                 óì  — g | _         i | _        i | _        || _        dg| _        dt
          i| _        t          ¦   «         | _        d| _	        d | _
        d | _        d | _        || _        d | _        i | _        t          ¦   «         | _        |€t#          j        |i ¬¦  «        }|| _        | j                             ¦   «         | j        | j                             ¦   «         <   t-          ¦   «         | _        d S )Nzfrom decimal import Decimalr   r   )Ústore)Ú_codeÚ_compile_regexpsÚ_custom_formatsÚ_detailed_exceptionsÚ_extra_imports_linesr   Ú_extra_imports_objectsÚsetÚ
_variablesÚ_indentÚ_indent_last_lineÚ	_variableÚ_variable_nameÚ_root_definitionÚ_definitionÚ_needed_validation_functionsÚ_validation_functions_doner	   Úfrom_schemaÚ	_resolverÚget_scope_nameÚget_urir   Ú_json_keywords_to_function)ÚselfÚ
definitionÚresolverÚdetailed_exceptionss       r   Ú__init__zCodeGenerator.__init__    só   € ØˆŒ
Ø "ˆÔØ!ˆÔØ$7ˆÔ!ð *ð%
ˆÔ!ð •wð'
ˆÔ#õ ™%œ%ˆŒØˆŒØ!%ˆÔØˆŒØ"ˆÔØ *ˆÔØˆÔð -/ˆÔ)å*-©%¬%ˆÔ'àÐÝ"Ô.¨zÀÐDÑDÔDˆHØ!ˆŒð GKÄn×FcÒFcÑFeÔFeˆÔ)¨$¬.×*@Ò*@Ñ*BÔ*BÑCå*5©-¬-ˆÔ'Ð'Ð'r   c                 ó^   — |                       ¦   «          d                     | j        ¦  «        S )zP
        Returns generated code of whole validation function as string.
        ú
)Ú_generate_func_codeÚjoinr   ©r,   s    r   Ú	func_codezCodeGenerator.func_codeG   s*   € ð
 	× Ò Ñ"Ô"Ð"à�yŠy˜œÑ$Ô$Ð$r   c                 óv   — |                       ¦   «          t          di | j        ¤| j        t          t
          dœ¤ŽS )zå
        Returns global variables for generating function from ``func_code``. Includes
        compiled regular expressions and imports, so it does not have to do it every
        time when validation function is called.
        )ÚREGEX_PATTERNSÚrer   © )r3   Údictr   r   r9   r   r5   s    r   Úglobal_statezCodeGenerator.global_stateP   sS   € ð 	× Ò Ñ"Ô"Ð"åð 
ð 
ØÔ)ð
àÔ0ÝÝ%=ð	
ð 
ð 
ð 
ð 	
r   c                 óæ   — |                       ¦   «          | j        sd                     | j        g d¢z   ¦  «        S d                     | j        dddddt	          | j        ¦  «        z   dgz   ¦  «        S )z™
        Returns global variables for generating function from ``func_code`` as code.
        Includes compiled regular expressions and imports.
        r2   )ú3from fastjsonschema import JsonSchemaValueExceptionÚ r?   z	import rer>   r?   zREGEX_PATTERNS = )r3   r   r4   r   Úserialize_regexesr5   s    r   Úglobal_state_codezCodeGenerator.global_state_code`   sš   € ð 	× Ò Ñ"Ô"Ð"àÔ$ð 	Ø—9’9˜TÔ6ð :ð :ð :ñ ñ ô ð ð
 �yŠy˜Ô2ØØAØØØÕ"3°DÔ4IÑ"JÔ"JÑJØð6
ñ 
ñ ô ð 	r   c                 ó@   — | j         s|                      ¦   «          d S d S r   )r   Úgenerate_func_coder5   s    r   r3   z!CodeGenerator._generate_func_codex   s.   € ØŒzð 	&Ø×#Ò#Ñ%Ô%Ð%Ð%Ð%ð	&ð 	&r   c                 ó´   — |                       d¦  «         | j        r;| j                             ¦   «         \  }}|                      ||¦  «         | j        °9dS dS )zt
        Creates base code of validation function and calls helper
        for creating code by definition.
        zNoneType = type(None)N)Úlr%   ÚpopitemÚgenerate_validation_function)r,   ÚuriÚnames      r   rC   z CodeGenerator.generate_func_code|   ss   € ð
 	�ŠÐ&Ñ'Ô'Ð'àÔ/ð 	9ð Ô9×AÒAÑCÔC‰IˆC�Ø×-Ò-¨c°4Ñ8Ô8Ð8ð Ô/ð 	9ð 	9ð 	9ð 	9ð 	9r   c                 ó‚  — | j                              |¦  «         |                      d¦  «         | j                             |¦  «        5 }|                      d|¦  «        5  |                      |ddd¬¦  «         |                      d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )zL
        Generate validation function for given uri with given name
        r?   z4def {}(data, custom_formats={{}}, name_prefix=None):ÚdataT)Úclear_variableszreturn dataN)r&   ÚaddrE   r(   Ú	resolvingÚgenerate_func_code_block)r,   rH   rI   r-   s       r   rG   z*CodeGenerator.generate_validation_functionŠ   s<  € ð 	Ô'×+Ò+¨CÑ0Ô0Ð0Ø�Šˆr‰
Œ
ˆ
ØŒ^×%Ò% cÑ*Ô*ð 	&¨jØ—’ÐNÐPTÑUÔUð &ð &Ø×-Ò-¨j¸&À&ÐZ^Ð-Ñ_Ô_Ð_Ø—’�}Ñ%Ô%Ð%ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð 	&ð 	&s6   Á
B4Á!/BÂB4ÂB 	Â B4Â#B 	Â$B4Â4B8Â;B8Fc                 óø   — | j         | j        | j        f}|||c| _         | _        | _        |r| j        }t	          ¦   «         | _        |                      |¦  «        }|\  | _         | _        | _        |r|| _        |S )z…
        Creates validation rules for current definition.

        Returns the number of validation rules generated as code.
        )r$   r!   r"   r   r   Ú_generate_func_code_block)r,   r-   r   Úvariable_namerL   ÚbackupÚbackup_variablesÚcounts           r   rO   z&CodeGenerator.generate_func_code_block•   s‡   € ð Ô! 4¤>°4Ô3FÐFˆØ@JÈHÐVcÐ=ˆÔ˜$œ.¨$Ô*=Øð 	$Ø#œÐÝ!™eœeˆDŒOà×.Ò.¨zÑ:Ô:ˆà@FÑ=ˆÔ˜$œ.¨$Ô*=Øð 	/Ø.ˆDŒOàˆr   c                 ó¤   — t          |t          ¦  «        st          d¦  «        ‚d|v r|                      ¦   «         S |                      |¦  «        S )Nzdefinition must be an objectú$ref)r   r;   r   Úgenerate_refÚrun_generate_functions)r,   r-   s     r   rQ   z'CodeGenerator._generate_func_code_block©   sU   € Ý˜*¥dÑ+Ô+ð 	PÝ/Ð0NÑOÔOÐOØ�ZÐÐà×$Ò$Ñ&Ô&Ð&à×.Ò.¨zÑ:Ô:Ð:r   c                 ón   — d}| j                              ¦   «         D ]\  }}||v r |¦   «          |dz  }Œ|S )z<Returns the number of generate functions that were executed.r   r   )r+   Úitems)r,   r-   rU   ÚkeyÚfuncs        r   rY   z$CodeGenerator.run_generate_functions²   sN   € àˆØÔ8×>Ò>Ñ@Ô@ð 	ð 	‰IˆC�Ø�jÐ Ð Ø�‘”�Ø˜‘
�øØˆr   c                 óÎ  — | j                              | j        d         ¦  «        5  | j                              ¦   «         }| j                              ¦   «         }|| j        vr
|| j        |<   | j                             d¦  «        sJ ‚| j        dd…         }d 	                    |¦  «        }d|v r|dz   }|  
                    d||¬	¦  «         ddd¦  «         dS # 1 swxY w Y   dS )
aW  
        Ref can be link to remote or local definition.

        .. code-block:: python

            {'$ref': 'http://json-schema.org/draft-04/schema#'}
            {
                'properties': {
                    'foo': {'type': 'integer'},
                    'bar': {'$ref': '#/properties/foo'}
                }
            }
        rW   rK   r   Nz(name_prefix or "data") + "{}"Ú{z.format(**locals())z*{}({variable}, custom_formats, {name_arg}))Úname_arg)r(   Úin_scoper$   r)   r*   r&   r%   r"   Ú
startswithÚformatrE   )r,   rI   rH   Úpathr`   s        r   rX   zCodeGenerator.generate_ref»   sJ  € ð Œ^×$Ò$ TÔ%5°fÔ%=Ñ>Ô>ð 	Zð 	ZØ”>×0Ò0Ñ2Ô2ˆDØ”.×(Ò(Ñ*Ô*ˆCØ˜$Ô9Ð9Ð9Ø9=�Ô1°#Ñ6àÔ&×1Ò1°&Ñ9Ô9Ð9Ð9Ð9ØÔ& q r rÔ*ˆDØ7×>Ò>¸tÑDÔDˆHØ�hˆˆØ#Ð&;Ñ;�Ø�FŠFÐ?ÀÐPXˆFÑYÔYÐYð	Zð 	Zð 	Zñ 	Zô 	Zð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zøøøð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zs   ¦B'CÃCÃ!Cc                 ó–  — d| j         z  | j        z  }| j        }|r-|                     d¦  «        sJ ‚d|dd…         z   }d|v r|dz   }t	          | j        r| j        dur| j        ni f| j        |d	œ|¤Ž} |j        |i |¤Ž}|                     d
d¦  «                             dd¦  «        }| j	         
                    ||z   ¦  «         |S )a…  
        Short-cut of line. Used for inserting line. It's formated with parameters
        ``variable``, ``variable_name`` (as ``name`` for short-cut), all keys from
        current JSON schema ``definition`` and also passed arguments in ``args``
        and named ``kwds``.

        .. code-block:: python

            self.l('if {variable} not in {enum}: raise JsonSchemaValueException("Wrong!")')

        When you want to indent block, use it as context manager. For example:

        .. code-block:: python

            with self.l('if {variable} not in {enum}:'):
                self.l('raise JsonSchemaValueException("Wrong!")')
        ú rK   z" + (name_prefix or "data") + "r   Nr_   z".format(**locals()) + "T)r   rI   r2   z\núz\r)ÚINDENTr   r"   rb   r;   r$   r!   rc   Úreplacer   Úappend)r,   ÚlineÚargsÚkwdsÚspacesrI   Úcontexts          r   rE   zCodeGenerator.lØ   s  € ð& �t”{Ñ" T¤\Ñ1ˆàÔ"ˆØð 	9à—?’? 6Ñ*Ô*Ð*Ð*Ð*Ø4°t¸A¸B¸B´xÑ?ˆDØ�dˆ{ˆ{ØÐ8Ñ8�åØ $Ô 0ÐY°TÔ5EÈTÐ5QÐ5QˆDÔÐÐWYð
à”^Øð
ð 
ð ð	
ð 
ˆð ˆtŒ{˜DÐ, GÐ,Ð,ˆØ�|Š|˜D %Ñ(Ô(×0Ò0°°uÑ=Ô=ˆØŒ
×Ò˜& 4™-Ñ(Ô(Ð(Øˆr   c                 óH   — t          |¦  «                             dd¦  «        S )zÔ
        Short-cut of escape. Used for inserting user values into a string message.

        .. code-block:: python

            self.l('raise JsonSchemaValueException("Variable: {}")', self.e(variable))
        ú"z\")Ústrri   )r,   Ústrings     r   ÚezCodeGenerator.e   s    € õ �6‰{Œ{×"Ò" 3¨Ñ.Ô.Ð.r   )Úappend_to_msgÚrulec                ó†  — | j         s | j        d|z   dz   g|¢R Ž  dS d|z   dz   }|r|d|z   dz   z  }d|z   dz   }|                      | j        ¦  «        }|                      t          |t          ¦  «        r|                     |¦  «        nd¦  «        } | j        |g|¢R t          |¦  «        t          |¦  «        |d	œŽ dS )
zG
        Short-cut for creating raising exception in the code.
        z raise JsonSchemaValueException("z")Nrq   z + (ú)zraise JsonSchemaValueException(zH, value={variable}, name="{name}", definition={definition}, rule={rule}))r-   rv   Údefinition_rule)	r   rE   Ú_expand_refsr$   rt   r   r;   ÚgetÚrepr)r,   Úmsgru   rv   rl   Úargr-   ry   s           r   ÚexczCodeGenerator.exc
  sö   € ð Ô(ð 	ØˆDŒFÐ5°cÑ9¸$Ñ>ÐFÀÐFÐFÐFÐFØˆFà�#‰g�c‰kˆØð 	0Ø�6˜MÑ)¨CÑ/Ñ/ˆCØ/°Ñ3Ð4~Ñ~ˆØ×&Ò& tÔ'7Ñ8Ô8ˆ
ØŸ&š&½ÀJÕPTÑ9UÔ9UÐ!_ §¢°Ñ!5Ô!5Ð!5Ð[_Ñ`Ô`ˆØˆŒˆsÐi�TÐiÐi¥d¨:Ñ&6Ô&6½TÀ$¹Z¼ZÐYhÐiÐiÐiÐiÐiÐir   c                 ój  ‡ — t          |t          ¦  «        rˆ fd„|D ¦   «         S t          |t          ¦  «        s|S d|v rUt          |d         t          ¦  «        r:‰ j                             |d         ¦  «        5 }|cd d d ¦  «         S # 1 swxY w Y   ˆ fd„|                     ¦   «         D ¦   «         S )Nc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r:   ©rz   )Ú.0Úvr,   s     €r   ú
<listcomp>z.CodeGenerator._expand_refs.<locals>.<listcomp>  s'   ø€ Ð=Ð=Ð=¨Q�D×%Ò% aÑ(Ô(Ð=Ð=Ð=r   rW   c                 óB   •— i | ]\  }}|‰                      |¦  «        “ŒS r:   r‚   )rƒ   Úkr„   r,   s      €r   ú
<dictcomp>z.CodeGenerator._expand_refs.<locals>.<dictcomp>"  s-   ø€ ÐGÐGÐG©D¨A¨q��4×$Ò$ QÑ'Ô'ÐGÐGÐGr   )r   r   r;   rr   r(   rN   r[   )r,   r-   Úschemas   `  r   rz   zCodeGenerator._expand_refs  s  ø€ Ý�j¥$Ñ'Ô'ð 	>Ø=Ð=Ð=Ð=°*Ð=Ñ=Ô=Ð=Ý˜*¥dÑ+Ô+ð 	ØÐØ�ZÐÐ¥J¨z¸&Ô/AÅ3Ñ$GÔ$GÐØ”×)Ò)¨*°VÔ*<Ñ=Ô=ð ÀØðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð àGÐGÐGÐG°J×4DÒ4DÑ4FÔ4FÐGÑGÔGÐGs   Á;B
Â
BÂBc                 ó®   — d                      | j        ¦  «        }|| j        v rdS | j                             |¦  «         |                      d¦  «         dS )a  
        Append code for creating variable with length of that variable
        (for example length of list or dictionary) with name ``{variable}_len``.
        It can be called several times and always it's done only when that variable
        still does not exists.
        z{}_lenNz {variable}_len = len({variable})©rc   r!   r   rM   rE   ©r,   rR   s     r   Úcreate_variable_with_lengthz)CodeGenerator.create_variable_with_length$  sX   € ð !Ÿš¨¬Ñ7Ô7ˆØ˜DœOÐ+Ð+ØˆFØŒ×Ò˜MÑ*Ô*Ð*Ø�ŠÐ1Ñ2Ô2Ð2Ð2Ð2r   c                 ó®   — d                      | j        ¦  «        }|| j        v rdS | j                             |¦  «         |                      d¦  «         dS )z®
        Append code for creating variable with keys of that variable (dictionary)
        with a name ``{variable}_keys``. Similar to `create_variable_with_length`.
        z{}_keysNz({variable}_keys = set({variable}.keys())r‹   rŒ   s     r   Úcreate_variable_keysz"CodeGenerator.create_variable_keys1  sZ   € ð
 "×(Ò(¨¬Ñ8Ô8ˆØ˜DœOÐ+Ð+ØˆFØŒ×Ò˜MÑ*Ô*Ð*Ø�ŠÐ9Ñ:Ô:Ð:Ð:Ð:r   c                 ó®   — d                      | j        ¦  «        }|| j        v rdS | j                             |¦  «         |                      d¦  «         dS )z¬
        Append code for creating variable with bool if it's instance of list
        with a name ``{variable}_is_list``. Similar to `create_variable_with_length`.
        z
{}_is_listNz:{variable}_is_list = isinstance({variable}, (list, tuple))r‹   rŒ   s     r   Úcreate_variable_is_listz%CodeGenerator.create_variable_is_list<  sZ   € ð
 %×+Ò+¨D¬NÑ;Ô;ˆØ˜DœOÐ+Ð+ØˆFØŒ×Ò˜MÑ*Ô*Ð*Ø�ŠÐKÑLÔLÐLÐLÐLr   c                 ó®   — d                      | j        ¦  «        }|| j        v rdS | j                             |¦  «         |                      d¦  «         dS )z¬
        Append code for creating variable with bool if it's instance of list
        with a name ``{variable}_is_dict``. Similar to `create_variable_with_length`.
        z
{}_is_dictNz1{variable}_is_dict = isinstance({variable}, dict)r‹   rŒ   s     r   Úcreate_variable_is_dictz%CodeGenerator.create_variable_is_dictG  sZ   € ð
 %×+Ò+¨D¬NÑ;Ô;ˆØ˜DœOÐ+Ð+ØˆFØŒ×Ò˜MÑ*Ô*Ð*Ø�ŠÐBÑCÔCÐCÐCÐCr   )NT)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rh   r0   Úpropertyr6   r<   rA   r3   rC   rG   rO   rQ   rY   rX   r   rE   rt   r   rz   r�   r�   r‘   r“   r:   r   r   r   r      s¢  € € € € € ð
ð 
ð €Fð%8ð %8ð %8ð %8ðN ð%ð %ñ „Xð%ð ð
ð 
ñ „Xð
ð ðð ñ „Xðð.&ð &ð &ð9ð 9ð 9ð	&ð 	&ð 	&ðð ð ð ð(;ð ;ð ;ðð ð ðZð Zð Zð: ð%ð %ñ „Vð%ðN/ð /ð /ð -1°tð jð jð jð jð jð Hð Hð Hð3ð 3ð 3ð	;ð 	;ð 	;ð	Mð 	Mð 	Mð	Dð 	Dð 	Dð 	Dð 	Dr   r   c                 ót   — d„ |                       ¦   «         D ¦   «         }dd                     |¦  «        z   dz   S )Nc              3   ó`   K  — | ])\  }}t          |¦  «        d z   t          |¦  «        z   V — Œ*dS )z: N)r|   Ú
repr_regex)rƒ   r‡   r„   s      r   ú	<genexpr>z$serialize_regexes.<locals>.<genexpr>V  sO   è è € ð ð áˆAˆqõ 	ˆQ‰Œ�$‰� A™œÑ&ðð ð ð ð ð r   z{
    z,
    z
})r[   r4   )Úpatterns_dictÚregex_patternss     r   r@   r@   S  sJ   € ðð à!×'Ò'Ñ)Ô)ðñ ô €Nð �y—~’~ nÑ5Ô5Ñ5¸Ñ=Ð=r   c                 ó’   ‡ — d}d                      ˆ fd„|D ¦   «         ¦  «        }|rd|z   nd}d                     ‰ j        |¦  «        S )N)ÚAÚIÚDEBUGÚLÚMÚSÚXz | c              3   ó\   •K  — | ]&}‰j         t          t          |¦  «        z  ¯d |› �V — Œ'dS )zre.N)ÚflagsÚgetattrr9   )rƒ   ÚfÚregexs     €r   rœ   zrepr_regex.<locals>.<genexpr>_  s>   øè è € ÐTÐT Q°u´{ÅWÍRÐQRÁ^Ä^Ñ7SÐT�y˜Q�y�yÐTÐTÐTÐTÐTÐTr   z, r?   zre.compile({!r}{}))r4   rc   Úpattern)r«   Ú	all_flagsr¨   s   `  r   r›   r›   ]  sX   ø€ Ø7€IØ�JŠJÐTÐTÐTÐT¨)ÐTÑTÔTÑTÔT€EØ!Ð)ˆD�5‰LˆL r€EØ×&Ò& u¤}°eÑ<Ô<Ð<r   )Úcollectionsr   Údecimalr   r9   Ú
exceptionsr   r   r   Úref_resolverr	   r   r   r@   r›   r:   r   r   ú<module>r²      sÞ   ðØ #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø 	€	€	€	à OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %ðð ð ðDð Dð Dð Dð Dñ Dô Dð DðD
>ð >ð >ð=ð =ð =ð =ð =r   