o
    ўSM                     @   sv  d Z ddlZddlZdgZdZG dd deZG dd deZG d	d
 d
e	Z
G dd de
ZG dd de
ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd de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+d, Zd<d.d/Zd0d1 Zd2d3 Zd4d5 Z d6d7 Z!G d8d9 d9e"Z#d=d;dZ$dS )>a  Pythonic command-line interface parser that will make you smile.

 * http://docopt.org
 * Repository and issue-tracker: https://github.com/docopt/docopt
 * Licensed under terms of MIT license (see LICENSE-MIT)
 * Copyright (c) 2013 Vladimir Keleshev, vladimir@keleshev.com

    Ndocoptz0.6.2c                   @      e Zd ZdZdS )DocoptLanguageErrorz4Error in construction of usage-message by developer.N__name__
__module____qualname____doc__ r
   r
   (/usr/lib/python3/dist-packages/docopt.pyr          r   c                   @   s   e Zd ZdZdZdddZdS )
DocoptExitz;Exit in case user invoked program with incorrect arguments. c                 C   s   t | |d | j   d S )N
)
SystemExit__init__usagestrip)selfmessager
   r
   r   r      s   zDocoptExit.__init__N)r   )r   r   r   r	   r   r   r
   r
   r
   r   r      s    r   c                   @   sB   e Zd Zdd Zdd Zdd Zddd	Zd
d Zedd Z	dS )Patternc                 C   s   t | t |kS Nrepr)r   otherr
   r
   r   __eq__"   s   zPattern.__eq__c                 C   s   t t| S r   )hashr   r   r
   r
   r   __hash__%   s   zPattern.__hash__c                 C   s   |    |   | S r   )fix_identitiesfix_repeating_argumentsr   r
   r
   r   fix(   s   zPattern.fixNc                 C   sx   t | ds| S |du rtt|  n|}t| jD ]\}}t |ds4||v s)J ||| | j|< q|| qdS )z>Make pattern-tree tips point to same object if they are equal.childrenN)hasattrlistsetflat	enumerater"   indexr   )r   Zuniqicr
   r
   r   r   -   s   

zPattern.fix_identitiesc                    s   dd | j jD }|D ]G  fdd D D ];}t|tu s't|tu r=|jr=|jdu r0g |_nt|jtur=|j |_t|t	u sNt|tu rQ|jdkrQd|_qq| S )z5Fix elements that should accumulate/increment values.c                 S   s   g | ]}t |jqS r
   r$   r"   .0r*   r
   r
   r   
<listcomp>;       z3Pattern.fix_repeating_arguments.<locals>.<listcomp>c                    s   g | ]}  |d kr|qS )   )countr,   caser
   r   r.   =   s    Nr   )
eitherr"   typeArgumentOptionargcountvaluer$   splitCommand)r   r4   er
   r2   r   r    9   s   
"zPattern.fix_repeating_argumentsc           
      C   s  g }| gg}|r| d}dd |D }t|v r8dd |D d }| || |jD ]
}||g|  q,nt|v rXdd |D d }| || |t|j|  ngt|v rxdd |D d }| || |t|j|  nGt|v rdd |D d }| || |t|j|  n't	|v rdd |D d }	| ||	 |t|	jd	 |  n|| |std
d |D  S )zATransform pattern into an equivalent, with only top-level Either.r   c                 S   s   g | ]}t |qS r
   r5   r,   r
   r
   r   r.   P       z"Pattern.either.<locals>.<listcomp>c                 S      g | ]
}t |tu r|qS r
   )r5   Eitherr,   r
   r
   r   r.   R       c                 S   r?   r
   )r5   Requiredr,   r
   r
   r   r.   W   rA   c                 S   r?   r
   )r5   Optionalr,   r
   r
   r   r.   [   rA   c                 S   r?   r
   )r5   
AnyOptionsr,   r
   r
   r   r.   _   rA   c                 S   r?   r
   )r5   	OneOrMorer,   r
   r
   r   r.   c   rA      c                 S   s   g | ]}t | qS r
   )rB   )r-   r<   r
   r
   r   r.   h   r>   )
