
    <iLE                     v   U d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddlm
Z
 ddlmZmZ ddlmZmZmZmZ dd	lmZmZmZmZmZ dd
lmZmZmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z' dZ(ee)d<    ej*        d ej+        ej,                  ddej-                  Z.ee)d<    ej*        d ej+        ej/                  ddej-                  Z0ee)d<    G d de          Z1 G d de          Z2dee(dddfdedee         de3de3dee4         de5d eee4                  d!dfd"Z6deddddfdedee         de3dee3         dee4         de5d eee4                  d!e5fd#Z7d$de(dddddd%f	ded&e4dee         dee3         dee4         dee5         d'ee'         d(ee'         d eee4                  d)e5d!efd*Z8dS )+zA
.. codeauthor:: Tsuyoshi Hombashi <tsuyoshi.hombashi@gmail.com>
    N)Sequence)PathPurePath)Pattern)FinalOptional   )AbstractSanitizerAbstractValidatorBaseFileBaseValidator)findall_to_stris_nt_abspathto_strtruncate_strvalidate_pathtype)DEFAULT_MIN_LENINVALID_CHAR_ERR_MSG_TMPLPlatform)PathTypePlatformType)ErrorAttrKeyErrorReasonInvalidCharErrorValidationError)ReservedNameHandlerValidationErrorHandler   _DEFAULT_MAX_FILENAME_LEN[s]_RE_INVALID_FILENAME_RE_INVALID_WIN_FILENAMEc                        e Zd Zedddddddfdedee         dee         dee         dee         dee	e                  d	e
d
ee         ddf fdZddededefdZdee         fdZ xZS )FileNameSanitizerNFmax_lenfs_encodingplatformnull_value_handlerreserved_name_handleradditional_reserved_namesvalidate_after_sanitize	validatorreturnc	           
          |r|}	nt          t          ||d||          }	t                                          ||||||||	           |                                 | _        d S )NTmin_lenr'   r(   check_reservedr,   r)   )r'   r(   r*   r+   r,   r)   r-   r.   )FileNameValidatorr   super__init___get_sanitize_regexp_sanitize_regexp)selfr'   r(   r)   r*   r+   r,   r-   r.   fname_validator	__class__s             /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/pathvalidate/_filename.pyr6   zFileNameSanitizer.__init__    s      
	'OO/''#*C!  O 	#1"7&?$;% 	 		
 		
 		
 !% 9 9 ; ;     valuereplacement_textc                    	 t          ||                     d                      nX# t          $ rK}|j        t          j        k    r0t          |t                    r |                     |          cY d }~S  d }~ww xY w| j	        
                    |t          |                    }t          || j        | j                  }	 | j                            |           n# t          $ r}|j        t          j        k    rN|                     |          }|j        |k    r-t)          j
        t)          j        |j                  ||          }n|j        t          j        k    rZ|                     d          rD|                    d          }|                    d          }|dvr|                    d          }n*|j        t          j        k    r|                     |          }Y d }~nd }~ww xY w| j        r\	 | j                            |           n@# t          $ r3}t          t          |          t          j        | j                  d }~ww xY wt          |t                    rt9          |          S |S )NTinclude_universalallow_whitespaces .z..z .)descriptionreasonr)   )r   _is_windowsr   rJ   r   	NULL_NAME
isinstancer   _null_value_handlerr8   substrr   _fs_encodingr'   
_validatorvalidateRESERVED_NAME_reserved_name_handlerreserved_namereescapeINVALID_CHARACTERlstriprstrip_validate_after_sanitizeINVALID_AFTER_SANITIZEr)   r   )r9   r?   r@   esanitized_filenamereplacement_words         r<   sanitizezFileNameSanitizer.sanitizeD   s   	e4;K;K^b;K;c;c7cddddd 	 	 	x;000eX.. //22222222	 "2667GUTT)*<d>OQUQ]^^	AO$$%78888 	A 	A 	Ax;444#'#>#>q#A#A ?&666)+	!/224DFX* *& [:::t?O?O"& @P @ @: &8%>%>s%C%C" &8%>%>s%C%C"%[88);)B)B4)H)H&[222%)%=%=a%@%@"%	A( ( 	(();<<<<"   % #A&=!]    eX&& 	,*+++!!sQ   &) 
A>?A92A>8A99A>C! !G2,C<G--G2=H 
I".IIc                 J    |                      d          rt          S t          S )NTrB   )rK   r$   r#   )r9   s    r<   r7   z&FileNameSanitizer._get_sanitize_regexpw   s'    d33 	,++##r=   )r>   )__name__
__module____qualname__r   intr   rP   r   r   r   boolr   r6   r   ra   r   r7   __classcell__r;   s   @r<   r&   r&      s'        1%)+/?CBF=A(-15"< "<"< c]"< <(	"<
 %%;<"<  ((>?"< $,HSM#:"< "&"< -."< 
