a
    aiP4                     @   sV  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mZmZmZmZmZmZmZ ddlmZmZ ddlmZ eedf ZeeZed	d
dZ ee ee dddZ!G dd dZ"d3eeee ee dddZ#eeee eeee ee f  dddZ$d4eeeeeee eee eef dddZ%d5eeeee eee ef dddZ&eeeee f  eeeee f d d!d"Z'eee d#d$d%Z(d6eeeed'd(d)Z)d7ee eee  eeeee ed+d,d-Z*d8ee eee  eeee eeee f d.d/d0Z+eed#d1d2Z,dS )9    N)OrderedDict)contextmanager)IODictIterableIteratorMappingOptionalTupleUnion   )Bindingparse_stream)parse_variableszos.PathLike[str]returnc                  C   s$   dt jvrdS t jd  } | dv S )z8
    Determine if dotenv loading has been disabled.
    ZPYTHON_DOTENV_DISABLEDF>   y1trueyest)osenvironcasefold)value r   E/var/www/html/SiteWeb/venv/lib/python3.9/site-packages/dotenv/main.py_load_dotenv_disabled   s    
r   )mappingsr   c                 c   s*   | D ] }|j rtd|jj |V  qd S )Nz;python-dotenv could not parse statement starting at line %s)errorloggerwarningoriginalline)r   mappingr   r   r   with_warn_for_invalid_lines#   s    r%   c                	   @   s   e Zd Zdee eee  eee eeddddZe	e
ee  ddd	Zeeee f dd
dZe
eeee f  dddZedddZeee dddZdS )DotEnvNFT)dotenv_pathstreamverboseencodinginterpolateoverrider   c                 C   s.   || _ || _d | _|| _|| _|| _|| _d S N)r'   r(   _dictr)   r*   r+   r,   )selfr'   r(   r)   r*   r+   r,   r   r   r   __init__.   s    	zDotEnv.__init__r   c                 c   s   | j rHt| j rHt| j | jd}|V  W d    q1 s<0    Y  n8| jd ur\| jV  n$| jrttd| j ppd t	dV  d S )Nr*   z3python-dotenv could not find configuration file %s..env )
r'   _is_file_or_fifoopenr*   r(   r)   r    infoioStringIO)r/   r(   r   r   r   _get_stream?   s    &

zDotEnv._get_streamc                 C   s@   | j r| j S |  }| jr0tt|| jd| _ n
t|| _ | j S )zReturn dotenv as dict)r,   )r.   parser+   r   resolve_variablesr,   )r/   Z
raw_valuesr   r   r   dictN   s    
zDotEnv.dictc                 c   sV   |   :}tt|D ]}|jd ur|j|jfV  qW d    n1 sH0    Y  d S r-   )r9   r%   r   keyr   )r/   r(   r$   r   r   r   r:   ^   s    

zDotEnv.parsec                 C   sJ   |   sdS |    D ],\}}|tjv r2| js2q|dur|tj|< qdS )zI
        Load the current dotenv as system environment variable.
        FNT)r<   itemsr   r   r,   )r/   kvr   r   r   set_as_environment_variablesd   s    z#DotEnv.set_as_environment_variables)r=   r   c                 C   s2   |   }||v r|| S | jr.td|| j dS ) zKey %s not found in %s.N)r<   r)   r    r!   r'   )r/   r=   datar   r   r   gets   s    z
DotEnv.get)NFNTT)__name__
__module____qualname__r	   StrPathr   strboolr0   r   r   r9   r   r<   r
   r:   rA   rD   r   r   r   r   r&   -   s(        
r&   utf-8)r'   
key_to_getr*   r   c                 C   s   t | d|d|S )z
    Get the value of a given key from the given .env.

    Returns `None` if the key isn't found or doesn't have a value.
    T)r)   r*   )r&   rD   )r'   rL   r*   r   r   r   get_key   s    
rM   )pathr*   r   c                 c   s   t |   tjd|ddx}d }z:t| |d}||fV  W d    n1 sR0    Y  W n( ty } z|}W Y d }~n
d }~0 0 W d    n1 s0    Y  |d u rt|j	|  nt
|j	 |d d S )NwF)moder*   deleter1   )pathlibPathtouchtempfileNamedTemporaryFiler5   BaseExceptionshutilmovenamer   unlink)rN   r*   destr   sourceerrr   r   r   rewrite   s    ,8r_   alwaysF)r'   
key_to_setvalue_to_set
quote_modeexportr*   r   c                 C   s  |dvrt d| |dkp.|dko.|  }|rHd|dd}n|}|rdd| d	| d
}n| d	| d
}t| |d\}	}
d}d}tt|	D ]<}|j|kr|
| d}q|
|j	j
 |j	j
d
 }q|s|r|
d
 |
| W d   n1 s
0    Y  d||fS )z
    Adds or Updates a key/value to the given .env

    If the .env path given doesn't exist, fails instead of risking creating
    an orphan .env somewhere in the filesystem
    )r`   autoneverzUnknown quote_mode: r`   re   z'{}''z\'zexport =
r1   FTN)
ValueErrorisalnumformatreplacer_   r%   r   r=   writer"   stringendswith)r'   ra   rb   rc   rd   r*   quoteZ	value_outZline_outr]   r\   ZreplacedZmissing_newliner$   r   r   r   set_key   s2    


