U
    |e                     @   s  d Z dZddlZddlZ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mZmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZ dd	lmZmZmZmZmZmZ dd
l m Z  ddl!m"Z"m#Z#m$Z$m%Z% ddl&m&Z& ddl'm(Z( ddl)Z)ddl*Z*ddl+m,Z, ddl-m.Z. zddl/Z/W n e0k
rJ   dZ/Y nX zvddl1Z1e12  e1j3j4e1j5j6 Z7dd Z8dZ9ej:dkre1j3j;e1j5j< Z;ne1j3j;e1j5j= Z;e1j3j>Z>e1j3j?Z@dekZAW nd e0k
r&   ej:dkrdZ7dd Z8dZ9dZ;dZ>dZ@dekZAndZ7dZ8dZ9d Z> Z@Z;dZAY nX e>e@e;fZBdZCdZDG dd de,ZEeE jFZGG dd  d eHZIG d!d" d"eIZJG d#d$ d$ZKd%d& ZLd'd( ZMdS ))zQ
Buildozer
=========

Generic Python packager for Android / iOS. Desktop later.

z1.5.0    N)	JsonStore)stdoutstderrexit)search)joinexistsdirnamerealpathsplitext
expanduser)PopenPIPETimeoutExpired)environunlinkwalkseplistdirmakedirs)copy)copyfilermtreecopytreemove)fnmatch)pformat)FancyURLopener)ConfigParserc                 C   s   | S N xr    r    6/tmp/pip-unpacked-wheel-ohd2lbr1/buildozer/__init__.py<lambda>-       r$    win32ZNO_COLORz[0mc                 C   s   d d|  S )Nz[1;{}m   )formatr!   r    r    r#   r$   :   r%   z[1m      FZEIDi@  c                   @   s   e Zd ZdZdS )ChromeDownloaderzhMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36N)__name__
__module____qualname__versionr    r    r    r#   r,   M   s   r,   c                   @   s   e Zd ZdZdS )BuildozerExceptionzK
    Exception raised for general situations buildozer cannot process.
    Nr-   r.   r/   __doc__r    r    r    r#   r1   V   s   r1   c                   @   s   e Zd ZdZdS )BuildozerCommandExceptionzX
    Exception raised when an external command failed.

    See: `Buildozer.cmd()`.
    Nr2   r    r    r    r#   r4   ]   s   r4   c                   @   sf  e Zd ZdZdZdZdZdddZd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zdd5d6Zdd7d8Zdd9d:Z d;d< Z!d=d> Z"dd?d@Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)e*dMdN Z+e*dOdP Z,e*dQdR Z-e*dSdT Z.e*dUdV Z/e*dWdX Z0e*dYdZ Z1e*d[d\ Z2e*d]d^ Z3e*d_d` Z4e*dadb Z5e*dcdd Z6dedf Z7dgdh Z8didj Z9dkdl Z:dmdn Z;dodp Z<dqdr Z=dsdt Z>dudv Z?dwdx Z@dydz ZAd{d| ZBd}d~ ZCdd ZDdddZEdddZFdddZGdddZHdS )	Buildozerr   r*      )Z	distcleanupdatedebugreleaseZdeployrunZservebuildozer.specNc                 C   s  d| _ i | _|| _d | _d | _d| _tdd| _dd | j_| j	| j_
| j| j_| j| j_| j| j_| j| j_t|r| j|d |   t| j zt| jdd	d
| _ W n tk
r   Y nX | jddd | _| jrtt| j| j| _d | _d | _|r| | d S )Nr6   r&   T)allow_no_valuec                 S   s   | S r   r    )valuer    r    r#   r$   w   r%   z$Buildozer.__init__.<locals>.<lambda>utf-8	buildozer	log_level2bin_dir) r@   r   specfilenamestatebuild_idconfig_profiler   configoptionxform_get_config_listgetlist_get_config_list_valuesZgetlistvalues_get_config_default
getdefault_get_config_boolZgetbooldefault_get_config_raw_defaultZgetrawdefaultr   readcheck_configuration_tokensset_config_from_envsint	Exceptionuser_bin_dirr
   r   root_dir
targetnametarget
set_target)selffilenamerX   r    r    r#   __init__o   s@    





  zBuildozer.__init__c                 C   s:   || _ td|dgd}|| | _|   |   dS )zLSet the target to use (one of buildozer.targets, such as "android")
        buildozer.targets.{0}r?   fromlistN)rW   
