
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ÌÐgV%  ã               @   sò   d dl mZ d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ ejdƒZdZG dd	„ d	eƒZG d
d„ deƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    )Úabsolute_import)Úprint_function)Úunicode_literalsN)Ú_Údnfzdnf.plugin.dynamicc               @   s\   e Zd ZdZdZdZe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 )ÚPluginz5The base class custom plugins must derive from. #:apiz	<invalid>Nc                s˜   t jjƒ }| jr| jn| j‰ ‡ fdd„|jD ƒ}xb|D ]Z}tjj|ƒr6y|j	|ƒ W q6 t
k
rŽ } ztjjtdƒt|ƒ ƒ‚W Y d d }~X q6X q6W |S )Nc                s   g | ]}d |ˆ f ‘qS )z
%s/%s.conf© )Ú.0Úpath)Únamer   ú/usr/lib/python3.6/plugin.pyú
<listcomp>9   s    z&Plugin.read_config.<locals>.<listcomp>zParsing file failed: %s)ÚlibdnfÚconfZConfigParserÚconfig_namer   ZpluginconfpathÚosr
   ÚisfileÚreadÚ	Exceptionr   Ú
exceptionsZConfigErrorr   Ústr)Úclsr   ÚparserÚfilesÚfileÚer   )r   r   Úread_config4   s    

.zPlugin.read_configc             C   s   || _ || _d S )N)ÚbaseÚcli)Úselfr   r   r   r   r   Ú__init__B   s    zPlugin.__init__c             C   s   d S )Nr   )r   r   r   r   Ú
pre_configG   s    zPlugin.pre_configc             C   s   d S )Nr   )r   r   r   r   ÚconfigK   s    zPlugin.configc             C   s   d S )Nr   )r   r   r   r   ÚresolvedO   s    zPlugin.resolvedc             C   s   d S )Nr   )r   r   r   r   ÚsackS   s    zPlugin.sackc             C   s   d S )Nr   )r   r   r   r   Úpre_transactionW   s    zPlugin.pre_transactionc             C   s   d S )Nr   )r   r   r   r   Útransaction[   s    zPlugin.transaction)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úclassmethodr   r    r!   r"   r#   r$   r%   r&   r   r   r   r   r   .   s   r   c               @   s~   e Z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d„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚPluginsc             C   s   g | _ g | _d S )N)Ú
plugin_clsÚplugins)r   r   r   r   r    a   s    zPlugins.__init__c             C   s   | j ƒ  d S )N)Ú_unload)r   r   r   r   Ú__del__e   s    zPlugins.__del__c             C   s~   xx| j D ]n}yt||ƒƒ  W q tjjk
r6   ‚ Y q tk
rt   tjƒ \}}}tj	|||ƒ}t
jdj|ƒƒ Y qX qW d S )NÚ )r.   Úgetattrr   r   ÚErrorr   ÚsysÚexc_infoÚ	tracebackÚformat_exceptionÚloggerZcriticalÚjoin)r   ÚmethodÚpluginÚexc_typeÚ	exc_valueÚexc_tracebackZexcept_listr   r   r   Ú_callerh   s    zPlugins._callerc                sx   xr| j dd… D ]`}|j‰ t‡ fdd„|D ƒƒr2q|j|ƒ}|jdƒo^|jddƒo^|jddƒ }|r| j j|ƒ qW dS )zwChecks whether plugins are enabled or disabled in configuration files
           and removes disabled plugins from listNc             3   s   | ]}t j ˆ |ƒV  qd S )N)Úfnmatch)r	   Úpattern)r   r   r   ú	<genexpr>x   s    z)Plugins._check_enabled.<locals>.<genexpr>ÚmainZenabled)r-   r   Úanyr   Zhas_sectionZ
has_optionZ
getbooleanÚremove)r   r   Úenable_pluginsZplug_clsr   Zdisabledr   )r   r   Ú_check_enableds   s    

zPlugins._check_enabledc             C   sž   t tjkrtdƒ‚tjjt ƒ tjt < }g |_t|j	||ƒ}t
||ƒ tƒ dd… | _| j||ƒ t| jƒdkrštdd„ | jD ƒƒ}tjtdƒdj|ƒƒ dS )z)Dynamically load relevant plugin modules.zload_plugins() called twiceNr   c             s   s   | ]}|j V  qd S )N)r   )r	   r;   r   r   r   rB   �   s    z Plugins._load.<locals>.<genexpr>zLoaded plugins: %sz, )ÚDYNAMIC_PACKAGEr4   ÚmodulesÚRuntimeErrorr   ZpycompÚ
ModuleTypeÚ__path__Ú_get_plugins_filesZ
pluginpathÚ_import_modulesÚ_plugin_classesr-   rG   ÚlenÚsortedr8   Údebugr   r9   )r   r   ZskipsrF   Úpackager   Únamesr   r   r   Ú_load‚   s    

zPlugins._loadc             C   s   | j dƒ d S )Nr!   )r?   )r   r   r   r   Ú_run_pre_config’   s    zPlugins._run_pre_configc             C   s   | j dƒ d S )Nr"   )r?   )r   r   r   r   Ú_run_config•   s    zPlugins._run_configNc             C   s*   x$| j D ]}|||ƒ}| jj|ƒ qW d S )N)r-   r.   Úappend)r   r   r   Zp_clsr;   r   r   r   Ú	_run_init˜   s    
zPlugins._run_initc             C   s   | j dƒ d S )Nr$   )r?   )r   r   r   r   Úrun_sack�   s    zPlugins.run_sackc             C   s   | j dƒ d S )Nr#   )r?   )r   r   r   r   Úrun_resolved    s    zPlugins.run_resolvedc             C   s   | j dƒ d S )Nr%   )r?   )r   r   r   r   Úrun_pre_transaction£   s    zPlugins.run_pre_transactionc             C   s   | j dƒ d S )Nr&   )r?   )r   r   r   r   Úrun_transaction¦   s    zPlugins.run_transactionc             C   s&   t tjkr"tjtjjdƒ tjt = d S )NzPlugins were unloaded.)rH   r4   rI   r8   Úlogr   ÚloggingZDDEBUG)r   r   r   r   r/   ©   s    
zPlugins._unloadc             C   sª   |j s
dS tƒ }x| jD ]}||tj|jƒ< qW t|jƒ ƒ}tƒ }x |j D ]}|j|j	|j
ƒƒ qJW |sldS x|jD ]}|j|j
ƒ qtW x|D ]}| jj|| ƒ qŽW dS )zH
        Unload plugins that were removed in the `transaction`.
        N)Z
remove_setÚdictr.   ÚinspectZgetfileÚ	__class__ÚsetÚkeysÚupdateÚintersectionr   Zinstall_setÚdifference_updaterE   )r   r&   r.   r;   Zplugin_filesZerased_plugin_filesZpkgZplugin_filer   r   r   Úunload_removed_plugins®   s    
zPlugins.unload_removed_plugins)N)r'   r(   r)   r    r0   r?   rG   rU   rV   rW   rY   rZ   r[   r\   r]   r/   rh   r   r   r   r   r,   `   s   
r,   c               C   s   t jƒ S )N)r   Ú__subclasses__r   r   r   r   rO   Ë   s    rO   c             C   s¤   xž|D ]–}t jj|ƒ\}}| jj|ƒ t jj|ƒ\}}d| j|f }ytj|ƒ}W q t	k
rš } z,t
jtdƒ||ƒ t
jtjjddd� W Y d d }~X qX qW d S )Nz%s.%szFailed loading plugin "%s": %sr1   T)r5   )r   r
   ÚsplitrL   rX   Úsplitextr'   Ú	importlibÚimport_moduler   r8   Úerrorr   r^   r   r_   ZSUBDEBUG)rS   Zpy_filesÚfnr
   ÚmoduleZextr   r   r   r   r   rN   Ï   s    
