o
    ñÅ[h\7  ã                   @   s¤  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 z(d dlZd dlZd dlmZmZ d d	lmZ d d
lmZ d dlmZ d dlZW n ey`   d dlZe d¡ Y nw d dlmZ d dlmZ d dlm Z  e!Z"edg d¢ƒZ#G dd„ de	ƒZ$G dd„ de%ƒZ&dZ'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd „ Z,d2d!e e# fd"d#„Z-d$d%„ Z.d&d'„ Z/d!eee0e1f  fd(d)„Z2d*Z3d+d,„ Z4d-d.„ Z5d3d0d1„Z6dS )4é    N)ÚPath)ÚListÚTupleé   )ÚBaseCommandé   )Úget_class_bounds)ÚrenameÚmove)ÚRename)ÚProject©Úpath_to_resourcezRBefore running this command, you need to run "pip3 install -U rope black==20.8b1" )ÚImportTools)Ú
namedtuple)ÚIterableÚ
MethodInfo)ÚstartÚstopÚnameÚmodelc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚCommandc                 C   s$   |j ddd |j ddddd d S )	NÚappsÚ*)Únargsz--keepÚ
store_trueÚkeep_old_filesF)ÚactionÚdestÚdefault)Úadd_argument)ÚselfÚparser© r#   ú|/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/cli/remove_self.pyÚadd_arguments#   s   
ÿzCommand.add_argumentsc          
      O   sÞ   t dƒ ¡ D ]V}| d¡ ¡ rB|j}|r||vrq|st|ƒ zt|ƒ W n ty: } z	| d¡ d¡ ‚ d }~ww |sAt	|ƒ q| d¡ ¡ r\| d¡}|j
dd | d¡ |¡ qt dƒ}	|	 ¡ ri|	 
¡  td	ƒ d S )
NÚ.ú	models.pyú__init__.pyÚ úapp.pyT)Ú
missing_okz	manage.pyz1Done. You should also run: otree upcase_constants)r   ÚiterdirÚjoinpathÚexistsr   ÚbackupÚmake_noselfÚ	ExceptionÚ
write_textÚrearrange_folderÚunlinkr	   Úprint_function)
r!   r   r   ÚargsÚoptionsZappÚapp_nameÚexcÚinitZ	manage_pyr#   r#   r$   Úhandle)   s4   €þ€
€zCommand.handleN)Ú__name__Ú
__module__Ú__qualname__r%   r;   r#   r#   r#   r$   r   "   s    r   c                   @   s   e Zd ZdS )ÚCannotConvertN)r<   r=   r>   r#   r#   r#   r$   r?   E   s    r?   zCurrency as cc           0         sº  t ˆ d d‰tˆ ƒ}|d ‰|d }|d }| ¡ sd S tdˆ ƒ ‡fdd„}‡fdd	„‰‡fd
d„}d}dddg| d¡ ¡ ¢|‘}| d¡}t d|¡}	|	r_ˆ › d|	 d¡› d}
t	|
ƒ‚| 
d¡D ]}| d¡rlqd| d¡rrqd| |¡ qd||ƒ ˆ d¡jdd}|dd„ |D ƒƒ ‡ ‡fdd„}|dƒ}|ƒ }tdd„ t d|tj¡D ƒƒ}tƒ }t|ƒD ]©\}}t||ƒ}t|ƒD ]›\}}|d krá|d!krát||ƒ\}}d"|||… v }|rÞd#nd$}ntd%d$d#d& |d%¡}|||d …  d'¡ d( }ztˆ||ƒ |¡}ˆ |¡ W n ty   t|||d) … ƒ ‚ w |d&v rZ| |¡ |› d*|› }| d+ˆ ¡ d,¡D ]"}|| d¡v rXtd-|› d.|› d/|› d0|› d1|› d2|› d3ƒ q7q¿q²|ƒ }z| t¡}W n
 typ   Y nw tˆ||t tƒ d4 ƒ d5¡}ˆ |¡ t!ˆƒ}ˆ "d6¡} | #| ¡}!|! $¡  |! %¡  ˆ|! &¡ ƒ |ƒ }| ¡ }g }"|D ]/\}}#|d&v rÁ|" 't(||dd7¡ q¬ttt(||dd7ƒƒD ]\}$}%}}#| )|$d8¡ qÌq¬d9g}&g }'d}(|"D ]$})|' '||(|)j*… ¡ |& 'd:d„ ||)j*|)j+d4 … D ƒ¡ |)j+d4 }(qå|' '||(d … ¡ t,|'ƒD ]\}(}t -d;d<|¡|'|(< q|& d=¡ d .|&¡}*d .|'¡ /||*¡}+t -d>d%|+¡}+t -d?d$|+¡}+t -d@d#|+¡}+|+ /dAdB¡ /dCdD¡}+t -dEdF|+¡}+t -dGdH|+¡}+t -dIdJ|+¡}+t0|+|ƒ}+|+jdd}g },t1t |ƒƒD ]!}(|, ||( ¡ ||(  dK¡r ||(d4   dL¡s |, dM¡ q€ˆt2d .|,¡ƒƒ | dN¡}-|- ¡ rÛ|- d¡}.|. /dOdP¡ /dQdR¡ /dSdT¡}/t -dUdV|/¡}/| dW¡j3|/ddX d S d S )YN)Z
ropefolderr(   úpages.pyr'   Z	Upgradingc                      s
   ˆ   d¡S )NÚutf8)Ú	read_textr#   ©Úapp_pathr#   r$   ÚreadV   s   
zmake_noself.<locals>.readc                    s   ˆ j | dd d S )NrA   ©Úencoding)r2   ©ÚtxtrC   r#   r$   ÚwriteY   ó   zmake_noself.<locals>.writec                    s   ˆ d  | ¡ƒ d S )NÚ
)Újoin)Úlines)rJ   r#   r$   Ú
writelines\   rK   zmake_noself.<locals>.writelinesz"""endofmodels"""z$from otree.api import Page, WaitPagezfrom otree.api import *z#from otree.api import Currency as crA   zXself\.(?!player|group|subsession|participant|session|timeout_happened|round_number)(\w+)z/pages.py contains "r   z+". This is not a recognized page attribute.rL   zfrom ._builtinzfrom .modelsF)Úkeependsc                 s   s$    | ]}|  ¡ r| d d¡V  qdS )ú	ú    N)ÚstripÚreplace)Ú.0Úer#   r#   r$   Ú	<genexpr>€   s   €" zmake_noself.<locals>.<genexpr>c                    s   t ˆˆ d |  ƒS )Nú/r   )Úpth)r8   Úprojr#   r$   Úresource‚   rK   zmake_noself.<locals>.resourcec                 s   s$    | ]}|  d ¡|  d¡fV  qdS )r   r   N©Úgroup©rU   Úmr#   r#   r$   rW   Š   s
   € ÿ
ÿzA^class (\w+)\((BasePlayer|BaseGroup|BaseSubsession|Page|WaitPage)ZWaitPageZafter_all_players_arrivezwait_for_all_groups = TrueZ
subsessionr]   Zplayer)ZPlayerÚGroupZ
Subsessionz(selfr   é   r&   Ú	templatesz*.htmlz!
((((((((((((((((((((((((((((((
"z" contains the method call z, but zA has been converted to a function.
You have 2 choices:
	(a) call ú(z-) in vars_for_template
	(b) manually convert z0 back to a method
))))))))))))))))))))))))))))))r   ÚcuÚ__init__)Ústart_indexz    @staticmethodz# FUNCTIONSc                 s   s    | ]}t |ƒV  qd S )N)Údedent)rU   Úliner#   r#   r$   rW   á   s   € 
ÿz(live_method) = ["'](\w+)["']z\1 = \2z# PAGESz\bplayer\.player\bz\bgroup\.group\bz\bsubsession\.subsession\bzdef before_next_page(player):z/def before_next_page(player, timeout_happened):zplayer.timeout_happenedZtimeout_happenedzdef (\w+)\(player\bzdef \1(player: Playerzdef (\w+)\(group\bzdef \1(group: Groupzdef (\w+)\(subsession\bzdef \1(subsession: Subsessionúclass ú z    passútests.pyzfrom ._builtin import Botzfrom otree.api import Botzfrom . import pageszfrom . import *zfrom .models import Constantsr)   z\bpages\.(\w)z\1útests_noself.pyrF   )4r   r   r.   r5   rB   Ú
splitlinesÚreÚsearchr]   r?   ÚsplitÚ
startswithÚappendÚlistÚfinditerÚ	MULTILINEÚsetÚreversedÚget_method_offsetsr   ÚdictÚgetÚindexr   Zget_changesÚdor1   Úaddr-   ÚglobÚCURRENCY_C_IMPORTÚ
ValueErrorÚlenr   Z
get_moduleZmodule_importsÚremove_duplicatesZsort_importsZget_changed_sourceÚextendÚget_method_boundsÚinsertr   r   Ú	enumerateÚsubrM   rT   Úfix_method_callsÚrangeÚblack_formatr2   )0r8   ÚapprootÚ
pages_pathÚmodels_pathrE   rO   ZEND_OF_MODELSrN   Z	pages_txtr_   Úmsgrh   r[   Zapp_resZapp_txtZclass_namesÚmodel_methodsÚ
class_nameZ
base_classÚoffsetsÚoffsetr   Z	cls_startZcls_endZis_subsessionZrename_self_toZself_offsetÚchangesZtemplate_usageZtplZcurrency_offsetZimport_toolsZrope_moduleZmodule_with_importsZmethod_boundsÚ_r   ÚendZfunction_linesZnon_function_linesÚiÚboundZfunction_txtrI   Zlines2Ú
tests_pathZ	tests_txtZnew_txtr#   )r8   rD   rZ   rJ   r$   r0   L   sP  
ûúù

þ

ýþ	
ÿÿþþ

þþþüüûÿ€è"ÿÿþ



ÿý
ÿÿ

þý
$
€



ý÷r0   c                    s   ‡ fdd„}t  d|| ¡S )z@this doesn't work for functions that take args. too complicated.c                    s<   |   d¡ˆ v r|   d¡d |   d¡ |   d¡ d S |   ¡ S )Né   rc   r   r   ú)r\   )r_   ©r   r#   r$   Úrepl!  s   &zfix_method_calls.<locals>.replz/([\.\w]*)\b(player|group|subsession)\.(\w+)\(\))rn   r‡   )rI   r   rœ   r#   r›   r$   rˆ     s   rˆ   c                 C   s   |   d¡r| dd … S | S )NrR   é   )rq   ©rh   r#   r#   r$   rg   )  s   
rg   c                 C   s   t j| t jddddS )Néd   F)Úline_lengthZstring_normalization)Úmode)ÚblackÚ
format_strZModerH   r#   r#   r$   rŠ   /  s   ÿrŠ   c                 C   s.   | D ]}|j |  kr|jkr dS  qqd S )NT)r   r   )ZboundsÚlinenor—   r#   r#   r$   Úis_within_a_bound5  s
   ÿÿr¥   Úreturnc           
      c   s¨    d}d}d}d}t | |dD ]B\}}| d|› d¡rd}q|rQt|ƒrJ|r3t||d ||ƒV  d}| d¡rJ|}t d	|¡}	|	 d¡}|	 d
¡}t|ƒrQ dS qdS )z1 basedFN)r   ri   rc   Tr   z    def zdef (\w+)\((\w+)r   )r†   rq   Ú"is_class_or_module_level_statementr   rn   ro   r]   Úis_module_level_statement)
rN   Z	ModelNamerf   Zin_modelr   r   r   r¤   rh   r_   r#   r#   r$   r„   ;  s.   €


€îr„   c                 C   ó(   | d d…   ¡ o| d d…   ¡  d¡ S )Né   ú#©rS   rq   rž   r#   r#   r$   r§   X  ó   (r§   c                 C   r©   )Nr   r«   r¬   rž   r#   r#   r$   r¨   \  r­   r¨   c                    s.   t | |ƒ\‰‰ ‡ ‡fdd„t d| tj¡D ƒS )Nc                    s:   g | ]}ˆ|  ¡   k rˆ k rn n	|  ¡ | d ¡f‘qS ©r   )r   r]   r^   ©Z	class_endZclass_startr#   r$   Ú
<listcomp>b  s
    þz&get_method_offsets.<locals>.<listcomp>z^\s{4}def (\w+)\(self\b)r   rn   rt   ru   )rI   Z	ClassNamer#   r¯   r$   rx   `  s   þrx   Z_REMOVE_SELF_BACKUPc                 C   sR   t | ƒ}t tƒ}| ¡ s| ¡  | | ¡}| ¡ st ||¡ tdt› dƒ d S )NzYour old files were saved to z/.)r   ÚBACKUP_FOLDERr.   Úmkdirr-   ÚshutilÚcopytreer5   )r8   r‹   Z
