o
    ]i                     @  s   d 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m	Z	m
Z
 ddlZddlZG dd dZd d!ddZG dd de
Zddd"ddZd#ddZdS )$zCLI interface for pytokens.    )annotationsN)Iterable
NamedTuplec                   @  &   e Zd ZU ded< ded< ded< dS )CLIArgsstrfilepathboolvalidateissue_128233_handlingN__name__
__module____qualname____annotations__ r   r   Q/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/pytokens/cli.pyr         
 r   argvlist[str] | Nonereturnintc              
   C  s\  t  }|d |jdddd |jddd |j| t d	}tj|jr/t	|j}d
}n|jg}d}t
|D ]r}t|d6}z
t|j\}}W n tye   |jrdtdddd Y W d   q9 w d||  }	W d   n1 syw   Y  |jrt||	|||jd q9|	|}
tj|
|jdD ]}|
|j|j }tt|| qq9dS )zCLI interface.r   z--no-128233-handlingr   store_false)destactionz
--validate
store_true)r   )	namespaceFTrb[1;33mS[0m endflushN    )verboser   r   r   )argparseArgumentParseradd_argument
parse_argsr   ospathisdirr   find_all_python_filessortedopentokenizedetect_encodingreadlineSyntaxErrorr
   printjoinreadr   decodepytokensstart_index	end_indexrepr)r   parserargsfilesr$   r   fileencoding
read_bytessource
source_strtokentoken_sourcer   r   r   cli   sX   

	
	
rF   c                   @  r   )
TokenTupler   typeztuple[int, int]startr!   Nr   r   r   r   r   rG   K   r   rG   T)r$   r   r   rB   bytesr@   r   r	   r$   Nonec                C  s0  t d t|dks|dd dkr|d }dd |dD }|d t|}t|j}t	| z	dd |D }W n tj
yP   td	d
dd Y dS w |d g}	t|dd ddD ]m\}
}|	d }|}|j|j  krvdkrn n|	  t|j|j|j}|
d t|k r||
d  }|jdkr|jdks|jdkr|jdkr|jd |jd kr|jd |jd kr|	t|j|j|j q`|	| q`||}dd tj||dD }t|	|ddD ](\}}||k}|s|rtd| td| |rtd|  tdd
dd  dS qtdd
dd dS )zValidate the source code.ignorer   N   
c                 S  s   g | ]}|d  qS )rN   r   ).0liner   r   r   
<listcomp>a   s    zvalidate.<locals>.<listcomp>c                 S  s$   g | ]}t tj|j |j|jqS r   )rG   r0   tok_namerH   rI   r!   rO   rD   r   r   r   rQ   k   s    r   r   Tr       )rI   FSTRING_MIDDLEOPFSTRING_ENDc                 s  s@    | ]}|j tjjkrt|j  |j|jf|j|j	fV  qd S N)
rH   r8   	TokenType
whitespacerG   to_python_token
start_line	start_colend_lineend_colrS   r   r   r   	<genexpr>   s    


zvalidate.<locals>.<genexpr>r%   )strictEXPECTEDz---- GOTz	Filepath:z[1;31mF[0mz[1;32m.[0m)warningssimplefilterlensplitappendioBytesIOr0   r2   next
TokenErrorr4   	enumeraterH   poprG   rI   r!   r7   r8   zip)r   rB   r@   r   r$   sourcelinessource_filebuiltin_tokensexpected_tokens_unprocessedexpected_tokensindexrD   
last_tokencurrent_token
next_tokensource_string
our_tokensbuiltin_token	our_tokenmismatchr   r   r   r
   Q   s   
	



	



r
   	directoryIterable[str]c                 C  sL   t  }tj| ddD ]\}}}|D ]}|dr"|tj|| qq
|S )z9Recursively find all Python files in the given directory.F)followlinksz.py)setr*   walkendswithaddr+   r5   )r}   python_filesroot_r>   r?   r   r   r   r-      s   
r-   rX   )r   r   r   r   )r   r   rB   rJ   r@   r   r   r	   r$   r	   r   rK   )r}   r   r   r~   )__doc__
__future__r   r&   rh   os.pathr*   r0   typingr   r   rc   r8   r   rF   rG   r
   r-   r   r   r   r   <module>   s    6h