a
    ñ»jÃ:  ã                   @   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lmZ g d¢Ze e¡Zeed	ƒs†d
d„ e_G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZdd„ ZG dd„ deƒZG dd„ deƒZzG dd„ deeƒZW n$ e�y&   G dd„ deƒZY n0 G dd„ deƒZ dS )a  
Plugin Manager
--------------
A plugin manager class is used to load plugins, manage the list of
loaded plugins, and proxy calls to those plugins.
The plugin managers provided with nose are:
:class:`PluginManager`
    This manager doesn't implement loadPlugins, so it can only work
    with a static list of plugins.
:class:`BuiltinPluginManager`
    This manager loads plugins referenced in ``nose.plugins.builtin``.
:class:`EntryPointPluginManager`
    This manager uses setuptools entrypoints to load plugins.
:class:`ExtraPluginsPluginManager`
    This manager loads extra plugins specified with the keyword
    `addplugins`.
:class:`DefaultPluginMananger`
    This is the manager class that will be used by default. If
    setuptools is installed, it is a subclass of
    :class:`EntryPointPluginManager` and :class:`BuiltinPluginManager`;
    otherwise, an alias to :class:`BuiltinPluginManager`.
:class:`RestrictedPluginManager`
    This manager is for use in test runs where some plugin calls are
    not available, such as runs started with ``python setup.py test``,
    where the test runner is the default unittest :class:`TextTestRunner`. It
    is a subclass of :class:`DefaultPluginManager`.

Writing a plugin manager
========================
If you want to load plugins via some other means, you can write a
plugin manager and pass an instance of your plugin manager class when
instantiating the :class:`nose.config.Config` instance that you pass to
:class:`TestProgram` (or :func:`main` or :func:`run`).
To implement your plugin loading scheme, implement ``loadPlugins()``,
and in that method, call ``addPlugin()`` with an instance of each plugin
you wish to make available. Make sure to call
``super(self).loadPlugins()`` as well if have subclassed a manager
other than ``PluginManager``.é    N)Úchain)Úwarn)ÚFailure)ÚIPluginInterface)Ú	sort_list)ÚDefaultPluginManagerÚPluginManagerÚEntryPointPluginManagerÚBuiltinPluginManagerÚRestrictedPluginManagerÚ
getargspecc                 C   s   t  | ¡d d… S )Né   )ÚinspectÚgetfullargspec)Úfunc© r   ú:E:\soccer\ml_env\Lib\site-packages\nose/plugins/manager.pyÚ<lambda>5   ó    r   c                   @   sV   e Zd ZdZeZdd„ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zddd„ZdS )ÚPluginProxya  Proxy for plugin calls. Essentially a closure bound to the
    given call and plugin list.
    The plugin proxy also must be bound to a particular plugin
    interface specification, so that it knows what calls are available
    and any special handling that is required for each call.c                 C   sf   zt | j|ƒ| _W n& ty8   td|| jjf ƒ‚Y n0 |  |¡| _g | _|D ]}|  ||¡ qPd S )Nz%s is not a valid %s method)	ÚgetattrÚ	interfaceÚmethodÚAttributeErrorÚ__name__ÚmakeCallÚcallÚpluginsÚ	addPlugin)Úselfr   r   Úpr   r   r   Ú__init__@   s    
ÿzPluginProxy.__init__c                 O   s   | j |i |¤ŽS ©N)r   )r   ÚargÚkwr   r   r   Ú__call__K   s    zPluginProxy.__call__c                    sV   t ||d ƒ}|d urR|dkrBtt |¡d ƒdkrB|‰ ‡ fdd„}| j ||f¡ d S )NZloadTestsFromModuler   é   c                    s   ˆ | ƒS r"   r   )ÚmoduleÚpathÚkwargs©Z	orig_methr   r   r   V   r   z'PluginProxy.addPlugin.<locals>.<lambda>)r   Úlenr   r   r   Úappend)r   Úpluginr   Úmethr   r*   r   r   N   s    ÿþzPluginProxy.addPluginc                    sH   |dkrˆ j S ˆ j}t|ddƒr,‡ fdd„S t|ddƒr>ˆ jS ˆ jS d S )NZloadTestsFromNamesÚ
generativeFc                     s   t ˆ j| i |¤ŽƒS r"   )ÚlistÚgenerate)r#   r$   ©r   r   r   r   `   r   z&PluginProxy.makeCall.<locals>.<lambda>Z	chainable)Ú_loadTestsFromNamesr   r   r   Úsimple)r   r   r.   r   r2   r   r   Y   s    zPluginProxy.makeCallc                 O   sZ   d}dd„ t t| jdg ƒ|ƒD ƒ}| jD ],\}}||i |¤Ž}|dd… }| |¡ q(|S )z‹Call plugins in a chain, where the result of each plugin call is
        sent to next plugin as input. The final output result is returned.Nc                 S   s   g | ]\}}|r|‘qS r   r   )Ú.0ÚstaticÚar   r   r   Ú
