a
    ar6                     @   s   d 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	 G dd dZ
G d	d
 d
e	jZG dd de	jZedkrddlmZ e ZeddZeg ddddddddgdddddgddddd ed e  ee  dS ) z
Cookiecutter widget.
    N)OrderedDict)Template)QtCore)	QtWidgetsc                   @   s   e Zd ZdZdd ZdS )	NamespacezQ
    Namespace to provide a holder for attributes when rendering a template.
    c                 K   s"   |  D ]\}}t| || qd S N)itemssetattr)selfkwargskeyvalue r   Llib/python3.9/site-packages/spyder/plugins/projects/widgets/qcookiecutter.py__init__   s    zNamespace.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   c                       sV   e Zd ZdZeeeZd fdd	Z	dd Z
dd Zd	d
 Zdd Zdd Z  ZS )CookiecutterDialogz
    QDialog to display cookiecutter.json options.

    cookiecutter_settings: dict
        A cookiecutter.json settings content.
    pre_gen_code: str
        The code of the pregeneration script.
    Nc                    s   t  | t| ||| _t | _td| _t	 }|
| j |
| j |
| j | | | jj| j | jj| j | jj| j d S )NZValidate)superr   CookiecutterWidget_widgetr   ZQLabel_info_labelZQPushButtonZ_validate_buttonZQVBoxLayoutZ	addWidget	setLayoutZclickedconnectvalidatesig_validated_set_message)r
   parentcookiecutter_settingspre_gen_codeZlayout	__class__r   r   r   1   s    

zCookiecutterDialog.__init__c                 C   s   |dkr| j | d S )Nr   )r   setText)r
   Z	exit_codemessager   r   r   r   F   s    zCookiecutterDialog._set_messagec                 C   s   | j | dS )1
        Setup the widget using options.
        N)r   setup)r
   r    r   r   r   r'   J   s    zCookiecutterDialog.setupc                 C   s   | j | dS z:
        Set the cookiecutter pregeneration code.
        N)r   set_pre_gen_coder
   r!   r   r   r   r)   P   s    z#CookiecutterDialog.set_pre_gen_codec                 C   s   | j   dS )Q
        Run, pre generation script and provide information on finished.
        N)r   r   r
   r   r   r   r   V   s    zCookiecutterDialog.validatec                 C   s
   | j  S ):
        Return all entered and generated values.
        )r   
get_valuesr,   r   r   r   r.   \   s    zCookiecutterDialog.get_values)NN)r   r   r   r   r   Signalintstrr   r   r   r'   r)   r   r.   __classcell__r   r   r"   r   r       s   	r   c                       s   e Zd ZdZeeeZd fdd	Z	dd Z
dd Zd	d
 Zd ddZd!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dd Z  ZS )#r   z
    QWidget to display cookiecutter.json options.

    cookiecutter_settings: dict
        A cookiecutter.json settings content.
    pre_gen_code: str
        The code of the pregeneration script.
    Nc                    s   t  | || _|| _|| _t | _t | _t | _d | _	t
jddd | _d | _d | _d | _d | _d | _t | _| j| jj | | j d S )Nz.py)suffix)r   r   Z_parent_cookiecutter_settings_pre_gen_coder   _widgets_defined_settings_rendered_settings_processtempfileZmkstemp	_tempfile_extensions_copy_without_render
_new_linesZ_private_varsZ_rendered_private_varr   ZQFormLayout_form_layoutZsetFieldGrowthPolicyZAllNonFixedFieldsGrowr   )r
   r   r    r!   r"   r   r   r   t   s&    
