
    3 d                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ  G d	 d
          Z G d d          Zd ZdS )    N)wraps)
getmembers)Dict)TestCase)Request)get_spec)iterate_spider_outputc                   .    e Zd ZdZdZd Zd Zd Zd ZdS )ContractzAbstract class for contractsNc                     t          |d| j         d          | _        t          |d| j         d          | _        || _        d S )N@z	 pre-hookz
 post-hook)_create_testcasenametestcase_pretestcase_postargs)selfmethodr   s      9lib/python3.11/site-packages/scrapy/contracts/__init__.py__init__zContract.__init__   sM    ,V5M5M5M5MNN-f6O$)6O6O6OPP			    c                      t           d          r*|j        t                     fd            }||_        |S )Npre_processc                 P   	                      j                                       |                                j                                       j                   ns# t
          $ r/                     j        t          j                               Y n;t          $ r/ 
                    j        t          j                               Y nw xY wt          t           | fi |                    S # t          t           | fi |                    c cY S xY wN)	startTestr   r   stopTest
addSuccessAssertionError
addFailuresysexc_info	ExceptionaddErrorlistr	   )response	cb_kwargscbresultsr   s     r   wrapperz&Contract.add_pre_hook.<locals>.wrapper   sP   R%%d&7888$$X...$$T%6777 &&t'89999 & J J J&&t'8#,..IIIII  H H H$$T%6GGGGGH
   5bb6O6OY6O6O P PQQQ4 5bb6O6OY6O6O P PQQQQQQQQQQs6   A	A' C= '6CC= 5CC= CC= =&D%hasattrcallbackr   r   requestr)   r*   r(   s   ` ` @r   add_pre_hookzContract.add_pre_hook   sh    4'' 	'!B2YYR R R R R R YR  'Gr   c                      t           d          r*|j        t                     fd            }||_        |S )Npost_processc           	         t          t           | fi |                    }	                     j                                       |                               j                                       j                   ns# t          $ r/                     j        t          j
                               Y n;t          $ r/                     j        t          j
                               Y nw xY w|S # |c cY S xY wr   )r%   r	   r   r   r2   r   r   r   r    r!   r"   r#   r$   )r&   r'   outputr(   r)   r   s      r   r*   z'Contract.add_post_hook.<locals>.wrapper2   s(   3BBx4M4M94M4MNNOO"%%d&8999%%f---$$T%7888 &&t'9:::: & K K K&&t'93<>>JJJJJ  I I I$$T%7HHHHHI
 "M6MMMMMMMMs6   A	B
 /C? 