<listcomp>l   s   þz%PluginProxy.chain.<locals>.<listcomp>Zstatic_args)Úzipr   r   r   r,   )r   r#   r$   Úresultr6   r    r.   r   r   r   r   f   s    ÿzPluginProxy.chainc              
   o   s|   | j D ]p\}}d}z$||i |¤Ž}|dur4|E dH  W q ttfyN   ‚ Y q tyt   t ¡ }t|Ž V  Y qY q0 qdS )z=Call all plugins, yielding each item in each non-None result.N)r   ÚKeyboardInterruptÚ
SystemExitÚ	ExceptionÚsysÚexc_infor   )r   r#   r$   r    r.   r:   Úexcr   r   r   r1   u   s    
zPluginProxy.generatec                 O   s2   | j D ]&\}}||i |¤Ž}|dur|  S qdS )z6Call all plugins, returning the first non-None result.N)r   )r   r#   r$   r    r.   r:   r   r   r   r4   „   s
    
zPluginProxy.simpleNc                 C   sF   g }| j D ]2\}}|||d�}|dur
|\}}|r
| |¡ q
||fS )a  Chainable but not quite normal. Plugins return a tuple of
        (tests, names) after processing the names. The tests are added
        to a suite that is accumulated throughout the full call, while
        names are input for the next plugin in the chain.)r'   N)r   Úextend)r   Únamesr'   Zsuiter    r.   r:   Z
suite_partr   r   r   r3   Œ   s    zPluginProxy._loadTestsFromNames)N)r   Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r%   r   r   r   r1   r4   r3   r   r   r   r   r   8   s   r   c                   @   sd   e Zd ZdZeZdd„ Zdd„ Zd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 )Ú	NoPluginsz(Null Plugin manager that has no plugins.c                 C   s   d | _ | _d S ©Nr   )Ú_pluginsr   r2   r   r   r   r!   Ÿ   s    zNoPlugins.__init__c                 C   s   dS rG   r   r2   r   r   r   Ú__iter__¢   s    zNoPlugins.__iter__c                 O   s   d S r"   r   ©r   ÚargsÚkwdsr   r   r   Ú
_doNothing¥   s    zNoPlugins._doNothingc                 O   s   dS rG   r   rJ   r   r   r   Ú_emptyIterator¨   s    zNoPlugins._emptyIteratorc                 C   s(   t | j|ƒ}t |ddƒr| jS | jS d S )Nr/   F)r   r   rN   rM   )r   r   r   r   r   r   Ú__getattr__«   s    zNoPlugins.__getattr__c                 C   s
   t ƒ ‚d S r"   ©ÚNotImplementedError©r   Úplugr   r   r   r   ²   s    zNoPlugins.addPluginc                 C   s
   t ƒ ‚d S r"   rP   ©r   r   r   r   r   Ú
addPluginsµ   s    zNoPlugins.addPluginsc                 C   s   d S r"   r   )r   ÚoptionsÚconfigr   r   r   Ú	configure¸   s    zNoPlugins.configurec                 C   s   d S r"   r   r2   r   r   r   ÚloadPlugins»   s    zNoPlugins.loadPluginsc                 C   s   d S r"   r   r2   r   r   r   Úsort¾   s    zNoPlugins.sortN)r   rC   rD   rE   r   r   r!   rI   rM   rN   rO   r   rU   rX   rY   rZ   r   r   r   r   rF   ›   s   rF   c                   @   sv   e Zd ZdZeZddd„Zdd„ Zdd	„ Zd
d„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeeeddƒZdS )r   aÆ  Base class for plugin managers. PluginManager is intended to be
    used only with a static list of plugins. The loadPlugins() implementation
    only reloads plugins from _extraplugins to prevent those from being
    overridden by a subclass.
    The basic functionality of a plugin manager is to proxy all unknown
    attributes through a ``PluginProxy`` to a list of plugins.
    Note that the plugins *may not* be changed after the first plugin call.r   Nc                 C   s2   g | _ d| _i | _|r |  |¡ |d ur.|| _d S rG   )rH   Ú_extrapluginsÚ_proxiesrU   Ú
