
    Je6                        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      Z
 G d	 d
e	j                        Z G d de	j                        Zedk(  rddlmZ  e       Z ed      Zej)                  g ddddddddgdddddgddddd       ej+                  d       ej-                           ej.                  ej1                                yy) z
Cookiecutter widget.
    N)OrderedDict)Template)QtCore)	QtWidgetsc                       e Zd ZdZd Zy)	NamespacezQ
    Namespace to provide a holder for attributes when rendering a template.
    c                 N    |j                         D ]  \  }}t        | ||        y N)itemssetattr)selfkwargskeyvalues       O/usr/lib/python3/dist-packages/spyder/plugins/projects/widgets/qcookiecutter.py__init__zNamespace.__init__   s'     ,,. 	&JCD#u%	&    N)__name__
__module____qualname____doc__r    r   r   r   r      s    &r   r   c                   j     e Zd ZdZ ej
                  ee      Z	 d fd	Z	d Z
d Zd Zd Zd Z x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.
    c                    t         |   |       t        | ||      | _        t	        j
                         | _        t	        j                  d      | _        t	        j                         }|j                  | j                         |j                  | j                         |j                  | j                         | j                  |       | j                  j                  j                  | j                         | j                  j                  j                  | j                          | j                  j                  j                  | j                         y )NValidate)superr   CookiecutterWidget_widgetr   QLabel_info_labelQPushButton_validate_buttonQVBoxLayout	addWidget	setLayoutclickedconnectvalidatesig_validated_set_message)r   parentcookiecutter_settingspre_gen_codelayout	__class__s        r   r   zCookiecutterDialog.__init__1   s     )'
 %++- ) 5 5j A&&(&))*../v 	%%--dmm<""**4+<+<=""**4+=+=>r   c                 F    |dk7  r| j                   j                  |       y y )Nr   )r!   setText)r   	exit_codemessages      r   r+   zCookiecutterDialog._set_messageF   s"    >$$W- r   c                 :    | j                   j                  |       y)1
        Setup the widget using options.
        N)r   setup)r   r-   s     r   r7   zCookiecutterDialog.setupJ   s     	01r   c                 :    | j                   j                  |       yz:
        Set the cookiecutter pregeneration code.
        N)r   set_pre_gen_coder   r.   s     r   r:   z#CookiecutterDialog.set_pre_gen_codeP   s     	%%l3r   c                 8    | j                   j                          y)Q
        Run, pre generation script and provide information on finished.
        N)r   r)   r   s    r   r)   zCookiecutterDialog.validateV   s     	r   c                 6    | j                   j                         S ):
        Return all entered and generated values.
        )r   
get_valuesr>   s    r   rA   zCookiecutterDialog.get_values\   s     ||&&((r   NN)r   r   r   r   r   Signalintstrr*   r   r+   r7   r:   r)   rA   __classcell__r0   s   @r   r   r       s?     "FMM#s+M?*.24 )r   r   c                        e Zd ZdZ ej
                  ee      Z	 d fd	Z	d Z
d Zd ZddZddZddZd	 Zd
 Zd Zd Zd Zd Zd Z x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.
    c                    t         |   |       || _        || _        || _        t               | _        t               | _        t               | _        d | _	        t        j                  d      d   | _        d | _        d | _        d | _        d | _        d | _        t%        j&                         | _        | j(                  j+                  | j(                  j,                         | j/                  | j(                         y )Nz.py)suffix)r   r   _parent_cookiecutter_settings_pre_gen_coder   _widgets_defined_settings_rendered_settings_processtempfilemkstemp	_tempfile_extensions_copy_without_render
_new_lines_private_vars_rendered_private_varr   QFormLayout_form_layoutsetFieldGrowthPolicyAllNonFixedFieldsGrowr&   )r   r,   r-   r.   r0   s       r   r   zCookiecutterWidget.__init__t   s      &;#)#!,"--!))7;  $(!!%)" &113..33	5t(()r   c           	         | j                   rA| j                   j                  dg       | _        | j                   j                  dg       | _        | j                   j                  dd      | _        | j                   j                         D ]  \  }}t        |t              rt        |j                               }nt        |t              s|g}n|}g }|rM|rK|D ]F  }t        |      }|j                  t        di | j                         }|j                  ||k7         H t        |      r|| j                  |<   || j                   |<    yy)z<
        Check which values are Jinja2 expressions.
        rV   rW   rX    cookiecutterNr   )rM   poprV   rW   rX   r   
