a
    ΝGd                     @   s*  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ ddl	m
Z
 ddlmZ eeZdd	 Zd
d ZeedZG dd deZG dd deZdZG dd dejZeeej eeej eeej eeej dd ZG dd dej Z!e!"ee!j# dd Z$G dd deZ%dS )    N)OrderedDict)force_bytes)yaml   )openapiSwaggerValidationErrorc              
   C   sv   zddl m} ddlm} W n ty0   Y d S 0 z||  W n2 |yp } ztt||W Y d }~n
d }~0 0 d S )Nr   )parse)ValidationError)Z	flex.corer	   Zflex.exceptionsr
   ImportErrorr   str)specZvalidate_flexr
   ex r   K/var/www/html/django/DPS/env/lib/python3.9/site-packages/drf_yasg/codecs.py_validate_flex   s    r   c              
   C   s\   ddl m} ddlm} z||  W n2 |yV } ztt||W Y d }~n
d }~0 0 d S )Nr   r   )validate_spec)Zswagger_spec_validator.commonr   Z"swagger_spec_validator.validator20r   r   )r   ZSSVErrZvalidate_ssvr   r   r   r    _validate_swagger_spec_validator   s    r   )ZflexZssvc                   @   sD   e Zd ZdZdd Zedd Zdd Zdd	 Zd
d Z	dd Z
dS )_OpenAPICodecNc                 C   s
   || _ d S NZ_validators)self
validatorsr   r   r   __init__/   s    z_OpenAPICodec.__init__c                 C   s   | j S )z List of validator names to applyr   )r   r   r   r   r   2   s    z_OpenAPICodec.validatorsc                 C   s   t |tjstd| |}i }| jD ]L}zt| t| W q( t	yr } zt
|||< W Y d}~q(d}~0 0 q(|rt	d|||| }tt
| |t| |S )a4  Transform an :class:`.Swagger` object to a sequence of bytes.

        Also performs validation and applies settings.

        :param openapi.Swagger document: Swagger spec object as generated by :class:`.OpenAPISchemaGenerator`
        :return: binary encoding of ``document``
        :rtype: bytes
        z%Expected a `openapi.Swagger` instanceNzspec validation failed: {})
isinstancer   ZSwagger	TypeErrorgenerate_swagger_objectr   
VALIDATORScopydeepcopyr   r   formatloggerwarningr   
_dump_dict)r   Zdocumentr   errors	validatoreexcr   r   r   encode7   s    	

$z_OpenAPICodec.encodec                 C   s   t | |S )zDDump an error message into an encoding-appropriate sequence of bytes)r   r#   )r   errr   r   r   encode_errorT   s    z_OpenAPICodec.encode_errorc                 C   s   t ddS )zDump the given dictionary into its string representation.

        :param dict spec: a python dict
        :return: string representation of ``spec``
        :rtype: str or bytes
        zoverride this methodN)NotImplementedErrorr   r   r   r   r   r#   X   s    z_OpenAPICodec._dump_dictc                 C   s   |  S )zGenerates the root Swagger object.

        :param openapi.Swagger swagger: Swagger spec object as generated by :class:`.OpenAPISchemaGenerator`
        :return: swagger spec as dict
        :rtype: OrderedDict
        )Zas_odict)r   Zswaggerr   r   r   r   a   s    z%_OpenAPICodec.generate_swagger_object)__name__
__module____qualname__
media_typer   propertyr   r(   r*   r#   r   r   r   r   r   r   ,   s   
	r   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )OpenAPICodecJsonapplication/jsonFc                    s    t t| | || _|| _d S r   )superr2   r   prettyr0   )r   r   r5   r0   	__class__r   r   r   n   s    zOpenAPICodecJson.__init__c                 C   sB   | j r0tj|dddd}|d dkr,|d7 }|S tj|ddS dS )	z-Dump ``spec`` into JSON.

        :rtype: str   ),z: F)indent
