
    Ng!                    ,   d Z ddlmZ ddlZddl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 dd	lmZ dd
lmZ ddlmZmZ ddlmZ ddlmZ ddlm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' ddl(m)Z) erddl*m+Z+  G d d      Z,ddZ-ddZ.y)z:Scrapy Shell

See documentation in docs/topics/shell.rst

    )annotationsN)TYPE_CHECKINGAny)is_item)deferthreads)
threadable)
any_to_uri)Crawler)IgnoreRequest)RequestResponse)Settings)Spider)
get_config)DEFAULT_PYTHON_SHELLSstart_python_console)SequenceExclude)load_object)is_asyncio_reactor_installedset_asyncio_event_loop)open_in_browser)Callablec                      e Zd ZU eeeeefZde	d<   	 	 d	 	 	 	 	 ddZ
	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 dd	Zdd
ZddZddZy)Shellztuple[type, ...]relevant_classesNc                    || _         |xs d | _        t        |j                  d         | _        d | _        t        j                          | _        || _	        i | _
        y )Nc                     y N )xs    ,lib/python3.12/site-packages/scrapy/shell.py<lambda>z Shell.__init__.<locals>.<lambda>-   s    d    DEFAULT_ITEM_CLASS)crawlerupdate_varsr   settings
item_classspiderr	   isInIOThreadinthreadcodevars)selfr&   r'   r-   s       r"   __init__zShell.__init__%   s`     !(=H >
 	 !,G,<,<=Q,R S%)","9"9";; $	$&	r$   c                   t        j                   t         j                  t         j                         |r| j                  |||       nG|r| j                  ||       n2|r |j                  }| j                  |||       n| j                          | j                  r3t        t        | j                  t               | j                               y 	 t               }d\  }}t        j                  j                  d      }	g }
|	r1|
|	j                         j!                         j#                  d      z  }
n\|j%                  ||      r3|
|j                  ||      j                         j!                         gz  }
n|
t'        j(                         z  }
|
dgz  }
t+        | j                  |
| j                  j-                  dd             y )	N)redirect)r(   shellSCRAPY_PYTHON_SHELL,pythonbanner )shellsr7   )signalSIGINTSIG_IGNfetchrequestpopulate_varsr-   printevalglobalsr.   r   osenvirongetstriplowersplit
has_optionr   keysr   pop)r/   urlr>   responser*   r2   cfgsectionoptionenvr9   s              r"   startzShell.start5   s^    	fmmV^^4JJsFXJ6JJw'&&Gx&9 99$tyy')TYY78 ,C1OGV**..!67CF#))+++-33C8803777F399;AACDD/4466xj F 		&x1Lr$   c                @   t               r$| j                  j                  d   }t        |       | j	                  |      t        |      }|j                  fd       | j                  j                  sJ | j                  j                  j                  |       |S )NASYNCIO_EVENT_LOOPc                    | fS r   r    )r!   r*   s    r"   r#   z!Shell._schedule.<locals>.<lambda>k   s	    Fr$   )	r   r&   r(   r   _open_spider_request_deferredaddCallbackenginecrawl)r/   r>   r*   event_loop_pathds     `  r"   	_schedulezShell._scheduled   s    ')"ll334HIO"?3""7F3g&	+,||""""!!'*r$   c                L   | j                   r| j                   S |2| j                  j                   xs | j                  j                         }|| j                  _         | j                  j                  sJ | j                  j                  j	                  |d       || _         |S )NF)close_if_idle)r*   r&   _create_spiderrY   open_spider)r/   r>   r*   s      r"   rV   zShell._open_spiderp   s    ;;;;>\\((IDLL,G,G,IF$||""""''e'Dr$   c                d   ddl m} t        |t              r|}nMt	        |      }t        |fddi|}|r#t        t        dd            |j                  d<   nd|j                  d<   d }	 t        j                  || j                  ||      \  }}| j                  |||       y # t        $ r Y w xY w)	Nr   )reactordont_filterTi,  i  handle_httpstatus_listhandle_httpstatus_all)twisted.internetrc   
isinstancer   r
   r   rangemetar   blockingCallFromThreadr]   r   r?   )	r/   request_or_urlr*   r2   kwargsrc   r>   rL   rM   s	            r"   r=   zShell.fetch}   s     	-ng.$G^,Cc>t>v>G9H#sO:56 9=45	&==& Hf
 	8Wf5  		s   *%B# #	B/.B/c                b   dd l }|| j                  d<   | j                  | j                  d<   | j                         | j                  d<   | j                  j                  | j                  d<   || j                  d<   || j                  d<   || j                  d<   | j
                  r| j                  | j                  d	<   t        | j                  d
