o
    oĎi)                     @   s  d dl Z d dlZd dlZejdd Ze dd\ZZe	e
ee
e Zedddeddd	d
Ze dd Zejdddd Ze dd ZG dd dZG dd dZG dd deZG dd deZG dd deZG dd deZdS )    Nc                 C   s   |  ddkS )NAa)normcase)flavour r   T/home/jeff/fluffinator/venv/lib/python3.10/site-packages/cloudpathlib/legacy/glob.py_is_case_sensitive
   s   r   _
/)r
   r	   \)r   r	   )r
   r   c                 C   s   | d }|s	t  S |dkr;d}|t| k r+| | dkr+|d7 }|t| k r+| | dks| |d  }d|v r8t}nt}n| dd  }|dkrHt}n
d|v rPtdt}|||||S )Nr   z**   ..z:Invalid pattern: '**' can only be an entire path component)_TerminatingSelectorlen _DoubleRecursiveWildcardSelector_RecursiveWildcardSelector_ParentSelector
ValueError_WildcardSelector)pattern_partsr   case_sensitivepatchild_parts_idxchild_partsclsr   r   r   _make_selector   s&   r      )maxsizec                 C   s$   |rt jnt j}t t| |jS N)reNOFLAG
IGNORECASEcompilefnmatch	translatematch)r   r   flagsr   r   r   _compile_pattern7   s   r'   c                 C   s~   dg}| j ddD ]}|dkrd}n|dkrd}nt|t }|| q	|d tj}|s5|tjO }tjd		||d
S )aY  Compile the given pattern lines to an `re.Pattern` object.

    The *pattern_lines* argument is a glob-style pattern (e.g. '*/*.py') with
    its path separators and newlines swapped (e.g. '*
*.py`). By using
    newlines to separate path components, and not setting `re.DOTALL`, we
    ensure that the `*` wildcard cannot match path separators.

    The returned `re.Pattern` object may have its `match()` method called to
    match a complete pattern, or `search()` to match from the right. The
    argument supplied to these methods must also have its path separators and
    newlines swapped.
    ^T)keependsz*
z.+\n*z.+z\Z )r&   )

splitlinesr#   r$   _FNMATCH_SLICEappendr   	MULTILINEr!   r"   join)pattern_linesr   partspartr&   r   r   r   _compile_pattern_lines=   s   

r4   c                   @   s    e Zd ZdZdd Zdd ZdS )	_SelectorzYA selector matches a specific glob pattern part against the children
    of a given path.c                 C   s4   || _ |rt|||| _d| _d S t | _d| _d S )NTF)r   r   	successordironlyr   )selfr   r   r   r   r   r   __init__h   s   

z_Selector.__init__c                 C   s*   t |}|j}| stg S | ||S )zuIterate over all child paths of `parent_path` matched by this
        selector.  This can contain parent_path itself.)type_scandiris_diriter_select_from)r8   parent_pathpath_clsscandirr   r   r   select_fromq   s
   z_Selector.select_fromN)__name__
__module____qualname____doc__r9   rB   r   r   r   r   r5   d   s    	r5   c                   @   s   e Zd Zdd ZdS )r   c                 c   s    |V  d S r   r   )r8   r?   rA   r   r   r   r>   }   s   
z!_TerminatingSelector._select_fromN)rC   rD   rE   r>   r   r   r   r   r   {   s    r   c                   @      e Zd Zdd Zdd ZdS )r   c                 C      t | ||| d S r   r5   r9   )r8   namer   r   r   r   r   r   r9         z_ParentSelector.__init__c                 c   s*    | d}| j||D ]}|V  qd S )Nr   )_make_child_relpathr6   r>   )r8   r?   rA   pathpr   r   r   r>      s
   
z_ParentSelector._select_fromNrC   rD   rE   r9   r>   r   r   r   r   r      s    r   c                   @   rG   )r   c                 C   s0   t | ||| |d u rt|}t||| _d S r   )r5   r9   r   r'   r%   r8   r   r   r   r   r   r   r   r9      s   z_WildcardSelector.__init__c           	   	   c   s    z||}t |}W d    n1 sw   Y  W n
 ty%   Y d S w |D ]1}| jr?z| s4W q(W n	 ty>   Y q(w |j}| |rY||}| j||D ]}|V  qSq(d S r   )	listOSErrorr7   r<   rJ   r%   rL   r6   r>   )	r8   r?   rA   
scandir_itentriesentryrJ   rM   rN   r   r   r   r>      s2   



z_WildcardSelector._select_fromNrO   r   r   r   r   r      s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   rH   r   rI   rP   r   r   r   r9      rK   z#_RecursiveWildcardSelector.__init__c                 c   s6    |V  |  D ]\}}}|D ]}||V  qqd S r   )walkrL   )r8   r?   dirpathdirnamesr   dirnamer   r   r   _iterate_directories   s   z/_RecursiveWildcardSelector._iterate_directoriesc                 c   s4    | j j}| |D ]}|||D ]}|V  qq
d S r   )r6   r>   rZ   )r8   r?   rA   successor_selectstarting_pointrN   r   r   r   r>      s   z'_RecursiveWildcardSelector._select_fromN)rC   rD   rE   r9   rZ   r>   r   r   r   r   r      s    r   c                       s    e Zd ZdZ fddZ  ZS )r   z
    Like _RecursiveWildcardSelector, but also de-duplicates results from
    successive selectors. This is necessary if the pattern contains
    multiple non-adjacent '**' segments.
    c                 #   sN    t  }zt ||D ]}||vr|V  || qW |  d S |  w r   )setsuperr>   addclear)r8   r?   rA   yieldedrN   	__class__r   r   r>      s   
z-_DoubleRecursiveWildcardSelector._select_from)rC   rD   rE   rF   r>   __classcell__r   r   rb   r   r      s    r   )r#   	functoolsr   cacher   r$   split_FNMATCH_PREFIX_FNMATCH_SUFFIXslicer   r-   str	maketrans_SWAP_SEP_AND_NEWLINE	lru_cacher   r'   r4   r5   r   r   r   r   r   r   r   r   r   <module>   s,    




& 