popr@   r(   r"   appendrB   r$   rC   rD   rE   )
r   retgroupsr"   typesr4   r*   requiredZoptionalZ	oneormorer
   r
   r   r4   G   s<   


zPattern.eitherr   )
r   r   r   r   r   r!   r   r    propertyr4   r
   r
   r
   r   r       s    
r   c                   @   s0   e Zd Zd
ddZdd Zdd Zd
dd	ZdS )ChildPatternNc                 C      || _ || _d S r   namer9   r   rQ   r9   r
   r
   r   r   m      
zChildPattern.__init__c                 C   s   d| j j| j| jf S )Nz
%s(%r, %r))	__class__r   rQ   r9   r   r
   r
   r   __repr__q      zChildPattern.__repr__c                 G   s   |rt | |v r| gS g S r   r=   r   rK   r
   r
   r   r&   t   s   zChildPattern.flatc                    s   |d u rg n|}  |\}}|d u rd||fS |d | ||d d   } fdd|D }t jttfv rkt jtu rBd}nt|jtu rM|jgn|j}|s]||_d|||g fS |d  j|7  _d||fS d|||g fS )NFr0   c                    s   g | ]
}|j  j kr|qS r
   )rQ   r-   ar   r
   r   r.   }   rA   z&ChildPattern.match.<locals>.<listcomp>Tr   )single_matchr5   r9   intr$   str)r   left	collectedposmatchZleft_Z	same_nameZ	incrementr
   r   r   r`   w   s$   

zChildPattern.matchr   )r   r   r   r   rU   r&   r`   r
   r
   r
   r   rN   k   s
    
rN   c                   @   $   e Zd Zdd Zdd Zdd ZdS )ParentPatternc                 G   s   t || _d S r   r+   )r   r"   r
   r
   r   r      s   zParentPattern.__init__c                 C   s"   d| j jddd | jD f S )Nz%s(%s), c                 s   s    | ]}t |V  qd S r   r   rX   r
   r
   r   	<genexpr>       z)ParentPattern.__repr__.<locals>.<genexpr>)rT   r   joinr"   r   r
   r
   r   rU      s   zParentPattern.__repr__c                    s,   t |  v r	| gS t fdd| jD g S )Nc                    s   g | ]}|j   qS r
   )r&   r,   rK   r
   r   r.      r/   z&ParentPattern.flat.<locals>.<listcomp>)r5   sumr"   rW   r
   rg   r   r&      s   zParentPattern.flatN)r   r   r   r   rU   r&   r
   r
   r
   r   rb      s    rb   c                   @   s    e Zd Zdd Zedd ZdS )r6   c                 C   s8   t |D ]\}}t|tu r|t| j|jf  S qdS NNN)r'   r5   r6   rQ   r9   r   r]   npr
   r
   r   rZ      s
   zArgument.single_matchc                 C   s:   t d|d }t jd|t jd}| ||r|d S d S )Nz(<\S*?>)r   \[default: (.*)\]flags)refindallI)class_sourcerQ   r9   r
   r
   r   parse   s   zArgument.parseN)r   r   r   rZ   classmethodrv   r
   r
   r
   r   r6      s    r6   c                   @   s   e Zd ZdddZdd ZdS )r;   Fc                 C   rO   r   rP   rR   r
   r
   r   r      rS   zCommand.__init__c                 C   sH   t |D ]\}}t|tu r!|j| jkr|t| jdf  S  dS qdS )NTrj   )r'   r5   r6   r9   rQ   r;   rk   r
   r
   r   rZ      s   zCommand.single_matchNF)r   r   r   r   rZ   r
   r
   r
   r   r;      s    