6C: C? 5C:7C? 9C::C? ?Dr+   r.   s   ` ` @r   add_post_hookzContract.add_post_hook.   sa    4(( 	'!B2YY" " " " " " Y"  'Gr   c                     |S r    )r   r   s     r   adjust_request_argszContract.adjust_request_argsF   s    r   )	__name__
__module____qualname____doc__request_clsr   r0   r5   r8   r7   r   r   r   r      s[        &&K  
  .  0    r   r   c                   R    e Zd ZU i Zeeef         ed<   d Zd Z	d Z
d Zd Zd ZdS )	ContractsManager	contractsc                 .    |D ]}|| j         |j        <   d S r   )r@   r   )r   r@   contracts      r   r   zContractsManager.__init__M   s,    ! 	5 	5H,4DN8=))	5 	5r   c                     t          j        dt           j                  j        }g }t	          |          D ]@\  }}t          |          r,|j        r% ||j                  r|                    |           A|S )Nz^\s*@)recompile	MULTILINEsearchr   callabler<   append)r   	spidercls	is_methodmethodskeyvalues         r   tested_methods_from_spiderclsz.ContractsManager.tested_methods_from_spiderclsQ   sz    Jx66=	$Y// 	$ 	$JC $5= $YYu}5M5M $s###r   c                 b   g }|j                             d          D ]}|                                }|                    d          rft	          j        d|                                          \  }}t	          j        d|          }|                     | j        |         |g|R             |S )N
r   z@(\w+)\s*(.*)z\s+)	r<   splitstrip
startswithrD   matchgroupsrI   r@   )r   r   r@   liner   r   s         r   extract_contractsz"ContractsManager.extract_contractsZ   s    	N((.. 	F 	FD::<<Ds## FX&6==DDFF
dx--  !5!5f!Dt!D!D!DEEEr   c                 `   g }|                      t          |                    D ]}|                    |          }	 |                    |                     ||                     B# t
          $ r: t          |d          }|                    |t          j	                               Y w xY w|S )NrB   )
rO   type__getattribute__rI   from_methodr#   r   r$   r!   r"   )r   spiderr)   requestsr   bound_methodcases          r   from_spiderzContractsManager.from_spiderg   s    88fFF 	7 	7F!226::L7 0 0w G GHHHH 7 7 7'jAA  s|~~666667 s   )A''AB+*B+c                 2   |                      |          }|rt          }|D ]}|j        |j        }t          |j                  \  }}d|d<   ||d<   |D ]}|                    |          }|                    d           t          |                              t          |                    rf |di |}t          |          D ]}|
                    ||          }|D ]}|                    ||          }|                     |||           |S d S d S )NTdont_filterr-   r   r7   )rX   r   r=   r   r   r8   removesetissubsetreversedr0   r5   
_clean_req)	r   r   r)   r@   r=   rB   r   kwargsr/   s	            r   r\   zContractsManager.from_methods   si   **622	 	!K% 7 7' 7"*"6K $K$899LD& %)F=!!'F:% > >!55f==KK 4yy!!#f++.. 
%+//// !) 3 3 F FH&33GWEEGG ) G GH&44WgFFGG999=	 	(
 
r   c                 z    |j         t                    fd            }fd}||_         ||_        dS )z>stop the request from returning objects and records any errorsc                     	  | fi |}t          t          |                    }d S # t          $ r; t          d          }                    |t          j                               Y d S w xY w)Nr-   )r%   r	   r#   r   r$   r!   r"   )r&   r'   r4   r`   r(   r   r)   s       r   
cb_wrapperz/ContractsManager._clean_req.<locals>.cb_wrapper   s    7H22	223F;;<< 7 7 7'
;;  s|~~6666667s   %* AA/.A/c                     t          d          }| j        | j        |                                 f}                    ||           d S )Nerrback)r   rZ   rN   getTracebackObjectr$   )failurer`   r"   r   r)   s      r   
eb_wrapperz/ContractsManager._clean_req.<locals>.eb_wrapper   sJ    #FI66D|W]G4N4N4P4PPHT8,,,,,r   N)r-   r   rn   )r   r/   r   r)   rl   rq   r(   s     ``  @r   rh   zContractsManager._clean_req   su     	r	7 	7 	7 	7 	7 	7 
	7	- 	- 	- 	- 	- 	-
 &$r   N)r9   r:   r;   r@   r   strr   __annotations__r   rO   rX   ra   r\   rh   r7   r   r   r?   r?   J   s         %'ItCM"'''5 5 5    
 
 
     D% % % % %r   r?   c                       j         j         G  fddt                    } d j         }t	          ||d             ||          S )Nc                       e Zd Z fdZdS )*_create_testcase.<locals>.ContractTestCasec                 &    d dj          d dS )N[z] z ())r9   )_selfdescr   r]   s    r   __str__z2_create_testcase.<locals>.ContractTestCase.__str__   s&    ;v;;;;D;;;;r   N)r9   r:   r;   r|   )r{   r   r]   s   r   ContractTestCaserv      s8        	< 	< 	< 	< 	< 	< 	< 	< 	<r   r}   _c                     | S r   r7   )xs    r   <lambda>z"_create_testcase.<locals>.<lambda>   s    a r   )__self__r   r   r9   setattr)r   r{   r}   r   r]   s   ``  @r   r   r      s    _!F< < < < < < < < <8 < < < ((v((DdKK000D!!!r   )rD   r!   	functoolsr   inspectr   typingr   unittestr   scrapy.httpr   scrapy.utils.pythonr   scrapy.utils.spiderr	   r   r?   r   r7   r   r   <module>r      s   				 



                               ( ( ( ( ( ( 5 5 5 5 5 5: : : : : : : :z_% _% _% _% _% _% _% _%D	" 	" 	" 	" 	"r   