
    hX                        d Z ddlZddlZddlZddl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 ddlmZ ddlmZmZmZm	Z	mZmZmZmZmZmZmZmZmZmZmZ ddlmZ ej@                  d	k\  ree!ee!   f   Z"nee!ef   Z" ed
e"      Z#	 ejH                  ejJ                  fD  cg c]  } | r| ejH                  k7  r|  c} Z&	 i Z'	 dejP                  de!fdZ)deee*ef      de!deee+   ee*   f   fdZ,	 d8dee   dee!   dee+   dee!df   fdZ-dee   deee*ef      fdZ.dede+fdZ/	 	 d9de"deee0gdf      dee+   ded   fdZ1de!de!d ee!e!f   dee0gdf   de+ded   fd!Z2	 	 d9de"deee0gdf      dee+   dee!   fd"Z3d9d#Z4d$e!deegef   fd%Z5dee   de!de+fd&Z6dee   dee!   dee!   fd'Z7	 d8de"d(ee	e!      de!fd)Z8	 d8dee"   d(ee	e!      dee!ee"   f   fd*Z9	 d8d$e!d+eegef   d,ee+   ddfd-Z: G d. d/e;      Z< G d0 d1e;      Z= ed23       G d4 d5ee#                Z> G d6 de?      Z@ G d7 de?      ZAyc c} w ):zC
This module provides utility methods for dealing with path-specs.
    N)
CollectionIterable)	dataclass)PathLike)AnyAnyStrCallabler   DictGenericr   IteratorListOptionalSequenceSetTupleTypeVarUnion   )Pattern)   	   TStrPath)boundpathreturnc                 b    t        |       }| j                         r|t        j                  z  }|S )a5  
	Appends the path separator to the path if the path is a directory.
	This can be used to aid in distinguishing between directories and
	files on the file-system by relying on the presence of a trailing path
	separator.

	*path* (:class:`pathlib.Path`) is the path to use.

	Returns the path (:class:`str`).
	)stris_dirossep)r   str_paths     @/var/www/html/immo/lib/python3.12/site-packages/pathspec/util.pyappend_dir_sepr#   D   s)     IKKM
bff(    patternsfilec                     d}d}| D ]2  \  }}|j                   |j                  |      %|j                   }|}4 ||fS )a  
	Check the file against the patterns.

	*patterns* (:class:`~collections.abc.Iterable`) yields each indexed pattern
	(:class:`tuple`) which contains the pattern index (:class:`int`) and actual
	pattern (:class:`~pathspec.pattern.Pattern`).

	*file* (:class:`str`) is the normalized file path to be matched
	against *patterns*.

	Returns a :class:`tuple` containing whether to include *file* (:class:`bool`
	or :data:`None`), and the index of the last matched pattern (:class:`int` or
	:data:`None`).
	Ninclude
match_file)r%   r&   out_include	out_indexindexpatterns         r"   check_match_filer/   V   sV    $  $  ^UG__ W%7%7%=%I;9
 	Yr$   filesall_matchesMatchDetailc                 X   t        |t              r|n
t        |      }i }| D ]  }|j                  |j	                  |      }|j                  rO|D ]I  }||v r4|r||   j
                  j                  |       (|||   j
                  d<   ;t        |g      ||<   K ||D ]  }||=   |S )a  
	Matches the files to the patterns, and returns which patterns matched
	the files.

	*patterns* (:class:`~collections.abc.Iterable` of :class:`~pathspec.pattern.Pattern`)
	contains the patterns to use.

	*files* (:class:`~collections.abc.Iterable` of :class:`str`) contains
	the normalized file paths to be matched against *patterns*.

	*all_matches* (:class:`bool` or :data:`None`) is whether to return all
	matches patterns (:data:`True`), or only the last matched pattern
	(:data:`False`). Default is :data:`None` for :data:`False`.

	Returns the matched files (:class:`dict`) which maps each matched file
	(:class:`str`) to the patterns that matched in order (:class:`.MatchDetail`).
	r   )
