B
    1zf"                 @   s   d Z ddlZddlmZ ddlmZ ejdkr8ddlZnddlZddl	Z	ddl
mZ ddl
mZ dZd	Zd
d ZG dd deZdddZde iZG dd dZdS )zCheck Python code passes black style validation via flake8.

This is a plugin for the tool flake8 tool for checking Python
source code using the tool black.
    N)path)Path)      )utils)LOGz0.3.6ZBLKc             C   s   |  d}| d}xttt|t|D ]j}|| }|| }||krJq,x6ttt|t|D ]}|| || krb||fS qbW |tt|t|fS W tt|t|dfS )z<Find line number and column number where text first differs.
r   )splitrangeminlen)Zold_srcZnew_srcZ	old_lines	new_lineslineoldnewcol r   O/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/flake8_black.pyfind_diff_start   s    

r   c               @   s   e Zd ZdZdS )BadBlackConfigz"Bad black TOML configuration file.N)__name__
__module____qualname____doc__r   r   r   r   r   .   s   r   c          
   C   s   | st jt t jddddS td|  y&| jdd}t|}W dQ R X W n. t	k
r|   td|  t
t| Y nX |d	i d
i }dd | D }t jdd |dg D t|dt j|dd |dd t|dddS )zFLoad a black configuration TOML file (or return defaults) as FileMode.TF)Ztarget_versionsline_lengthZstring_normalizationZmagic_trailing_commapreviewz,flake8-black: loading black settings from %srb)modeNz"flake8-black: invalid TOML file %sZtoolblackc             S   s&   i | ]\}}|| d d ddqS )z-- -_)replace).0kvr   r   r   
<dictcomp>G   s    z#load_black_mode.<locals>.<dictcomp>c             S   s   h | ]}t j|  qS r   )r   ZTargetVersionupper)r#   valr   r   r   	<setcomp>L   s   z"load_black_mode.<locals>.<setcomp>Ztarget_versionr   Zskip_string_normalizationZskip_magic_trailing_commar   )r   ZFileModesetZDEFAULT_LINE_LENGTHr   infoopentomllibload
ValueErrorr   r   relpathgetitemsintbool)Ztoml_filenameZ	toml_filepyproject_tomlconfigblack_configr   r   r   load_black_mode4   s.    r8   c               @   s^   e Zd ZdZdZeZdZddddhZdddZ	e
d	d
 Zedd Zedd Zdd ZdS )BlackStyleCheckerz#Checker of Python code using black.r   Nstdinr    (none)c             C   s   || _ || _dS )zInitialise.N)treefilename)selfr<   r=   r   r   r   __init__c   s    zBlackStyleChecker.__init__c             C   s   | j r| j S t| j| jkr dn| jf}t|tr<|d }|d }|tkrdt	d| j| t| S |
 rt|t|< t	d| j| t| S t	d| j td S dS )zCReturn black.FileMode object, using local pyproject.toml as needed..r   zpyproject.tomlz$flake8-black: %s using pre-loaded %sz&flake8-black: %s using newly loaded %szflake8-black: %s using defaultsN)override_configr   Zfind_project_rootr=   STDIN_NAMES
isinstancetupler7   r   debugis_filer8   )r>   Zproject_rootr   r   r   r   
_file_modeh   s     
zBlackStyleChecker._file_modec             C   s   |j ddddddd dS )zAdding black-config option.z--black-configZTOML_FILENAMENstoreTzPath to black TOML configuration file (overrides the default 'pyproject.toml' detection; use empty string '' to mean ignore all 'pyproject.toml' files).)metavardefaultactionZparse_from_confighelp)
add_option)clsparserr   r   r   add_options   s    zBlackStyleChecker.add_optionsc             C   s   |j dkrtd d| _dS |j s<td t d | _dS t|j }|jrjttt|j}|| }|	 s~t
d| yt| | _t |< W n  tk
r   t
d| Y nX dS )zAdding black-config option.Nz(flake8-black: No black configuration setz:flake8-black: Explicitly using no black configuration filezQPlugin flake8-black could not find specified black config file: --black-config %szRPlugin flake8-black could not parse specified black config file: --black-config %s)r7   r   r+   rA   r   r6   r   dirnameabspathrF   r/   r8   r   )rN   Z
optmanageroptions
extra_argsZblack_config_path	base_pathr   r   r   parse_options   s.    




zBlackStyleChecker.parse_optionsc          
   c   s  d}d}d}yL| j | jkr*d| _ t }n,t| j d}t| \}}}W dQ R X W n. tk
r } zd}d| }W dd}~X Y nX |s|sdS |rxy.| j	}| j o| j 
d|_tj||dd	}	W n tjk
r   dS  tjk
r   d
}Y n tk
r  }
 zd|
 }W dd}
~
X Y nX tk
rJ }
 zd|
 }W dd}
~
X Y n.X |	|ks^tdt||	\}}|d7 }d}||t| t| fV  dS )zUse black to check code style.Nr   r:   r   r   z900 Failed to load file: %sz.pyiF)r   fastz901 Invalid input.z997 Invalid TOML file: %sz999 Unexpected exception: %rz1Black made changes without raising NothingChanged   z100 Black would make changes.)r=   rB   stdin_utilsZstdin_get_valuer,   r   Zdecode_bytesread	ExceptionrG   endswithZis_pyiZformat_file_contentsZNothingChangedZInvalidInputr   AssertionErrorr   black_prefixtype)r>   msgr   r   sourcebufr!   eZ	file_modeZnew_codeerrr   r   r   run   sD    
"zBlackStyleChecker.run)r;   )r   r   r   r   name__version__versionrA   rB   r?   propertyrG   classmethodrP   rV   re   r   r   r   r   r9   Z   s   
!)r9   )N)r   sysosr   pathlibr   version_infor-   tomlir   Zflake8r   rY   r   rg   r^   r   r/   r   r8   r7   r9   r   r   r   r   <module>   s    


#
