
    `%                     Z   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZmZmZmZmZmZ g dZ G d d	ee
      Z G d d      Z G d dee      Z G d dee      Z G d de      Z G d d      Z G d dee      Z G d dee      Z G d de      ZdedefdZ y)    )abstractmethodABCMeta)deque)KeysViewMutableMappingMappingProxyType)AnyDequeIteratorType)_get_pydantic_model_metadatais_attrs_instanceis_dataclass_instanceis_itemis_pydantic_instanceis_scrapy_item)AdapterInterfaceAttrsAdapterDataclassAdapterDictAdapterItemAdapterPydanticAdapterScrapyItemAdapterc                   `    e Zd ZdZdeddfdZeededefd              Z	de
defdZdefd	Zy)
r   zAbstract Base Class for adapters.

    An adapter that handles a specific type of item should inherit from this
    class and implement the abstract methods defined here, plus the
    abtract methods inherited from the MutableMapping base class.
    itemreturnNc                     || _         y Nr   )selfr   s     3lib/python3.12/site-packages/itemadapter/adapter.py__init__zAdapterInterface.__init__$   s	    	    c                     t               )zEReturn True if the adapter can handle the given item, False otherwise)NotImplementedErrorclsr   s     r"   r   zAdapterInterface.is_item'   s     "##r$   
field_namec                     t        i       S )z7Return metadata for the given field name, if available.r   r!   r)   s     r"   get_field_metazAdapterInterface.get_field_meta-   s    ##r$   c                 "    | j                         S )z0Return a dynamic view of the item's field names.)keysr!   s    r"   field_nameszAdapterInterface.field_names1   s    yy{r$   )__name__
__module____qualname____doc__r
   r#   classmethodr   boolr   strr	   r,   r   r0    r$   r"   r   r      sd    S T  $3 $4 $  $$ $1A $X r$   r   )	metaclassc                       e Zd ZU eed<   eed<   dedefdZde	fdZ
dedefdZdededd	fd
Zdedd	fdZdefdZdefdZy	)_MixinAttrsDataclassAdapter_fields_dictr   r)   r   c                 4    | j                   |   j                  S r   )r<   metadatar+   s     r"   r,   z*_MixinAttrsDataclassAdapter.get_field_meta;   s      ,555r$   c                 ,    t        | j                        S r   )r   r<   r/   s    r"   r0   z'_MixinAttrsDataclassAdapter.field_names>   s    ))**r$   c                 `    || j                   v rt        | j                  |      S t        |      r   )r<   getattrr   KeyErrorr+   s     r"   __getitem__z'_MixinAttrsDataclassAdapter.__getitem__A   s,    ***499j11z""r$   valueNc                     || j                   v rt        | j                  ||       y t        | j                  j                  j
                   d|       Nz does not support field: )r<   setattrr   rB   	__class__r1   r!   r)   rD   s      r"   __setitem__z'_MixinAttrsDataclassAdapter.__setitem__F   sJ    ***DIIz51dii11::;;TU_T`abbr$   c                     || j                   v r	 t        | j                  |       y t	        | j                  j
                  j                   d|       # t        $ r t	        |      w xY wrF   )r<   delattrr   AttributeErrorrB   rH   r1   r+   s     r"   __delitem__z'_MixinAttrsDataclassAdapter.__delitem__L   sk    ***+		:. dii11::;;TU_T`abb " +z**+s   A A*c                 @     t         fd j                  D              S )Nc              3   P   K   | ]  }t        j                  |      s|  y wr   hasattrr   .0attrr!   s     r"   	<genexpr>z7_MixinAttrsDataclassAdapter.__iter__.<locals>.<genexpr>V   s!     S%6T'$))T:RD%6   &&)iterr<   r/   s   `r"   __iter__z$_MixinAttrsDataclassAdapter.__iter__U   s    ST%6%6SSSr$   c                 <    t        t        t        |                   S r   lenlistrX   r/   s    r"   __len__z#_MixinAttrsDataclassAdapter.__len__X       4T
