
    jBC                        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  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y# e$ r	 ddlmZ Y Zw xY w)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y)Resolverz'
    The base class for resolvers.
    c                     t        d      )NzUse a resolver subclass!NotImplementedError)selfargskwargss      >/DATA/.local/lib/python3.12/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Br   c                     t        d      )Nz`keys` not implemented!r   r   s    r   keyszResolver.keys/   s    !";<<r   r   c                 $    | j                  |      S r   )r   r   s     r   __getitem__zResolver.__getitem__3   s    xx}r   c                 &    | j                  ||      S r   )r!   r   r   values      r   __setitem__zResolver.__setitem__6   s    zz#u%%r   returnc                 &    || j                         v S r   )r(   r   s     r   __contains__zResolver.__contains__9   s    diik!!r   N)__name__
__module____qualname____doc__abcabstractmethodr   r   strr!   r%   r(   r*   r.   boolr1    r   r   r   r      s     	> > 	$ $ 	># > > 	CC C C 	= =s &s &" " "r   r   c                   X    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y)FilePathResolverz>
    Resolve files from a source path on the file system.
    sourcec                    t         j                  j                  t         j                  j                  t	        |                  }|| _        t         j                  j                  |      r|| _        n)t         j                  j                  |      }|d   | _        t         j                  j                  | j                        st        d| j                   d      || _
        t         j                  j                  |      | _        y)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     ""277??3v;#?@
77==DK GGMM%(E(DK ww}}T[[)vdkk]2DEFF))&1r   c              #     K   | j                   }t        j                  | j                         D ]N  \  }}}|j                  |      r|t	        |      d }|D ]$  }t        j
                  j                  ||       & P yw)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^   si       ggdkk2ND!Uv&CKM*ggll4..  3s   A>B r"   r/   c                 h    t        t        j                  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EEr   r   c                 x   t         j                  j                  | j                  |j	                               }t         j                  j                  |      sGt         j                  j                  | j                  |j	                         j                  d            }t         j                  j                  |      sJt         j                  j                  | j                  t         j                  j                  |      d         }t        |d      5 }|j                         }ddd       |S # 1 sw Y   S xY w)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     ww||DKK6ww~~d#77<<TZZ\-@-@-EFDww~~d#77<<RWW]]4-@-DED$668D  s   D//D9r    c                     t        t        j                  j                  | j                  |j                               d      5 }t        j                  ||       ddd       y# 1 sw Y   yxY w)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   sF     "'',,t{{DJJL94@A6 A@@s   A$$A-N)r2   r3   r4   r5   r8   r   r(   r%   r   r	   bytesr!   r:   r   r   r<   r<   =   sW    2s 28/$FC F,> F" 07# 7U3:%6 7r   r<   c                   p    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y)ZipResolverz-
    Resolve files inside a ZIP archive.
    Narchiver"   c                     || _         t        |t              r(|j                         j	                  d      dz   | _        yd| _        y)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__   s:     i%&__.55c:S@DN!DNr   c                    | j                   a| j                   }t        |      }| j                  j                         D cg c]&  }|j	                  |      rt        |      |kD  r||d ( c}S | j                  j                         S c c}w )z
        Get the available keys in the current archive.

        Returns
        -----------
        keys : iterable
          Keys in the current archive.
        N)r"   rN   re   r(   rM   )r   r"   lengthks       r   r(   zZipResolver.keys   s     >>%I^F **,,A<<	*s1v &'
, 
 ||  ""s    +Br   r/   c                 H    | j                   i | _         || j                   |<   y)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                 J   |yt        |d      r|j                  d      }| j                  }||vr#t        || j                        D ]
  }||v s|} n ||   }t        |t        t        f      r|S |j                  d       |j                         }|j                  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   )
hasattrrn   re   nearby_namesr"   rg   rb   r8   seekr[   )r   r   re   optionobjr    s         r   r   zZipResolver.get   s     <4";;w'D,, w&tT^^<W$ "D = dmcE3<(J 	xxzr   c                 0    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Er   c                 @    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%   ry   r:   r   r   rd   rd      sp    " "(3- "(#," " ", , ,\FC FM F$
+ 
+r   rd   c                   T    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y)WebResolverz+
    Resolve assets from a remote URL.
    urlc                    t        |d      r|j                  d      }t        |      }|j                  j	                  d      D cg c]  }t        |      dkD  s| }}t        |      dk(  rd}n-d|d   v rdj                  |dd       }ndj                  |      }|| _        dj                  d	 |j                  d
