U
    ,dj2                     @   s  d Z ddlZddlZ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 Ze Zd	Zd$d
dZd%ddZG dd deZdd Zdd ZeefZefddZG dd deZG dd deZG dd deZd&ddZdd Zd  Zd!d" Z e!d#kre   dS )'z
This file contains `__main__` so that it can be run as a commandline tool.

This file contains functions to inspect Numba's support for a given Python
module or a Python package.
    N)errors)get_versions)
cpu_target)captured_stdoutc                  C   s0   t  d dd } | s,tjdtjd dS | S )Nfull.r   z>Cannot find git commit hash. Source links could be inaccurate.)categorymain)r   splitwarningswarnr   ZNumbaWarning)r    r   =/tmp/pip-unpacked-wheel-eu7e0c37/numba/misc/help/inspector.py_get_commit   s    r   zLhttps://github.com/numba/numba/blob/{commit}/{path}#L{firstline}-L{lastline}c              	   C   s   |pt }|j}|  |j  i }i }z|| }W n tk
rR   d}d}Y nFX ||}|jD ]2}z| ||< W qd t	k
r   d||< Y qdX qd||d< ||d< ||d< |S )a  Return information about the support of a function.

    Returns
    -------
    info : dict
        Defined keys:
        - "numba_type": str or None
            The numba type object of the function if supported.
        - "explained": str
            A textual description of the support.
        - "source_infos": dict
            A dictionary containing the source location of each definition.
    Nznot supported
numba_type	explainedsource_infos)
r   Ztyping_contextZrefreshZtarget_contextZresolve_value_type
ValueErrorZexplain_function_typeZ	templatesZget_source_infoAttributeError)functiontargetZtyctinfor   Znbtyr   tempr   r   r   inspect_function"   s*    



r   c                 c   s   |dkri n|}t | D ]}|dr(qt| |}tjtjf}t||sJqt| ||d}||krn|| |d< ndj| j	|d||< |
t||d |V  qdS )zwInspect a module object and yielding results from `inspect_function()`
    for each function object in the module.
    N_)modulenameobjaliasz{module}.{name})r   r   )r   )dir
startswithgetattrpytypesFunctionTypeBuiltinFunctionType
isinstancedictformat__name__updater   )r   r   r   r   r   Zsupported_typesr   r   r   r   inspect_moduleM   s     



r*   c                   @   s@   e Zd ZdZdd Zedd Zedd Zdd	 Zd
d Z	dS )_Statz9For gathering simple statistic of (un)supported functionsc                 C   s   d| _ d| _d S Nr   	supportedunsupportedselfr   r   r   __init__j   s    z_Stat.__init__c                 C   s   | j | j }|S Nr-   )r1   totalr   r   r   r4   n   s    z_Stat.totalc                 C   s   | j | j d }|S )Nd   )r.   r4   )r1   ratior   r   r   r6   s   s    z_Stat.ratioc                 C   s$   | j dkrdS dj| j| j | jdS )Nr   emptyz0supported = {supported} / {total} = {ratio:.2f}%)r.   r4   r6   )r4   r'   r.   r6   r0   r   r   r   describex   s    
z_Stat.describec                 C   s   dj | jj|  dS )Nz{clsname}({describe}))Zclsnamer8   )r'   	__class__r(   r8   r0   r   r   r   __repr__   s    z_Stat.__repr__N)
r(   
__module____qualname____doc__r2   propertyr4   r6   r8   r:   r   r   r   r   r+   h   s   

	r+   c                 C   s   t dd | D  S )Nc                 s   s   | ]}| d V  qdS )r   N)r    .0xr   r   r   	<genexpr>   s     z(filter_private_module.<locals>.<genexpr>anyZmodule_componentsr   r   r   filter_private_module   s    rF   c                 C   s   t dd | D  S )Nc                 s   s   | ]}|d kV  qdS )testsNr   r?   r   r   r   rB      s     z&filter_tests_module.<locals>.<genexpr>rC   rE   r   r   r   filter_tests_module   s    rH   c           
      #   s   dd }| j d }tj| j||d} fdd}| j }||sD| V  |D ]}|d }||r^qHt | zt|}W n" tk