__import__r)   
get_targetrX   check_build_layoutrQ   )rZ   rX   mr    r    r#   rY      s    
zBuildozer.set_targetc                 C   s   | j dk	stt| j drdS | d | d| j | j   | d | j   | d |   | 	  | d | j 
  d| j _dS )	zPrepare the build.
        N_build_preparedzPreparing buildzCheck requirements for {0}zInstall platformzCheck application requirementszCompile platformT)rX   AssertionErrorhasattrinfor)   rW   check_requirementsZinstall_platformcheck_application_requirementscheck_garden_requirementsZcompile_platformrd   rZ   r    r    r#   prepare_for_build   s    






zBuildozer.prepare_for_buildc                 C   s   | j dk	stt| j dstt| j dr.dS t| jddd | _t| j| jd< | d	| j | 
  | d | j   d	| j _dS )
zDo the build.

        The target can set build_mode to 'release' or 'debug' before calling
        this method.

        (:meth:`prepare_for_build` must have been call before.)
        Nrd   _build_donezcache.build_id0r*   zBuild the application #{}zPackage the applicationT)rX   re   rf   rS   rD   getrE   strrg   r)   build_applicationZbuild_packagerm   rk   r    r    r#   build   s    

zBuildozer.buildc                 C   sP   || j krd S tr8tt| }tdt|d|tf ntdt| | d S )Nr&   z# z{} {})	r@   	USE_COLOR	COLOR_SEQLOG_LEVELS_Cprintr   	RESET_SEQr)   LOG_LEVELS_T)rZ   levelmsgcolorr    r    r#   log   s    
zBuildozer.logc                 C   s   |  | j| d S r   )r|   DEBUGrZ   rz   r    r    r#   r8      s    zBuildozer.debugc              	   C   s:   |  |d | D ] \}}|  |d|t| qdS )z-dump env into debug logger in readable formatzENVIRONMENT:z    {} = {}N)r|   itemsr)   r   )rZ   ry   envkvr    r    r#   log_env   s    zBuildozer.log_envc                 C   s   |  | j| d S r   )r|   INFOr~   r    r    r#   rg      s    zBuildozer.infoc                 C   s   |  | j| d S r   )r|   ERRORr~   r    r    r#   error   s    zBuildozer.errorc                 C   s~   |  d| t|r t|S td dD ]2}tt||}t|r.|  d| |  S q.| d| td d S )NzSearch for {0}PATH:z -> found at {0}z {} not found, please install it.r*   )	r8   r)   r   r
   r   splitr   r   r   )rZ   rz   fndnrfnr    r    r#   checkbin   s    
zBuildozer.checkbinc                 K   s  t  }|| j  |d| |dt |dt |dd |d| jdk |d}|dd	}|d
d	}|dd}|dd	}|dd }	|dd	}
|
s|s| d| n<t	|t
tfr| d|d  n| d| d  | d|d tjdkr.|dd  t|f|}|j }|j }trt|tjt|tjtjB  t|tjt|tjtjB  |rg nd }|rg nd }|	r|	 rzt||gg g dd }W n tjk
r   Y qY nX ||kr@|j }|sq|r(|| |r@t|dd ||kr|j }|s^q|rn|| |rt|dd t  t  qz"|j |	r|	 sdnd d W n t!k
r   Y nX |j"dkrn|rn| d| | #| j$|d  | d | d | j| j%kr@| d | d n| d | d | d | d  t& |r~d!'|}|rd!'|}|r|dd"nd |r|dnd |j"fS )#Nr   r   r   	close_fdsTshow_outputr*   
get_stdoutF
get_stderrbreak_on_errorsensiblerun_conditionquietz	Run {0!r}zRun {0!r} ...r   Cwd {}cwdr'   r>   replace)timeoutzCommand failed: {0}r&   z,Buildozer failed to execute the last commandz<If the error is not obvious, please raise the log_level to 2zand retry the latest command.z5The error might be hidden in the log above this errorz2Please read the full log, and search for it beforez'raising an issue with buildozer itself.zAIn case of a bug report, please add a full log with log_level = 2r%   ignore)(r   r   r7   
setdefaultr   r@   popr8   r)   
isinstancelisttupler   ro   sysplatformr   r   filenor   fcntlZF_SETFLZF_GETFLos
O_NONBLOCKselectr   rP   appendwritedecodeflushcommunicater   
returncoder   r   r   r4   r   )rZ   commandkwargsr   r   r   r   r   r   r   r   processZ	fd_stdoutZ	fd_stderrZ
ret_stdoutZ
ret_stderrZreadxchunkr    r    r#   cmd   s    


  