isinstancedictlistkeysr   renderr   appendanyrQ   rP   )r   settingr   list_valuesare_rendered_values
list_valuetemplaterendered_values           r   _check_jinja_optionsz'CookiecutterWidget._check_jinja_options   sP    &&#::>>}?A CD )-(C(C(G(G&),D% #99==lBODO"&"="="C"C"E <eT*"&uzz|"4K#E40#('K"'K&(#5&1 :
#+J#7)1)2 *?"&"="=*? *9 *@ ,22&.8:: *+7<D++G46;D**731< 'r   c                     || j                   v S )z7
        Check if option contains jinja2 code.
        )rQ   )r   rk   s     r   	_is_jinjazCookiecutterWidget._is_jinja   s     $1111r   c                 ^    d}|j                         dv rd}|S |j                         dv rd}|S )z6
        Convert a text value into a boolean.
        N)nnofalseF)yyestrueT)lower)r   textr   s      r   _parse_bool_textz#CookiecutterWidget._parse_bool_text   s?     ::<//E  ZZ\11Er   c                 p    |Gt        |      dkD  r9t        j                         j                  _        j
                  _        nt        j                         |_        |0j	                  |       j                  j                  d fd	       j                  _        fd_        S )z)
        Create a textbox field.
           r,   c                 $    j                         S r
   )rh   )xr   s    r   <lambda>z4CookiecutterWidget._create_textbox.<locals>.<lambda>   s    4;;= r   c                 &    j                  |       S r
   )r2   )r|   boxs    r   r   z4CookiecutterWidget._create_textbox.<locals>.<lambda>   s    S[[%6 r   r
   )lenr   	QTextEditsetPlainTextr2   toPlainTextr|   	QLineEditrk   textChangedr(   	get_value	set_value)r   rk   labeldefaultr   s   `   @r   _create_textboxz"CookiecutterWidget._create_textbox   s     3w<"#4%%T2C**CKCH%%T2CKK OO##$@A6
r   c                      t        j                         |_        " j                        }j	                  |        fd}|_        S )z*
        Create a checkbox field.
        r   c                  z    j                        j                         dz   i} | j                            S )Nzother-value-)r}   	isChecked)bool_to_valuesr   r   r   s    r   
_get_valuez7CookiecutterWidget._create_checkbox.<locals>._get_value   sE    %%g.))'22NW4LN "#--/22r   )r   	QCheckBoxrk   r}   
setCheckedr   )r   rk   r   r   new_defaultr   r   s   `  `  @r   _create_checkboxz#CookiecutterWidget._create_checkbox   sQ     !!.//8KNN;'	3 #
r   c                 "   t        j                  |       }t        |t              r7t	               }|j                         D ]  \  }}|j                  |||i        n|D ]  }|j                  ||        ||_        |j                  |_	        |S )z*
        Create a combobox field.
        r   )
r   	QComboBoxrd   re   r   r   addItemrk   currentDatar   )	r   rk   r   choicesr   r   tempchoicechoice_values	            r   _create_comboboxz#CookiecutterWidget._create_combobox   s     !!.gt$=D(/ <$FV\$:;< " ,FF+, 
r   c                    dj                  |j                  d            j                         }t        |t        t
        f      r| j                  |||      }n{t        |t              rQ|j                         dv r| j                  |||      }nD| j                  |      rdn|}| j                  |||      }nt        dj                  |            ||f| j                  |<   ||fS )z&
        Create a form field.
         _)rx   ry   rz   ru   rv   rw   )r   Nz+Cookiecutter option '{}'cannot be processed)joinsplit
capitalizerd   rf   re   r   rE   r{   r   rs   r   	ExceptionformatrO   )r   rk   r   r   widgetr   s         r   _create_fieldz CookiecutterWidget._create_field  s     s+,779edD\***7E5AFs#{{} HH..wu.M"&.."9$u--gug-N=DDWMO O #(gf}r   c                    | j                   t        | j                   j                               j                         }t        | j                   j	                               j                         }d}|r||z  }|r||z  }|j                  dd      }|j                  dd      }| j                  j                  | j                   j                         |       yy)z5
        Process output of valiation script.
        Nr`   z
r   
)	rR   bytesreadAllStandardOutputdecodereadAllStandardErrorreplacer*   emitexitCode)r   outerrorr4   s       r   _on_process_finishedz'CookiecutterWidget._on_process_finished  s     ==$;;=>EEGC$--<<>?FFHEG35 oofc2GoodC0G##DMM$:$:$<gF %r   c                    || _         | j                          | j                   j                         D ]H  \  }}|j                  d      r| j	                  ||      \  }}| j
                  j                  ||       J | j                          y)r6   __r   N)rM   rq   r   
