a
    If                     @   s   d dl Z d dlZdddZdd Zdd Zdd	 Ze je jd
d
dd Z	e	fddZ
[	dd ZG dd deZdae  dS )    Nc                 C   s   | }|d urZt |ttfr6tddt| d| tttjj	|sTt
t||}n.tjdd }|d urzt|}nttd}t|ad S )Nz!tzpaths must be a list or tuple, znot z: ZPYTHONTZPATHTZPATH)
isinstancestrbytes	TypeErrortypeallmapospathisabs
ValueError_get_invalid_paths_messageenvironget_parse_python_tzpath	sysconfigZget_config_vartupler   )totzpathsZbase_tzpathenv_var r   !lib/python3.9/zoneinfo/_tzpath.pyreset_tzpath   s$    
r   c                 C   sZ   | sdS |  tj}tttjj|}t|t|krVdd l}t	|}|
d| t |S )Nr   r   z>Invalid paths specified in PYTHONTZPATH environment variable. )splitr
   pathsepr   filterr   r   lenwarningsr   warnInvalidTZPathWarning)r   Z
raw_tzpathZ
new_tzpathr   msgr   r   r   r      s    r   c                 C   s(   dd | D }d}|| | }d| S )Nc                 s   s   | ]}t j|s|V  qd S )N)r
   r   r   ).0r   r   r   r   	<genexpr>6       z-_get_invalid_paths_message.<locals>.<genexpr>z
    z@Paths should be absolute but found the following relative paths:)join)r   Zinvalid_pathsprefixZindented_strr   r   r   r   5   s    r   c                 C   s8   t |  tD ]&}tj|| }tj|r|  S qdS )z,Retrieve the path to a TZif file from a key.N)_validate_tzfile_pathr   r
   r   r%   isfile)keysearch_pathfilepathr   r   r   find_tzfileA   s    
r,   _c                 C   sv   t j| rtd|  t j| }t|t| krDtd|  t jt j||}||srtd|  d S )Nz.ZoneInfo keys may not be absolute paths, got: z6ZoneInfo keys must be normalized relative paths, got: z;ZoneInfo keys must refer to subdirectories of TZPATH, got: )r
   r   r   r   normpathr   r%   
startswith)r   Z_basenew_pathZresolvedr   r   r   r'   O   s    
r'   c               	   C   sX  ddl m}  t }zP| dd0}|D ]}| }|r&|| q&W d   n1 sV0    Y  W n ttfyx   Y n0 dd }tD ]}t	j
|sqt	|D ]\}}}||krd|v r|d d	|v r|d	 |D ]^}	t	j
||	}
t	j
j|
|d
}t	jdkr|t	jd}|r||v r(q||
r|| qqqd|v rT|d |S )a"  Returns a set containing all available time zones.

    .. caution::

        This may attempt to open a large number of files, since the best way to
        determine if a given file on the time zone search path is to open it
        and check for the "magic string" at the beginning.
    r   )	resourcesZtzdataZzonesNc                 S   sX   z>t | d }|ddkW  d    W S 1 s20    Y  W n tyR   Y dS 0 d S )Nrb   s   TZifF)openread	Exception)fpathfr   r   r   	valid_key   s
    2z&available_timezones.<locals>.valid_keyrightposix)start/Z
posixrules)	importlibr2   setZ	open_textstripaddImportErrorFileNotFoundErrorr   r
   r   existswalkremover%   relpathsepreplace)r2   Zvalid_zonesr9   Zzoner:   Ztz_rootrootZdirnamesfilesfiler8   r)   r   r   r   available_timezonesi   s@    	.



rN   c                   @   s   e Zd ZdZdS )r    z?Warning raised if an invalid path is specified in PYTHONTZPATH.N)__name__
__module____qualname____doc__r   r   r   r   r       s   r    r   )N)r
   r   r   r   r   r,   r   r/   r%   Z
_TEST_PATHr'   rN   RuntimeWarningr    r   r   r   r   r   <module>   s   
A