a
    Nb-                     @   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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ZejdkrejZneZee ee d	d
dZG dd dZ d.eeef eee ee dddZ!e	eeef ee eeee ee f  dddZ"d/eeef eeee#ee eee# eef dddZ$d0eeef 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df eee  e#e#e#ee e#d(d)d*Z)d3eeedf 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_variables)      )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   H/var/www/html/diaryflask/venv/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f  eee  eedef 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 rNtj| j rNtj| j | jd}|V  W d    q1 sB0    Y  n8| jd urb| jV  n$| jrzt	
d| j pvd tdV  d S )Nr!   z3Python-dotenv could not find configuration file %s..env )r   ospathisfileioopenr!   r   r    r   infoStringIO)r&   r   r   r   r   _get_stream3   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   dictB   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$   )r2   r   r   keyvalue)r&   r   r   r   r   r   r3   P   s    

zDotEnv.parsec                 C   s>   |    D ],\}}|tjv r&| js&q|dur|tj|< qdS )zI
        Load the current dotenv as system environment variable.
        NT)r5   itemsr+   environr#   )r&   kvr   r   r   set_as_environment_variablesV   s    z#DotEnv.set_as_environment_variables)r6   r   c                 C   s2   |   }||v r|| S | jr.td|| j dS )z	
        zKey %s not found in %s.N)r5   r    r   r   r   )r&   r6   datar   r   r   getb   s    z
DotEnv.get)NFNTT)__name__
__module____qualname__r	   r   str	_PathLiker   boolr'   r   r   r2   r   r5   r
   r3   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   rF   r!   r   r   r   get_keyp   s    
rG   )r,   r!   r   c              	   c   s   zt j| sHtj| d|d}|d W d    n1 s>0    Y  tjdd|dH}tj| |d}||fV  W d    n1 s0    Y  W d    n1 s0    Y  W n. ty   t j|j	rt 
|j	  Y n0 t|j	|  d S )Nzw+r(   r*   F)modedeleter!   )r+   r,   r-   r.   r/   writetempfileNamedTemporaryFileBaseExceptionnameunlinkshutilmove)r,   r!   sourcedestr   r   r   rewrite}   s    (JrT   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|}|r^d||}n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 s0    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
    )rU   autoneverzUnknown quote_mode: {}rU   rZ   z'{}''z\'zexport {}={}
z{}={}
r(   FT
N)
ValueErrorformatisalnumreplacerT   r   r   r6   rJ   r   stringendswith)r   rV   rW   rX   rY   r!   quoteZ	value_outZline_outrR   rS   ZreplacedZmissing_newliner   r   r   r   set_key   s2    


(re   )r   key_to_unsetrX   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

    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   rT   r   r   r6   rJ   r   rb   )r   rf   rX   r!   removedrR   rS   r   r   r   r   	unset_key   s    
.ri   )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+   r9   join)rj   r#   
new_valuesrN   r7   resultZatomsr   rm   r   r4      s    

r4   )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,   rg   IOErrorr-   dirnameabspathrr   pardir)r,   Zlast_dirZcurrent_dir
parent_dirr   r   r   _walk_to_root   s    rz   r)   )filenameraise_error_if_not_foundusecwdr   c           
      C   s   dd }|s| st tddr(t }nJt }t}|jj|krV|jdusNJ |j}q4|jj}tj	
tj	|}t|D ]&}tj	|| }	tj	|	rz|	  S qz|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   s   t ddddgd} t| d S )z> Decide whether this is running in a REPL or IPython notebook __main__N__file__)fromlist)
__import__hasattr)mainr   r   r   _is_interactive  s    z$find_dotenv.<locals>._is_interactivefrozenFNzFile not foundr*   )getattrsysr+   getcwd	_getframer   f_codeco_filenamef_backr,   rv   rw   rz   rr   r-   ru   )
r{   r|   r}   r   r,   frameZcurrent_fileZframe_filenamerv   
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 )az  Parse a .env file and then load all the variables found as environment variables.

    - *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. Defaults to
      `False`.
    - *override*: whether to override the system environment variables with the variables
      in `.env` file.  Defaults to `False`.
    - *encoding*: encoding to be used to read the file.

    If both `dotenv_path` and `stream`, `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_dotenv5  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.

    - *dotenv_path*: absolute or relative path to .env file.
    - *stream*: `StringIO` object with .env content, used if `dotenv_path` is `None`.
    - *verbose*: whether to output a warning the .env file is missing. Defaults to
      `False`.
      in `.env` file.  Defaults to `False`.
    - *encoding*: encoding to be used to read the file.

    If both `dotenv_path` and `stream`, `find_dotenv()` is used to find the .env file.
    NTr   )r   r   r5   )r   r   r    r"   r!   r   r   r   dotenv_valuesX  s    r   )rE   )rU   FrE   )rU   rE   )r)   FF)NNFFTrE   )NNFTrE   )+r.   loggingr+   rP   r   rK   collectionsr   
contextlibr   typingr   r   r   r   r   r	   r
   r   parserr   r   	variablesr   	getLoggerr?   r   version_infoPathLikerC   rB   r   r   rG   rT   rD   re   ri   r4   rz   r   r   r   r   r   r   r   <module>   s   (


R 

   
4  
    *      
$     