#$$r$   )r1   r2   r3   dict__annotations__r
   r7   r	   r,   r   r0   rC   rJ   rN   r   rY   intr^   r8   r$   r"   r;   r;   6   s    
I6 61A 6+X +#c #c #
cc c# c$ ccc cd cT( T% %r$   r;   c                   B     e Zd Zdeddf fdZededefd       Z xZS )r   r   r   Nc                     t         |   |       dd l}|j                  | j                  j
                        | _        y Nr   )superr#   rU   fields_dictr   rH   r<   )r!   r   rU   rH   s      r"   r#   zAttrsAdapter.__init__]   s2     !,,TYY-@-@Ar$   c                     t        |      S r   )r   r'   s     r"   r   zAttrsAdapter.is_itemd   s     &&r$   	r1   r2   r3   r
   r#   r5   r6   r   __classcell__rH   s   @r"   r   r   \   s;    BS BT B '3 '4 ' 'r$   r   c                   B     e Zd Zdeddf fdZededefd       Z xZS )r   r   r   Nc                     t         |   |       dd l}|j                  | j                        D ci c]  }|j
                  | c}| _        y c c}w re   )rf   r#   dataclassesfieldsr   namer<   )r!   r   rn   fieldrH   s       r"   r#   zDataclassAdapter.__init__j   sJ     =H<N<Ntyy<YZ<Y5UZZ.<YZZs   Ac                     t        |      S r   )r   r'   s     r"   r   zDataclassAdapter.is_itemq   s    $T**r$   ri   rk   s   @r"   r   r   i   s;    [S [T [ +3 +4 + +r$   r   c                       e Zd ZU eed<   dedefdZedede	fd       Z
defdZdedefdZdededd	fd
Zdedd	fdZdefdZdefdZy	)r   r   r)   r   c                 @    t        t        | j                        |      S r   )r   typer   r+   s     r"   r,   zPydanticAdapter.get_field_metaz   s    +DOZHHr$   c                     t        |      S r   )r   r'   s     r"   r   zPydanticAdapter.is_item}   s    #D))r$   c                 @    t        | j                  j                        S r   )r   r   
__fields__r/   s    r"   r0   zPydanticAdapter.field_names   s    		,,--r$   c                 t    || j                   j                  v rt        | j                   |      S t        |      r   )r   rx   rA   rB   r+   s     r"   rC   zPydanticAdapter.__getitem__   s0    ---499j11z""r$   rD   Nc                     || j                   j                  v rt        | j                   ||       y t        | j                   j                  j
                   d|       rF   )r   rx   rG   rB   rH   r1   rI   s      r"   rJ   zPydanticAdapter.__setitem__   sN    ---DIIz51dii11::;;TU_T`abbr$   c                     || j                   j                  v r	 t        | j                   |       y t	        | j                   j
                  j                   d|       # t        $ r t	        |      w xY wrF   )r   rx   rL   rM   rB   rH   r1   r+   s     r"   rN   zPydanticAdapter.__delitem__   so    ---+		:. dii11::;;TU_T`abb " +z**+s   A A4c                 T     t         fd j                  j                  D              S )Nc              3   P   K   | ]  }t        j                  |      s|  y wr   rQ   rS   s     r"   rV   z+PydanticAdapter.__iter__.<locals>.<genexpr>   s"     V%9TWTYYPT=UD%9rW   )rX   r   rx   r/   s   `r"   rY   zPydanticAdapter.__iter__   s    VTYY%9%9VVVr$   c                 <    t        t        t        |                   S r   r[   r/   s    r"   r^   zPydanticAdapter.__len__   r_   r$   )r1   r2   r3   r
   ra   r7   r	   r,   r5   r6   r   r   r0   rC   rJ   rN   r   rY   rb   r^   r8   r$   r"   r   r   v   s    
