a
    »ÏOc€  ã                   @   sŒ   d dl Z d dlZd dlZd dlmZ d dlZd dlZG dd„ de jjƒZ	G dd„ de	ƒZ
i fdd„ZG d	d
„ d
e  d
d¡ƒZi fdd„ZdS )é    N)Úurlsplitc                   @   sœ   e Zd ZdZi ddddddœZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZd"dd„Zd#dd„Zd$d d!„ZdS )%ÚConfigzB
    class for storing and manipulating data for config files
    NÚconfigF)r   Ú
config_dirÚconfig_nameÚcodecZ	autowriteÚvalidatec                 K   s¤   t | dƒr&| j ¡ | _| j | j¡ n| j ¡ | _t| ¡ ƒD ]\}}|| jv r>|| j|< q>| d|  	¡ ¡| _
d| _d|v rŠ|  |d ¡ d|v r |  |d ¡ dS )zÂ
        accepts kwargs to set defaults
        data=dict to set initial data
        read=dir to open a dir
        try_read=dir to try to open a dir (and not throw if it doesn't read)
        ÚdefaultsÚdataÚ ÚreadÚtry_readN)ÚhasattrÚ_base_defaultsÚcopyÚ	_defaultsÚupdater	   ÚlistÚitemsÚgetÚdefaultr
   Ú_meta_config_dirr   r   )ÚselfÚkwargsÚkÚv© r   úC/var/www/html/gsl.tools/lib/python3.9/site-packages/munge/config.pyÚ__init__   s    	

zConfig.__init__c                 C   s
   | j | S ©N©r
   ©r   Úkeyr   r   r   Ú__getitem__:   s    zConfig.__getitem__c                 C   s   || j |< d S r   r    )r   r"   Úvaluer   r   r   Ú__setitem__=   s    zConfig.__setitem__c                 C   s   | j |= d S r   r    r!   r   r   r   Ú__delitem__@   s    zConfig.__delitem__c                 C   s
   t | jƒS r   )Úiterr
   ©r   r   r   r   Ú__iter__C   s    zConfig.__iter__c                 C   s
   t | jƒS r   )Úlenr
   r(   r   r   r   Ú__len__F   s    zConfig.__len__c                 C   s   | j | j ¡ d�}| j|_|S )Nr    )Ú	__class__r
   r   r   )r   Úrvr   r   r   r   I   s    zConfig.copyc                 G   s*   | j }|D ]}||vr dS || }q
|S )zI
        get a nested value, returns None if path does not exist
        Nr    )r   Úargsr
   r"   r   r   r   Ú
get_nestedO   s    
zConfig.get_nestedc                 C   s   t  | jd ¡S )Nr   )r   Údeepcopyr   r(   r   r   r   r   Z   s    zConfig.defaultc                 C   s   |   ¡ | _d | _d S r   )r   r
   r   r(   r   r   r   Úclear]   s    
zConfig.clearc                 C   s   | j s
i S d| j iS )Nr   )r   r(   r   r   r   Úmetaa   s    ÿzConfig.metac                 C   sª   |s| j  dd¡}|stdƒ‚|s0| j  dd¡}|s<tdƒ‚tj |¡}tj |¡sbtd|› �ƒ‚tj	||dd�}|s„td|› �ƒ‚|r�|  
¡  tj | j|¡ || _| S )	z 
        read config from config_dir
        if config_dir is None, clear to default config
        clear will clear to default before reading new file
        r   Núconfig_dir not setr   úconfig_name not setzconfig dir not found at )r   zconfig file not found in )r   r   ÚKeyErrorÚosÚpathÚ
expanduserÚexistsÚOSErrorÚmungeZload_datafiler1   ÚutilZrecursive_updater
   r   )r   r   r   r1   Z	conf_pathr   r   r   r   r   j   s&    	zConfig.readc                 K   s`   t |tƒr|f}|D ]F}z| j|fi |¤Ž |W   S  tyX } zW Y d}~qd}~0 0 qdS )zë
        try reading without throwing an error
        config_dir may be a list of directories to try in order, if so it
        will return after the first successful read
        other args will be passed direction to read()
        N)Ú
isinstanceÚstrr   r:   )r   r   r   ÚcdirÚer   r   r   r   Ž   s    

zConfig.try_readc                 C   sœ   |s| j }|stdƒ‚|s(| j dd¡}|s4tdƒ‚|rFt |¡ƒ }nt | jd ¡ƒ }tj 	|¡}tj 
|¡szt |¡ | | jtj |d|j ¡¡ dS )z?
        writes config to config_dir using config_name
        r3   r   Nr4   r   zconfig.)r   r:   r   r   r5   r;   Ú	get_codecr6   r7   r8   r9   ÚmkdirZdumpur
   ÚjoinÚ	extension)r   r   r   r   r   r   r   Úwrite    s    
zConfig.write)NNF)N)NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r#   r%   r&   r)   r+   r   r/   r   r1   Úpropertyr2   r   r   rE   r   r   r   r   r      s.   ø

$
r   c                   @   s   e Zd Zi dddœZdS )ÚMungeConfigz~/.mungeZyaml)r   r   r   N)rF   rG   rH   r	   r   r   r   r   rK   ¼   s   rK   c                 C   s$   | |v rt  ||  d ¡S t  | ¡S )NÚtype)r;   rA   )ÚnameÚextra_schemesr   r   r   Úfind_clsÀ   s    rO   c                   @   s   e Zd ZdS )ÚMungeURLN)rF   rG   rH   r   r   r   r   rP   Ç   s   rP   zcls urlc                 C   s¸   | st dƒ‚d}t| ƒ}|j|v rn||j }d|v r@t|j|ƒ}d|v rn|d } |rft| ƒ}t||ƒS t| ƒS |jr€t|j|ƒ}|s®|  d¡\}}}t||ƒ}|s®t d|  ƒ‚t||ƒS )a<  
    parse a munge url

    type:URL
    URL.type

    examples:
        file.yaml
        yaml:file.txt
        http://example.com/file.yaml
        yaml:http://example.com/file.txt

        mysql://user:password@localhost/database/table
        django:///home/user/project/settings_dir.settings/app_name/model
    zurl cannot be emptyNrL   ÚurlÚ.zunable to find codec for %s)Ú
ValueErrorr   ÚschemerO   rP   Ú	parse_urlÚ
rpartition)rQ   rN   ÚclsÚresÚaddrÚrestÚsepÚextr   r   r   rU   Ì   s,    



rU   )Úcollectionsr   r6   Úurllib.parser   r;   Z
munge.utilÚabcÚMutableMappingr   rK   rO   Ú
namedtuplerP   rU   r   r   r   r   Ú<module>   s    0