
    k7if                     2   S SK r S SKrS SKJrJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJrJr  S SKJrJr  S S	KJrJr  S S
KJr  S SKJr  \(       a  S SKJr  \" SS9 " S S\5      5       r " S S5      r\ " S S\5      5       r\ " S S\5      5       rg)    N)ABCabstractmethod)Iterable)suppress)chain)Path)TYPE_CHECKINGAny)definefield)ArgumentCollectionupdate_argument_collection)CycloptsError)to_tuple_converter)AppT)kw_onlyc                       \ rS rSr% Sr\" S\S9r\\	   \
S'   \" SS9r\\
S'   \" S	S9r\\
S
'   \" SSS9r\	S-  \
S'   \\S\\	\4   4S j5       5       r\\S\	4S j5       5       rSSS\\	S4   S\4S jrSrg)
ConfigBase   zBase class for configuration sources.

Handles the common logic of processing configuration dictionaries
and updating ArgumentCollections.
 )default	converter	root_keysF)r   allow_unknownTuse_commands_as_keysNsource)r   alias_sourcereturnc                     [         e)z$Return the configuration dictionary.NotImplementedErrorselfs    Q/home/james-whalen/.local/lib/python3.13/site-packages/cyclopts/config/_common.pyconfigConfigBase.config!   
     "!    c                     [         eHReturn a string identifying the configuration source for error messages.r!   r#   s    r%   r   ConfigBase.source'   r(   r)   appr   commands.	argumentsc           	          U R                   R                  5       n [        U R                  U R                  (       a  UOS5       H  nXE   nM	     U R                  (       a  UnO'[        S UR                  R                   5       U5      nUR                  5        VVs0 s H  u  pxXv;  d  M  Xx_M     nnn[        UU R                  UUR                  R                  S   U R                  U R                  S9  g ! [
         a     g f = fs  snnf )Nr   c              3   J   #    U  H  oR                   (       a  M  Uv   M     g 7fN)_meta_parent).0as     r%   	<genexpr>&ConfigBase.__call__.<locals>.<genexpr>>   s     \*EQ^^qq*Es   #	#)r   r   )r&   copyr   r   r   KeyErrornext	app_stackcurrent_frameitemsr   r   stackr   )	r$   r.   r/   r0   r&   key
filter_appkvs	            r%   __call__ConfigBase.__call__-   s     "&!1!1!3	T^^9R9RXXZ[ \ $$J\#--*E*E\^abJ#)<<>I>41Q5H$!$>I"KKMM#nn,,	
  		 Js   4C: D
-D
:
DD)__name__
__module____qualname____firstlineno____doc__r   r   r   r   str__annotations__r   boolr   r   propertyr   dictr
   r&   r   tupler   rE   __static_attributes__r   r)   r%   r   r      s      %R;MNIx}N.M4.!&t!4$4H=GS4Z="S#X "  " " "  "

 S/
 &	
r)   r   c                   2    \ rS rSrSrS\\-  4S jrS rSr	g)FileCacheKeyK   zAbstraction to quickly check if a file needs to be read again.

If a newly instantiated ``CacheKey`` doesn't equal a previously instantiated ``CacheKey``,
then the file needs to be re-read.
pathc                    [        U5      R                  5       U l        U R                  R                  5       (       a=  U R                  R	                  5       nUR
                  U l        UR                  U l        g S U l        S U l        g r3   )	r   absoluterV   existsstatst_mtime_mtimest_size_size)r$   rV   rZ   s      r%   __init__FileCacheKey.__init__R   s]    J'')	9999>>#D--DKDJDKDJr)   c                     [        U[        U 5      5      (       d  gU R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ )NF)
isinstancetyper\   r^   rV   )r$   others     r%   __eq__FileCacheKey.__eq__\   sP    %d,,{{ell*dtzzU[[/HdTYYZ_ZdZdMddr)   )r\   r^   rV   N)
rG   rH   rI   rJ   rK   rL   r   r_   re   rR   r   r)   r%   rT   rT   K   s    S4Z er)   rT   c                   D   \ rS rSr% Sr\" \S9r\\-  \	S'   \" SSS9r
\\	S'   \" SSS9r\\	S	'   \" S
SSS9r\\\4   S
-  \	S'    \" S
SSS9r\S
-  \	S'    \S\S\\\4   4S j5       r\S\\\4   4S j5       r\S\4S j5       r\R.                  S\SS
4S j5       rSrg
)ConfigFromFilec   zdConfiguration source that loads from a file.

