
    e                        d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZ ddlmZmZmZmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZ  G d d      Zy)z Utilities for creating diagrams.    )annotationsN)defaultdict)Iterable)modutilsnodes)ClassDiagramClassEntityDiagramEntityPackageDiagramPackageEntity)EdgeTypeNodePropertiesNodeTypePrinter)get_printer_for_filetype)is_exceptionc                  X    e Zd Z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y)DiagramWriterz(Base class for writing project diagrams.c                   || _         t        | j                   j                        | _        |  d| _        | j                   j
                  | _        t        j                  | j                   j                        | _
        i | _        y )N )configr   output_formatprinter_class	file_namemax_color_depthdepth	itertoolscyclecolor_paletteavailable_colorsused_colors)selfr   s     9/usr/lib/python3/dist-packages/pylint/pyreverse/writer.py__init__zDiagramWriter.__init__    s^    5dkk6O6OP[[00
 )0I0I J+-    c                8   |D ]  }|j                   j                         j                  dd      j                  dd      }| d| j                  j                   }t
        j                  j                  | j                  j                        r4t
        j                  j                  | j                  j                  |      }| j                  ||       t        |t              r| j                  |       n| j                  |       | j                           y)z1Write files for <project> according to <diadefs>./_ .N)titlestripreplacer   r   ospathexistsoutput_directoryjoinset_printer
isinstancer   write_packageswrite_classessave)r"   diadefsdiagrambasenamer   s        r#   writezDiagramWriter.write*   s     
	G}}**,44S#>FFsCPH#*Adkk&?&?%@AIww~~dkk::;GGLL)E)EyQ	Y1'>2##G,""7+IIK
	r%   c           
     V   i }t        |j                         d       D ]  j                  j                         _        | j
                  j                  r$t        fd|j                  d      D              s\| j                  j                  j                  t        j                  | j                               ddd|j                  <    |j                  d      D ]z  }|j                  j                  }|j                  j                  }| j                  j!                  ||t"        j$                         ||   d	xx   d
z  cc<   ||   dxx   d
z  cc<   | |j                  d      D ]z  }|j                  j                  }|j                  j                  }| j                  j!                  ||t"        j&                         ||   d	xx   d
z  cc<   ||   dxx   d
z  cc<   | t)        dt+        |       dt-        d |j/                         D               d       y)zWrite a package diagram.c                    | j                   S Nr+   xs    r#   <lambda>z.DiagramWriter.write_packages.<locals>.<lambda>=   s
    agg r%   keyc              3  R   K   | ]  }|j                   |j                  fv    y wr>   )from_object	to_object).0relmodules     r#   	<genexpr>z/DiagramWriter.write_packages.<locals>.<genexpr>@   s+      5 3??CMM::5s   $'dependstype_
propertiesr   )importsimportedrN   rP      rQ   type_dependsz	Analysed z modules with a total of c              3  &   K   | ]	  }|d      yw)rP   N )rH   mods     r#   rK   z/DiagramWriter.write_packages.<locals>.<genexpr>n   s     Ec)nEs   z importsN)sortedmodulesnodeqnamefig_idr   no_standaloneanyget_relationshipsprinter	emit_noder   PACKAGEget_package_propertiesrF   rG   	emit_edger   USESTYPE_DEPENDENCYprintlensumvalues)r"   r9   module_inforI   from_idto_idrJ   s         @r#   r5   zDiagramWriter.write_packages8   s   13 W__.4EF 	F"KK--/FM{{(( 5"44Y?5 2 LL""&&66v> #  *K&	* ,,Y7 	0Coo,,GMM((ELL""mm #   +q0+z*a/*	0 ,,^< 	0Coo,,GMM((ELL"".. #   +q0+z*a/*	0 	K() *E0B0B0DEEFhP	
r%   c                    t        j                  d       D ]  j                  j                         _        | j
                  j                  rt        fddD              sN| j                  j                  j                  t        j                  | j                                j                  d      D ]V  }| j                  j                  |j                  j                  |j                   j                  t"        j$                         X t'        t(              }j                  d      D ]  }||j                  j                     j+                  |j                   j                         | j                  j                  |j                  j                  |j                   j                  |j,                  t"        j.                  	        j                  d
      D ]  }|j                   j                  ||j                  j                     v r3| j                  j                  |j                  j                  |j                   j                  |j,                  t"        j0                  	        y)zWrite a class diagram.c                    | j                   S r>   r?   r@   s    r#   rB   z-DiagramWriter.write_classes.<locals>.<lambda>t   s
     r%   rC   c              3  ~   K   | ]4  }j                  |      D ]  }|j                  |j                  fv    6 y wr>   )r_   rF   rG   )rH   rel_typerI   r9   objs      r#   rK   z.DiagramWriter.write_classes.<locals>.<genexpr>v   sK      5"44X>5  77575s   :=)specializationassociationaggregationrM   rs   rR   rt   )labelrN   ru   N)rX   objectsrZ   r[   r\   r   r]   r^   r`   ra   r   CLASSget_class_propertiesr_   rd   rF   rG   r   INHERITSr   setaddnameASSOCIATIONAGGREGATION)r"   r9   rI   associationsrr   s    `  @r#   r6   zDiagramWriter.write_classesq   s    '///@A 	C)CJ{{(( 5 P5 2
 LL""

