U
    Zf                      @   s|  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZ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 e Zdd Zdd	 Zd6ddZdd Zdd ZG dd deZd7ddZdd Zdd Zdd Z dd Z!dd Z"d d! Z#d"d# Z$d8d$d%Z%d&d' Z&G d(d) d)ej'j(Z)d*d+ Z*e+d,d-d.Z,eedf e+d/d0d1Z-d2d3 Z.d4d5 Z/dS )9    Nescapewraps)Union)RendererHooksc                 C   s   ddl m} || S )Nr   )to_json_plotly)Zplotly.io.jsonr   )valuer    r
   //tmp/pip-unpacked-wheel-47crqvv_/dash/_utils.pyto_json   s    r   c                 K   s2   | }|  D ] \}}d| d }|||}q|S )Nz{%z%})itemsreplace)templatedataskvkeyr
   r
   r   interpolate_str   s
    r    Fc                    sd   d  fdd| D }d|  d| }|r:|d7 }n&|rH|d7 }n|d| d|  d 7 }|S )N c                    s,   g | ]$\}}| d  rt |n| dqS )z=""r   ).0r   r   sanitizer
   r   
<listcomp>)   s     zformat_tag.<locals>.<listcomp><z/>>z</joinr   )Ztag_name
attributesinnerclosedZopenedr   tagr
   r   r   
format_tag%   s    

r%   c                   C   s   t t jdS )N-)struuidZuuid4hexstripr
   r
   r
   r   generate_hash5   s    r+   c                 C   s   t tj| S N)getattrcollectionsabc)memberr
   r
   r   patch_collections_abc:   s    r1   c                       sT   e Zd ZdZdd Zdd ZdddZdd
dZ fddZdd Z	dd Z
  ZS )AttributeDicta'  Dictionary subclass enabling attribute lookup/assignment of keys/values.

    For example::
        >>> m = AttributeDict({'foo': 'bar'})
        >>> m.foo
        'bar'
        >>> m.foo = 'not bar'
        >>> m['foo']
        'not bar'
    ``AttributeDict`` objects also provide ``.first()`` which acts like
    ``.get()`` but accepts multiple keys as arguments, and returns the value of
    the first hit, e.g.::
        >>> m = AttributeDict({'foo': 'bar', 'biz': 'baz'})
        >>> m.first('wrong', 'incorrect', 'foo', 'biz')
        'bar'
    c                 C   s   || |< d S r,   r
   )selfr   r	   r
   r
   r   __setattr__P   s    zAttributeDict.__setattr__c                 C   s,   z
| | W S  t k
r   Y nX t|d S r,   )KeyErrorAttributeError)r3   r   r
   r
   r   __getattr__S   s
    
zAttributeDict.__getattr__Attribute is read-onlyc                    s>    fdd|D }t | ddr,| j| nt| d| dS )z
        Designate named attributes as read-only with the corresponding msg

        Method is additive. Making additional calls to this method will update
        existing messages and add to the current set of _read_only names.
        c                    s   i | ]
}| qS r
   r
   )r   namemsgr
   r   
<dictcomp>c   s      z/AttributeDict.set_read_only.<locals>.<dictcomp>
_read_onlyFN)r-   r=   updateobjectr4   )r3   namesr;   Znew_read_onlyr
   r:   r   set_read_only\   s    zAttributeDict.set_read_only*Object is final: No new keys may be added.c                 C   s   t | d| dS )zPrevent any new keys being set._finalN)r?   r4   )r3   r;   r
   r
   r   finalizei   s    zAttributeDict.finalizec                    sR   || j di kr"t| j| || j d}|rD|| krDt||t ||S )Nr=   rC   )__dict__getr6   r=   super__setitem__)r3   r   valZ	final_msg	__class__r
   r   rH   m   s    
zAttributeDict.__setitem__c                 C   s   |  D ]\}}|| |< qd S r,   )r   )r3   otherr   r   r
   r
   r   r>   w   s    zAttributeDict.updatec                 G   s6   |D ]}|  |}|r|  S q|s2tt| i S d S r,   )rF   nextiter)r3   r@   r9   r	   r
   r
   r   first}   s    

zAttributeDict.first)r8   )rB   )__name__
__module____qualname____doc__r4   r7   rA   rD   rH   r>   rO   __classcell__r
   r
   rJ   r   r2   >   s   	


r2   c                    s^   d fddfdd |r( S t | ttfrVdd fdd| D  d S  | S )	Nc                      s$   t ddd  D d S )N.c                 s   s   | ]}t |V  qd S r,   )r'   r   xr
   r
   r   	<genexpr>   s     z;create_callback_id.<locals>._hash_inputs.<locals>.<genexpr>utf-8)hashlibsha256r    encode	hexdigestr
   inputsr
   r   _hash_inputs   s    z(create_callback_id.<locals>._hash_inputsc                    s<   |   ddd | j }| jr8s*  |d 7 }|S )NrU   z\.@)Zcomponent_id_strr   Zcomponent_propertyZallow_duplicate)rW   Z_id)r`   hashed_inputsr
   r   _concat   s    z#create_callback_id.<locals>._concat.....c                 3   s   | ]} |V  qd S r,   r
   rV   )rc   r
   r   rX      s     z%create_callback_id.<locals>.<genexpr>)
isinstancelisttupler    )outputr_   Z	no_outputr
   )rc   r`   rb   r_   r   create_callback_id   s    
 rj   c                 C   s@   |  dr&dd | dd dD S | dd\}}||d	S )
Nrd   c                 S   s   g | ]}t |qS r
   )split_callback_id)r   Zoir
   r
   r   r      s     z%split_callback_id.<locals>.<listcomp>   re   rU      )idproperty)