proxyClass)r   r   r]   r   r   r   r!   Ì   s    
zPluginManager.__init__c                 C   s<   z| j | W S  ty6   |  || j¡}|| j |< Y n0 |S r"   )r\   ÚKeyErrorr]   rH   )r   r   Úproxyr   r   r   rO   Õ   s    zPluginManager.__getattr__c                 C   s
   t | jƒS r"   )Úiterr   r2   r   r   r   rI   Ý   s    zPluginManager.__iter__c                    s<   t |dtƒ ƒ‰ ‡ fdd„| jD ƒ| jd d …< | j |¡ d S )NÚnamec                    s    g | ]}t |d dƒˆ kr|‘qS )ra   N©r   )r5   r    ©Únew_namer   r   r8   ã   s   ÿz+PluginManager.addPlugin.<locals>.<listcomp>)r   ÚobjectrH   r,   rR   r   rc   r   r   à   s    zPluginManager.addPluginc                 C   s$   || _ t||ƒD ]}|  |¡ qdS )z¯extraplugins are maintained in a separate list and
        re-added by loadPlugins() to prevent their being overwritten
        by plugins added by a subclass of PluginManagerN)r[   Ú	iterchainr   )r   r   ZextrapluginsrS   r   r   r   rU   ç   s    zPluginManager.addPluginsc                 C   sT   t  d¡ || _td| jƒ}|||ƒ dd„ | jD ƒ}|| _|  ¡  t  d|¡ dS )z¡Configure the set of plugins with the given options
        and config instance. After configuration, disabled plugins
        are removed from the plugins list.zConfiguring pluginsrX   c                 S   s   g | ]}|j r|‘qS r   )Úenabled)r5   rS   r   r   r   r8   ÷   r   z+PluginManager.configure.<locals>.<listcomp>zPlugins enabled: %sN)ÚlogÚdebugrW   r   rH   r   rZ   )r   rV   rW   Úcfgrg   r   r   r   rX   ï   s    

zPluginManager.configurec                 C   s   | j D ]}|  |¡ qd S r"   )r[   r   rR   r   r   r   rY   ü   s    
zPluginManager.loadPluginsc                 C   s   t | jdd„ dd�S )Nc                 S   s   t | ddƒS )NZscoreé   rb   )Úxr   r   r   r     r   z$PluginManager.sort.<locals>.<lambda>T)Úreverse)r   rH   r2   r   r   r   rZ      s    ÿzPluginManager.sortc                 C   s   | j S r"   )rH   r2   r   r   r   Ú_get_plugins  s    zPluginManager._get_pluginsc                 C   s   g | _ |  |¡ d S r"   )rH   rU   rT   r   r   r   Ú_set_plugins  s    zPluginManager._set_pluginszPAccess the list of plugins managed by
                       this plugin manager)r   N)r   r   )r   rC   rD   rE   r   r]   r!   rO   rI   r   rU   rX   rY   rZ   rn   ro   Úpropertyr   r   r   r   r   r   Â   s   
	
ÿr   c                   @   sZ   e Zd Zdd„ Zejfd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 )ÚZeroNinePluginc                 C   s
   || _ d S r"   )r-   )r   r-   r   r   r   r!     s    zZeroNinePlugin.__init__c                 C   s   | j  ||¡ d S r"   )r-   Úadd_options)r   ÚparserÚenvr   r   r   rV     s    zZeroNinePlugin.optionsc           	      C   s’   t | jdƒsd S ddlm}m} |\}}}t||ƒrRt | jdƒsDd S | j |j¡S t||ƒrzt | jdƒsld S | j |j¡S |j	}| j 
|j||¡S )NÚaddErrorr   )ÚSkipTestÚDeprecatedTestÚaddSkipÚaddDeprecated)Úhasattrr-   Znose.excrv   rw   Ú
issubclassrx   Útestry   ÚcapturedOutputru   )	r   r|   Úerrrv   rw   ÚecZevÚtbÚcaptr   r   r   ru     s    


zZeroNinePlugin.addErrorc                 C   s   t | jdƒr| j |¡S d S )NÚloadTestsFromPath)rz   r-   r‚   )r   Úfilenamer   r   r   ÚloadTestsFromFile(  s    z ZeroNinePlugin.loadTestsFromFilec                 C   s0   t | jdƒsd S |j}|j}| j |j|||¡S )NÚ
addFailure)rz   r-   r}   Útbinfor…   r|   )r   r|   r~   r�   r†   r   r   r   r…   -  s
    zZeroNinePlugin.addFailurec                 C   s*   t | jdƒsd S |j}| j |j|¡ d S )NÚ
