a
    .b\!                     @   s   d Z ddlmZ ddl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 ddl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 G d
d dZedddfe
e eee	e f eedddZedkre  dS )z7
Created on Mon Feb 14 17:54:58 2022

@author: nicolas
    )glob)
expanduser)Path)DictListIterableTypeUnionOptional)WebsiteTest)TestInfoTestNameTestsResultsScoresPathLike)LOG_DIR_NAME)	list2xlsxcached_propertyas_pathwarnc                   @   sj  e Zd Zedfee ee edddZe	e
eef dddZe	e
eef ddd	Ze	edd
dZe	edddZe	e
eee f dddZe	e
ee
eef f dddZe	e
eef dddZe	e
eee f dddZe	e
eef dddZe	e
eef dddZe	e
eef dddZd%edddZd&ed!d"d#Zd$S )'CollectTestsResults/)paths
test_classpath_on_serverc                 C   s$   t dd |D | _|| _|| _d S )Nc                 s   s   | ]}t |V  qd S Nr   .0path r    ]/home/manager/.local/lib/python3.9/site-packages/websites_test_framework/testing_framework.py	<genexpr>,       z/CollectTestsResults.__init__.<locals>.<genexpr>)sortedr   r   _path_on_server)selfr   r   r   r    r    r!   __init__%   s    zCollectTestsResults.__init__)returnc                    s    fdd j D S )Nc                    s   i | ]}| j | jd qS ))r   )r   r%   r   r&   r    r!   
<dictcomp>2   s   z0CollectTestsResults._testers.<locals>.<dictcomp>r   r)   r    r)   r!   _testers0   s    
zCollectTestsResults._testersc                 C   s   dd | j  D S )Nc                 S   s   i | ]\}}||  qS r    )runr   r   testerr    r    r!   r*   8   r#   z/CollectTestsResults.results.<locals>.<dictcomp>)r,   itemsr)   r    r    r!   results6   s    zCollectTestsResults.resultsc                    s    fdd j D S )Nc                    s&   i | ]}|d d  j |  D qS )c                 S   s   i | ]\}}||d  qS )scorer    r   nameresultr    r    r!   r*   =   r#   z>CollectTestsResults._raw_scores.<locals>.<dictcomp>.<dictcomp>r1   r0   r   r)   r    r!   r*   <   s   z3CollectTestsResults._raw_scores.<locals>.<dictcomp>r+   r)   r    r)   r!   _raw_scores:   s    
zCollectTestsResults._raw_scoresc                 C   sv   i }| j  D ]b\}}i ||< | D ]H\}}||| |< t| j|jr&| j|  }dkr&|| |  |  < q&q|S )zReturn the scores for each test for all websites.

        For each test marked as relative, scores are divided by the best score of all websites.
        r   )r7   r0   getattrr   Zis_relativebest_scores)r&   scoresr   r1   	test_namer2   bestr    r    r!   r:   A   s    zCollectTestsResults.scoresc                    s:   i } j  D ]&t fdd jD d d|< q|S )Nc                 3   s   | ]} j |  V  qd S r   )r7   r   r&   r;   r    r!   r"   Y   r#   z2CollectTestsResults.best_scores.<locals>.<genexpr>)default)r   Zget_all_tests_namesmaxr   )r&   r9   r    r=   r!   r9   T   s    zCollectTestsResults.best_scoresc                    s    fdd j D S )Nc                    s&   i | ]}|d d  j |  D qS )c                 S   s   i | ]\}}||d  qS )logr    r3   r    r    r!   r*   `   r#   z7CollectTestsResults.logs.<locals>.<dictcomp>.<dictcomp>r6   r   r)   r    r!   r*   _   s   z,CollectTestsResults.logs.<locals>.<dictcomp>r+   r)   r    r)   r!   logs]   s    
zCollectTestsResults.logsc                    s\   t j tj fdd dkrDtdjj d fddjD S )zReturn the global score of each website.

        The global score is the weighted arithmetic mean of all tests scores.
        c                    s    j |   S r   )r:   values)r   r)   r    r!   _scoresm   s    z2CollectTestsResults.global_scores.<locals>._scoresr   zNo test found ! ()c              	      s.   i | ]&}|t d d t |D  qS )c                 s   s   | ]\}}|| V  qd S r   r    )r   weightr2   r    r    r!   r"   s   r#   z?CollectTestsResults.global_scores.<locals>.<dictcomp>.<genexpr>)sumzipr   )rC   totalweightsr    r!   r*   r   s   z5CollectTestsResults.global_scores.<locals>.<dictcomp>)rF   rI   rB   listRuntimeErrorr   Ztests_namesr1   r)   r    )rC   r&   rH   rI   r!   global_scoresd   s    z!CollectTestsResults.global_scoresc                 C   sb   zdd | j  D W S  ty\   | jtkrDtdd| jj d dd t| jD  Y S 0 d S )Nc                 S   s   i | ]\}}||  qS r    )Zget_authorsr.   r    r    r!   r*   z   r#   z/CollectTestsResults.authors.<locals>.<dictcomp>z No `.get_authors()` method foundz'you should overwrite it in your class `z`.c                 S   s$   i | ]\}}|| d |j  gqS )-)r4   )r   ir   r    r    r!   r*      r#   )	r,   r0   NotImplementedErrorr   r   r   __qualname__	enumerater   r)   r    r    r!   authorsw   s    
