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   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   r5   er
   r3   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
   r6   r-   r
   r
   r   r/   P       z"Pattern.either.<locals>.<listcomp>c                 S      g | ]
}t |tu r|qS r
   )r6   Eitherr-   r
   r
   r   r/   R       c                 S   r@   r
   )r6   Requiredr-   r
   r
   r   r/   W   rB   c                 S   r@   r
   )r6   Optionalr-   r
   r
   r   r/   [   rB   c                 S   r@   r
   )r6   
AnyOptionsr-   r
   r
   r   r/   _   rB   c                 S   r@   r
   )r6   	OneOrMorer-   r
   r
   r   r/   c   rB      c                 S   s   g | ]}t | qS r
   )rC   )r.   r=   r
   r
   r   r/   h   r?   )
poprA   r(   r"   appendrC   r$   rD   rE   rF   )
r   retgroupsr"   typesr5   r+   requiredoptional	oneormorer
   r
   r   r5   G   s<   


zPattern.eitherr   )
r   r   r   r   r   r!   r   r    propertyr5   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   namer:   r   rT   r:   r
   r
   r   r   m      
zChildPattern.__init__c                 C   s   d| j j| j| jf S )Nz
%s(%r, %r))	__class__r   rT   r:   r   r
   r
   r   __repr__q      zChildPattern.__repr__c                 G   s   |rt | |v r| gS g S r   r>   r   rL   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 )NFr1   c                    s   g | ]
}|j  j kr|qS r
   )rT   r.   ar   r
   r   r/   }   rB   z&ChildPattern.match.<locals>.<listcomp>Tr   )single_matchr6   r:   intr$   str)r   left	collectedposmatchleft_	same_name	incrementr
   r   r   rc   w   s$   

zChildPattern.matchr   )r   r   r   r   rX   r&   rc   r
   r
   r
   r   rQ   k   s
    
rQ   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   r[   r
   r
   r   	<genexpr>       z)ParentPattern.__repr__.<locals>.<genexpr>)rW   r   joinr"   r   r
   r
   r   rX      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-   rL   r
   r   r/      r0   z&ParentPattern.flat.<locals>.<listcomp>)r6   sumr"   rZ   r
   rm   r   r&      s   zParentPattern.flatN)r   r   r   r   rX   r&   r
   r
   r
   r   rh      s    rh   c                   @   s    e Zd Zdd Zedd ZdS )r7   c                 C   s8   t |D ]\}}t|tu r|t| j|jf  S qdS NNN)r'   r6   r7   rT   r:   r   r`   npr
   r
   r   r]      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_sourcerT   r:   r
   r
   r   parse   s   zArgument.parseN)r   r   r   r]   classmethodr|   r
   r
   r
   r   r7      s    r7   c                   @   s   e Zd ZdddZdd ZdS )r<   Fc                 C   rR   r   rS   rU   r
   r
   r   r      rV   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 )NTrp   )r'   r6   r7   r:   rT   r<   rq   r
   r
   r   r]      s   zCommand.single_matchNF)r   r   r   r   r]   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 )r8   Nr   Fc                 C   sH   |dv sJ ||| _ | _||| _| _|du r|rd | _d S || _d S )N)r   r1   Fshortlongr9   r:   )r   r   r   r9   r:   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  , =---r1   rt   ru   r   )r   	partitionreplacer;   
startswithrw   rx   ry   )rz   option_descriptionr   r   r9   r:   options_descriptionsmatchedr
   r
   r   r|      s   

zOption.parsec                 C   s.   t |D ]\}}| j|jkr||f  S qdS ro   )r'   rT   rq   r
   r
   r   r]      s
   zOption.single_matchc                 C   s   | j p| jS r   )r   r   r   r
   r
   r   rT      s   zOption.namec                 C   s   d| j | j| j| jf S )NzOption(%r, %r, %r, %r)r   r   r
   r
   r   rX      s   
zOption.__repr__r   )
r   r   r   r   r}   r|   r]   rP   rT   rX   r
   r
   r
   r   r8      s    


r8   c                   @      e Zd ZdddZdS )rC   Nc                 C   sR   |d u rg n|}|}|}| j D ]}|||\}}}|s#d||f  S qd||fS )NFTr"   rc   )r   r`   ra   lr+   rs   r   r
   r
   r   rc      s   

