o
    ft                     @   sN   d dl mZ ddlmZ G dd dZG dd dZG dd	 d	Zd
d ZdS )    )suppress   )abcc                   @   s(   e Zd ZdZdd fddZdd ZdS )	SpecLoaderAdapterz>
    Adapt a package spec to adapt the underlying loader.
    c                 C   s   | j S N)loaderspec r
   */usr/lib/python3.10/importlib/_adapters.py<lambda>   s    zSpecLoaderAdapter.<lambda>c                 C   s   || _ ||| _d S r   )r	   r   )selfr	   adapterr
   r
   r   __init__   s   zSpecLoaderAdapter.__init__c                 C      t | j|S r   )getattrr	   r   namer
   r
   r   __getattr__      zSpecLoaderAdapter.__getattr__N)__name__
__module____qualname____doc__r   r   r
   r
   r
   r   r      s    r   c                   @   s    e Zd ZdZdd Zdd ZdS )TraversableResourcesLoaderz9
    Adapt a loader to provide TraversableResources.
    c                 C   
   || _ d S r   r   r   r	   r
   r
   r   r         
z#TraversableResourcesLoader.__init__c                 C   s   t | j S r   )DegenerateFilesr	   _nativer   r
   r
   r   get_resource_reader   s   z.TraversableResourcesLoader.get_resource_readerN)r   r   r   r   r   r    r
   r
   r
   r   r      s    r   c                   @   sN   e Zd ZdZG dd dejZdd Zedd Z	dd	 Z
d
d Zdd ZdS )r   zg
    Adapter for an existing or non-existant resource reader
    to provide a degenerate .files().
    c                   @   sB   e Zd Zdd Zdd Ze ZZdd Zedd Z	dd
dZ
dS )zDegenerateFiles.Pathc                 C   s   t dS )Nr
   )iterr   r
   r
   r   iterdir&      zDegenerateFiles.Path.iterdirc                 C      dS )NFr
   r"   r
   r
   r   is_dir)   s   zDegenerateFiles.Path.is_dirc                 C      t  S r   r   Path)r   otherr
   r
   r   joinpath.   r$   zDegenerateFiles.Path.joinpathc                 C   r%   )N r
   r"   r
   r
   r   r   1   s   zDegenerateFiles.Path.namerbc                 O   s   t  r   )
ValueError)r   modeargskwargsr
   r
   r   open5   s   zDegenerateFiles.Path.openN)r-   )r   r   r   r#   r&   is_fileexistsr+   propertyr   r2   r
   r
   r
   r   r)   %   s    
r)   c                 C   r   r   r   r   r
   r
   r   r   8   r   zDegenerateFiles.__init__c                 C   s>   t t | jj| jjW  d    S 1 sw   Y  d S r   )r   AttributeErrorr	   r   r    r   r"   r
   r
   r   _reader;   s   
$zDegenerateFiles._readerc                 C   s   | j }t|dr
|S | S )zB
        Return the native reader if it supports files().
        files)r7   hasattr)r   readerr
   r
   r   r   @   s   zDegenerateFiles._nativec                 C   r   r   )r   r7   )r   attrr
   r
   r   r   G   r   zDegenerateFiles.__getattr__c                 C   r'   r   r(   r"   r
   r
   r   r8   J   r$   zDegenerateFiles.filesN)r   r   r   r   r   Traversabler)   r   r5   r7   r   r   r8   r
   r
   r
   r   r      s    
r   c                 C   s   t | jtS )z`
    Construct a package spec with traversable compatibility
    on the spec/loader/reader.
    )r   __spec__r   )packager
   r
   r   	wrap_specN   s   r?   N)
contextlibr   r,   r   r   r   r   r?   r
   r
   r
   r   <module>   s    /