
    ?wg                     2    d Z e dfdZ G d de      ZddZy)zRAISE ON EXCEPTION.c                     |j                  |      }| }|D ]  }	 t        ||      } |S # t        $ r* |t        u rt        dj	                  ||            |cY c S w xY w)z getattr via a chain of attributes like so:
    >>> import datetime
    >>> some_date = datetime.date.today()
    >>> get_attr(some_date, "month.numerator.__doc__")
    'int(x[, base]) -> integer

Convert a string or number to an integer, ...
    z!Bad attribute "{}" in chain: "{}")splitgetattrAttributeError"_get_attr_raise_on_attribute_errorformat)obj
string_repdefault	separatorattribute_chaincurrent_objattrs          D/var/www/horilla/myenv/lib/python3.12/site-packages/utils/objects.pyget_attrr      s     !&&y1OK 	!+t4K   	<<$;BB4T  N	s   *.AAc                   ,    e Zd ZdZdZd Zd Zd Zd Zy)ImmutableWrapperNc                      || _         || _        y )N)_obj
_recursive)selfr	   	recursives      r   __init__zImmutableWrapper.__init__   s    	#    c                     |dk(  r$| j                   t        j                  | ||       y |dk(  r$| j                  t        j                  | ||       y t	        d      )Nr   r   zHThis object has been marked as immutable; you cannot set its attributes.)r   object__setattr__r   r   )r   namevals      r   r   zImmutableWrapper.__setattr__#   sY    6>dii/tT3/\!doo&=tT3/ghhr   c                     | j                   r+t        t        | j                  |      | j                         S t        | j                  |      S )N)r   )r   	immutabler   r   )r   r   s     r   __getattr__zImmutableWrapper.__getattr__-   s6    ??WTYY5QQtyy$''r   c                     dj                  | j                  j                  j                  | j                  j	                               S )Nz<Immutable {}: {}>)r   r   	__class____name____repr__)r   s    r   r&   zImmutableWrapper.__repr__3   s2    #**499+>+>+G+GI[I[I]^^r   )	r%   
__module____qualname__r   r   r   r   r"   r&    r   r   r   r      s"    DJ$i(_r   r   c                     t        | |      S )zwraps the argument in a pass-through class that disallows all attribute
    setting. If the `recursive` flag is true, all attribute accesses will
    return an immutable-wrapped version of the "real" attribute.)r   )r	   r   s     r   r!   r!   7   s     C++r   N)T)r   r   r   r   r!   r)   r   r   <module>r+      s)   %9 "&HTW 0_v _8,r   