B
    1zfQ              
   @   s<  d 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 yddlZdd	lmZ W n$ ek
r   dd
lmZmZ Y nX dZejdd Zed dkZedZedZejejejejhZejfZereejej hO Zneej!hO Zedkr$eej"f7 Zeej#ej$hO Zer<dd Z%dd Z&nedk rPdd Z&ndd Z&G dd de'Z(dd Z)dd Z*e(de+fde)d Z,G d!d" d"e+Z-d#d$d%d&d'd(d)d*d+d,g
Z.d-gZ/d.gZ0d/d0 Z1G d1d2 d2e+Z2G d3d4 d4e,Z3G d5d6 d6e,Z4G d7d8 d8e,Z5G d9d: d:e,Z6G d;d< d<e,Z7d=d> Z8d?d@ Z9dS )Az$Checker of PEP-8 Naming Conventions.    N)deque)fnmatch)partial)chain)style_guide)options)iter_child_nodes)astr   z0.12.1      )__new____init_subclass____class_getitem__)typeABCMeta)r
      c             C   sD   g }x:| D ]2}t |tjr,|t|j q
|||jf q
W |S )N)
isinstancer	   Tupleextend_unpack_argseltsappendid)argsretarg r   Q/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/pep8ext_naming.pyr   ,   s    
r   c             C   s   t | jjS )N)r   r   )noder   r   r   get_arg_name_tuples5   s    r   )r
      c             C   s   | j j | j jf}dd |D S )Nc             S   s    g | ]}|D ]}||j fqqS r   )r   ).0r   r   r   r   r   
<listcomp>:   s    z'get_arg_name_tuples.<locals>.<listcomp>)r   
kwonlyargs)r   groupsr   r   r   r   8   s    c             C   s$   | j j| j j | j jf}dd |D S )Nc             S   s    g | ]}|D ]}||j fqqS r   )r   )r!   r   r   r   r   r   r"   >   s    z'get_arg_name_tuples.<locals>.<listcomp>)r   Zposonlyargsr#   )r   r$   r   r   r   r   <   s    c               @   s   e Zd Zdd ZdS )_ASTCheckMetac             C   sF   t dd |D | _y| j|   W n tk
r@   g | _Y nX d S )Nc             s   s   | ]}| d r|V  qdS )NN)
startswith)r!   coder   r   r   	<genexpr>C   s    z)_ASTCheckMeta.__init__.<locals>.<genexpr>)tuplecodesallr   AttributeError)cls
class_namebases	namespacer   r   r   __init__B   s
    z_ASTCheckMeta.__init__N)__name__
__module____qualname__r2   r   r   r   r   r%   A   s   r%   c             K   s   |j |j }}t|tjr:tdk r0|t|j7 }|d7 }n(t|trbtdk rZ|t|j7 }|d7 }t	| |}|r||j
f |}||d d||f | fS )N)r
   r             z%s %s)lineno
col_offsetr   r	   ClassDefPYTHON_VERSIONlendecorator_list
FUNC_NODESgetattrformat)selfr   r(   kwargsr9   r:   Zcode_strr   r   r   _errJ   s    


rD   c                s   t  fdd|D S )Nc             3   s   | ]}t  |V  qd S )N)r   )r!   i)namer   r   r)   [   s    z_ignored.<locals>.<genexpr>)any)rF   ignorer   )rF   r   _ignoredZ   s    rI   BaseASTCheckzBase for AST Checks.)__doc__errc               @   s   e Zd ZdZdZdZdZdS )_FunctionTypeclassmethodstaticmethodfunctionmethodN)r3   r4   r5   CLASSMETHODSTATICMETHODFUNCTIONMETHODr   r   r   r   rM   b   s   rM   ZsetUpZtearDownZ
setUpClassZtearDownClassZ
asyncSetUpZasyncTearDownZsetUpTestDataZfailureExceptionZlongMessageZmaxDiffrN   rO   c             C   s8   i }x| D ]}t j||< q
W x|D ]}t j||< q"W |S )N)rM   rR   rS   )classmethod_decoratorsstaticmethod_decoratorsdecorator_to_type	decoratorr   r   r   _build_decorator_to_typex   s    

rZ   c               @   s   e Zd ZdZdZeZejZ	e
eeZeeZdd Zedd Zedd Zd	d
 Zdd Zdd Zdd Zdd Zedd Zedd ZdS )NamingCheckerz$Checker of PEP-8 Naming Conventions.Znamingc             C   s   t  | _|| _d S )N)r   parents_node)rB   treefilenamer   r   r   r2      s    zNamingChecker.__init__c          
   C   s^   t j|dtdddddd t j|dtdddddd t j|d	tddddd
