U
    ZfB                     @   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m	Z	 ddl
mZ dZdZdZdZd	Zd
ZdZdddZdZdZdddgZ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d'd( Z d)d* Z!d+d, Z"d-d. Z#d/d0 Z$d1d2 Z%d3d4 Z&d5d6 Z'd7d8 Z(d9d: Z)dS )<    N   )julia_keywords)reorder_propsz$03207cf0-e2b3-4b91-9ca8-690cf0fb507ez$1b08a953-4be3-4667-9a23-3db579824955ak  
export {funcname}

"""
    {funcname}(;kwargs...){children_signatures}

{docstring}
"""
function {funcname}(; kwargs...)
        available_props = Symbol[{component_props}]
        wild_props = Symbol[{wildcard_symbols}]
        return Component("{funcname}", "{element_name}", "{module_name}", available_props, wild_props; kwargs...)
end
{children_definitions}
z\
    {funcname}(children::Any;kwargs...)
    {funcname}(children_maker::Function;kwargs...)
z
{funcname}(children::Any; kwargs...) = {funcname}(;kwargs..., children = children)
{funcname}(children_maker::Function; kwargs...) = {funcname}(children_maker(); kwargs...)
a  
module {package_name}
using {base_package}

const resources_path = realpath(joinpath( @__DIR__, "..", "deps"))
const version = "{version}"

{component_includes}

function __init__()
    DashBase.register_package(
        DashBase.ResourcePkg(
            "{project_shortname}",
            resources_path,
            version = version,
            [
                {resources_dist}
            ]
        )

    )
end
end
z
name = "{package_name}"
uuid = "{package_uuid}"
{authors}version = "{version}"

[deps]
{base_package} = "{dash_uuid}"

[compat]
julia = "1.2"
{base_package} = "{base_version}"
z
0.1.3, 1.0z0.1)DashDashBasezinclude("jl/{name}.jl")zDashBase.Resource(
    relative_package_path = {relative_package_path},
    external_url = {external_url},
    dynamic = {dynamic},
    async = {async_string},
    type = :{type}
)Zdash_html_componentsZdash_core_componentsZ
dash_tablec                 C   s   |  d}ddd |D S )N_ c                 s   s   | ]}|  V  qd S N)
capitalize).0w r   N/tmp/pip-unpacked-wheel-47crqvv_/dash/development/_jl_components_generation.py	<genexpr>k   s     z"jl_package_name.<locals>.<genexpr>)splitjoin)Z
namestringsr   r   r   jl_package_namei   s    
r   Fc                 C   s2   |rd dd | D }nd dd | D }|S )N|c                 s   s   | ]}d  |V  qdS )z{}-Nformatr   itemr   r   r   r   p   s     z&stringify_wildcards.<locals>.<genexpr>, c                 s   s   | ]}d  |V  qdS )zSymbol("{}-")Nr   r   r   r   r   r   r   s     )r   )wclist	no_symbolZwcstringr   r   r   stringify_wildcardsn   s    r   c                 C   s   dd | D S )Nc                 S   s"   g | ]}| d r|d dqS )-*r   )endswithreplace)r   keyr   r   r   
<listcomp>w   s     
 z$get_wildcards_jl.<locals>.<listcomp>r   propsr   r   r   get_wildcards_jlv   s    r$   c                    sp    fdd}t dd dd dd dd dd d	d d
d dd  fdd fdd fdd fdd||dS )z<Mapping from the PropTypes js type object to the Julia type.c                
      s>   d ddd  d D d ddd  d  D S )	Nz lists containing elements {}.
{}r   c                 s   s   | ]}d  |V  qdS )z'{}'Nr   r   tr   r   r   r      s     z<get_jl_prop_types.<locals>.shape_or_exact.<locals>.<genexpr>valuez+Those elements have the following types:
{}
c              	   s   s0   | ](\}}t |||d  |ddddV  qdS )requireddescriptionr   r   	prop_nametype_objectr)   r*   
indent_numN)create_prop_docstring_jlget)r   r,   propr   r   r   r      s   
)r   r   itemsr   r-   r   r   shape_or_exact}   s    

