§
    §Mºf   ã                   óª   — d Z ddlmZ ddlmZmZ dd„Zd„ Zd„ Zd	„ Z	dd
„Z
 G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Zdd„Zd„ ZdS )aš  
This module contains a collection of utility function for dealing with property
groupings.

Terminology:

For the purpose of grouping and ungrouping, tuples/lists and dictionaries are considered
"composite values" and all other values are considered "scalar values".

A "grouping value" is either composite or scalar.

A "schema" is a grouping value that can be used to encode an expected grouping
structure

é    )ÚInvalidCallbackReturnValueé   )ÚAttributeDictÚstringify_idNc                 óê   ‡ ‡— ‰€‰ Šnt          ‰ ‰¦  «         t          ‰t          t          f¦  «        rd„ t	          ‰ ‰¦  «        D ¦   «         S t          ‰t
          ¦  «        rˆ ˆfd„‰D ¦   «         S ‰ gS )aÔ  
    Convert a grouping value to a list of scalar values

    :param grouping: grouping value to flatten
    :param schema: If provided, a grouping value representing the expected structure of
        the input grouping value. If not provided, the grouping value is its own schema.
        A schema is required in order to be able treat tuples and dicts in the input
        grouping as scalar values.

    :return: list of the scalar values in the input grouping
    Nc                 ó>   — g | ]\  }}t          ||¦  «        D ]}|‘ŒŒS © ©Úflatten_grouping)Ú.0Úgroup_elÚ	schema_elÚgs       úM/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/dash/_grouping.pyú
<listcomp>z$flatten_grouping.<locals>.<listcomp>&   sM   € ð 
ð 
ð 
á#�˜)Ý% h°	Ñ:Ô:ð
ð 
ð ð ð
ð 
ð 
ð 
ó    c                 óR   •— g | ]#}t          ‰|         ‰|         ¦  «        D ]}|‘ŒŒ$S r	   r
   )r   Úkr   ÚgroupingÚschemas      €€r   r   z$flatten_grouping.<locals>.<listcomp>-   s:   ø€ ÐTÐTÐT�aÕ+;¸HÀQ¼KÈÐPQÌÑ+SÔ+SÐTÐT a�ÐTÐTÐTÐTr   )Úvalidate_groupingÚ
isinstanceÚtupleÚlistÚzipÚdict)r   r   s   ``r   r   r      s�   øø€ ð €~Øˆˆå˜( FÑ+Ô+Ð+å�&�5¥$˜-Ñ(Ô(ð 
ð
ð 
å'*¨8°VÑ'<Ô'<ð
ñ 
ô 
ð 	
õ �&�$ÑÔð UØTÐTÐTÐTÐT˜6ÐTÑTÔTÐTàˆ:Ðr   c                 óð   — t          | t          t          f¦  «        rt          d„ | D ¦   «         ¦  «        S t          | t          ¦  «        r+t          d„ |                      ¦   «         D ¦   «         ¦  «        S dS )aU  
    Get the length of a grouping. The length equal to the number of scalar values
    contained in the grouping, which is equivalent to the length of the list that would
    result from calling flatten_grouping on the grouping value.

    :param grouping: The grouping value to calculate the length of
    :return: non-negative integer
    c                 ó,   — g | ]}t          |¦  «        ‘ŒS r	   ©Úgrouping_len©r   r   s     r   r   z grouping_len.<locals>.<listcomp><   s    € ÐDÐDÐD¨x•L Ñ*Ô*ÐDÐDÐDr   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r	   r   r!   s     r   r   z grouping_len.<locals>.<listcomp>?   s    € ÐMÐMÐM¨x•L Ñ*Ô*ÐMÐMÐMr   r   )r   r   r   Úsumr   Úvalues)r   s    r   r    r    2   sw   € õ �(�U¥D˜MÑ*Ô*ð FÝÐDÐD¸8ÐDÑDÔDÑEÔEÐEå�(�DÑ!Ô!ð OÝÐMÐM¸8¿?º?Ñ;LÔ;LÐMÑMÔMÑNÔNÐNàˆ1r   c           
      óp  ‡— ˆfd„Št          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚t	          t          | ¦  «        ¦  «        }t	          |¦  «        |k    r5t          d|› dt	          |¦  «        › dt          | ¦  «        › d|› �¦  «        ‚ ‰| t          |¦  «        ¦  «        S )a¨  
    Make a grouping like the provided grouping schema, with scalar values drawn from a
    flat list by index.

    Note: Scalar values in schema are not used

    :param schema: Grouping value encoding the structure of the grouping to return
    :param flat_values: List of values with length matching the grouping_len of schema.
        Elements of flat_values will become the scalar values in the resulting grouping
    c                 ó@  •‡— t          | t          t          f¦  «        r)t          ˆˆfd„t          | ¦  «        D ¦   «         ¦  «        S t          | t          ¦  «        r.ˆˆfd„t          |                      ¦   «         ¦  «        D ¦   «         S ‰                     d¦  «        S )Nc              3   ó6   •K  — | ]\  }} ‰|‰¦  «        V — Œd S ©Nr	   )r   ÚiÚelÚ_perform_make_grouping_likeÚnext_valuess      €€r   ú	<genexpr>zNmake_grouping_by_index.<locals>._perform_make_grouping_like.<locals>.<genexpr>R   sH   øè è € ð ð á�A�rð ,Ð+¨B°Ñ<Ô<ðð ð ð ð ð r   c                 ó6   •— i | ]\  }\  }}| ‰|‰¦  «        “ŒS r	   r	   )r   r)   r   Úvr+   r,   s       €€r   ú
