
    G                        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\R&                  5      r " S S\
R*                  5      r " S S\R.                  " \R0                  \5      5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)z6Utilities for creating/parsing update argument groups.    )absolute_import)division)unicode_literalsN)arg_parsers)arg_parsers_usage_text)base)util)	arg_utils)yaml_command_schema_utilc                   $    \ rS rSrSrSrSrSrSrg)Prefix(   addupdateremoveclear N)	__name__
__module____qualname____firstlineno__ADDUPDATEREMOVECLEAR__static_attributes__r       7lib/googlecloudsdk/command_lib/util/apis/update_args.pyr   r   (   s    #&&
%r   r   c                   B   ^  \ rS rSrSrU 4S jr\S 5       rS rSr	U =r
$ )_ConvertValueType/   zWraps flag types in arg_utils.ConvertValue while maintaining help text.

Attributes:
  arg_gen: UpdateBasicArgumentGenerator, update argument generator
c                    > [         [        U ]  UR                  5        UR                  U l        UR
                  U l        UR                  U l        UR                  U l        g N)	superr    __init__	flag_typefieldrepeated	processorchoices_choices)selfarg_gen	__class__s     r   r%   _ConvertValueType.__init__6   sI    	
T+G,=,=>DJ$$DM&&DNOODMr   c                     U R                   (       a1  U R                    Vs0 s H  oR                  UR                  _M     sn$ gs  snf )zsReturns a map of choice values to choice help text.

Used in help text generation and not in actual input parsing.
N)r+   	arg_value	help_text)r,   choices     r   r*   _ConvertValueType.choices=   s<     }}?C}}M}V 0 00}MM Ns    Ac           	          U R                  U5      n[        R                  " U R                  UU R                  U R
                  [        R                  R                  U R                  5      S9$ )z&Converts arg_value into type arg_type.)r(   r)   r*   )
arg_typer
   ConvertValuer'   r(   r)   r	   ChoiceToChoiceMapr+   )r,   r1   values      r   __call___ConvertValueType.__call__H   sQ    MM)$E!!

..''6 r   )r+   r'   r)   r(   )r   r   r   r   __doc__r%   propertyr*   r;   r   __classcell__r.   s   @r   r    r    /   s+    $  	 	r   r    c                       \ rS rSrSrS r  SS jr\S 5       r\S 5       r	\S 5       r
\S	 5       rSS
 jr\R                  S 5       r\R                  S 5       rS rS rS rS rS rSrg)UpdateArgumentGeneratorT   a<  Update flag generator.

