§
    ÷yIfÁ"  ã                  óð   — d Z ddlmZ ddlZddlmZ ddlm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 dd
lmZ  G d„ d¦  «        Z G d„ dee¦  «        Z G d„ de¦  «        Z G d„ d¦  «        ZdS )zHHandle diagram generation options for class diagram or default diagrams.é    )ÚannotationsN)Ú	Generator)ÚAny)Únodes)Úis_stdlib_module)ÚClassDiagramÚPackageDiagram)ÚLinkerÚProject)ÚLocalsVisitorc                  ób   — 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d)d„ZdS )*ÚDiaDefGeneratorz"Handle diagram generation options.Úlinkerr
   ÚhandlerÚDiadefsHandlerÚreturnÚNonec                óf   — |j         | _         d| _        |                      ¦   «          || _        |  dS )z&Common Diagram Handler initialization.FN)ÚconfigÚmodule_namesÚ_set_default_optionsr   ©Úselfr   r   s      úO/var/www/piapp/venv/lib/python3.11/site-packages/pylint/pyreverse/diadefslib.pyÚ__init__zDiaDefGenerator.__init__   s8   € à”nˆŒØ"'ˆÔØ×!Ò!Ñ#Ô#Ð#ØˆŒØÐ'Ð'Ð'ó    Únodeúnodes.ClassDefÚstrc                ó^   — |j         }| j        r|                     ¦   «         j         › d|› �}|S )zGet title for objects.ú.)Únamer   Úroot)r   r   Útitles      r   Ú	get_titlezDiaDefGenerator.get_title#   s7   € à”	ˆØÔð 	2Ø—y’y‘{”{Ô'Ð1Ð1¨%Ð1Ð1ˆEØˆr   Úoptionúbool | NoneÚboolc                ó<   — |€t          | j        j        ¦  «        S |S )z4Activate some options if not explicitly deactivated.)r(   r   Úclasses)r   r&   s     r   Ú_set_optionzDiaDefGenerator._set_option*   s!   € ð ˆ>Ý˜œÔ+Ñ,Ô,Ð,Øˆr   c                ób  — |                       | j        j        ¦  «        | _        |                       | j        j        ¦  «        }|                       | j        j        ¦  «        }d\  }}|rd}|rd}| j        j        �| j        j        }| j        j        �| j        j        }||c| _        | _        dS )z7Set different default options with _default dictionary.)r   r   éÿÿÿÿN)	r+   r   r   Úall_ancestorsÚall_associatedÚshow_ancestorsÚshow_associatedÚ	anc_levelÚassociation_level)r   r.   r/   r2   r3   s        r   r   z$DiaDefGenerator._set_default_options2   s¶   € à ×,Ò,¨T¬[Ô-EÑFÔFˆÔØ×(Ò(¨¬Ô)BÑCÔCˆØ×)Ò)¨$¬+Ô*DÑEÔEˆØ'-Ñ$ˆ	Ð$Øð 	ØˆIØð 	#Ø "ÐØŒ;Ô%Ð1ØœÔ2ˆIØŒ;Ô&Ð2Ø $¤Ô ;ÐØ1:Ð<MÐ.ˆŒ˜Ô.Ð.Ð.r   útuple[int, int]c                ó   — | j         | j        fS )z Help function for search levels.)r2   r3   )r   s    r   Ú_get_levelszDiaDefGenerator._get_levelsB   s   € àŒ~˜tÔ5Ð5Ð5r   c                ó¼   — |                      ¦   «         j        dk    r| j        j        S t	          |                      ¦   «         j        ¦  «        r| j        j        S dS )z2Determine if node should be shown based on config.ÚbuiltinsT)r#   r"   r   Úshow_builtinr   Úshow_stdlib©r   r   s     r   Ú	show_nodezDiaDefGenerator.show_nodeF   sN   € à�9Š9‰;Œ;Ô˜zÒ)Ð)Ø”;Ô+Ð+å˜DŸIšI™KœKÔ,Ñ-Ô-ð 	+Ø”;Ô*Ð*àˆtr   c                ó–   — | j                              |¦  «         | j                             |                      |¦  «        |¦  «         dS )z&Visit one class and add it to diagram.N)r   ÚvisitÚclassdiagramÚ
