o
    f                     @   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r-t |ttfrtddt| d| tttjj	|s*t
t||}ntjdd }|d ur=t|}nttd}t|ad S )Nz!tzpaths must be a list or tuple, znot z: PYTHONTZPATHTZPATH)
isinstancestrbytes	TypeErrortypeallmapospathisabs
ValueError_get_invalid_paths_messageenvironget_parse_python_tzpath	sysconfigget_config_vartupler   )totzpathsbase_tzpathenv_var r   '/usr/lib/python3.10/zoneinfo/_tzpath.pyreset_tzpath   s$   
r   c                 C   sZ   | sdS |  tj}tttjj|}t|t|kr+d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   
raw_tzpath
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   s    z-_get_invalid_paths_message.<locals>.<genexpr>z
    z@Paths should be absolute but found the following relative paths:)join)r   invalid_pathsprefix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   r3   _c                 C   sv   t j| rtd|  t j| }t|t| kr"td|  t jt j||}||s9t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   _basenew_pathresolvedr   r   r   r.   O   s   
r.   c               	   C   sR  ddl m}  t }z(| dd}|D ]}| }|r || qW d   n1 s+w   Y  W n ttfy<   Y nw dd }tD ]Z}t	j
|sLqCt	|D ]K\}}}||krld|v rc|d d	|v rl|d	 |D ]-}	t	j
||	}
t	j
j|
|d
}t	jdkr|t	jd}|r||v rqn||
r|| qnqQqCd|v r|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   )	resourcestzdatazonesNc                 S   sV   z t | d}|ddkW  d    W S 1 sw   Y  W d S  ty*   Y dS w )Nrb   s   TZifF)openread	Exception)fpathfr   r   r   	valid_key   s   (z&available_timezones.<locals>.valid_keyrightposix)start/
posixrules)	importlibr;   set	open_textstripaddImportErrorFileNotFoundErrorr   r   r   existswalkremover*   relpathsepreplace)r;   valid_zonesrD   zonerE   tz_rootrootdirnamesfilesfilerC   r0   r   r   r   available_timezonesi   sP   	





r_   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   r'   )r   r   r   r   r   r3   r   r6   r*   
_TEST_PATHr.   r_   RuntimeWarningr#   r   r   r   r   r   <module>   s    
A