addSuccess)rz   r-   r}   r‡   r|   )r   r|   r�   r   r   r   r‡   4  s    zZeroNinePlugin.addSuccessc                 C   s   t | jdƒsd S | j |j¡S )NÚ	startTest)rz   r-   rˆ   r|   ©r   r|   r   r   r   rˆ   :  s    zZeroNinePlugin.startTestc                 C   s   t | jdƒsd S | j |j¡S )NÚstopTest)rz   r-   rŠ   r|   r‰   r   r   r   rŠ   ?  s    zZeroNinePlugin.stopTestc                 C   s   t | j|ƒS r"   )r   r-   )r   Úvalr   r   r   rO   D  s    zZeroNinePlugin.__getattr__N)r   rC   rD   r!   ÚosÚenvironrV   ru   r„   r…   r‡   rˆ   rŠ   rO   r   r   r   r   rq     s   rq   c                 C   s�   zddl m} W nR ttfyb   zddlm} W n ttfyP   g  Y  Y S 0 || ƒ Y S Y n0 |ƒ }t|dƒr€|j| d�S | 	| g ¡S d S )Nr   )Úentry_points)Úiter_entry_pointsÚselect)Úgroup)
Úimportlib.metadatarŽ   ÚImportErrorr=   Úpkg_resourcesr�   ÚOSErrorrz   r�   Úget)Ú
group_namerŽ   r�   Úgroupsr   r   r   r�   H  s    
r�   c                       s,   e Zd ZdZddeffZ‡ fdd„Z‡  ZS )r	   zCPlugin manager that loads plugins from `nose.plugins` entry points.)znose.plugins.0.10Nznose.pluginsc                    sÞ   i }| j D ]À\}}t|ƒD ]®}|j|v r*qd||j< t d| jj|¡ z| ¡ }W nT tyf   ‚ Y nB t	y¦ } z*t
d||f tƒ W Y d}~qW Y d}~n
d}~0 0 |r¸||ƒ ƒ}n|ƒ }|  |¡ qq
tt| ƒ ¡  dS )z9Load plugins by iterating the `nose.plugins` entry point.Tz%s load plugin %szUnable to load plugin %s: %sN)rŽ   r�   ra   rh   ri   Ú	__class__r   Úloadr;   r=   r   ÚRuntimeWarningr   Úsuperr	   rY   )r   ZloadedÚentry_pointZadaptÚepZplugclsÚerS   ©r™   r   r   rY   b  s*    

ÿ"z#EntryPointPluginManager.loadPlugins)r   rC   rD   rE   rq   rŽ   rY   Ú__classcell__r   r   r    r   r	   ]  s
   ÿr	   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r
   zCManager that loads plugins from the list in `nose.plugins.builtin`.c                    s6   ddl m} |jD ]}|  |ƒ ¡ qtt| ƒ ¡  d S )Nr   )Úbuiltin)Znose.pluginsr¢   r   r   rœ   r
   rY   )r   r¢   rS   r    r   r   rY   }  s    
z BuiltinPluginManager.loadPlugins)r   rC   rD   rE   rY   r¡   r   r   r    r   r
   {  s   r
   c                   @   s   e Zd ZdS ©r   N©r   rC   rD   r   r   r   r   r   …  s   r   c                   @   s   e Zd ZdS r£   r¤   r   r   r   r   r   Š  s   c                   @   s&   e Zd Zd
dd„Zdd„ Zdd„ Zd	S )r   r   Tc                 C   s(   t  | |¡ || _|| _g | _d | _d S r"   )r   r!   rš   ÚexcludeÚexcludedÚ_excludedOpts)r   r   r¥   rš   r   r   r   r!   �  s
    z RestrictedPluginManager.__init__c                 C   sN   | j d u r>ddlm} |dd�| _ | jD ]}|j| j i d� q(| j  d| ¡S )Nr   )ÚOptionParserF)Úadd_help_option)rt   z--)r§   Úoptparser¨   r¦   rV   Ú
get_option)r   ra   r¨   r-   r   r   r   ÚexcludedOption–  s    

z&RestrictedPluginManager.excludedOptionc                 C   sf   | j rt | ¡ g }| jD ]@}d}| jD ]"}t||ƒr(d}| j |¡  qLq(|r| |¡ q|| _d S )NTF)rš   r   rY   r   r¥   rz   r¦   r,   )r   Zallowr-   Úokr   r   r   r   rY   ž  s    



z#RestrictedPluginManager.loadPluginsN)r   r   T)r   rC   rD   r!   r¬   rY   r   r   r   r   r   Ž  s   
r   )!rE   r   ÚloggingrŒ   r>   Ú	itertoolsr   rf   Úwarningsr   Znose.failurer   Znose.plugins.baser   Znose.pyversionr   Ú__all__Ú	getLoggerr   rh   rz   r   re   r   rF   r   rq   r�   r	   r
   r   r“   r   r   r   r   r   Ú<module>   s2   &


c'O7	