d |dg d S )Nz--ignore-namesstorestringTz[List of names or glob patterns the pep8-naming plugin should ignore. (Defaults to %default))defaultactionr   Zparse_from_configcomma_separated_listhelpz--classmethod-decoratorsz`List of method decorators pep8-naming plugin should consider classmethods (Defaults to %default)z--staticmethod-decoratorszaList of method decorators pep8-naming plugin should consider staticmethods (Defaults to %default)N818)r   register_default_ignore_names_default_classmethod_decorators _default_staticmethod_decoratorsZextend_default_ignore)r.   parserr   r   r   add_options   s,    zNamingChecker.add_optionsc                sD   t |j| _t|j|j| _t| t  fddtj	D | _
d S )Nc             3   s0   | ](}|j D ]} |tjjkr|V  qqd S )N)r+   Zdecision_forr   ZDecisionZSelected)r!   visitorr(   )enginer   r   r)      s    z.NamingChecker.parse_options.<locals>.<genexpr>)	frozensetignore_namesrZ   rV   rW   rX   r   ZDecisionEnginerJ   r,   visitors)r.   r   r   )rn   r   parse_options   s    

zNamingChecker.parse_optionsc             C   s   | j r| | j S dS )Nr   )r]   
visit_tree)rB   r   r   r   run   s    zNamingChecker.runc             c   s`   x|  |D ]
}|V  qW | j| x*t|D ]}x| |D ]
}|V  q@W q0W | j  d S )N)
visit_noder\   r   r   rs   pop)rB   r   errorchildr   r   r   rs      s    
zNamingChecker.visit_treec             c   s   t |tjr| | nt |tr,| | d|jj  }| j	}| j
}x@| jD ]6}t||d }|d krjqPx||||D ]
}|V  qxW qPW d S )Nvisit_)r   r	   r;   tag_class_functionsr?   find_global_defs	__class__r3   lowerr\   rp   rq   r@   )rB   r   rQ   r\   rp   rm   Zvisitor_methodrw   r   r   r   ru      s    

zNamingChecker.visit_nodec             C   s   i }xt |D ]~}t|tjrt|jtjrt|jjtjs>q|jjj}|| j	krTqt
|jjdkon|jjd }t|tjr| j	| ||j< qW tdd |jD dd |jD }tdd |D }| t ||| dS )z>Tag functions if they are methods, classmethods, staticmethodsr8   r   c             s   s    | ]}t |tjr|jV  qd S )N)r   r	   Namer   )r!   br   r   r   r)      s    z4NamingChecker.tag_class_functions.<locals>.<genexpr>c             s   s    | ]}t |tjr|jV  qd S )N)r   r	   	Attributeattr)r!   r   r   r   r   r)      s    c             s   s   | ]}|t kr|V  qd S )N)METACLASS_BASES)r!   rF   r   r   r   r)      s    N)r   r   r	   AssignvalueCallfuncr~   r   rX   r=   r   r   r0   rG   set_function_nodes_types)rB   Zcls_nodelate_decorationr   	func_namemethr0   ismetaclassr   r   r   rz      s$    

z!NamingChecker.tag_class_functionsc             C   s   x|D ]}t |tkr(| t||| t|ts4qtj|_|j	t
ksJ|rRtj|_|j	|krj||j	 |_q|jrx0|jD ]&}| |}|| jkrx| j| |_P qxW qW d S )N)r   METHOD_CONTAINER_NODESr   r   r   r?   rM   rU   function_typerF   CLASS_METHODSrR   r>   find_decorator_namerX   )rB   Znodesr   r   r   drF   r   r   r   r      s"    




z&NamingChecker.set_function_nodes_typesc             C   s@   t |tjr|jS t |tjr$|jS t |tjr<| |jS d S )N)	r   r	   r~   r   r   r   r   r   r   )r.   r   r   r   r   r     s    z!NamingChecker.find_decorator_namec             C   sf   t  }tt| }xH|rZ| }t|tjr8||j t|tj	ft
 s|t| qW || _d S )N)setr   r   rv   r   r	   Globalupdatenamesr;   r?   r   global_names)Zfunc_def_noder   Znodes_to_checkr   r   r   r   r{     s    zNamingChecker.find_global_defsN)r3   r4   r5   rK   rF   __version__versionrJ   r,   rq   rZ   ri   rj   rX   ro   rh   rp   r2   rN   rl   rr   rt   rs   ru   rz   r   r   rO   r{   r   r   r   r   r[      s"    		r[   c               @   s<   e Zd ZdZdZdZedd ZedddZdd	d
Z	dS )ClassNameCheckz
    Almost without exception, class names use the CapWords convention.

    Classes for internal use have a leading underscore in addition.
    z2class name '{name}' should use CapWords conventionz<exception name '{name}' should be named with an Error suffixc             C   s<   x6|D ].}x(|j D ]}t|tjr|j|kr|S qW qW d S )N)bodyr   r	   r;   rF   )r.   rF   r\   parentr   r   r   r   get_classdef+  s    