r   Y W 5 Q R  qHY nX |ddd D ]2}	zt||	}W q t	k
r   d}Y  qY qX qW 5 Q R X t
|tjsqH|V  qHdS )	zSYield all modules in a given package.

    Recursively walks the package tree.
    c                 S   s   d S r3   r   )r   r   r   r   <lambda>       z)list_modules_in_package.<locals>.<lambda>r   )onerrorc                    s    |  d t fddD S )Nr   c                 3   s   | ]}|  V  qd S r3   r   )r@   Z	filter_fnrE   r   r   rB      s   z@list_modules_in_package.<locals>.check_filter.<locals>.<genexpr>)r
   rD   )modnamemodule_filtersrE   r   check_filter   s    
z-list_modules_in_package.<locals>.check_filter   N)r(   pkgutilwalk_packages__path__r   
__import__	Exceptionr
   r!   r   r%   r"   
ModuleType)
packagerN   Zonerror_ignoreprefixZpackage_walkerrO   rL   Zpkginfomodpartr   rM   r   list_modules_in_package   s:    
r[   c                   @   s    e Zd ZdZdd Zdd ZdS )	FormatterzBase class for formatters.
    c                 C   s
   || _ d S r3   )_fileobj)r1   fileobjr   r   r   r2      s    zFormatter.__init__c                 O   s   | d| j t|| d S )Nfile)
setdefaultr]   print)r1   argskwargsr   r   r   ra      s    zFormatter.printN)r(   r;   r<   r=   r2   ra   r   r   r   r   r\      s   r\   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )HTMLFormatterz Formatter that outputs HTML
    c                 C   s   dd l }||S r,   )htmlescape)r1   textre   r   r   r   rf      s    zHTMLFormatter.escapec                 C   s   |  d|d d S )Nz<h1></h2>ra   r1   rg   r   r   r   title   s    zHTMLFormatter.titlec                 C   s   |  d|d |  d d S )Nz<h2>rh   <ul>ri   r1   rL   r   r   r   begin_module_section   s    z"HTMLFormatter.begin_module_sectionc                 C   s   |  d d S )N</ul>ri   r0   r   r   r   end_module_section   s    z HTMLFormatter.end_module_sectionc                 C   s  |  d |  d|| |  d| |  d|d |  d | D ]\}}|r|  d |d }	|d }
|d	 }|d
 }|  d| |	| |
| ||d |d  |  d| |d pd n|  d| t| |  d qL|  d |  d d S )N<li>z{}.<b>{}</b>z: <b>{}</b>z
<div><pre>z</pre></div>rl   r   sigfilenamelinesz)<p>defined by <b>{}</b>{} at {}:{}-{}</p>r   rP   	<p>{}</p>Z	docstring z<li>{}</li>ro   )ra   r'   itemsrf   str)r1   rL   itemnametypenamer   sourcesr   tclssourceimplrr   rs   rt   r   r   r   write_supported_item   s>    


   
z"HTMLFormatter.write_supported_itemc                 C   s*   |  d |  d|| |  d d S )Nrq   z{}.<b>{}</b>: UNSUPPORTEDrw   )ra   r'   r1   rL   rz   r   r   r   write_unsupported_item  s    
z$HTMLFormatter.write_unsupported_itemc                 C   s   |  d|  d S )Nru   )ra   r'   r8   )r1   statsr   r   r   write_statistic  s    zHTMLFormatter.write_statisticNr(   r;   r<   r=   rf   rk   rn   rp   r   r   r   r   r   r   r   rd      s   !rd   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )ReSTFormatterzDFormatter that output ReSTructured text format for Sphinx docs.
    c                 C   s   |S r3   r   rj   r   r   r   rf     s    zReSTFormatter.escapec                 C   s(   |  | |  dt|  |    d S )N=ra   lenrj   r   r   r   rk     s    
