
    O%                         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
r
SSKrSSKrSSKrSSKJr  S rS rS	 rS
 rS rS rS rSS jrS rS rSS jr\R6                  S 5       rSS jrg)z0Utilities for accessing local package resources.    )absolute_import)division)unicode_literalsN)filesc                 <    U R                  S5      nUS:  a  U SU $ g)z+Returns package name for given module name..r   N )rfind)module_namelast_dot_idxs     -lib/googlecloudsdk/core/util/pkg_resources.py_GetPackageNamer   "   s*    ""3',A}%%	    c                 B    [         R                  " [        U 5      U5      $ )zCGet a resource as a byte string for given resource in same package.)pkgutilget_datar   )r   resource_names     r   GetResourcer   *   s    			/+6	FFr   c                 T   [         R                  R                  U 5      (       a  [        R                  " U 5      $ [
        R                  " [         R                  R                  U 5      5      n[        US5      (       a  UR                  U 5      $ [        SR                  U 5      5      e)a1  Gets the given resource as a byte string.

This is similar to GetResource(), but uses file paths instead of module names.

Args:
  path: str, filesystem like path to a file/resource.

Returns:
  The contents of the resource as a byte string.

Raises:
  IOError: if resource is not found under given path.
r   zFile not found {0})ospathisfiler   ReadBinaryFileContentsr   get_importerdirnamehasattrr   IOErrorformat)r   importers     r   GetResourceFromFiler    /   sz     WW^^D''--!!"''//$"78(Xz""T""$++D122r   c                 J   [         R                  R                  U5      (       a  [         R                  R                  [         R                  R	                  US5      5      (       d  U[
        R                  ;   $ [         R                  R	                  X5      n[         R                  R                  U5      (       a=  [         R                  R                  [         R                  R	                  US5      5      $ [         R                  R                  US-   5      $ U R                  S5      n[        R                  " [         R                  R                  " U/USS Q76 5      nU(       d  g[        US5      nU(       a  UR                  OUR                  nU" US   5      SL$ )zChecks if given name can be imported at given path.

Args:
  name: str, module name without '.' or suffixes.
  path: str, filesystem path to location of the module.

Returns:
  True, if name is importable.
__init__.py.pyr   NF	find_spec)r   r   isdirr   joinsysexistssplitr   r   r   r%   find_module)namer   	name_pathr   find_spec_existsfind_methods         r   IsImportabler0   G   s    WW]]477>>"'',,t];<<SXXT(I	ww}}YWW^^BGGLLMBCC77>>)e+,,jjo)!!"'',,t"Ein"EF(	X{3&6""H<P<P+	Yr]	#4	//r   c                 L   [         R                  R                  [         R                  R                  US5      5      (       a?  [        R
                  R                  U [         R                  R                  US5      5      nOU[         R                  R                  US-   5      (       a#  [        R
                  R                  XS-   5      nO[        X5      $ [        R
                  R                  U5      nU[        R                  U '   UR                  R                  U5        U$ )as  Loads module at given path under given name.

Note that it also updates sys.modules with name_to_give.

Args:
  name_to_give: str, name to assign to loaded module
  module_path: str, python path to location of the module, this is either
    filesystem path or path into egg or zip package

Returns:
  Imported module

Raises:
  ImportError: if module cannot be imported.
r"   r#   )r   r   r   r'   	importlibutilspec_from_file_location_GetModuleFromPathViaPkgutilmodule_from_specr(   modulesloaderexec_module)name_to_givemodule_pathspecmodules       r   GetModuleFromPathr>   e   s      WW^^BGGLLm<==>>11bggll;>D 
ww~~kE)**>>11E)D (BB>>**40&$#++l++&!	-r   c                    [         R                  " [        R                  R	                  U 5      5      nU(       d  [        SR                  U 5      5      e[        US5      nU(       a  UR                  OUR                  n[        R                  R                  U 5      nU" U5      (       a  [        X XQ5      $ [        SR                  U 5      5      e)z5Loads module by using pkgutil.get_importer mechanism.z{0} not foundr%   )r   r   r   r   r   ImportErrorr   r   r%   r+   basename_LoadModule)r;   r:   r   r.   r/   r   s         r   r5   r5      s    !!"''//+">?(	
o,,[9
::X{3&6""H<P<P+  -+xkHHO**;788r   c                 @   U R                  U5      n[        R                  " U5      nU R                  U5      (       a.  U/Ul        [
        R                  R                  US5      Ul        O
US-   Ul        [        XER                  5        U[        R                  U'   U$ )z-Loads the module or package under given name.z__init__.pycz.pyc)get_codetypes
ModuleType
is_package__path__r   r   r'   __file__exec__dict__r(   r7   )r   r;   r   r:   coder=   s         r   rB   rB      s    			;	'$L)&%%"mFOggll;?FO!F*FO t__$#++l	-r   c              #     #    [        5       nUc  / nUc  SnU  GH.  nUR                  U5      (       d  M  U[        U5      S R                  [        R
                  5      n[        U5      S:X  a?  US   R                  S5      (       a&  US   U;  a  UR                  US   5        US   S4v   [        U5      S:w  a  M  [        R                  R                  US   5      n[        R                  R                  U5      u  pxUS:X  d  US	:w  a  X;  a  M  US	:X  a  UOUn	S
U;  d  GM  X;  d  GM  UR                  U	5        U	S4v   GM1     g7f)zDYields module names from given list of file paths with given prefix.Nr	         r"   r   T__init__r#   r   F)
set
startswithlenr*   r   sepaddr   rA   splitext)
	file_listextra_extensionsprefixyielded	file_pathfile_path_partsfilenamemodnameextto_yields
             r   _IterModulesra      s;    E'^Fi''F.44RVV<O
?q _Q%7%B%B& & 
	7	*OA&'a $&&
?q ww 23H77##H-LG*#2M,wHH
'h5kk(eO1 s   D!E(E0Ec                    / n[         R                  " U 5       H  n[         R                  R                  [         R                  R	                  X5      5      (       a  UR                  U5        MW  [         R                  R	                  XS5      n[         R                  R                  U5      (       d  M  UR                  [         R                  R	                  US5      5        M     U$ )z=List packages or modules which can be imported at given path.r"   )r   listdirr   r   r'   append)r   importablesr]   pkg_init_filepaths       r   _ListPackagesAndFilesrg      s    +**T"h	ww~~bggll4233"'',,t}E	)	*	*277<<-@A # 
r   c                 d    [        U S5      (       a  U R                  nU$ U R                  5       nU$ )z&Get a list of files from the importer._files)r   ri   
_get_files)r   
files_lists     r   _GetFilesListrl      s6    Xx  J 
 $$&J	r   c                    / n[         R                  R                  U 5      (       a  [        [	        U 5      U5      nO5[
        R                  " U 5      n[        [        U5      XR                  5      n/ / pTU H0  u  pgU(       a  UR                  U5        M  UR                  U5        M2     [        U5      [        U5      4$ )a  Returns list of packages and modules in given path.

Args:
  path: str, filesystem path
  extra_extensions: [str], The list of file extra extensions that should be
    considered modules for the purposes of listing (in addition to .py).

Returns:
  tuple([packages], [modules])
)r   r   r&   ra   rg   r   r   rl   rY   rd   sorted)r   rX   iter_modulesr   packagesr7   r,   ispkgs           r   ListPackagerr      s     ,WW]]4 5d ;=MNL##D)Hh!1??L "G!kdoodnnT	 "
 
	6'?	**r   c              #   B  #    [         R                  R                  U 5      (       a,  [        R                  " U 5      n Uv   UR                  5         g[        U 5      n[        US5      R                  [         R                  5      v   g! UR                  5         f = f7f)z!Get a file reader for given path.zutf-8N)
r   r   r   r   
FileReadercloser    strr*   linesep)r   fbyte_strings      r   GetFileTextReaderByLinerz      so      WW^^DAgggi%d+K
k7
#
)
)"**
55 ggis   ;BB
 AB
BBc                    [         R                  R                  U 5      (       a  [        R                  " U  SU 35      $ [        R
                  " U 5      n[        US5      (       d  [        SR                  U 5      5      e/ n[        U5       H  nUR                  UR                  5      (       d  M%  U[        UR                  5      S R                  [         R                  5      n[        U5      S:w  a  Mk  [        R                  " US   U 5      (       d  M  UR!                  [         R                  R#                  XS   5      5        M     U$ )a  Get files from a given directory that match a pattern.

Args:
  path_dir: str, filesystem path to directory
  filter_pattern: str, pattern to filter files to retrieve.

Returns:
  List of filtered files from a directory.

Raises:
  IOError: if resource is not found under given path.
/r   zPath not found {0}NrO   r   )r   r   r&   globr   r   r   r   r   rl   rR   rY   rS   r*   rT   fnmatchrd   r'   )path_dirfilter_patternr   filtered_filesr[   r\   s         r   GetFilesFromDirectoryr     s    WW]]899z>"2344##H-H8Z(((//9::N"8,	!!(//22!#hoo"6"89??Go	_		"	+/?	A	AGGLL1#56	
 - r   )N)z*.*)__doc__
__future__r   r   r   
contextlibr~   r}   importlib.utilr2   r   r   r(   rE   googlecloudsdk.core.utilr   r   r   r    r0   r>   r5   rB   ra   rg   rl   rr   contextmanagerrz   r    r   r   <module>r      s     7 &  '     	  
  *G
300<%P9 D
+: 
6 
6#r   