
    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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r " S
 S\R                   " \R"                  5      5      r " S S\5      r " S S\5      rg)z1Utilities for expanding wildcarded GCS pathnames.    )absolute_import)division)unicode_literalsN)storage_api)storage_util)log)
propertiesc                   D   \ rS rSrSrSr\S 5       rS r\	R                  S 5       r\	R                  S 5       r\	R                  S 5       r\	R                  S	 5       r\	R                  S
 5       r\	R                  S 5       r\S 5       rS rS rS rS rS rS rS rSrg)PathExpander#   z0Abstract base class for path wildcard expansion.z[*?[]c                 V    UR                  S5      (       a
  [        5       $ [        5       $ Ngs://)
startswithGCSPathExpanderLocalPathExpanderclspaths     3lib/googlecloudsdk/command_lib/storage/expansion.pyForPathPathExpander.ForPath(   s#    w    c                     Xl         g N_sep)selfseps     r   __init__PathExpander.__init__.   s    Ir   c                     g r    r   r   s     r   AbsPathPathExpander.AbsPath1       r   c                     g r   r#   r$   s     r   IsFilePathExpander.IsFile5   r'   r   c                     g r   r#   r$   s     r   IsDirPathExpander.IsDir9   r'   r   c                     g r   r#   r$   s     r   ExistsPathExpander.Exists=   r'   r   c                     g r   r#   r$   s     r   ListDirPathExpander.ListDirA   r'   r   c                     g r   r#   r   path1path2s      r   JoinPathExpander.JoinE   r'   r   c                 ^    [        [        R                  " [        R                  U5      5      $ r   )boolresearchr   EXPANSION_CHARSr   s     r   HasExpansionPathExpander.HasExpansionI   s    		,66=>>r   c                 R   [        5       n[        5       nU R                  U R                  U5      5       HG  nUR                  U R                  5      (       a  UR                  U5        M6  UR                  U5        MI     U R                  U5      (       a  UR                  5         X#4$ )zExpand the given path that contains wildcard characters.

Args:
  path: str, The path to expand.

Returns:
  ({str}, {str}), A tuple of the sets of files and directories that match
  the wildcard path. All returned paths are absolute.
)set_Globr%   endswithr   addIsEndRecursiveclear)r   r   filesdirsps        r   
ExpandPathPathExpander.ExpandPathM   s}     EE5DZZT*+	
DII				!	 ,
 4   jjl=r   c                    [        5       n[        5       nU Hm  nU R                  U5      u  pVU(       d.  U(       d'  [        R                  " SR	                  U5      5        MK  UR                  U5        UR                  U5        Mo     X#4$ )Nz[{}] does not match any paths.)rB   rK   r   warningformatupdate)r   pathsrH   rI   rJ   current_filescurrent_dirss          r   ExpandPathsPathExpander.ExpandPathse   sm    EE5D&*ooa&8#}<4;;A>?ll=!
kk,  ;r   c                 >    UR                  U R                  S-   5      $ Nz**rD   r   r$   s     r   rF   PathExpander.IsEndRecursiveq   s    ==T)**r   c                 8    UR                  U R                  5      $ r   rX   r$   s     r   	IsDirLikePathExpander.IsDirLiket   s    ==##r   c              #     #    U R                  U5      (       d*  U R                  U5      (       a  U R                  U5      v   g [        R                  R                  U5      u  p#U R                  U5      nU R                  U5       H  nU(       d>  U R                  XS5      nU R                  U5      (       a  U R                  U5      v   MF  MH  US:X  a-  U R                  U5       H  nU R                  U5      v   M     M{  [        R                  " U R                  U5      U5       H%  nU R                  U R                  XV5      5      v   M'     M     g 7frW   )r?   r/   _FormatPathosr   splitrC   r8   _RecursiveDirListfnmatchfilterr2   )r   r   dir_pathbasenamehas_basename_expansionexpanded_dir_pathns          r   rC   PathExpander._Globw   s    T""	T		t$$t,H!..x8!ZZ1#yy*5;;t  &
&  t))*;<a""1%% = >>ll,-a ""499->#BCC 2s   EEc              #      #    U R                  U5       H4  nU R                  X5      nUv   U R                  U5       H  nUv   M	     M6     g 7fr   )r2   r8   ra   )r   rd   rh   r   xs        r   ra   PathExpander._RecursiveDirList   sE     \\(#YYx#dj%%d+! , $s   AAc                     U R                  U5      (       a.  UR                  U R                  5      (       d  XR                  -   nU$ r   )r,   rD   r   r$   s     r   r^   PathExpander._FormatPath   s4    zz$dii 8 8IIdKr   r   N)__name__
__module____qualname____firstlineno____doc__r>   classmethodr   r    abcabstractmethodr%   r)   r,   r/   r2   r8   r?   rK   rT   rF   r[   rC   ra   r^   __static_attributes__r#   r   r   r   r   #   s    8/ 
 	 	 	 	 	 	 	 	 	 	 	 	 ? ?0
+$D.r   r   c                   P   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
rU =r$ )r      z3Implements path expansion for the local filesystem.c                 H   > [         [        U ]  [        R                  5        g r   )superr   r    r_   r   r   	__class__s    r   r    LocalPathExpander.__init__   s    	
T+BFF3r   c                 @    [         R                  R                  U5      $ r   )r_   r   abspathr$   s     r   r%   LocalPathExpander.AbsPath   s    77??4  r   c                 @    [         R                  R                  U5      $ r   )r_   r   isfiler$   s     r   r)   LocalPathExpander.IsFile       77>>$r   c                 @    [         R                  R                  U5      $ r   )r_   r   isdirr$   s     r   r,   LocalPathExpander.IsDir   s    77==r   c                 @    [         R                  R                  U5      $ r   )r_   r   existsr$   s     r   r/   LocalPathExpander.Exists   r   r   c                 h     [         R                  " U5      $ ! [         R                   a    / s $ f = fr   )r_   listdirerrorr$   s     r   r2   LocalPathExpander.ListDir   s.    ZZ88 is    11c                 @    [         R                  R                  X5      $ r   )r_   r   joinr5   s      r   r8   LocalPathExpander.Join   s    77<<%%r   r#   )ro   rp   rq   rr   rs   r    r%   r)   r,   r/   r2   r8   rw   __classcell__r}   s   @r   r   r      s.    ;4!  & &r   r   c                      ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rU 4S jrSrU =r$ )r      z?Implements path expansion for gs:// formatted resource strings.c                 |   > [         [        U ]  S5        [        R                  " 5       U l        0 U l        0 U l        g )N/)r{   r   r    r   StorageClient_client_objects_object_detailsr|   s    r   r    GCSPathExpander.__init__   s1    	/4)#.,,.DLDMDr   c                     / nU H9  nU R                  U5      u  pEU(       a  UOUS-   nUR                  XCUS.45        M;     [        US S9nU Vs/ s H  ofS   PM	     sn$ s  snf )a	  Gets all the details for the given paths and returns them sorted.