"< "< "< "< "< "<H1" 1"h 1"# 1"x 1" 1" 1" 1"f$gcl $ $ $ $ $ $ $ $r=   r&   c                       e Zd ZU d ed  ej        d edd                    D                       z    ed  ej        dd          D                       z   Zee	d<   d	Z
ee	d
<   edeedf         f fd            Zeeddddfdededee         dee         dedeee                  ddf fdZdeddfdZdeddfdZdeddfdZdeddfdZ xZS )r4   )CONPRNAUXzCLOCK$NULc              #   ,   K   | ]\  }}|d |dV  dS )r!   dN ).0namenums      r<   	<genexpr>zFileNameValidator.<genexpr>   s7      ddytS4""3"""ddddddr=   )COMLPTr   
   c              #   ,   K   | ]\  }}|d |d V  dS )r!   Nrq   )rr   rs   ssds      r<   ru   zFileNameValidator.<genexpr>   sK       
 
c s
 
 
 
 
 
r=   )   ¹   ²   ³_WINDOWS_RESERVED_FILE_NAMES):_MACOS_RESERVED_FILE_NAMESr/   .c                    t                      j        }|                                 r t          || j        z   | j        z             }n{|                                 rt          || j        z             }nO|                                 s|                                 rt          || j        z             }nt          |          }t          t          |                    S )N)r5   reserved_keywords_is_universalsetr~   r   rK   	_is_posix	_is_macostuplesorted)r9   common_keywordsword_setr;   s      r<   r   z#FileNameValidator.reserved_keywords   s    ''3 	,3412 HH
  	,?T-NNOOHH^^ 	,!1!1 	,?T-LLMMHH?++HVH%%&&&r=   NTr2   r'   r(   r)   r3   r,   c                 V    t                                          ||||||           d S )Nr1   )r5   r6   )r9   r2   r'   r(   r)   r3   r,   r;   s          r<   r6   zFileNameValidator.__init__   sB     	#)&? 	 	
 	
 	
 	
 	
r=   r?   c           
         t          ||                     d                      t          |          }t          |                    | j                            }|                     |           t          j        t          j
        t          j        | j        t          j        | j        t          j        |t          j        |i}|| j        k    rt#          d| j        dd|ddgfi ||| j        k     rt#          d| j        dd|ddgfi ||                     |           |                     |           |                     d          r|                     |           d S d S )	NTrB   rD   z filename is too long: expected<=rp   z bytes, actual=z bytesz!filename is too short: expected>=)r   rK   r   lenencoderQ   validate_abspathr   REASONr   INVALID_LENGTHPLATFORMr)   FS_ENCODING
BYTE_COUNTVALUEr'   r   r2   _validate_reserved_keywords/_FileNameValidator__validate_universal_filename)_FileNameValidator__validate_win_filename)r9   r?   unicode_filenamebyte_ct
err_kwargss        r<   rS   zFileNameValidator.validate   s   %t7G7GZ^7G7_7_3_````!%==&--d.?@@AA./// !;!4=$d&7#W 0

 T\!!!gt|gggV]gggg  	   T\!!!hhhhW^hhhh  	   	(()9:::**+;<<<d33 	;(()9:::::	; 	;r=   c                     t          d|d| j        t          j                  }|                     d          rt          |          r|t          j        |          r|d S )Nzfound an absolute path (z), expected a filename)rI   r)   rJ   TrB   )r   r)   r   FOUND_ABS_PATHrK   r   	posixpathisabs)r9   r?   errs      r<   r   z"FileNameValidator.validate_abspath   s    R5RRR]-
 
 
 d33 	U## 	?5!! 	I	 	r=   r   c                     t                               |          }|r<t          t          j        t          |                    t          j        |          d S )Ninvalidr)   r?   )r#   findallr   r   formatr   r   	UNIVERSAL)r9   r   matchs      r<   __validate_universal_filenamez/FileNameValidator.__validate_universal_filename   sj    $,,-=>> 	")0*511   "+&   	 	r=   c                 j   t                               |          }|r<t          t          j        t          |                    t          j        |          |dv rd S d}t          j	        t          j        t          j
        |i}|d         dv rMt          t          j        t          j        |d                             fd|                    d          i||d	         d