zBuildozer.cmdc                 K   s   t  }|| j  |d| |d| jdk |dd}|d}|r`tdtj	|d< |sv| 
d| n| 
d	| d
  | 
d|d tjt|f|S )Nr   r   r*   r   Futf8logfilezRun (expect) {0!r}zRun (expect) {0!r} ...r   r   r   )r   r   r7   r   r@   r   codecs	getwriterr   bufferr8   r)   r   ro   pexpectZspawnushlexr   )rZ   r   r   r   r   r   r    r    r#   
cmd_expecth  s    
zBuildozer.cmd_expectc           
      C   sB  |  d |   | jj}g }|j}|ddds8|d |dddsL|d |ddd}|sf|d	 n|d
 tttdkr|d |ddd}|ddd}|s|s|d |r|r|d |r|ddds|d | jdddg}|D ]}|dkr|d| d q|r>| 	d
t| |D ]}	t|	 q&td dS )z+Ensure the spec file is 'correct'.
        zCheck configuration tokensapptitler&   z[app] "title" is missing
source.dirz[app] "source.dir" is missingpackage.namez[app] "package.name" is missingr   
   z1[app] "package.name" may not start with a number.r0   version.regexz5[app] One of "version" or "version.regex" must be setzK[app] Conflict between "version" and "version.regex", only one can be used.version.filenamez@[app] "version.filename" is missing, required by "version.regex"orientation	landscape)r   Zportraitzlandscape-reversezportrait-reversez[app] "z)" is not a valid  value for "orientation"z({0} error(s) found in the buildozer.specr*   N)rg   migrate_configuration_tokensrG   rM   r   maprp   rangerJ   r   r)   lenrv   r   )
rZ   ro   errorsZadderrorpackage_namer0   version_regexr   or   r    r    r#   rQ     sB    

z$Buildozer.check_configuration_tokensc                 C   sl   | j }|drhd}|D ]N\}}|d|s.q|d|}|d|| |d| | d|| qd S )Nr   ))zandroid.p4a_dirzp4a.source_dir)zandroid.p4a_whitelistzandroid.whitelist)zandroid.bootstrapzp4a.bootstrap)zandroid.branchz
p4a.branch)zandroid.p4a_whitelist_srczandroid.whitelist_src)zandroid.p4a_blacklist_srczandroid.blacklist_srcz1In section [app]: {} is deprecated, rename to {}!)rG   has_section
has_optionro   setremove_optionr   r)   )rZ   rG   Z	migrationZ	entry_oldZ	entry_newr=   r    r    r#   r     s    
 z&Buildozer.migrate_configuration_tokensc                 C   s   |  d t| js,td| j td | | j | | j | | j	 | | j
 | | j tt| j	d| _| j}|r| t| j|d | t| j	|d | t| j	|d dS )zZEnsure the build (local and global) directory layout and files are
        ready.
        zEnsure build layoutz/No {0} found in the current directory. Abandon.r*   zstate.dbr   r   N)rg   r   rC   rv   r)   r   mkdirglobal_buildozer_dirglobal_cache_dirbuildozer_dirrB   applibs_dirr   r   rD   rW   global_platform_dir)rZ   rX   r    r    r#   rb     s"    

zBuildozer.check_build_layoutc                    s   | j ddd}| j dkr&dS dd   fdd	|D }|r~ttd
r~| j}|d |d |d |d td t| j	r| j
dd|kr| d dS | | j	 | | j	 |D ]}| | q|| j
d< dS )zhEnsure the application requirements are all available and ready to be
        packaged as well.
        r   requirementsr&   TNc                 S   s   |  dd S )Nz==r   )r   r!   r    r    r#   r$     r%   z:Buildozer.check_application_requirements.<locals>.<lambda>c                    s   g | ]} |kr|qS r    r    .0r"   ZonlynameZtarget_available_packagesr    r#   
<listcomp>  s
      z<Buildozer.check_application_requirements.<locals>.<listcomp>real_prefixz8virtualenv is needed to install pure-Python modules, butz8virtualenv does not support nesting, and you are runningz3buildozer in one. Please run buildozer outside of azvirtualenv instead.r*   zcache.applibsz0Application requirements already installed, pass)rG   rJ   rX   Zget_available_packagesrf   r   r   r   r   r   rD   ro   r8   rmdirr    _install_application_requirement)rZ   r   erequirementr    r   r#   ri     s0    

z(Buildozer.check_application_requirementsc                 C   s@   |    | d| | jddd| j |g| j| jd d S )Nz$Install requirement {} in virtualenvpipinstallz	--target=)r   r   )_ensure_virtualenvr8   r)   r   r   env_venvr   )rZ   moduler    r    r#   r     s    z*Buildozer._install_application_requirementc                 C   s$   | j ddd}|r tdt d S )Nr   garden_requirementsr&   zH`garden_requirements` settings is deprecated, use `requirements` instead)rG   rJ   warningswarnDeprecationWarning)rZ   r   r    r    r#   rj     s     z#Buildozer.check_garden_requirementsc                 C   s   t | drd S t| jd| _| | js@| jddddg| jd | jdddgd	| jd
}t| j| _|d 	 D ]8}|
dd}t|dkrqp|\}}|dkrp|| j|< qpd| jkr| jd= d| jd< d| jd< d S )Nvenvpython3z-mz./venvr   Zbashz-czsource venv/bin/activate && envT)r   r   r   =r*   r6   )VIRTUAL_ENVr   Z
PYTHONHOMEz
/bin/falseCCCXX)rf   r   r   r   file_existsr   r   r   r   
splitlinesr   r   )rZ   outputlineargskeyr=   r    r    r#   r     s0    


zBuildozer._ensure_virtualenvc                 C   s(   t |rd S | d| t| d S )NzCreate directory {0})r   r8   r)   r   rZ   r   r    r    r#   r   /  s    zBuildozer.mkdirc                 C   s(   t |sd S | d| t| d S )Nz$Remove directory and subdirectory {})r   r8   r)   r   r   r    r    r#   r   5  s    zBuildozer.rmdirc                 C   s8   ddl m } g }|D ]}|t| }|| q|S )Nr   )glob)r   r   stripextend)rZ   patternsr   resultpatternmatchesr    r    r#   file_matches;  s    zBuildozer.file_matchesc                 G   s   t t| S r   )r   r   rZ   r   r    r    r#   r   C  s    zBuildozer.file_existsc                 C   s`   |rt ||}t ||}| d|| tjtj|sR| d||| t|| d S )NzRename {0} to {1}z6Rename {0} to {1} fails because {2} is not a directory)	r   r8   r)   r   pathisdirr	   r   r   rZ   sourcerX   r   r    r    r#   file_renameF  s    

  zBuildozer.file_renamec                 C   s8   |rt ||}t ||}| d|| t|| d S )NzCopy {0} to {1})r   r8   r)   r   r  r    r    r#   	file_copyP  s
    

