o
    a,                     @   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rTejZneZd	ee d
ee fddZG dd dZ deeef ded
ee fddZ!e	deeef d
eeee ee f  fddZ"		d7deeef dededede#d
eee# eef fddZ$	d8deeef deded
eee# ef fdd Z%d!eeeee f  d"e#d
eeee f fd#d$Z&ded
ee fd%d&Z'	'		d9d(ed)e#d*e#d
efd+d,Z(					-	.d:deeedf d/eee  d0e#d"e#d1e#d2ee d
e#fd3d4Z)				-	.d;deeedf d/eee  d0e#d1e#d2ee d
eeee f fd5d6Z*dS )<    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   -/usr/lib/python3/dist-packages/dotenv/main.pywith_warn_for_invalid_lines   s   r   c                   @   s   e Zd Z					ddeeeef  deee  dededef ded	ed
dfddZ	e
d
eee  fddZd
eeee f fddZd
eeeee f  fddZd
efddZded
ee f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__c                 c   s    | j r*tj| j r*tj| j | jd}|V  W d    d S 1 s#w   Y  d S | jd ur5| jV  d S | jrAt	
d| j p?d 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   sD   | j r| j S |  }| jrtt|| jd| _ | j S t|| _ | j S )zReturn dotenv as dict)r#   )r%   parser"   r   resolve_variablesr#   )r&   
raw_valuesr   r   r   dictB   s   
zDotEnv.dictc                 c   sZ    |   }tt|D ]}|jd ur|j|jfV  qW d    d S 1 s&w   Y  d S r$   )r1   r   r   keyvalue)r&   r   r   r   r   r   r2   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_variablesr6   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   r1   r   r5   r
   r2   r<   r>   r   r   r   r   r   !   s6    


r   r   
key_to_getc                 C   s   t | dd|S )zl
    Gets the value of a given key from the given .env

    If the .env path given doesn't exist, fails
    T)r    )r   r>   )r   rE   r   r   r   get_keyp   s   rF   r+   c              	   c   s    zTt j| s#t| d}|d W d    n1 sw   Y  tjddd"}t| }||fV  W d    n1 s@w   Y  W d    n1 sOw   Y  W n tyj   t j|j	rit 
|j	  w t|j	|  d S )Nzw+r)   F)modedelete)r*   r+   r,   r-   r.   writetempfileNamedTemporaryFileBaseExceptionnameunlinkshutilmove)r+   sourcedestr   r   r   rewritey   s&   rS   alwaysF
key_to_setvalue_to_set
quote_modeexportc                 C   s  |dvrt d||dkp|dko|  }|r$d|dd}n|}|r/d||}nd	||}t| A\}}	d
}
d
}tt|D ]}|j|krU|	| d}
qF|	|j	j
 |j	j
d }qF|
ss|rn|	d |	| W d   n1 s}w   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
    )rT   autoneverzUnknown quote_mode: {}rT   rY   z'{}''z\'zexport {}={}
z{}={}
FT
N)
ValueErrorformatisalnumreplacerS   r   r   r6   rI   r   stringendswith)r   rU   rV   rW   rX   quote	value_outline_outrQ   rR   replacedmissing_newliner   r   r   r   set_key   s6   




rh   key_to_unsetc                 C   s   t j| std|  d|fS d}t| "\}}tt|D ]}|j|kr)d}q|	|j
j qW d   n1 s;w   Y  |sMt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.NFTz/Key %s not removed from %s - key doesn't exist.)r*   r+   existsr   r   rS   r   r   r6   rI   r   ra   )r   ri   rW   removedrQ   rR   r   r   r   r   	unset_key   s   
rl   valuesr#   c                    s   i }| D ]:\}}|d u rd }n+t |}i  |r# tj  | n |  tj d fdd|D }|||< q|S )Nr)   c                 3   s    | ]}|  V  qd S r$   )resolve).0atomenvr   r   	<genexpr>   s    z$resolve_variables.<locals>.<genexpr>)r   updater*   r9   join)rm   r#   
new_valuesrM   r7   resultatomsr   rq   r   r3      s   

r3   c                 c   s    t j| stdt j| rt j| } d}t j| }||kr>|V  t jt j|t jj}||}}||ks#dS dS )zL
    Yield directories starting from the given directory up to the root
    zStarting path not foundN)	r*   r+   rj   IOErrorr,   dirnameabspathru   pardir)r+   last_dircurrent_dir
parent_dirr   r   r   _walk_to_root   s   
r   r(   filenameraise_error_if_not_foundusecwdc           
      C   s   dd }|s| st tddrt }n*t }t}|jj|kr0|jdus'J |j}|jj|ks |jj}tj	
tj	|}t|D ]}tj	|| }	tj	|	rU|	  S qB|r\t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+   rz   r{   r   ru   r,   ry   )
r   r   r   r   r+   framecurrent_fileframe_filenamerz   
check_pathr   r   r   find_dotenv  s&   
r   Tutf-8r   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!   dotenvr   r   r   load_dotenv,  s   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_valuesO  s   r   )rT   F)rT   )r(   FF)NNFFTr   )NNFTr   )+r-   loggingr*   rO   r   rJ   collectionsr   
contextlibr   typingr   r   r   r   r   r	   r
   r   parserr   r   	variablesr   	getLoggerr?   r   version_infoPathLikerC   rB   r   r   rF   rS   rD   rh   rl   r3   r   r   r   r   r   r   r   r   <module>   s    (


"O	0

3



*

$
