o
    ZZhF                  
   @  st  U d Z ddlmZ ddlmZmZmZ ddlZerddl	m
Z
 z1ddlZddlmZ ddlmZmZ ddlmZmZmZ dd	lmZ eegef ZdZd
ed< W n eyd Z zeZW Y dZ[ndZ[ww g Zded< d5ddZd6ddZd7ddZe Z ded< e Z!ded< e Z"ded< d8ddZ#esedu rd9d$d%Z$d:d,d-Z%G d.d/ d/eZ&d;d2d3Z'dS d;d4d3Z'dS )<a  A mypy_ plugin for managing a number of platform-specific annotations.
Its functionality can be split into three distinct parts:

* Assigning the (platform-dependent) precisions of certain `~numpy.number`
  subclasses, including the likes of `~numpy.int_`, `~numpy.intp` and
  `~numpy.longlong`. See the documentation on
  :ref:`scalar types <arrays.scalars.built-in>` for a comprehensive overview
  of the affected classes. Without the plugin the precision of all relevant
  classes will be inferred as `~typing.Any`.
* Removing all extended-precision `~numpy.number` subclasses that are
  unavailable for the platform in question. Most notably this includes the
  likes of `~numpy.float128` and `~numpy.complex256`. Without the plugin *all*
  extended-precision types will, as far as mypy is concerned, be available
  to all platforms.
* Assigning the (platform-dependent) precision of `~numpy.ctypeslib.c_intp`.
  Without the plugin the type will default to `ctypes.c_int64`.

  .. versionadded:: 1.22

Examples
--------
To enable the plugin, one must add it to their mypy `configuration file`_:

.. code-block:: ini

    [mypy]
    plugins = numpy.typing.mypy_plugin

.. _mypy: https://mypy-lang.org/
.. _configuration file: https://mypy.readthedocs.io/en/stable/config_file.html

    )annotations)FinalTYPE_CHECKINGCallableN)Iterable)Type)PluginAnalyzeTypeContext)MypyFile
ImportFrom	Statement)PRI_MEDzNone | ModuleNotFoundErrorMYPY_EX	list[str]__all__returndict[str, str]c                  C  s   dt jfdt jfdt jfdt jfdt jfdt jfdt jfdt jfd	t j	fd
t j
fdt jfg} i }d}| D ]\}}d| jj }| d| d|| d| < q4|S )NZ	_NBitByteZ
_NBitShortZ	_NBitIntCZ	_NBitIntPZ_NBitIntZ	_NBitLongZ_NBitLongLongZ	_NBitHalfZ_NBitSingleZ_NBitDoubleZ_NBitLongDoubleznumpy._typing   z._nbit_base._ZBitz._nbit.)npbyteZshortZintcZintpint_longZlonglongZhalfsingledoubleZ
longdoubledtypeitemsize)namesretmodulenametypn r"   G/var/www/auris/lib/python3.10/site-packages/numpy/typing/mypy_plugin.py_get_precision_dict:   s$    r$   c                  C  s   g d} dd | D S )N)Zuint128Zuint256Zint128Zint256Zfloat80Zfloat96Zfloat128Zfloat256Z
complex160Z
complex192Z
complex256Z
complex512c                 S  s   g | ]	}t t|r|qS r"   )hasattrr   ).0ir"   r"   r#   
<listcomp>`   s    z0_get_extended_precision_list.<locals>.<listcomp>r"   )Zextended_namesr"   r"   r#   _get_extended_precision_listQ   s   r)   strc                  C  s4   t dj} | dkrdS | dkrdS | dkrdS dS )Nr!   r'   c_intlZc_longqZ
c_longlong)r   r   char)r.   r"   r"   r#   _get_c_intp_nameb   s   r/   r   _PRECISION_DICT_EXTENDED_PRECISION_LIST_C_INTPctxr	   r   c                 C  s2   | \}}}|j dd }td|  }||S )z;Replace a type-alias with a concrete ``NBitBase`` subclass..znumpy._typing._nbit.)r   splitr0   Z
named_type)r3   r    _apir   Zname_newr"   r"   r#   _hookz   s   

r9   iterableIterable[Statement]idintc                 C  s8   t | D ]\}}t|dd|kr|  S qtd|)z>Identify the first ``ImportFrom`` instance the specified `id`.r<   NzBFailed to identify a `ImportFrom` instance with the following id: )	enumerategetattr
ValueError)r:   r<   r'   valuer"   r"   r#   _index   s   rB   filer
   r   importslist[tuple[str, None | str]]Nonec                 C  s<   t |d|d}d|_| j| jfD ]}t||}|||< qdS )z<Override the first `module`-based import with new `imports`.r   )r   TN)r   Zis_top_levelZdefsrD   rB   )rC   r   rD   Z
import_objlstr'   r"   r"   r#   _override_imports   s   

rH   c                   @  s$   e Zd ZdZdddZdddZdS )_NumpyPluginz>A mypy plugin for handling versus numpy-specific typing tasks.fullnamer*   r   None | _HookFuncc                 C  s   |t v rtS dS )zSet the precision of platform-specific `numpy.number`
            subclasses.

            For example: `numpy.int_`, `numpy.longlong` and `numpy.longdouble`.
            N)r0   r9   )selfrJ   r"   r"   r#   get_type_analyze_hook   s   z"_NumpyPlugin.get_type_analyze_hookrC   r
   list[tuple[int, str, int]]c                 C  sV   t |jdfg}|jdkrt|ddd tD d |S |jdkr)t|dtd	fgd |S )
a.  Handle all import-based overrides.

            * Import platform-specific extended-precision `numpy.number`
              subclasses (*e.g.* `numpy.float96`, `numpy.float128` and
              `numpy.complex256`).
            * Import the appropriate `ctypes` equivalent to `numpy.intp`.

            r5   numpyz!numpy._typing._extended_precisionc                 S  s   g | ]}||fqS r"   r"   )r&   vr"   r"   r#   r(      s    z4_NumpyPlugin.get_additional_deps.<locals>.<listcomp>)rD   znumpy.ctypeslibctypesZ_c_intp)r   rJ   rH   r1   r2   )rL   rC   r   r"   r"   r#   get_additional_deps   s   
	
z _NumpyPlugin.get_additional_depsN)rJ   r*   r   rK   )rC   r
   r   rN   )__name__
__module____qualname____doc__rM   rR   r"   r"   r"   r#   rI      s    

rI   versiontype[_NumpyPlugin]c                 C  s   t S zAn entry-point for mypy.)rI   rW   r"   r"   r#   plugin      r[   c                 C  s   t rY   )r   rZ   r"   r"   r#   r[      r\   )r   r   )r   r   )r   r*   )r3   r	   r   r   )r:   r;   r<   r*   r   r=   )rC   r
   r   r*   rD   rE   r   rF   )rW   r*   r   rX   )(rV   
__future__r   typingr   r   r   rO   r   collections.abcr   Z
mypy.typesZmypyr   Zmypy.pluginr   r	   Z
mypy.nodesr
   r   r   Z
mypy.buildr   Z	_HookFuncr   __annotations__ModuleNotFoundErrorexr   r$   r)   r/   r0   r1   r2   r9   rB   rH   rI   r[   r"   r"   r"   r#   <module>   s@    !





&