zBuildozer.file_copyc                 C   s   | ds| dr,| jdd|g|d d S | ds@| drX| jdd|g|d d S | d	r| jd
d|g|d | jd| g|d d S | dr| jddt||g|d d S td|d S )Nz.tgzz.tar.gztarZxzfr   z.tbz2z.tar.bz2Zxjfz.binchmodza+xz./z.zipZunzipz-qz!Unhandled extraction for type {0})endswithr   r   rT   r)   )rZ   archiver   r    r    r#   file_extractW  s    

zBuildozer.file_extractc                 C   sv   t d|| tj|rhtj|s2t| t|}|D ]$}| tj||tj|| q@n
t	|| d S )Nzcopy {} to {})
rv   r)   r   r   r   r   r   file_copytreer   r   )rZ   srcdestfilesfr    r    r#   r
  m  s    

zBuildozer.file_copytreec                 C   s&   |  d t| jsd S t| j d S )Nz"Clean the platform build directory)rg   r   platform_dirr   rk   r    r    r#   clean_platformz  s    

zBuildozer.clean_platformc                 C   sP   dd }|| }|rt ||}| |r0t| | d| t||| |S )Nc                 S   sV   |dkrd | | }nd | | d t| }dtkrRtd | t  d S )Nr   z	{0} bytesz{0:.2f}%g      Y@CIz- Download {})r)   floatr   r   r   r   )indexZblksizesizeZprogressionr    r    r#   report_hook  s    z'Buildozer.download.<locals>.report_hookzDownloading {0})r   r   r   r8   r)   urlretrieve)rZ   urlr[   r   r  r    r    r#   download  s    


