a
    mIgB/                     @   s0  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e ee d	d
dZG dd dZd.eeee ee dddZ e
eee eeee ee f  dddZ!d/eeeee"ee eee" eef dddZ#d0e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&d1ee"e"ed$d%d&Z'd2ee eee  e"e"e"ee e"d(d)d*Z(d3ee eee  e"e"ee eeee f d+d,d-Z)dS )4    N)OrderedDict)contextmanager)IODictIterableIteratorMappingOptionalTupleUnion   )Bindingparse_stream)parse_variableszos.PathLike[str])mappingsreturnc                 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   mapping r   G/var/www/html/django/DPS/env/lib/python3.9/site-packages/dotenv/main.py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 rLtj| j rLt| j | jd}|V  W d    q1 s@0    Y  n8| jd ur`| jV  n$| jrxt	d| j ptd t
dV  d S )Nr   z3Python-dotenv could not find configuration file %s..env )r   ospathisfileopenr   r   r   r   infoioStringIO)r$   r   r   r   r   _get_stream5   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   dictD   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"   )r0   r   r   keyvalue)r$   r   r   r   r   r   r1   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)r3   itemsr)   environr!   )r$   kvr   r   r   set_as_environment_variablesX   s    z#DotEnv.set_as_environment_variables)r4   r   c                 C   s2   |   }||v r|| S | jr.td|| j dS )z	
        zKey %s not found in %s.N)r3   r   r   r   r   )r$   r4   datar   r   r   getg   s    z
DotEnv.get)NFNTT)__name__
__module____qualname__r	   StrPathr   strboolr%   r   r   r0   r   r3   r
   r1   r:   r<   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   r<   )r   rD   r   r   r   r   get_keyu   s    
rE   )r*   r   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   deleter&   )pathlibPathtouchtempfileNamedTemporaryFiler,   BaseExceptionshutilmovenamer)   unlink)r*   r   destr   sourceerrr   r   r   rewrite   s    ,8rV   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
    )rW   autoneverzUnknown quote_mode: rW   r\   z'{}''z\'zexport =
r&   FTN)
ValueErrorisalnumformatreplacerV   r   r   r4   writer   stringendswith)r   rX   rY   rZ   r[   r   quoteZ	value_outZline_outrT   rS   ZreplacedZmissing_newliner   r   r   r   set_key   s2    


*ri   )r   key_to_unsetrZ   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.NFr&   Tz/Key %s not removed from %s - key doesn't exist.)r)   r*   existsr   r   rV   r   r   r4   re   r   rf   )r   rj   rZ   r   removedrT   rS   r   r   r   r   	unset_key   s    
.rm   )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 )Nr(   c                 3   s   | ]}|  V  qd S r"   )resolve).0Zatomenvr   r   	<genexpr>       z$resolve_variables.<locals>.<genexpr>)r   updater)   r7   join)rn   r!   
new_valuesrQ   r5   resultZatomsr   rq   r   r2      s    

r2   )r*   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)   r*   rk   IOErrorr+   dirnameabspathrv   pardir)r*   Zlast_dirZcurrent_dir
parent_dirr   r   r   _walk_to_root  s    r~   r'   )filenameraise_error_if_not_foundusecwdr   c           
      C   s   dd }|s| st tddr(t }nZt }t}|jj|ksPtj	|jjsf|j
dus^J |j
}q4|jj}tjtj|}t|D ]&}tj|| }	tj|	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   s8   zt ddddgd} W n ty*   Y dS 0 t| d S )z> Decide whether this is running in a REPL or IPython notebook __main__N__file__)fromlistF)
__import__ModuleNotFoundErrorhasattr)mainr   r   r   _is_interactive  s
    z$find_dotenv.<locals>._is_interactivefrozenFNzFile not foundr(   )getattrsysr)   getcwd	_getframer   f_codeco_filenamer*   rk   f_backrz   r{   r~   rv   r+   ry   )
r   r   r   r   r*   frameZcurrent_fileframe_filenamerz   
check_pathr   r   r   find_dotenv  s&    

r   T)r   r   r   r!   r    r   r   c                 C   s2   | 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.
    Nr   r   r   r    r!   r   )r   r   r:   )r   r   r   r!   r    r   Zdotenvr   r   r   load_dotenvA  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   r3   )r   r   r   r    r   r   r   r   dotenv_valuesg  s    r   )rC   )rW   FrC   )rW   rC   )r'   FF)NNFFTrC   )NNFTrC   )*r.   loggingr)   rI   rO   r   rL   collectionsr   
contextlibr   typingr   r   r   r   r   r	   r
   r   parserr   r   	variablesr   rA   r@   	getLoggerr=   r   r   r   rE   rV   rB   ri   rm   r2   r~   r   r   r   r   r   r   r   <module>   s   (

U    4      /      
'     
