U
    hâËdg2  ã                   @   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   s&   t ƒ d } | s"tjdtjd� dS | S )Nzfull-revisionidz>Cannot find git commit hash. Source links could be inaccurate.)ÚcategoryÚmain)r   ÚwarningsÚwarnr   ZNumbaWarning)Úfull© r   úR/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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_contextÚ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,   )r0   Útotalr   r   r   r3   n   s    z_Stat.totalc                 C   s   | j | j d }|S )Néd   )r-   r3   )r0   Úratior   r   r   r5   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-   r3   r5   )r3   r&   r-   r5   r/   r   r   r   Údescribex   s    
ýz_Stat.describec                 C   s   dj | jj|  ¡ d�S )Nz{clsname}({describe}))Úclsnamer7   )r&   Ú	__class__r'   r7   r/   r   r   r   Ú__repr__�   s    þz_Stat.__repr__N)
r'   Ú
__module__Ú__qualname__Ú__doc__r1   Úpropertyr3   r5   r7   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  qÜY q¨X q¨W 5 Q R X t
|tjƒsôqH|V  qHdS )	zSYield all modules in a given package.

    Recursively walks the package tree.
    c                 S   s   d S r2   r   )r   r   r   r   Ú<lambda>›   ó    z)list_modules_in_package.<locals>.<lambda>Ú.)Úonerrorc                    s    |   d¡‰ t‡ fdd„ˆD ƒƒS )NrK   c                 3   s   | ]}|ˆ ƒ V  qd S r2   r   )r@   Z	filter_fnrE   r   r   rB   ¦   s   ÿz@list_modules_in_package.<locals>.check_filter.<locals>.<genexpr>)ÚsplitrD   )Úmodname©Úmodule_filtersrE   r   Úcheck_filter¤   s    
ÿz-list_modules_in_package.<locals>.check_filteré   N)r'   ÚpkgutilÚwalk_packagesÚ__path__r   Ú
__import__Ú	ExceptionrM   r    r   r$   r!   Ú
ModuleType)
ÚpackagerP   Zonerror_ignoreÚprefixZpackage_walkerrQ   rN   ZpkginfoÚmodÚpartr   rO   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 r2   )Ú_fileobj)r0   Úfileobjr   r   r   r1   Í   s    zFormatter.__init__c                 O   s   |  d| j¡ t||Ž d S )NÚfile)Ú
setdefaultr_   Úprint)r0   ÚargsÚkwargsr   r   r   rc   Ð   s    zFormatter.printN)r'   r;   r<   r=   r1   rc   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)r0   Útextrg   r   r   r   rh   Ù   s    zHTMLFormatter.escapec                 C   s   |   d|d¡ d S )Nz<h1>ú</h2>©rc   ©r0   ri   r   r   r   ÚtitleÝ   s    zHTMLFormatter.titlec                 C   s   |   d|d¡ |   d¡ d S )Nz<h2>rj   ú<ul>rk   ©r0   rN   r   r   r   Úbegin_module_sectionà   s    z"HTMLFormatter.begin_module_sectionc                 C   s   |   d¡ d S )Nú</ul>rk   r/   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 pÊd¡¡¡ n|   d |  t|ƒ¡¡¡ |   d¡ qL|   d¡ |   d¡ d S )Nú<li>z{}.<b>{}</b>z: <b>{}</b>z
<div><pre>z</pre></div>rn   r   ÚsigÚfilenameÚlinesz)<p>defined by <b>{}</b>{} at {}:{}-{}</p>r   rR   ú	<p>{}</p>Z	docstringÚ z<li>{}ú</li>rq   )rc   r&   Úitemsrh   Ústr)r0   rN   ÚitemnameÚtypenamer   Úsourcesr   ÚtclsÚsourceÚimplrt   ru   rv   r   r   r   Úwrite_supported_itemç   s>    
þ

   þÿÿ
z"HTMLFormatter.write_supported_itemc                 C   s*   |   d¡ |   d ||¡¡ |   d¡ d S )Nrs   z{}.<b>{}</b>: UNSUPPORTEDry   )rc   r&   ©r0   rN   r|   r   r   r   Úwrite_unsupported_item  s    
þz$HTMLFormatter.write_unsupported_itemc                 C   s   |   d | ¡ ¡¡ d S )Nrw   )rc   r&   r7   )r0   Ústatsr   r   r   Úwrite_statistic  s    zHTMLFormatter.write_statisticN©r'   r;   r<   r=   rh   rm   rp   rr   r‚   r„   r†   r   r   r   r   rf   Õ   s   !rf   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 r2   r   rl   r   r   r   rh     s    zReSTFormatter.escapec                 C   s(   |   |¡ |   dt|ƒ ¡ |   ¡  d S )Nú=©rc   Úlenrl   r   r   r   rm     s    
zReSTFormatter.titlec                 C   s(   |   |¡ |   dt|ƒ ¡ |   ¡  d S )Nú-rŠ   ro   r   r   r   rp     s    
z"ReSTFormatter.begin_module_sectionc                 C   s   |   ¡  d S r2   rk   r/   r   r   r   rr   $  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   rt   ru   rv   r   rR   )ÚcommitÚpathÚ	firstlineÚlastlinez,   - defined by ``{}{}`` at `{}:{}-{} <{}>`_z   - defined by ``{}``)rc   r&   rz   Ú
github_urlr�   r{   )r0   rN   r|   r}   r   r~   r   r   r€   r�   rt   ru   rv   Úsource_linkr   r   r   r‚   '  s<    
ü     ÿÿz"ReSTFormatter.write_supported_itemc                 C   s   d S r2   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-   rc   r&   r.   r7   )r0   Ú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   NrR   r   r   r   r   r   )rN   r|   r}   r   r~   r   )rN   r|   )rm   r&   r*   r'   rp   rh   r)   r-   r‚   r{   Úgetr.   r„   r†   rr   )
Ú	formatterÚpackage_nameZmod_sequencer   Z	alias_mapr[   r“   rN   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r–t|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".
    rU   rg   z.htmlÚw)r`   Úrstz.rstz#Output format '{}' is not supportedN)	rV   Úhasattrr]   Úopenrf   r˜   rˆ   r   r&   )r—   ru   Úoutput_formatrY   Ú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)ÚdescriptionrY   zPackage to inspect)ÚmetavarÚtypeÚhelpz--formatr&   rg   z!Output format; i.e. "html", "rst")ÚdestÚdefaultr£   z--filera   Zinspector_outputz8Output filename. Defaults to "inspector_output.<format>")
ÚargparseÚArgumentParserÚprogram_descriptionÚadd_argumentr{   Ú
parse_argsrY   r&   ra   rŸ   )Úparserrd   r—   r�   ru   r   r   r   r   š  s0      þ  þ  þr   Ú__main__)N)NN)N)"r=   r¦   rS   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^   rf   rˆ   r˜   rŸ   Ústripr¨   r   r'   r   r   r   r   Ú<module>   s:   
+
 þ4?A
!
