U
    c?                     @   s   d dl mZ d dlZd dlZd dlZd dlmZ ddgZg Z	dd Z
G dd dejZG d	d dejZd
d ZG dd dZe je g7  _dS )    )	dataclassN)usageavailable_pluginsArtifactAPIUsagec                  C   s&   dd l } | j }tdd |jD S )Nr   c                 s   s   | ]}d | dd V  qdS )qiime2.plugins.-_Nreplace.0s r   Glib/python3.8/site-packages/qiime2-2023.2.0-py3.8.egg/qiime2/plugins.py	<genexpr>   s     z$available_plugins.<locals>.<genexpr>)
qiime2.sdksdkPluginManagersetplugins)qiime2pmr   r   r   r      s    
c                   @   s6   e Zd ZdZG dd dZdd Zdd Zdd	 Zd
S )ArtifactAPIUsageVariablez;A specialized implementation for :class:`ArtifactAPIUsage`.c                   @   s   e Zd Zdd Zdd ZdS )z/ArtifactAPIUsageVariable.repr_raw_variable_namec                 C   s
   || _ d S Nvalue)selfr   r   r   r   __init__    s    z8ArtifactAPIUsageVariable.repr_raw_variable_name.__init__c                 C   s   | j S r   r   r   r   r   r   __repr__#   s    z8ArtifactAPIUsageVariable.repr_raw_variable_name.__repr__N)__name__
__module____qualname__r   r   r   r   r   r   repr_raw_variable_name   s   r#   c                 C   s\   | j dkr| jS | jg| jdg| jdg| jdgd| j  }d|}tdd|}| |S )NformatZvizZmdZmdc)ZartifactZvisualizationZmetadatacolumnr   z
\W|^(?=\d))var_typenamejoinresubr#   )r   partsvar_namer   r   r   to_interface_name&   s    

z*ArtifactAPIUsageVariable.to_interface_namec                 C   sf   | j jsd S | j jdd |  }|}d||f d| j jd dd|f d| j jd	 g}| j | d S )
Nr)   )import_z-hits = sorted(%r._archiver.data_dir.glob(%r))zif len(hits) != 1:zraise ValueErrorztarget = hits[0].read_text()z1match = re.search(%r, target, flags=re.MULTILINE)zif match is None:raise AssertionError)useenable_assertions_update_importsr-   INDENT_add)r   pathZ
expressionr'   exprlinesr   r   r   assert_has_line_matching6   s    



z1ArtifactAPIUsageVariable.assert_has_line_matchingc                 C   s@   | j jsd S |  }d|t|f | j jd g}| j | d S )Nzif str(%r.type) != %r:r/   )r0   r1   r-   strr3   r4   )r   semantic_typer'   r7   r   r   r   assert_output_typeJ   s    
z+ArtifactAPIUsageVariable.assert_output_typeN)r    r!   r"   __doc__r#   r-   r8   r;   r   r   r   r   r      s
   r   c                       s  e Zd ZdZeddG dd dZd7eed fd	d
Zd8ddZ	dd Z
dd Zd9eedddZ fddZ fddZd: fdd	Zd; fdd	Z fddZ fdd Z fd!d"Zd#d$ Zd%d& Zd'd( Z fd)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd<d5d6Z  ZS )=r   z    T)frozenc                   @   s6   e Zd ZU eed< dZeed< dZeed< dd ZdS )zArtifactAPIUsage.ImporterRecordr.   Nfrom_as_c                 C   s@   d| j f }| jd k	r$d| j|f }| jd k	r<d|| jf }|S )Nz	import %sz
from %s %sz%s as %sr.   r>   r?   )r   Ztmplr   r   r   rendera   s    

z&ArtifactAPIUsage.ImporterRecord.render)r    r!   r"   r9   __annotations__r>   r?   rA   r   r   r   r   ImporterRecord[   s   
rC   F   )r1   action_collection_sizec                    s&   t    || _|| _| jdd dS )a  Constructor for ArtifactAPIUsage

        Warning
        -------
        For SDK use only. Do not use in a written usage example.

        Parameters
        ----------
        enable_assertions : bool
            Whether :class:`qiime2.sdk.usage.UsageVariable` assertions should
            be rendered. Note that these are not executed, rather code that
            would assert is templated by :meth:`render`.
        action_collection_size : int
            The maximum number of outputs to automatically desctructure before
            creating seperate lines with output property access. e.g.
            ``x, y, z = foo()`` vs ``results = foo()`` with ``results.x`` etc.
        T)reset_global_importsN)superr   r1   rE   _reset_state)r   r1   rE   	__class__r   r   r   i   s    
