a
    Lcòf5  ã                   @   sÎ   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 d dlmZ	 d dl
mZ d dlmZ ddlmZmZ dd
d„Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zeƒ  Zfdd„ZdS ) é    N)ÚPath)Úrun)Úapps©Úget_random_string)ÚDEFAULT_LOCALE_ENCODINGé   )ÚCommandErrorÚCommandParserúutf-8c              
   C   sp   zt | dtjdkd�}W n6 tyN } ztd| d  ƒ|‚W Y d}~n
d}~0 0 |j |¡|jjtdd�|j	fS )	zf
    Friendly wrapper around Popen.

    Return stdout output, stderr output, and OS status code.
    TÚnt)Úcapture_outputÚ	close_fdszError executing %sr   NÚreplace)Úerrors)
r   ÚosÚnameÚOSErrorr	   ÚstdoutÚdecodeÚstderrr   Ú
returncode)ÚargsZstdout_encodingÚpÚerr© r   úY/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/management/utils.pyÚpopen_wrapper   s    (
ýr   c                 C   sZ   g }| D ]}|  | dd¡ d¡¡ qt|ƒD ]"\}}| d¡s.d||  ||< q.t|ƒS )a¹  
    Organize multiple extensions that are separated with commas or passed by
    using --extension/-e multiple times.

    For example: running 'django-admin makemessages -e js,txt -e xhtml -a'
    would result in an extension list: ['.js', '.txt', '.xhtml']

    >>> handle_extensions(['.html', 'html,js,py,py,py,.py', 'py,.py'])
    {'.html', '.js', '.py'}
    >>> handle_extensions(['.html, txt,.tpl'])
    {'.html', '.tpl', '.txt'}
    ú Ú ú,Ú.z.%s)Úextendr   ÚsplitÚ	enumerateÚ
startswithÚset)Ú
extensionsZext_listÚextÚir   r   r   Úhandle_extensions    s    
r*   c                 C   sÄ   |d u rt j dd¡ t j¡}t|tƒr.|g}|d u rLt j dd¡ t j¡}|D ]}|  |¡rPdg} qjqP|D ]P}t j 	|| ¡}t j 
|¡r”|  S |D ]$}|| }t j 
|¡r˜|    S q˜qnd S )NÚPATHr   ÚPATHEXTz.COM;.EXE;.BAT;.CMD)r   ÚenvironÚgetr#   ÚpathsepÚ
isinstanceÚstrÚendswithÚpathÚjoinÚisfile)Úcmdr3   Úpathextr(   r   ÚfZfextr   r   r   Úfind_command6   s&    

r9   c                  C   s   d} t d| ƒS )zS
    Return a 50 character random string usable as a SECRET_KEY setting value.
    z2abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)é2   r   )Úcharsr   r   r   Úget_random_secret_keyO   s    r<   c                 C   sª   t ƒ }t ƒ }| D ]�}d|v rVzt |¡}W n tyH   td| ƒ‚Y n0 | |¡ qzt |¡}W n0 ty” } ztt|ƒƒ‚W Y d}~n
d}~0 0 | |¡ q||fS )zù
    Parse a list of "app_label.ModelName" or "app_label" strings into actual
    objects and return a two-element tuple:
        (set of model classes, set of app_configs).
    Raise a CommandError if some specified models or apps don't exist.
    r!   zUnknown model: %sN)r&   Úinstalled_appsZ	get_modelÚLookupErrorr	   ÚaddZget_app_configr1   )Úlabelsr   ÚmodelsÚlabelÚmodelZ
app_configÚer   r   r   Úparse_apps_and_model_labelsW   s    "rE   c                 C   sT   t ddd�}|j|dd� z| | dd… ¡\}}W n tyH   Y dS 0 |jS dS )zá
    Return the value of a command line option (which should include leading
    dashes, e.g. '--testrunner') from an argument list. Return None if the
    option wasn't passed or if the argument list couldn't be parsed.
    F)Úadd_helpÚallow_abbrevÚvalue)Údesté   N)r
   Úadd_argumentÚparse_known_argsr	   rH   )ÚargvÚoptionÚparserÚoptionsÚ_r   r   r   Úget_command_line_optionr   s    rR   c                 C   sn   dd„ | D ƒ} dd„ dt jhD ƒ}g }| D ]>}|D ]*}| |¡r2| |dt|ƒ … ¡  q*q2| |¡ q*|S )z9Normalize an iterable of glob style patterns based on OS.c                 S   s   g | ]}t j |¡‘qS r   )r   r3   Únormcase)Ú.0r   r   r   r   Ú
<listcomp>„   ó    z+normalize_path_patterns.<locals>.<listcomp>c                 S   s   h | ]}d | ’qS )z%s*r   )rT   Úpath_sepr   r   r   Ú	<setcomp>…   rV   z*normalize_path_patterns.<locals>.<setcomp>ú/N)r   Úsepr2   ÚappendÚlen)ÚpatternsZdir_suffixesZnorm_patternsÚpatternZ
dir_suffixr   r   r   Únormalize_path_patterns‚   s    
r_   c                    s.   t ˆƒ‰‡fdd„‰ t‡ fdd„t|ƒD ƒƒS )zy
    Check if the given path should be ignored or not based on matching
    one of the glob style `ignore_patterns`.
    c                    s   t  ˆ j| ¡pt  tˆ ƒ| ¡S ©N)ÚfnmatchÚfnmatchcaser   r1   )r^   )r3   r   r   Úignore˜   s    ÿzis_ignored_path.<locals>.ignorec                 3   s   | ]}ˆ |ƒV  qd S r`   r   )rT   r^   )rc   r   r   Ú	<genexpr>�   rV   z"is_ignored_path.<locals>.<genexpr>)r   Úanyr_   )r3   Úignore_patternsr   )rc   r3   r   Úis_ignored_path‘   s    rg   c                   C   s   dt  d¡iS )NÚ
black_pathÚblack)ÚshutilÚwhichr   r   r   r   Úfind_formatters    s    rl   c                 C   s2   |t u rt d¡}|r.tj|ddg| ¢dd� dS )z9
    Run the black formatter on the specified files.
    ri   z--fastz--T)r   N)Úsentinelrj   rk   Ú
subprocessr   )Zwritten_filesrh   r   r   r   Úrun_formatters¤   s    
þro   )r   )NN)ra   r   rj   rn   Úpathlibr   r   Zdjango.appsr   r=   Zdjango.utils.cryptor   Zdjango.utils.encodingr   Úbaser	   r
   r   r*   r9   r<   rE   rR   r_   rg   rl   Úobjectrm   ro   r   r   r   r   Ú<module>   s&   