old_folderZapp_backup_destr#   r#   r$   r/   l  s   
r/   c           
      C   sü   t | ƒ}|d }d| d¡vrd S td| ƒ |d }|d }|d }| ¡ r*| ¡  | ¡ r2| ¡  | ¡ r:| ¡  | d¡}| ¡ rHt |¡ | d	| ¡}| ¡ r_t||ƒ t | d	¡¡ | d
¡}| d¡}	| ¡ r||	 ¡ ru|	 ¡  | 	|	¡ d S d S )Nr(   zfrom otree.apirA   zRemoving old files fromr@   r'   r*   Ú_builtinrb   rl   rk   )
r   rB   r5   r.   r4   r-   r³   ÚrmtreeÚcopytree_py37_compatr	   )
r8   r‹   rD   rŒ   r   Zapp_py_pathrµ   rb   Ztests_noselfr˜   r#   r#   r$   r3   w  s8   





ýr3   Fc                 C   sZ   t  | ¡D ]%}t j | |¡}t j ||¡}t j |¡r$t ||||¡ qt ||¡ qdS )zGreplacement for shutil.copytree(templates, approot, dirs_exist_ok=True)N)ÚosÚlistdirÚpathrM   Úisdirr³   r´   Úcopy2)ÚsrcÚdstÚsymlinksÚignoreÚitemÚsÚdr#   r#   r$   r·   •  s   úr·   r®   )FN)7r¸   rn   r³   Úpathlibr   Útypingr   r   Úbaser   Úcommonr   Zrope.base.codeanalyzeZropeZrope.refactor.occurrencesZrope.refactorr	   r
   Zrope.refactor.renamer   Zrope.base.projectr   Zrope.base.libutilsr   r¢   ÚModuleNotFoundErrorÚsysÚexitZrope.refactor.importutilsr   Úcollectionsr   r   Úprintr5   r   r   r1   r?   r   r0   rˆ   rg   rŠ   r¥   r„   r§   r¨   ÚintÚstrrx   r±   r/   r3   r·   r#   r#   r#   r$   Ú<module>   sV    ÿý# S	