File: //opt/alt/python37/lib/python3.7/site-packages/nose/plugins/__pycache__/manager.cpython-37.pyc
B
�ӻ� W��� @ s� d Z ddlZddlZddlZddlZddlmZ ddlm Z ddl
Zddlm
Z
ddlmZ ddlmZ yddlZW n ddlZY nX yddlmZ W n ddlmZ Y nX d d
ddd
gZe�e�ZG dd� de�ZG dd� de�ZG dd
� d
e�ZG dd� d�ZG dd� de�ZG dd� de�Zyddl Z G dd � d ee�Z!W n& e"k
�rn G dd � d e�Z!Y nX G dd
� d
e!�Z#dS )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)�StringIO�DefaultPluginManager�
PluginManager�EntryPointPluginManager�BuiltinPluginManager�RestrictedPluginManagerc @ sV e Zd ZdZeZdd� Zdd� Zdd� Zdd � Z d
d� Z
dd
� Zdd� Zddd�Z
dS )�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 sl yt | j|�| _W n( tk
r: td|| jjf ��Y nX | �|�| _g | _x|D ]}| �||� qTW d S )Nz%s is not a valid %s method) �getattr� interface�method�AttributeError�__name__�makeCall�call�plugins� addPlugin)�selfr r �p� r �E/opt/alt/python37/lib/python3.7/site-packages/nose/plugins/manager.py�__init__W s
zPluginProxy.__init__c O s | j ||�S )N)r )r �arg�kwr r r �__call__b s zPluginProxy.__call__c sV t ||d�}|dk rR|dkrBtt�|�d �dkrB|� � fdd�}| j�||f� dS )z`Add plugin to my list of plugins to call, if it has the attribute
I'm bound to.
N�loadTestsFromModuler � c s � | �S )Nr )�module�path�kwargs)� orig_methr r �<lambda>n � z'PluginProxy.addPlugin.<locals>.<lambda>)r �len�inspect�
getargspecr �append)r �pluginr �methr )r$ r r e s zPluginProxy.addPluginc sH |dkr� j S � j}t|dd�r,� fdd�S t|dd�r>� jS � jS d S )N�loadTestsFromNames�
generativeFc s t � j| |��S )N)�list�generate)r r )r r r r% { r&