rN   c             C   sJ  g }t |ƒ}t |ƒ}t ƒ }t ƒ }xÈ| D ]À}xºtjd| ƒD ]¨}tjjtjj|ƒƒ\}}	d}
d}xN|D ]F}t||ƒrd|j|ƒ d}
x$|D ]}t||ƒr†d}
|j|ƒ q†W d}qdW |sÔx |D ]}t||ƒr¸|j|ƒ q¸W |
r:|j|ƒ q:W q&W |j	|ƒ}|�rt
jtdƒjdjt|ƒƒƒƒ |j	|ƒ}|�rFt
jtdƒjdjt|ƒƒƒƒ |S )Nz%s/*.pyTFz=No matches found for the following enable plugin patterns: {}z, z>No matches found for the following disable plugin patterns: {})rc   Úglobr   r
   rk   ÚbasenameÚ_plugin_name_matches_patternÚaddrX   Ú
differencer8   Zwarningr   Úformatr9   rQ   )ÚpathsZdisable_pluginsrF   r.   Zpattern_enable_foundZpattern_disable_foundÚpro   Úplugin_nameZdummyZmatchedZenable_pattern_testedZpattern_skipZpattern_enableZenable_not_foundZdisable_not_foundr   r   r   rM   Ü   sD    









rM   c                s*   t | | jddƒfƒ}t‡ fdd„|D ƒƒS )zë
    Checks plugin name matches the pattern.

    The alternative plugin name using dashes instead of underscores is tried
    in case of original name is not matched.

    (see https://bugzilla.redhat.com/show_bug.cgi?id=1980712)
    r   ú-c             3   s   | ]}t j |ˆ ƒV  qd S )N)r@   )r	   r   )rA   r   r   rB     s    z/_plugin_name_matches_pattern.<locals>.<genexpr>)rc   ÚreplacerD   )ry   rA   Z	try_namesr   )rA   r   rs     s    
rs   c                s<   ‡ fdd„}t tˆ jd ƒtjf|ˆ jd dœƒ}|ˆ _ˆ S )z5A class decorator for automatic command registration.c                s   |r|j ˆ ƒ d S )N)Úregister_command)r   r   r   )Úcommand_classr   r   r      s    z"register_command.<locals>.__init__r   r   )r    r   )Útyper   r'   r   r   ÚaliasesZ_plugin)r}   r    Zplugin_classr   )r}   r   r|     s    r|   )Z
__future__r   r   r   r@   rq   rl   ra   r_   Úoperatorr   r4   r6   r   Zdnf.loggingr   Z
dnf.pycompZdnf.utilZdnf.i18nr   Z	getLoggerr8   rH   Úobjectr   r,   rO   rN   rM   rs   r|   r   r   r   r   Ú<module>   s2   
2k%