isinstanceCollectionTypelistr)   matchr%   appendr2   )	r%   r0   r1   	all_filesreturn_filesr.   result_filesresult_filer&   s	            r"   detailed_match_filesr=   r   s    , !7UT%[ W__ --	*<oo# 9|#	K ))009/6|K ))!,"-wi"8l;9  	d	!& 	r$   c                 f    t        |       D cg c]  \  }}|j                  ||f c}}S c c}}w )a&  
	Filters out null-patterns.

	*patterns* (:class:`Iterable` of :class:`.Pattern`) contains the
	patterns.

	Returns a :class:`list` containing each indexed pattern (:class:`tuple`) which
	contains the pattern index (:class:`int`) and the actual pattern
	(:class:`~pathspec.pattern.Pattern`).
	)	enumerater)   )r%   __index__pats      r"   _filter_check_patternsrB      s<     "(+	gu
]] E	  	s   -valuec                 T    t        | t              xr t        | t        t        f       S )z
	Check whether the value is an iterable (excludes strings).

	*value* is the value to check,

	Returns whether *value* is a iterable (:class:`bool`).
	)r4   IterableTyper   bytes)rC   s    r"   _is_iterablerG      s$     	5,'O
53,0O,OOr$   rooton_errorfollow_links	TreeEntryc              #      K   |t        |      st        d|d      |d}t        t        j                  j                  |       di ||      E d{    y7 w)a  
	Walks the specified directory for all files and directories.

	*root* (:class:`str` or :class:`os.PathLike`) is the root directory to
	search.

	*on_error* (:class:`~collections.abc.Callable` or :data:`None`)
	optionally is the error handler for file-system exceptions. It will be
	called with the exception (:exc:`OSError`). Reraise the exception to
	abort the walk. Default is :data:`None` to ignore file-system
	exceptions.

	*follow_links* (:class:`bool` or :data:`None`) optionally is whether
	to walk symbolic links that resolve to directories. Default is
	:data:`None` for :data:`True`.

	Raises :exc:`RecursionError` if recursion is detected.

	Returns an :class:`~collections.abc.Iterator` yielding each file or
	directory entry (:class:`.TreeEntry`) relative to *root*.
	Nz	on_error: is not callable.T )callable	TypeError_iter_tree_entries_nextr   r   abspathrH   rI   rJ   s      r"   iter_tree_entriesrT      sX     4 (!3Ih\):;<<,#BGGOOD$92r8\ZZZs   AAAA	root_fulldir_relmemoc           	   #   x  K   t         j                  j                  | |      }t         j                  j                  |      }||vr|||<   nt	        |||   |      t        j
                  |      5 }|D ]  }t         j                  j                  ||j                        }		 |j                  d      }
|j                         r	 |j                         }n|
}|j                  |      r2t        |j                  |	|
|       t        | |	|||      E d{    |j                         s|j                         st        |j                  |	|
|        	 ddd       ||= y# t        $ r}| ||       Y d}~d}~ww xY w# t        $ r}| ||       Y d}~,d}~ww xY w7 # 1 sw Y   ||= yxY ww)aq  
	Scan the directory for all descendant files.

	*root_full* (:class:`str`) the absolute path to the root directory.

	*dir_rel* (:class:`str`) the path to the directory to scan relative to
	*root_full*.

	*memo* (:class:`dict`) keeps track of ancestor directories
	encountered. Maps each ancestor real path (:class:`str`) to relative
	path (:class:`str`).

	*on_error* (:class:`~collections.abc.Callable` or :data:`None`)
	optionally is the error handler for file-system exceptions.

	*follow_links* (:class:`bool`) is whether to walk symbolic links that
	resolve to directories.

	Yields each entry (:class:`.TreeEntry`).
	)	real_path