r;   c                   @   s>   e Zd ZdddZedd Zdd	 Zed
d Zdd Z	dS )r7   Nr   Fc                 C   sH   |dv sJ ||| _ | _||| _| _|du r|rd | _d S || _d S )N)r   r0   Fshortlongr8   r9   )r   rz   r{   r8   r9   r
   r
   r   r      s    zOption.__init__c                 C   s   d\}}}}|  d\}}}|dddd}| D ]}	|	dr(|	}q|	dr0|	}qd}q|rFtjd	|tjd
}
|
rD|
d nd }| ||||S )NNNr   Fz  , =---r0   rn   ro   r   )r   	partitionreplacer:   
startswithrq   rr   rs   )rt   Zoption_descriptionrz   r{   r8   r9   options_descriptionsmatchedr
   r
   r   rv      s   

zOption.parsec                 C   s.   t |D ]\}}| j|jkr||f  S qdS ri   )r'   rQ   rk   r
   r
   r   rZ      s
   zOption.single_matchc                 C   s   | j p| jS r   )r{   rz   r   r
   r
   r   rQ      s   zOption.namec                 C   s   d| j | j| j| jf S )NzOption(%r, %r, %r, %r)ry   r   r
   r
   r   rU      s   
zOption.__repr__r|   )
r   r   r   r   rw   rv   rZ   rM   rQ   rU   r
   r
   r
   r   r7      s    


r7   c                   @      e Zd ZdddZdS )rB   Nc                 C   sR   |d u rg n|}|}|}| j D ]}|||\}}}|s#d||f  S qd||fS )NFTr"   r`   )r   r]   r^   lr*   rm   r   r
   r
   r   r`      s   

zRequired.matchr   r   r   r   r`   r
   r
   r
   r   rB          rB   c                   @   r   )rC   Nc                 C   s8   |d u rg n|}| j D ]}|||\}}}qd||fS )NTr   )r   r]   r^   rm   mr
   r
   r   r`      s   

zOptional.matchr   r   r
   r
   r
   r   rC      r   rC   c                   @   r   )rD   z*Marker/placeholder for [options] shortcut.Nr   r
   r
   r
   r   rD      r   rD   c                   @   r   )rE   Nc                 C   s   t | jdks	J |d u rg n|}|}|}d }d}d}|r:| jd ||\}}}||r.dnd7 }||kr6n|}|s|dkrCd||fS d||fS )Nr0   Tr   F)lenr"   r`   )r   r]   r^   r   r*   Zl_r   timesr
   r
   r   r`      s"   

zOneOrMore.matchr   r   r
   r
   r
   r   rE      r   rE   c                   @   r   )r@   Nc                 C   sb   |d u rg n|}g }| j D ]}||| \}}}}|r!|| q|r,t|dd dS d||fS )Nc                 S   s   t | d S )Nr0   r   )outcomer
   r
   r   <lambda>  s    zEither.match.<locals>.<lambda>)keyF)r"   r`   rH   min)r   r]   r^   Zoutcomesrm   r   r   r   r
   r
   r   r`     s   


zEither.matchr   r   r
   r
   r
   r   r@     r   r@   c                   @   ra   )TokenStreamc                 C   s$   | t |dr
| n|7 } || _d S )Nr:   )r#   r:   error)r   ru   r   r
   r
   r   r   #  s   
zTokenStream.__init__c                 C   s   t | r	| dS d S Nr   )r   rG   r   r
   r
   r   move'  rV   zTokenStream.movec                 C   s   t | r| d S d S r   r   r   r
   r
   r   current*  s   zTokenStream.currentN)r   r   r   r   r   r   r
   r
   r
   r   r   !  s    r   c                    s  |   d\ }} dsJ ||  krdkrn ndn|} fdd|D }| jtu r<|g kr< fdd|D }t|dkrS| d	 d
dd |D f t|dk r|dkr_dnd}td |}|| | jtu r|td ||ry|nd}|gS t|d j	|d j
|d j|d j}|jdkr|dur| d|j
 n|du r|  du r| d|j
 |   }| jtu r|dur|nd|_|gS )z-long ::= '--' chars [ ( ' ' | '=' ) chars ] ;r   r   r   Nc                       g | ]	}|j  kr|qS r
   r{   r-   or   r
   r   r.   3      zparse_long.<locals>.<listcomp>c                    s"   g | ]}|j r|j  r|qS r
   )r{   r   r   r   r
   r   r.   5  s   " r0   z%s is not a unique prefix: %s?rc   c                 s   s    | ]}|j V  qd S r   r   r   r
   r
   r   rd   8  s    zparse_long.<locals>.<genexpr>r   Tz%s must not have an argument%s requires argument)r   r   r   r   r   r   rf   r7   rH   rz   r{   r8   r9   r   )tokensr   eqr9   similarr8   r   r
   r   r   
parse_long.  s>    



r   c                    sT  |   }|dr|drJ |d}g }|dkrd|d  |dd  } fdd|D }t|dkrB| d	 t|f t|dk r`t dd}|| | jtu r_t ddd
}n?t |d j|d j	|d j
}d}|j	dkr|dkr|  du r| d  |   }n|}d}| jtu r|dur|nd
|_
|| |dks|S )z-shorts ::= '-' ( chars )* [ [ ' ' ] chars ] ;r   r   r   r   r0   Nc                    r   r
   rz   r   r   r
   r   r.   W  r   z parse_shorts.<locals>.<listcomp>z$%s is specified ambiguously %d timesTr   )r   r   lstripr   r   r7   rH   r   r{   r8   r9   r   )r   r   tokenr]   parsedr   r   r9   r
   r   r   parse_shortsO  sB   







