
    Cad                        d Z ddlZddlZddlZddlmZ ddlZddlZddl	Z	ddl
Z
ddlZ
ddlZddlZ e	j                  d      Zd Zd Zd Zd Zd Z G d	 d
      Z e       Zej.                  Zej0                  Zej2                  Zy)z3Use a cache layer in front of entry point scanning.    Nzstevedore._cachec                  6   t         j                  dk(  rtt        j                  dk7  rat         j                  j                  dd      xs t         j                  j                  d      } t         j                  j                  | d      S t        j                  dk(  rt         j                  j                  d      S t         j                  j                  dd      xs t         j                  j                  d	      } t         j                  j                  | d
      S )zpLocate a platform-appropriate cache directory to use.

    Does not ensure that the cache directory exists.
    posixdarwinXDG_CACHE_HOMENz~/.cachezpython-entrypointsz$~/Library/Caches/Python Entry PointsLOCALAPPDATAz~\AppData\LocalzPython Entry Points)	osnamesysplatformenvirongetpath
expanduserjoin)	base_paths    2/usr/lib/python3/dist-packages/stevedore/_cache.py_get_cache_dirr      s     
ww'cllh6JJNN#3T: .ww!!*- 	ww||I';<< 
	!ww!!"HII JJNN>48 7ww!!"56 	ww||I'<==    c                     	 t        j                  |       }|j                  S # t        $ r7}|j                  t        j
                  t        j                  hvr Y d }~yd }~ww xY w)Ng      )r   statst_mtimeOSErrorerrnoENOENTENOTDIR)r	   serrs      r   
_get_mtimer   6   sR    GGDMzz 99U\\5==99 :s    # 	A#-AA#c                 J    t        j                  d      j                  |       S )Nf)structStructpack)r    s    r   	_ftobytesr$   @   s    ==""1%%r   c                 z   g }t        j                         }|j                  t        j                  j                  d             |j                  t        j                  j                  d             | D ]2  }t        |      }|j                  |j                  d             |j                  t        |             |j                  ||f       t        j                  t        j                  t        j                  j!                  |dd            t        j                  t        j                  j!                  |dd                  D ]Z  }t        |      }|j                  |j                  d             |j                  t        |             |j                  ||f       \ 5 |j#                         |fS )z4Return a hash and the path settings that created it.zutf-8z*.dist-infozentry_points.txtz
*.egg-info)hashlibsha256updater
   
executableencodeprefixr   r$   append	itertoolschainglobiglobr   r   r   	hexdigest)r   pathshentrymtimeep_files         r   _hash_settings_for_pathr7   D   sP   EA HHS^^""7+,HHSZZw'( +5!	g&'	5!"eU^$ 

277<<(5(:< = 

277<<(4(:< =	
 	+G w'EHHW^^G,-HHYu%&LL'5)*	++& KKM5!!r   c                     t        j                         } t        | t              s*| j                  D ci c]  }|| j                  |       } }i }| j                         D ]g  \  }}t               }g }|||<   |D ]L  }|j                  |j                  |j                  f}||v r+|j                  |       |j                  |       N i |t        j                  t        j                  dS c c}w )N)group)groupszsys.executablez
sys.prefix)importlib_metadataentry_points
isinstancedictr:   selectitemssetr	   valuer9   addr,   r
   r)   r+   )	real_groupsr9   r:   r	   
group_dataexistingmembersepitems	            r   _build_cacheable_datarJ   d   s    $113Kk4(
 %++
 ;%%E%22
 
 F'--/ !j5t 		!B
 77BHHbhh.DxLLNN4 		!	! ..jj +
s   C-c                   2    e Zd ZddZd ZddZddZddZy)CacheNc                 "   |
t               }|| _        i | _        d| _        t	        t
        j                  j                  t
        j                  j                  | j                  d            t        j                  dd dk(  g      rd| _        y y )NFz.disabler      z/tmpT)r   _dir	_internal_disable_cachinganyr   r   isfiler   r
   r)   )self	cache_dirs     r   __init__zCache.__init__   sw    &(I	 %
 rww||DIIzBCq#v-/ 0$(D!0r   c                 "   |t         j                  }t        |      }|| j                  v r| j                  |   S t	        |      \  }}t
        j                  j                  | j                  |      }	 t        j                  d|       t        |d      5 }t        j                  |      }d d d        | j                  |<   |S # 1 sw Y   xY w# t        t        j                  f$ r t               }||d<   | j                   s	 t        j                  d|       t        j"                  | j                  d       t        |d      5 }t        j$                  ||       d d d        n# 1 sw Y   nxY wn# t        t&        f$ r Y nw xY wY w xY w)Nz
reading %srpath_valueszwriting to %sT)exist_okw)r
   r   tuplerP   r7   r   r   rO   logdebugopenjsonloadIOErrorJSONDecodeErrorrJ   rQ   makedirsdumpr   )rT   r   internal_keydigestrY   filenamer    datas           r   _get_data_for_pathzCache._get_data_for_path   sO   <88DT{4>>)>>,//5d;77<<		62	IIlH-h$ $yy|$ (,|$!$ $--. 	(*D"-D((IIox8KK		D9h, +		$*+ + +) 	sg   4"C C,C C
C 4FAE6	E) 	E6)E2	.E65F6FFFFFc                     g }| j                  |      }|j                  di       j                  |g       }|D ]#  }|j                  t        j                  |        % |S )Nr:   )rj   r   r,   r;   
EntryPoint)rT   r9   r   resultri   rE   valss          r   get_group_allzCache.get_group_all   sb    &&t,XXh+//r:
 	@DMM,77>?	@r   c                 v    i }| j                  ||      D ]   }|j                  |vs|||j                  <   " |S )Nr   )ro   r	   )rT   r9   r   rm   rH   s        r   get_group_namedzCache.get_group_named   sF    $$U$6 	%Bwwf$"$rww	% r   c                     | j                  ||      j                         D ]  \  }}||k(  s|c S  t        dj                  ||            )Nrq   z No entrypoint {!r} in group {!r})rr   r@   
ValueErrorformat)rT   r9   r	   r   rH   s        r   
get_singlezCache.get_single   s\    ,,U,>DDF 	HD"t|		 ;BB4  	r   )N)__name__
__module____qualname__rV   rj   ro   rr   rv    r   r   rL   rL      s    )<r   rL   )__doc__r   r/   r&   importlib.metadatametadatar;   r-   r`   loggingr   os.pathr!   r
   	getLoggerr]   r   r   r$   r7   rJ   rL   _cro   rr   rv   rz   r   r   <module>r      s    :    /    	   
 g*+>.&"@DB BJ W  $$]]
r   