zCollectTestsResults.authorsc                 C   s
   | j  S r   )r   Zget_tests_infosr)   r    r    r!   _tests_infos   s    z CollectTestsResults._tests_infosc                 C   s   dd | j  D S )Nc                 S   s   i | ]\}}||d  qS )titler    r   r4   infosr    r    r!   r*      r#   z.CollectTestsResults.titles.<locals>.<dictcomp>rS   r0   r)   r    r    r!   titles   s    zCollectTestsResults.titlesc                 C   s   dd | j  D S )Nc                 S   s   i | ]\}}||d  qS )rE   r    rU   r    r    r!   r*      r#   z/CollectTestsResults.weights.<locals>.<dictcomp>rW   r)   r    r    r!   rI      s    zCollectTestsResults.weights.)folderc           
      C   s   t |t }|jdd | jD ]}d| g}| j| }| j| }| j| D ]V}| j| }|d|  |d||   |d| j	|   |||  qLd
|}| j| D ]}	||	 d j|d	d
 qqd S )NTexist_okz# Website: z
## zscore: zweight: 
z.mdutf8)encoding)r   r   mkdirr   r:   rA   r1   rX   appendrI   joinrR   
write_text)
r&   rZ   r   Zfull_logr:   rA   r;   rT   Zlog_textr4   r    r    r!   	write_log   s    




zCollectTestsResults.write_logscores.xlsx)	xlsx_pathc                 C   s   ddgdd | j  D ddg| j g}| jD ]T}dtd| j|  dg| j|  }| j| D ]}||d< ||d	d	  qhq4t	|j
d
d t|| td| d d	S )z,Write all tests results inside an XSLX file.NameZScorec                 s   s   | ]
}|V  qd S r   r    )r   rT   r    r    r!   r"      r#   z6CollectTestsResults.write_xlsx_file.<locals>.<genexpr>       r   NT)
missing_okz!
[1;32mXLSX file generated:[0m rY   )rX   rB   rI   r   roundrL   r:   rR   ra   r   unlinkr   print)r&   rf   datar   rowr4   r    r    r!   write_xlsx_file   s    
&
z#CollectTestsResults.write_xlsx_fileN)rY   )re   ) __name__
__module__rP   r   r   r   r   strr'   r   r   r   r,   r   r1   r   r7   r:   r   r
   floatr9   rA   rL   r   rR   r   rS   rX   rI   rd   rq   r    r    r    r!   r   $   s>    r   rY   r   )r   input_dir_or_globoutput_file_or_dirr   c                 C   s   t d t|tr2d|v r2dd tt|D }nPt|ttfrtt|}| s^td|dd |dD }ndd |D }t|}|j	dkr|j
}|}n|}|d	 }td
d |D | |}|jdd || || dS )a^  Run all tests, write log files and generate XLSX file with results.

    `input_dir_or_glob` is either:
     - the name of the parent folder containing all the websites' root directories,
     - a glob like '/home/*/*/www',
     - a list of paths, each path corresponding to the root directory of a website.

    `output_file_or_dir` is either a directory or the name of a XLSX file.

    `path_on_server` is used to rewrite absolute links, when server root is not website root.
    For example, if the website folder is /path/to/website on the server, path_on_server
    should be "/path/to/website".
    z
Starting tests...
*c                 s   s   | ]}t |V  qd S r   r   r   pthr    r    r!   r"      r#   z"run_and_collect.<locals>.<genexpr>zDirectory not found: c                 s   s   | ]}|  r|V  qd S r   )is_dirry   r    r    r!   r"      r#   c                 s   s   | ]}t |V  qd S r   r   ry   r    r    r!   r"      r#   z.xlsxre   c                 s   s   | ]}|j tkr|V  qd S r   )r4   r   ry   r    r    r!   r"      r#   Tr[   N)rn   
isinstancert   r   r   r   r   r{   FileNotFoundErrorsuffixparentr   r`   rd   rq   )r   rv   rw   r   r   
output_dirZoutput_file	collectorr    r    r!   run_and_collect   s*    

r   __main__N) __doc__r   os.pathr   pathlibr   typingr   r   r   r   r	   r
   Z"websites_test_framework.test_classr   Z$websites_test_framework.custom_typesr   r   r   r   r   Zwebsites_test_framework.paramr   Zwebsites_test_framework.toolsr   r   r   r   r   rt   r   rr   r    r    r    r!   <module>   s,    	 2