first_pathsecond_pathF)follow_symlinksN)r   r   joinrealpathRecursionErrorscandirnamestatOSError
is_symlinkr   rK   rQ   is_file)rU   rV   rW   rI   rJ   dir_fulldir_real	scan_iternode_entnode_rel
node_lstate	node_stats                r"   rQ   rQ      s    6 GGLLG,GGX&
 D$x.d8nRYZZjj !Di Dhggll7HMM28u5J Y Ioolo3 HMM8Z
CC&y(D(LYYYh113
HMM8Z
CC?D!DP 
(^A  a[  qk Z;!DP 
(^s   A0F:20F+#E'5F+FAF+F)%F+>F+F:'	F0
F :F+ FF+	F&
F!F+!F&&F++F70
F:c              #   r   K   t        | ||      D ]"  }|j                  |      r|j                   $ yw)a  
	Walks the specified directory for all files.

	*root* (:class:`str` or :class:`os.PathLike`) is the root directory to
	search for files.

	*on_error* (:class:`~collections.abc.Callable` or :data:`None`)
	optionally is the error handler for file-system exceptions. It will be
	called with the exception (:exc:`OSError`). Reraise the exception to
	abort the walk. Default is :data:`None` to ignore file-system
	exceptions.

	*follow_links* (:class:`bool` or :data:`None`) optionally is whether
	to walk symbolic links that resolve to directories. Default is
	:data:`None` for :data:`True`.

	Raises :exc:`RecursionError` if recursion is detected.

	Returns an :class:`~collections.abc.Iterator` yielding the path to
	each file (:class:`str`) relative to *root*.
	rI   rJ   N)rT   r   r   )rH   rI   rJ   entrys       r"   iter_tree_filesrq   3  s6     4  xlS U	l	#	s   #77c                 V    t        j                  dt        d       t        | ||      S )zg
	DEPRECATED: The :func:`.iter_tree` function is an alias for the
	:func:`.iter_tree_files` function.
	zCutil.iter_tree() is deprecated. Use util.iter_tree_files() instead.   
stacklevelro   )warningswarnDeprecationWarningrq   rS   s      r"   	iter_treery   R  s)    
 
G1& 	xlKKr$   ra   c                     t         |    S )z
	Lookups a registered pattern factory by name.

	*name* (:class:`str`) is the name of the pattern factory.

	Returns the registered pattern factory (:class:`~collections.abc.Callable`).
	If no pattern factory is registered, raises :exc:`KeyError`.
	)_registered_patterns)ra   s    r"   lookup_patternr|   ]  s     	T""r$   c                 n    d}| D ]-  }|j                   |j                  |      "|j                   }/ |S )a7  
	Matches the file to the patterns.

	*patterns* (:class:`~collections.abc.Iterable` of :class:`~pathspec.pattern.Pattern`)
	contains the patterns to use.

	*file* (:class:`str`) is the normalized file path to be matched
	against *patterns*.

	Returns :data:`True` if *file* matched; otherwise, :data:`False`.
	Fr(   )r%   r&   matchedr.   s       r"   r*   r*   i  sB      W__ W%7%7%=%I__7 	r$   c                     t        j                  t         dt         dt        d       | D cg c]  }|j                  | }}t               }|D ]   }t        ||      s|j                  |       " |S c c}w )a  
	DEPRECATED: This is an old function no longer used. Use the
	:func:`~pathspec.util.match_file` function with a loop for better results.

	Matches the files to the patterns.

	*patterns* (:class:`~collections.abc.Iterable` of :class:`~pathspec.pattern.Pattern`)
	contains the patterns to use.

	*files* (:class:`~collections.abc.Iterable` of :class:`str`) contains
	the normalized file paths to be matched against *patterns*.

	Returns the matched files (:class:`set` of :class:`str`).
	z".match_files() is deprecated. Use z-.match_file() with a loop for better results.rs   rt   )rv   rw   __name__rx   r)   setr*   add)r%   r0   rA   use_patternsr:   r&   s         r"   match_filesr   }  s    $ 