v rMt          t          j        t          j        |d	                             fd|                    d          i|d S )Nr   r   rG   z{}. Refer: https://learn.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/file-folder-name-whitespace-characters)rF   rH   rI   z<Do not end a file or directory name with a space or a periodr   rF   z2Do not start a file or directory name with a space)r$   r   r   r   r   r   r   WINDOWSr   r   r   rW   rX   )r9   r   r   KB2829981_err_tmplr   s        r<   __validate_win_filenamez)FileNameValidator.__validate_win_filename   s~   (001ABB 	")0*511   ")&    {**F `!8#3 0


 B:--")0CSTVCW9X9XYYY .55R 
    A3''")0CSTUCV9W9WXXX .55H 
    ('r=   )rc   rd   re   r   	itertoolsproductranger~   r   __annotations__r   propertyrP   r   r   r   rf   r   r   rg   r   r6   r   rS   r   r   r   rh   ri   s   @r<   r4   r4   ~   s!        .
%dd4EI4EnV[V[\]_aVbVb4c4cddd
d
d	e
% 
 
.Y.W 
 
 
 
 
	
 !% 
 
 
 )/...'5c? ' ' ' ' ' X'( '0%)+/#=A
 

 
 c]	

 <(
 
 $,HSM#:
 

 
 
 
 
 
$";h ";4 "; "; "; ";Hc d    	c 	d 	 	 	 	$ $ $ $ $ $ $ $ $ $r=   r4   Tfilenamer)   r2   r'   r(   r3   r,   r/   c                 V    t          ||||||                              |            dS )a  Verifying whether the ``filename`` is a valid file name or not.

    Args:
        filename:
            Filename to validate.
        platform:
            Target platform name of the filename.

            .. include:: platform.txt
        min_len:
            Minimum byte length of the ``filename``. The value must be greater or equal to one.
            Defaults to ``1``.
        max_len:
            Maximum byte length of the ``filename``. The value must be lower than:

                - ``Linux``: 4096
                - ``macOS``: 1024
                - ``Windows``: 260
                - ``universal``: 260

            Defaults to ``255``.
        fs_encoding:
            Filesystem encoding that is used to calculate the byte length of the filename.
            If |None|, get the encoding from the execution environment.
        check_reserved:
            If |True|, check the reserved names of the ``platform``.
        additional_reserved_names:
            Additional reserved names to check.
            Case insensitive.

    Raises:
        ValidationError (ErrorReason.INVALID_LENGTH):
            If the ``filename`` is longer than ``max_len`` characters.
        ValidationError (ErrorReason.INVALID_CHARACTER):
            If the ``filename`` includes invalid character(s) for a filename:
            |invalid_filename_chars|.
            The following characters are also invalid for Windows platforms:
            |invalid_win_filename_chars|.
        ValidationError (ErrorReason.RESERVED_NAME):
            If the ``filename`` equals the reserved name by OS.
            Windows reserved name is as follows:
            ``"CON"``, ``"PRN"``, ``"AUX"``, ``"NUL"``, ``"COM[1-9]"``, ``"LPT[1-9]"``.

    Example:
        :ref:`example-validate-filename`

    See Also:
        `Naming Files, Paths, and Namespaces - Win32 apps | Microsoft Docs
        <https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file>`__
    r)   r2   r'   r(   r3   r,   N)r4   rS   r   r)   r2   r'   r(   r3   r,   s          r<   validate_filenamer     sA    x %";   hxr=   c                 Z    t          |||dn||||                              |           S )a0  Check whether the ``filename`` is a valid name or not.

    Args:
        filename:
            A filename to be checked.
        platform:
            Target platform name of the filename.

    Example:
        :ref:`example-is-valid-filename`

    See Also:
        :py:func:`.validate_filename()`
    Nr   r   )r4   is_validr   s          r<   is_valid_filenamer   [  sD    0 o7%";   hxr=   r>   Fr@   r*   r+   r-   c
           	          |*t          j        dt                     |du rt          j        }t          ||dn||||||	                              | |          S )a
  Make a valid filename from a string.

    To make a valid filename, the function does the following:

        - Replace invalid characters as file names included in the ``filename``
          with the ``replacement_text``. Invalid characters are:

            - unprintable characters
            - |invalid_filename_chars|
            - for Windows (or universal) only: |invalid_win_filename_chars|

        - Replace a value if a sanitized value is a reserved name by operating systems
          with a specified handler by ``reserved_name_handler``.

    Args:
        filename: Filename to sanitize.
        replacement_text:
            Replacement text for invalid characters. Defaults to ``""``.
        platform:
            Target platform name of the filename.

            .. include:: platform.txt
        max_len:
            Maximum byte length of the ``filename``.
            Truncate the name length if the ``filename`` length exceeds this value.
            Defaults to ``255``.
        fs_encoding:
            Filesystem encoding that is used to calculate the byte length of the filename.
            If |None|, get the encoding from the execution environment.
        check_reserved:
            [Deprecated] Use 'reserved_name_handler' instead.
        null_value_handler:
            Function called when a value after sanitization is an empty string.
            You can specify predefined handlers:

                - :py:func:`~.handler.NullValueHandler.return_null_string`
                - :py:func:`~.handler.NullValueHandler.return_timestamp`
                - :py:func:`~.handler.raise_error`

            Defaults to :py:func:`.handler.NullValueHandler.return_null_string` that just return ``""``.
        reserved_name_handler:
            Function called when a value after sanitization is a reserved name.
            You can specify predefined handlers:

                - :py:meth:`~.handler.ReservedNameHandler.add_leading_underscore`
                - :py:meth:`~.handler.ReservedNameHandler.add_trailing_underscore`
                - :py:meth:`~.handler.ReservedNameHandler.as_is`
                - :py:func:`~.handler.raise_error`

            Defaults to :py:func:`.handler.add_trailing_underscore`.
        additional_reserved_names:
            Additional reserved names to sanitize.
            Case insensitive.
        validate_after_sanitize:
            Execute validation after sanitization to the file name.

    Returns:
        Same type as the ``filename`` (str or PathLike object):
            Sanitized filename.

    Raises:
        ValueError:
            If the ``filename`` is an invalid filename.

    Example:
        :ref:`example-sanitize-filename`
    NzD'check_reserved' is deprecated. Use 'reserved_name_handler' instead.Fr   )r)   r'   r(   r*   r+   r,   r-   )warningswarnDeprecationWarningr   as_isr&   ra   )
