
    %                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKJr  SSKJ	r	  SSKJ
r
  SS	KJr  SS
KJr  SSKJr  SSKr " S S\5      r " S S\R&                  5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS r " S S\5      rS r " S S\5      r\/r\\/rS r  " S S \	RB                  5      r"g)!zGA command that validates gcloud flags according to Cloud SDK CLI Style.    )absolute_import)division)unicode_literalsN)arg_parsers)base)
usage_text)
exceptions)log)filesc                       \ rS rSrSrSrg)UnknownCheckException#   z2An exception when unknown lint check is requested. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       lib/surface/meta/lint.pyr   r   #   s    :r   r   c                       \ rS rSrSrSrg)LintException'   zOne or more lint errors found.r   Nr   r   r   r   r   r   '   s    &r   r   c                       \ rS rSrSrS rSrg)	LintError+   zValidation failure.

Attributes:
  name: str, The name of the validation that produced this failure.
  command: calliope.backend.CommandCommon, The offending command.
  msg: str, A message indicating what the problem was.
c                     Xl         X l        SR                  SR                  UR	                  5       5      US9U l        g )Nz[{cmd}]: {msg}.)cmdmsg)namecommandformatjoinGetPathr"   )selfr#   r$   error_messages       r   __init__LintError.__init__4   s8    IL&&HHW__&'] ' <DHr   )r$   r"   r#   N)r   r   r   r   r   r*   r   r   r   r   r   r   +   s    <r   r   c                   *    \ rS rSrSrS rS rS rSrg)Checker;   zThe abstract base class for all the checks.

Attributes:
  name: A string, the name of this Checker.
  description: string, command line description of this check.