zClassNameCheck.get_classdefNc             C   sj   |pt  }| ||}|s|S xF|jD ]<}t|tjr&|j|kr&||j || 	|j|| q&W |S )N)
r   r   r0   r   r	   r~   r   addr   superclass_names)r.   rF   r\   Z_namesr   Zclassdefbaser   r   r   r   2  s    
zClassNameCheck.superclass_namesc             c   s|   |j }t||rd S |d}|d d  r6d|krH| j|d|dV  | ||}d|krx|dsx| j|d|dV  d S )N_r8   N801)rF   	ExceptionErrorrf   )rF   rI   stripisupperrL   r   endswith)rB   r   r\   rH   rF   Zsuperclassesr   r   r   visit_classdef>  s    

zClassNameCheck.visit_classdef)N)N)
r3   r4   r5   rK   r   rf   rN   r   r   r   r   r   r   r   r   "  s   r   c               @   s&   e Zd ZdZdZdZdddZeZdS )FunctionNameCheckaV  
    Function names should be lowercase, with words separated by underscores
    as necessary to improve readability.

    Functions *not* being methods '__' in front and back are not allowed.

    mixedCase is allowed only in contexts where that's already the
    prevailing style (e.g. threading.py), to retain backwards compatibility.
    z*function name '{name}' should be lowercasez9function name '{name}' should not start and end with '__'Nc             c   s   t |dtj}|j}t||r"d S |dkr.d S | |krL| j|d|dV  |tjkr|d d dkr|dd  dkr| j|d|dV  d S )	Nr   )__dir____getattr__N802)rF   r   __N807)r@   rM   rT   rF   rI   r}   rL   )rB   r   r\   rH   r   rF   r   r   r   visit_functiondefW  s    

 z#FunctionNameCheck.visit_functiondef)N)r3   r4   r5   rK   r   r   r   visit_asyncfunctiondefr   r   r   r   r   J  s
   	
r   c               @   s*   e Zd ZdZdZdZdZdddZeZdS )	FunctionArgNamesCheckz
    The argument names of a function should be lowercase, with words separated
    by underscores.

    A classmethod should have 'cls' as first argument.
    A method should have 'self' as first argument.
    z*argument name '{name}' should be lowercasez5first argument of a classmethod should be named 'cls'z1first argument of a method should be named 'self'Nc             #   s*   fdd}xZ| j j| j jfD ]>\}}|d ks&t||rBq&| |kr&| j|d|dV  d S q&W t }|sxd S |d \}}	t dtj	}
|
tj
kr|	dkrt|	|s| |dV  n*|
tjkr|	d	krt|	|s| |d
V  x<|D ]4\}}| |krt||s| j|d|dV  d S qW d S )Nc                s(   y
| | j fS  tk
r"    | fS X d S )N)r   r-   )r   )r   r   r   arg_nameu  s    
z9FunctionArgNamesCheck.visit_functiondef.<locals>.arg_nameN803)rF   r   r   rB   N805r.   N804)r   varargkwargrI   r}   rL   r   r@   rM   rT   rU   rR   )rB   r   r\   rH   r   r   rF   Zarg_name_tuplesZarg0Zname0r   r   )r   r   r   s  s,    "

z'FunctionArgNamesCheck.visit_functiondef)N)	r3   r4   r5   rK   r   r   r   r   r   r   r   r   r   r   g  s   
 r   c               @   s2   e Zd ZdZdZdZdZdZdZd
dd	Z	e	Z
dS )ImportAsCheckz:
    Don't change the naming convention via an import
    z5constant '{name}' imported as non constant '{asname}'z7lowercase '{name}' imported as non lowercase '{asname}'z3camelcase '{name}' imported as lowercase '{asname}'z2camelcase '{name}' imported as constant '{asname}'z1camelcase '{name}' imported as acronym '{asname}'Nc             c   s   x|j D ]}|j}|sq|j}||d}| rL| s| j|df|V  q| rt| |kr| j|df|V  q| r| j|df|V  q| rdtt	j||kr| j|df|V  q| j|df|V  qW d S )N)rF   asnameN811N812N813 N817N814)
