B
    nôb\Ç  ã               @   sx   d Z ddlm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mZ ddlmZ dd	lmZ G d
d„ deƒZdS )zT
Widget that handles communications between the IPython Console and
the Help plugin
é    )Úabsolute_importN)ÚANSI_OR_SPECIAL_PATTERN)ÚRichJupyterWidget)Ú
QEventLoop)ÚgetargspecfromtextÚgetsignaturefromtext)Ú_)ÚPY3c               @   sB   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Z	dS )Ú
HelpWidgetz‡
    Widget with the necessary attributes and methods to handle communications
    between the IPython Console and the Help plugin
    c             C   s   t  dd|¡S )zŠ
        Replace invalid variable chars in a string by underscores

        Taken from https://stackoverflow.com/a/3305731/438386
        z
\W|^(?=\d)r   )ÚreÚsub)ÚselfÚvar© r   úAlib/python3.7/site-packages/spyder/widgets/ipythonconsole/help.pyÚclean_invalid_var_chars    s    z"HelpWidget.clean_invalid_var_charsc             C   s²   |  di ¡}|  dd¡}|rªt d|¡}| j| j_| j ¡ }|dd…  d¡d }| d¡d }y|  |¡ d¡d }W n   Y nX t	|ƒ}|rœ|| }n
t
||ƒ}|S dS dS )	z(Get signature from inspect reply contentÚdataz
text/plainÚ Néÿÿÿÿú(Ú.r   )Úgetr   r   Z_prompt_posÚ_controlZcurrent_prompt_posZget_current_line_to_cursorÚsplitr   r   r   )r   Úcontentr   ÚtextÚlineÚnameZargspecÚ	signaturer   r   r   Úget_signature(   s$    



zHelpWidget.get_signatureFc             C   sP   | j r
dS tƒ }| j |j¡ |  d||f ¡ | ¡  | j |j¡ d}| jS )z Return True if object is definedNz6get_ipython().kernel.is_defined('%s', force_import=%s))	Ú_readingr   Úsig_got_replyÚconnectÚquitÚsilent_exec_methodÚexec_Ú
disconnectÚ_kernel_reply)r   ÚobjtxtZforce_importÚ	wait_loopr   r   r   Ú
is_definedC   s    zHelpWidget.is_definedc             C   sL   | j r
dS tƒ }| j |j¡ |  d| ¡ | ¡  | j |j¡ d}| jS )z#Get object documentation dictionaryNz"get_ipython().kernel.get_doc('%s'))	r    r   r!   r"   r#   r$   r%   r&   r'   )r   r(   r)   r   r   r   Úget_docT   s    zHelpWidget.get_docc             C   sL   | j r
dS tƒ }| j |j¡ |  d| ¡ | ¡  | j |j¡ d}| jS )zGet object sourceNz%get_ipython().kernel.get_source('%s'))	r    r   r!   r"   r#   r$   r%   r&   r'   )r   r(   r)   r   r   r   Ú
get_sourcec   s    zHelpWidget.get_sourcec             C   s„   |   ¡ }| j d¡}|r€|j|d d kr€|j| ¡ kr€|d }| d¡dkr€| dd¡r€|  |¡}|r€| jjt	d	ƒ|d
dd dS )z†
        Reimplement call tips to only show signatures, using the same
        style from our Editor and External Console too
        Zcall_tipZparent_headerZmsg_idr   ZstatusÚokÚfoundFZ	ArgumentsTz#2D62FF)r   ZcolorN)
Z_get_cursorZ_request_infor   ÚidÚposZpositionr   r   Zshow_calltipr   )r   ZrepZcursorÚinfor   r   r   r   r   Ú_handle_inspect_replys   s    
z HelpWidget._handle_inspect_replyN)F)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r*   r+   r,   r2   r   r   r   r   r
      s   
r
   )r6   Z
__future__r   r   Zqtconsole.ansi_code_processorr   Zqtconsole.rich_jupyter_widgetr   Zqtpy.QtCorer   Zspyder_kernels.utils.dochelpersr   r   Zspyder.config.baser   Zspyder.py3compatr	   r
   r   r   r   r   Ú<module>
   s   