z   |j                  j                  d      |j                  d      fD              dz   | _        d| j                  t        |j                        dz   d vsJ | j                  j                  d      sJ |j	                  d      d   | _        yc c}w )z
        Resolve assets from a base URL.

        Parameters
        --------------
        url : str
          Location where a mesh was stored or
          directory where mesh was stored
        rn   ro   rT   r    .rU   Nc              3   <   K   | ]  }t        |      d kD  r|  yw)r   N)rN   ).0is     r   	<genexpr>z'WebResolver.__init__.<locals>.<genexpr>\  s#      ZAq6A: Zs   z:/z//   )rp   rn   r
   r@   rF   rN   rO   r|   schemenetlocrW   base_urlendswithrJ   )r   r|   parsedr   rF   r@   s         r   r   zWebResolver.__init__:  sP    3!**W%C #"KK--c2A2qc!fqj2A u:?DE"I88E#2J'D 88E?D  HH  --$.0C0CC0H$**UX/Z 
  	 4==V]]);a)?)ABBBB}}%%c***3+? Bs   EEr   r/   c                 0   ddl }|j                         }| j                  |z   }|j                  |d      }|j                  dk\  r6|j                  d      r|dd }|j                  | j                  |z   d      }|j                          |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| mmd"99S4983&t$ABxyy!5yMH 	!!# r   c                 |    ddl }|j                  | j                  d      }|j                          |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  s7     	 99TXX9=!!#r   r"   c                 4    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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Br   N)r2   r3   r4   r5   r8   r   rb   r   r   r%   r!   r(   r:   r   r   r{   r{   5  sS    /,C /,b     B %  $:C :M :"ACr   r{   c            
       l    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y)GithubResolverNrepobranchcommitsavec                     |d| d| d| _         n|d| d| d| _         nt        d      |t        j                  |      | _        yd| _        y)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__  sh    0 ,TF)F84HDH,TF2FvhdSDHCDD **40DJDJr   c                 6    | j                   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           
          dt         f fd}t         d      r j                  S  j                  j	                   j
                  |      }t        t        j                  t        j                  |      d      j                         D ci c]  \  }}|j                  dd      d   | c}}       _         j                  S c c}}w )zj
        - opened zip file
        - locally saved zip file
        - retrieve zip file and saved
        r/   c                  ~    ddl } | j                  j                  d      }|j                          |j                  S )z4
            Fetch the remote zip file.
            r   NTr   r   )r   r   r   s     r   fetchz$GithubResolver.zipped.<locals>.fetch  s6     yyDyAH%%'###r   _zipzip)	file_typerT   r   )rb   rp   r   r   r   r|   rd   r   
decompresswrap_as_streamitemsrF   )r   r   rawrk   vs   `    r   r   zGithubResolver.zipped  s    	$u 	$ 4 99jjnnTXXu-   !OO'',%'DAq Q"A%
	 yys    C
c                 8    | j                   j                  |      S r   )r   r   r   s     r   r   zGithubResolver.get  s    {{s##r   c                 8    | j                   j                  |      S )rv   )r   r%   r$   s     r   r%   zGithubResolver.namespaced  s      {{%%i00r   )NNN)r2   r3   r4   r8   r   r   r(   r!   propertyrd   r   r   r%   r:   r   r   r   r     su     !% $"$$ $ 	$
 sm$L	"> ! ! !F$1r   r   c              #     	K   d 	d d 	fd	fd	fdd d g}|d
}t               }|D ]'  } ||       }||v r|j                  |       ||z    ) t        j                  |d      D ][  \  }} | ||             }||v r|j                  |       ||z     | ||             }||v rD|j                  |       ||z    ] d| v r||j	                  d      j                  d      d	| j                  d        }|j                  | j                  d      d   j	                  d      j                  d             dj                  |       y	y	y	w)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                 D    |j                  |       r|t        |       d  S |S r   )rM   rN   )prefixitems     r   trimznearby_names.<locals>.trim6  s$    ??6"F&&r   c                     | S r   r:   xs    r   <lambda>znearby_names.<locals>.<lambda><  s    !r   c                 "    | j                         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                 F    t         j                  j                  |       d   S )NrU   )r?   r@   rF   r   s    r   r   znearby_names.<locals>.<lambda>A  s    "''--"2&r   c                 &    | j                  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   rq   rq   %  so    " 	 &'H 	 %CD'c>'!!  &&x31AdG*c>'!! AdG*c>'!! 4 t|	-$**3/0C4::d3C2CDTZZ%b)//4::3?@hhuo	 .|s   EEr   )r5   r6   r   r?   r~   r   r   typedr   r   r   r	   urllib.parser
   ImportErrorABCr   r<   rd   r{   r   rq   ResolverLiker:   r   r   <module>r      s      	  1 1"% "txx  "Fj7x j7ZH+( H+V~C( ~CBl1X l1^@H Xw&'i  "!"s   A7 7BB