U
    ØZßfÍ  ã                   @   sž   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Zd dlZddl	m
Z
mZmZ e e¡Zejddd G dd„ dƒZG d	d
„ d
eƒZdd„ ZdS )é    Né   )Úrun_command_with_processÚcompute_hashÚjobz3%(asctime)s,%(msecs)03d %(levelname)s - %(message)sz%H:%M:%S)ÚfmtÚdatefmtc                   @   s˜   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZed	ƒd
d„ ƒZ	edƒdd„ ƒZ
edƒdd„ ƒZedƒddd„ƒZedƒdd„ ƒZedƒddd„ƒZdS )ÚBuildProcessc                 C   sr   t | _ || _|  | jd¡| _|| _|  | jd¡| _|  | jd¡| _|  | jd¡| _| j| jd | j	| jf| _
d S )NÚbuildZnode_moduleszpackage-lock.jsonzpackage.json©Úpath)ÚloggerÚmainÚ_concatÚbuild_folderÚ	deps_infoÚnpm_modulesÚpackage_lockÚpackageÚ_parse_packageÚdeps_folderÚasset_paths)Úselfr   r   © r   úB/tmp/pip-unpacked-wheel-47crqvv_/dash/development/build_process.pyÚ__init__   s    zBuildProcess.__init__c              	   C   sZ   t |dddB}t |¡}|d | _|d | _|  | jtjd¡| _	|d | _
W 5 Q R X d S )NÚrúutf-8©ÚencodingÚversionÚnameÚdepsZdependencies)ÚopenÚjsonÚloadr   r    r   r   ÚosÚpardirr   r!   )r   r   Úfpr   r   r   r   r      s    


zBuildProcess._parse_packagec                  G   s    t j t jj dd„ | D ƒ¡¡S )Nc                 s   s   | ]}|r|V  qd S ©Nr   )Ú.0r   r   r   r   Ú	<genexpr>)   s      z'BuildProcess._concat.<locals>.<genexpr>)r%   r   ÚrealpathÚsepÚjoin)Úpathsr   r   r   r   '   s    zBuildProcess._concatc                 C   sz   t j | ¡rjt d| ¡ z0t j | ¡r0t  | ¡ t j | ¡rFt 	| ¡ W qv t
k
rf   t d¡ Y qvX nt d| ¡ d S )Nu"   ðŸš¨ %s already exists, remove it!é   u&   ðŸš¨ %s doesn't exist, no action taken)r%   r   Úexistsr   ÚwarningÚisfileÚremoveÚisdirÚshutilÚrmtreeÚOSErrorÚsysÚexitr
   r   r   r   Ú_clean_path+   s    
zBuildProcess._clean_pathz5clean all the previous assets generated by build toolc                 C   s   | j D ]}|  |¡ qd S r(   )r   r:   )r   r   r   r   r   Úclean9   s    
zBuildProcess.cleanzrun `npm ci`c                 C   s   t  | j¡ tdƒ dS )zJob to install npm packages.znpm ciN)r%   Úchdirr   r   ©r   r   r   r   Únpm>   s    zBuildProcess.npmzbuild the renderer in dev modec                 C   s   t  | j¡ t  d¡ d S )Nznpm run build:dev)r%   r<   r   Úsystemr=   r   r   r   ÚwatchD   s    zBuildProcess.watchz*run the whole building process in sequenceNc                 C   s&   |   ¡  |  ¡  |  |¡ |  ¡  d S r(   )r;   r>   ÚbundlesÚdigest)r   r	   r   r   r   r	   I   s    
zBuildProcess.buildz"compute the hash digest for assetsc              	   C   s
  t j | j¡sLzt  | j¡ W n, tk