zCookiecutterWidget.__init__c                 C   s   | j r| j dg | _| j dg | _| j dd| _| j  D ]\}}t|tr`t|	 }nt|tsr|g}n|}g }|r|r|D ]2}t
|}|jtf i | j d}|||k qt|r|| j|< q@|| j|< q@dS )z<
        Check which values are Jinja2 expressions.
        r=   r>   r?    ZcookiecutterN)r5   popr=   r>   r?   r   
isinstancedictlistkeysr   renderr   appendanyr9   r8   )r
   settingr   Zlist_valuesZare_rendered_valuesZ
list_valuetemplateZrendered_valuer   r   r   _check_jinja_options   s:    

z'CookiecutterWidget._check_jinja_optionsc                 C   s
   || j v S )z7
        Check if option contains jinja2 code.
        )r9   )r
   rK   r   r   r   	_is_jinja   s    zCookiecutterWidget._is_jinjac                 C   s*   d}|  dv rd}n|  dv r&d}|S )z6
        Convert a text value into a boolean.
        N)nnofalseF)yyestrueT)lower)r
   textr   r   r   r   _parse_bool_text   s    z#CookiecutterWidget._parse_bool_textc                    s   |dur2t |dkr2tjd  j _ j _ntjd | _|durl |  j	
dfdd	  fdd _ fdd _ S )	z)
        Create a textbox field.
        N   r   c                    s      S r   )rH   )xr,   r   r   <lambda>       z4CookiecutterWidget._create_textbox.<locals>.<lambda>c                      s      S r   rV   r   boxr   r   r[      r\   c                    s
     | S r   )r$   r]   r^   r   r   r[      r\   )N)lenr   Z	QTextEditZsetPlainTextr$   ZtoPlainTextrV   Z	QLineEditrK   ZtextChangedr   	get_value	set_value)r
   rK   labeldefaultr   )r_   r
   r   _create_textbox   s    

z"CookiecutterWidget._create_textboxc                    sH   t jd | _dur.} |  fdd}| _ S )z*
        Create a checkbox field.
        rY   Nc                     s*      d i} |    S )Nzother-value-)rW   Z	isChecked)Zbool_to_valuesr_   rd   r
   r   r   
_get_value   s    
z7CookiecutterWidget._create_checkbox.<locals>._get_value)r   Z	QCheckBoxrK   rW   Z
setCheckedra   )r
   rK   rc   rd   Znew_defaultrg   r   rf   r   _create_checkbox   s    

z#CookiecutterWidget._create_checkboxc                    sn   t j| d t|tr@t }| D ]\}} |||i q$n|D ]} || qD| _ fdd _ S )z*
        Create a combobox field.
        rY   c                      s      S r   )ZcurrentDatar   r^   r   r   r[     r\   z5CookiecutterWidget._create_combobox.<locals>.<lambda>)	r   Z	QComboBoxrD   rE   r   r   ZaddItemrK   ra   )r
   rK   rc   choicesrd   ZtempZchoiceZchoice_valuer   r^   r   _create_combobox   s    
z#CookiecutterWidget._create_comboboxc                 C   s   d |d }t|ttfr2| |||}nZt|tr~| dv rZ| j	|||d}q| 
|rhdn|}| j|||d}ntd|||f| j|< ||fS )z&
        Create a form field.
         _)rR   rS   rT   rO   rP   rQ   )rd   Nz+Cookiecutter option '{}'cannot be processed)joinsplit
capitalizerD   rF   rE   rj   r1   rU   rh   rN   re   	Exceptionformatr7   )r
   rK   r   rc   widgetrd   r   r   r   _create_field  s    
z CookiecutterWidget._create_fieldc                 C   sz   | j durvt| j   }t| j   }d}|r>||7 }|rJ||7 }|dd}|dd}| j| j  | dS )z5
        Process output of valiation script.
        NrA   z
rk   
)	r:   bytesZreadAllStandardOutputdecodeZreadAllStandardErrorreplacer   emitZexitCode)r
   outerrorr%   r   r   r   _on_process_finished  s    
z'CookiecutterWidget._on_process_finishedc                 C   sV   || _ |   | j  D ]0\}}|ds| ||\}}| j|| q|   dS )r&   __rl   N)r5   rM   r   
startswithrs   r@   ZaddRowrH   )r
   r    rK   r   rc   rr   r   r   r   r'   2  s    
zCookiecutterWidget.setupc                 C   s
   || _ dS r(   )r6   r*   r   r   r   r)   @  s    z#CookiecutterWidget.set_pre_gen_codec                 C   s`   |   }| j D ]H\}}|dst|}|jtf i |d}| j| \}}|| qdS )zT
        Render text that contains Jinja2 expressions and set their values.
        r|   rB   N)	r.   r9   r   r~   r   rH   r   r7   rb   )r
   r    rK   r   rL   valr}   rr   r   r   r   rH   F  s    
zCookiecutterWidget.renderc                 C   st   t   }}| jrR| j D ]6\}}|dr6|||< q| j| \}}| ||< q| j|d< | j|d< | j|d< |S )r-   r|   r=   r>   r?   )	r   r5   r   r~   r7   ra   r=   r>   r?   )r
   r    ZcsrK   r   r}   rr   r   r   r   r.   S  s    




zCookiecutterWidget.get_valuesc                 C   s   | j dur|  }t| j }|jtf i |d}t| jd}|| W d   n1 s^0    Y  | jdur|| j	  t
 | _| jtj | j| jg | jj| j | j  dS )r+   NrB   w)r6   r.   r   rH   r   openr<   writer:   Z	terminater   ZQProcessZ
setProgramsys
executableZsetArgumentsZfinishedr   r{   start)r
   r    rL   r   Zfhr   r   r   r   h  s    

(


zCookiecutterWidget.validate)NN)N)N)N)r   r   r   r   r   r/   r0   r1   r   r   rM   rN   rW   re   rh   rj   rs   r{   r'   r)   rH   r.   r   r2   r   r   r"   r   r   c   s    	*


r   __main__)qapplicationrY   )123rR   rQ   Zgoanpecaz%{{ cookiecutter.fixed_option|upper }}zPortable Network GraphicZlibpngZGIMP)nameZlibraryZappsZBitmapZlibbmpZPaint)ZpngZbmpz{{ cookiecutter.fixed_option }})Zlist_optionZcheckbox_optionZcheckbox_option_2Zfixed_optionZrendered_optionZdict_optionZ_privateZ__private_renderedz<
import sys
print("HELP!")  # spyder: test-skip
sys.exit(10))r   r   r;   collectionsr   Zjinja2r   Zqtpyr   r   r   ZQDialogr   ZQWidgetr   r   Zspyder.utils.qthelpersr   ZappZdlgr'   r)   ZshowexitZexec_r   r   r   r   <module>	   sP   
C  