startswithr   r\   addRowrh   )r   r-   rk   r   r   r   s         r   r7   zCookiecutterWidget.setup2  s     '<#!!#"99??A 	8NGU%%k2 $ 2 27E Bv!!((7	8
 	r   c                     || _         yr9   )rN   r;   s     r   r:   z#CookiecutterWidget.set_pre_gen_code@  s     *r   c                    | j                         }| j                  j                         D ]`  \  }}|j                  d      rt	        |      }|j                  t        di |      }| j                  |   \  }}|j                  |       b y)zT
        Render text that contains Jinja2 expressions and set their values.
        r   ra   Nr   )	rA   rQ   r   r   r   rh   r   rO   r   )r   r-   rk   r   ro   valr   r   s           r   rh   zCookiecutterWidget.renderF  s     !% 1"55;;= 	&NGU%%k2#E?oo!*!C-B!C & E!]]73
F  %	&r   c                 L   t               x}}| j                  r^| j                  j                         D ]A  \  }}|j                  d      r|||<   | j                  |   \  }}|j                         ||<   C | j                  |d<   | j                  |d<   | j                  |d<   |S )r@   r   rV   rW   rX   )	r   rM   r   r   rO   r   rV   rW   rX   )r   r-   csrk   r   r   r   s          r   rA   zCookiecutterWidget.get_valuesS  s     &1]2&&"&"="="C"C"E H%%k25:)'2!%w!7JB5;5E5E5G)'2H 04/?/?m,%% 	45.2ool+$$r   c                    | j                   d| j                         }t        | j                         }|j                  t	        di |      }t        | j                  d      5 }|j                  |       ddd       | j                  5| j                  j                          | j                  j                  d       t        j                  |       | _        | j                  j                  t        j                         | j                  j!                  | j                  g       | j                  j"                  j%                  | j&                         | j                  j)                          yy# 1 sw Y   xY w)r=   Nra   wi  r   )rN   rA   r   rh   r   openrU   writerR   closewaitForFinishedr   QProcess
setProgramsys
executablesetArgumentsfinishedr(   r   start)r   r-   ro   r   fhs        r   r)   zCookiecutterWidget.validateh  s    )$(OO$5! 2 23H//&?)>? " AC dnnc* b }}(##%--d3"OOD1DMMM$$S^^4MM&&'78MM""**4+D+DEMM!# * s   $E33E<rB   r
   )r   r   r   r   r   rC   rD   rE   r*   r   rq   rs   r}   r   r   r   r   r   r7   r:   rh   rA   r)   rF   rG   s   @r   r   r   c   si     "FMM#s+M*8(<T2
**$,G(*&%*"r   r   __main__)qapplicationr   )123rx   rw   goanpecaz%{{ cookiecutter.fixed_option|upper }}zPortable Network GraphiclibpngGIMP)namelibraryappsBitmaplibbmpPaint)pngbmpz{{ cookiecutter.fixed_option }})list_optioncheckbox_optioncheckbox_option_2fixed_optionrendered_optiondict_option_private__private_renderedz<
import sys
print("HELP!")  # spyder: test-skip
sys.exit(10))r   r   rS   collectionsr   jinja2r   qtpyr   r   r   QDialogr   QWidgetr   r   spyder.utils.qthelpersr   appdlgr7   r:   showexitexec_r   r   r   <module>r      s     #   & &@)** @)FZ"** Z"z z3
.C
D
)CII*"!(&F 7' %'" :"C1	
8    HHJCHHSYY[M r   