B
    d"                 @   s   d dl mZmZmZ d dlmZ d dlmZ d dlZd dl	Z	d dl
T d dlmZ dd ZeZd	ejksjtG d
d deZeZdd ZG dd deZG dd deZeZG dd deZG dd deZdS )    )absolute_importdivisionprint_function)Sorry)chunk_managerN)*)rangec             C   s8   |   }|dkrdS |dkr$dS td||f d S )N)falsenooff0F)trueZyeson1Tz!option %s: invalid bool value: %r)striplowerZOptionValueError)optionoptvaluev r   s/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/option_parser.py
check_bool
   s      r   boolc               @   s*   e Zd Zejd ZeejZeed< dS )Option)r   r   N)__name__
__module____qualname__r   ZTYPEScopyTYPE_CHECKERr   r   r   r   r   r      s   
r   c             C   sl   ddl m} dd l}t|  y|j| d W n:   tj  td|  tjd |	  tj  Y nX d S )Nr   )easy_run)commandzCAUGHT EXCEPTION: run_multi(%s))file)
libtbxr    	tracebackprintcallsysstdoutflushstderr	print_exc)cmdr    r$   r   r   r   	run_multi   s    
r-   c               @   s   e Zd Zdd Zdd ZdS )processed_optionsc             C   s6   || _ || _|| _|| _|j| _|j| _| | _d S )N)parseroptions_and_argsoptionsargsexpert_levelattributes_levelr   chunk)selfr/   r0   r1   r2   show_defaults_callbackchunk_callbackr   r   r   __init__)   s    zprocessed_options.__init__c                s   t |tst| jj}|d k	r|dkr| jjdkrddlm  g }xJt	|D ]>}|| j
 d||f g }d fdd|D }|| qLW ddlm} |j|t|dd	 d
S | jjd
d dS )N   r   )escape_sh_double_quotedz--chunk=%d,%d c                s   g | ]}d  |d d  qS )")sr   ).0arg)r;   r   r   
<listcomp>?   s   zNprocessed_options.run_multiprocessing_chunks_if_applicable.<locals>.<listcomp>)easy_mp)	processesfuncr2   	chunksizeT)
have_arrayF)
isinstancelistAssertionErrorr1   max_procr5   nlibtbx.utilsr;   r   r0   joinappendr#   rB   Zpool_mapr-    redirect_chunk_stdout_and_stderr)r6   Zcommand_callrK   Zcmdsir,   rB   r   )r;   r   (run_multiprocessing_chunks_if_applicable4   s     
z:processed_options.run_multiprocessing_chunks_if_applicableN)r   r   r   r9   rQ   r   r   r   r   r.   '   s   r.   c               @   sj   e Zd ZeZdddZdd Zdd Zddd	Zdd
dZ	dd Z
dddZdd Zdd ZdddZdS )option_parserNc             C   s0   t j| ||d || _t | _t | _d| _d S )N)usagedescriptionF)OptionParserr9   	more_helpr7   r8   multiprocessing_is_enabled)r6   rS   rT   rV   r   r   r   r9   L   s
    zoption_parser.__init__c             K   s   |d k	r|f d| i| | S )NrR   r   )r6   callablekwr   r   r    call_with_self_as_first_argumentS   s    z.option_parser.call_with_self_as_first_argumentc             O   s   |  t|| | S )N)
add_optionmake_option)r6   r2   rY   r   r   r   r   X   s    zoption_parser.optionc             C   s   |d kr| j }g }| jr*||  d  || | | jrh|d || |d  |d | jd k	rx| jD ]}||d  qzW d|S )N
 )		formatterrS   rN   Z	get_usageZformat_option_helprT   Zformat_descriptionrV   rM   )r6   r_   resultliner   r   r   format_help\   s    


zoption_parser.format_helpc             C   s    |d krt j}||   d S )N)r'   r(   writerb   )r6   fr   r   r   	show_helpl   s     zoption_parser.show_helpc             C   s*   |  td ddd| jddd d| j_| S )Nz--show_defaultscallbackstringzPrint parameters visible at the given expert level (integer value or "all") and exit. Optionally, append .help, .more, or .all to the expert level, for example:
 --show-defaults=all.helpZEXPERT_LEVEL)actiontyperf   helpmetavarT)r[   r\   r7   
is_enabled)r6   r   r   r   enable_show_defaultsp   s    

z"option_parser.enable_show_defaultsFc             C   s2   |  td ddd| jddd d| j_|| j_| S )Nz--chunkrf   rg   zANumber of chunks for parallel execution and index for one processzn,i)rh   ri   rf   rj   rk   T)r[   r\   r8   rl   easy_all)r6   rn   r   r   r   enable_chunk}   s    

