U
    [h                     @  s   d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl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 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ G dd dZdS )zsupport routines for the helpers in tools/.

These aren't imported by the enclosing util package as the are not
needed for normal library use.

    )annotations)ArgumentParser)	NamespaceN)Path)Any)Dict)Iterator)Optional)Union   )compatc                   @  s   e Zd ZU ded< ded< ded< ded< ded	< ded
< ddddZdddddZdddddZddddddZdddddZddddddZ	dddd d!d"Z
d#d#d$dd%d%dd&d'd(Zejd)d*d+d,Zejd-d*d.d/Zd#S )0code_writer_cmdr   parserr   argsboolsuppress_outputdiffs_detectedr   source_rootpyproject_toml_pathstr)tool_scriptc                 C  s^   t |jj| _| jt d | _| j s,tt | _| jjdddd | jjddddd	 d S )
Nzpyproject.tomlz--stdout
store_truez)Write to stdout instead of saving to file)actionhelp-cz--checkzDon't write the files back, just return the status. Return code 0 means nothing would change. Return code 1 means some files would be reformatted)r   r   )	r   parentr   r   existsAssertionErrorr   r   add_argument)selfr    r    B./venv/lib/python3.8/site-packages/sqlalchemy/util/tool_support.py__init__+   s    zcode_writer_cmd.__init__None)tempfilereturnc                 C  s"   |  t|dd| j d d S )NZzimportsz--toml-config 
entrypointoptions_run_console_scriptr   r   r   r$   r    r    r!   run_zimports?   s    
zcode_writer_cmd.run_zimportsc                 C  s"   |  t|dd| j d d S )NZblackz	--config r&   r)   r+   r    r    r!   	run_blackH   s    
zcode_writer_cmd.run_blackzDict[str, Any])pathr(   r%   c           
      C  s   t jdk}|d }tdD ]}|j|kr|} qBqtd| |dd}tj||d|g }i }	| jr~t	j
 |	d< |	d	< t	jtjd
d|j|j|jf g| fdt| ji|	 dS )zeRun a Python console application from within the process.

        Used for black, zimports

        posixr'   Zconsole_scriptsz*Could not find entrypoint console_scripts.r(    )r/   stdoutstderrr   zimport %s; %s.%s()cwdN)osnamer   Zimportlib_metadata_get	Exceptiongetshlexsplitr   
subprocessZDEVNULLrunsys
executablemoduleattrr   r   )
r   r.   r(   Zis_posixZentrypoint_nameentryimplZcmdline_options_strZcmdline_options_listkwr    r    r!   r*   Q   s>    

 z#code_writer_cmd._run_console_script)textr%   c                 G  s   | j stjd| d S )N )r   r<   r2   writejoin)r   rC   r    r    r!   write_statusx   s    zcode_writer_cmd.write_statuszUnion[str, Path])rC   destination_pathr%   c                 C  s^   | j jr| j||d nB| j jr*t| n0| d| d t|j|ddd | d d S )N)sourceWriting ...utf-8
)encodingnewlinedone
)r   check	_run_diffr1   printrG   r   Z
write_text)r   rC   rH   r    r    r!   write_output_file_from_text|   s    
  z+code_writer_cmd.write_output_file_from_text)r$   rH   r%   c              	   C  s   | j jr"| j||d t| n\| j jrVt|}t|  W 5 Q R X t| n(| 	d| d t
|| | 	d d S )N)source_filerJ   rK   rP   )r   rQ   rR   r4   unlinkr1   openrS   readrG   shutilmove)r   r$   rH   tfr    r    r!   write_output_file_from_tempfile   s    
z/code_writer_cmd.write_output_file_from_tempfileN)rI   rU   zOptional[str])rH   rI   rU   r%   c          	   	   C  s   |r&t |dd}t|}W 5 Q R X n"|d k	r<|jdd}ndsHtdt |ddH}tjt||t| ddd	d
}t|}|rd| _t	d
| W 5 Q R X d S )NrL   )rN   T)keependsFz!source or source_file is requiredz<proposed changes>   rM   )ZfromfileZtofilenZlinetermr0   )rW   list
splitlinesr   difflibZunified_diffr   Zas_posixr   rS   rF   )	r   rH   rI   rU   r[   Zsource_linesZdpdZ	d_as_listr    r    r!   rR      s&    
zcode_writer_cmd._run_diffzIterator[ArgumentParser])r%   c                 c  s   | j V  d S )N)r   r   r    r    r!   add_arguments   s    zcode_writer_cmd.add_argumentszIterator[None]c                 c  sf   | j  | _| jjr"d| _d| _n| jjr2d| _nd| _d V  | jjrX| jrXtd n
td d S )NFTr   r   )	r   
parse_argsr   rQ   r   r   r1   r<   exitrd   r    r    r!   run_program   s    zcode_writer_cmd.run_program)__name__
__module____qualname____annotations__r"   r,   r-   r*   rG   rT   r\   rR   
contextlibcontextmanagerre   rh   r    r    r    r!   r   #   s(   
		'r   )__doc__Z
__future__r   argparser   r   rm   rb   r4   pathlibr   r8   rY   r:   r<   typingr   r   r   r	   r
   r0   r   r   r    r    r    r!   <module>   s$   