
    rZh                     H    d dl mZmZmZ  G d de      ZeZ G d de      Zy)    )AnyMutableMappingMappingc                        e Zd ZdZddedz  ddfdZd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd ZdefdZdededdf fdZdefdZdefdZddeddfdZ xZS )Dicta  basically a dictionary but you can access the keys as attributes (with a dot instead of brackets))
	you can also "bind" it to another `MutableMapping` object
	
	this is the old version, for when you got a target that u dont want to convert, say for example a CommentMapNtargetreturnc                 *    |xs
 t               | _        y N)dict_t)selfr   s     ]/mounts/lovelace/software/anaconda3/envs/py312/lib/python3.12/site-packages/epicstuff/dict.py__init__zDict.__init__   s    df$'    c                 :     | j                   j                  |i |S r   )r   __len__r   argskwargss      r   r   zDict.__len__       ODGGOOT,LV,L%Lr   c                 :     | j                   j                  |i |S r   )r   __getitem__r   s      r   r   zDict.__getitem__       0C0C0CT0TV0T)Tr   c                 :     | j                   j                  |i |S r   )r   __setitem__r   s      r   r   zDict.__setitem__   r   r   c                 :     | j                   j                  |i |S r   )r   __delitem__r   s      r   r   zDict.__delitem__   r   r   c                 :     | j                   j                  |i |S r   )r   __iter__r   s      r   r    zDict.__iter__   s    -=TWW-=-=t-Nv-N&Nr   c                 :     | j                   j                  |i |S r   )r   __contains__r   s      r   r"   zDict.__contains__       1E1E1Et1Vv1V*Vr   c                 :     | j                   j                  |i |S r   )r   __reversed__r   s      r   r%   zDict.__reversed__   r#   r   c                 :     | j                   j                  |i |S r   )r   __or__r   s      r   r'   zDict.__or__   s    >477>>4+J6+J$Jr   c                 :     | j                   j                  |i |S r   )r   __ror__r   s      r   r)   zDict.__ror__   r   r   c                 :     | j                   j                  |i |S r   )r   __ior__r   s      r   r+   zDict.__ior__   r   r   c                     	  | j                   j                  |i |S # t        $ r  | j                   j                  |i |cY S w xY w)z,runs if `name` is not an attribute of `self`)r   __getattribute__AttributeErrorr   r   s      r   __getattr__zDict.__getattr__   sN    /
"$''
"
"D
3F
33	 /
$''

t
.v
../s    %AAnamevaluec                 h    |j                  d      rt        | 	  ||       y || j                  |<   y )N_)
startswithsuper__setattr__r   )r   r0   r1   	__class__s      r   r6   zDict.__setattr__    s+    	__S7tU#4774=r   c                 6    | j                   j                         S r   )r   __str__r   s    r   r9   zDict.__str__(   s    $''//"33r   c                 j    | j                   j                   d| j                  j                          dS N())r7   __name__r   __repr__r:   s    r   r@   zDict.__repr__)   s.    dnn&=&=%>a@P@P@R?SST#UUr   
_Dict__mapc                     |r| j                   j                  ||z         y ||z  j                         D ]!  \  }}| j                   j                  ||       # y r   )r   updateitems
setdefault)r   rA   	overwriter   keyr1   s         r   rC   zDict.update,   sM    77>>%&.!fn++- #zsEGGsE"#r   r   )T)r?   
__module____qualname____doc__r   r   r   r   r   r   r    r"   r%   r'   r)   r+   r   r/   strr6   r9   r@   r   rC   __classcell__r7   s   @r   r   r      s    qNT1 T  MTTTNVVJLL/3 /S    4c3UsU# #t #r   r   c                        e Zd ZdZddd fdZddd fdZd	edefd
Zd	ededdfdZ	deddf fdZ
d	ededdf fdZdef fdZdded	edefdZ xZS )r   a=  
	The class gives access to the dictionary through the attribute name.
	inspired by https://github.com/bstlabs/py-jdict and https://github.com/cdgriffith/Box

	set _convert to False (`Dict()._convert=False`) to disable the conversion of (nested) dicts to Dicts if future (after initialization) values that are added
	N)_convertr	   c                    |du s||du rd|d<   t        |   | g|i |S t        j                  t        g|i |} |j                  |i | |S )z
		"redirects" to old dict if convert is False
		:param args: Any
		:param _convert: bool
		:param kwargs: Any
		:return: Dict
		TrO   )r5   __new__OldDictr   )clsrO   r   r   objr7   s        r   rQ   zDict.__new__=   so     )$F:
'/#
/
/
// 
	24	26	233<<  
:r   T)recursive_convertc                    t        |   |i | |r/| j                         D ]  \  }}| j                  ||d      | |<    y y )NT)r5   r   rD   convert)r   rU   r   r   rG   r1   r7   s         r   r   zDict.__init__P   sL    'D#F#ZZ\ /zsEUC.DI/ r   rG   c                 $    | j                  |      S )z
		Method returns the value of the named attribute of an object. If not found, it returns null object.
		:param name: str
		:return: Any
		)r   )r   rG   s     r   r/   zDict.__getattr__U   s     
		#	r   r1   c                 (    | j                  ||       y)zr
		Method sets the value of given attribute of an object.
		:param key: str
		:param value: Any
		:return: None
		N)r   )r   rG   r1   s      r   r6   zDict.__setattr__\   s     3r   _Dict__namec                 "    t         |   |      S r   )r5   r   )r   rZ   r7   s     r   __delattr__zDict.__delattr__d   s    		V	$$r   c                 D    t         |   || j                  ||            S r   )r5   r   rW   )r   rG   r1   r7   s      r   r   zDict.__setitem__g   s     		S$,,uc":	;;r   c                 T    | j                   j                   dt        |           dS r<   )r7   r?   r5   r@   )r   r7   s    r   r@   zDict.__repr__j   s*    dnn&=&=%>a@P@R?SST#UUr   c                     |sd| v r| j                   s	 |S t        |t              r!t        t        | j                  |            }|S t        |t
              rt        |t              st        |      }|S )z[
		converts (nested) dicts in dicts or lists to Dicts
		:param value: Any
		:return: Any
		rO   )rO   
isinstancelistmaprW   r   r   )r   r1   rG   ignore__converts       r   rW   zDict.convertk   si     
Z4/
 
,	 %DLL%()5 
, %z%'>;5	,r   )r	   r   )r	   N)NF)r?   rH   rI   rJ   rQ   r   rK   r   r/   r6   r\   r   r@   rW   rL   rM   s   @r   r   r   6   s     #' & .2 /
C C C   %s %t %<C < < < VsU# C # r   N)typingr   r   r   r   r   rR    r   r   <module>rf      s-    / /.#4 .#b B4 Br   