J0
 ;  1&
 %-J50IJJ Td#D 	 Ks   A8A8
separatorsc                     |t         }t        j                  |       }|D ]"  }|j                  |t        j
                        }$ |j                  d      r|dd }|S |j                  d      r|dd }|S )ay  
	Normalizes the file path to use the POSIX path separator (i.e.,
	``"/"``), and make the paths relative (remove leading ``"/"``).

	*file* (:class:`str` or :class:`os.PathLike`) is the file path.

	*separators* (:class:`~collections.abc.Collection` of :class:`str`; or
	``None``) optionally contains the path separators to normalize.
	This does not need to include the POSIX path separator (``"/"``),
	but including it will not affect the results. Default is ``None``
	for ``NORMALIZE_PATH_SEPS``. To prevent normalization, pass an
	empty container (e.g., an empty tuple ``()``).

	Returns the normalized file path (:class:`str`).
	N/r   z./rs   )NORMALIZE_PATH_SEPSr   fspathreplace	posixpathr    
startswith)r&   r   	norm_filer    s       r"   normalize_filer     s    ( "* ))D/ 4SY]]3)4 m) 		 4 m)r$   c                     t        j                  dt        d       i }| D ].  }t        ||      }||v r||   j	                  |       )|g||<   0 |S )a  
	DEPRECATED: This function is no longer used. Use the :func:`.normalize_file`
	function with a loop for better results.

	Normalizes the file paths to use the POSIX path separator.

	*files* (:class:`~collections.abc.Iterable` of :class:`str` or
	:class:`os.PathLike`) contains the file paths to be normalized.

	*separators* (:class:`~collections.abc.Collection` of :class:`str`; or
	:data:`None`) optionally contains the path separators to normalize.
	See :func:`normalize_file` for more information.

	Returns a :class:`dict` mapping each normalized file path (:class:`str`)
	to the original file paths (:class:`list` of :class:`str` or
	:class:`os.PathLike`).
	z_util.normalize_files() is deprecated. Use util.normalize_file() with a loop for better results.rs   rt   )r   )rv   rw   rx   r   r8   )r0   r   
norm_filesr   r   s        r"   normalize_filesr     sk    * 
$1&
  "TTj9)*i% 6:i" 	r$   pattern_factoryoverridec                     t        | t              st        d| d      t        |      st        d|d      | t        v r|st        | t        |          |t        | <   y)aE  
	Registers the specified pattern factory.

	*name* (:class:`str`) is the name to register the pattern factory
	under.

	*pattern_factory* (:class:`~collections.abc.Callable`) is used to
	compile patterns. It must accept an uncompiled pattern (:class:`str`)
	and return the compiled pattern (:class:`.Pattern`).

	*override* (:class:`bool` or :data:`None`) optionally is whether to
	allow overriding an already registered pattern under the same name
	(:data:`True`), instead of raising an :exc:`AlreadyRegisteredError`
	(:data:`False`). Default is :data:`None` for :data:`False`.
	zname:z is not a string.zpattern_factory:rM   N)r4   r   rP   rO   r{   AlreadyRegisteredError)ra   r   r   s      r"   register_patternr     sk    ( 	4E$!2344!$_$77HIJJ  t%9$%?@@-dr$   c                        e Zd ZdZdedeegef   ddf fdZe	defd       Z
e	defd       Ze	deegef   fd	       Z xZS )
r   z|
	The :exc:`AlreadyRegisteredError` exception is raised when a pattern
	factory is registered under a name already in use.
	ra   r   r   Nc                 .    t         t        |   ||       y)z
		Initializes the :exc:`AlreadyRegisteredError` instance.

		*name* (:class:`str`) is the name of the registered pattern.

		*pattern_factory* (:class:`~collections.abc.Callable`) is the
		registered pattern factory.
		N)superr   __init__)selfra   r   	__class__s      r"   r   zAlreadyRegisteredError.__init__  s     .t_Er$   c                 P    dj                  | j                  | j                        S )4
		*message* (:class:`str`) is the error message.
		zG{name!r} is already registered for pattern factory:{pattern_factory!r}.)ra   r   )formatra   r   r   s    r"   messagezAlreadyRegisteredError.message   s.    
 