II I1A I *3 *4 * *.X .#c #c #
cc c# c$ ccc cd cW( W% %r$   r   c                   n    e Zd ZU eed<   eed<   dedefdZdededdfdZdeddfd	Z	de
fd
ZdefdZy)_MixinDictScrapyItemAdapterr<   r   r)   r   c                      | j                   |   S r   r    r+   s     r"   rC   z'_MixinDictScrapyItemAdapter.__getitem__   s    yy$$r$   rD   Nc                 "    || j                   |<   y r   r    rI   s      r"   rJ   z'_MixinDictScrapyItemAdapter.__setitem__   s     %		*r$   c                     | j                   |= y r   r    r+   s     r"   rN   z'_MixinDictScrapyItemAdapter.__delitem__   s    IIj!r$   c                 ,    t        | j                        S r   )rX   r   r/   s    r"   rY   z$_MixinDictScrapyItemAdapter.__iter__   s    DIIr$   c                 ,    t        | j                        S r   )r\   r   r/   s    r"   r^   z#_MixinDictScrapyItemAdapter.__len__   s    499~r$   )r1   r2   r3   r`   ra   r
   r7   rC   rJ   rN   r   rY   rb   r^   r8   r$   r"   r   r      se    
I%c %c %&c &# &$ &"c "d "(  r$   r   c                   B    e Zd Zededefd       ZdedefdZ	de
fdZy)r   r   r   c                 "    t        |t              S r   )
isinstancer`   r'   s     r"   r   zDictAdapter.is_item   s    $%%r$   r)   c                     t        i       S r   r   r+   s     r"   r,   zDictAdapter.get_field_meta   s    ##r$   c                 ,    t        | j                        S r   )r   r   r/   s    r"   r0   zDictAdapter.field_names   s    		""r$   Nr1   r2   r3   r5   r
   r6   r   r7   r	   r,   r   r0   r8   r$   r"   r   r      sB    &3 &4 & &$ $1A $#X #r$   r   c                   B    e Zd Zededefd       ZdedefdZ	de
fdZy)r   r   r   c                     t        |      S r   )r   r'   s     r"   r   zScrapyItemAdapter.is_item   s    d##r$   r)   c                 F    t        | j                  j                  |         S r   )r	   r   ro   r+   s     r"   r,   z ScrapyItemAdapter.get_field_meta   s    		 0 0 <==r$   c                 @    t        | j                  j                        S r   )r   r   ro   r/   s    r"   r0   zScrapyItemAdapter.field_names   s    		(())r$   Nr   r8   r$   r"   r   r      sB    $3 $4 $ $> >1A >*X *r$   r   c                      e Zd ZU dZ eeeeee	g      Z
eee      ed<   deddfdZededefd       Zedefd       Zdefd	Zd
edefdZd
ededdfdZd
eddfdZdefdZdefdZd
edefdZ de!fdZ"de#fdZ$y)r   zWrapper class to interact with data container objects. It provides a common interface
    to extract and set data without having to take the object's type into account.
    ADAPTER_CLASSESr   r   Nc                     | j                   D ]"  }|j                  |      s ||      | _         y  t        dt	        |       d| d      )Nz&No adapter found for objects of type: z ())r   r   adapter	TypeErrorru   )r!   r   r(   s      r"   r#   zItemAdapter.__init__   sQ    ''C{{4 "4y (
 DT$ZLPRSWRXXYZ[[r$   c                 @    t        fd| j                  D              S )Nc              3   @   K   | ]  }|j                          y wr   )r   )rT   adapter_classr   s     r"   rV   z&ItemAdapter.is_item.<locals>.<genexpr>   s     XDW==((.DWs   )anyr   r'   s    `r"   r   zItemAdapter.is_item   s    XCDWDWXXXr$   c                 .    | j                   j                  S r   )r   r   r/   s    r"   r   zItemAdapter.item   s    ||   r$   c           	          dj                  | j                         D cg c]  \  }}|d| c}}      }d| j                  j                  j                   d| dS c c}}w )Nz, =z<ItemAdapter for (z)>)joinitemsr   rH   r1   )r!   keyrD   valuess       r"   __repr__zItemAdapter.__repr__   sZ    TZZ\R\zsEsE2\RS"499#6#6#?#?"@&LL Ss   A
