
    TiBC                     .   d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZ 	 ddlmZ n# e$ r	 ddlmZ Y nw xY w G d dej                  Z G d	 d
e          Z G d de          Z G d de          Z G d de          ZddZeee	f         ZdS )z
resolvers.py
---------------

Provides a common interface to load assets referenced by name
like MTL files, texture images, etc. Assets can be from ZIP
archives, web assets, or a local file path.
    N   )cachingutil)DictMappingOptionalUnion)urlparsec                       e Zd ZdZej        d             Zej        d             Zej        defd            Z	ej        defd            Z
ej        d             Zd	efd
Zd	efdZd	edefdZdS )Resolverz'
    The base class for resolvers.
    c                      t          d          )NzUse a resolver subclass!NotImplementedError)selfargskwargss      K/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trimesh/resolvers.py__init__zResolver.__init__       !"<===    c                     t                      Nr   r   keys     r   getzResolver.get#   s    !###r   namec                      t          d          Nz`write` not implemented!r   r   r   datas      r   writezResolver.write'   r   r   	namespacec                      t          d          )Nz`namespaced` not implemented!r   r   r"   s     r   
namespacedzResolver.namespaced+   s    !"ABBBr   c                      t          d          )Nz`keys` not implemented!r   r   s    r   keyszResolver.keys/   s    !";<<<r   r   c                 ,    |                      |          S r   )r   r   s     r   __getitem__zResolver.__getitem__3   s    xx}}r   c                 .    |                      ||          S r   )r!   r   r   values      r   __setitem__zResolver.__setitem__6   s    zz#u%%%r   returnc                 .    ||                                  v S r   )r(   r   s     r   __contains__zResolver.__contains__9   s    diikk!!r   N)__name__
__module____qualname____doc__abcabstractmethodr   r   strr!   r%   r(   r*   r.   boolr1    r   r   r   r      s.         	> > > 	$ $ $ 	># > > > > 	CC C C C C 	= = =s    &s & & & &" " " " " " " "r   r   c                   `    e Zd ZdZdefdZd Zdedd fdZdefd	Zded
e	ee
f         fdZdS )FilePathResolverz>
    Resolve files from a source path on the file system.
    sourcec                    t           j                            t           j                            t	          |                              }|| _        t           j                            |          r|| _        n,t           j                            |          }|d         | _        t           j                            | j                  st          d| j         d          || _
        t           j                            |          | _        dS )z
        Resolve files based on a source path.

        Parameters
        ------------
        source : str
          File path where mesh was loaded from
        r   zpath `z `not a directory!N)ospath
expanduserabspathr8   cleanisdirparentsplit
ValueError	file_pathbasename	file_name)r   r=   rC   rF   s       r   r   zFilePathResolver.__init__B   s     ""27??3v;;#?#?@@
7== 	#DKK GMM%((E(DK w}}T[)) 	GEdkEEEFFF))&11r   c              #      K   | j         }t          j        | j                   D ]Y\  }}}|                    |          r|t	          |          d         }|D ]$}t          j                            ||          V  %ZdS )z
        List all files available to be loaded.

        Yields
        -----------
        name : str
          Name of a file which can be accessed.
        N)rE   r?   walk
startswithlenr@   join)r   rE   r@   _namesr   s         r   r(   zFilePathResolver.keys^   s        gdk22 	/ 	/ND!Uv&& +CKKMM* / /gll4....../	/ 	/r   r"   r/   c                 f    t          t          j                            | j        |                    S )aI  
        Return a resolver which changes the root of the
        resolver by an added namespace.

        Parameters
        -------------
        namespace : str
          Probably a subdirectory

        Returns
        --------------
        resolver : FilePathResolver
          Resolver with root directory changed.
        )r<   r?   r@   rO   rE   r$   s     r   r%   zFilePathResolver.namespacedp   s$      T[) D DEEEr   r   c                    t           j                            | j        |                                          }t           j                            |          sJt           j                            | j        |                                                    d                    }t           j                            |          sHt           j                            | j        t           j                            |          d                   }t          |d          5 }|	                                }ddd           n# 1 swxY w Y   |S )z
        Get an asset.

        Parameters
        -------------
        name : str
          Name of the asset

        Returns
        ------------
        data : bytes
          Loaded data from asset
        /rbN)