r   c                 C   sF   t tdd| t}t||}| d ur|dd| t| S )Nz([\[\]\(\)\|]|\.\.\.)z \1 zunexpected ending: %rr~   )	r   rq   subr   
parse_exprr   r   rf   rB   )ru   r   r   resultr
   r
   r   parse_patternr  s   
r   c                 C   s   t | |}|  dkr|S t|dkrt| gn|}|  dkr>|   t | |}|t|dkr5t| gn|7 }|  dks t|dkrIt| gS |S )zexpr ::= seq ( '|' seq )* ;|r0   )	parse_seqr   r   rB   r   r@   )r   r   seqr   r
   r
   r   r   {  s   

r   c                 C   sP   g }|   dvr&t| |}|   dkrt| g}|   ||7 }|   dvs|S )zseq ::= ( atom [ '...' ] )* ;)N])r   z...)r   
parse_atomrE   r   )r   r   r   Zatomr
   r
   r   r     s   

r   c                 C   s   |   }g }|dv r2|   dtgdtgd| \}}|t| | }|  |kr/| d| |gS |dkr>|   t gS |drL|dkrLt| |S |drZ|d	vrZt	| |S |d
rd|
dsh| rot|  gS t|  gS )ziatom ::= '(' expr ')' | '[' expr ']' | 'options'
             | long | shorts | argument | command ;
    z([r   r   )([zunmatched '%s'r   r   r   )r   r   <>)r   r   rB   rC   r   r   rD   r   r   r   endswithisupperr6   r;   )r   r   r   r   Zmatchingpatternr
   r
   r   r     s&   

r   Fc                 C   s   g }|   durV|   dkr|dd | D  S |   dr&|t| |7 }n*|   dr;|   dkr;|t| |7 }n|rF|dd | D  S |td|   |   dus|S )zParse command-line argument vector.

    If options_first:
        argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ;
    else:
        argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ;

    Nr   c                 S      g | ]}t d |qS r   r6   r-   vr
   r
   r   r.     r/   zparse_argv.<locals>.<listcomp>r   c                 S   r   r   r   r   r
   r
   r   r.     r/   )r   r   r   r   rH   r6   r   )r   r   options_firstr   r
   r
   r   