Supports file caching and parent directory searching.
)r   rV   FT)r   r   
must_existsearch_parentsN)r   initrepr_config_config_cache_keyr   c                     [         e)zLoad the config dictionary from path.

Do **not** do any downstream caching; ``ConfigFromFile`` handles caching.

Parameters
----------
path: Path
    Path to the file. Guaranteed to exist.

Returns
-------
dict
    Loaded configuration.
r!   )r$   rV   s     r%   _load_configConfigFromFile._load_configt   s
      "!r)   c                    [        U R                  [        5      (       d   eU R                  R                  5       R	                  5       R                  5       R                   GH  nXR                  R                  -  nUR                  5       (       a]  [        U5      nU R                  U:X  a  U R                  =(       d    0 s  $  U R                  U5      U l        X0l
        U R                  s  $ U R(                  (       a  M  U R*                  (       d  M  [-        [.        R0                  [2        R4                  " [.        R0                  5      [7        U R                  5      5      e   U R*                  (       aP  [-        [.        R0                  [2        R4                  " [.        R0                  5      [7        U R                  5      5      e0 U l        U R                  $ ! [         a    e [         an  n[        [!        U5      SS5      n[#        [$        5         UR&                  S   nU(       a  US-  nXV-  nS S S 5        O! , (       d  f       O= f[        US9UeS nAff = f)NrG    r   z: )msg)rb   rV   r   
expanduserresolverX   parentsnamerY   rT   ro   rn   rq   r   	Exceptiongetattrrc   r   
IndexErrorargsrk   rj   FileNotFoundErrorerrnoENOENTosstrerrorrL   )r$   parent	candidate	cache_keyeru   exception_msgs          r%   r&   ConfigFromFile.config   s   $))T****ii**,446??AIIF/I!!(3	))Y6<<-2-8#'#4#4Y#?DL-6* ||#$$'bkk%,,6OQTUYU^U^Q_``3 J8 ??#ELL"++ell2KSQUQZQZ^\\||- %   8!$q':r:C!*-()q	4KC,	 .--
 (C0a78s0   GI0%I H>5	I>
IIIc                     U R                   b  U R                   $ [        U R                  [        5      (       d   e[	        U R                  R                  5       5      $ r+   )r   rb   rV   r   rL   rX   r#   s    r%   r   ConfigFromFile.source   sG     <<#<<$))T****499%%'((r)   valuec                     Xl         g r3   r   r$   r   s     r%   r   r          r)   )rn   ro   r   )rG   rH   rI   rJ   rK   r   r   rV   rL   rM   rj   rN   rk   rn   rP   r
   ro   rT   r   rq   rO   r&   r   setterrR   r   r)   r%   rh   rh   c   s   
 t,D#*,UD9J9 =ND=%*4e%%PGT#s(^d"PZ-24eRW-X|d*X4" "$sCx. " "" "S#X " "H ) ) ) ]]C D  r)   rh   c                       \ rS rSr% Sr\\\4   \S'   \	S\\\4   4S j5       r
\	S\4S j5       r\R                  S\SS4S	 j5       rS
rg)Dict   zjConfiguration source from an in-memory dictionary.

Useful for programmatically generated configurations.
datar   c                     U R                   $ r3   )r   r#   s    r%   r&   Dict.config   s    yyr)   c                 6    U R                   b  U R                   $ g)r,   rP   r   r#   s    r%   r   Dict.source   s     <<#<<r)   r   Nc                     Xl         g r3   r   r   s     r%   r   r      r   r)   r   )rG   rH   rI   rJ   rK   rP   rL   r
   rM   rO   r&   r   r   rR   r   r)   r%   r   r      sy    
 sCx.S#X      ]]C D  r)   r   ) r   r   abcr   r   collections.abcr   
contextlibr   	itertoolsr   pathlibr   typingr	   r
   attrsr   r   cyclopts.argumentr   r   cyclopts.exceptionsr   cyclopts.utilsr   cyclopts.corer   r   rT   rh   r   r   r)   r%   <module>r      s     	 # $    %  L - -! 3
 3
 3
le e0 QZ Q Qh :  r)   