r?   r@   rO   rE   stripexistslstriprF   openread)r   r   r@   fr    s        r   r   zFilePathResolver.get   s    w||DK66w~~d## 	G7<<TZZ\\-@-@-E-EFFDw~~d## 	F7<<RW]]4-@-@-DEED$ 	6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   D99D= D=r    c                     t          t          j                            | j        |                                          d          5 }t          j        ||           ddd           dS # 1 swxY w Y   dS )z
        Write an asset to a file path.

        Parameters
        -----------
        name : str
          Name of the file to write
        data : str or bytes
          Data to write to the file
        wb)file_objstuffN)rZ   r?   r@   rO   rE   rW   r   write_encoded)r   r   r    r\   s       r   r!   zFilePathResolver.write   s     "',,t{DJJLL994@@ 	7A6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   A**A.1A.N)r2   r3   r4   r5   r8   r   r(   r%   r   r	   bytesr!   r:   r   r   r<   r<   =   s         2s 2 2 2 28/ / /$FC F,> F F F F"    07# 7U3:%6 7 7 7 7 7 7r   r<   c                   ~    e Zd ZdZddee         dee         fdZd Zdeddfd	Z	d
ede
fdZdedd fdZde
fdZdS )ZipResolverz-
    Resolve files inside a ZIP archive.
    Narchiver"   c                     || _         t          |t                    r1|                                                    d          dz   | _        dS d| _        dS )a{  
        Resolve files inside a ZIP archive as loaded by
        trimesh.util.decompress

        Parameters
        -------------
        archive : dict
          Contains resources as file object
        namespace : None or str
          If passed will only show keys that start
          with this value and this substring must be
          removed for any get calls.
        rT   N)re   
isinstancer8   rW   rstripr"   )r   re   r"   s      r   r   zZipResolver.__init__   sP     i%% 	"&__..55c::S@DNNN!DNNNr   c                     | j         <| j         t                    fd| j                                        D             S | j                                        S )z
        Get the available keys in the current archive.

        Returns
        -----------
        keys : iterable
          Keys in the current archive.
        Nc                 t    g | ]4}|                               rt          |          k    *|d          5S r   rM   rN   ).0klengthr"   s     r   
