o
    iLE                     @   s\  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*de+ej,ddej-Z.ee)d< e*de+ej/ddej-Z0ee)d< G dd deZ1G d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"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$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,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                       s   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dZddededefddZdee fddZ  ZS )FileNameSanitizerNFmax_lenfs_encodingplatformnull_value_handlerreserved_name_handleradditional_reserved_namesvalidate_after_sanitize	validatorreturnc	           
   
      sH   |r|}	n
t t||d||d}	t j||||||||	d |  | _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__ \/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pathvalidate/_filename.pyr3       s*   	zFileNameSanitizer.__init__ valuereplacement_textc              
   C   s  zt || jdd d W n$ ty1 } z|jtjkr,t|tr! | |W  Y d }~S  d }~ww | j	
|t|}t|| j| j}z| j| W nY ty } zM|jtjkro| |}|j|krnt
t|j||}n+|jtjkr| jddr|d}|d}|dvr|d}n|jtjkr| |}W Y d }~nd }~ww | jrz| j| W n ty } ztt|tj| jdd }~ww t|trt|S |S )NTinclude_universalallow_whitespaces .z..z .)descriptionreasonr'   )r   _is_windowsr   rG   r   	NULL_NAME
isinstancer   _null_value_handlerr5   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   )r6   r=   r>   esanitized_filenamereplacement_wordr:   r:   r;   sanitizeD   s`   







zFileNameSanitizer.sanitizec                 C   s   | j ddrtS tS )NTr?   )rH   r#   r"   )r6   r:   r:   r;   r4   w   s   z&FileNameSanitizer._get_sanitize_regexp)r<   )__name__
__module____qualname__r   intr   rM   r   r   r   boolr
   r3   r   r^   r   r4   __classcell__r:   r:   r8   r;   r$      s<    
	
$3r$   c                       s  e Zd ZU dedd ededdD  edd eddD  Zee	d	< d
Z
ee	d< edeedf f fd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dZdeddfddZdeddfddZdeddfd d!Zdeddfd"d#Z  ZS )$r1   )CONPRNAUXzCLOCK$NULc                 c   s$    | ]\}}|d |dV  qdS )r    dNr:   ).0namenumr:   r:   r;   	<genexpr>   s   " zFileNameValidator.<genexpr>)COMLPTr   
   c                 c   s$    | ]\}}|d |d V  qdS )r    Nr:   )rj   rk   ssdr:   r:   r;   rm      s
    
)   ¹   ²   ³_WINDOWS_RESERVED_FILE_NAMES):_MACOS_RESERVED_FILE_NAMESr-   .c                    sr   t  j}|  rt|| j | j }n |  rt|| j }n|  s'|  r/t|| j }nt|}t	t
|S )N)r2   reserved_keywords_is_universalsetru   rw   rH   	_is_posix	_is_macostuplesorted)r6   common_keywordsword_setr8   r:   r;   rx      s   z#FileNameValidator.reserved_keywordsNTr/   r%   r&   r'   r0   r*   c                    s   t  j||||||d d S )Nr.   )r2   r3   )r6   r/   r%   r&   r'   r0   r*   r8   r:   r;   r3      s   	
zFileNameValidator.__init__r=   c              
   C   s   t || jdd d t|}t|| j}| | tjt	j
tj| jtj| jtj|tj|i}|| jkrHtd| jdd|ddgfi ||| jk r`td| jdd|ddgfi || | | | | jddrw| | d S d S )	NTr?   rA   z filename is too long: expected<=ri   z bytes, actual=z bytesz!filename is too short: expected>=)r   rH   r   lenencoderN   validate_abspathr   REASONr   INVALID_LENGTHPLATFORMr'   FS_ENCODING
BYTE_COUNTVALUEr%   r   r/   _validate_reserved_keywords/_FileNameValidator__validate_universal_filename)_FileNameValidator__validate_win_filename)r6   r=   unicode_filenamebyte_ct
err_kwargsr:   r:   r;   rP      s:   




zFileNameValidator.validatec                 C   sD   t d|d| jtjd}| jddrt|r|t|r |d S )Nzfound an absolute path (z), expected a filename)rF   r'   rG   Tr?   )r   r'   r   FOUND_ABS_PATHrH   r   	posixpathisabs)r6   r=   errr:   r:   r;   r      s   

z"FileNameValidator.validate_abspathr   c                 C   s.   t |}|rttjt|dtj|dd S )Ninvalidr'   r=   )r"   findallr   r   formatr   r   	UNIVERSAL)r6   r   matchr:   r:   r;   __validate_universal_filename   s   
z/FileNameValidator.__validate_universal_filenamec                 C   s   t |}|rttjt|dtj|d|dv rd S d}tj	tjtj
|i}|d dv rBttjt|d dfd|di||d	 d
v r^ttjt|d	 dfd|di|d S )Nr   r   rD   z{}. Refer: https://learn.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/file-folder-name-whitespace-characters)rC   rE   rF   z<Do not end a file or directory name with a space or a periodr   rC   z2Do not start a file or directory name with a space)r#   r   r   r   r   r   r   WINDOWSr   r   r   rT   rU   )r6   r   r   KB2829981_err_tmplr   r:   r:   r;   __validate_win_filename   sH   
z)FileNameValidator.__validate_win_filename)r_   r`   ra   r}   	itertoolsproductrangeru   r   __annotations__rw   propertyrM   rx   r   r   rb   r   r   rc   r   r3   r   rP   r   r   r   rd   r:   r:   r8   r;   r1   ~   sP   
 

$r1   Tfilenamer'   r/   r%   r&   r0   r*   r-   c                 C   s   t ||||||d|  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'   r/   r%   r&   r0   r*   N)r1   rP   r   r'   r/   r%   r&   r0   r*   r:   r:   r;   validate_filename  s   <r   c                 C   s&   t |||du r	dn||||d| 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   )r1   is_validr   r:   r:   r;   is_valid_filename[  s   r   r<   Fr>   r(   r)   r+   c
           
   	   C   sL   |durt dt |du rtj}t||du rdn||||||	d| |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$   r^   )
r   r>   r'   r%   r&   r0   r(   r)   r*   r+   r:   r:   r;   sanitize_filename}  s$   Pr   )9__doc__r   r   rT   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   compilerU   _INVALID_FILENAME_CHARSUNICODEr"   _INVALID_WIN_FILENAME_CHARSr#   r$   r1   rb   rM   rc   r   r   r   r:   r:   r:   r;   <module>   s    _ 

H

$
	