*rr   )r'   key_to_unsetrc   r*   r   c                 C   s   t j| s td|  d|fS d}t| |dD\}}tt|D ]"}|j|krVd}qB|	|j
j qBW d   n1 sz0    Y  |std||  d|fS ||fS )z
    Removes a given key from the given `.env` file.

    If the .env path given doesn't exist, fails.
    If the given key doesn't exist in the .env, fails.
    z(Can't delete from %s - it doesn't exist.NFr1   Tz/Key %s not removed from %s - key doesn't exist.)r   rN   existsr    r!   r_   r%   r   r=   rn   r"   ro   )r'   rs   rc   r*   Zremovedr]   r\   r$   r   r   r   	unset_key   s    
.ru   )valuesr,   r   c                    s   i }| D ]t\}}|d u rd }nVt |}i  |rF tj  | n |  tj d fdd|D }|||< q|S )Nr3   c                 3   s   | ]}|  V  qd S r-   )resolve).0Zatomenvr   r   	<genexpr>      z$resolve_variables.<locals>.<genexpr>)r   updater   r   join)rv   r,   
new_valuesrZ   r   resultZatomsr   ry   r   r;      s    

r;   )rN   r   c                 c   st   t j| stdt j| r,t j| } d}t j| }||krp|V  t jt j|t jj}|| }}q<dS )zL
    Yield directories starting from the given directory up to the root
    zStarting path not foundN)	r   rN   rt   IOErrorisfiledirnameabspathr~   pardir)rN   Zlast_dirZcurrent_dir
parent_dirr   r   r   _walk_to_root  s    r   r2   )filenameraise_error_if_not_foundusecwdr   c                 C   s   dd }dd }|s,| s,| s,t tddr6t }nZt }t}|jj|ks^tj	|jjst|j
duslJ |j
}qB|jj}tjtj|}t|D ]"}	tj|	| }
t|
r|
  S q|rtdd	S )
z
    Search in increasingly higher folders for the given file

    Returns path to the file if found, or an empty string otherwise
    c                  S   sP   t tdst tdrdS ztddddgd} W n tyB   Y dS 0 t | d S )	z<Decide whether this is running in a REPL or IPython notebookps1Zps2T__main__N__file__)fromlistF)hasattrsys
__import__ModuleNotFoundError)mainr   r   r   _is_interactive*  s    z$find_dotenv.<locals>._is_interactivec                   S   s   t  d uS r-   )r   gettracer   r   r   r   _is_debugger4  s    z!find_dotenv.<locals>._is_debuggerfrozenFNzFile not foundr3   )getattrr   r   getcwd	_getframer   f_codeco_filenamerN   rt   f_backr   r   r   r~   r4   r   )r   r   r   r   r   rN   frameZcurrent_fileframe_filenamer   
check_pathr   r   r   find_dotenv  s(    


r   T)r'   r(   r)   r,   r+   r*   r   c                 C   sF   t  rtd dS | du r*|du r*t } t| |||||d}| S )a  Parse a .env file and then load all the variables found as environment variables.

    Parameters:
        dotenv_path: Absolute or relative path to .env file.
        stream: Text stream (such as `io.StringIO`) with .env content, used if
            `dotenv_path` is `None`.
        verbose: Whether to output a warning the .env file is missing.
        override: Whether to override the system environment variables with the variables
            from the `.env` file.
        encoding: Encoding to be used to read the file.
    Returns:
        Bool: True if at least one environment variable is set else False

    If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the
    .env file with it's default parameters. If you need to change the default parameters
    of `find_dotenv()`, you can explicitly call `find_dotenv()` and pass the result
    to this function as `dotenv_path`.

    If the environment variable `PYTHON_DOTENV_DISABLED` is set to a truthy value,
    .env loading is disabled.
    zSpython-dotenv: .env loading disabled by PYTHON_DOTENV_DISABLED environment variableFNr'   r(   r)   r+   r,   r*   )r   r    debugr   r&   rA   )r'   r(   r)   r,   r+   r*   Zdotenvr   r   r   load_dotenvR  s     r   )r'   r(   r)   r+   r*   r   c                 C   s.   | du r|du rt  } t| |||d|d S )a  
    Parse a .env file and return its content as a dict.

    The returned dict will have `None` values for keys without values in the .env file.
    For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in
    `{"foo": None}`

    Parameters:
        dotenv_path: Absolute or relative path to the .env file.
        stream: `StringIO` object with .env content, used if `dotenv_path` is `None`.
        verbose: Whether to output a warning if the .env file is missing.
        encoding: Encoding to be used to read the file.

    If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the
    .env file.
    NTr   )r   r&   r<   )r'   r(   r)   r+   r*   r   r   r   dotenv_values  s    r   c              	   C   sD   t j| rdS zt | }W n ttfy6   Y dS 0 t|jS )zN
    Return True if `path` exists and is either a regular file or a FIFO.
    TF)r   rN   r   statFileNotFoundErrorOSErrorS_ISFIFOst_mode)rN   str   r   r   r4     s    r4   )rK   )r`   FrK   )r`   rK   )r2   FF)NNFFTrK   )NNFTrK   )-r7   loggingr   rR   rX   r   r   rU   collectionsr   
contextlibr   typingr   r   r   r   r   r	   r
   r   parserr   r   	variablesr   rI   rH   	getLoggerrE   r    rJ   r   r%   r&   rM   r_   rr   ru   r;   r   r   r   r   r4   r   r   r   r   <module>   s   (


V    3  "   4      
2     
$