zoption_parser.enable_chunkc          
   C   s<   |  td ddddd |  td dddd	d
d d| _| S )Nz--multiprocessing
store_trueFzVUse multiple processes on local machine (all CPUs unless --max-proc is also specified))rh   defaultrj   z
--max_procstorez,Maximum number of processes on local machineintINT)rh   rj   ri   rk   T)r[   r\   rW   )r6   r   r   r   enable_multiprocessing   s    



z$option_parser.enable_multiprocessingc          	   C   s   |  td ddddd | S )Nz	--dry_runrp   Fz@Perform program initialization and exit (for debugging purposes))rh   rq   rj   )r[   r\   )r6   r   r   r   enable_dry_run   s
    

zoption_parser.enable_dry_runc             C   s4  | j jr2|d k	r2t|dkr2|d dkr2|dg }|d ksN|d krJ|d ksNt|}| |\}}|d krl|}|d k	rt||k rt|dkr|   td | d|t|f  |d kr|}|d k	rt||kr| d|t|f  | j	r|j
r|jd krdd l}|j |_| j| |||| j | jdS )	Nr   z--show_defaultsr   r:   z6Not enough arguments (at least %d required, %d given).z2Too many arguments (at most %d allowed, %d given).)r7   r8   )r7   rl   lenrI   
parse_argsre   r'   exiterrorrW   multiprocessingrJ   Zlibtbx.introspectionintrospectionnumber_of_processorsprocessed_options_typer8   )r6   r2   nargsZ	min_nargsZ	max_nargsr0   r1   r#   r   r   r   process   s>    
 
 zoption_parser.process)NNN)N)N)F)NNNN)r   r   r   r.   r   r9   rZ   r   rb   re   rm   ro   ru   rv   r   r   r   r   r   rR   H   s   



rR   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r7   c             C   s   d| _ d | _d| _d S )NFr   )rl   r3   r4   )r6   r   r   r   r9      s    zshow_defaults_callback.__init__c             C   s   t d| d S )Na  Invalid option value: --show-defaults="%s"
  Please specify an integer value or the word "all"
  Examples:
    --show_defaults=0   # novice
    --show_defaults=1   # slightly advanced
    --show_defaults=2   # more advanced
    etc.
    --show_defaults=all # everything
  Optionally, append
    .help   to display the parameter help, or
    .more   to display all parameter attributes which are not None
    .all    to display all parameter attributes
  Examples:
    --show_defaults=all.help
    --show_defaults=all.all)r   )r6   r   r   r   r   raise_sorry   s    z"show_defaults_callback.raise_sorryc             C   s   |   d}dt|  kr*dkr:n n| j|d |d dkrNd| _n8yt|d }W n  tk
r~   | j|d Y nX || _t|dkr|d dkrd| _n4|d d	krd| _n |d dkrd
| _n| j|d d S )N.r:      )r   r   allrw   rj   Zmore   )	r   r   splitrx   r   r3   rs   
ValueErrorr4   )r6   r   r   r   r/   fldsr3   r   r   r   __call__   s$       zshow_defaults_callback.__call__N)r   r   r   r9   r   r   r   r   r   r   r7      s   r7   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r8   c             C   s   d| _ d| _d| _d| _d S )NFr:   r   )rl   rn   rK   rP   )r6   r   r   r   r9      s    zchunk_callback.__init__c             C   s   |dkst y dd |dD \| _| _W n tk
rJ   td|Y nX | jdk rftd| j || jdk rtd	| j || j| jk rtd
| j| jf |d S )Nz--chunkc             S   s   g | ]}t |qS r   )rs   )r?   rP   r   r   r   rA      s    z+chunk_callback.__call__.<locals>.<listcomp>,z/Two comma-separated positive integers required.r:   zCFirst integer (number of chunks) must be greater than 0 (%d given).r   z=Second integer (index of chunks) must be positive (%d given).zkFirst integer (number of chunks, %d given) must be greater than second integer (index of chunks, %d given).)rI   r   rK   rP   	ExceptionZOptionError)r6   r   r   r   r/   r   r   r   r      s(     

zchunk_callback.__call__c             C   s"   t | j| jd}| jr|  |S )N)rK   rP   )r   rK   rP   rn   )r6   r`   r   r   r   r     s     zchunk_callback.chunk_managerN)r   r   r   r9   r   r   r   r   r   r   r8      s   r8   )
__future__r   r   r   rL   r   libtbx.queuing_system_utilsr   r   r'   Zoptparse	six.movesr   r   r   ZDefaultOptionr   rI   r\   r-   objectr.   rU   rR   Zlibtbx_option_parserr7   r8   r   r   r   r   <module>   s"   !t,