nn44S9 # 	 ,,-=> 	CLL""&&$$'' # 	 -8,<,,]; 	C//044S]]5I5IJLL""&&$$hh**	 # 	 ,,]; 	C}}##|COO4J4J'KKLL""&&$$hh**	 # 	r%   c                >    | j                  |      | _        || _        y)zSet printer.N)r   r`   r   )r"   r   r:   s      r#   r3   zDiagramWriter.set_printer   s    ))(3"r%   c                    t        |j                  | j                  j                  r| j	                  |            S d      S )z!Get label and shape for packages.black)rv   color)r   r+   r   	colorizedget_shape_color)r"   rr   s     r#   rc   z$DiagramWriter.get_package_properties   s=    ))/3{{/D/D$&&s+
 	
JQ
 	
r%   c           	     >   t        |j                  | j                  j                  s|j                  nd| j                  j                  s|j
                  ndt        |j                        rdnd| j                  j                  r| j                  |      nd      }|S )z Get label and shape for classes.Nredr   )rv   attrsmethods	fontcolorr   )
r   r+   r   only_classnamesr   r   r   rZ   r   r   )r"   rr   rO   s      r#   ry   z"DiagramWriter.get_class_properties   sq    #))#';;#>#>#))D'+{{'B'BCKK+CHH5e7/3{{/D/D$&&s+'

 r%   c                L   |j                   j                         }t        j                  |j	                  dd      d         ryt        |j                   t        j                        r|j                  dd      d   }n/|j                   j                  r|}n|j                  dd      d   }dj                  |j	                  d| j                        d| j                         }|| j                  vr"t        | j                        | j                  |<   | j                  |   S )zGet shape color.r*   rS   )maxsplitr   grey   N)rZ   r[   r   is_stdlib_modulesplitr4   r   ClassDefrsplitpackager2   r   r!   nextr    )r"   rr   qualified_namer   	base_names        r#   r   zDiagramWriter.get_shape_color   s    )$$^%9%9#%9%J1%MNchh/$++C!+<Q?GXX$G$++C!+<Q?GHHW]]3

;LdjjIJ	D,,,*.t/D/D*EDY'	**r%   c                N    | j                   j                  | j                         y)zWrite to disk.N)r`   generater   )r"   s    r#   r7   zDiagramWriter.save   s    dnn-r%   N)r   zargparse.NamespacereturnNone)r8   z'Iterable[ClassDiagram | PackageDiagram]r   r   )r9   r   r   r   )r9   r   r   r   )r   strr:   r   r   r   )rr   r   r   r   )rr   r	   r   r   )rr   r
   r   r   )r   r   )__name__
__module____qualname____doc__r$   r;   r5   r6   r3   rc   ry   r   r7   rV   r%   r#   r   r      s4    2.7
r+Z#

	+ .r%   r   )r   
__future__r   argparser   r.   collectionsr   collections.abcr   astroidr   r   pylint.pyreverse.diagramsr   r	   r
   r   r   pylint.pyreverse.printerr   r   r   r    pylint.pyreverse.printer_factoryr   pylint.pyreverse.utilsr   r   rV   r%   r#   <module>r      sD   
 ' "   	 # $ #  Q P E /j. j.r%   