startswithsplitrsplit)Zcallback_idid_propr
   r
   r   rk      s    
rk   c                    s<   dd  t tr8dd fddtD  d S S )Nc                 S   s0   t |dr| nt|}t|  d| S )Nr   :)hasattrr   jsondumps)r   r   Zvstrr
   r
   r   _json   s    zstringify_id.<locals>._json{,c                 3   s   | ]} || V  qd S r,   r
   )r   r   rz   rt   r
   r   rX      s     zstringify_id.<locals>.<genexpr>})rf   dictr    sorted)rt   r
   r}   r   stringify_id   s    
&r   c                 C   sZ   t  }| D ]J}t|tr|n|g}|D ],}t|d }|d|| d|d  < q&q
|S )Nro   r	   rU   rp   )r2   rf   rg   r   rF   )Zinputs_listr_   iZinputsiiiZid_strr
   r
   r   inputs_to_dict   s     r   c                 C   s@   g }| D ]2}t |tr&|t| q|dd |D  q|S )Nc                 S   s   g | ]}t |qS r
   )r2   r   r   r
   r
   r   r      s     z,convert_to_AttributeDict.<locals>.<listcomp>)rf   r   appendr2   )Znested_listZnew_dictr   r
   r
   r   convert_to_AttributeDict   s    
r   c                 C   s   dd | D S )Nc                 S   s.   g | ]&}t |tr d d |D n|dqS )c                 S   s   g | ]}| d qS )r	   )rF   r   r
   r
   r   r      s     z-inputs_to_vals.<locals>.<listcomp>.<listcomp>r	   )rf   rg   rF   )r   r   r
   r
   r   r      s   z"inputs_to_vals.<locals>.<listcomp>r
   r^   r
   r
   r   inputs_to_vals   s    r   c              	   C   s   t jdk}tjtj| |d|d`}|  | d kr~t	d z|
  W n. tk
r|   td |  |
  Y nX W 5 Q R X d S )Nwin32)posix)shellu/   🚨 trying to terminate subprocess in safe wayu!   🚨 first try communicate failed)sysplatform
subprocessPopenshlexrr   waitpollloggerwarningcommunicate	Exception	exceptionkill)cmdZis_winprocr
   r
   r   run_command_with_process   s    


r   c              
   C   s>   t j| dd&}t| d W  5 Q R  S Q R X d S )NrY   )encoding)ioopenrZ   r[   readr\   r]   )pathfpr
   r
   r   compute_hash   s    r   c                    s    fdd}|S )Nc                    s   t   fdd}|S )Nc                     s,   t d j  | |}t d j |S )Nu   🏗️  [%s] 🏗️️  - %su/   ::: 🍻🍻🍻 [%s] job done 🍻🍻🍻 :::)r   inforP   )argskwargsres)funcr;   r
   r   _wrapper   s    
z&job.<locals>.wrapper.<locals>._wrapperr   )r   r   r:   )r   r   wrapper   s    zjob.<locals>.wrapperr
   )r;   r   r
   r:   r   job   s    
r   c                 C   s   d dd t| D S )Nr   c                 s   s    | ]}t tjtj V  qd S r,   )secretschoicestringascii_lettersdigits)r   _r
   r
   r   rX      s    zgen_salt.<locals>.<genexpr>)r    range)charsr
   r
   r   gen_salt   s    
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )
OrderedSetc                 G   s   g | _ |D ]}| | q
d S r,   )_dataadd)r3   r   r   r
   r
   r   __init__   s    zOrderedSet.__init__c                 C   s   || j kr| j | d S r,   )r   r   r3   r	   r
   r
   r   r     s    
zOrderedSet.addc                 C   s   | j | d S r,   )r   remover   r
   r
   r   discard  s    zOrderedSet.discardc                 C   s
   || j kS r,   r   )r3   rW   r
   r
   r   __contains__	  s    zOrderedSet.__contains__c                 C   s
   t | jS r,   )lenr   )r3   r
   r
   r   __len__  s    zOrderedSet.__len__c                 c   s   | j D ]
}|V  qd S r,   r   )r3   r   r
   r
   r   __iter__  s    
zOrderedSet.__iter__N)	rP   rQ   rR   r   r   r   r   r   r   r
   r
   r
   r   r      s   r   c                 C   s   t | ttfs| gS | S r,   )rf   rg   rh   )objr
   r
   r   coerce_to_list  s    r   r9   c                 C   s   |  dd S )Nra   r   )rr   r   r
   r
   r   clean_property_name  s    r   )hooksreturnc                 C   s0   | d krdS d dd |  D }d| dS )Nr   r|   c                 s   s    | ]\}}| d | V  qdS )z: Nr
   )r   r   rI   r
   r
   r   rX   !  s     z%hooks_to_js_object.<locals>.<genexpr>r{   r~   r   )r   Zhook_strr
   r
   r   hooks_to_js_object  s    r   c                 C   s   t dd | dD S )Nc                 s   s   | ]}t |V  qd S r,   )int)r   r   r
   r
   r   rX   '  s     z parse_version.<locals>.<genexpr>rU   )rh   rr   )versionr
   r
   r   parse_version&  s    r   c                  C   s4   t  } | D ]"}|jdkr|jjdd  S qdS )Nz<module>rP   __main__)inspectstackfunctionframef_localsrF   )r   r   r
   r
   r   get_caller_name*  s
    
r   )r   FFF)F)r   )0r   r   r(   rZ   r.   r   loggingr   rx   r   r   r   htmlr   	functoolsr   typingr   Z
dash.typesr   	getLoggerr   r   r   r%   r+   r1   r   r2   rj   rk   r   r   r   r   r   r   r   r   r/   
MutableSetr   r   r'   r   r   r   r   r
   r
   r
   r   <module>   sT   	       
H
"