zBuildozer.downloadc              
   C   s   | j }|dd}|dd}|dd}|rJ|s6|r>td|ddS |sR|r|rb|sbtd|rr|srtd|dd}t|`}| }|dd}t||}	|	std|||	 d	 }
| 	d
|
 |
W  5 Q R  S Q R X tdd S )Nr   r0   r   r   z8version.regex and version.filename conflict with versionzversion.filename is missingzversion.regex is missingz:Unable to find capture version in {0}
 (looking for `{1}`)r   zCaptured version: {0}z3Missing version or version.regex + version.filename)
rG   r   rT   ro   openrP   r   r)   groupsr8   )rZ   chas_versionZ	has_regexZhas_filenamer   fddataregexmatchr0   r    r    r#   get_version  s>    

 zBuildozer.get_versionc                 C   s   |    |   |   d S r   )_copy_application_sources_copy_application_libs_add_sitecustomizerk   r    r    r#   rq     s    zBuildozer.build_applicationc                 C   s  t t| jddd}| jddd}| jddd}| jddd}| jddd}| jdd	d}| j}d
d |D }dd |D }dd |D }dd |D }dd |D }| d| t| j t	|ddD ]\}}	}
ddd |
tD krq|t|d d   }|r|d7 }d}|D ]2}|d dkrJ|d7 }||r0d} qdq0|s|D ]}t||rnd} qqn|D ]}t||rd} qq|rq|
D ] }|drАqd}| }|rt||}|D ]}t||rd} qq|D ]}t||rd} q0q|r:qt|\}}|r|dd   }|rp||krpq|r||krqt||}t t||t|d d  |}t|}| | | d| t|| qqd S )Nr   r   .zsource.include_extsr&   zsource.exclude_extszsource.exclude_dirszsource.exclude_patternszsource.include_patternsc                 S   s   g | ]}|  qS r    lowerr   extr    r    r#   r     s     z7Buildozer._copy_application_sources.<locals>.<listcomp>c                 S   s   g | ]}|  qS r    r&  r(  r    r    r#   r     s     c                 S   s   g | ]}|  qS r    r&  )r   dirr    r    r#   r     s     c                 S   s   g | ]}|  qS r    r&  r   patr    r    r#   r     s     c                 S   s   g | ]}|  qS r    r&  r+  r    r    r#   r     s     zCopy application source from {}T)followlinksc                 S   s   g | ]}| d qS )r%  
startswithr   r    r    r#   r     s     r*   /FzCopy {0})r
   r   rG   rM   rJ   app_dirr8   r)   r   r   r   r   r   r'  r/  r   r   r   r	   r   r   )rZ   
source_dirZinclude_extsZexclude_extsZexclude_dirsZexclude_patternsZinclude_patternsr2  rootdirsr  Zfiltered_rootZis_excludedZexclude_dirr   r   dfnbasenamer)  sfnr   r    r    r#   r"    s    








 
z#Buildozer._copy_application_sourcesc                 C   s   t | jt| jd d S )NZ_applibs)r   r   r   r2  rk   r    r    r#   r#  !  s    z Buildozer._copy_application_libsc              	   C   s   t tttdt| jd t| jdd}| |s8d S d}t|d}| }W 5 Q R X || }t|d}|| W 5 Q R X | 	d d S )Nzsitecustomize.pyZservicezmain.pysS   import sys, os; sys.path = [os.path.join(os.getcwd(),"..", "_applibs")] + sys.path
rbwbz*Patched service/main.py to include applibs)
r   r   r	   __file__r2  r   r  rP   r   rg   )rZ   Zmain_pyheaderr  r  r    r    r#   r$  %  s    

zBuildozer._add_sitecustomizec                 C   s   t dd|S )zvReturn a "valid" name from a name with lot of invalid chars
        (allowed characters: a-z, A-Z, 0-9, -, _)
        z[^a-zA-Z0-9_\-]_)resub)rZ   namer    r    r#   namify7  s    zBuildozer.namifyc                 C   s   t tt| jS r   )r
   r   r	   rC   rk   r    r    r#   rV   =  s    zBuildozer.root_dirc                 C   sR   | j ddd}|dk	r"t|d}| j dd|}|dk	rNtt| jt|}|S )z$The user-provided build dir, if any.r?   ZbuilddirN
.buildozer	build_dir)rG   rM   r   r
   rV   r   )rZ   rC  r    r    r#   user_build_dirA  s    
zBuildozer.user_build_dirc                 C   s   | j dk	r| j S t| jdS )z,The directory in which to run the app build.NrB  )rD  r   rV   rk   r    r    r#   r   Q  s    
zBuildozer.buildozer_dirc                 C   s   | j r| j S t| jdS )Nbin)rU   r   rV   rk   r    r    r#   rB   X  s    zBuildozer.bin_dirc                 C   s   t | j| jdS Nr   r   r   rW   rk   r    r    r#   r  ^  s    zBuildozer.platform_dirc                 C   s   t | j| jdS )Nr   rG  rk   r    r    r#   r2  b  s    zBuildozer.app_dirc                 C   s   t | jdS )NZapplibs)r   r   rk   r    r    r#   r   f  s    zBuildozer.applibs_dirc                 C   s   t tddS )N~rB  )r   r   rk   r    r    r#   r   j  s    zBuildozer.global_buildozer_dirc                 C   s   t | j| jdS rF  r   r   rW   rk   r    r    r#   r   n  s    zBuildozer.global_platform_dirc                 C   s   t | j| jdS )NpackagesrI  rk   r    r    r#   global_packages_dirr  s    zBuildozer.global_packages_dirc                 C   s   t | jdS )Ncache)r   r   rk   r    r    r#   r   v  s    zBuildozer.global_cache_dirc                 C   s8   | j ddd}| j ddd}|dkr,|S d||S )Nr   r   r&   zpackage.domainz{}.{})rG   rM   r)   )rZ   r   Zpackage_domainr    r    r#   package_full_namez  s
    zBuildozer.package_full_namec              	   c   s   t tttdD ]v}|ds|dr,q|ds8q|d d }z"td|dgd}||fV  W q tk
rz   Y q    Y qX qd S )	Ntargetsr%  __z.pyr]   r?   r^   )	r   r   r	   r;  r/  r  r`   r)   NotImplementedError)rZ   r   rX   rc   r    r    r#   rN    s     

