U
    \Sh                     @  s:  d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZmZmZmZ ddlmZ dd	lmZmZ eeZG d
d dZeddfdddddddddZG dd deZG dd deZG dd deZej dddddZ!dddd d!Z"dddd"d#Z#dddd$d%Z$dS )&zmock for autodoc    )annotationsN)LoaderMetaPathFinder)
ModuleSpec)
MethodType
ModuleType)Any	GeneratorIteratorSequence)logging)isboundmethodsafe_getattrc                      s   e Zd ZU dZd ZdZ dZdZded< dddd fd	d
ZddddddZ	ddddZ
dddddZddddZdddddZdd dddZdd dd d!Zddddd"d#Zddd$d%Z  ZS )&_MockObjectUsed by autodoc_mock_imports. T ztuple[Any, ...]__sphinx_decorator_args__r   )argskwargsreturnc                   sV   t |dkrJt|d trJ|d d j}|| krJt|d |j||d dS t | S )N      r      )
superclass
attributes)len
isinstancetuple	__class___make_subclass__display_name__super__new__)clsr   r   r   r    r   J/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/ext/autodoc/mock.pyr$      s     z_MockObject.__new__Nonec                 O  s   | j | _d S N)__name____qualname__)selfr   r   r   r   r'   __init__%   s    z_MockObject.__init__intr   c                 C  s   dS )Nr   r   r,   r   r   r'   __len__(   s    z_MockObject.__len__strbool)keyr   c                 C  s   dS )NFr   r,   r4   r   r   r'   __contains__+   s    z_MockObject.__contains__r
   c                 C  s   t g S r)   )iterr0   r   r   r'   __iter__.   s    z_MockObject.__iter__r   )basesr   c                 C  s   | j fS r)   r&   )r,   r9   r   r   r'   __mro_entries__1   s    z_MockObject.__mro_entries__c                 C  s   t t|| j| j S r)   )r!   r2   r"   r    r5   r   r   r'   __getitem__4   s    z_MockObject.__getitem__c                 C  s   t || j| j S r)   )r!   r"   r    r5   r   r   r'   __getattr__7   s    z_MockObject.__getattr__c                 O  s   |   }||_|S r)   )r    r   )r,   r   r   callr   r   r'   __call__:   s    z_MockObject.__call__c                 C  s   | j S r)   )r"   r0   r   r   r'   __repr__?   s    z_MockObject.__repr__)r*   
__module__r+   __doc__r"   __sphinx_mock__r   __annotations__r$   r-   r1   r6   r8   r:   r;   r<   r>   r?   __classcell__r   r   r&   r'   r      s   

r   r   r2   r   r   )namemoduler   r   decorator_argsr   c                 C  s2   ||d |  | |d}| |p i  t| |f|S )N.)r@   r"   r*   r   )updatetype)rE   rF   r   r   rG   attrsr   r   r'   r!   C   s    
r!   c                      sP   e Zd ZdZejZdZddd fddZdddd	d
Z	ddddZ
  ZS )_MockModuler   Tr2   r(   )rE   r   c                   s   t  | g | _g | _d S r)   )r#   r-   __all____path__r,   rE   r&   r   r'   r-   S   s    z_MockModule.__init__r   c                 C  s   t || j S r)   )r!   r*   rO   r   r   r'   r<   X   s    z_MockModule.__getattr__r/   c                 C  s   | j S r)   )r*   r0   r   r   r'   r?   [   s    z_MockModule.__repr__)r*   r@   r+   rA   osdevnull__file__rB   r-   r<   r?   rD   r   r   r&   r'   rL   N   s   rL   c                      sH   e Zd ZdZddd fddZddd	d
dZdddddZ  ZS )
MockLoaderzA loader for mocking.
MockFinderr(   )finderr   c                   s   t    || _d S r)   )r#   r-   rU   )r,   rU   r&   r   r'   r-   a   s    
zMockLoader.__init__r   r   )specr   c                 C  s(   t d|j | jj|j t|jS )Nz%[autodoc] adding a mock module as %s!)loggerdebugrE   rU   mocked_modulesappendrL   )r,   rV   r   r   r'   create_modulee   s    zMockLoader.create_module)rF   r   c                 C  s   d S r)   r   )r,   rF   r   r   r'   exec_modulej   s    zMockLoader.exec_module)r*   r@   r+   rA   r-   r[   r\   rD   r   r   r&   r'   rS   _   s   rS   c                      sL   e Zd ZdZddd fddZddd	d
ddddZddddZ  ZS )rT   zA finder for mocking.	list[str]r(   modnamesr   c                   s$   t    || _t| | _g | _d S r)   )r#   r-   r_   rS   loaderrY   )r,   r_   r&   r   r'   r-   q   s    

zMockFinder.__init__Nr2   zSequence[bytes | str] | NonezModuleType | NonezModuleSpec | None)fullnamepathtargetr   c                 C  s6   | j D ]*}||ks ||d rt|| j  S qd S )NrH   )r_   
startswithr   r`   )r,   ra   rb   rc   modnamer   r   r'   	find_specw   s    
zMockFinder.find_specr/   c                 C  s   | j D ]}tj|d qdS )z)Invalidate mocked modules on sys.modules.N)rY   sysmodulespop)r,   re   r   r   r'   invalidate_caches   s    
zMockFinder.invalidate_caches)N)r*   r@   r+   rA   r-   rf   rj   rD   r   r   r&   r'   rT   n   s
    	rT   r]   zGenerator[(None, None, None)]r^   c              	   c  s<   z t| }t jd| dV  W 5 t j| |  X dS )zInsert mock modules during context::

        with mock(['target.module.name']):
            # mock modules are enabled here
            ...
    r   N)rg   	meta_pathremoverj   rT   insert)r_   rU   r   r   r'   mock   s    
rn   r3   )subjectr   c                 C  s
   t | tS )z'Check if the object is a mocked module.)r   rL   ro   r   r   r'   ismockmodule   s    rq   c                 C  s   zt | dddkrW dS W n tk
r0   Y dS X t| tr@dS t| trZt| rZ| j}n| }z2t t|dg }t|dkr|d t	krW dS W n tk
r   Y nX dS )zCheck if the object is mocked.rB   NFT__mro__r   )
r   AttributeErrorr   rL   r   r   __func__rJ   r   r   )ro   Ztmp_subjectrr   r   r   r'   ismock   s"    


rv   c                 C  s    t | r| jr| jd S | S dS )zsUnwrap mock if *subject* is decorated by mocked object.

    If not decorated, returns given *subject* itself.
    r   N)rv   r   rp   r   r   r'   
undecorate   s    
rw   )%rA   
__future__r   
contextlibrP   rg   importlib.abcr   r   Zimportlib.machineryr   typesr   r   typingr   r	   r
   r   Zsphinx.utilr   Zsphinx.util.inspectr   r   	getLoggerr*   rW   r   r!   rL   rS   rT   contextmanagerrn   rq   rv   rw   r   r   r   r'   <module>   s0   
0 