U
    -e                     @   s    d Z dd Zdd ZdeiZdS )a   
Handlers for IPythonDirective's @doctest pseudo-decorator.

The Sphinx extension that provides support for embedded IPython code provides
a pseudo-decorator @doctest, which treats the input/output block as a
doctest, raising a RuntimeError during doc generation if the actual output
(after running the input) does not match the expected output.

An example usage is:

.. code-block:: rst

   .. ipython::

        In [1]: x = 1

        @doctest
        In [2]: x + 2
        Out[3]: 3

One can also provide arguments to the decorator. The first argument should be
the name of a custom handler. The specification of any other arguments is
determined by the handler. For example,

.. code-block:: rst

      .. ipython::

         @doctest float
         In [154]: 0.1 + 0.2
         Out[154]: 0.3

allows the actual output ``0.30000000000000004`` to match the expected output
due to a comparison with `np.allclose`.

This module contains handlers for the @doctest pseudo-decorator. Handlers
should have the following function signature::

    handler(sphinx_shell, args, input_lines, found, submitted)

where `sphinx_shell` is the embedded Sphinx shell, `args` contains the list
of arguments that follow: '@doctest handler_name', `input_lines` contains
a list of the lines relevant to the current doctest, `found` is a string
containing the output from the IPython shell, and `submitted` is a string
containing the expected output from the IPython shell.

Handlers must be registered in the `doctests` dict at the end of this module.

c                 C   s^   ddl }ddl m}m} | dr.| dd } | drL|jt| td}n|t| }|S )	aI  
    Simplistic converter of strings from repr to float NumPy arrays.

    If the repr representation has ellipsis in it, then this will fail.

    Parameters
    ----------
    s : str
        The repr version of a NumPy array.

    Examples
    --------
    >>> s = "array([ 0.3,  inf,  nan])"
    >>> a = str_to_array(s)

        N)infnanarray   [)Zdtype)numpyr   r   
startswithr   evalfloatZ
atleast_1d)snpr   r   a r   b/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/IPython/sphinxext/custom_doctests.pystr_to_array3   s    

r   c              
      sX  ddl }t|dkrd}d}nTzt|d }t|d }W n6 tk
rp } zd|}t||W 5 d}~X Y nX zt|}t|}W n   d}	Y nHX ||}
||}||
| }	|	|j||
  ||  ||d	 O }	d
 | j}|dkrd}d}n$|j	j
j}d fdd|jD }|	rTd}|j||d|t|t| d}t|dS )z
    Doctest which allow the submitted output to vary slightly from the input.

    Here is how it might appear in an rst file:

    .. code-block:: rst

       .. ipython::

          @doctest float
          In [1]: 0.1 + 0.2
          Out[1]: 0.3

    r   N   gh㈵>g:0yE>   zEBoth `rtol` and `atol` must be specified if either are specified: {0}T)rtolatolz    ZUnavailable
c                    s   g | ]} | qS r   r   ).0lineZTABr   r   
<listcomp>   s     z!float_doctest.<locals>.<listcomp>zdoctest float comparison failure

Document source: {0}

Raw content: 
{1}

On input line(s):
{TAB}{2}

we found output:
{TAB}{3}

instead of the expected:
{TAB}{4}

r   )r   lenr   
IndexErrorformatr   isnanZallclose	directivestateZdocumentZcurrent_sourcejoincontentreprRuntimeError)Zsphinx_shellargsZinput_linesfoundZ	submittedr   r   r   eerrorZfound_isnanZsubmitted_isnanr   sourcer"   r   r   r   float_doctestU   sN    


 

 r*   r   N)__doc__r   r*   Zdoctestsr   r   r   r   <module>   s
   2"E 