o
    ïÅ[hƒ  ã                   @   sP   d dl ZddlmZ ddlmZ eƒ ZG dd„ de	ƒZ
eƒ ZG dd„ de
ƒZdS )	é    Né   )Úexc)Úcompatc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚBasicEntityc                 K   s"   |  ¡ D ]
\}}t| ||ƒ qd S ©N)ÚitemsÚsetattr)ÚselfÚkwÚkeyÚvalue© r   ú‚/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/sqlalchemy/testing/entities.pyÚ__init__   s   ÿzBasicEntity.__init__c              
      st   t ˆ ƒtv rt ˆ ¡S t t ˆ ƒ¡ zdˆ jjd ‡ fdd„tˆ j	 
¡ ƒD ƒ¡f W t t ˆ ƒ¡ S t t ˆ ƒ¡ w )Nz%s(%s)z, c                    s(   g | ]}|  d ¡sd|tˆ |ƒf ‘qS )Ú_z%s=%r)Ú
startswithÚgetattr)Ú.0r   ©r	   r   r   Ú
<listcomp>   s    ýÿz(BasicEntity.__repr__.<locals>.<listcomp>)ÚidÚ_repr_stackÚobjectÚ__repr__ÚaddÚ	__class__Ú__name__ÚjoinÚsortedÚ__dict__ÚkeysÚremover   r   r   r   r      s   

þÿþ zBasicEntity.__repr__N)r   Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s    r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚComparableEntityc                 C   s
   t | jƒS r   )Úhashr   r   r   r   r   Ú__hash__+   s   
zComparableEntity.__hash__c                 C   s   |   |¡ S r   )Ú__eq__)r	   Úotherr   r   r   Ú__ne__.   s   zComparableEntity.__ne__c              
   C   sÀ  || u rdS | j |j ksdS t| ƒtv rdS t t| ƒ¡ zºz
tjj | ¡j}W n tjj	j
y6   d}Y nw |du r@| }|}n|durI|}| }n| }|}t|jƒD ]{}| d¡rZqRt||ƒ}zt||ƒ}W n ttjfy|   Y  W t t| ƒ¡ dS w t|dƒrºt|tjƒsºt|dƒr¦t|dƒs¦t|ƒt|ƒkr¥ W t t| ƒ¡ dS qRt|ƒt|ƒkr¹ W t t| ƒ¡ dS qR|durÍ||krÍ W t t| ƒ¡ dS qRW t t| ƒ¡ dS t t| ƒ¡ w )zš'Deep, sparse compare.

        Deeply compare two entities, following the non-None attributes of the
        non-persisted object, if possible.

        TFNr   Ú__iter__Ú__getitem__r    )r   r   Ú_recursion_stackr   ÚsaZormÚ
attributesZinstance_stater   r   ZNO_STATEÚlistr   r   r   ÚAttributeErrorÚsa_excZUnboundExecutionErrorr!   ÚhasattrÚ
isinstancer   Ústring_typesÚset)r	   r(   Zself_keyÚaÚbÚattrr   Zbattrr   r   r   r'   1   sf   ÿ

íÿÿ	öù€þ"zComparableEntity.__eq__N)r   r"   r#   r&   r)   r'   r   r   r   r   r$   *   s    r$   )Z
sqlalchemyr-   Ú r   r1   Úutilr   r5   r   r   r   r,   r$   r   r   r   r   Ú<module>   s   