
    uYf                         d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZmZmZ ddlmZmZmZmZmZ d	Z ed
      ZdedefdZdddee	   dede
ee	e	f   geee	      f   fdZ e Z!y
)z.Utilities for union (sum type) disambiguation.    )OrderedDictdefaultdict)reduce)or_)AnyCallableDictMappingOptionalSetTypeUnion)NOTHINGfieldsfields_dict   )get_args
get_originhas
is_literalis_union_type)is_supported_unioncreate_default_dis_funcNtypreturnc                 T    t        |       xr t        d | j                  D              S )z-Whether the type is a union of attrs classes.c              3   `   K   | ]&  }|t         u xs t        t        |      xs |       ( y wN)NoneTyper   r   ).0es     U/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/cattrs/disambiguators.py	<genexpr>z%is_supported_union.<locals>.<genexpr>   s/      &56X0Z]/a00&s   ,.)r   all__args__)r   s    r"   r   r      s,     # &:=,,& #     T)use_literalsclassesr'   c           
         t        |      dk  rt        d      | r|D cg c]H  }t        t        |      xs |      D ch c]$  }t	        |j
                        s|j                  & c}J }}}|d   }|D ]  }||z  }	 d}d|D ]  }t        t              }	|D ]I  }t        t        t        |      xs |      |   j
                        D ]  }
|	|
   j                  |        K |Bt        d |	j                         D              t        d |j                         D              k  s|	}| |rrt        d |j                         D              t        |      k7  rp|j                         D ci c]+  \  }}|t        |      dk(  r|d   nt        t!        |         - c}}d	t"        t$        t$        f   d
t&        t(           ffd}|S |D cg c]4  }|t        t        |      xs |      D ch c]  }|j                   c}f6 }}}t        |D cg c]  \  }}t        |      dk(  s| c}}      dkD  rt        d      t+               |j-                  d        dt/        |      D ]  \  }\  }}||dz   d }|rt1        t2        d |D              }||z
  }|s| d}t        |      t        t        |      xs |      }|D ]   }t5        ||      j6                  t8        u s  n t        | d      ||<   | d	t"        t$        t$        f   d
t&        t(           ffd}|S c c}w c c}}w c c}}w c c}w c c}}w c c}}w )zGiven attrs classes, generate a disambiguation function.

    The function is based on unique fields or unique values.

    :param use_literals: Whether to try using fields annotated as literals for
        disambiguation.
       zAt least two classes required.r   Nc              3   2   K   | ]  }t        |        y wr   lenr    vs     r"   r#   z*create_default_dis_func.<locals>.<genexpr>?   s     )KQ#a&)K   c              3   2   K   | ]  }t        |        y wr   r,   r.   s     r"   r#   z*create_default_dis_func.<locals>.<genexpr>?   s      SASr0   c              3   2   K   | ]  }t        |        y wr   r,   r.   s     r"   r#   z*create_default_dis_func.<locals>.<genexpr>H   s     9qCF9r0   r   datar   c                 J    t        | t              st        d      |       S Nz"Only input mappings are supported.)
isinstancer
   
ValueError)r3   best_discriminatorfinal_mappings    r"   dis_funcz)create_default_dis_func.<locals>.dis_funcO   s*    !$0$%IJJ$T*<%=>>r&   z(At least two classes have no attributes.c                      t        | d          S )Nr   r,   )c_as    r"   <lambda>z)create_default_dis_func.<locals>.<lambda>b   s    CF| r&   )keyc              3   &   K   | ]	  }|d      yw)r   N )r    r<   s     r"   r#   z*create_default_dis_func.<locals>.<genexpr>i   s     %Fc!f%Fs   z! has no usable unique attributes.z& has no usable non-default attributes.c                 ~    t        | t              st        d      j                         D ]  \  }}|| v s|c S  S r5   )r6   r
   r7   items)r3   kr/   fallbackuniq_attrs_dicts      r"   r:   z)create_default_dis_func.<locals>.dis_funcy   sH    $(ABB#))+ 	DAqDy	 r&   )r-   r7   r   r   r   typenamer   listr   r   appendmaxvaluesrB   r   tupler
   r   r   r   r   sort	enumerater   r   getattrdefaultr   )r'   r(   clatcls_candidatesdiscriminatorspossible_discriminatorsbest_resultdiscriminatormappingr>   rC   r/   r:   cls_and_attrs_attrsicl_reqsother_classes
other_reqsuniqm	cl_fields	attr_namer8   rD   r9   rE   s                            @@@@r"   r   r      s    7|a9::  
  &jn&:;Sz"''?RRWWS
 
 $2!#4'5 	6#55N	6 !+ 	3M!$'G ,#
2 4"5mDII ,C CL''+,, "c)K'..:J)K&Ks S + 2 2 4S P ' &%2"	3" "9K$6$6$899S\I (--/Aq 3q6Q;1Q4E%(O;M
?wsCx0 ?Xd^ ?
 O JQCEz"~'; <="bgg=>M  -Cha3u:?ECDqHCDD (3}O34H%m4 =B%a!eg.%F%FGJZ'Dd;< m#z"~34I! P	9i088GCP !B4'M!NOO)+OI&H#&wsCx( Xd^  Oo T
B" > DsG   ML< L<.M:0M M<MM"M
9M
<MM)"__doc__collectionsr   r   	functoolsr   operatorr   typingr   r   r	   r
   r   r   r   r   r[   r   r   r   _compatr   r   r   r   r   __all__rF   r   boolr   r   create_uniq_field_dis_funcr@   r&   r"   <module>rm      s    4 0   K K K . . I I
;:D T  /3j3ij'+jwsCx !8DI#667jZ 5 r&   