r   r   rF   r   rL   islowerr}   joinfilterstr)rB   r   r\   rH   rF   r   original_nameZ
err_kwargsr   r   r   visit_importfrom  s$    
zImportAsCheck.visit_importfrom)N)r3   r4   r5   rK   r   r   r   r   r   r   Zvisit_importr   r   r   r   r     s   
r   c               @   s   e Zd ZdZdZdZdZdd Zedd Z	dd
dZ
dd ZeZdd ZeZdd ZeZdd Zdd Ze Z ZZedd Zedd Zedd Zd	S )VariablesCheckzO
    Class attributes and local variables in functions should be lowercase
    z1variable '{name}' in function should be lowercasez8variable '{name}' in class scope should not be mixedCasez9variable '{name}' in global scope should not be mixedCasec             c   s   xBt |D ]0}t|tjr"| j}P t|tr
t| j|}P q
W | j}x:t	|D ].}t
||r^qN||}|rN| j|||dV  qNW d S )N)rF   )reversedr   r	   r;   class_variable_checkr?   r   function_variable_checkglobal_variable_check_extract_namesrI   rL   )rB   assignment_targetr\   rH   Zparent_funccheckerrF   Z
error_coder   r   r   _find_errors  s    

zVariablesCheck._find_errorsc             C   sN   t | tjrJt | jtjr,| jjdkrJdS nt | jtjrJ| jjdkrJdS dS )N
namedtupleTF)r   r	   r   r   r   r   r~   r   )Z
node_valuer   r   r   is_namedtupe  s    zVariablesCheck.is_namedtupeNc             c   sB   |  |jrd S x,|jD ]"}x| |||D ]
}|V  q,W qW d S )N)r   r   targetsr   )rB   r   r\   rH   targetrw   r   r   r   visit_assign  s
    zVariablesCheck.visit_assignc             c   s4   |  |jrd S x| |j||D ]
}|V  q"W d S )N)r   r   r   r   )rB   r   r\   rH   rw   r   r   r   visit_namedexpr  s    zVariablesCheck.visit_namedexprc             c   s\   t r(x| |j||D ]
}|V  qW d S x.|jD ]$}x| |j||D ]
}|V  qFW q0W d S )N)PY2r   Zoptional_varsitems)rB   r   r\   rH   rw   itemr   r   r   
visit_with  s    
zVariablesCheck.visit_withc             c   s$   x|  |j||D ]
}|V  qW d S )N)r   r   )rB   r   r\   rH   rw   r   r   r   	visit_for  s    zVariablesCheck.visit_forc             c   s(   |j r$x| |||D ]
}|V  qW d S )N)rF   r   )rB   r   r\   rH   rw   r   r   r   visit_excepthandler  s    z"VariablesCheck.visit_excepthandlerc             c   s4   x.|j D ]$}x| |j||D ]
}|V  qW qW d S )N)
generatorsr   r   )rB   r   r\   rH   genrw   r   r   r   visit_generatorexp  s    z!VariablesCheck.visit_generatorexpc             C   s   t | rdS d S )NN816)is_mixed_case)rF   r   r   r   r   
  s    z$VariablesCheck.global_variable_checkc             C   s   t | rdS d S )NN815)r   )rF   r   r   r   r     s    z#VariablesCheck.class_variable_checkc             C   s"   || j krd S | |krd S dS )NN806)r   r}   )r   var_namer   r   r   r     s
    
z&VariablesCheck.function_variable_check)N)r3   r4   r5   rK   r   r   r   r   rO   r   r   r   Zvisit_annassignr   Zvisit_asyncwithr   Zvisit_asyncforr   r   Zvisit_listcompZvisit_dictcompZvisit_setcompr   r   r   r   r   r   r   r     s&   
r   c             c   s  t | }|tjkr| jV  n|tjtjfkrx| jD ]r}t |}|tjkrT|jV  q4|tjtjfkr~x@t|D ]
}|V  qnW q4ts4|tj	kr4xt|j
D ]
}|V  qW q4W nl|tjkrtrt| jtjrx@| jjD ]}|jV  qW n&t| jtjr| jjV  n
| jjV  n| jV  dS )zYield assignment_target ids.N)r   r	   r~   r   r   Listr   r   r   Starredr   ExceptHandlerr   rF   r   r   )r   Ztarget_typeelementZelement_typenrF   r   r   r   r     s.    



r   c             C   s"   |   | ko | dd d  S )Nr   r8   )r}   lstripr   )rF   r   r   r   r   =  s    r   ):rK   syscollectionsr   r   	functoolsr   	itertoolsr   Zflake8r   Zflake8_polyfillr   r	   r   ImportErrorZflake8.utilr   version_infor<   r   ro   r   r   IfWhileForWithr   FunctionDefr?   Z	TryExceptZ
TryFinallyTryAsyncFunctionDef	AsyncWithAsyncForr   r   r   r%   rD   rI   objectrJ   rM   rh   ri   rj   rZ   r[   r   r   r   r   r   r   r   r   r   r   r   <module>   sx   
	


		 "(/"e 