zRequired.matchr   r   r   r   rc   r
   r
   r
   r   rC          rC   c                   @   r   )rD   Nc                 C   s8   |d u rg n|}| j D ]}|||\}}}qd||fS )NTr   )r   r`   ra   rs   mr
   r
   r   rc      s   

zOptional.matchr   r   r
   r
   r
   r   rD      r   rD   c                   @   r   )rE   z*Marker/placeholder for [options] shortcut.Nr   r
   r
   r
   r   rE      r   rE   c                   @   r   )rF   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 )Nr1   Tr   F)lenr"   rc   )r   r`   ra   r   r+   l_r   timesr
   r
   r   rc      s"   

zOneOrMore.matchr   r   r
   r
   r
   r   rF      r   rF   c                   @   r   )rA   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 )Nr1   r   )outcomer
   r
   r   <lambda>  s    zEither.match.<locals>.<lambda>)keyF)r"   rc   rI   min)r   r`   ra   outcomesrs   r   r   r   r
   r
   r   rc     s   


zEither.matchr   r   r
   r
   r
   r   rA     r   rA   c                   @   rg   )TokenStreamc                 C   s$   | t |dr
| n|7 } || _d S )Nr;   )r#   r;   error)r   r{   r   r
   r
   r   r   #  s   
zTokenStream.__init__c                 C   s   t | r	| dS d S Nr   )r   rH   r   r
   r
   r   move'  rY   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   " r1   z%s is not a unique prefix: %s?ri   c                 s   s    | ]}|j V  qd S r   r   r   r
   r
   r   rj   8  s    zparse_long.<locals>.<genexpr>r   Tz%s must not have an argument%s requires argument)r   r   r   r   r   r   rl   r8   rI   r   r   r9   r:   r   )tokensr   eqr:   similarr9   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   r1   Nc                    r   r
   r   r   r   r
   r   r/   W  r   z parse_shorts.<locals>.<listcomp>z$%s is specified ambiguously %d timesTr   )r   r   lstripr   r   r8   rI   r   r   r9   r:   r   )r   r   tokenr`   parsedr   r   r:   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   rw   subr   
parse_exprr   r   rl   rC   )r{   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 )* ;|r1   )	parse_seqr   r   rC   r   rA   )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_atomrF   r   )r   r   r   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   rC   rD   r   r   rE   r   r   r   endswithisupperr7   r<   )r   r   r   r   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   r7   r.   vr
   r
   r   r/     r0   zparse_argv.<locals>.<listcomp>r   c                 S   r   r   r   r   r
   r
   r   r/     r0   )r   r   r   r   rI   r7   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+?)r1   c                 S   s   g | ]\}}|| qS r
   r
   )r.   s1s2r
   r
   r   r/     s    z"parse_defaults.<locals>.<listcomp>rG   c                 S   s    g | ]}| d rt|qS )r   )r   r8   r|   r.   r   r
   r
   r   r/     s     )rw   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   r1   r   )rw   r;   r   r   rl   r   )r   usage_splitr
   r
   r   printable_usage  s   "r   c                    s8   |   dd   dd fdd dd  D  d S )Nr1   z( r   c                 3   s$    | ]}| d  krdn|V  qdS )r   z) | (Nr
   r   pur
   r   rj     s   " zformal_usage.<locals>.<genexpr>z ))r;   rl   )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--helpNrS   r   r
   r
   r   rj         zextras.<locals>.<genexpr>r   c                 s   s     | ]}|j d ko|jV  qdS )z	--versionNrS   r   r
   r
   r   rj     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   rj     rk   z Dict.__repr__.<locals>.<genexpr>)rl   sorteditemsr   r
   r
   r   rX     s    zDict.__repr__N)r   r   r   rX   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

    Nr1   c                 s   s    | ]	}|j |jfV  qd S r   rS   r[   r
   r
   r   rj   B  s    zdocopt.<locals>.<genexpr>)r   argvr   r   r   r   r   r   r   r   r$   r%   r&   r8   rE   r"   r   r!   rc   r   )r   r   r   r   r   r   r   pattern_optionsaodoc_optionsr   r`   ra   r
   r
   r   r     s"   ?
r~   )NTNF)%r	   r   rw   __all____version__	Exceptionr   r   r   objectr   rQ   rh   r7   r<   r8   rC   rD   rE   rF   rA   r$   r   r   r   r   r   r   r   r   r   r   r   r   dictr   r   r
   r
   r
   r   <module>   s@    
K!(	!#	


	