
    
7                        d 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 ddl
mZ dd	l
mZ dd
lmZ ddlmZ d Zd Zd Zd Z G d dej,                        Z G d de      Z G d de      Z G d de      Z G d de      Zy)z?Utilities for creating/parsing update resource argument groups.    )absolute_import)division)unicode_literals)base)util)	arg_utils)update_args)yaml_command_schema_util)concept_parsers)	resourcesc                     | j                   j                         D cg c]  \  }}t        j                  |v r| }}}|sy|d   S c c}}w )z@Gets message field where the resource's relative name is mapped.Nr   )resource_method_paramsitemsr   REL_NAME_FORMAT_KEY)arg_datakeyvalue
api_fieldss       @lib/googlecloudsdk/command_lib/util/apis/update_resource_args.py_GetRelativeNameFieldr   &   s\     !77==??*#u		!	!U	* 
?  
 
	As   Ac                     t               }t        d | j                  D              }| j                  j                         D ]-  \  }}|| j                  v s||v s||v r|j                  |       / t        |      S )z.Gets a list of all shared resource attributes.c              3   4   K   | ]  }|j                     y wN)name).0attrs     r   	<genexpr>z+_GetSharedAttributeFlags.<locals>.<genexpr>6   s     <+;4TYY+;s   )setanchorsattribute_to_flag_mapr   ignored_flagsaddlist)r   shared_resource_flagsr!   anchor_names	attr_name	flag_names         r   _GetSharedAttributeFlagsr(   3   s{    %-<8+;+;<<,&<<BBDiX+++**\!i  E 
m	    c                       fd}|S )z+Gets a function to generate a resource arg.c                 p    |dz  }j                   r|j                   z  }j                  | ||      S )Nz

)presentation_flag_nameflag_name_overrider$   
group_help)r.   GenerateResourceArg)r   r.   r-   r   r!   resource_collections      r   ArgGenz(_GetResourceArgGenerator.<locals>.ArgGenE   sM    &JH'''j''#-+ (  r)    )r   r0   r!   r1   s   ``` r   _GetResourceArgGeneratorr3   B   s    
 
-r)   c                     t        | |d      } |ddd      j                  d      }|j                         D cg c]  }|j                  |v r| c}S c c}w )zHGenerates a list of flags needed to generate more than one resource arg.Nz	--current )r3   GetInfoGetAttributeArgsr   )r   r0   shared_flag_namesarg_genresource_arg_infoargs         r   _GenerateSharedFlagsr<   S   ss     %#T+' 2t$W[1  '779
9c	&	& 
9
  
s   Ac                   t     e Zd ZdZe	 	 d
d       Z	 	 	 	 	 	 	 	 d fd	Zd ZddZd Z	d Z
d Z fd	Z xZS )UpdateResourceArgumentGenerator(Update flag generator for resource args.c                 |   |j                   r|j                  rt        }n,|j                   rt        }n|j                  rt        }nt
        }|j                  ||      }|j                  |      }|r$t        j                  dj                  |            t        |      }|s$t        j                  dj                  |            |xs g }	t        ||	      }
|
|	z   } ||t        |||      ||j                  |j                  |t        |||
      |j                   D cg c]  }|j"                   c}      S c c}w )Nz[{} is a primary resource. Primary resources are required and cannot be listed as clearable.z{} does not specify the message field where the relative name is mapped in resource_method_params. Message field name is needed in order add update args. Please update resource_method_params.)r,   r9   	api_fieldrepeatedcollections
is_primaryshared_attribute_flagsr%   )	multityperB   ,UpdateMultitypeListResourceArgumentGenerator(UpdateMultitypeResourceArgumentGenerator#UpdateListResourceArgumentGenerator&UpdateDefaultResourceArgumentGeneratorGetPresentationFlagNameIsPrimaryResourcer   InvalidSchemaErrorformatr   r(   r3   rC   r<   r   r   )clsr   method_resource_collectionis_list_methodr$   gen_clsr,   rD   rA   shared_flagsrE   all_shared_flagsr   s                r   FromArgDataz+UpdateResourceArgumentGenerator.FromArgDataf   sV   
 h//<g			8g			3g6g%=="N4++,FGJ##++162H+I 
 &h/I##$ %+F+A$B	  ).BL5,  .<5(02BD""((  402H J,4,<,<=,<Ddii,<=  >s   D9c
                     t         t        |           t        j                  |      | _        || _        || _        || _        || _	        |xs g | _
        || _        |xs g | _        |	xs g | _        y r   )superr>   __init__format_utilNormalizeFormatarg_namer9   	is_hiddenrA   rB   rC   rD   rE   r%   )selfr,   r9   r\   rA   rB   rC   rD   rE   r%   	__class__s             r   rX   z(UpdateResourceArgumentGenerator.__init__   sr     

)49;// DMDLDNDNDM"(bD DO"8">BD$*Dr)   c                 ~    t        | j                        dkD  r|}n| j                  }t        j                  ||      S )N   flag_prefix)lenr%   r[   r   GetFlagName)r]   r&   flag_prefix_value	base_names       r   _GetAnchorFlagz.UpdateResourceArgumentGenerator._GetAnchorFlag   s7    
4!i--i  8IJJr)   c                     |xr |j                   }t        j                  | j                  |      }| j                  D ci c]  }|| j                  ||       }}| j                  |||      S c c}w )Nra   )r.   r-   )r   r   rd   r[   r%   rg   r9   )r]   rb   r.   prefixr'   anchor_namer-   s          r   _CreateResourceFlagz3UpdateResourceArgumentGenerator._CreateResourceFlag   s    .[..F%%I  ,,,K 	T((f==,  
 <<j=O  Q Qs    A0c                     d }| j                   D ]9  }	 t        j                  j                  ||j                  |j
                        }; |S # t        j                  $ r Y Sw xY w)N)api_version)rC   r   REGISTRYParseRelativeName	full_namerm   Error)r]   r   resource
collections       r   _RelativeNamez-UpdateResourceArgumentGenerator._RelativeName   sk    H&&
%%77  ".. 8 0 ' O __ s   6AA#"A#c                    t        |t        j                        r t        j                  ||j
                        S t        |t        j                        rt        |j                  j                               }t        |      dk7  r.t        dj                  |t        |       j                              |d   }t        j                  |j                   |      }|r|j#                         }|S y)a  Retrieves namespace value associated with flag.

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

    Returns:
      value parsed from namespace
    r`   zConceptParser must contain exactly one spec for clearable but found specs {}. {} cannot parse the namespace value if more than or less than one spec is added to the ConceptParser.r   N)
isinstancer   Argumentr   GetFromNamespacer   r   ConceptParserr#   specskeysrc   
ValueErrorrN   type__name__CONCEPTSParse)r]   	namespacer;   all_anchorsr   r   s         r   GetArgFromNamespacez3UpdateResourceArgumentGenerator.GetArgFromNamespace   s     #t}}%''	388<<#445)*k	[	Q	 $VKd1D1DE	G 	G
 ^d((););TBe	lr)   c                      t        j                  | j                        }|sy t        |t              r fd|D        }|D cg c]  }|s|	 c}S  j                  |      S c c}w )Nc              3   @   K   | ]  }j                  |        y wr   )rt   )r   vr]   s     r   r   zKUpdateResourceArgumentGenerator.GetFieldValueFromMessage.<locals>.<genexpr>   s     =u!**1-us   )r   GetFieldValueFromMessagerA   rv   r#   rt   )r]   existing_messager   relative_namesr   s   `    r   r   z8UpdateResourceArgumentGenerator.GetFieldValueFromMessage   sa    ../?PE%=u=n-6~td~66&& 7s   A$A$c                 >    t         t        |   | j                        S r   )rW   r>   GeneraterE   )r]   r^   s    r   r   z(UpdateResourceArgumentGenerator.Generate   s!    0$@##% %r)   )FN)NFNFNNNN)NN)r~   
__module____qualname____doc__classmethodrU   rX   rg   rk   rt   r   r   r   __classcell__)r^   s   @r   r>   r>   c   sc    0@E 2 2n !+0KQ<	'% %r)   r>   c                   L    e Zd ZdZed        Zed        Zed        Zd Zd Z	y)rJ   r?   c                      y r   r2   r]   s    r   _empty_valuez3UpdateDefaultResourceArgumentGenerator._empty_value      r)   c                 X    | j                  dj                  | j                              S NzSet {} to new value.r.   rk   rN   r[   r   s    r   set_argz.UpdateDefaultResourceArgumentGenerator.set_arg
  .    ##)00? $ A Ar)   c                     | j                  | j                  t        j                  j                  dd| j                   d| j                  | j                         d      S N
store_truezClear z value and set to .)rb   action	help_text_CreateFlagr[   r	   PrefixCLEAR_GetTextFormatOfEmptyValuer   r   s    r   	clear_argz0UpdateDefaultResourceArgumentGenerator.clear_arg  b    &&,,T]]O $11$2C2CDEQH   r)   c                     |r|S |S r   r2   r]   outputset_vals      r   ApplySetFlagz3UpdateDefaultResourceArgumentGenerator.ApplySetFlag      nMr)   c                 "    |r| j                   S |S r   r   r]   r   
clear_flags      r   ApplyClearFlagz5UpdateDefaultResourceArgumentGenerator.ApplyClearFlag      Mr)   N
r~   r   r   r   propertyr   r   r   r   r   r2   r)   r   rJ   rJ     sK    0  A A  
r)   rJ   c                   L    e Zd ZdZed        Zed        Zed        Zd Zd Z	y)rH   z2Update flag generator for multitype resource args.c                      y r   r2   r   s    r   r   z5UpdateMultitypeResourceArgumentGenerator._empty_value(  r   r)   c                 X    | j                  dj                  | j                              S r   r   r   s    r   r   z0UpdateMultitypeResourceArgumentGenerator.set_arg,  r   r)   c                     | j                  | j                  t        j                  j                  dd| j                   d| j                  | j                         d      S r   r   r   s    r   r   z2UpdateMultitypeResourceArgumentGenerator.clear_arg1  r   r)   c                 .    |xr |j                   x}r|S |S r   result)r]   r   r   r   s       r   r   z5UpdateMultitypeResourceArgumentGenerator.ApplySetFlag<  s     ,gnn-v-mmr)   c                 "    |r| j                   S |S r   r   r   s      r   r   z7UpdateMultitypeResourceArgumentGenerator.ApplyClearFlagB      mr)   Nr   r2   r)   r   rH   rH   %  sK    :  A A  r)   rH   c                   x    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	d Z
d Zd	 Zd
 Zy)rI   z-Update flag generator for list resource args.c                     g S r   r2   r   s    r   r   z0UpdateListResourceArgumentGenerator._empty_valueL      Ir)   c                 B    | j                  d| j                   d      S NzSet z to new value.r   rk   r[   r   s    r   r   z+UpdateListResourceArgumentGenerator.set_argP  *    ##$--7 $ 9 9r)   c                     | j                  | j                  t        j                  j                  dd| j                   d| j                  | j                         d      S r   r   r   s    r   r   z-UpdateListResourceArgumentGenerator.clear_argU  r   r)   c                 t    | j                  t        j                  j                  d| j                   d      S NzAdd new value to  list.rb   r.   rk   r	   r   ADDr[   r   s    r   
update_argz.UpdateListResourceArgumentGenerator.update_arg`  9    ##&&**&t}}oV< $ > >r)   c                 t    | j                  t        j                  j                  d| j                   d      S NzRemove value from r   r   rk   r	   r   REMOVEr[   r   s    r   
remove_argz.UpdateListResourceArgumentGenerator.remove_argf  9    ##&&--'f= $ ? ?r)   c                     |r|S |S r   r2   r   s      r   r   z0UpdateListResourceArgumentGenerator.ApplySetFlagl  r   r)   c                 "    |r| j                   S |S r   r   r   s      r   r   z2UpdateListResourceArgumentGenerator.ApplyClearFlagq  r   r)   c                 ^    |xs | j                   }|r|D cg c]	  }||vs| c}S |S c c}w r   r   )r]   existing_val
remove_valr   xs        r   ApplyRemoveFlagz3UpdateListResourceArgumentGenerator.ApplyRemoveFlagv  s;    -D--E6A!:"5a66l 7s   	**c                 d    |xs | j                   }|r||D cg c]	  }||vs| c}z   S |S c c}w r   r   r]   r   
update_valr   r   s        r   ApplyUpdateFlagz3UpdateListResourceArgumentGenerator.ApplyUpdateFlag}  s@    -D--E
E
1aunQ
EEEl Fs   	--Nr~   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r)   r   rI   rI   I  s{    5  9 9   > >
 ? ?


r)   rI   c                   x    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	d Z
d Zd	 Zd
 Zy)rG   z7Update flag generator for multitype list resource args.c                     g S r   r2   r   s    r   r   z9UpdateMultitypeListResourceArgumentGenerator._empty_value  r   r)   c                 B    | j                  d| j                   d      S r   r   r   s    r   r   z4UpdateMultitypeListResourceArgumentGenerator.set_arg  r   r)   c                     | j                  | j                  t        j                  j                  dd| j                   d| j                  | j                         d      S r   r   r   s    r   r   z6UpdateMultitypeListResourceArgumentGenerator.clear_arg  r   r)   c                 t    | j                  t        j                  j                  d| j                   d      S r   r   r   s    r   r   z7UpdateMultitypeListResourceArgumentGenerator.update_arg  r   r)   c                 t    | j                  t        j                  j                  d| j                   d      S r   r   r   s    r   r   z7UpdateMultitypeListResourceArgumentGenerator.remove_arg  r   r)   c                 d    |D cg c]  }|j                   s|j                    }}|r|S |S c c}w r   r   )r]   r   r   valresource_lists        r   r   z9UpdateMultitypeListResourceArgumentGenerator.ApplySetFlag  s4    +2A7CcjjSZZ7MAm	 Bs   --c                 "    |r| j                   S |S r   r   r   s      r   r   z;UpdateMultitypeListResourceArgumentGenerator.ApplyClearFlag  r   r)   c                     |xs | j                   }t        d |D              x}r|D cg c]	  }||vs| c}S |S c c}w )Nc              3   N   K   | ]  }|j                   s|j                     y wr   r   )r   r   s     r   r   zOUpdateMultitypeListResourceArgumentGenerator.ApplyRemoveFlag.<locals>.<genexpr>  s     NZc3::szzZs   %%)r   r   )r]   r   r   r   remove_resourcesr   s         r   r   z<UpdateMultitypeListResourceArgumentGenerator.ApplyRemoveFlag  sP    -D--ENZNNNN<A!+;";a<<l =s   	<<c                     |xs | j                   }|r,||D cg c]  }|j                  |vs|j                   c}z   S |S c c}w r   )r   r   r   s        r   r   z<UpdateMultitypeListResourceArgumentGenerator.ApplyUpdateFlag  sY    -D--E&A&q!((%*?!((JA A A lAs
   AANr   r2   r)   r   rG   rG     s{    ?  9 9   > >
 ? ?
r)   rG   N)r   
__future__r   r   r   googlecloudsdk.callioper    googlecloudsdk.calliope.conceptsr   rY   $googlecloudsdk.command_lib.util.apisr   r	   r
   (googlecloudsdk.command_lib.util.conceptsr   googlecloudsdk.corer   r   r(   r3   r<   UpdateArgumentGeneratorr>   rJ   rH   rI   rG   r2   r)   r   <module>r      s     F &  ' ( @ : < Q D )
" ]%k&I&I ]%@-L D!/N !H9*I 9x>#>r)   