zBuildozer.targetsc              	   C   s  t d t d t d t d t d t|  }|D ]L\}}z|j  d  }W n tk
rr   d}Y nX t d|| q8t d t d	 d
d t| D }|D ]L}|dd  }t	| |}|jsqt|j  d  }t d|| qt d t d t d t d t d t d t d t d t d |D ]\}}|
| }	|	 }
|
sjqFt d t d| |
D ]>\}}|sqtjt| ddd}t d|| qqFt d d S )NzUsage:zB    buildozer [--profile <name>] [--verbose] [target] <command>...z    buildozer --versionr&   zAvailable targets:r   z<no description>z  {0:<18} {1}z!Global commands (without target):c                 S   s   g | ]}| d r|qS )Zcmd_r.  r   r    r    r#   r     s     
 z#Buildozer.usage.<locals>.<listcomp>r+   zTarget commands:z)  clean      Clean the target environmentz+  update     Update the target dependenciesz0  debug      Build the application in debug modez2  release    Build the application in release modez1  deploy     Deploy the application on the devicez.  run        Run the application on the devicez9  serve      Serve the bin directory via SimpleHTTPServerzTarget "{0}" commands:;   z                     )subsequent_indent)rv   r   rN  r3   r   r   rT   r)   r*  getattrra   Zget_custom_commandstextwrapfilldedent)rZ   rN  rX   rc   docZcmdsr   r@  methmtcommandsr   r    r    r#   usage  s\    


zBuildozer.usagec                 C   sJ   |    d| jkr2td td td td | jd }| | d S )Nbuildozer:defaultcommandzNo default command set.z,Use "buildozer setdefault <command args...>"z0Use "buildozer help" for a list of all commands"r*   )rb   rD   rv   r   run_command)rZ   r   r    r    r#   run_default  s    

