o
    =Ge.                     @   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df ZeeZd	ee d
ee fddZG dd dZ	d7dededee d
ee fddZe	dedee d
eeee ee f  fddZ 			d8dedededede!dee d
eee! eef fddZ"		d9ded edede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%	)		d:d*ed+e!d,e!d
efd-d.Z&					/	d;dee d0eee  d1e!d$e!d2e!dee d
e!fd3d4Z'				/	d<dee d0eee  d1e!d2e!de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_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   L/var/www/bmteknikk.ddns.net/venv/lib/python3.10/site-packages/dotenv/main.pywith_warn_for_invalid_lines   s   r   c                   @   s   e Zd Z					ddee deee  dedee 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d}|V  W d    d S 1 s"w   Y  d S | jd ur4| jV  d S | jr@t	d| j p>d 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_stream4   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   dictC   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"   )r0   r   r   keyvalue)r$   r   r   r   r   r   r1   Q   s   

"zDotEnv.parsec                 C   sJ   |   sd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.
        FNT)r4   itemsr)   environr!   )r$   kvr   r   r   set_as_environment_variablesW   s   
z#DotEnv.set_as_environment_variablesr5   c                 C   s2   |   }||v r|| S | jrtd|| j dS )z	
        zKey %s not found in %s.N)r4   r   r   r   r   )r$   r5   datar   r   r   getf   s   z
DotEnv.get)NFNTT)__name__
__module____qualname__r	   StrPathr   strboolr%   r   r   r0   r   r4   r
   r1   r;   r=   r   r   r   r   r   "   s6    

r   utf-8r   
key_to_getr   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   rE   r   r   r   r   get_keyt   s   
rF   r*   c              	   c   s    t j| s#t| d|d}|d W d    n1 sw   Y  tjd|dd4}zt| |d}||fV  W d    n1 sCw   Y  W n tyW   t |j	  w W d    n1 sbw   Y  t
|j	|  d S )Nw)moder   r(   F)rH   r   deleter&   )r)   r*   r+   r,   writetempfileNamedTemporaryFileBaseExceptionunlinknameshutilmove)r*   r   sourcedestr   r   r   rewrite   s$   rT   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|}|r2d| d	| d
}n| d	| d
}t| |dA\}	}
d}d}tt|	D ]}|j|kr\|
| d}qM|
|j	j
 |j	j
d
 }qM|sz|ru|
d
 |
| W d   n1 sw   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 =
r&   FTN)
ValueErrorisalnumformatreplacerT   r   r   r5   rJ   r   stringendswith)r   rV   rW   rX   rY   r   quote	value_outline_outrR   rS   replacedmissing_newliner   r   r   r   set_key   s6   




rj   key_to_unsetc                 C   s   t j| std|  d|fS d}t| |d"\}}tt|D ]}|j|kr+d}q!|	|j
j q!W d   n1 s=w   Y  |sOt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   rT   r   r   r5   rJ   r   rc   )r   rk   rX   r   removedrR   rS   r   r   r   r   	unset_key   s   
rn   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)   r8   join)ro   r!   
new_valuesrO   r6   resultatomsr   rs   r   r2      s   

r2   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*   rl   IOErrorr+   dirnameabspathrw   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*   r|   r}   r   rw   r+   r{   )
r   r   r   r   r*   framecurrent_fileframe_filenamer|   
check_pathr   r   r   find_dotenv  s&   
r   Tr   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   dotenvr   r   r   load_dotenv7  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.

    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   r4   )r   r   r   r    r   r   r   r   dotenv_values]  s   r   )rD   )rU   FrD   )rU   rD   )r'   FF)NNFFTrD   )NNFTrD   ))r.   loggingr)   rP   r   rK   collectionsr   
contextlibr   typingr   r   r   r   r   r	   r
   r   parserr   r   	variablesr   rB   rA   	getLoggerr>   r   r   r   rF   rT   rC   rj   rn   r2   r   r   r   r   r   r   r   r   <module>   s    (

U

4


*

'
