U
    ¸~HjÒ  ã                   @   sþ   d Z ddlZddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZmZ ddlmZ ddl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 ddlmZmZmZ ddl m!Z!m"Z" ddl#m$Z$ e%Z&ede'gdf e'ddœdd„Z(G dd„ deƒZ)dS )z$
Command line options for C{twist}.
é    N)ÚstderrÚstdout)Údedent)ÚCallableÚIterableÚMappingÚOptionalÚSequenceÚTupleÚcast)Úversion)ÚIReactorCore)ÚInvalidLogLevelErrorÚLogLevelÚjsonFileLogObserverÚtextFileLogObserver)Ú
getPlugins)ÚOptionsÚ
UsageErroré   )ÚNoSuchReactorÚgetReactorTypesÚinstallReactor)Ú
ExitStatusÚexit)ÚIServiceMakerÚTwistOptions)ÚoptÚkwargsÚreturnc                 K   s   t | jp
dƒjf |Ž| _dS )z‘
    Update the docstring of a method that implements an option.
    The string is dedented and the given keyword arguments are substituted.
    Ú N)r   Ú__doc__Úformat)r   r   © r#   úF/tmp/pip-unpacked-wheel-ewod1tgb/twisted/application/twist/_options.pyÚ_update_doc   s    r%   c                   @   sZ  e Zd ZdZdZejZddœdd„Ze	dœdd„Z
d	dœd
d„Ze	ddœdd„Zeed dd„ eƒ D ƒ¡d� e	edœdd„Ze	ddœdd„Zeed dd„ e ¡ D ƒ¡ejd� e	ddœdd„Ze	ddœdd„Zeeƒ ddœd d!„Zd+eee	  dd"œd#d$„Zeee	ef dœd%d&„ƒZeee e	de!ege"f e	f  dœd'd(„ƒZ#ddœd)d*„Z$dS ),r   z,
    Command line options for C{twist}.
    ÚdefaultN)r   c                 C   s0   t  | ¡ | j| d< | j| d< t| d< d| _d S )NÚreactorNameÚlogLevelÚlogFiler    )r   Ú__init__ÚdefaultReactorNameÚdefaultLogLevelr   Zlongdesc©Úselfr#   r#   r$   r*   /   s
    


zTwistOptions.__init__c                 C   s   t  | ¡› d�S )Nz plugin [plugin_options])r   ÚgetSynopsisr-   r#   r#   r$   r/   :   s    zTwistOptions.getSynopsisztyping.NoReturnc                 C   s   t tjt› ƒ dS )z)
        Print version and exit.
        N)r   r   ÚEX_OKr   r-   r#   r#   r$   Úopt_version=   s    zTwistOptions.opt_version)Únamer   c                 C   sB   z|   |¡| d< W n" tk
r4   td|› �ƒ‚Y n
X || d< dS )zN
        The name of the reactor to use.
        (options: {options})
        ÚreactorzUnknown reactor: r'   N)r   r   r   )r.   r2   r#   r#   r$   Úopt_reactorC   s
    zTwistOptions.opt_reactorz, c                 c   s   | ]}d |j › d �V  qdS ©ú"N)Z	shortName)Ú.0Úrtr#   r#   r$   Ú	<genexpr>T   s     zTwistOptions.<genexpr>©Úoptionsc                 C   s,   || j kr ddlm} tt|ƒS t|ƒS dS )z&
        Install the reactor.
        r   )r3   N)r+   Ztwisted.internetr3   r   r   r   )r.   r2   r3   r#   r#   r$   r   W   s    