S	Y	Y		'' 
Z 
 r$   c                      | j                   d   S )zB
		*name* (:class:`str`) is the name of the registered pattern.
		r   argsr   s    r"   ra   zAlreadyRegisteredError.name*  s    
 
1r$   c                      | j                   d   S )za
		*pattern_factory* (:class:`~collections.abc.Callable`) is the
		registered pattern factory.
		r   r   r   s    r"   r   z&AlreadyRegisteredError.pattern_factory1       
1r$   )r   
__module____qualname____doc__r   r	   r   r   r   propertyr   ra   r   __classcell__r   s   @r"   r   r     s    
FF VHg-.F 	F c   3   hx'89  r$   r   c                        e Zd ZdZdedededdf fdZedefd       Zedefd	       Zedefd
       Z	edefd       Z
 xZS )r_   zN
	The :exc:`RecursionError` exception is raised when recursion is
	detected.
	rY   rZ   r[   r   Nc                 0    t         t        |   |||       y)a+  
		Initializes the :exc:`RecursionError` instance.

		*real_path* (:class:`str`) is the real path that recursion was
		encountered on.

		*first_path* (:class:`str`) is the first path encountered for
		*real_path*.

		*second_path* (:class:`str`) is the second path encountered for
		*real_path*.
		N)r   r_   r   )r   rY   rZ   r[   r   s       r"   r   zRecursionError.__init__@  s    $ &y*kJr$   c                      | j                   d   S )zx
		*first_path* (:class:`str`) is the first path encountered for
		:attr:`self.real_path <RecursionError.real_path>`.
		r   r   r   s    r"   rZ   zRecursionError.first_pathT  r   r$   c                 f    dj                  | j                  | j                  | j                        S )r   zDReal path {real!r} was encountered at {first!r} and then {second!r}.)realfirstsecond)r   rY   rZ   r[   r   s    r"   r   zRecursionError.message\  s5    
 
P	V	V	


 
W 
 r$   c                      | j                   d   S )zV
		*real_path* (:class:`str`) is the real path that recursion was
		encountered on.
		r   r   r   s    r"   rY   zRecursionError.real_pathg  r   r$   c                      | j                   d   S )zz
		*second_path* (:class:`str`) is the second path encountered for
		:attr:`self.real_path <RecursionError.real_path>`.
		rs   r   r   s    r"   r[   zRecursionError.second_patho  r   r$   )r   r   r   r   r   r   r   rZ   r   rY   r[   r   r   s   @r"   r_   r_   :  s    
KK K 	K
 K(    c      #  r$   r_   T)frozenc                   D    e Zd ZU dZdZeed<   	 ee   ed<   	 ee	   ed<   y)CheckResultze
	The :class:`CheckResult` class contains information about the file and which
	pattern matched it.
	)r&   r)   r-   r&   r)   r-   N)
r   r   r   r   	__slots__r   __annotations__r   boolint r$   r"   r   r   x  s<      4.
 	r$   r   c                   *    e Zd ZdZdZdee   ddfdZy)r2   z>
	The :class:`.MatchDetail` class contains information about
	r%   r%   r   Nc                     || _         y)z
		Initialize the :class:`.MatchDetail` instance.

		*patterns* (:class:`~collections.abc.Sequence` of :class:`~pathspec.pattern.Pattern`)
		contains the patterns that matched the file in the order they were
		encountered.
		Nr   )r   r%   s     r"   r   zMatchDetail.__init__  s     $-r$   )r   r   r   r   r   r   r   r   r   r$   r"   r2   r2     s&    
 hw/ D r$   c            
           e Zd ZdZdZdededej                  dej                  ddf