<listcomp>z$ZipResolver.keys.<locals>.<listcomp>   sN       <<	** 031vv &''
/>r   )r"   rN   re   r(   )r   rn   r"   s    @@r   r(   zZipResolver.keys   st     >%I^^F    **,,   
 |  """r   r   r/   c                 6    | j         i | _         || j         |<   dS )z
        Store a value in the current archive.

        Parameters
        -----------
        key : hashable
          Key to store data under.
        value : str, bytes, file-like
          Value to store.
        N)re   r,   s      r   r!   zZipResolver.write   s%     <DL!Sr   r   c                 v   |dS t          |d          r|                    d          }| j        }||vr t          || j                  D ]
}||v r|} n||         }t          |t          t          f          r|S |                    d           |	                                }|                    d           |S )z
        Get an asset from the ZIP archive.

        Parameters
        -------------
        name : str
          Name of the asset

        Returns
        -------------
        data : bytes
          Loaded data from asset
        Ndecodeutf-8r   )
hasattrrr   re   nearby_namesr"   rg   rb   r8   seekr[   )r   r   re   optionobjr    s         r   r   zZipResolver.get   s     <F4"" 	(;;w''D, w&tT^<<  W$$ "DE	 % dmcE3<(( 	J 	xxzzr   c                 .    t          | j        |          S )  
        Return a "sub-resolver" with a root namespace.

        Parameters
        -------------
        namespace : str
          The root of the key to clip off, i.e. if
          this resolver has key `a/b/c` you can get
          'a/b/c' with resolver.namespaced('a/b').get('c')

        Returns
        -----------
        resolver : Resolver
          Namespaced resolver.
        )re   r"   )rd   re   r$   s     r   r%   zZipResolver.namespaced  s      4<9EEEEr   c                 4    t          j        | j                  S )z
        Export the contents of the current archive as
        a ZIP file.

        Returns
        ------------
        compressed : bytes
          Compressed data in ZIP format.
        )r   compressre   r'   s    r   exportzZipResolver.export(  s     }T\***r   )NN)r2   r3   r4   r5   r   r   r8   r   r(   r!   rb   r   r%   r}   r:   r   r   rd   rd      s         " " "(3- " " " "(# # #," " " " " ", , , , , ,\FC FM F F F F$
+ 
+ 
+ 
+ 
+ 
+ 
+r   rd   c                   V    e Zd ZdZdefdZdedefdZdefdZdedd fd	Z	d
 Z
d ZdS )WebResolverz+
    Resolve assets from a remote URL.
    urlc                    t          |d          r|                    d          }t          |          }d |j                            d          D             }t          |          dk    rd}n=d|d         v rd                    |d	d                   }nd                    |          }|| _        d                    d
 |j        dz   |j	        
                    d          |
                    d          fD                       dz   | _        d| j        t          |j                  dz   d	         vsJ | j                            d          sJ |                    d          d         | _        d	S )z
        Resolve assets from a base URL.

        Parameters
        --------------
        url : str
          Location where a mesh was stored or
          directory where mesh was stored
        rr   rs   c                 8    g | ]}t          |          d k    |S )r   rN   rl   is     r   ro   z(WebResolver.__init__.<locals>.<listcomp>J  s#    AAAqc!ffqjjjjjr   rT   r    .rU   Nc              3   @   K   | ]}t          |          d k    |V  dS )r   Nr   r   s     r   	<genexpr>z'WebResolver.__init__.<locals>.<genexpr>\  s:        q66A:: ::: r   z:/z//   )rt   rr   r
   r@   rF   rN   rO   r   schemenetlocrW   base_urlendswithrJ   )r   r   parsedrF   r@   s        r   r   zWebResolver.__init__:  s    3!! 	&**W%%C #AAFK--c22AAA u::??DDE"I88E#2#J''DD 88E??D  HH   -$.0C0CC0H0H$**UX//Z    
  	 4=V]););a)?)A)ABBBBB}%%c*****3+r   r   r/   c                 <   ddl }|                                }| j        |z   }|                    |d          }|j        dk    r>|                    d          r
|dd         }|                    | j        |z   d          }|                                 |j        S )z
        Get a resource from the remote site.

        Parameters
        -------------
        name : str
          Asset name, i.e. 'quadknot.obj.mtl'
        r   NTfollow_redirectsi,  ./   )httpxrW   r   r   status_coderM   raise_for_statuscontent)r   r   r   r   responses        r   r   zWebResolver.getk  s     	 zz|| md"99S49883&&t$$  ABBxyy!5yMMH 	!!### r   c                 x    ddl }|                    | j        d          }|                                 |j        S )z
        Fetch the data at the full URL this resolver was
        instantiated with, i.e. `https://stuff.com/hi.glb`
        this will return the response.

        Returns
        --------
        content
          The value at `self.url`
        r   NTr   r   r   r   r   r   )r   r   r   s      r   get_basezWebResolver.get_base  sA     	 99TX9==!!###r   r"   c                 2    t          | j        |z             S )a  
        Return a namespaced version of current resolver.

        Parameters
        -------------
        namespace : str
          URL fragment

        Returns
        -----------
        resolver : WebResolver
          With sub-url: `https://example.com/{namespace}`
        )r   )r   r   r$   s     r   r%   zWebResolver.namespaced  s     t}y89999r   c                      t          d          )Nz`WebResolver` is read-only!r   r,   s      r   r!   zWebResolver.write  s    !"?@@@r   c                      t          d          )Nz`WebResolver` can't list keysr   r'   s    r   r(   zWebResolver.keys  s    !"ABBBr   N)r2   r3   r4   r5   r8   r   rb   r   r   r%   r!   r(   r:   r   r   r   r   5  s         /,C /, /, /, /,b           B %        $:C :M : : : :"A A AC C C C Cr   r   c            
           e Zd Z	 	 	 ddedee         dee         dee         fdZd Zd Zed	e	fd
            Z
d Zd ZdS )GithubResolverNrepobranchcommitsavec                     |d| d| d| _         n |d| d| d| _         nt          d          |t          j        |          | _        dS d| _        dS )a  
        Get files from a remote Github repository by
        downloading a zip file with the entire branch
        or a specific commit.

        Parameters
        -------------
        repo
          In the format of `owner/repo`
        branch
          The remote branch you want to get files from.
        commit
          The full commit hash: pass either this OR branch.
        save
          A path if you want to save results locally.
        Nzhttps://github.com/z	/archive/z.zipz/archive/refs/heads/z$`commit` or `branch` must be passed!)r   rG   r   	DiskCachecache)r   r   r   r   r   s        r   r   zGithubResolver.__init__  s~    0 HTHHFHHHDHHSTSSvSSSDHHCDDD *400DJJJDJJJr   c                 4    | j                                         S )z
        List the available files in the repository.

        Returns
        ----------
        keys : iterable
          Keys available to the resolved.
        )zippedr(   r'   s    r   r(   zGithubResolver.keys  s     {!!!r   c                      t          d          r   r   r   s      r   r!   zGithubResolver.write  s    !"<===r   r/   c                 F    dt           f fd}t           d          r j        S  j                             j        |          }t          d t          j        t          j	        |          d          
                                D                        _         j        S )zj
        - opened zip file
        - locally saved zip file
        - retrieve zip file and saved
        r/   c                  z    ddl } |                     j        d          }|                                 |j        S )z4
            Fetch the remote zip file.
            r   NTr   r   )r   r   r   s     r   fetchz$GithubResolver.zipped.<locals>.fetch  s@     LLLyyDyAAH%%'''##r   _zipc                 N    i | ]"\  }}|                     d d          d         |#S )rT   r   )rF   )rl   rm   vs      r   
<dictcomp>z)GithubResolver.zipped.<locals>.<dictcomp>  s?       Aq Q"A  r   zip)	file_type)rb   rt   r   r   r   r   rd   r   
decompresswrap_as_streamitems)r   r   raws   `  r   r   zGithubResolver.zipped  s    	$u 	$ 	$ 	$ 	$ 	$ 	$ 4   	9jnnTXu--    O',,  %''	  
 
	 yr   c                 6    | j                             |          S r   )r   r   r   s     r   r   zGithubResolver.get  s    {s###r   c                 6    | j                             |          S )rz   )r   r%   r$   s     r   r%   zGithubResolver.namespaced  s      {%%i000r   )NNN)r2   r3   r4   r8   r   r   r(   r!   propertyrd   r   r   r%   r:   r   r   r   r     s         !% $"$ $$ $ 	$
 sm$ $ $ $L	" 	" 	"> > > ! ! ! ! X!F$ $ $1 1 1 1 1r   r   c              #   @  	K   d 	d d 	fd	fd	fdd d g}|d
}t                      }|D ].} ||           }||v r|                    |           ||z   V  /t          j        |d          D ]o\  }} | ||                     }||v r|                    |           ||z   V   | ||                     }||v rS|                    |           ||z   V  pd| v r||                    d                              d          d	|                     d                    }|                    |                     d          d                             d                              d                     d                    |          V  d	S d	S d	S )z
    Try to find nearby variants of a specified name.

    Parameters
    ------------
    name : str
      Initial name.

    Yields
    -----------
    nearby : str
      Name that is a lightly permutated version
      of the initial name.
    c                 ^    |                     |           r|t          |           d          S |S r   rk   )prefixitems     r   trimznearby_names.<locals>.trim6  s0    ??6"" 	'F&&r   c                     | S r   r:   xs    r   <lambda>znearby_names.<locals>.<lambda><  s    ! r   c                 *    |                                  S r   )rW   r   s    r   r   znearby_names.<locals>.<lambda>=  s    !'')) r   c                      d|           S )Nr   r:   r   r   s    r   r   znearby_names.<locals>.<lambda>>      $$tQ-- r   c                      d|           S )Nz.\r:   r   s    r   r   znearby_names.<locals>.<lambda>?  s    $$ua.. r   c                      d|           S )N\r:   r   s    r   r   znearby_names.<locals>.<lambda>@  r   r   c                 L    t           j                            |           d         S )NrU   )r?   r@   rF   r   s    r   r   znearby_names.<locals>.<lambda>A  s    "'--""2& r   c                 .    |                      dd          S )Nz%20 )replacer   s    r   r   znearby_names.<locals>.<lambda>B  s    !))E3'' r   Nr   r   z..rT   rU   )	setadd	itertoolscombinationsrW   rF   countextendrO   )
r   r"   cleanershitr\   currentabrW   r   s
            @r   ru   ru   %  s     "   	    &&''H 	 %%C " "!D''c>>'!!!!!&x33 " "1!AAdGG**c>>'!!!! !AAdGG**c>>'!!!!!t||	-$$**3//0C4::d3C3C2C0CDTZZ%%b)//44::3??@@@hhuoo	 |--r   r   )r5   r6   r   r?   r   r   r   typedr   r   r   r	   urllib.parser
   ImportErrorABCr   r<   rd   r   r   ru   ResolverLiker:   r   r   <module>r      s    


     				         1 1 1 1 1 1 1 1 1 1 1 1"%%%%%%% " " "!!!!!!!!"
 "  "  "  "  "tx  "  "  "Fj7 j7 j7 j7 j7x j7 j7 j7ZH+ H+ H+ H+ H+( H+ H+ H+V~C ~C ~C ~C ~C( ~C ~C ~CBl1 l1 l1 l1 l1X l1 l1 l1^@ @ @ @H Xw&'s   + 99