z)get_jl_prop_types.<locals>.shape_or_exactc                   S   s   dS )NArrayr   r   r   r   r   <lambda>       z#get_jl_prop_types.<locals>.<lambda>c                   S   s   dS )NZBoolr   r   r   r   r   r6      r7   c                   S   s   dS )NRealr   r   r   r   r   r6      r7   c                   S   s   dS )NStringr   r   r   r   r   r6      r7   c                   S   s   dS )NDictr   r   r   r   r   r6      r7   c                   S   s   dS )Nz#Bool | Real | String | Dict | Arrayr   r   r   r   r   r6      r7   c                   S   s   dS )Nzdash componentr   r   r   r   r   r6      r7   c                   S   s   dS )Nz8a list of or a singular dash component, string or numberr   r   r   r   r   r6      r7   c                      s   d ddd  d D S )Nza value equal to: {}r   c                 s   s    | ]}d  t|d V  qdS ){}r'   N)r   strr%   r   r   r   r      s     6get_jl_prop_types.<locals>.<lambda>.<locals>.<genexpr>r'   r   r   r   r3   r   r   r6      s   c                      s   d ddd  d D S )Nr;   z | c                 s   s(   | ] }t |d krdt |V  qdS )r   r;   Nget_jl_typer   )r   ZsubTyper   r   r   r      s   r=   r'   r>   r   r3   r   r   r6      s   
c                      s*   dt  d dkr$dt  d nd S )Nr5   r'   r   z of {}sr?   r   r3   r   r   r6      s
    c                      s   d t d S )Nz/Dict with Strings as keys and values of type {}r'   )r   r@   r   r3   r   r   r6      s   
)arrayboolnumberstringobjectanyelementnodeenumunionZarrayOfZobjectOfshapeexact)dict)r-   r4   r   r3   r   get_jl_prop_typesz   s"    


	
rN   c                 C   s   t | }t| D ]\}}d|kr:d|kr:|| qd|krb|d d }|dkr|| qd|kr|d d }|dkrd|d ks|d d dkr|| qtq|S )a  Filter props from the Component arguments to exclude:
        - Those without a "type" or a "flowType" field
        - Those with arg.type.name in {'func', 'symbol', 'instanceOf'}
    Parameters
    ----------
    props: dict
        Dictionary with {propName: propMetadata} structure
    Returns
    -------
    dict
        Filtered dictionary with {propName: propMetadata} structure
    typeflowTypename>   
instanceOfsymbolfunc	signaturerE   )copydeepcopylistr2   pop
ValueError)r#   filtered_propsZarg_nameargZarg_typeZarg_type_namer   r   r   filter_props   s     

r]   c                 C   s,   | d }t | d}||kr(||  }|S dS )z
    Convert JS types to Julia types for the component definition
    Parameters
    ----------
    type_object: dict
        react-docgen-generated prop type dictionary
    Returns
    -------
    str
        Julia type string
    rQ   r3   r   )rN   )r-   Zjs_type_nameZjs_to_jl_typesZ	prop_typer   r   r   r@      s    

r@   c                 C   s   t |  }|r|d7 }|S )Nz. )r@   r
   )ZtypedataZ
typestringr   r   r   print_jl_type   s    r^   c              	   C   sH   t |d}dj| d  dkr"dnd| |ddd	 t| D d
S )a5  Create the Dash component docstring.
    Parameters
    ----------
    component_name: str
        Component name
    props: dict
        Dictionary with {propName: propMetadata} structure
    description: str
        Component description
    Returns
    -------
    str
        Dash component docstring
    r"   z>A{n} {name} component.
{description}
Keyword arguments:
{args}r   Zaeiounr   r(   c                 s   s@   | ]8\}}t |d |kr|d  n|d |d |d ddV  qdS )rO   rP   r)   r*   r   r+   N)r/   )r   pr1   r   r   r   r     s   z&create_docstring_jl.<locals>.<genexpr>)r_   rQ   r*   args)r   r   lowerr   r]   r2   Zcomponent_namer#   r*   r   r   r   create_docstring_jl   s    


rd   c                 C   sr   t |d}d| }d|kr6dj|| |||r.dnddS dj|| |rLd	|nd
|d
kr`d|nd
|rjdnddS )aS  
    Create the Dash component prop docstring
    Parameters
    ----------
    prop_name: str
        Name of the Dash component prop
    type_object: dict
        react-docgen-generated prop type dictionary
    required: bool
        Component is required?
    description: str
        Dash component description
    indent_num: int
        Number of indents to use for the context block
        (creates 2 spaces for every indent)
    is_flow_type: bool
        Does the prop use Flow types? Otherwise, uses PropTypes
    Returns
    -------
    str
        Dash component prop docstring
    r3   z  r(   z`{indent_spacing}- `{name}` ({is_required}): {description}. {name} has the following type: {type}r)   optional)indent_spacingrQ   rO   r*   Zis_requiredz={indent_spacing}- `{name}` ({type}{is_required}){description}z{}; r   z: {}r?   )r,   r-   r)   r*   r.   Zjl_type_namerf   r   r   r   r/     s$    