parse_argv  s   	r   c                 C   sN   t d| dd  }dd t|d d d |dd d D }dd |D }|S )Nz
 *(<\S+?>|-\S+?)r0   c                 S   s   g | ]\}}|| qS r
   r
   )r-   s1s2r
   r
   r   r.     s    z"parse_defaults.<locals>.<listcomp>rF   c                 S   s    g | ]}| d rt|qS )r   )r   r7   rv   r-   r   r
   r
   r   r.     s     )rq   r:   zip)docr:   r   r
   r
   r   parse_defaults  s   (r   c                 C   sV   t d| }t|dk rtdt|dkrtdt dd|dd  d  S )	Nz([Uu][Ss][Aa][Gg][Ee]:)   z&"usage:" (case-insensitive) not found.z*More than one "usage:" (case-insensitive).z\n\s*\nr   r0   r   )rq   r:   r   r   rf   r   )r   Zusage_splitr
   r
   r   printable_usage  s   "r   c                    s8   |   dd   dd fdd dd  D  d S )Nr0   z( r~   c                 3   s$    | ]}| d  krdn|V  qdS )r   z) | (Nr
   r   Zpur
   r   rd     s   " zformal_usage.<locals>.<genexpr>z ))r:   rf   )r   r
   r   r   formal_usage  s   (r   c                 C   s^   | rt dd |D rt|d t  |r+t dd |D r-t| t  d S d S d S )Nc                 s   s     | ]}|j d v o|jV  qdS ))z-hz--helpNrP   r   r
   r
   r   rd         zextras.<locals>.<genexpr>r   c                 s   s     | ]}|j d ko|jV  qdS )z	--versionNrP   r   r
   r
   r   rd     r   )anyprintr   sysexit)helpversionr   r   r
   r
   r   extras  s   r   c                   @   s   e Zd Zdd ZdS )Dictc                 C   s    dd dd t|  D  S )Nz{%s}z,
 c                 s   s    | ]}d | V  qdS )z%r: %rNr
   )r-   r)   r
   r
   r   rd     re   z Dict.__repr__.<locals>.<genexpr>)rf   sorteditemsr   r
   r
   r   rU     s    zDict.__repr__N)r   r   r   rU   r
   r
   r
   r   r     s    r   Tc                 C   s   |du rt jdd }t| t_t| }tttj|}tt	|tt
||}t|t}|tD ]}t| }	t
t|	| |_q3t||||  | |\}
}}|
rg|g krgtdd | | D S t )a  Parse `argv` based on command-line interface described in `doc`.

    `docopt` creates your command-line interface based on its
    description that you pass as `doc`. Such description can contain
    --options, <positional-argument>, commands, which could be
    [optional], (required), (mutually | exclusive) or repeated...

    Parameters
    ----------
    doc : str
        Description of your command-line interface.
    argv : list of str, optional
        Argument vector to be parsed. sys.argv[1:] is used if not
        provided.
    help : bool (default: True)
        Set to False to disable automatic help on -h or --help
        options.
    version : any object
        If passed, the object will be printed if --version is in
        `argv`.
    options_first : bool (default: False)
        Set to True to require options preceed positional arguments,
        i.e. to forbid options and positional arguments intermix.

    Returns
    -------
    args : dict
        A dictionary, where keys are names of command-line elements
        such as e.g. "--verbose" and "<path>", and values are the
        parsed values of those elements.

    Example
    -------
    >>> from docopt import docopt
    >>> doc = '''
    Usage:
        my_program tcp <host> <port> [--timeout=<seconds>]
        my_program serial <port> [--baud=<n>] [--timeout=<seconds>]
        my_program (-h | --help | --version)

    Options:
        -h, --help  Show this screen and exit.
        --baud=<n>  Baudrate [default: 9600]
    '''
    >>> argv = ['tcp', '127.0.0.1', '80', '--timeout', '30']
    >>> docopt(doc, argv)
    {'--baud': '9600',
     '--help': False,
     '--timeout': '30',
     '--version': False,
     '<host>': '127.0.0.1',
     '<port>': '80',
     'serial': False,
     'tcp': True}

    See also
    --------
    * For video introduction see http://docopt.org
    * Full documentation is available in README.rst as well as online
      at https://github.com/docopt/docopt#readme

    Nr0   c                 s   s    | ]	}|j |jfV  qd S r   rP   rX   r
   r
   r   rd   B  s    zdocopt.<locals>.<genexpr>)r   argvr   r   r   r   r   r   r   r   r$   r%   r&   r7   rD   r"   r   r!   r`   r   )r   r   r   r   r   r   r   Zpattern_optionsZaoZdoc_optionsr   r]   r^   r
   r
   r   r     s"   ?
rx   )NTNF)%r	   r   rq   __all____version__	Exceptionr   r   r   objectr   rN   rb   r6   r;   r7   rB   rC   rD   rE   r@   r$   r   r   r   r   r   r   r   r   r   r   r   r   dictr   r   r
   r
   r
   r   <module>   s@    
K!(	!#	


	