<   | j                  | j                  d<   | j                  | j                         | j                  s| j                         | j                  d<   y y )Nr   scrapyr&   itemr(   r*   r>   rM   r=   viewshelpr7   )ro   r.   r&   r)   r(   r,   r=   r   
print_helpr'   r-   get_help)r/   rM   r>   r*   ro   s        r"   r?   zShell.populate_vars   s     	$		(#||		) OO-		& $ 5 5		*$		(&		) (		*==!%DIIg+		&!__		'#yy"&--/DIIh r$   c                6    t        | j                                y r   )r@   rt   )r/   s    r"   rs   zShell.print_help   s    dmmor$   c                   g }|j                  d       |j                  d       t        | j                  j                               D ]/  \  }}| j	                  |      s|j                  d|dd|        1 |j                  d       | j
                  r"|j                  d       |j                  d       |j                  d	       |j                  d
       dj                  d |D              S )NzAvailable Scrapy objects:zJ  scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)z  z<10 zUseful shortcuts:ze  fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)zN  fetch(req)                  Fetch a scrapy.Request and update local objects z0  shelp()           Shell help (print this help)z.  view(response)    View response in a browser
c              3  &   K   | ]	  }d |   yw)z[s] Nr    ).0lines     r"   	<genexpr>z!Shell.get_help.<locals>.<genexpr>   s     5144v1s   )appendsortedr.   items_is_relevantr,   join)r/   bkvs       r"   rt   zShell.get_help   s    	,-	X	
 499??,-DAq  #2aWAaS)* . 	
$%==HHZ HHC 	
CD	AByy51555r$   c                H    t        || j                        xs t        |      S r   )rh   r   r   )r/   values     r"   r   zShell._is_relevant   s    %!6!67I75>Ir$   )NN)r&   r   r'   z'Callable[[dict[str, Any]], None] | Noner-   
str | None)NNNNT)rL   r   r>   Request | NonerM   Response | Noner*   Spider | Noner2   boolreturnNone)r>   r   r*   r   r   defer.Deferred[Any])r>   r   r*   r   r   r   )NT)
rl   zRequest | strr*   r   r2   r   rm   r   r   r   )NNN)rM   r   r>   r   r*   r   r   r   )r   r   )r   str)r   r   r   r   )__name__
__module____qualname__r   r   r   r   r   r   __annotations__r0   rR   r]   rV   r=   r?   rs   rt   r   r    r$   r"   r   r   "   s"   *167Hh)W&W
 @D	'' =' 	'$ "&$( $--  - "	-
 - - 
-^
  !%	6%6 6 	6
 6 
6> %)"& $	2!2  2 	2
 
2.60Jr$   r   c                    t        j                  t         j                        }t        |j                        j                  | |       t        j                   t         j                  |       y)z*Open a shell to inspect the given response)rM   r*   N)r:   	getsignalr;   r   r&   rR   )rM   r*   sigint_handlers      r"   inspect_responser      sF     %%fmm4N	&..&A
MM&--0r$   c                x     j                    j                  d fd}t        j                         }|j	                  |        j                   r|j                   j                           j                  r|j                   j                         |j                   |j                  c _          _        |S )a  Wrap a request inside a Deferred.

    This function is harmful, do not use it until you know what you are doing.

    This returns a Deferred whose first pair of callbacks are the request
    callback and errback. The Deferred also triggers when the request
    callback/errback is executed (i.e. when the request is downloaded)

    WARNING: Do not call request.replace() until after the deferred is called.
    c                $    _         _        | S r   )callbackerrback)resultr>   request_callbackrequest_errbacks    r"   _restore_callbacksz-_request_deferred.<locals>._restore_callbacks   s    +)r$   )r   r   r   r   )r   r   r   DeferredaddBothrX   
addErrback)r>   r   r\   r   r   s   `  @@r"   rW   rW      s     ''ooO
 #^^-AII !	g&&'	W__%()

AII%GgoHr$   )rM   r   r*   r   r   r   )r>   r   r   r   )/__doc__
__future__r   rC   r:   typingr   r   itemadapterr   rg   r   r   twisted.pythonr	   	w3lib.urlr
   scrapy.crawlerr   scrapy.exceptionsr   scrapy.httpr   r   scrapy.settingsr   scrapy.spidersr   scrapy.utils.confr   scrapy.utils.consoler   r   scrapy.utils.datatypesr   scrapy.utils.miscr   scrapy.utils.reactorr   r   scrapy.utils.responser   collections.abcr   r   r   rW   r    r$   r"   <module>r      sd    # 	  %  + %   " + ) $ ! ( L 2 ) U 1(kJ kJ\1r$   