
    k-                     >   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	J
r
JrJr  SSKJr  SSKJr  SSKrSSK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  \R:                  rS\4S jr " S S\R@                  5      r! " S S\!5      r"g)zGBigquery-specific NewCmd wrapper intended for CLI commands to subclass.    N)AnyDictListOptional)app)flags)bq_to_gcloud_command_executor)bq_error)bq_error_utils)
bq_logging)bq_processor_utils)appcommandsreturnc                  b    [        [        R                  =(       d    [        R                  5      $ N)boolFLAGSuse_gce_service_accountservice_account     (platform/bq/frontend/bigquery_command.py_UseServiceAccountr      s&    	## 			
 r   c                     ^  \ rS rSrSrS\S\R                  SS4U 4S jjrS\4U 4S jjr	S	\S\
\R                     4S
 jrSS jrS\\   S\4U 4S jjrS\4S jrS rS\\   S\\\4   S\4S jrS\\   S\\\4   S\4S jrSrU =r$ )NewCmd'   z(Featureful extension of appcommands.Cmd.nameflag_valuesr   Nc                   > [         [        U ]  X5        [        U SS 5      n[	        U[
        R                  5      U l        U R                  (       GaV  UR                  nUR                  n[        UR                  S UR                   5      U l        [	        UR                  UR                  R                  5      (       a  U R                  R!                  S5        [#        U R                  5      U l        U R$                  [#        UR&                  =(       d    / 5      -
  U l        [+        UR,                  S-  5      U l        [+        UR,                  S-  5      U l        U R.                  (       a  [2        R4                  U l        SU l        U R8                  R:                  U l        g [=        U R>                  S5      (       aH  U R>                  R                  [        R>                  R                  L a  [@        RB                  " S5      eg g )NRunWithArgsr         T__func__z5Subclasses of NewCmd must override Run or RunWithArgs)"superr   __init__getattr
isinstancetypes
MethodType
_new_styler#   __code__listco_varnamesco_argcount_full_arg_list__self__	__class__poplen	_max_args__defaults__	_min_argsr   co_flags
_star_args
_star_kwdssysmaxsizesurface_in_shellr    __doc__hasattrRunr   AppCommandsError)selfr   r   run_with_argsfunccoder1   s         r   r%   NewCmd.__init__*   s}   	&$ 3D-6M 0@0@ADO##d]]d !1!12DD4D4D!EFd 
M**M,B,B,L,L	M	M"4../dn~~D,=,=,C(DDdnT]]T12doT]]T12do	"d%%--dl*%%HH!4!44((
A  5 	&r   c                 z   > XR                   ;   a  U R                   U   R                  $ [        [        U ]  U5      $ r   )_command_flagsvaluer$   r   __getattribute__)rA   r   r1   s     r   __getattr__NewCmd.__getattr__F   s8    """  &,,,/55r   flagnamec                 @    XR                   ;   a  U R                   U   $ g r   )rG   )rA   rL   s     r   _GetFlagNewCmd._GetFlagK   s"    &&&  **r   c                    [         R                  " 5        Vs/ s H3  nUR                  S5      (       d  UR                  S5      (       d  M1  UPM5     nnU H  nUR                  S5      (       a  USS OUSS nUR                  S5      S   nU[        ;  a&  [        S	U-  5        [        R                  " S
5        Mg  [        SU-  5        [        R                  " S
5        M     gs  snf )a  Validate flags after command specific flags have been loaded.

This function will run through all values in appcommands._cmd_argv and
pick out any unused flags and verify their validity.  If the flag is
not defined, we will print the flags.FlagsError text and exit; otherwise,
we will print a positioning error message and exit.  Print statements
were used in this case because raising app.UsageError caused the usage
help text to be printed.

If no extraneous flags exist, this function will do nothing.
z---z--nor!   N   =r   zSFATAL Flags parsing error: Unknown command line flag '%s'
Run 'bq help' to get help   zFATAL Flags positioning error: Flag '%s' appears after final command line argument. Please reposition the flag.
Run 'bq help' to get help.)r   GetCommandArgv
startswithsplitr   printr:   exit)rA   funused_flagsflag	flag_names        r   _CheckFlagsNewCmd._CheckFlagsQ   s     ++--A<<c!2 	
-  
 "oof55$qr(48i//#&q)i	%	(*./	 	)+/0	
 	 s   0C&C&argvc                   > U R                  5         [        R                  " SU5        [        R                  U l        U R                  (       d  [        [        U ]'  U5      $ U R                   Vs0 s H  o"U R                  U   R                  _M     nnU R                   Vs0 s H  o"U R                  U   R                  _M     nn U R                  U5      SS nU R                   HC  nU R                  U   R                  n[        XU5        XsU   :X  d  M2  UR                  U5        ME     / nU R                  SU R                     H  n	U R#                  U	5      n
U
b.  U
R                  (       a  UR%                  U
R                  5        ME  U(       a"  UR%                  UR                  S5      5        Mn  ['        SU	< 35        U R(                  (       a  ['        SU R(                  < 35          UR+                  5        H:  u  p[        X
U5        XpR                  U
   l        XJ   U R                  U
   l        M<     g   0 nU R                  U R                   S  HT  n	U R#                  U	5      n
U
b!  U
R                  (       a  U
R                  X'   M8  U(       d  MA  UR                  S5      X'   MV     U(       ap  U R,                  (       d_  ['        SU< 35         UR+                  5        H:  u  p[        X
U5        XpR                  U
   l        XJ   U R                  U
   l        M<     gUR/                  U5        U R
                  (       a_  U R1                  X5      UR+                  5        H:  u  p[        X
U5        XpR                  U
   l        XJ   U R                  U
   l        M<     $ U R3                  X5      UR+                  5        H:  u  p[        X
U5        XpR                  U
   l        XJ   U R                  U
   l        M<     $ s  snf s  snf ! UR+                  5        H:  u  p[        X
U5        XpR                  U
   l        XJ   U R                  U
   l        M<     f = f)a  Run this command.

If self is a new-style command, we set up arguments and call
self.RunWithArgs, gracefully handling exceptions. If not, we
simply call self.Run(argv).

Args:
  argv: List of arguments as strings.

Returns:
  0 on success, nonzero on failure.
zIn NewCmd.Run: %srT   Nr   z.Not enough positional args, still looking for zUsage: z%Too many positional args, still have )r^   loggingdebugr   
debug_mode_debug_moder*   r$   r   r?   rG   rH   presentsetattrr2   r/   r6   rN   appendrX   usageitemsr8   extendRunDebug	RunSafely)rA   r`   r   original_valuesoriginal_presenceargsr]   rH   new_argsargnamer\   new_kwdsr1   s               r   r?   
NewCmd.Runs   s    	MM%t,''D??64$T** ;?:M:M:M$d!!$'---:M   =A<O<O<ODd!!$'///<O  )D  &qr*d**)##I.44'I..


i
(	 +
 h(()94>>:'}}W%
//$**
%
//$((1+
&
gO
PZZ-.( )..0+$E"*/D!',=,CD!) 1= ; h(()9:'}}W%"jj(
T"hhqk(
 ; 
doo4AB )..0+$E"*/D!',=,CD!) 1 ood			}}X0 )..0+$E"*/D!',=,CD!) 1 ~~h1(..0+$E"*/D!',=,CD!) 1YR )..0+$E"*/D!',=,CD!) 1s:   0#P##P	AP CP AP  >P .2P /P AQ(c                      [         R                  " U5      nU R                  U R                  /U-   5      $ ! [         a%  n[        [        R
                  " U5      5      UeSnAff = f)z-Hook for use in cmd.Cmd-based command shells.N)shlexrW   
ValueErrorSyntaxErrorr   EncodeForPrintingr?   _command_name)rA   r`   rp   es       r   
RunCmdLoopNewCmd.RunCmdLoop   sa    @[[d 88T''(4/00  @
44Q78a?@s   7 
A& A!!A&c                     [         R                  " U5      n[        U[        R                  5      (       a  US-  n[        SU R                  < SU< 35        g)Nz Try running "bq init".zException raised in z operation: rT   )r   ry   r'   r
    BigqueryClientConfigurationErrorrX   rz   )rA   r{   messages      r   _HandleErrorNewCmd._HandleError   sK    **1-G!X>>??**g	262D2DgN r   rp   kwdsc                 `   [         R                  " SX5         U R                  " U0 UD6nU$ ! [        [        R
                  R                  4 Ga[  n[        U[        R                  5      (       dg  [        U[        R                  5      (       a  [        U[        R                  5      (       a)  [        U[        R
                  R                  5      (       a  U R                  U5      s SnA$ [        5         [        S5        [        S5        [        R                   (       a  [        S5        [        S5        O[        S5        [        S5        [        5         ["        R$                  " 5         [        5         [        R                   (       d  [&        R(                  " 5          SnAgSnAff = f)	zRun this command in debug mode.zIn NewCmd.RunDebug: %s, %sNz4****************************************************z4**  Unexpected Exception raised in bq execution!  **z4**  --headless mode enabled, exiting.             **z4**  See STDERR for traceback.                     **z4**  --debug_mode enabled, starting pdb.           **rT   )rb   rc   r    BaseExceptiongoogleapiclienterrorsResumableUploadErrorr'   r   
UsageErrorr
   BigqueryErrorBigqueryInterfaceErrorr   rX   r   headless	traceback	print_excpdbpost_mortemrA   rp   r   return_valuer{   s        r   rl   NewCmd.RunDebug   s%   MM.;%%t4t4l8 5 ?11FFG  Q
'
'H2233 H$C$CDD?11FFGG  ##gBCBC	DEDEDEBCgg^^3s#   - %F-BF((F-.B5F((F-c                     [         R                  " SX5         U R                  " U0 UD6nU$ ! [         a  nU R	                  U5      s SnA$ SnAff = f)z;Run this command, turning exceptions into print statements.zIn NewCmd.RunSafely: %s, %sN)rb   rc   r    r   r   r   s        r   rm   NewCmd.RunSafely   sV    MM/<"%%t4t4l
   "q!!"s   - 
AAAA)	r=   re   r/   r4   r6   r*   r8   r9   r<   r   N)__name__
__module____qualname____firstlineno__r=   strr   
FlagValuesr%   rJ   r   
FlagHolderrN   r^   r   intr?   r|   r   r   r   rl   rm   __static_attributes____classcell__r1   s   @r   r   r   '   s    03 U-=-= $ 86c 6
s x0@0@'A  DBDd3i BDC BDH1 1 49  DcN  s  D	DI 	T#s(^ 	 	 	r   r   c                   
  ^  \ rS rSrSrS\4S jrS\\   S\	4U 4S jjr
S\\   S\\\4   S\	4S	 jrSS
 jrS rS\\\4   4S jr  SS\S\S\\   S\\\\4      4S jjr  SS\S\S\\   S\\\\4      4S jjrSrU =r$ )BigqueryCmd   z!Bigquery-specific NewCmd wrapper.r   c                 D   [         R                  R                  (       a  g[        5       (       + =(       ak    [        R
                  R                  [        R                  " 5       5      =(       d-    [        R
                  R                  [        R                  5      (       + $ )z|Returns true if this command requires the init command before running.

Subclasses will override for any exceptional cases.
F)bq_auth_flagsUSE_GOOGLE_AUTHrH   r   ospathexistsbq_utilsGetBigqueryRcFilenamer   credential_filerA   s    r   
_NeedsInitBigqueryCmd._NeedsInit   sb    
 $$**!## 
x5578 	177>>%//0) r   r`   c           
      j  > [         R                  (       a  [          Vs/ s HB  n[         U   R                  (       d  M  [         U   R                  5       R	                  5       PMD     nn[        SR                  [        [        S U 5       5      5      5      5        [        R                  " [        R                  R                  5        [        R                  " SU5        U R!                  5       (       a&  ["        R$                  " S5      R'                  S/5        [(        [*        U ]O  U5      $ s  snf )z9Bigquery commands run `init` before themselves if needed. c              3   6   #    U  H  o(       d  M  Uv   M     g 7fr   r   ).0rZ   s     r   	<genexpr>"BigqueryCmd.Run.<locals>.<genexpr>  s     :9a9s   
	zIn BigqueryCmd.Run: %sinit)r   rd   rf   	serializestriprX   joinsortedsetr   ConfigureLoggingbq_flagsAPILOGrH   rb   rc   r   r   GetCommandByNamer?   r$   r   )rA   r`   rZ   	cmd_flagsr1   s       r   r?   BigqueryCmd.Run  s     05051q9I9I
&%(



$
$
&   CHHVC:9::;<= 5 56MM*D1""6*..x8d'--s
   D0)D0rp   r   c                    [         R                  " SX5         U R                  " U0 UD6nU$ ! [         a  nUR                  n SnAU$ SnAf[
         a(  n[        R                  " X@R                  S9s SnA$ SnAff = f)zCRun this command, printing information about any exceptions raised.z In BigqueryCmd.RunSafely: %s, %sN)r   )	rb   rc   r    
SystemExitrD   r   r   process_errorrz   r   s        r   rm   BigqueryCmd.RunSafely  s{    MM4dAF%%t4t4l
 	  VVl   F))!2D2DEEFs&   - 
A>A		A>A93A>9A>c                     [         R                  R                  S;   a  [        R                  " U5        g[
        R                  " U5      n[        SU R                  < SU< 35        g)zPrint a simple status line.)
prettyjsonjsonzSuccessfully started r   N)	r   FORMATrH   r   PrintFormattedJsonObjectr   ConstructObjectReferencerX   rz   )rA   job	references      r   PrintJobStartInfoBigqueryCmd.PrintJobStartInfo  sF     66'',$==cBiD,>,>	JKr   c                 F    [         R                  " U R                  U5        g r   )r   ProcessBigqueryrcSectionrz   )rA   fvs     r   _ProcessCommandRcBigqueryCmd._ProcessCommandRc'  s    %%d&8&8"=r   c                     0 $ )a  Parses flags for the command that are shared with all resources.

This is intended to be implemented by any subclass that needs it.

Returns:
  A dictionary of command flags that are shared with all resources in the
  command. For example `max_results` in the list command.
r   r   s    r   'ParseCommandFlagsSharedWithAllResources3BigqueryCmd.ParseCommandFlagsSharedWithAllResources*  s	     Ir   resource
bq_command
identifiercommand_flags_for_this_resourcec                     g r   r   )rA   r   r   r   r   s        r   PossiblyDelegateToGcloudAndExit+BigqueryCmd.PossiblyDelegateToGcloudAndExit5  s     	r   c                     0 U=(       d    0 EU R                  5       En[        R                  " UUUUS9n[        R                  " U5        g )N)bq_command_flagsr   )r   r	   run_bq_command_using_gcloudr:   rY   )rA   r   r   r   r   r   	exit_codes          r   DelegateToGcloudAndExit#BigqueryCmd.DelegateToGcloudAndExit>  sT    *0b

6
6
8 .II)	I HHYr   r   r   )NN)r   r   r   r   r=   r   r   r   r   r   r?   r   r   rm   r   r   r   r   r   r   r   r   r   s   @r   r   r      s    )
$ 
.d3i .C .	DI 	T#s(^ 	 	L>	tCH~ 	 #'BF		 	 3-		
 (0S#X'?	 #'BF  3-	
 (0S#X'? r   r   )#r=   rb   r   r   rv   r:   r   r(   typingr   r   r   r   abslr   r   r   r   r   r   gcloud_wrapperr	   utilsr
   r   r   r   pyglibr   r   r   r   Cmdr   r   r   r   r   <module>r      s}    M  	 
  
   , ,       8     $ D L[__ L^Y& Yr   