
    Wf              
          d 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	Z	ddl
mZ ddlmZ  ej                  d      Z e ej                   dej"                  j%                   ed      d	                  Zd
g ddddg g g d	Zd Z G d de      Zd Z e       Zej5                          ej6                  Zej:                  Zy)z+Intake config manipulations and persistence    N)
expanduser)make_path_posix)	yaml_loadintakeINTAKE_CONF_DIR~z.intakeINFOTF)	loggingcatalog_pathallow_importallow_templatesallow_pickleimport_on_startupextra_importsimport_block_listreader_avoidc            	      p    t        t        j                  dt        j                  t
        d                  S )NINTAKE_CONF_FILEz	conf.yaml)r   osgetenv	posixpathjoinconfdir     -lib/python3.12/site-packages/intake/config.pycfiler   )   s%    299%7Q\9]^__r   c                        e Zd ZdZd fd	Zd ZddZej                  d        Z	ddZ
 fdZd fd	Zd	 Zdd
Zd Z xZS )ConfigzkIntake's dict-like config system

    Instance ``intake.conf`` is globally used throughout the package
    c                     ||n	t               | _        | j                          d | _        t	        |   di | t        j                  | d          y )Nr
   r   )r   filename
reload_alltempsuper__init__loggersetLevel)selfr!   kwargs	__class__s      r   r%   zConfig.__init__3   sD    $,$8eg	"6"Y(r   c                 N    | j                          | j                  t               y)z Set conf values back to defaultsN)clearupdatedefaultsr(   s    r   resetzConfig.reset:   s    

Hr   c                 >   |xs | j                   }|du ry	 t        j                  t        j                  j	                  |             t        |d      5 }t        j                  t        |       |       ddd       y# t
        t        f$ r Y Fw xY w# 1 sw Y   yxY w)zgSave current configuration to file as YAML

        Uses ``self.filename`` for target location
        FNw)r!   r   makedirspathdirnameOSErrorIOErroropenyamldumpdict)r(   fnfs      r   savezConfig.save?   s      4==;	KK+, "c] 	%aIId4j!$	% 	% ! 			% 	%s   2A>  B>BBBc              #   V   K   d  | j                          | j                  |       y wN)r,   r-   )r(   r#   s     r   _unsetzConfig._unsetO   s     

Ds   ')c                     t        j                  |       }|r|j                  |       ddlm} | j                   || |             | j                  |      S )a>  Change config values within a context or for the session

        values: dict
            This can be deeply nested to set only leaf values

        See also: ``intake.readers.utils.nested_keys_to_dict``

        Examples
        --------

        Value resets after context ends

        >>> with intake.conf.set(mybval=5):
        ...     ...

        Set for whole session

        >>> intake.conf.set(myval=5)

        Set only a single leaf value within a nested dict

        >>> intake.conf.set(intake.readers.utils.nested_keys_to_dict({"deep.2.key": True})
        r   )merge_dicts)copydeepcopyr-   intake.readers.utilsrC   rA   )r(   update_dictkwr#   rC   s        r   setz
Config.setU   sF    0 }}T"IIk"4Kb)*{{4  r   c                 b    || v rt         |   |      S |t        v r	t        |   S t        |      r@   )r$   __getitem__r.   KeyError)r(   itemr*   s     r   rK   zConfig.__getitem__u   s6    4<7&t,,XD>!4. r   c                 .    || v rt         |   |      S |S r@   )r$   rK   )r(   keydefaultr*   s      r   getz
Config.get}   s    $;7&s++r   c                 d    | j                          | j                          | j                          y r@   )r0   loadload_envr/   s    r   r"   zConfig.reload_all   s    

		r   c                 R   |xs | j                   }t        j                  j                  |      r0t	        |      5 }	 | j                  t        |             ddd       yy# t        $ r0}t        j                  dj                  ||             Y d}~>d}~ww xY w# 1 sw Y   yxY w)zUpdate global config from YAML file

        If fn is None, looks in global config directory, which is either defined
        by the INTAKE_CONF_DIR env-var or is ~/.intake/ .
        z'Failure to load config file "{fn}": {e})r<   eN)r!   r   r4   isfiler8   r-   r   	Exceptionr&   warningformat)r(   r<   r=   rV   s       r   rS   zConfig.load   s      4==77>>"b dQdKK	!-d d  ! dNN#O#V#VZ\`a#V#bccdd ds.   BA!!	B*&BBBBB&c                     t         j                  j                         D ]E  \  }}|j                  d      s|dd j	                         }	 t        j                  |      }| |<   G y# t        $ r Y w xY w)z9Analyse environment variables and update conf accordinglyINTAKE_   N)r   environitems
startswithlowerastliteral_eval
ValueError)r(   kvk2vals        r   rT   zConfig.load_env   su     JJ$$& 	DAq||I&qrU[[]**1-C R	
 " s   A((	A43A4r@   )__name__
__module____qualname____doc__r%   r0   r>   
contextlibcontextmanagerrA   rI   rK   rQ   r"   rS   rT   __classcell__)r*   s   @r   r   r   -   sQ    
)
%   
!@!

d"
r   r   c                     t        | t        t        f      r| S ddl}|j	                  t
        j                  dk(  rdnd      }|j                  |       S )a
  Return a list of directories from the intake path.

    If a string, perhaps taken from an environment variable, then the
    list of paths will be split on the character ":" for posix of ";" for
    windows. Protocol indicators ("protocol://") will be ignored.
    r   Nnt;z(?<!:):(?![:/]))
isinstancelisttuplerecompiler   namesplit)r4   rv   patterns      r   intake_path_dirsr{      sD     $u&jj45GHG==r   )rl   rb   rm   rD   r
   r   r   os.pathr   r9   fsspec.implementations.localr   intake.utilsr   	getLoggerr&   r   r4   r   r   r.   r   r;   r   r{   confr"   r>   	save_confrS   	load_condr   r   r   <module>r      s    1     	    8 "			8	$
)"))$5rww||JsOU^7_`
a 
`uT up x  II	II	r   