To use this base class, provide required methods for parsing
(GetArgFromNamespace and GetFieldValueFromNamespace) and override
the flags that are needed to update the value. For example, if argument
group requires a set flag, we would override the `set_arg` property and
ApplySetFlag method.
c                 x    U(       a  U$ [        U[        5      (       a  g[        U[        5      (       a  gUc  gU$ )Nz	empty mapz
empty listnull)
isinstancedictlist)r,   r:   s     r   _GetTextFormatOfEmptyValue2UpdateArgumentGenerator._GetTextFormatOfEmptyValue^   s7    l%%}Lr   Nc                    [         R                  " X=(       a    UR                  5      n[        R                  " XtUS9nUS:X  a  U$ X8R
                  S'   [         R                  " XSU5      =n	(       a  XR
                  S'   U$ )aN  Creates a flag.

Args:
  arg_name: str, root name of the arg
  flag_prefix: Prefix | None, prefix for the flag name
  flag_type: func, type that flag is used to convert user input
  action: str, flag action
  metavar: str, user specified metavar for flag
  help_text: str, flag help text

Returns:
  base.Argument with correct params
)actionhelp
store_truetypemetavar)r
   GetFlagNamer:   r   Argumentkwargs
GetMetavar)
r,   arg_nameflag_prefixr&   rL   rP   r2   	flag_nameargflag_metavars
             r   _CreateFlag#UpdateArgumentGenerator._CreateFlagk   st    " %%3+"3"35I
--	y
ACj"JJv ++G	JJ|J*jjJr   c                     g)z'Flag that sets field to specifed value.Nr   r,   s    r   set_argUpdateArgumentGenerator.set_arg        r   c                     g)zFlag that clears field.Nr   r]   s    r   	clear_arg!UpdateArgumentGenerator.clear_arg   r`   r   c                     g)z2Flag that updates value if part of existing field.Nr   r]   s    r   
update_arg"UpdateArgumentGenerator.update_arg   r`   r   c                     g)z2Flag that removes value if part of existing field.Nr   r]   s    r   
remove_arg"UpdateArgumentGenerator.remove_arg   r`   r   c                    [         R                  " SSU R                  SR                  U R                  5      S9nU R
                  (       a  UR                  U R
                  5        [         R                  " SS9nU R                  (       a  UR                  U R                  5        [         R                  " SSS9nU R                  (       a  UR                  U R                  5        U R                  (       a  UR                  U R                  5        UR                  (       a  UR                  U5        UR                  (       a  UR                  U5        U(       d  U$ [         R                  " SU R                  SR                  U R                  5      S9nUR                  U5        U H  nUR                  U5        M     U$ )	a$  Returns ArgumentGroup with all flags specified in generator.

ArgumentGroup is returned where the set flag is mutually exclusive with
the rest of the update flags. In addition, remove and clear flags are
mutually exclusive. The following combinations are allowed

# sets the foo value to value1,value2
{command} --foo=value1,value2

# adds values value3
{command} --add-foo=value3

# clears values and sets foo to value4,value5
{command} --add-foo=value4,value5 --clear

# removes value4 and adds value6
{command} --add-foo=value6 --remove-foo=value4

# removes value6 and then re-adds it
{command} --add-foo=value6 --remove-foo=value6

Args:
  additional_flags: [base.Argument], list of additional arguments needed
    to udpate the value

Returns:
  base.ArgumentGroup, argument group containing flags
TFz
Update {}.)mutexrequiredhiddenrM   )rl   )rk   rl   z"All arguments needed to update {}.)rl   rm   rM   )r   ArgumentGroup	is_hiddenformatrU   r^   AddArgumentre   rb   rh   	arguments)r,   additional_flags
base_groupupdate_groupclear_groupwrapper_grouprX   s          r   Generate UpdateArgumentGenerator.Generate   sL   : ##~~  /	J ||T\\*%%u5Lt/$$4%@K~~dnn-doo.{+\*&&~~188GM
 j)$  r   c                     g)zRetrieves namespace value associated with flag.

Args:
  namespace: The parsed command line argument namespace.
  arg: base.Argument, used to get namespace value

Returns:
  value parsed from namespace
Nr   r,   	namespacerX   s      r   GetArgFromNamespace+UpdateArgumentGenerator.GetArgFromNamespace   s     	r   c                     g)zRetrieves existing field from message.

Args:
  existing_message: apitools message we need to get field value from

Returns:
  field value from apitools message
Nr   )r,   existing_messages     r   GetFieldValueFromMessage0UpdateArgumentGenerator.GetFieldValueFromMessage   s     	r   c                     U$ )z@Updates result to new value (No-op: implementation in subclass).r   )r,   existing_valunused_set_vals      r   ApplySetFlag$UpdateArgumentGenerator.ApplySetFlag       r   c                     U$ )z:Clears existing value (No-op: implementation in subclass).r   )r,   r   unused_clear_flags      r   ApplyClearFlag&UpdateArgumentGenerator.ApplyClearFlag   r   r   c                     U$ )z;Removes existing value (No-op: implementation in subclass).r   )r,   r   unused_remove_vals      r   ApplyRemoveFlag'UpdateArgumentGenerator.ApplyRemoveFlag  r   r   c                     U$ )z;Updates existing value (No-op: implementation in subclass).r   )r,   r   unused_update_vals      r   ApplyUpdateFlag'UpdateArgumentGenerator.ApplyUpdateFlag  r   r   c                    U R                  U5      nU R                  XR                  5      U R                  XR                  5      U R                  XR                  5      U R                  XR
                  5      4u  pEpgU R                  X55      nU R                  X65      nU R                  X45      nU R                  X75      nU$ )a  Parses update flags from namespace and returns updated message field.

Args:
  namespace: The parsed command line argument namespace.
  existing_message: Apitools message that exists for given resource.

