a
    i                     @   s   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 G dd deZ	e
e
dd	d
Ze
e
dddZe
e
dddZee
ge
f dddZedde ZdgZdS )    N)	lru_cache)CallableOptional   )PlatformDirsABCc                   @   s   e Zd ZdZeedddZddeee eddd	Zeedd
dZ	eedddZ
eedddZeedddZeedddZeedddZeedddZeedddZdS )Windowsa  `MSDN on where to store app data files
    <http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120>`_.
    Makes use of the
    `appname <platformdirs.api.PlatformDirsABC.appname>`,
    `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`,
    `version <platformdirs.api.PlatformDirsABC.version>`,
    `roaming <platformdirs.api.PlatformDirsABC.roaming>`,
    `opinion <platformdirs.api.PlatformDirsABC.opinion>`.returnc                 C   s(   | j r
dnd}tjt|}| |S )z
        :return: data directory tied to the user, e.g.
         ``%USERPROFILE%\AppData\Local\$appauthor\$appname`` (not roaming) or
         ``%USERPROFILE%\AppData\Roaming\$appauthor\$appname`` (roaming)
        CSIDL_APPDATACSIDL_LOCAL_APPDATA)roamingospathnormpathget_win_folder_append_parts)selfconstr    r   b/home/ec2-user/npost_license/.venv/lib/python3.9/site-packages/pip/_vendor/platformdirs/windows.pyuser_data_dir   s    zWindows.user_data_dirNopinion_value)r   r   r	   c                C   st   g }| j r`| jdur*| jp| j }|| || j  |d urN| jrN|| | jr`|| j tjj|g|R  S )NF)appname	appauthorappendopinionversionr   r   join)r   r   r   paramsauthorr   r   r   r      s    


zWindows._append_partsc                 C   s   t jtd}| |S )zT:return: data directory shared by users, e.g. ``C:\ProgramData\$appauthor\$appname``CSIDL_COMMON_APPDATAr   r   r   r   r   r   r   r   r   r   site_data_dir+   s    zWindows.site_data_dirc                 C   s   | j S )zC:return: config directory tied to the user, same as `user_data_dir`r   r   r   r   r   user_config_dir1   s    zWindows.user_config_dirc                 C   s   | j S )zF:return: config directory shared by the users, same as `site_data_dir`)r$   r&   r   r   r   site_config_dir6   s    zWindows.site_config_dirc                 C   s   t jtd}| j|ddS )z
        :return: cache directory tied to the user (if opinionated with ``Cache`` folder within ``$appname``) e.g.
         ``%USERPROFILE%\AppData\Local\$appauthor\$appname\Cache\$version``
        r   Cacher   r"   r#   r   r   r   user_cache_dir;   s    zWindows.user_cache_dirc                 C   s   | j S )zB:return: state directory tied to the user, same as `user_data_dir`r%   r&   r   r   r   user_state_dirD   s    zWindows.user_state_dirc                 C   s   | j }| jrtj|d}|S )zy
        :return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in it
        ZLogs)r   r   r   r   r   r#   r   r   r   user_log_dirI   s    zWindows.user_log_dirc                 C   s   t jtdS )z`
        :return: documents directory tied to the user e.g. ``%USERPROFILE%\Documents``
        CSIDL_PERSONAL)r   r   r   r   r&   r   r   r   user_documents_dirS   s    zWindows.user_documents_dirc                 C   s$   t jt jtdd}| |S )z
        :return: runtime directory tied to the user, e.g.
         ``%USERPROFILE%\AppData\Local\Temp\$appauthor\$appname``
        r   ZTemp)r   r   r   r   r   r   r#   r   r   r   user_runtime_dirZ   s    zWindows.user_runtime_dir)__name__
__module____qualname____doc__propertystrr   r   r   r$   r'   r(   r*   r+   r,   r.   r/   r   r   r   r   r   	   s(   	
	r   )
csidl_namer	   c                 C   sr   | dkr$t jt jt jd dS dddd| }|du rLtd	|  t j|}|du rntd
| |S )z&Get folder from environment variables.r-   USERPROFILEZ	DocumentsAPPDATAZALLUSERSPROFILELOCALAPPDATA)r
   r!   r   NUnknown CSIDL name: zUnset environment variable: )r   r   r   r   environget
ValueError)r6   Zenv_var_nameresultr   r   r   get_win_folder_from_env_varsd   s    r?   c                 C   sX   ddddd | }|du r*td|  ddl}||jd	}|||\}}t|S )
zGet folder from the registry.

    This is a fallback technique at best. I'm not sure if using the
    registry for this guarantees us the correct answer for all CSIDL_*
    names.
    ZAppDatazCommon AppDatazLocal AppDataZPersonalr
   r!   r   r-   Nr:   r   z@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)r<   r=   winregOpenKeyHKEY_CURRENT_USERQueryValueExr5   )r6   Zshell_folder_namerA   key	directory_r   r   r   get_win_folder_from_registryv   s    rH   c                 C   s   ddddd | }|du r*td|  td}ttd	}|jd|dd
| tdd |D rtd}|j	|j
|dr|}|j
S )zGet folder with ctypes.   #         r@   Nr:   i   windllr   c                 s   s   | ]}t |d kV  qdS )   N)ord).0cr   r   r   	<genexpr>       z,get_win_folder_via_ctypes.<locals>.<genexpr>)r<   r=   ctypescreate_unicode_buffergetattrZshell32ZSHGetFolderPathWanyZkernel32ZGetShortPathNameWvalue)r6   Zcsidl_constbufrM   Zbuf2r   r   r   get_win_folder_via_ctypes   s"    


rZ   r   c                  C   s:   t tdrtS zdd l} W n ty0   t Y S 0 tS d S )NrM   r   )hasattrrT   rZ   rA   ImportErrorr?   rH   )rA   r   r   r   _pick_get_win_folder   s    

r]   )maxsize)rT   r   	functoolsr   typingr   r   apir   r   r5   r?   rH   rZ   r]   r   __all__r   r   r   r   <module>   s   [