�9�c@s�dZddlZddlZddlZddlZddlmZddlm Z ddl
Zddlm
Z
ddlmZddlmZyddlZWnddlZnXyddlmZWnddlmZnXd d
ddd
gZeje�Zdefd��YZdefd��YZd
efd��YZddd��YZdefd��YZdefd��YZ y)ddl!Z!d ee fd��YZ"Wn'e#k
r�d e fd��YZ"nXd
e"fd��YZ$dS(s
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``.
i�N(tchain(twarn(tFailure(tIPluginInterface(t sort_list(tStringIOtDefaultPluginManagert
PluginManagertEntryPointPluginManagertBuiltinPluginManagertRestrictedPluginManagertPluginProxycBs_eZdZeZd�Zd�Zd�Zd�Zd�Z d�Z
d�Zd d�Z
RS(
s#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.
cCs�yt|j|�|_Wn-tk
rHtd||jjf��nX|j|�|_g|_x|D]}|j||�qkWdS(Ns%s is not a valid %s method( tgetattrt interfacetmethodtAttributeErrort__name__tmakeCalltcalltpluginst addPlugin(tselfRRtp((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt__init__Ws
cOs|j||�S(N(R(Rtargtkw((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt__call__bscs~t||d�}|dk rz|dkrattj|�d�dkra|��fd�}n|jj||f�ndS(s`Add plugin to my list of plugins to call, if it has the attribute
I'm bound to.
tloadTestsFromModuleiics
�|�S(N((tmoduletpathtkwargs(t orig_meth(s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt<lambda>nsN(RtNonetlentinspectt
getargspecRtappend(RtpluginRtmeth((Rs8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRescs_|dkr�jS�j}t|dt�r;�fd�St|dt�rT�jS�jSdS(NtloadTestsFromNamest
generativecst�j||��S(N(tlisttgenerate(RR(R(s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR {st chainable(t_loadTestsFromNamesRRtFalseRtsimple(RRR'((Rs8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRqs
cOs�d}gtt|jdg�|�D]\}}|r%|^q%}x:|jD]/\}}|||�}|}|j|�qMW|S(s�Call plugins in a chain, where the result of each plugin call is
sent to the next plugin as input. The final output result is returned.
tstatic_argsN(R!tzipRRRR%(RRRtresulttstatictaRR'((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�s(cos�x�|jD]�\}}d}y8|||�}|dk rSx|D]}|VqAWnWq
ttfk
rp�q
tj�}t|�Vq
q
Xq
WdS(sFCall all plugins, yielding each item in each non-None result.
N(RR!tKeyboardInterruptt
SystemExittsystexc_infoR(RRRRR'R2trtexc((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR+�s
cOs=x6|jD]+\}}|||�}|dk r
|Sq
WdS(s?Call all plugins, returning the first non-None result.
N(RR!(RRRRR'R2((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR/�scCsmg}xZ|jD]O\}}||d|�}|dk r|\}}|r_|j|�q_qqW||fS(s
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.
RN(RR!textend(RtnamesRtsuiteRR'R2t
suite_part((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR-�sN(Rt
__module__t__doc__RR
RRRRRR+R/R!R-(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRNs t NoPluginscBsneZdZeZd�Zd�Zd�Zd�Zd�Z d�Z
d�Zd�Zd �Z
d
�ZRS(s(Null Plugin manager that has no plugins.cCsd|_|_dS(N((t_pluginsR(R((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�scCsdS(N(((R((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt__iter__�scOsdS(N((Rtargstkwds((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt
_doNothing�scOsdS(N(((RRDRE((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt_emptyIterator�scCs6t|j|�}t|dt�r+|jS|jSdS(NR)(RR
R.RGRF(RRR((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt__getattr__�scCs
t��dS(N(tNotImplementedError(Rtplug((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�scCs
t��dS(N(RI(RR((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt
addPlugins�scCsdS(N((Rtoptionstconfig((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt configure�scCsdS(N((R((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pytloadPlugins�scCsdS(N((R((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pytsort�s(RR?R@RR
RRCRFRGRHRRKRNRORP(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRA�s cBs�eZdZeZdd
d�Zd�Zd�Zd�Z ddd�Z
d�Zd�Zd�Z
d �Zd
�Zeeed
d�ZRS(s�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 list of plugins *may not* be changed after the first plugin
call.
cCsMg|_d|_i|_|r1|j|�n|dk rI||_ndS(N((RBt
_extrapluginst_proxiesRKR!t
proxyClass(RRRS((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�s cCsIy|j|SWn3tk
rD|j||j�}||j|<nX|S(N(RRtKeyErrorRSRB(RRtproxy((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRH�s
cCs
t|j�S(N(titerR(R((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRCscCsat|dt��}g|jD]$}t|dd�|kr|^q|j(|jj|�dS(Ntname(RtobjectRBR!R%(RRJtnew_nameR((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRs(cCs4||_x$t||�D]}|j|�qWdS(s�extraplugins are maintained in a separate list and
re-added by loadPlugins() to prevent their being overwritten
by plugins added by a subclass of PluginManager
N(RQt iterchainR(RRtextrapluginsRJ((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRKs cCs�tjd�||_td|j�}|||�g|jD]}|jr?|^q?}||_|j�tjd|�dS(s�Configure the set of plugins with the given options
and config instance. After configuration, disabled plugins
are removed from the plugins list.
sConfiguring pluginsRNsPlugins enabled: %sN(tlogtdebugRMRRBtenabledRRP(RRLRMtcfgRJR^((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRNs
%
cCs%x|jD]}|j|�q
WdS(N(RQR(RRJ((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRO"scCst|jd�dt�S(NcSst|dd�S(Ntscorei(R(tx((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR 'streverse(RRBtTrue(R((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRP&scCs|jS(N(RB(R((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt_get_plugins)scCsg|_|j|�dS(N(RBRK(RR((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt_set_plugins,s sPAccess the list of plugins managed by
this plugin manager(N(((RR?R@RRSR!RRHRCRRKRNRORPRdRetpropertyR(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�s tZeroNinePlugincBseeZdZd�Zejd�Zd�Zd�Zd�Z d�Z
d�Zd�Zd �Z
RS(
s>Proxy for 0.9 plugins, adapts 0.10 calls to 0.9 standard.
cCs
||_dS(N(R&(RR&((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR8scCs|jj||�dS(N(R&tadd_options(Rtparsertenv((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRL;sc Cs�t|jd�sdSddlm}m}|\}}}t||�rst|jd�s`dS|jj|j�St||�r�t|jd�s�dS|jj|j�S|j }|jj
|j||�S(NtaddErrori�(tSkipTesttDeprecatedTesttaddSkipt
addDeprecated(thasattrR&tnose.excRlRmt
issubclassRnttestRotcapturedOutputRk( RRsterrRlRmtectevttbtcapt((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRk>s cCs&t|jd�r"|jj|�SdS(NtloadTestsFromPath(RpR&Rz(Rtfilename((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pytloadTestsFromFilePscCsDt|jd�sdS|j}|j}|jj|j|||�S(Nt
addFailure(RpR&RtttbinfoR}Rs(RRsRuRyR~((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR}Ts
cCs9t|jd�sdS|j}|jj|j|�dS(Nt
addSuccess(RpR&RtRRs(RRsRy((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR\s cCs)t|jd�sdS|jj|j�S(Nt startTest(RpR&R�Rs(RRs((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�bscCs)t|jd�sdS|jj|j�S(NtstopTest(RpR&R�Rs(RRs((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�gscCst|j|�S(N(RR&(Rtval((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRHls(RR?R@RtostenvironRLRkR|R}RR�R�RH(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRg5s cBs)eZdZddeffZd�ZRS(shPlugin manager that loads plugins from the `nose.plugins` and
`nose.plugins.0.10` entry points.
snose.plugins.0.10snose.pluginsc Csddlm}i}x�jD]�\}}x�||�D]�}|j|krTq9nt||j<tjd|jj|�y|j �}Wn@t
k
r��n-tk
r�}td||ft
�q9nX|r�|��}n |�}|j|�q9Wq Wtt|�j�dS(sBLoad plugins by iterating the `nose.plugins` entry point.
i�(titer_entry_pointss%s load plugin %ssUnable to load plugin %s: %sN(t
pkg_resourcesR�tentry_pointsRWRcR\R]t __class__RtloadR5t ExceptionRtRuntimeWarningRtsuperRRO( RR�tloadedtentry_pointtadaptteptplugclsteRJ((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyROws*
N(snose.plugins.0.10N(RR?R@R!RgR�RO(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRpscBseZdZd�ZRS(sSPlugin manager that loads plugins from the list in
`nose.plugins.builtin`.
cCsKddlm}x!|jD]}|j|��qWtt|�j�dS(s-Load plugins in nose.plugins.builtin
i�(tbuiltinN(tnose.pluginsR�RRR�R RO(RR�RJ((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRO�s(RR?R@RO(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR �scBseZRS((RR?(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�scBseZRS((RR?(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�scBs2eZdZdded�Zd�Zd�ZRS(s�Plugin manager that restricts the plugin list to those not
excluded by a list of exclude methods. Any plugin that implements
an excluded method will be removed from the manager's plugin list
after plugins are loaded.
cCs8tj||�||_||_g|_d|_dS(N(RRR�texcludetexcludedR!t
_excludedOpts(RRR�R�((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR�s
cCsr|jdkr^ddlm}|dt�|_x*|jD]}|j|jdi�q;Wn|jjd|�S(Ni�(tOptionParsertadd_help_optionRjs--(R�R!toptparseR�R.R�RLt
get_option(RRWR�R&((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pytexcludedOption�scCs�|jrtj|�ng}xj|jD]_}t}x:|jD]/}t||�r?t}|jj |�Pq?q?W|r)|j |�q)q)W||_dS(N(
R�RRORRcR�RpR.R�R%(RtallowR&tokR((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyRO�s (((RR?R@RcRR�RO(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyR
�s ((%R@R#tloggingR�R7t itertoolsRRZtwarningsRtnose.configtnosetnose.failureRtnose.plugins.baseRtnose.pyversionRtcPickletpicklet cStringIORt__all__t getLoggerRR\RXRRARRgRR R�RtImportErrorR
(((s8/sys/lib/python2.7/site-packages/nose/plugins/manager.pyt<module>2sB m&T;%
|