Returns:
  Modified existing apitools message field.
)
r   r}   r^   rb   rh   re   r   r   r   r   )r,   r|   r   result	set_valueclear_valueremove_valueupdate_values           r   ParseUpdateArgumentGenerator.Parse
  s     **+;<F  LL9  NN;  OO<  OO<	:6IL   5F!!&7F v1F!!&7FMr   r   )NNNNNr#   )r   r   r   r   r=   rI   rZ   r>   r^   rb   re   rh   rx   abcabstractmethodr}   r   r   r   r   r   r   r   r   r   r   rB   rB   T   s     @D"<        @F 
	 
	 		 		r   rB   c                   f   ^  \ rS rSrSr\S 5       r          S	U 4S jjrS rS r	S r
SrU =r$ )
UpdateBasicArgumentGeneratori,  z'Update flag generator for simple flags.c                    [         R                  " X!5      u  p4UR                  c  UR                  OUR                  n[         R                  " U5      nU[         R                  R
                  :X  a  [        nOU(       a  [        nO[        nU" UR                  UUUUR                  UR                  UR                  UR                  UR                  UR                  UR                  S9$ )a  Creates a flag generator from yaml arg data and request message.

Args:
  arg_data: yaml_arg_schema.Argument, data about flag being generated
  field: messages.Field, apitools field instance.

Returns:
  UpdateArgumentGenerator, the correct version of flag generator
)rU   r&   r'   rL   ro   r2   	api_fieldr(   r)   r*   rP   )r
   GenerateFlagTyper(   GetFieldType	FieldTypeMAPUpdateMapArgumentGeneratorUpdateListArgumentGeneratorUpdateDefaultArgumentGeneratorrU   rm   r2   r   r)   r*   rP   )clsarg_datar'   r&   rL   is_repeated
field_typegen_clss           r   FromArgData(UpdateBasicArgumentGenerator.FromArgData/  s     "225CI #++39J9J  ''.JY((,,,*g	+g.g""//$$$$""$$     r   c                    > [         [        U ]  5         [        R                  " U5      U l        X0l        X l        X@l        XPl	        X`l
        Xpl        Xl        Xl        Xl        Xl        g r#   )r$   r   r%   format_utilNormalizeFormatrU   r'   r&   rL   ro   r2   r   r(   r)   r*   rP   )r,   rU   r&   r'   rL   ro   r2   r   r(   r)   r*   rP   r.   s               r   r%   %UpdateBasicArgumentGenerator.__init__V  sW     

&68//9DMJNKNNNMNLLr   c                 J    Uc  g [         R                  " XR                  5      $ r#   )r
   GetFromNamespacenamer{   s      r   r}   0UpdateBasicArgumentGenerator.GetArgFromNamespaceq  s    
{%%i::r   c                     U(       a!  [         R                  " XR                  5      nOSn[        U[        5      (       a  UR                  5       nU$ )z&Retrieves existing field from message.N)r
   r   r   rF   rH   copy)r,   r   existing_values      r   r   5UpdateBasicArgumentGenerator.GetFieldValueFromMessagev  sD     99
NNn n.$''%**,nr   c                 >    U R                   " SSU R                  0UD6$ )NrU   r   )rZ   rU   )r,   rS   s     r   _CreateBasicFlag-UpdateBasicArgumentGenerator._CreateBasicFlag  s    =T]]=f==r   )rL   r   rU   r*   r'   r&   r2   ro   rP   r)   r(   )
NNNFNNFNNN)r   r   r   r   r=   classmethodr   r%   r}   r   r   r   r?   r@   s   @r   r   r   ,  sR    /$ $R 6;
> >r   r   c                   T    \ rS rSrSr\S 5       r\S 5       r\S 5       rS r	S r
Srg	)
r   i  z(Update flag generator for simple values.c                     g r#   r   r]   s    r   _empty_value+UpdateDefaultArgumentGenerator._empty_value  s    r   c                     U R                  [        U 5      U R                  U R                  SR	                  U R
                  5      S9$ NzSet {} to new value.)r&   rL   rP   r2   r   r    rL   rP   rp   rU   r]   s    r   r^   &UpdateDefaultArgumentGenerator.set_arg  B      #D){{(//>	 !  r   c           
          U R                  [        R                  SSR                  U R                  U R                  U R                  5      5      S9$ NrN   zClear {} value and set to {}.)rV   rL   r2   r   r   r   rp   rU   rI   r   r]   s    r   rb   (UpdateDefaultArgumentGenerator.clear_arg  M      LL188MM4::4;L;LMO !  r   c                     Ub  U$ U$ r#   r   r,   r   set_vals      r   r   +UpdateDefaultArgumentGenerator.ApplySetFlag      nr   c                 ,    U(       a  U R                   $ U$ r#   r   r,   r   
clear_flags      r   r   -UpdateDefaultArgumentGenerator.ApplyClearFlag      r   r   N)r   r   r   r   r=   r>   r   r^   rb   r   r   r   r   r   r   r   r     sI    0     
r   r   c                       \ rS rSrSr\S 5       r\S 5       r\S 5       r\S 5       r	\S 5       r
S rS	 rS
 rS rS rSrg)r   i  zUpdate flag generator for list.c                     / $ r#   r   r]   s    r   r   (UpdateListArgumentGenerator._empty_value      Ir   c                     U R                  [        U 5      U R                  U R                  SR	                  U R
                  5      S9$ r   r   r]   s    r   r^   #UpdateListArgumentGenerator.set_arg  r   r   c           
          U R                  [        R                  SSR                  U R                  U R                  U R                  5      5      S9$ r   r   r]   s    r   rb   %UpdateListArgumentGenerator.clear_arg  r   r   c                     U R                  [        R                  [        U 5      U R                  SR                  U R                  5      S9$ )NzAdd new value to {} list.rV   r&   rL   r2   )r   r   r   r    rL   rp   rU   r]   s    r   re   &UpdateListArgumentGenerator.update_arg  sB      JJ#D){{-44T]]C	 !  r   c                     U R                  [        R                  [        U 5      U R                  SR                  U R                  5      S9$ )Nz#Remove existing value from {} list.r   )r   r   r   r    rL   rp   rU   r]   s    r   rh   &UpdateListArgumentGenerator.remove_arg  sB      MM#D){{7>>t}}M	 !  r   c                    ^ ^ [        T R                  [        R                  5      (       a  [	        UU 4S jU 5       5      $ TU;   $ )Nc              3   \   >#    U  H!  nTR                   R                  TU5      v   M#     g 7fr#   )r&   Matches).0valnew_valr,   s     r   	<genexpr>;UpdateListArgumentGenerator._ContainsVal.<locals>.<genexpr>  s)      D:B3$..
 
 #
.
.(s   ),)rF   r&   r	   EquitableTypeany)r,   r   all_valss   `` r   _ContainsVal(UpdateListArgumentGenerator._ContainsVal  sE    $..$"4"455 D:BD D D   r   c                     Ub  U$ U$ r#   r   r   s      r   r   (UpdateListArgumentGenerator.ApplySetFlag  r   r   c                 ,    U(       a  U R                   $ U$ r#   r   r   s      r   r   *UpdateListArgumentGenerator.ApplyClearFlag  r   r   c                 j    Ub*  U Vs/ s H  o0R                  X25      (       a  M  UPM     sn$ U$ s  snf r#   r   )r,   r   
remove_valxs       r   r   +UpdateListArgumentGenerator.ApplyRemoveFlag  s>    !K!):):1)I!\K KKs   00c                 p    Ub-  U Vs/ s H  o0R                  X15      (       a  M  UPM     nnX-   $ U$ s  snf r#   r   )r,   r   
update_valr   new_valss        r   r   +UpdateListArgumentGenerator.ApplyUpdateFlag  sF    K'8'8'I!Z  K$$Ks   33r   N)r   r   r   r   r=   r>   r   r^   rb   re   rh   r   r   r   r   r   r   r   r   r   r   r     s    '         !

r   r   c                       \ rS rSrSr\S 5       r\S 5       rS rS r	\S 5       r
\S 5       r\S	 5       r\S
 5       rS rS rS rS rSrg)r   i  z>Update flag generator for key-value pairs ie proto map fields.c                     0 $ r#   r   r]   s    r   r   'UpdateMapArgumentGenerator._empty_value  r   r   c                 P    U R                   R                  [        R                  :H  $ r#   )r'   r   r
   ADDITIONAL_PROPSr]   s    r   _is_list_field)UpdateMapArgumentGenerator._is_list_field  s    ::??i8888r   c                     U R                   (       a  U$ U R                  R                  5       n[        R                  " U[        R
                  U5        U$ )zWraps field AdditionalProperties in apitools message if needed.

Args:
  output_list: list of apitools AdditionalProperties messages.

Returns:
  apitools message instance.
)r  r'   rO   r
   SetFieldInMessager  )r,   output_listmessages      r   _WrapOutput&UpdateMapArgumentGenerator._WrapOutput   sC     jjooG++[:Nr   c                     U(       d  / $ U R                   (       a  U$ [        R                  " U[        R                  5      $ )zRetrieves AdditionalProperties field value.

Args:
  field: apitools instance that contains AdditionalProperties field

Returns:
  list of apitools AdditionalProperties messages.
)r  r
   r   r  )r,   r'   s     r   _GetPropsFieldValue.UpdateMapArgumentGenerator._GetPropsFieldValue  s3     il--eY5O5OPPr   c                     U R                  [        U 5      U R                  U R                  SR	                  U R
                  5      S9$ r   r   r]   s    r   r^   "UpdateMapArgumentGenerator.set_arg  r   r   c           
          U R                  [        R                  SSR                  U R                  U R                  U R                  5      5      S9$ r   r   r]   s    r   rb   $UpdateMapArgumentGenerator.clear_arg(  r   r   c                     U R                  [        R                  [        U 5      U R                  SR                  U R                  5      S9$ )Nz&Update {} value or add key value pair.r   )r   r   r   r    rL   rp   rU   r]   s    r   re   %UpdateMapArgumentGenerator.update_arg1  sE      MM#D){{:AAMM
	 !  r   c                    U R                   (       a  U R                  nO9[        R                  " U R                  R                  [        R
                  5      n[        R                  " UR                  S5      nUR                  =(       d)    [        R                  R                  UR                  5      n[        R                  " USS9nU R                  [        R                  USSR                  U R                  5      S9$ )NkeyT)
value_typer(   storez"Remove existing value from map {}.r   )r  r'   r
   GetFieldFromMessagerO   r  TYPESgetvariantr   	ArgObjectr   r   r   rp   rU   )r,   r'   	key_fieldkey_typekey_lists        r   rh   %UpdateMapArgumentGenerator.remove_arg<  s    jje++
**//955e --ejj%@I~~G!4!4Y5F5F!GH$$d,H   MM6==dmmL	 !  r   c                     Ub  U$ U$ r#   r   r   s      r   r   'UpdateMapArgumentGenerator.ApplySetFlagQ  r   r   c                 6    U(       a  U R                  / 5      $ U$ r#   )r  r   s      r   r   )UpdateMapArgumentGenerator.ApplyClearFlagV  s    b!!r   c                    Ub}  U R                  U5      nU R                  U5      n[        U Vs/ s H  oUR                  PM     sn5      nU Vs/ s H  oUR                  U;  d  M  UPM     nnU R                  Xt-   5      $ U$ s  snf s  snf r#   )r  setr  r  )r,   r   r   r
  update_val_listr   update_key_setdeduped_lists           r   r   *UpdateMapArgumentGenerator.ApplyUpdateFlag[  s    ,,\:k00<o?;?aEE?;<n!,LA^0KalLl<== <Ls   BB&Bc                     UbO  U R                  U5      n[        U5      nU R                  U Vs/ s H  oUR                  U;  d  M  UPM     sn5      $ U$ s  snf r#   )r  r)  r  r  )r,   r   r   r
  remove_val_setr   s         r   r   *UpdateMapArgumentGenerator.ApplyRemoveFlagd  s]    ,,\:k:n!
AkUU.%@1k
AC C Bs   AAr   N)r   r   r   r   r=   r>   r   r  r  r  r^   rb   re   rh   r   r   r   r   r   r   r   r   r   r     s    F  9 9 Q        (

r   r   )r=   
__future__r   r   r   r   enumgooglecloudsdk.callioper   r   
usage_textr    googlecloudsdk.calliope.conceptsr	   r   $googlecloudsdk.command_lib.util.apisr
   r   sixEnumr   DefaultArgTypeWrapperr    with_metaclassABCMetaobjectrB   r   r   r   r   r   r   r   <module>r=     s    = &  ' 
  / H ( @ : Q 
TYY "
88 "JUc00fE UpX>#: X>v!%A !HG"> GTu!= ur   