zArtifactAPIUsage.__init__c                 C   s&   t  | _g | _t | _|r"t  | _d S r   )r   local_importsrecorderdictinit_data_refsglobal_imports)r   rF   r   r   r   rH      s
    zArtifactAPIUsage._reset_statec                 C   s   | j | d S r   )rL   extend)r   r7   r   r   r   r4      s    zArtifactAPIUsage._addc                 C   s   t |||| S r   )r   )r   r'   factoryr&   r   r   r   usage_variable   s    zArtifactAPIUsage.usage_variable)flushreturnc                 C   s8   t | j}|r|dg }d|| j }|r4|   |S )al  Return a newline-seperated string of Artifact API python code.

        Warning
        -------
        For SDK use only. Do not use in a written usage example.

        Parameters
        ----------
        flush : bool
            Whether to 'flush' the current code. Importantly, this will clear
            the top-line imports for future invocations.
         
)sortedrK   r(   rL   rH   )r   rS   Zsorted_impsrenderedr   r   r   rA      s    

zArtifactAPIUsage.renderc                    s(   t  ||}t| }|| j|< |S r   )rG   init_artifactr9   r-   rN   r   r'   rQ   variabler,   rI   r   r   rY      s    
zArtifactAPIUsage.init_artifactc                    s(   t  ||}t| }|| j|< |S r   )rG   init_metadatar9   r-   rN   rZ   rI   r   r   r\      s    
zArtifactAPIUsage.init_metadataNc                    sF   |d k	rd|| df }t j|||d}t| }|| j|< |S )Nz%s.%s.)ext)lstriprG   init_formatr9   r-   rN   )r   r'   rQ   r^   r[   r,   rI   r   r   r`      s    
zArtifactAPIUsage.init_formatc           
         s   t  j||||d}| }| }d|f | jd|f  | jd|f  g}|d k	rt|tk	rt|}	|j}|	d k	r| j|	|d qt	|}nt	|}|
| jd|f   |
d | jddd | | |S )	N)	view_typez%s = Artifact.import_data(z%r,r>   r.   z%s,)r   ZArtifact)rG   import_from_formatr-   r3   typer9   _canonical_moduler    r2   reprappendr4   )
r   r'   r:   r[   ra   Zimported_varZinterface_nameZ	import_fpr7   Zimport_pathrI   r   r   rd      s6       


z#ArtifactAPIUsage.import_from_formatc                    sn   t  j|f| }|d |dd   }}| }dd |D }d|}| }	d|	||f g}
| |
 |S )Nr      c                 S   s   g | ]}t | qS r   )r9   r-   )r   rr   r   r   
<listcomp>   s     z3ArtifactAPIUsage.merge_metadata.<locals>.<listcomp>, z%r = %r.merge(%s))rG   merge_metadatar-   r(   r4   )r   r'   	variablesr[   Z	first_varZremaining_varsZfirst_mdnamesZ	remainingr,   r7   rI   r   r   rm      s    

zArtifactAPIUsage.merge_metadatac                    s>   t  |||}| }| }d|||f g}| | |S )Nz%s = %s.get_column(%r))rG   get_metadata_columnr-   r4   )r   r'   Zcolumn_namer[   Zcol_variableto_name	from_namer7   rI   r   r   rp      s    
z$ArtifactAPIUsage.get_metadata_columnc                    sH   t  ||}| }| }d||f g}| jddd | | |S )Nz%r = %r.view(Metadata)r   ZMetadatarb   )rG   view_as_metadatar-   r2   r4   )r   r'   Zfrom_variableZto_variablerr   rq   r7   rI   r   r   rs     s    
z!ArtifactAPIUsage.view_as_metadatac                 C   s6   |  }g }dD ]}|d||f  q| | |S )N)Zuuidre   r$   zprint(%r.%s))r-   rh   r4   )r   r[   r,   r7   attrr   r   r   peek  s    
zArtifactAPIUsage.peekc                 C   s   d|f g}|  | d S )Nz# %s)r4   )r   textr7   r   r   r   comment  s    zArtifactAPIUsage.commentc                 C   s(   |  |}d||jf g}| | d S )Nzhelp(%s.%s.__call__))_plugin_import_as_name	action_idr4   )r   actionZaction_namer7   r   r   r   help  s    
zArtifactAPIUsage.helpc                    s:   t  |||}| | |dd }| ||| |S )Nc                 S   s   |   S r   )r-   )vr   r   r   <lambda>,      z)ArtifactAPIUsage.action.<locals>.<lambda>)rG   rz   rx   Zmap_variables_template_action)r   rz   
input_optsZoutput_optsrn   ZinputsrI   r   r   rz   '  s
    
zArtifactAPIUsage.actionc                 C   s   dd | j  D S )Nc                 S   s   i | ]\}}||  qS r   )Zexecute)r   rj   r|   r   r   r   
<dictcomp>2  s      z5ArtifactAPIUsage.get_example_data.<locals>.<dictcomp>)rN   itemsr   r   r   r   get_example_data1  s    z!ArtifactAPIUsage.get_example_datac                 C   sF   |  }| }|dd\}}}d|jf }| jd|f |d |S )Nr]      z
%s_actionsz
%s.actions)r.   r?   )
get_actionZget_import_pathrsplit	plugin_idr2   )r   rz   action_fZfull_importbaser   r?   r   r   r   rx   4  s    z'ArtifactAPIUsage._plugin_import_as_namec                 C   s   t || jkrd}n| ||}|j}|j}d|||f g}| D ]\}}	| ||	}
||
 qD|d t || jkr|  D ]"\}}	|		 }|d||f  q| 