r   r@   r)   r'   r(   r3   r*   r+   r,   r-   s
             r<   sanitize_filenamer   }  s    ` !R	
 	
 	

 U""$7$=!o7-3"; 7   hx)**+r=   )9__doc__r   r   rW   r   collections.abcr   pathlibr   r   r   typingr   r   _baser
   r   r   r   _commonr   r   r   r   r   _constr   r   r   _typesr   r   errorr   r   r   r   handlerr   r   r   r   compilerX   _INVALID_FILENAME_CHARSUNICODEr#   _INVALID_WIN_FILENAME_CHARSr$   r&   r4   rf   rP   rg   r   r   r   rq   r=   r<   <module>r      sm             				  $ $ $ $ $ $ " " " " " " " "       " " " " " " " " P P P P P P P P P P P P [ [ [ [ [ [ [ [ [ [ [ [ [ [ H H H H H H H H H H * * * * * * * * O O O O O O O O O O O O @ @ @ @ @ @ @ @ $' 5 & & &(bj8		(2338888"*  e    #-"*<		(677<<<<bj# # %   
\$ \$ \$ \$ \$) \$ \$ \$~T T T T T T T Tr (,",!%9=C CC|$C C 	C
 #C C  (6C 
C C C CP (,"!!%9= |$  c]	
 #   (6 
   H '+6!%%);?>B9=$)a+ a+a+a+ |$a+ c]	a+
 #a+ TNa+ !!78a+ $$:;a+  (6a+ "a+ a+ a+ a+ a+ a+ a+r=   