Args:
  object_paths: [str], A list of gs:// object or directory paths.

Returns:
  [{path, data}], A list of dicts with the keys path and data. Path is the
  gs:// path to the object or directory. Object paths will not end in a '/'
  and directory paths will. The data is either a storage.Object message (for
  objects) or a storage_util.ObjectReference for directories. The sort
  order is alphabetical with all directories first and then all objects.
r   )r   datac                     U S   U S   S   4$ )Nr      r   r#   )os    r   <lambda>8GCSPathExpander.GetSortedObjectDetails.<locals>.<lambda>   s    qtQqT&\.Br   )keyr   )_GetObjectDetailsappendsorted)r   object_pathsall_datar   is_objr   ds          r   GetSortedObjectDetails&GCSPathExpander.GetSortedObjectDetails   so     H++D1lfTdoovd;<= 
 h$BCH"#(QaD(###s   A"c                     U R                   R                  U5      nU(       a  SU4$ S[        R                  R	                  USS94$ )aO  Gets the actual object data for a given GCS path.

Args:
  object_path: str, The gs:// path to an object or directory.

Returns:
  (bool, data), Where element 0 is True if the path is an object, False if
  a directory and where data is either a storage.Object message (for
  objects) or a storage_util.ObjectReference for directories.
TFallow_empty_object)r   getr   ObjectReferenceFromUrl)r   object_pathdetailss      r   r   !GCSPathExpander._GetObjectDetails   sS     ""&&{3G7] L0088
$ 9 0 0 0r   c                 H    UR                  S5      (       d  [        S5      eU$ )Nr   z0GCS paths must be absolute (starting with gs://))r   
ValueErrorr$   s     r   r%   GCSPathExpander.AbsPath   s"    ??7##IJJKr   c                 H    U R                  U5      u  p#U=(       a    U(       + $ r   _Existsr   r   r   is_dirs       r   r)   GCSPathExpander.IsFile   s    \\$'NF &j r   c                 >    U R                  U5      u  p#U=(       a    U$ r   r   r   s       r   r,   GCSPathExpander.IsDir   s    \\$'NFfr   c                 ,    U R                  U5      u  p#U$ r   r   )r   r   r   _s       r   r/   GCSPathExpander.Exists   s    T"IFMr   c                    U R                  U5      (       a  gUR                  S5      n[        R                  R	                  USS9nU R                  UR                  5        UR                  U R                  ;   a  UR                  (       d  gUR                  U R                  UR                     ;   a  gU R                  UR                  5      nU R                  UR                      H  nUR                  U5      (       d  M    g   g)N)TTr   Tr   )TF)FF)_IsRootrstripr   r   r   _LoadObjectsIfMissing
bucket_refbucketr   name_GetDirStringr   )r   r   obj_refdir_nameis        r   r   GCSPathExpander._Exists   s    ||D;;sD**22 3 'Gw112~~&\\	w~~6	6##GLL1h}}W^^,!<<!! - r   c              #     #    U R                  U5      (       a^  U R                  R                  [        R                  R
                  R                  R                  SS9S9 H  nUR                  v   M     g [        R                  R                  USS9nU R                  UR                  5        U R                  UR                  5      n[        U5      n[!        5       nU R"                  UR$                      HY  nUR'                  U5      (       d  M  XuS  nUR)                  U R*                  5      S   n	X;  d  MD  UR-                  U	5        U	v   M[     g 7f)NT)required)projectr   r   )r   r   ListBucketsr	   VALUEScorer   Getr   r   r   r   r   r   r   lenrB   r   r   r   r`   r   rE   )
r   r   br   r   parent_dir_lengthseenobj_namesuffixresults
             r   r2   GCSPathExpander.ListDir  s!    ||D ||''##((0044d4C ( E!ffE **22 3 'Gw112!!',,/HH5DMM'..1			X	&	&,-dii(+
((6
, 2s   DE%E=Ec                     U R                  U5      (       a  SUR                  U R                  5      -   $ UR                  U R                  5      U R                  -   UR                  U R                  5      -   $ r   )r   lstripr   r   r5   s      r   r8   GCSPathExpander.Join-  sW    ||Eu||DII...<<		"TYY.dii1HHHr   c                 $    US:H  =(       d    US:H  $ )Nr   zgs:r#   r$   s     r   r   GCSPathExpander._IsRoot2  s    7?+dem+r   c                    U R                   R                  UR                  5      nUc   U R                  R	                  U5      n[        5       nU HU  nSU R                  UR                  UR                  5      -   nX@R                  U'   UR                  UR                  5        MW     U R                   R                  UR                  [        5       5      R                  U5        g g ! [        R                   a     g f = fr   )r   r   r   r   
ListBucketrB   r8   r   r   rE   
setdefaultrP   r   BucketNotFoundError)r   r   objectsobject_namesr   	full_paths         r   r   %GCSPathExpander._LoadObjectsIfMissing5  s    mm
 1 12G,,))*5uA		**;*;QVV DD),-

y
)


166
"  	  !2!2CE:AA,O  ,, s   B=C) )D ?D c                 p    U(       a.  UR                  U R                  5      (       d  XR                  -   $ U$ r   rX   r$   s     r   r   GCSPathExpander._GetDirStringG  s)    DMM$)),,IIKr   c                 >   > [         [        U ]  U5      nUS:X  a  S$ U$ )Nzgs:/r   )r{   r   r^   )r   r   r}   s     r   r^   GCSPathExpander._FormatPathL  s%    $3D9Dfn7.$.r   )r   r   r   )ro   rp   rq   rr   rs   r    r   r   r%   r)   r,   r/   r   r2   r8   r   r   r   r^   rw   r   r   s   @r   r   r      sR    G$,0(
!22I
,$
/ /r   r   )rs   
__future__r   r   r   ru   rb   r_   r<   googlecloudsdk.api_lib.storager   r   googlecloudsdk.corer   r	   sixwith_metaclassABCMetar   r   r   r#   r   r   <module>r      sf     8 &  ' 
  	 	 6 7 # * 
u3%%ckk2 up& &8W/l W/r   