| d S )NZaction_resultsz%s = %s_actions.%s(rc   z%s = action_results.%s)lenrE   _template_outputsr   ry   r   _template_inputrh   _asdictr-   r4   )r   rz   r   rn   output_varsr   ry   r7   kr|   liner,   r   r   r   r   <  s     
z!ArtifactAPIUsage._template_actionc                 C   sZ   g }|  }|jjD ] }t||}|t|  qt|dkrL|d d|	 S )Nri   rU   rl   )
r   Z	signatureZoutputsgetattrrh   r9   r-   r   r(   strip)r   rz   rn   r   r   outputr[   r   r   r   r   U  s    

z"ArtifactAPIUsage._template_outputsc                 C   sz   t |tr0ddd |D }| jd||f  S t |trhddd t|tdD }| jd||f  S | jd||f  S )	Nrl   c                 s   s   | ]}t |V  qd S r   rg   r   Zelr   r   r   r   e  s     z3ArtifactAPIUsage._template_input.<locals>.<genexpr>z%s=[%s],c                 s   s   | ]}t |V  qd S r   r   r   r   r   r   r   i  s     )keyz%s={%s},z%s=%r,)
isinstancelistr(   r3   r   rW   r9   )r   Z
input_namer   tr   r   r   r   c  s    

z ArtifactAPIUsage._template_inputc                 C   s`   | j |||d}|d k	r&| j| n| j| | }|| jkr\| j| | j| d S )Nr@   )rC   	namespaceaddrA   rO   rK   )r   r.   r>   r?   Zimport_recordrX   r   r   r   r2   n  s      
z ArtifactAPIUsage._update_imports)FrD   )F)F)N)N)NN) r    r!   r"   r3   r   rC   boolintr   rH   r4   rR   r9   rA   rY   r\   r`   rd   rm   rp   rs   ru   rw   r{   rz   r   rx   r   r   r   r2   __classcell__r   r   rI   r   r   X   s<     
 (
c                 C   sn   d }| j }|d}|rjztd|}W n tk
rD   | Y S X t|| jsV|S d|}|  qd S )Nr]   )	r!   split	importlibimport_moduler(   ModuleNotFoundErrorhasattrr    pop)objZlast_moduleZ
module_strr+   moduler   r   r   rf   }  s    



rf   c                   @   s8   e Zd Zdd ZdddZdddZdd	 Zd
d ZdS )QIIMEArtifactAPIImporterc                 C   s<   dd l }|j }dd |jD }||kr.d S |j||  S )Nr   c                 S   s   i | ]}| d d|qS )r   r   r	   r   r   r   r   r     s     
 z;QIIMEArtifactAPIImporter._plugin_lookup.<locals>.<dictcomp>)r   r   r   r   )r   plugin_namer   r   lookupr   r   r   _plugin_lookup  s    
z'QIIMEArtifactAPIImporter._plugin_lookupNc                 C   s   | dsd S |d k	rtd|d}|dd  }|d }| |}|d ksZt|dkr^d S t|dkrv| ||S |d dkr| ||dS |d d	kr| ||d
S |d dkr| ||dS |d dkr| ||dS d S )Nr   z>Reloading the QIIME 2 Artifact API is not currently supported.r]   r   r   ri   visualizers)r   methods)r   	pipelines)r   actions)r   r   r   )
startswithImportErrorr   r   r   
_make_spec)r   r'   r5   targetZfqnZplugin_detailsr   pluginr   r   r   	find_spec  s*    


z"QIIMEArtifactAPIImporter.find_specc                 C   s    t jj|| d||d|d kdS )Nzgenerated QIIME 2 API)r   action_types)loaderoriginloader_state
is_package)r   	machinery
ModuleSpec)r   r'   r   r   r   r   r   r     s    z#QIIMEArtifactAPIImporter._make_specc                 C   s   d S r   r   )r   specr   r   r   create_module  s    z&QIIMEArtifactAPIImporter.create_modulec           	      C   s   |j }|jd }|jd }||_|d krrtjd|jd|_tjd|jd|_tjd|jd|_tjd|jd|_	n2|D ],}t
||}| D ]\}}t||| qqvd S )Nr   r   z.methods)packagez.visualizersz
.pipelinesz.actions)__spec__r   Z
__plugin__r   r   r'   r   r   r   r   r   r   setattr)	r   r   r   r   r   Zaction_typer   r   r   r   r   r   exec_module  s*    



z$QIIMEArtifactAPIImporter.exec_module)NN)N)r    r!   r"   r   r   r   r   r   r   r   r   r   r     s
   
"
r   )Zdataclassesr   r)   sysimportlib.machineryr   r   r   __all____path__r   ZUsageVariabler   ZUsager   rf   r   	meta_pathr   r   r   r   <module>	   s   >  'P