a
    !ft
                  	   @   s(  d Z ddlZddlZddlZddlZddlmZmZmZm	Z	 ddl
mZ G dd deZeee dd	d
Ze eee dddZe	e ee dddZedkr$ddlZe ZedsJ dede edeej eddd eeddeddd D ]Zeedd qdS )zPEP 656 support.

This module implements logic to detect if the currently running Python is
linked against musl, and what musl version is used.
    N)Iterator
NamedTupleOptionalSequence   )ELFFilec                   @   s   e Zd ZU eed< eed< dS )_MuslVersionmajorminorN)__name__
__module____qualname__int__annotations__ r   r   U/var/www/html/python-backend/venv/lib/python3.9/site-packages/packaging/_musllinux.pyr      s   
r   )outputreturnc                 C   sx   dd dd |   D D }t|dk s<|d d d dkr@d S td	|d
 }|sXd S tt|d
t|ddS )Nc                 S   s   g | ]}|r|qS r   r   .0nr   r   r   
<listcomp>       z'_parse_musl_version.<locals>.<listcomp>c                 s   s   | ]}|  V  qd S )N)stripr   r   r   r   	<genexpr>   r   z&_parse_musl_version.<locals>.<genexpr>   r      muslzVersion (\d+)\.(\d+)r   )r	   r
   )
splitlineslenrematchr   r   group)r   linesmr   r   r   _parse_musl_version   s     r%   )
executabler   c              
   C   s   z8t | d}t|j}W d   n1 s,0    Y  W n tttfyR   Y dS 0 |du sdd|vrhdS tj|gtjdd}t	|j
S )a`  Detect currently-running musl runtime version.

    This is done by checking the specified executable's dynamic linking
    information, and invoking the loader to parse its output for a version
    string. If the loader is musl, the output would be something like::

        musl libc (x86_64)
        Version 1.2.2
        Dynamic Program Loader
    rbNr   T)stderrtext)openr   interpreterOSError	TypeError
ValueError
subprocessrunPIPEr%   r(   )r&   fldprocr   r   r   _get_musl_version   s    ,r5   )archsr   c                 c   sR   t tj}|du rdS | D ]2}t|jddD ]}d|j d| d| V  q,qdS )a  Generate musllinux tags compatible to the current platform.

    :param archs: Sequence of compatible architectures.
        The first one shall be the closest to the actual architecture and be the part of
        platform tag after the ``linux_`` prefix, e.g. ``x86_64``.
        The ``linux_`` prefix is assumed as a prerequisite for the current platform to
        be musllinux-compatible.

    :returns: An iterator of compatible musllinux tags.
    N
musllinux__)r5   sysr&   ranger
   r	   )r6   sys_muslarchr
   r   r   r   platform_tags6   s    
r>   __main__zlinux-z	not linuxzplat:zmusl:ztags: )endz[.-]r9   -r7   z
      )__doc__	functoolsr    r/   r:   typingr   r   r   r   Z_elffiler   r   strr%   	lru_cacher5   r>   r   	sysconfigget_platformplat
startswithprintr&   subsplittr   r   r   r   <module>   s(   


"