add_objectr%   r;   s     r   Ú	add_classzDiaDefGenerator.add_classP   sC   € àŒ×Ò˜$ÑÔÐØÔ×$Ò$ T§^¢^°DÑ%9Ô%9¸4Ñ@Ô@Ð@Ð@Ð@r   ÚlevelÚintú%Generator[nodes.ClassDef, None, None]c              #  ó€   K  — |dk    rdS |                      d¬¦  «        D ]}|                      |¦  «        sŒ|V — ŒdS )z&Return ancestor nodes of a class node.r   NF)Úrecurs)Ú	ancestorsr<   )r   r   rB   Úancestors       r   Úget_ancestorszDiaDefGenerator.get_ancestorsU   s_   è è € ð �AŠ:ˆ:ØˆFØŸš¨e˜Ñ4Ô4ð 	ð 	ˆHØ—>’> (Ñ+Ô+ð ØØˆNˆNˆNˆNð	ð 	r   Ú
klass_nodec              #  ón  K  — |dk    rdS t          |j                             ¦   «         ¦  «        t          |j                             ¦   «         ¦  «        z   D ]\}|D ]W}t	          |t
          j        ¦  «        r|j        }t	          |t          j	        ¦  «        r|  
                    |¦  «        sŒS|V — ŒXŒ]dS )z(Return associated nodes of a class node.r   N)ÚlistÚinstance_attrs_typeÚvaluesÚlocals_typeÚ
isinstanceÚastroidÚInstanceÚ_proxiedr   ÚClassDefr<   )r   rJ   rB   Úassociation_nodesr   s        r   Úget_associatedzDiaDefGenerator.get_associated`   sÔ   è è € ð �AŠ:ˆ:ØˆFÝ!% jÔ&D×&KÒ&KÑ&MÔ&MÑ!NÔ!NÕQUØÔ"×)Ò)Ñ+Ô+ñR
ô R
ñ "
ð 	ð 	Ðð *ð ð �Ý˜d¥GÔ$4Ñ5Ô5ð )Øœ=�DÝ" 4­¬Ñ8Ô8ð ¸T¿^º^ÈDÑ=QÔ=Qð ØØ�
�
�
�
ðð	ð 	r   r2   r3   c                ó^  — | j                              |¦  «        s|                      |¦  «        sdS |                      |¦  «         |                      ||¦  «        D ]}|                      ||dz
  |¦  «         Œ|                      ||¦  «        D ]}|                      |||dz
  ¦  «         ŒdS )z2Extract recursively classes related to klass_node.Né   )r?   Úhas_noder<   rA   rI   Úextract_classesrV   )r   rJ   r2   r3   rH   r   s         r   rZ   zDiaDefGenerator.extract_classesp   s×   € ð Ô×%Ò% jÑ1Ô1ð 	¸¿ºÈ
Ñ9SÔ9Sð 	ØˆFØ�Š�zÑ"Ô"Ð"à×*Ò*¨:°yÑAÔAð 	Mð 	MˆHØ× Ò  ¨9°q©=Ð:KÑLÔLÐLÐLà×'Ò'¨
Ð4EÑFÔFð 	Ið 	IˆDØ× Ò   yÐ2CÀaÑ2GÑHÔHÐHÐHð	Ið 	Ir   N©r   r
   r   r   r   r   )r   r   r   r   )r&   r'   r   r(   )r   r   )r   r4   )r   r   r   r(   ©r   r   r   r   )r   r   rB   rC   r   rD   )rJ   r   rB   rC   r   rD   )rJ   r   r2   rC   r3   rC   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r%   r+   r   r6   r<   rA   rI   rV   rZ   © r   r   r   r      sð   € € € € € Ø,Ð,ð(ð (ð (ð (ðð ð ð ðð ð ð ðNð Nð Nð Nð 6ð 6ð 6ð 6ðð ð ð ðAð Að Að Að
	ð 	ð 	ð 	ðð ð ð ð Ið Ið Ið Ið Ið Ir   r   c                  óB   — 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S )ÚDefaultDiadefGeneratorz¡Generate minimum diagram definition for the project :

    * a package diagram including project's modules
    * a class diagram including project's classes
    r   r
   r   r   r   r   c                óf   — t                                | ||¦  «         t          j        | ¦  «         d S ©N)r   r   r   r   s      r   r   zDefaultDiadefGenerator.__init__†   s1   € Ý× Ò   v¨wÑ7Ô7Ð7ÝÔ˜tÑ$Ô$Ð$Ð$Ð$r   r   r   c                óÒ   — | j         j        }t          |j        ¦  «        dk    rt	          d|j        › �|¦  «        | _        nd| _        t          d|j        › �|¦  «        | _        dS )z`Visit a pyreverse.utils.Project node.

        create a diagram definition for packages
        rX   z	packages Nzclasses )	r   ÚmodeÚlenÚmodulesr	   r"   Ú