zReSTFormatter.titlec                 C   s(   |  | |  dt|  |    d S )N-r   rm   r   r   r   rn     s    
z"ReSTFormatter.begin_module_sectionc                 C   s   |    d S r3   ri   r0   r   r   r   rp   $  s    z ReSTFormatter.end_module_sectionc                 C   s   |  d|| |  d |    |r8|  d| |    | D ]~\}}|r|d }	|d }
|d }|d }tjt||d |d	 d
}|  d|	|
||d |d	 | qH|  dt| qH|    d S )Nz.. function:: {}.{}z   :noindex:z   Alias to: ``{}``r   rr   rs   rt   r   rP   )commitpath	firstlinelastlinez,   - defined by ``{}{}`` at `{}:{}-{} <{}>`_z   - defined by ``{}``)ra   r'   rx   
github_urlr   ry   )r1   rL   rz   r{   r   r|   r   r}   r~   r   rr   rs   rt   Zsource_linkr   r   r   r   '  s<    
     z"ReSTFormatter.write_supported_itemc                 C   s   d S r3   r   r   r   r   r   r   G  s    z$ReSTFormatter.write_unsupported_itemc                 C   sN   |j dkr| d n,d}| ||j |   | |  |   d S )Nr   zThis module is not supported.z%Not showing {} unsupported functions.)r.   ra   r'   r/   r8   )r1   statmsgr   r   r   r   J  s    
zReSTFormatter.write_statisticNr   r   r   r   r   r     s    r   c           
      C   s   |  d| i }|D ]}t }|j}| | | t|||dD ]}|d }	|	dk	r| jd7  _| j| |d j| |d | t	|	| |d |d	 |
d
d qF| jd7  _| j| |d j| |d d qF| | |   qdS )zFormat modules.
    zListings for {})r   r   r   NrP   r   r   r   r   r   )rL   rz   r{   r   r|   r   )rL   rz   )rk   r'   r+   r(   rn   rf   r*   r.   r   ry   getr/   r   r   rp   )
	formatterpackage_nameZmod_sequencer   Z	alias_maprY   r   rL   r   Znbtyper   r   r   _format_module_infosU  s2    

r   c              	   C   s   t | }t|drt|}n|g}|dkr\t|d d}t|d}t|| | W 5 Q R X nH|dkrt|d d}t|d}t|| | W 5 Q R X ntd|d	S )
a  Write listing information into a file.

    Parameters
    ----------
    package_name : str
        Name of the package to inspect.
    filename : str
        Output filename. Always overwrite.
    output_format : str
        Support formats are "html" and "rst".
    rS   re   z.htmlw)r^   Zrstz.rstz#Output format '{}' is not supportedN)	rT   hasattrr[   openrd   r   r   r   r'   )r   rs   output_formatrW   ZmodsZfoutZfmtrr   r   r   write_listingsv  s    



r   z6
Inspect Numba support for a given top-level package.
c                  C   sl   t jtd} | jddtdd | jddddd	 | jd
dddd	 |  }|j}|j}|j}t	||| d S )N)descriptionrW   zPackage to inspect)metavartypehelpz--formatr'   re   z!Output format; i.e. "html", "rst")destdefaultr   z--filer_   Zinspector_outputz8Output filename. Defaults to "inspector_output.<format>")
argparseArgumentParserprogram_descriptionadd_argumentry   
parse_argsrW   r'   r_   r   )parserrb   r   r   rs   r   r   r   r	     s0          r	   __main__)N)NN)N)"r=   r   rQ   r   typesr"   Z
numba.corer   Znumba._versionr   Znumba.core.registryr   Znumba.tests.supportr   r   r   r   r   r*   objectr+   rF   rH   Z_default_module_filtersr[   r\   rd   r   r   r   stripr   r	   r(   r   r   r   r   <module>   s:   
+
 4?A
!
