
    -2iLE                     :   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jT                  d ejV                  ejX                        ddejZ                        Z.ee)d<    ejT                  d ejV                  ej^                        ddejZ                        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*Z8y)+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        
|   ||||||||	       | j	                         | _        y )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             `/mnt/e/genesis-system/.venvs/voice-bridge/lib/python3.12/site-packages/pathvalidate/_filename.pyr6   zFileNameSanitizer.__init__    sh     'O/''#*C!O 	#1"7&?$;% 	 		
 !% 9 9 ;    valuereplacement_textc                    	 t        || j                  d              | j                  j                  |t        |            }t        || j                  | j                        }	 | j                  j!                  |       | j2                  r	 | j                  j!                  |       t        |t              rt9        |      S |S # t        $ rJ}|j                  t        j
                  k(  r't        |t              r | j                  |      cY d }~S  d }~ww xY w# t        $ r}|j                  t        j"                  k(  rU| j%                  |      }|j&                  |k7  rt)        j                  t)        j*                  |j&                        ||      }n|j                  t        j,                  k(  rJ| j                  d      r8|j/                  d      }|j1                  d      }|dvr@|j1                  d      }n.|j                  t        j
                  k(  r| j                  |      }Y d }~d }~ww xY w# t        $ r4}t        t        |      t        j4                  | j6                        d }~ww xY w)NTinclude_universalallow_whitespaces .z..z .)descriptionreasonr)   )r   _is_windowsr   rI   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;c7cd "22667GUT)*<d>O>OQUQ]Q]^	AOO$$%78* (((();< eX&*++!!]  	xx;000eX.//22	  	Axx;444#'#>#>q#A ??&66)+		!//24DFX*& [:::t?O?O"& @P @ &8%>%>s%C" &8%>%>s%C"%[8);)B)B4)H&[222%)%=%=a%@"%	A. # % #A&==!]] sT   C 'D H< 	D>DDDD
H9'DH44H9<	I9/I44I9c                 >    | j                  d      rt        S t        S )NTrA   )rJ   r$   r#   )r9   s    r<   r7   z&FileNameSanitizer._get_sanitize_regexpw   s    d3++##r=   ) )__name__
__module____qualname__r   intr   rO   r   r   r   boolr   r6   r   r`   r   r7   __classcell__r;   s   @r<   r&   r&      s     1%)+/?CBF=A(-15"<"< c]"< <(	"<
 %%;<"<  ((>?"< $,HSM#:"< "&"< -."< 
"<H1"h 1"# 1"x 1"f$gcl $r=   r&   c                   v    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              #   2   K   | ]  \  }}|d |d  yw)r!   dN ).0namenums      r<   	<genexpr>zFileNameValidator.<genexpr>   s!     dytS4(3q'"d   )COMLPTr   
   c              #   2   K   | ]  \  }}|d |d   yw)r!   Nrq   )rr   rs   ssds      r<   ru   zFileNameValidator.<genexpr>   s)      
c Ahs1g
rv   )   ¹   ²   ³_WINDOWS_RESERVED_FILE_NAMES):_MACOS_RESERVED_FILE_NAMESr/   .c                    t         |   }| j                         r&t        || j                  z   | j
                  z         }nm| j                         rt        || j                  z         }nD| j                         s| j                         rt        || j
                  z         }nt        |      }t        t        |            S )N)r5   reserved_keywords_is_universalsetr   r   rJ   	_is_posix	_is_macostuplesorted)r9   common_keywordsword_setr;   s      r<   r   z#FileNameValidator.reserved_keywords   s    '3334112H
 ?T-N-NNOH^^!1?T-L-LLMH?+HVH%&&r=   NTr2   r'   r(   r)   r3   r,   c                 0    t         |   ||||||       y )Nr1   )r5   r6   )r9   r2   r'   r(   r)   r3   r,   r;   s          r<   r6   zFileNameValidator.__init__   s)     	#)&? 	 	