zBuildozer.run_defaultc                 C   s&  |r~|d  dsq~|d}|dkr.d| _q |dkrH|   td q |dkr^|d| _q |dkr tdt td q | 	  | 
  |s|   d S |d |d	d   }}d
|}t| |rt| ||  d S dd |  D }||krtd| td	 | | | j| d S )Nr   -)z-vz	--verboser6   )z-hz--help)z-pz	--profilez	--versionBuildozer {0}r*   zcmd_{0}c                 S   s   g | ]}|d  qS )r   r    r   r    r    r#   r     s     z)Buildozer.run_command.<locals>.<listcomp>zUnknown command/target {})r/  r   r@   r\  r   rF   rv   r)   __version___merge_config_profile
check_rootr_  rf   rT  rN  rY   rX   run_commands)rZ   r   argr   r   rN  r    r    r#   r^    s<    






zBuildozer.run_commandc                 C   s   | j ddd}zt dk}W n6 tk
rV   tjdkrBddl}|jj	
 dk}Y nX |dkr|rtd td d}|d	krtd
}qx|dkrt  dS )zfIf effective user id is 0, display a warning and require
        user input to continue (or to cancel)r?   warn_on_root1r   r'   Nz*[91m[1mBuildozer is running as root![0mzN[91mThis is [1mnot[0m [91mrecommended, and may lead to problems later.[0m)ynz)Are you sure you want to continue [y/n]? rj  )rG   rM   r   geteuidAttributeErrorr   r   ctypeswindllshell32ZIsUserAnAdminrv   inputr   )rZ   rg  Zeuidrm  Zcontr    r    r#   rd    s    

zBuildozer.check_rootc                 G   s8   t drtd td ttttdd td dS )zACreate a initial buildozer.spec in the current directory
        r;   z.ERROR: You already have a buildozer.spec file.r*   zdefault.specz0File buildozer.spec created, ready to customize!N)r   rv   r   r   r   r	   r;  r   r    r    r#   cmd_init  s
    zBuildozer.cmd_initc                 G   sD   t d tj  d dkr@| d t| js6dS t| j dS )z/Clean the whole Buildozer environment.
        zUWarning: Your ndk, sdk and all other cached packages will be removed. Continue? (y/n)r   ri  z Clean the global build directoryN)	rv   r   stdinreadliner'  rg   r   r   r   r   r    r    r#   cmd_distclean   s    

zBuildozer.cmd_distcleanc                 G   s\   | j dk	r| d| j  n:t| jrF| d| j t| j n| d| j dS )zClean the .buildozer folder in the app directory.

        This command specifically refuses to delete files in a
        user-specified build directory, to avoid accidentally deleting
        more than the user intends.
        NzFailed: build_dir is specified as {} in the buildozer config. `appclean` will not attempt to delete files in a user-specified build directory.zDeleting {}z{} already deleted, skipping.)rD  r   r)   r   r   rg   r   r   r    r    r#   cmd_appclean+  s    

zBuildozer.cmd_appcleanc                 G   s   |    dS )z!Show the Buildozer help.
        N)r\  r   r    r    r#   cmd_help<  s    zBuildozer.cmd_helpc                 G   s   |    || jd< dS )zCSet the default command to run when no arguments are given
        r]  N)rb   rD   r   r    r    r#   cmd_setdefaultA  s    zBuildozer.cmd_setdefaultc                 G   s   t dt dS )z#Show the Buildozer version
        ra  N)rv   r)   rb  r   r    r    r#   cmd_versionG  s    zBuildozer.cmd_versionc                 G   s   zddl m} ddlm} W n, tk
rH   ddlm} ddlm} Y nX t| j	 |}|dt
f|}tdt
 td |  dS )z5Serve the bin directory via SimpleHTTPServer
        r   )SimpleHTTPRequestHandler)	TCPServerr&   zServing via HTTP at port {}zPress Ctrl+c to quit serving.N)Zhttp.serverry  socketserverrz  ImportErrorSimpleHTTPServerSocketServerr   chdirrB   SIMPLE_HTTP_SERVER_PORTrv   r)   serve_forever)rZ   r   ry  rz  handlerZhttpdr    r    r#   	cmd_serveL  s    zBuildozer.cmd_servec              	   C   s   | j }|sd S | j D ]}|dd}t|dk r6q|\}}|d}||krRq| j|sj| j| | j|D ],\}}td	|||| | j
