U
    /e&                     @   s   d dl Z d dlZd dlZedfddZG dd deZG dd deZdd
dZ	dddZ
dddZdddZdddZdd Zdd Zdd ZdS )     Nevalc                 C   s   t | |d}t|i tjS )Nr   )compiler   sysmodules)codepathmodeexpr r
   7/tmp/pip-unpacked-wheel-dg3irmqq/debugpy/common/util.pyevaluate
   s    r   c                       s,   e Zd ZdZdZdd Z fddZ  ZS )
Observablez$An object with change notifications.r
   c                 C   s
   g | _ d S N)	observers)selfr
   r
   r   __init__   s    zObservable.__init__c              
      s0   zt ||W S | j D ]}|| | qX d S r   )r   super__setattr__)r   namevalueob	__class__r
   r   r      s    
zObservable.__setattr__)__name__
__module____qualname____doc__r   r   r   __classcell__r
   r
   r   r   r      s   r   c                   @   s.   e Zd ZdZedd Zd	ddZdd ZdS )
Envz!A dict for environment variables.c                   C   s
   t tjS )z.Returns a snapshot of the current environment.)r   osenvironr
   r
   r
   r   snapshot&   s    zEnv.snapshotNc                 C   s   t | }|d k	r|| |S r   )r   update)r   Zupdated_fromresultr
   r
   r   copy+   s    
zEnv.copyc                 C   s>   zt jj| |  }W n tk
r,   d}Y nX || | |< dS )ztPrepends a new entry to a PATH-style environment variable, creating
        it if it doesn't exist already.
         N)r   r   pathsepKeyError)r   keyentrytailr
   r
   r   
prepend_to1   s
    
zEnv.prepend_to)N)r   r   r   r   staticmethodr!   r$   r+   r
   r
   r
   r   r   #   s
   

r   strictc                 C   s   t | tr| ||S t| S )zcConverts s to str, using the provided encoding. If s is already str,
    it is returned as is.
    )
isinstancebytesdecodestrsencodingerrorsr
   r
   r   	force_str<   s    r6   c                 C   s:   t | tr| ||S t| } |dkr2| || | S dS )zConverts s to bytes, using the provided encoding. If s is already bytes,
    it is returned as is.

    If errors="strict" and s is bytes, its encoding is verified by decoding it;
    UnicodeError is raised if it cannot be decoded.
    r-   N)r.   r1   encoder/   r0   r2   r
   r
   r   force_bytesC   s    
r8   c                 C   s   t | d|S )z'Same as force_bytes(s, "ascii", errors)asciir8   r3   r5   r
   r
   r   force_asciiT   s    r<   c                 C   s   t | d|S )z&Same as force_bytes(s, "utf8", errors)utf8r:   r;   r
   r
   r   
force_utf8Y   s    r>   Fc                 C   s   z
| j }W n` tk
rj   z
| j}W n@ tk
rd   zt| }W n tk
rZ   Y Y Y dS X d}Y nX Y nX |rzt|}W n tk
r   Y nX t|ddS )zReturns the most descriptive name of a Python module, class, or function,
    as a Unicode string

    If quote=True, name is quoted with repr().

    Best-effort, but guaranteed to not fail - always returns something.
    z	<unknown>Fzutf-8replace)r   	Exceptionr   reprr6   )objquoter   r
   r
   r   nameof^   s"    	

rD   c                 C   s   t | dd}zt| }W n tk
r.   Y nNX |d|7 }zt| \}}W n tk
rd   Y nX |d| 7 }|d7 }|S )zReturns the most descriptive name of a Python module, class, or function,
    including source information (filename and linenumber), if available.

    Best-effort, but guaranteed to not fail - always returns something.
    T)rC   z (file z, line ))rD   inspectgetsourcefiler@   getsourcelines)rB   r   Zsrc_file_Z
src_linenor
   r
   r   	srcnameof~   s    rJ   c                   C   s
   dt jkS )z>Returns True if the caller should hide something from debugpy.ZDEBUGPY_TRACE_DEBUGPY)r   r    r
   r
   r
   r   hide_debugpy_internals   s    rK   c                 C   s   t  rd| _d| _dS )zDisables tracing for the given thread if DEBUGPY_TRACE_DEBUGPY is not set.
    DEBUGPY_TRACE_DEBUGPY is used to debug debugpy with debugpy
    TN)rK   Zpydev_do_not_traceZis_pydev_daemon_thread)threadr
   r
   r   hide_thread_from_debugger   s    rM   )r-   )r-   )r-   )r-   )F)rF   r   r   __file__r   objectr   dictr   r6   r8   r<   r>   rD   rJ   rK   rM   r
   r
   r
   r   <module>   s   	




 