a
    Dg9                     @   s  d dl 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 d dl	m
Z
 ejdd ZdZeek rejdjee   ed dd
dZG dd dZG dd deZG dd deZG dd deZe e e dZdd Zdd Zdd Zdd Zedkre  dS )    N)ArgumentParser)unified_diff)ManagementUtility   )      zOThis version of Wagtail requires Python {}.{} or above - you are running {}.{}
   sc                 C   s   | dkrdS |S )Nr     )valueargr   r   R/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/bin/wagtail.py	pluralize   s    r   c                   @   s2   e Zd ZdZd
ddZdd Zdd Zdd	 ZdS )CommandNc                 C   sB   |d u rd }nt   d| }tt| dd d|d}| | |S )N descriptionF)r   add_helpprog)	prog_namer   getattradd_arguments)selfcommand_namer   parserr   r   r   create_parser   s    
zCommand.create_parserc                 C   s   d S Nr   r   r   r   r   r   r   ,   s    zCommand.add_argumentsc                 C   s   | j |d}|  d S )N)r   )r   
print_help)r   r   r   r   r   r   r   /   s    zCommand.print_helpc                 C   s8   |   }|tjdd  }t|}| jf i | d S )Nr   )r   
parse_argssysargvvarsrun)r   r!   r   optionsZoptions_dictr   r   r   execute3   s    zCommand.execute)N)__name__
__module____qualname__r   r   r   r   r%   r   r   r   r   r      s
   
r   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )CreateProjectz:Creates the directory structure for a new Wagtail project.c                 C   s   |   | _d S r   )get_default_template_pathdefault_template_path)r   r   r   r   __init__=   s    zCreateProject.__init__c                 C   s4   |j ddd |j dddd |j dd	| jd
 d S )Nproject_namezName for your Wagtail project)helpdest_dir?z8Destination directory inside which to create the projectnargsr.   z
--templatez*The path or URL to load the template from.)r.   default)add_argumentr+   r   r   r   r   r   @   s    zCreateProject.add_argumentsc                 C   s(   dd l }tj|j}tj|d}|S )Nr   Zproject_template)wagtailospathdirname__file__join)r   r5   Zwagtail_pathr+   r   r   r   r*   M   s    z'CreateProject.get_default_template_pathNc                 K   s   zt | W n ty   Y n0 td|  |d }|| jkrDd}td||d  ddd|d  d	d
|g}|r||| t|}|  tdd|i  d S )Nzx'%s' conflicts with the name of an existing Python module and cannot be used as a project name. Please try another name.templatezthe default Wagtail templatezJCreating a Wagtail project called %(project_name)s using %(template_name)s)r-   template_namezdjango-adminZstartprojectz--template=z--ext=html,rstz--name=Dockerfilez*Success! %(project_name)s has been createdr-   )	
__import__ImportErrorr    exitr+   printappendr   r%   )r   r-   r/   r$   r<   Zutility_argsZutilityr   r   r   r#   T   sB    

	
zCreateProject.run)NN)r&   r'   r(   r   r,   r   r*   r#   r   r   r   r   r)   :   s
   r)   c                   @   sD  e Zd ZdZeddfeddfeddfedd	fed
dfeddfeddfeddfeddfeddfeddfeddfeddfeddfeddfed d!fed"d#fed$d%fed&dfed'd(fed)d*fgZd+d, Zd9d/d0Zd1d2 Z	d:d3d4Z
d5d6 Zd7d8 Zd-S );UpdateModulePathsz=Update a Wagtail project tree to use Wagtail 2.x module pathsz\bwagtail\.wagtailcore\br5   z\bwagtail\.wagtailadmin\bzwagtail.adminz\bwagtail\.wagtaildocs\bzwagtail.documentsz\bwagtail\.wagtailembeds\bzwagtail.embedsz\bwagtail\.wagtailimages\bzwagtail.imagesz\bwagtail\.wagtailsearch\bzwagtail.searchz\bwagtail\.wagtailsites\bzwagtail.sitesz\bwagtail\.wagtailsnippets\bzwagtail.snippetsz\bwagtail\.wagtailusers\bzwagtail.usersz\bwagtail\.wagtailforms\bzwagtail.contrib.formsz\bwagtail\.wagtailredirects\bzwagtail.contrib.redirectsz*\bwagtail\.contrib\.wagtailfrontendcache\bzwagtail.contrib.frontend_cachez)\bwagtail\.contrib\.wagtailroutablepage\bzwagtail.contrib.routable_pagez-\bwagtail\.contrib\.wagtailsearchpromotions\bz!wagtail.contrib.search_promotionsz%\bwagtail\.contrib\.wagtailsitemaps\bzwagtail.contrib.sitemapsz'\bwagtail\.contrib\.wagtailstyleguide\bzwagtail.contrib.styleguidez\bwagtail\.tests\bzwagtail.testz\bwagtail\.core\.utils\bzwagtail.coreutilsz\bwagtail\.core\bz!\bwagtail\.admin\.edit_handlers\bzwagtail.admin.panelsz*\bwagtail\.contrib\.forms\.edit_handlers\bzwagtail.contrib.forms.panelsc                 C   s^   |j dddd |j ddddd	 |j d
ddd |j dddddd |j dddddd d S )N	root_pathr0   zPath to your project's rootr1   z--list
store_true
list_filesz8Show the list of files to change, without modifying them)actiondestr.   z--diffz@Show the changes that would be made, without modifying the files)rF   r.   z--ignore-dirrA   ignored_dirsNAMEzIgnore files in this directory)rF   rG   metavarr.   z--ignore-fileignored_patternsz0Ignore files with this name (supports wildcards))r4   r   r   r   r   r      s4    zUpdateModulePaths.add_argumentsNFc                    sn  |d u rt  }dd |pg D }|d u r.g }d}d}t |D ]\}	}
}t j|	t j  t fdd|D rtq@|D ] dsqxtfdd|D rqxt j	|	}t jj
||d}|d	7 }|r| j||d
}n6|r| |}n
| |}|rtd||t|f  |rx|d	7 }qxq@|s0|rNtd|t||t|f  ntd|t||t|f  d S )Nc                 S   s   g | ]}t j|t j qS r   )r6   r7   abspathsep).0Zdir_pathr   r   r   
<listcomp>   s   z)UpdateModulePaths.run.<locals>.<listcomp>r   c                 3   s   | ]}  |V  qd S r   )
startswith)rN   Zignored_dir)dirpath_with_slashr   r   	<genexpr>   s   z(UpdateModulePaths.run.<locals>.<genexpr>z.pyc                 3   s   | ]}t   |V  qd S r   )fnmatch)rN   pattern)filenamer   r   rR      s   )startr   )relative_pathz%s - %d change%sz,
Checked %d .py file%s, %d file%s to update.z*
Checked %d .py file%s, %d file%s updated.)r6   getcwdwalkr7   rL   rM   anylowerendswithr:   relpath
_show_diff_count_changes_rewrite_filer@   r   )r   rC   rE   diffrH   rK   Zabsolute_ignored_dirsZchecked_file_countZchanged_file_countdirpathdirnames	filenamesr7   rW   change_countr   )rQ   rU   r   r#      sr    