r=   r>   c           
         t        || j                  d              t        |      }t        |j	                  | j
                              }| j                  |       t        j                  t        j                  t        j                  | j                  t        j                  | j
                  t        j                  |t        j                  |i}|| j                   kD  r t#        d| j                   dd|ddgfi ||| j$                  k  r t#        d| j$                  dd|ddgfi || j'                  |       | j)                  |       | j                  d      r| j+                  |       y y )	NTrA   rC   z filename is too long: expected<=rp   z bytes, actual=z bytesz!filename is too short: expected>=)r   rJ   r   lenencoderP   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<   rR   zFileNameValidator.validate   s{   %t7G7GZ^7G7_3_`!%=&--d.?.?@A./ !;!;!!4==$$d&7&7##W 0

 T\\!!6t||A6FoV]^_U``fg 	  T\\!!7Q7GW^_`Vaagh 	  	(()9:**+;<d3(()9: 4r=   c                     t        d|d| j                  t        j                        }| j	                  d      rt        |      r|t        j                  |      r|y )Nzfound an absolute path (z), expected a filename)rH   r)   rI   TrA   )r   r)   r   FOUND_ABS_PATHrJ   r   	posixpathisabs)r9   r>   errs      r<   r   z"FileNameValidator.validate_abspath   s_    25);QR]]--
 d3U#	??5!I "r=   r   c                     t         j                  |      }|r9t        t        j                  t        |            t        j                  |      y )Ninvalidr)   r>   )r#   findallr   r   formatr   r   	UNIVERSAL)r9   r   matchs      r<   __validate_universal_filenamez/FileNameValidator.__validate_universal_filename   sL    $,,-=>")00*51 "++&  r=   c                 J   t         j                  |      }|r9t        t        j                  t        |            t        j                  |      |dv ry d}t        j                  t        j                  t        j                  |i}|d   dv rGt        t        j                  t        j                  |d               fd|j	                  d      i||d	   d
v rGt        t        j                  t        j                  |d	               fd|j	                  d      i|y )Nr   r   rF   z{}. Refer: https://learn.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/file-folder-name-whitespace-characters)rE   rG   rH   z<Do not end a file or directory name with a space or a periodr   rE   z2Do not start a file or directory name with a space)r$   r   r   r   r   r   r   WINDOWSr   r   r   rV   rW   )r9   r   r   KB2829981_err_tmplr   s        r<   __validate_win_filenamez)FileNameValidator.__validate_win_filename   s:   (001AB")00*51 "))&  {* `!!8#3#3 0


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

 <(
 
 $,HSM#:
 

$";h ";4 ";Hc d 	c 	d 	$ $ $r=   r4   Tfilenamer)   r2   r'   r(   r3   r,   r/   c                 D    t        ||||||      j                  |        y)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   rR   r   r)   r2   r'   r(   r3   r,   s          r<   validate_filenamer     s+    x %"; hxr=   c                 J    t        |||dn||||      j                  |       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()`
    r   r   )r4   is_validr   s          r<   is_valid_filenamer   [  s5    0 o7%"; hxr=   rb   Fr?   r*   r+   r-   c
           	          |.t        j                  dt               |du rt        j                  }t        ||dn||||||	      j                  | |      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`
    zD'check_reserved' is deprecated. Use 'reserved_name_handler' instead.Fr   )r)   r'   r(   r*   r+   r,   r-   )warningswarnDeprecationWarningr   as_isr&   r`   )
r   r?   r)   r'   r(   r3   r*   r+   r,   r-   s
             r<   sanitize_filenamer   }  sj    ` !R	

 U"$7$=$=!o7-3"; 7 hx)*+r=   )9__doc__r   r   rV   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   compilerW   _INVALID_FILENAME_CHARSUNICODEr#   _INVALID_WIN_FILENAME_CHARSr$   r&   r4   rf   rO   rg   r   r   r   rq   r=   r<   <module>r      s     	  $ "  " P P [ [ H H * O O @ $' 5 &(bjj			(223A6a8"** e  #-"**			(667:!<bjj# % 
\$) \$~T Tr (,",!%9=CC|$C C 	C
 #C C  (6C 
CP (,"!!%9=|$  c]	
 #   (6 
H '+6!%%);?>B9=$)a+a+a+ |$a+ c]	a+
 #a+ TNa+ !!78a+ $$:;a+  (6a+ "a+ a+r=   