rJ   t d| j¡ t 	d¡ Y nX | j
| ji}| j| jfD ]P}tdd„ t  |¡D ƒƒ}t d||¡ |D ] }t|  ||¡ƒ|d|› d< q’qdt|  | jd¡d	d
d}tj||dddd W 5 Q R X t dtj|ddd¡ d S )Nõ"   ðŸš¨ having issues manipulating %sr/   c                 s   s&   | ]}t j |¡d  dkr|V  qdS )éÿÿÿÿ>   ú.mapú.jsN)r%   r   Úsplitext)r)   Ú_r   r   r   r*   \   s   þz&BuildProcess.digest.<locals>.<genexpr>zbundles in %s %szSHA256 (ú)zdigest.jsonÚwr   r   Té   )ú,ú:)Ú	sort_keysÚindentÚ
separatorsz bundle digest in digest.json:
%s)rN   rO   )r%   r   r0   r   Úmakedirsr7   r   Ú	exceptionr8   r9   r    r   r   ÚtupleÚlistdirÚinfor   r   r"   r   r#   ÚdumpÚdumps)r   ÚpayloadÚfolderZcopiesÚcopyr'   r   r   r   rB   P   s(    þ þzBuildProcess.digestzcopy and generate the bundlesc                 C   s~  t j | j¡sLzt  | j¡ W n, tk
rJ   t d| j¡ t 	d¡ Y nX |  
| j¡ t| ddd„ ƒƒ  | j| j dd¡ dd¡d	œ}| jD ]:\}}}}}| jd
 td ||gƒ¡ d }| dd¡ dd¡}	|||	< t d|¡ d| d¡krödnd}
|› d|› d|
› }t |  | j||||¡|  | j|¡¡ |rŽd |¡}d|› d|d|	› d< |D ]j}d|› d|› d|› }t |¡}|› d|› d|
› }|  | j|¡}t|dƒ}| |j¡ W 5 Q R X q^qŽ|dkrÚdnd}t d|¡ t  | j ¡ t!d|› ƒ t d¡ t|  | j d ¡d!d"}t" #| $¡ ¡}W 5 Q R X |  | jt j%d#¡}t|d$d!d"}| | &|¡¡ W 5 Q R X d S )%NrC   r/   Z_bundles_extrac                   S   s   d S r(   r   r   r   r   r   Ú<lambda>x   ó    z&BuildProcess.bundles.<locals>.<lambda>ú rH   ú-)r   r   ú/r   Ú Ú.zcopy npm dependency => %sÚminzmin.jsZjsú@z", "ú"Zextra_Z	_versionszhttps://unpkg.com/z/umd/ÚwbÚlocalz	build:devzbuild:jszrun `npm run %s`znpm run z5generate the `__init__.py` from template and versionszinit.templater   r   z_dash_renderer.pyrJ   )'r%   r   r0   r   rQ   r7   r   rR   r8   r9   r   r   Úgetattrr   r    Úreplacer   r!   r-   ÚfilterrU   Úsplitr5   Úcopyfiler   r   ÚrequestsÚgetr"   ÚwriteÚcontentr<   r   r   ÚstringÚTemplateÚreadr&   Úsafe_substitute)r   r	   ÚversionsZscoper    Z	subfolderÚfilenameÚextrasr   Zname_squashedÚextÚtargetZ
extras_strZextra_versionÚurlÚresZextra_targetÚ
extra_pathr'   Ú_scriptÚtZrenderer_initr   r   r   rA   m   sT    þþ


zBuildProcess.bundles)N)N)Ú__name__Ú
__module__Ú__qualname__r   r   Ústaticmethodr   r:   r   r;   r>   r@   r	   rB   rA   r   r   r   r   r      s$   





r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚRendererc                    sb   dg}t ƒ  |  tj t¡tjd¡ddddd|fdddd|fdd	dd
|fdd	dd|fddf¡ dS )z?dash-renderer's path is binding with the dash folder hierarchy.z18.2.0zdash-renderer)z@babelZpolyfillÚdistzpolyfill.min.jsNNZreactZumdzreact.production.min.jszreact.development.jsz	react-domzreact-dom.production.min.jszreact-dom.development.js)Nú
prop-typesNzprop-types.min.jsN)Nr„   Nzprop-types.jsN)Úsuperr   r   r%   r   ÚdirnameÚ__file__r&   )r   rv   ©Ú	__class__r   r   r   ¨   s    ùþzRenderer.__init__)r~   r   r€   r   Ú__classcell__r   r   rˆ   r   r‚   §   s   r‚   c                   C   s   t  t¡ d S r(   )ÚfireZFirer‚   r   r   r   r   Úrenderer¹   s    rŒ   )r%   r8   r#   rp   r5   ÚloggingZcoloredlogsr‹   rl   Ú_utilsr   r   r   Ú	getLoggerr~   r   Úinstallr   r‚   rŒ   r   r   r   r   Ú<module>   s$   
 ÿ 