separatorsensure_ascii
)r<   N)r5   jsondumps)r   r   outr   r   r   r#   s   s    zOpenAPICodecJson._dump_dict)Fr3   r-   r.   r/   r0   r   r#   __classcell__r   r   r6   r   r2   k   s   r2   ztag:yaml.org,2002:mapc                       s<   e Zd ZdZdd Zd fdd	Zddd	Zd
d Z  ZS )SaneYamlDumperzYYamlDumper class usable for dumping ``OrderedDict`` and list instances in a standard way.c                 C   s   dS )zDisable YAML references.Tr   )r   datar   r   r   ignore_aliases   s    zSaneYamlDumper.ignore_aliasesFc                    s   t t| jf |dd|S )zLhttps://stackoverflow.com/a/39681672

        Indent list elements.
        F)flow
indentless)r4   rD   increase_indent)r   rG   rH   kwargsr6   r   r   rI      s    zSaneYamlDumper.increase_indentNc                 C   s   t }g }tj|||d}| jdur.|| j| j< d}t|drD| }|D ]V\}}| |}	| |}
t|	tj	rv|	j
rzd}t|
tj	r|
j
rd}||	|
f qH|du r| jdur| j|_n||_|S )zhttps://gist.github.com/miracle2k/3184458

        Make PyYAML output an OrderedDict.

        It will do so fine if you use yaml.dump(), but that generates ugly, non-standard YAML code.

        To use yaml.safe_dump(), you need the following.
        )
flow_styleNTitemsF)YAML_MAP_TAGr   ZMappingNodeZ	alias_keyZrepresented_objectshasattrrL   Zrepresent_datar   Z
ScalarNodestyleappenddefault_flow_stylerK   )r   mappingrK   tagvaluenodeZ
best_styleZitem_keyZ
item_valueZnode_keyZ
node_valuer   r   r   represent_odict   s*    	





zSaneYamlDumper.represent_odictc                 C   s$   d|v r| j d|ddS |  d|S )Nr>   ztag:yaml.org,2002:str|)rO   )Zrepresent_scalar)r   textr   r   r   represent_text   s    zSaneYamlDumper.represent_text)FF)N)	r-   r.   r/   __doc__rF   rI   rV   rY   rC   r   r   r6   r   rD      s
   
 rD   c                 C   s   t j| td|rdnd|dS )a   Dump the given data dictionary into a sane format:

        * OrderedDicts are dumped as regular mappings instead of non-standard !!odict
        * multi-line mapping style instead of json-like inline style
        * list elements are indented into their parents
        * YAML references/aliases are disabled

    :param dict data: the data to be dumped
    :param bool binary: True to return a utf-8 encoded binary object, False to return a string
    :return: the serialized YAML
    :rtype: str or bytes
    Fzutf-8N)ZDumperrQ   encodingZallow_unicode)r   dumprD   )rE   binaryr   r   r   yaml_sane_dump   s    
r^   c                   @   s   e Zd ZdddZdS )SaneYamlLoaderFc                 C   s   |  | t| |S r   )Zflatten_mappingr   Zconstruct_pairs)r   rU   deepr   r   r   construct_odict   s    
zSaneYamlLoader.construct_odictN)F)r-   r.   r/   ra   r   r   r   r   r_      s   r_   c                 C   s   t j| tdS )zLoad the given YAML stream while preserving the input order for mapping items.

    :param stream: YAML stream (can be a string or a file-like object)
    :rtype: OrderedDict
    )Loader)r   loadr_   )streamr   r   r   yaml_sane_load   s    re   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )OpenAPICodecYamlapplication/yamlc                    s   t t| | || _d S r   )r4   rf   r   r0   )r   r   r0   r6   r   r   r      s    zOpenAPICodecYaml.__init__c                 C   s   t |ddS )z/Dump ``spec`` into YAML.

        :rtype: bytesT)r]   )r^   r,   r   r   r   r#      s    zOpenAPICodecYaml._dump_dict)rg   rB   r   r   r6   r   rf      s   rf   )&r   r?   loggingcollectionsr   Zdjango.utils.encodingr   Zruamelr    r   r$   r   	getLoggerr-   r!   r   r   r   objectr   r2   rM   Z
SafeDumperrD   Zadd_representerbytesrY   r   rV   Zadd_multi_representerr^   Z
SafeLoaderr_   Zadd_constructorra   re   rf   r   r   r   r   <module>   s4   
?4	