
    ITh                         S r SSKJr  SSKJr  SSKJrJrJrJrJ	r	J
r
Jr  \
" S5      r/ SQrSS/rS	S	S	S
.S\\   S\	\\\   \4      S\	\\\   \4      S\	\\/\4      S\\S	S	4   4
S jjrS\S\4S jrg	)z6Contains utilities to handle paths in Huggingface Hub.    fnmatch)Path)Callable	GeneratorIterableListOptionalTypeVarUnionT).gitz.git/*z*/.gitz
**/.git/**z.cache/huggingfacez.cache/huggingface/*z*/.cache/huggingfacez**/.cache/huggingface/**r   z.cacheN)allow_patternsignore_patternskeyitemsr   r   r   returnc             #     ^#    [        U[        5      (       a  U/n[        U[        5      (       a  U/nUb  U Vs/ s H  n[        U5      PM     nnUb  U Vs/ s H  n[        U5      PM     nnUc  S[        S[        4S jnUnU  HM  nU" U5      mUb  [	        U4S jU 5       5      (       d  M*  Ub  [	        U4S jU 5       5      (       a  MI  Uv   MO     gs  snf s  snf 7f)a   Filter repo objects based on an allowlist and a denylist.

Input must be a list of paths (`str` or `Path`) or a list of arbitrary objects.
In the later case, `key` must be provided and specifies a function of one argument
that is used to extract a path from each element in iterable.

Patterns are Unix shell-style wildcards which are NOT regular expressions. See
https://docs.python.org/3/library/fnmatch.html for more details.

Args:
    items (`Iterable`):
        List of items to filter.
    allow_patterns (`str` or `List[str]`, *optional*):
        Patterns constituting the allowlist. If provided, item paths must match at
        least one pattern from the allowlist.
    ignore_patterns (`str` or `List[str]`, *optional*):
        Patterns constituting the denylist. If provided, item paths must not match
        any patterns from the denylist.
    key (`Callable[[T], str]`, *optional*):
        Single-argument function to extract a path from each item. If not provided,
        the `items` must already be `str` or `Path`.

Returns:
    Filtered list of objects, as a generator.

Raises:
    :class:`ValueError`:
        If `key` is not provided and items are not `str` or `Path`.

Example usage with paths:
```python
>>> # Filter only PDFs that are not hidden.
>>> list(filter_repo_objects(
...     ["aaa.PDF", "bbb.jpg", ".ccc.pdf", ".ddd.png"],
...     allow_patterns=["*.pdf"],
...     ignore_patterns=[".*"],
... ))
["aaa.pdf"]
```

Example usage with objects:
```python
>>> list(filter_repo_objects(
... [
...     CommitOperationAdd(path_or_fileobj="/tmp/aaa.pdf", path_in_repo="aaa.pdf")
...     CommitOperationAdd(path_or_fileobj="/tmp/bbb.jpg", path_in_repo="bbb.jpg")
...     CommitOperationAdd(path_or_fileobj="/tmp/.ccc.pdf", path_in_repo=".ccc.pdf")
...     CommitOperationAdd(path_or_fileobj="/tmp/.ddd.png", path_in_repo=".ddd.png")
... ],
... allow_patterns=["*.pdf"],
... ignore_patterns=[".*"],
... key=lambda x: x.repo_in_path
... ))
[CommitOperationAdd(path_or_fileobj="/tmp/aaa.pdf", path_in_repo="aaa.pdf")]
```
Nitemr   c                     [        U [        5      (       a  U $ [        U [        5      (       a  [        U 5      $ [        SU  S35      e)Nz9Please provide `key` argument in `filter_repo_objects`: `z` is not a string.)
isinstancestrr   
ValueError)r   s    T/var/www/auris/envauris/lib/python3.13/site-packages/huggingface_hub/utils/_paths.py	_identity&filter_repo_objects.<locals>._identitys   sC    $$$$%%4y XY]X^^pqrr    c              3   <   >#    U  H  n[        TU5      v   M     g 7fNr   .0rpaths     r   	<genexpr>&filter_repo_objects.<locals>.<genexpr>   s     1[Nq'$2B2BN   c              3   <   >#    U  H  n[        TU5      v   M     g 7fr   r   r    s     r   r$   r%      s     .YAwtQ/?/?r&   )r   r   _add_wildcard_to_directoriesr   any)r   r   r   r   pr   r   r#   s          @r   filter_repo_objectsr+   '   s     ~ .#&&()/3''*+!CQR>a6q9>R"DSTOq7:OT
{	sA 	s# 	s 4y %c1[N1[.[.[ &3.Y.Y+Y+Y
  STs   8C$C	C$C.A6C$patternc                 "    U S   S:X  a  U S-   $ U $ )N/* )r,   s    r   r(   r(      s    r{c}Nr   )__doc__r   pathlibr   typingr   r   r   r	   r
   r   r   r   DEFAULT_IGNORE_PATTERNSFORBIDDEN_FOLDERSr   r+   r(   r1   r   r   <module>r7      s    =   P P P CL	  X&  7;7;(,`A;` U49c>23` eDIsN34	`
 
(A38$	%` q$}`F# # r   