
    |%                     v   S 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\R:                  5      rg)zGA command that validates gcloud flags according to Cloud SDK CLI Style.    N)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__1   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)Checker8   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.ForEveryGroup@       r   c                     g r-   r   r%   r!   s     r   ForEveryCommandChecker.ForEveryCommandC   r2   r   c                     / $ r-   r   r%   s    r   EndChecker.EndF   s    Ir   r   N)	r   r   r   r   r   r0   r5   r9   r   r   r   r   r*   r*   8   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$ )NameCheckerJ   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 r-   )superr<   r'   _issuesr%   	__class__s    r   r'   NameChecker.__init__P   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>f   s     A-@d##-@s      r   z-hzflag [{0}] has no long form,Nzflag [%s] has underscoresrI   z(long flag [%s] has upper case characters)cli_namerA   appendr   r<   r    r"   islowerisupperGetSpecificFlagsanyoption_stringslenr#   rK   )r%   cmd_or_groupflagflag_option_stringr   s        r   	_ForEveryNameChecker._ForEveryT   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 r-   r]   r.   s     r   r0   NameChecker.ForEveryGroupx       NN5r   c                 &    U R                  U5        g r-   r`   r4   s     r   r5   NameChecker.ForEveryCommand{       NN7r   c                     U R                   $ r-   rA   r8   s    r   r9   NameChecker.End~       <<r   rg   r   r   r   r   r   r    descriptionr'   r]   r0   r5   r9   r   __classcell__rC   s   @r   r<   r<   J   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 r-   )r@   ro   r'   rA   rB   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   rP   zflag [{flg}] has nargs={nargs}r   z'{}')flgnargsrG   zDdict flag [{flg}] has no metavar and type.spec (at least one needed))ru   z list flag [{flg}] has no metavar)rV   rv   rA   rS   r   ro   r    r"   rX   six	text_type
isinstancetyper   	ArgObjectArgDictmetavarspecArgList)r%   rZ   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 r-   r`   r.   s     r   r0   BadListsChecker.ForEveryGroup   rb   r   c                 &    U R                  U5        g r-   r`   r4   s     r   r5   BadListsChecker.ForEveryCommand   re   r   c                     U R                   $ r-   rg   r8   s    r   r9   BadListsChecker.End   ri   r   rg   rj   rm   s   @r   ro   ro      s/    -	$>+5@ r   ro   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)#NrJ   )rL   lines     r   rN   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 r-   )r@   r   r'   r   
_allowlistrA   rB   s    r   r'   VocabularyChecker.__init__   s"    	
T+-68DODLr   c                     g r-   r   r.   s     r   r0   VocabularyChecker.ForEveryGroup   r2   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 allowlistedrG   )rR   r   rA   rS   r   r    r"   r4   s     r   r5   !VocabularyChecker.ForEveryCommand   sS    t.
ll)yy?FF ! " /r   c                     U R                   $ r-   rg   r8   s    r   r9   VocabularyChecker.End   ri   r   )r   rA   )r   r   r   r   r   r    rk   r'   r0   r5   r9   r   rl   rm   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)rw   
itervaluesgroups_WalkGroupTree)r/   	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 r-   _checksr8   s    r   r'   Linter.__init__   s	    DLr   c                 D    U R                   R                  U" 5       5        g r-   )r   rS   )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   r0   rw   r   commandsr5   r9   )r%   
group_rootr/   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    rk   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}   rv   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%   argsr/   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r-   )r    )rL   checkers     r   rN   $Lint._SetupAndRun.<locals>.<genexpr>2  s        ><g <<
!<s   zUnknown lint checks: %srQ   )	r   _DEFAULT_LINT_CHECKSr   dictr   rS   r
   r#   r   )r/   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.DisplayA  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   r   r   googlecloudsdk.callioper   r   r   googlecloudsdk.corer   r   googlecloudsdk.core.utilr   rw   	Exceptionr
   Errorr   objectr   r*   r<   ro   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   