d	Zdd
e	e
   de
fdZdd
e	e
   de
fdZde
fdZdd
e	e
   dej                  fdZy)rK   zR
	The :class:`.TreeEntry` class contains information about a file-system
	entry.
	_lstatra   r   _statra   r   lstatrb   r   Nc                 B    || _         	 || _        	 || _        	 || _        y)aP  
		Initialize the :class:`.TreeEntry` instance.

		*name* (:class:`str`) is the base name of the entry.

		*path* (:class:`str`) is the relative path of the entry.

		*lstat* (:class:`os.stat_result`) is the stat result of the direct
		entry.

		*stat* (:class:`os.stat_result`) is the stat result of the entry,
		potentially linked.
		Nr   )r   ra   r   r   rb   s        r"   r   zTreeEntry.__init__  s:    * !&$+
 $) $)  $$*r$   rJ   c                 |    |d}|r| j                   n| j                  }t        j                  |j                        S )a<  
		Get whether the entry is a directory.

		*follow_links* (:class:`bool` or :data:`None`) is whether to follow
		symbolic links. If this is :data:`True`, a symlink to a directory
		will result in :data:`True`. Default is :data:`None` for :data:`True`.

		Returns whether the entry is a directory (:class:`bool`).
		T)r   r   rb   S_ISDIRst_moder   rJ   rm   s      r"   r   zTreeEntry.is_dir  5     <(djjdkk)	i''	((r$   c                 |    |d}|r| j                   n| j                  }t        j                  |j                        S )aE  
		Get whether the entry is a regular file.

		*follow_links* (:class:`bool` or :data:`None`) is whether to follow
		symbolic links. If this is :data:`True`, a symlink to a regular file
		will result in :data:`True`. Default is :data:`None` for :data:`True`.

		Returns whether the entry is a regular file (:class:`bool`).
		T)r   r   rb   S_ISREGr   r   s      r"   re   zTreeEntry.is_file  r   r$   c                 T    t        j                  | j                  j                        S )zC
		Returns whether the entry is a symbolic link (:class:`bool`).
		)rb   S_ISLNKr   r   r   s    r"   rd   zTreeEntry.is_symlink  s     
dkk))	**r$   c                 >    |d}|r| j                   S | j                  S )a9  
		Get the cached stat result for the entry.

		*follow_links* (:class:`bool` or :data:`None`) is whether to follow
		symbolic links. If this is :data:`True`, the stat result of the
		linked file will be returned. Default is :data:`None` for :data:`True`.

		Returns that stat result (:class:`os.stat_result`).
		T)r   r   )r   rJ   s     r"   rb   zTreeEntry.stat  s$     <#44r$   N)r   r   r   r   r   r   r   stat_resultr   r   r   r   re   rd   rb   r   r$   r"   rK   rK     s     1)) 	) 
	)
 	) )V) )$ ) )$ )4 ) + +5htn 5 5r$   r   )NN)Br   r   os.pathpathlibr   rb   sysrv   collections.abcr   r5   r   rE   dataclassesr   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r.   r   version_infor   StrPathr   r    altsepr   r{   Pathr#   r   r   r/   r=   rB   rG   rc   rT   rQ   rq   ry   r|   r*   r   r   r   r   	Exceptionr   r_   r   objectr2   rK   )__seps   0r"   <module>r      s&   
     
     "
 vhsm#$h:W- vvryy!
	ey}}$  
   # $E#w,'(
 8D>8C=()>  $+G++ tn+ 
#}
	+\G	%W
(P P P 26 $ [ [HgY_-. [ ~ [ k	 [FNN
N CH~N WItO$	N
 N kNf 26 $HgY_-. ~ c]	>L	# 	#6(G*;!< 	#'* # $ (G 	XF *.%%jo&% 	%T *.""jo&" 
#tG}
"P !.
.F8W,-. D>. 
	.@,Y ,^;Y ;| $'(#  >& 2g5 g5As   !I