r/   c                 C   s   | rd | | S | S )Nz{}_{})r   rb   )prefixrQ   r   r   r   format_fn_nameS  s    rh   c                    s   dd  fdd| D S )Nc                 S   s   | rd | S dS )Nz"{}"nothingr   )vr   r   r   nothing_or_stringZ  s    z4generate_metadata_strings.<locals>.nothing_or_stringc                    sl   g | ]d}t j|d d|ddt|dd  d| kr`dt|d nddqS )relative_package_pathr   external_urldynamicri   async:{})rl   rm   rn   rO   Zasync_string)jl_resource_tuple_stringr   r0   r<   rb   keys)r   resourcemetatyperk   r   r   r!   ]  s   

z-generate_metadata_strings.<locals>.<listcomp>r   )	resourcesru   r   rt   r   generate_metadata_stringsY  s    rw   c                 C   s   | t kS r	   )core_packagesproject_shortnamer   r   r   is_core_packagem  s    r{   c                 C   s   t | rdS dS )Nr   r   )r{   ry   r   r   r   base_package_nameq  s    r|   c                 C   s   t | rtS tS r	   )r{   jl_dash_base_uuidjl_dash_uuidry   r   r   r   base_package_uidu  s    r   c              	      s   t | }tjdt  t| }t|dg }t|dg }|	d}d
t|dt|d }	tj|d
 fd	d
|D |	|| t| d}
tj
d|d }t|ddd}||
 W 5 Q R X td| d S )Nr   Z_js_distZ	_css_distversionz,
Zjscssr(   c                    s   g | ]}t jt |d qS ))rQ   )jl_component_include_stringr   rh   )r   Z	comp_namerg   r   r   r!     s   z)generate_package_file.<locals>.<listcomp>)package_nameZcomponent_includesresources_distr   rz   base_packagesrc.jlr   utf-8encodingGenerated {})r   syspathinsertosgetcwd	importlibimport_modulegetattrr0   r   rw   jl_package_file_stringr   r|   openwriteprint)rz   
componentspkg_datarg   r   modZjs_distZcss_distproject_verr   Zpackage_string	file_pathfr   r   r   generate_package_filey  s6    


r   c              	   C   s   | dd}| d}t| }tt}tj|jd d t|d	 dd   d}|rhd
|nd}t| }tj
|||||t| t| d}	d	}
t|
d
dd}||	 W 5 Q R X td
|
 d S )Nauthorr   r   ir   )hexzauthors = ["{}"]
)r   package_uuidr   Zauthorsr   base_versionZ	dash_uuidzProject.tomlr   r   r   )r0   r   uuidUUIDr~   r   hashlibsha256encode	hexdigestr   r|   jl_projecttoml_stringjl_base_versionr   r   r   r   )rz   r   Zpackage_authorr   r   ur   Zauthors_stringr   Ztoml_stringr   r   r   r   r   generate_toml_file  s.    

(	r   c                 C   s  t t|}t| }t| ||ddddd}t|}d}	|d d  D ]F}
|
dsd|
dkrp||
 qN|
t	krN||
 t
d	|
|  qN|	d
dd |D 7 }	d|k}t|| }|rtj|dnd}|rtj|dnd}tjt|| ||	t|ddt|dd| |||d	S )Nrc   z
r(   $z\$r   r   ZsetPropszZWARNING: prop "{}" in component "{}" is a Julia keyword - REMOVED FROM THE JULIA COMPONENTr   c                 s   s   | ]}d  |V  qdS )rp   Nr   )r   r`   r   r   r   r     s     z(generate_class_string.<locals>.<genexpr>children)funcnameF)r   T)	r   	docstringZcomponent_propsZwildcard_symbolsZwildcard_namesZelement_namemodule_namechildren_signatureschildren_definitions)r   r]   rX   rr   rd   r   r$   r   remover   warningswarnr   r   rh   jl_children_signaturesjl_children_definitionsjl_component_stringr   )rQ   r#   r*   rz   rg   r[   Z	prop_keysr   r   Zdefault_paramtextr   Zhas_childrenr   r   r   r   r   r   generate_class_string  s\        
 


r   c           
   	   C   s   t |d}d}t| ||||}t|| d }tjdsBtd tjdd|}t|ddd	}	|		| |		| W 5 Q R X t
d
| d S )Nr"   z$# AUTO GENERATED FILE - DO NOT EDIT
r   zsrc/jlr   Zjlr   r   r   r   )r   r   rh   r   r   existsmakedirsr   r   r   r   r   )
rQ   r#   r*   rz   rg   Zimport_stringZclass_string	file_namer   r   r   r   r   generate_struct_file  s"    
    

r   c              	   K   s   t jdrtd t d t | D ]r\}}}|D ]b}	t j|	d }
|
dkrVq8t jdt j	|| }t j|st | t
t j||	| q8q*t| ||| t| | d S )Ndepsr   )z.pyz.pycz.jsonzdeps/)r   r   r   shutilrmtreer   walksplitextr   relpathrV   r   r   )rz   r   metadatar   rg   kwargsZrel_dirnamer   	filenamesfilename	extensionZtarget_dirnamer   r   r   generate_module  s"    

 
r   )F)*rV   r   r   r   r   r   r   r   Z_all_keywordsr   Z_py_components_generationr   r}   r~   r   r   r   r   r   r   r   rq   rx   r   r   r$   rN   r]   r@   r^   rd   r/   rh   rw   r{   r|   r   r   r   r   r   r   r   r   r   r   <module>   sR   

=&#8#5