r)   c                 8    | j                   j                  |      S r   )r   rC   r+   s     r"   rC   zItemAdapter.__getitem__   s    ||''
33r$   rD   c                 <    | j                   j                  ||       y r   )r   rJ   rI   s      r"   rJ   zItemAdapter.__setitem__   s      U3r$   c                 :    | j                   j                  |       y r   )r   rN   r+   s     r"   rN   zItemAdapter.__delitem__   s      ,r$   c                 6    | j                   j                         S r   )r   rY   r/   s    r"   rY   zItemAdapter.__iter__   s    ||$$&&r$   c                 6    | j                   j                         S r   )r   r^   r/   s    r"   r^   zItemAdapter.__len__   s    ||##%%r$   c                 8    | j                   j                  |      S )a  Return a read-only mapping with metadata for the given field name. If there is no metadata
        for the field, or the wrapped item does not support field metadata, an empty object is
        returned.

        Field metadata is taken from different sources, depending on the item type:
        * scrapy.item.Item: corresponding scrapy.item.Field object
        * dataclass items: "metadata" attribute for the corresponding field
        * attrs items: "metadata" attribute for the corresponding field

        The returned value is an instance of types.MappingProxyType, i.e. a dynamic read-only view
        of the original mapping, which gets automatically updated if the original mapping changes.
        )r   r,   r+   s     r"   r,   zItemAdapter.get_field_meta   s     ||**:66r$   c                 6    | j                   j                         S )zPReturn read-only key view with the names of all the defined fields for the item.)r   r0   r/   s    r"   r0   zItemAdapter.field_names  s    ||''))r$   c                 h    | j                         D ci c]  \  }}|t        |       c}}S c c}}w )zReturn a dict object with the contents of the adapter. This works slightly different than
        calling `dict(adapter)`: it's applied recursively to nested items (if there are any).
        )r   _asdict)r!   r   rD   s      r"   asdictzItemAdapter.asdict  s/     7;jjlCl
UWU^#lCCCs   .)%r1   r2   r3   r4   r   r   r   r   r   r   r   r   r   r   ra   r
   r#   r5   r6   r   propertyr   r7   r   rC   rJ   rN   r   rY   rb   r^   r	   r,   r   r0   r`   r   r8   r$   r"   r   r      s$    6;	
6OU4 012 \S \T \ Y3 Y4 Y Y !c ! !M# M4c 4c 44c 4# 4$ 4-c -d -'( '& &7 71A 7*X *D Dr$   r   objr   c                 z   t        | t              r-| j                         D ci c]  \  }}|t        |       c}}S t        | t        t
        t        f      r| j                  d | D              S t        | t              r| j                         S t        |       rt        |       j                         S | S c c}}w )z Helper for ItemAdapter.asdict().c              3   2   K   | ]  }t        |        y wr   )r   )rT   xs     r"   rV   z_asdict.<locals>.<genexpr>  s     5AWQZs   )r   r`   r   r   r]   settuplerH   r   r   r   )r   r   rD   s      r"   r   r     s    #t69iikBk
UWU^#kBB	C$U+	,}}5555	C	%zz|	3&&((
 Cs   B7N)!abcr   r   collectionsr   collections.abcr   r   typesr	   typingr
   r   r   r   itemadapter.utilsr   r   r   r   r   r   __all__r   r;   r   r   r   r   r   r   r   r   r8   r$   r"   <module>r      s    '  4 " - - ~ 4#% #%L
'.0@ 
'
+24D 
+&%& &%R *	#-/? 	#	*35E 	*ID. IDX  r$   