zTwistOptions.installReactor)Ú	levelNamer   c                 C   s:   zt  |¡| d< W n" tk
r4   td|› �ƒ‚Y nX dS )z[
        Set default log level.
        (options: {options}; default: "{default}")
        r(   zInvalid log level: N)r   ZlevelWithNamer   r   )r.   r<   r#   r#   r$   Úopt_log_levelb   s    zTwistOptions.opt_log_levelc                 c   s   | ]}d |j › d �V  qdS r5   )r2   )r7   Zconstantr#   r#   r$   r9   n   s    )r;   r&   )ÚfileNamer   c              
   C   sz   |dkrt | d< dS |dkr(t| d< dS zt|dƒ| d< W n: tk
rt } zttjd|›d|› �ƒ W 5 d}~X Y nX dS )zM
        Log to file. ("-" for stdout, "+" for stderr; default: "-")
        ú-r)   Nú+ÚazUnable to open log file z: )r   r   ÚopenFileÚOSErrorr   r   ÚEX_IOERR)r.   r>   Úer#   r#   r$   Úopt_log_filet   s    þzTwistOptions.opt_log_file)r"   r   c                 C   sF   |  ¡ }|dkrt| d< n |dkr,t| d< ntd|› �ƒ‚|| d< dS )zˆ
        Log file format.
        (options: "text", "json"; default: "text" if the log file is a tty,
        otherwise "json")
        ÚtextÚfileLogObserverFactoryÚjsonzInvalid log format: Ú	logFormatN)Úlowerr   r   r   )r.   r"   r#   r#   r$   Úopt_log_formatˆ   s    

zTwistOptions.opt_log_formatc                 C   sH   d| krD| d }t |dƒr4| ¡ r4t| d< d| d< nt| d< d| d< dS )zm
        Set C{fileLogObserverFactory} to the default appropriate for the
        chosen C{logFile}.
        rH   r)   ÚisattyrG   rJ   rI   N)ÚhasattrrM   r   r   )r.   r)   r#   r#   r$   ÚselectDefaultLogObserverš   s    
z%TwistOptions.selectDefaultLogObserver)r;   r   c                 C   s4   |   ¡  tj| |d� d| kr0|  | d ¡| d< d S )Nr:   r3   r'   )rO   r   ÚparseOptionsr   )r.   r;   r#   r#   r$   rP   ©   s    zTwistOptions.parseOptionsc                 C   sB   d| kr,i }t tƒD ]}|||j< q|| d< ttttf | d ƒS )NÚplugins)r   r   Útapnamer   r   Ústr)r.   rQ   Úpluginr#   r#   r$   rQ   ±   s    zTwistOptions.pluginsc                 c   sF   | j }t|ƒD ]2}|| }|fttdœdd„}|jd ||jfV  qd S )N)rT   r   c                 S   s   t t|  ¡ ƒS )N)r   r   r;   )rT   r#   r#   r$   r;   Æ   s    z)TwistOptions.subCommands.<locals>.options)rQ   Úsortedr   r   rR   Údescription)r.   rQ   r2   rT   r;   r#   r#   r$   ÚsubCommands»   s
    zTwistOptions.subCommandsc                 C   s    t  | ¡ | jd krtdƒ‚d S )NzNo plugin specified.)r   ÚpostOptionsZ
subCommandr   r-   r#   r#   r$   rX   Ë   s    

zTwistOptions.postOptions)N)%Ú__name__Ú
__module__Ú__qualname__r!   r+   r   Úinfor,   r*   rS   r/   r1   r4   r%   Újoinr   r   r   r=   Ziterconstantsr2   rF   rL   rO   r   r	   rP   Úpropertyr   r   rQ   r   r
   r   r   rW   rX   r#   r#   r#   r$   r   '   s>   þ

ÿû	þ)*r!   ÚtypingÚsysr   r   Útextwrapr   r   r   r   r   r	   r
   r   Ztwisted.copyrightr   Ztwisted.internet.interfacesr   Ztwisted.loggerr   r   r   r   Ztwisted.pluginr   Ztwisted.python.usager   r   Zreactorsr   r   r   Zrunner._exitr   r   Zservicer   ÚopenrB   rS   r%   r   r#   r#   r#   r$   Ú<module>   s   $