
    >|h                         d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 d Z
d Zd Zd	 Zd
ddZd Zd Zd Zd Z G d dej&                        Zy)Utils    )abc)g)Headers)dedenttrim_docstringc                     t        | t        j                        s|S |j                         D ]D  \  }}t        |t        j                        r t	        | j                  |i       |      | |<   @|| |<   F | S )zURecursively update a dict.

    Subdict's won't be overwritten but also updated.
    )
isinstancer   Mappingitems
deepupdateget)originalupdatekeyvalues       R/var/www/html/test/engine/venv/lib/python3.12/site-packages/flask_smorest/utils.pyr   r      si    
 h,lln "
UeS[[)&x||C'<eDHSM!HSM	"
 O    c                 \    | j                         D ci c]  \  }}|	|| c}}S c c}}w )zRemove None values in a dict)r   )mappingkvs      r   remove_noner      s(    $]]_>TQAqD>>>s   
((c                 4    t        | t              r |        S | S )zReturn schema instance for given schema (instance or class).

    :param type|Schema schema: marshmallow.Schema instance or class
    :return: schema instance of given schema
    )r
   type)schemas    r   resolve_schema_instancer       s     "&$/68;V;r   c                  .    t        j                  di       S )z Get extension section in flask g_flask_smorest)r   
setdefault r   r   get_appcontextr"   )   s    <<("--r   z---)	delimiterc                   t        |       j                  d      }|@t        |      D ](  \  }}|j                         j	                  |      s&|} n dz   }|d| }t        |      D ]'  \  }}|j                         dk(  s|d| }||dz   d } n |}g }i }|rt        dj                  |            |d<   |rt        dj                  |            |d<   |S )zLoad summary and description from docstring

    :param str delimiter: Summary and description information delimiter.
    If a line starts with this string, this line and the lines after are
    ignored. Defaults to "---".
    
N    summarydescription)r   split	enumeratelstrip
startswithstripr   join)		docstringr#   split_linesindexlinecut_atsummary_linesdescription_linesinfos	            r   load_info_from_docstringr8   .   s     !+11$7K$[1 	KE4{{}''	2	
 QYF!'6* !- t::<2'/M +EAIK 8	 $D =!9:Y$TYY/@%AB]Kr   c                     dx}}t        |       t        u rVt        |       }|dk(  r| \  } }}n?|dk(  r/t        | d   t        t
        t        t        f      r| \  } }n| \  } }nt        d      | ||fS )zUnpack a flask Response tupleN      r&   zThe view function did not return a valid response tuple. The tuple must have the form (body, status, headers), (body, status), or (body, headers).)r   tuplelenr
   r   dictlist	TypeError)rvstatusheaderslen_rvs       r   unpack_tuple_responserE   T   s     FW
 Bx5R Q;"$Bq["Q%'4!=> G
F 7  vwr   c                     |r| j                   j                  |       | t        |t              r|| _        y|| _        yy)z/Set status and headers in flask Response objectN)rC   extendr
   intstatus_coderB   )responserB   rC   s      r   "set_status_and_headers_in_responserK   s   s=    (fc"#)H $HO	 r   c                     |j                   j                  dk  rd| v r|| j                  d      i| d<   yydD ];  }|| v s| j                  |      | j                  di       j                  |i       |<   = y)z(Rework response according to OAS versionr:   exampleexamples)r   rM   rN   contentN)openapi_versionmajorpopr    )rJ   speccontent_typefields       r   prepare_responserV   ~   s     !!A% $0(,,y2I#JHZ  ! 7 	(E 
 LL' ''	26AA,PRS	(r   c                 r    | j                         j                         }|r|j                  d      s|dz  }|S )zNormalize API config prefix

    Sets upper case and appends underscore if missing.

    :param str config_prefix: Raw prefix

    :return: Normalized prefix
    _)r.   upperendswith)config_prefixresults     r   normalize_config_prefixr]      s7       "((*Ffooc*#Mr   c                   (    e Zd ZdZd Zd Zd Zd Zy)PrefixedMappingProxya   Mapping to proxy another mapping using a prefix

    .. code-block:: python
        some_dict = PrefixedMappingProxy(
            proxied_dict={"foobar_key1": 1, "foobar_key2": 2}, prefix="foobar_"
        )
        assert some_dict["key1"] == 1
        assert some_dict["key2"] == 2
    c                      || _         || _        y N)_dictprefix)selfproxied_dictrc   s      r   __init__zPrefixedMappingProxy.__init__   s    !
r   c                 L    | j                   | j                  t        |      z      S ra   )rb   rc   str)rd   r   s     r   __getitem__z PrefixedMappingProxy.__getitem__   s    zz$++C011r   c                 @     t         fd j                  D              S )Nc              3   Z   K   | ]"  }|j                  j                        s| $ y wra   )r-   rc   ).0xrd   s     r   	<genexpr>z0PrefixedMappingProxy.__iter__.<locals>.<genexpr>   s      G!Q\\$++-FAGs    ++)iterrb   rd   s   `r   __iter__zPrefixedMappingProxy.__iter__   s    GtzzGGGr   c                 8    t        d t        |       D              S )Nc              3       K   | ]  }d   yw)r&   Nr!   )rl   rX   s     r   rn   z/PrefixedMappingProxy.__len__.<locals>.<genexpr>   s     )1)s   )sumro   rp   s    r   __len__zPrefixedMappingProxy.__len__   s    )d4j)))r   N)__name__
__module____qualname____doc__rf   ri   rq   ru   r!   r   r   r_   r_      s    2H*r   r_   N)ry   collectionsr   flaskr   werkzeug.datastructuresr   apispec.utilsr   r   r   r   r   r"   r8   rE   rK   rV   r]   r   r_   r!   r   r   <module>r~      sW       + 0?
<.
 6; "L>%("*3;; *r   