c                     g Nr   r(   groups     r   ForEveryGroupChecker.ForEveryGroupC       r   c                     g r0   r   r(   r$   s     r   ForEveryCommandChecker.ForEveryCommandF   r5   r   c                     / $ r0   r   r(   s    r   EndChecker.EndI   s    Ir   r   N)	r   r   r   r   r   r3   r8   r<   r   r   r   r   r-   r-   ;   s    		r   r-   c                   L   ^  \ rS rSrSrSrSrU 4S jrS rS r	S r
S	 rS
rU =r$ )NameCheckerM   zGChecks if group,command and flags names have underscores or mixed case.	NameCheckz4Verifies all existing flags not to have underscores.c                 8   > [         [        U ]  5         / U l        g r0   )superr?   r*   _issuesr(   	__class__s    r   r*   NameChecker.__init__S   s    	+t%'DLr   c                 `   SUR                   ;   aK  U R                  R                  [        [        R
                  USR                  UR                   5      S95        UR                   R                  5       (       dj  UR                   R                  5       (       dK  U R                  R                  [        [        R
                  USR                  UR                   5      S95        UR                  5        GH5  n[        S UR                   5       5      (       d  [        UR                  5      S:w  d  UR                  S   S:w  aZ  U R                  R                  [        [        R
                  US	R                  S
R                  UR                  5      5      S95        UR                   Hz  nSnSU;   a  SU-  nUR                  S5      (       a  UR                  5       (       d  SU-  nU(       d  MI  U R                  R                  [        [        R
                  XS95        M|     GM8     g)z*Run name check for given command or group._z"command name [{0}] has underscoresr#   r$   r)   zcommand name [{0}] mixed casec              3   B   #    U  H  oR                  S 5      v   M     g7f)--N
startswith).0fs     r   	<genexpr>(NameChecker._ForEvery.<locals>.<genexpr>i   s     A-@d##-@s      r   z-hzflag [{0}] has no long form,Nzflag [%s] has underscoresrL   z(long flag [%s] has upper case characters)cli_namerD   appendr   r?   r#   r%   islowerisupperGetSpecificFlagsanyoption_stringslenr&   rN   )r(   cmd_or_groupflagflag_option_stringr"   s        r   	_ForEveryNameChecker._ForEveryW   s    l###
ll)<CC##%& ' !!))++|/D/D/L/L/N/N
ll)7>>##%& ' --/AT-@-@AAAt""#q(D,?,?,Bd,J
,,

i##"9@@((4../12 3
 !% 3 3
$$+.@@#))$//&..00:=OO#3
,,

i##\N O !4 0r   c                 &    U R                  U5        g r0   r`   r1   s     r   r3   NameChecker.ForEveryGroup{       NN5r   c                 &    U R                  U5        g r0   rc   r7   s     r   r8   NameChecker.ForEveryCommand~       NN7r   c                     U R                   $ r0   rD   r;   s    r   r<   NameChecker.End       <<r   rj   r   r   r   r   r   r#   descriptionr*   r`   r3   r8   r<   r   __classcell__rF   s   @r   r?   r?   M   s0    O	$F+"OH r   r?   c                   L   ^  \ rS rSrSrSrSrU 4S jrS rS r	S r
S	 rS
rU =r$ )BadListsChecker   z%Checks command flags that take lists.BadListsz,Verifies all flags implement lists properly.c                 8   > [         [        U ]  5         / U l        g r0   )rC   rr   r*   rD   rE   s    r   r*   BadListsChecker.__init__   s    	/4)+DLr   c                    UR                  5        GH  nUR                  S;  az  U R                  R                  [	        [
        R                  USR                  UR                  S   SR                  [        R                  " UR                  5      5      S9S95        [        UR                  [        R                  5      (       a    g [        UR                  [        R                  5      (       a  UR                   (       dm  UR                  R"                  (       dO  U R                  R                  [	        [
        R                  USR                  UR                  S   S9S95        GM]  GM`  GMc  [        UR                  [        R$                  5      (       d  GM  UR                   (       a  GM  U R                  R                  [	        [
        R                  US	R                  UR                  S   S9S95        GM     g )
N)Nr   rS   zflag [{flg}] has nargs={nargs}r   z'{}')flgnargsrJ   zDdict flag [{flg}] has no metavar and type.spec (at least one needed))rx   z list flag [{flg}] has no metavar)rY   ry   rD   rV   r   rr   r#   r%   r[   six	text_type
isinstancetyper   	ArgObjectArgDictmetavarspecArgList)r(   r]   r^   s      r   r`   BadListsChecker._ForEvery   sx   --/	<	'I %% 077++A. --djj(AB 8 D	F 	G 
DII{44	5	5	DII{22	3	3		
,,

&++&04#6#6q#9:=> !/ dii!4!455|||
,,

i"''"4;;--a0 < 2	4 51 0r   c                 &    U R                  U5        g r0   rc   r1   s     r   r3   BadListsChecker.ForEveryGroup   re   r   c                 &    U R                  U5        g r0   rc   r7   s     r   r8   BadListsChecker.ForEveryCommand   rh   r   c                     U R                   $ r0   rj   r;   s    r   r<   BadListsChecker.End   rl   r   rj   rm   rp   s   @r   rr   rr      s/    -	$>+5@ r   rr   c                      [         R                  R                  [         R                  R                  [        5      S5      n [        S [        R                  " U 5      R                  S5       5       5      $ )z+Returns allowlisted set of gcloud commands.zgcloud_command_vocabulary.txtc              3   V   #    U  H  nUR                  S 5      (       a  M  Uv   M!     g7f)#NrM   )rO   lines     r   rQ   3_GetAllowlistedCommandVocabulary.<locals>.<genexpr>   s%      #Jt__S! dJs   )	)
)	ospathr&   dirname__file__setr   ReadFileContentssplit)vocabulary_files    r    _GetAllowlistedCommandVocabularyr      sY     GGLL!:!@B/	 #--o>DDTJ# 
# #r   c                   F   ^  \ rS rSrSrSrSrU 4S jrS rS r	S r
S	rU =r$ )
VocabularyChecker   z5Checks that command is the list of allowlisted names.AllowlistedNameCheckz+Verifies that every command is allowlisted.c                 V   > [         [        U ]  5         [        5       U l        / U l        g r0   )rC   r   r*   r   
_allowlistrD   rE   s    r   r*   VocabularyChecker.__init__   s"    	
T+-68DODLr   c                     g r0   r   r1   s     r   r3   VocabularyChecker.ForEveryGroup   r5   r   c           	          UR                   U R                  ;  aH  U R                  R                  [	        U R
                  USR                  UR                   5      S95        g g )Nz%command name [{0}] is not allowlistedrJ   )rU   r   rD   rV   r   r#   r%   r7   s     r   r8   !VocabularyChecker.ForEveryCommand   sS    t.
ll)yy?FF ! " /r   c                     U R                   $ r0   rj   r;   s    r   r<   VocabularyChecker.End   rl   r   )r   rD   )r   r   r   r   r   r#   rn   r*   r3   r8   r<   r   ro   rp   s   @r   r   r      s)    =	$=+
	" r   r   c              #      #    U v   [         R                  " U R                  5       H  n[        U5       H  nUv   M	     M     g7f)zVisits each group in the CLI group tree.

Args:
  group: backend.CommandGroup, root CLI subgroup node.
Yields:
  group instance.
N)rz   
itervaluesgroups_WalkGroupTree)r2   	sub_groupvalues      r   r   r      s7      	+>>%,,/i	*k + 0s   AAc                   *    \ rS rSrSrS rS rS rSrg)Linter   zLints gcloud commands.c                     / U l         g r0   _checksr;   s    r   r*   Linter.__init__   s	    DLr   c                 D    U R                   R                  U" 5       5        g r0   )r   rV   )r(   checks     r   AddCheckLinter.AddCheck   s    LL r   c                 z   [        U5       Hr  nU R                   H  nUR                  U5        M     [        R                  " UR
                  5       H'  nU R                   H  nUR                  U5        M     M)     Mt     U R                   VVs/ s H  o3R                  5         H  oUPM     M     snn$ s  snnf )z2Runs registered checks on all groups and commands.)r   r   r3   rz   r   commandsr8   r<   )r(   
group_rootr2   r   r$   issues         r   Run
Linter.Run   s    
+<<%E"  ^^ENN3'\\E



( " 4 ,  $||E|eEE|EEEs   "B7r   N)	r   r   r   r   r   r*   r   r   r   r   r   r   r   r      s    !	Fr   r   c           
          [         R                  " 5       nU  H0  n[        R                  " UR                  UR
                  SSSUS9  M2     UR                  5       $ )N   N   z  )writer)ioStringIOr   WrapWithPrefixr#   rn   getvalue)
check_listbufr   s      r   _FormatCheckListr     sK    
#e

E%%r2tCA  
r   c                   D    \ rS rSrSr\S 5       rS r\S 5       rS r	Sr
g)	Linti  z7Validate gcloud flags according to Cloud SDK CLI Style.c           
      J    U R                  SSS/ S[        [        5      -   S9  g )NchecksCHECKS*zuA list of checks to apply to gcloud groups and commands.
If omitted will run all available checks.
Available Checks:
)r   ry   defaulthelp)add_argumentr   _LINT_CHECKS)parsers    r   Args	Lint.Args  s5    
 |$	%  	&r   c                     U R                   R                  5       nUR                  SS9  [        R	                  X!R
                  5      $ )NT)	recursive)_cli_power_users_only_TopElementLoadAllSubElementsr   _SetupAndRunr   )r(   argsr2   s      r   r   Lint.Run%  s<    &&224E	t,UKK00r   c                 r   [        5       n/ nU(       d  [         H  nUR                  U5        M     OQ[        S [        [        -    5       5      nU H.  nXE;   a  UR                  XT   5        M  UR                  U5        M0     U(       a  [        SSR                  U5      -  5      eUR                  U 5      $ )z9Builds up linter and executes it for given set of checks.c              3   >   #    U  H  nUR                   U4v   M     g 7fr0   )r#   )rO   checkers     r   rQ   $Lint._SetupAndRun.<locals>.<genexpr>5  s        ><g <<
!<s   zUnknown lint checks: %srT   )	r   _DEFAULT_LINT_CHECKSr   dictr   rV   r   r&   r   )r2   r   linterunknown_checksr   available_checkerss         r   r   Lint._SetupAndRun+  s     XFN'% (    >-< > > %&
//,3
4



&	  !
#chh~&>
>@ @ ::er   c                     [         R                  nU H  nUR                  UR                  5        M      U(       a  [	        S5      eg )Nzthere were some lint errors.)r
   outPrintr"   r   )r(   r   resultr   r   s        r   DisplayLint.DisplayD  s9    WWFll599 899 r   r   N)r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r     s5    ?
& 
&1  0:r   r   )#r   
__future__r   r   r   r   r   googlecloudsdk.callioper   r   r   googlecloudsdk.corer	   r
   googlecloudsdk.core.utilr   rz   	Exceptionr   Errorr   objectr   r-   r?   rr   r   r   r   r   r   r   r   Commandr   r   r   r   <module>r      s     N &  ' 	 	 / ( . * # * 
;I ;'J$$ '< < f $5' 5p1g 1h# 4 FV F.  
 4:4<< 4:r   