zUpdateModulePaths.runc                 C   s"   | j D ]\}}t|||}q|S r   )REPLACEMENTSresub)r   linerT   replr   r   r   _rewrite_line  s    zUpdateModulePaths._rewrite_linec              
   C   s   d}d}g }g }t |dd}|D ]j}z|d}	W n( ty\   d}|jddd }
}	Y n0 | |	}
||	 ||
 |
|	kr"|d	7 }q"W d    n1 s0    Y  |rtjd
|  |r|p|}tj	t
||d| d| d |S )Nr   Frbmodeutf-8Treplace)errorsr   SWarning - %s is not a valid UTF-8 file. Lines with decode errors have been ignored
z	%s:beforez%s:after)fromfiletofile)opendecodeUnicodeDecodeErrorrk   rA   r    stderrwritestdout
writelinesr   )r   rU   rW   re   found_unicode_errororiginalupdatedfraw_original_lineoriginal_lineri   r   r   r   r^     sF    


(	zUpdateModulePaths._show_diffc              
   C   s   d}d}t |ddZ}|D ]D}z|d}W n tyB   d}Y q0 | |}||kr|d7 }qW d    n1 st0    Y  |rtjd|  |S )	Nr   Frl   rm   ro   Tr   rr   )ru   rv   rw   rk   r    rx   ry   r   rU   re   r|   r   r   r   ri   r   r   r   r_   K  s$    

(z UpdateModulePaths._count_changesc              
   C   s   d}d}t j|ddd}|D ]x}z|d}W n" tyR   tj| d}Y q0 | |}tdkrztj|	d ntj| ||kr|d7 }qW d    n1 s0    Y  |rtj
d	|  |S )
Nr   FTrl   )Zinplacern   ro   )r      r   rr   )	fileinputZ	FileInputrv   rw   r    rz   ry   rk   CURRENT_PYTHONencoderx   r   r   r   r   r`   b  s,    

(zUpdateModulePaths._rewrite_file)NFFNN)N)r&   r'   r(   r   rg   compilerf   r   r#   rk   r^   r_   r`   r   r   r   r   rB      s\   ,     
O
,rB   c                   @   s   e Zd ZdZdd ZdS )Versionz+List which version of Wagtail you are usingc                 C   s&   dd l }||j}td|  d S )Nr   zYou are using Wagtail )r5   get_versionVERSIONr@   )r   r5   versionr   r   r   r#     s    zVersion.runN)r&   r'   r(   r   r#   r   r   r   r   r     s   r   )rV   Zupdatemodulepathsz	--versionc                   C   s   t jtjd S )Nr   )r6   r7   basenamer    r!   r   r   r   r   r     s    r   c                  C   sJ   t dt   t d tt D ]"\} }t d| d |j  q"d S )Nz?Type '%s help <subcommand>' for help on a specific subcommand.
zAvailable subcommands:
z       )r@   r   sortedCOMMANDSitemsljustr   )namecmdr   r   r   
help_index  s    r   c                 C   s(   t d|   t dt   td d S )NzUnknown command: '%s'zType '%s help' for usage.r   )r@   r   r    r?   )commandr   r   r   unknown_command  s    r   c                  C   s   zt jd } W n ty(   t  Y d S 0 | dkrzt jd }W n tyZ   t  Y d S 0 zt| }W n ty   t| Y d S 0 || d S zt|  }W n ty   t|  Y d S 0 |t j d S )Nr   r.   r   )	r    r!   
IndexErrorr   r   KeyErrorr   r   r%   )r   Zhelp_command_namer   r   r   r   main  s0    
r   __main__)r	   )r   rS   r6   rg   r    argparser   difflibr   Zdjango.core.managementr   version_infor   ZREQUIRED_PYTHONrx   ry   formatr?   r   r   r)   rB   r   r   r   r   r   r   r&   r   r   r   r   <module>   sB   

F  	 