<dictcomp>zOmake_grouping_by_index.<locals>._perform_make_grouping_like.<locals>.<dictcomp>X   sA   ø€ ð ð ð á�A‘v˜˜1ð Ð.Ð.¨q°+Ñ>Ô>ðð ð r   r   )r   r   r   Ú	enumerater   ÚitemsÚpop)Úvaluer,   r+   s    `€r   r+   z;make_grouping_by_index.<locals>._perform_make_grouping_likeP   sÇ   øø€ Ý�e�e¥T˜]Ñ+Ô+ð 	Ýð ð ð ð ð å& uÑ-Ô-ðñ ô ñ ô ð õ
 �e�TÑ"Ô"ð 	ðð ð ð ð å!*¨5¯;ª;©=¬=Ñ!9Ô!9ðñ ô ð ð
 �Š˜qÑ!Ô!Ð!r   z@The flat_values argument must be a list. Received value of type z(The specified grouping pattern requires z elements but received z
    Grouping pattern: z
    Values: )r   r   Ú
ValueErrorÚtypeÚlenr   Úrepr)r   Úflat_valuesÚexpected_lengthr+   s      @r   Úmake_grouping_by_indexr;   D   sþ   ø€ ð"ð "ð "ð "ð "õ �k¥4Ñ(Ô(ð 
Ýð:Ý&*¨;Ñ&7Ô&7ð:ð :ñ
ô 
ð 	
õ
 Õ*¨6Ñ2Ô2Ñ3Ô3€OÝ
ˆ;ÑÔ˜?Ò*Ð*Ýð)°ð )ð )Ý%(¨Ñ%5Ô%5ð)ð )å%)¨&¡\¤\ð)ð )ð 'ð)ð )ñ
ô 
ð 	
ð 'Ð& v­t°KÑ/@Ô/@ÑAÔAÐAr   c                 óò   ‡ — t          |t          t          f¦  «        rˆ fd„|D ¦   «         S t          |t          ¦  «        r-t	          ˆ fd„|                     ¦   «         D ¦   «         ¦  «        S  ‰ |¦  «        S )a€  
    Map a function over all of the scalar values of a grouping, maintaining the
    grouping structure

    :param fn: Single-argument function that accepts and returns scalar grouping values
    :param grouping: The grouping to map the function over
    :return: A new grouping with the same structure as input grouping with scalar
        values updated by the input function.
    c                 ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r	   ©Úmap_grouping)r   r   Úfns     €r   r   z map_grouping.<locals>.<listcomp>|   s#   ø€ Ð6Ð6Ð6¨•˜R Ñ#Ô#Ð6Ð6Ð6r   c                 ó8   •— i | ]\  }}|t          ‰|¦  «        “ŒS r	   r>   )r   r   r   r@   s      €r   r0   z map_grouping.<locals>.<dictcomp>   s)   ø€ ÐRÐRÐR¹¸¸A˜a¥¨b°!Ñ!4Ô!4ÐRÐRÐRr   )r   r   r   r   r   r2   )r@   r   s   ` r   r?   r?   q   sƒ   ø€ õ �(�U¥D˜MÑ*Ô*ð 7Ø6Ð6Ð6Ð6¨XÐ6Ñ6Ô6Ð6å�(�DÑ!Ô!ð TÝÐRÐRÐRÐRÀÇÂÑAQÔAQÐRÑRÔRÑSÔSÐSàˆ2ˆh‰<Œ<Ðr   c                 ó.   ‡‡— t          ˆˆfd„| ¦  «        S )a³  
    Create a grouping from a schema by using the schema's scalar values to look up
    items in the provided source object.

    :param schema: A grouping of potential keys in source
    :param source: Dict-like object to use to look up scalar grouping value using
        scalar grouping values as keys
    :param default: Default scalar value to use if grouping scalar key is not present
        in source
    :return: grouping
    c                 ó0   •— ‰                      | ‰¦  «        S r(   )Úget)ÚsÚdefaultÚsources    €€r   ú<lambda>z&make_grouping_by_key.<locals>.<lambda>�   s   ø€  &§*¢*¨Q°Ñ"8Ô"8€ r   r>   )r   rG   rF   s    ``r   Úmake_grouping_by_keyrI   „   s#   øø€ õ Ð8Ð8Ð8Ð8Ð8¸&ÑAÔAÐAr   c                   ó4   ‡ — e Zd Zˆ fd„Zed„ ¦   «         Zˆ xZS )ÚSchemaTypeValidationErrorc                 óº   •— t          ¦   «                              d|› dt          |¦  «        › d|› dt          |¦  «        › dt          |¦  «        › d�¬¦  «         d S )Nú
                Schema: ú
                Path: z 
                Expected type: z(
                Received value of type ú:
                    ú
                ©Úmsg)ÚsuperÚ__init__r8   r6   )Úselfr4   Úfull_schemaÚpathÚexpected_typeÚ	__class__s        €r   rT   z"SchemaTypeValidationError.__init__”   s‘   ø€ Ý‰Œ×ÒðØ$ðð å˜D‘z”zðð ð !.ðð õ )-¨U©¬ð	ð õ
 ˜%‘[”[ðð ð ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   c                 óJ   — t          ||¦  «        st          ||||¦  «        ‚d S r(   )r   rK   )Úclsr4   rV   rW   rX   s        r   ÚcheckzSchemaTypeValidationError.checkŸ   s5   € å˜% Ñ/Ô/ð 	UÝ+¨E°;ÀÀmÑTÔTÐTð	Uð 	Ur   ©Ú__name__Ú
__module__Ú__qualname__rT   Úclassmethodr\   Ú__classcell__©rY   s   @r   rK   rK   “   óZ   ø€ € € € € ð	
ð 	
ð 	
ð 	
ð 	
ð ðUð Uñ „[ðUð Uð Uð Uð Ur   rK   c                   ó4   ‡ — e Zd Zˆ fd„Zed„ ¦   «         Zˆ xZS )ÚSchemaLengthValidationErrorc                 óº   •— t          ¦   «                              d|› dt          |¦  «        › d|› dt          |¦  «        › dt          |¦  «        › d�¬¦  «         d S )NrM   rN   z"
                Expected length: z*
                Received value of length rO   rP   rQ   )rS   rT   r8   r7   )rU   r4   rV   rW   Úexpected_lenrY   s        €r   rT   z$SchemaLengthValidationError.__init__¦   s‘   ø€ Ý‰Œ×ÒðØ$ðð å˜D‘z”zðð ð #/ðð õ +.¨e©*¬*ð	ð õ
 ˜%‘[”[ðð ð ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   c                 óP   — t          |¦  «        |k    rt          ||||¦  «        ‚d S r(   )r7   rf   )r[   r4   rV   rW   rh   s        r   r\   z!SchemaLengthValidationError.check±   s/   € åˆu‰:Œ:˜Ò%Ð%Ý-¨e°[À$ÈÑUÔUÐUð &Ð%r   r]   rc   s   @r   rf   rf   ¥   sZ   ø€ € € € € ð	
ð 	
ð 	
ð 	
ð 	
ð ðVð Vñ „[ðVð Vð Vð Vð Vr   rf   c                   ó4   ‡ — e Zd Zˆ fd„Zed„ ¦   «         Zˆ xZS )ÚSchemaKeysValidationErrorc                 óÞ   •— t          ¦   «                              d|› dt          |¦  «        › d|› dt          |                     ¦   «         ¦  «        › dt          |¦  «        › d�¬¦  «         d S )NrM   rN   z 
                Expected keys: z*
                Received value with keys rO   rP   rQ   )rS   rT   r8   ÚsetÚkeys)rU   r4   rV   rW   Úexpected_keysrY   s        €r   rT   z"SchemaKeysValidationError.__init__¸   s›   ø€ Ý‰Œ×ÒðØ$ðð å˜D‘z”zðð ð !.ðð õ +.¨e¯jªj©l¬lÑ*;Ô*;ð	ð õ
 ˜%‘[”[ðð ð ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   c                 óŽ   — t          |                     ¦   «         ¦  «        t          |¦  «        k    rt          ||||¦  «        ‚d S r(   )rm   rn   rk   )r[   r4   rV   rW   ro   s        r   r\   zSchemaKeysValidationError.checkÃ   sA   € åˆu�zŠz‰|Œ|ÑÔ¥ MÑ 2Ô 2Ò2Ð2Ý+¨E°;ÀÀmÑTÔTÐTð 3Ð2r   r]   rc   s   @r   rk   rk   ·   rd   r   rk   r	   c                 ó€  — |€|}t          |t          t          f¦  «        r’t                               | ||t          t          f¦  «         t
                               | ||t          |¦  «        ¦  «         t          t          | |¦  «        ¦  «        D ]\  }\  }}t          |||||fz   ¬¦  «         Œ dS t          |t          ¦  «        rvt                               | ||t          ¦  «         t                               | ||t          |¦  «        ¦  «         |D ]%}t          | |         ||         |||fz   ¬¦  «         Œ&dS dS )zx
    Validate that the provided grouping conforms to the provided schema.
    If not, raise a SchemaValidationError
    N)rV   rW   )r   r   r   rK   r\   rf   r7   r1   r   r   r   rk   rm   )r   r   rV   rW   r)   r   rE   r   s           r   r   r   É   sY  € ð
 ÐØˆå�&�5¥$˜-Ñ(Ô(ð Ý!×'Ò'¨°+¸tÅeÍTÀ]ÑSÔSÐSÝ#×)Ò)¨(°KÀÅsÈ6Á{Ä{ÑSÔSÐSå"¥3 x°Ñ#8Ô#8Ñ9Ô9ð 	Oð 	O‰IˆA‰v��1Ý˜a °À$È!ÈÁ+ÐNÑNÔNÐNÐNð	Oð 	Oå	�F�DÑ	!Ô	!ð 	Ý!×'Ò'¨°+¸tÅTÑJÔJÐJÝ!×'Ò'¨°+¸tÅSÈÁ[Ä[ÑQÔQÐQàð 	ð 	ˆAÝØ˜”˜V AœY°KÀdÈaÈTÁkðñ ô ð ð ð	ð 	ð
 	ˆr   c                 óF  — t          | t          ¦  «        r‹t          | d         ¦  «        }|› d| d         › �}|                      d¦  «        |||v t          | d         t          ¦  «        rt	          | d         ¦  «        n| d         dœ}|                      |¦  «         d S d S )NÚidú.Úpropertyr4   )r4   Ústr_idÚ	triggeredrs   )r   r   r   rD   r   Úupdate)r   rw   rv   Úprop_idÚ
new_valuess        r   Úupdate_args_groupr{   ã   s±   € Ý�!•TÑÔð 
Ý˜a œgÑ&Ô&ˆØÐ-Ð-˜a 
œmÐ-Ð-ˆð —U’U˜7‘^”^ØØ  IÐ-Ý,6°q¸´wÅÑ,EÔ,EÐR•-  $¤Ñ(Ô(Ð(È1ÈTÌ7ð	
ð 
ˆ
ð 	
�Š�ÑÔÐÐÐð
ð 
r   r(   )Nr	   )Ú__doc__Údash.exceptionsr   Ú_utilsr   r   r   r    r;   r?   rI   rK   rf   rk   r   r{   r	   r   r   ú<module>r      s^  ððð ð 7Ð 6Ð 6Ð 6Ð 6Ð 6Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /ðð ð ð ð<ð ð ð$*Bð *Bð *BðZð ð ð&Bð Bð Bð BðUð Uð Uð Uð UÐ :ñ Uô Uð Uð$Vð Vð Vð Vð VÐ"<ñ Vô Vð Vð$Uð Uð Uð Uð UÐ :ñ Uô Uð Uð$ð ð ð ð4ð ð ð ð r   