||| qvqd S )N@r*   r6   ,z'merged ({}, {}) into {} (profile is {}))rF   rG   sectionsr   r   r   add_sectionr   rv   r)   r   )rZ   ZprofilesectionpartsZsection_baseZsection_profilesr@  r=   r    r    r#   rc  a  s(    
  zBuildozer._merge_config_profilec                 O   s   d|d< | j ||S )NTwith_values)rI   )rZ   r   r   r    r    r#   rK   }  s    z!Buildozer._get_config_list_valuesFc                    s   t ||j d|| j rXj }|rJ fdd|D S dd |D S j||d}|sp|S |d}|s|S dd |D S )N{}:{}c              	      s"   g | ]}d  |j |qS )z{}={})r)   rG   ro   )r   r   	l_sectionrZ   r    r#   r     s   z.Buildozer._get_config_list.<locals>.<listcomp>c                 S   s   g | ]}|  qS r    r   r   r    r    r#   r     s     r&   r  c                 S   s   g | ]}|  qS r    r  r   r    r    r#   r     s     )set_config_token_from_envrG   r)   r   optionsrM   r   )rZ   r  tokendefaultr  valuesr    r  r#   rI     s     
zBuildozer._get_config_listc                 C   s>   t ||| j | j|s|S | j||s0|S | j||S r   )r  rG   r   r   ro   rZ   r  r  r  r    r    r#   rL     s    zBuildozer._get_config_defaultc                 C   s>   t ||| j | j|s|S | j||s0|S | j||S r   )r  rG   r   r   
getbooleanr  r    r    r#   rN     s    zBuildozer._get_config_boolr    c                    s^   d ||}| j|r2 fdd| j|D S | j||sJ||S | j|||S )Nr  c                    s   g | ]}  |qS r    )r   )r   itemsection_sepr    r#   r     s     z5Buildozer._get_config_raw_default.<locals>.<listcomp>)r)   rG   r   r   r   r   ro   )rZ   r  r  r  r  Z
split_charr  r    r  r#   rO     s    
z!Buildozer._get_config_raw_default)r;   N)N)N)N)N)NF)N)F)Nr   r  )Ir-   r.   r/   r   r   r}   Zstandard_cmdsr\   rY   rl   rr   r|   r8   r   rg   r   r   r   r   rQ   r   rb   ri   r   rj   r   r   r   r   r   r  r  r	  r
  r  r  r!  rq   r"  r#  r$  rA  propertyrV   rD  r   rB   r  r2  r   r   r   rK  r   rM  rN  r\  r_  r^  rd  rq  rt  ru  rv  rw  rx  r  rc  rK   rI   rL   rN   rO   r    r    r    r#   r5   f   s   
&
	h)*	




#d











4
-	


r5   c                 C   s.   |   D ] }| |D ]}t|||  qqdS )zTakes a ConfigParser, and checks every section/token for an
    environment variable of the form SECTION_TOKEN, with any dots
    replaced by underscores. If the variable exists, sets the config
    variable to the env value.
    N)r  r  r  )rG   r  r  r    r    r#   rR     s    rR   c                 C   sJ   d |  d| ddg}tj|}|dkr8dS || || dS )au  Given a config section and token, checks for an appropriate
    environment variable. If the variable exists, sets the config entry to
    its value.

    The environment variable checked is of the form SECTION_TOKEN, all
    upper case, with any dots replaced by underscores.

    Returns True if the environment variable exists and was used, or
    False otherwise.

    r&   r=  r%  NFT)r   upperr   r   r   ro   r   )r  r  rG   Zenv_var_nameenv_varr    r    r#   r    s    r  )Nr3   rb  r   r>  r   r   r   rU  r   Zbuildozer.jsonstorer   r   r   r   r   os.pathr   r   r	   r
   r   r   
subprocessr   r   r   r   r   r   r   r   r   r   shutilr   r   r   r   r   pprintr   r   r   urllib.requestr   configparserr   r   r|  coloramainitForeRESETStyle	RESET_ALLrw   rt   ZBOLD_SEQr   BLACKDIMBRIGHTREDCYANBLUErs   ru   rx   r  r,   retriever  rT   r1   r4   r5   rR   r  r    r    r    r#   <module>   s     



	        `