pkgdiagramr   r?   )r   r   rg   s      r   Úvisit_projectz$DefaultDiadefGenerator.visit_projectŠ   sq   € ð
 Œ{ÔˆÝˆtŒ|ÑÔ˜qÒ Ð Ý5CØ'˜DœIÐ'Ð'¨ñ6ô 6ˆDŒOˆOð #ˆDŒOÝ(Ð)?°D´IÐ)?Ð)?ÀÑFÔFˆÔÐÐr   Ú_r   c                ó<   — | j         r| j         | j        fS | j        fS )zaLeave the pyreverse.utils.Project node.

        return the generated diagram definition
        )rj   r?   )r   rl   s     r   Úleave_projectz$DefaultDiadefGenerator.leave_project˜   s*   € ð
 Œ?ð 	6Ø”? DÔ$5Ð5Ð5ØÔ!Ð#Ð#r   únodes.Modulec                óŒ   — | j         r<| j                             |¦  «         | j                              |j        |¦  «         dS dS )z`Visit an astroid.Module node.

        add this class to the package diagram definition
        N)rj   r   r>   r@   r"   r;   s     r   Úvisit_modulez#DefaultDiadefGenerator.visit_module¡   sN   € ð
 Œ?ð 	8ØŒK×Ò˜dÑ#Ô#Ð#ØŒO×&Ò& t¤y°$Ñ7Ô7Ð7Ð7Ð7ð	8ð 	8r   r   c                ób   — |                       ¦   «         \  }}|                      |||¦  «         dS )z]Visit an astroid.Class node.

        add this class to the class diagram definition
        N)r6   rZ   )r   r   r2   r3   s       r   Úvisit_classdefz%DefaultDiadefGenerator.visit_classdefª   s:   € ð
 (,×'7Ò'7Ñ'9Ô'9Ñ$ˆ	Ð$Ø×Ò˜T 9Ð.?Ñ@Ô@Ð@Ð@Ð@r   únodes.ImportFromc                óX   — | j         r"| j                              ||j        ¦  «         dS dS )z@Visit astroid.ImportFrom  and catch modules for package diagram.N)rj   Úadd_from_dependÚmodnamer;   s     r   Úvisit_importfromz'DefaultDiadefGenerator.visit_importfrom²   s9   € àŒ?ð 	@ØŒO×+Ò+¨D°$´,Ñ?Ô?Ð?Ð?Ð?ð	@ð 	@r   Nr[   )r   r   r   r   )rl   r   r   r   )r   ro   r   r   r\   )r   rt   r   r   )
r]   r^   r_   r`   r   rk   rn   rq   rs   rx   ra   r   r   rc   rc      s¤   € € € € € ðð ð%ð %ð %ð %ðGð Gð Gð Gð$ð $ð $ð $ð8ð 8ð 8ð 8ðAð Að Að Að@ð @ð @ð @ð @ð @r   rc   c                  ó   — e Zd ZdZd
d„Zd	S )ÚClassDiadefGeneratorz\Generate a class diagram definition including all classes related to a
    given class.
    Úprojectr   Úklassr   r   r   c                óÌ  — t          || j        j        ¦  «        | _        t	          |j        ¦  «        dk    r/|                     dd¦  «        \  }}|                     |¦  «        }n(|j        d         }|                     d¦  «        d         }t          | 
                    |¦  «        ¦  «        }|                      ¦   «         \  }}|                      |||¦  «         | j        S )zDReturn a class diagram definition for the class and related classes.rX   r!   r   r-   )r   r   rg   r?   rh   ri   ÚrsplitÚ
get_moduleÚsplitÚnextÚilookupr6   rZ   )r   r{   r|   Úmoduler2   r3   s         r   Úclass_diagramz"ClassDiadefGenerator.class_diagram½   sÎ   € å(¨°´Ô0@ÑAÔAˆÔÝˆwŒÑÔ !Ò#Ð#Ø!ŸLšL¨¨aÑ0Ô0‰MˆF�EØ×'Ò'¨Ñ/Ô/ˆFˆFà”_ QÔ'ˆFØ—K’K Ñ$Ô$ RÔ(ˆEÝ�V—^’^ EÑ*Ô*Ñ+Ô+ˆà'+×'7Ò'7Ñ'9Ô'9Ñ$ˆ	Ð$Ø×Ò˜U IÐ/@ÑAÔAÐAØÔ Ð r   N)r{   r   r|   r   r   r   )r]   r^   r_   r`   r„   ra   r   r   rz   rz   ¸   s2   € € € € € ðð ð!ð !ð !ð !ð !ð !r   rz   c                  ó"   — e Zd ZdZdd„Zdd„ZdS )r   zDGet diagram definitions from user (i.e. xml files) or generate them.r   úargparse.Namespacer   r   c                ó   — || _         d S re   )r   )r   r   s     r   r   zDiadefsHandler.__init__Ó   s   € ØˆŒˆˆr   r{   r   r   r
   úlist[ClassDiagram]c                ó  — g }t          || ¦  «        }| j        j        D ]+}|                     |                     ||¦  «        ¦  «         Œ,|s#t          || ¦  «                             |¦  «        }|D ]}|                     ¦   «          Œ|S )ax  Get the diagram's configuration data.

        :param project:The pyreverse project
        :type project: pyreverse.utils.Project
        :param linker: The linker
        :type linker: pyreverse.inspector.Linker(IdGeneratorMixIn, LocalsVisitor)

        :returns: The list of diagram definitions
        :rtype: list(:class:`pylint.pyreverse.diagrams.ClassDiagram`)
        )rz   r   r*   Úappendr„   rc   r>   Úextract_relationships)r   r{   r   ÚdiagramsÚ	generatorr|   Údiagrams          r   Úget_diadefszDiadefsHandler.get_diadefsÖ   s¢   € ð ˆÝ(¨°Ñ6Ô6ˆ	Ø”[Ô(ð 	Eð 	EˆEØ�OŠO˜I×3Ò3°G¸UÑCÔCÑDÔDÐDÐDØð 	KÝ-¨f°dÑ;Ô;×AÒAÀ'ÑJÔJˆHØð 	,ð 	,ˆGØ×)Ò)Ñ+Ô+Ð+Ð+Øˆr   N)r   r†   r   r   )r{   r   r   r
   r   rˆ   )r]   r^   r_   r`   r   r�   ra   r   r   r   r   Ð   sB   € € € € € ØNÐNðð ð ð ðð ð ð ð ð r   r   )r`   Ú
__future__r   ÚargparseÚcollections.abcr   Útypingr   rQ   r   Úastroid.modutilsr   Úpylint.pyreverse.diagramsr   r	   Úpylint.pyreverse.inspectorr
   r   Úpylint.pyreverse.utilsr   r   rc   rz   r   ra   r   r   ú<module>r˜      s†  ðð
 OÐ Nà "Ð "Ð "Ð "Ð "Ð "à €€€Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -à BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ð
dIð dIð dIð dIð dIñ dIô dIð dIðN6@ð 6@ð 6@ð 6@ð 6@˜]¨Oñ 6@ô 6@ð 6@ðr!ð !ð !ð !ð !˜?ñ !ô !ð !ð0ð ð ð ð ñ ô ð ð ð r   