o
    g#                     @   s   d Z ddlmZmZ ddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZ G dd	 d	ZG d
d deeZG dd deZG dd dZdS )zHhandle diagram generation options for class diagram or default diagrams
    )AnyOptionalN)nodes)ClassDiagramPackageDiagram)Project)LocalsVisitorc                   @   s`   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 optionsc                 C   s    |j | _ |   || _d| _dS )z%common Diagram Handler initializationN)config_set_default_optionslinkerclassdiagramselfr   handler r   Y/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pylint/pyreverse/diadefslib.py__init__'   s   
zDiaDefGenerator.__init__c                 C   s$   |j }| jr| j  d| }|S )zget title for objects.)namemodule_namesroot)r   nodetitler   r   r   	get_title.   s   zDiaDefGenerator.get_titlec                 C   s   |du r
t | jjS |S )z3activate some options if not explicitly deactivatedN)boolr
   classes)r   optionr   r   r   _set_option5   s   zDiaDefGenerator._set_optionc                 C   s~   |  | jj| _|  | jj}|  | jj}d\}}|rd}|r"d}| jjdur,| jj}| jjdur6| jj}||| _| _dS )z6set 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!   r$   r%   r   r   r   r   =   s   z$DiaDefGenerator._set_default_optionsc                 C   s   | j | jfS )zhelp function for search levels)r$   r%   )r   r   r   r   _get_levelsM   s   zDiaDefGenerator._get_levelsc                 C   s   | j jrdS | jdkS )z&true if builtins and not show_builtinsTbuiltins)r
   show_builtinr   r   r   r   r   r   r   	show_nodeQ   s   zDiaDefGenerator.show_nodec                 C   s$   | j | | j| || dS )z%visit one class and add it to diagramN)r   visitr   
add_objectr   r)   r   r   r   	add_classW   s   zDiaDefGenerator.add_classc                 c   s6    |dkrdS |j ddD ]}| |sq|V  qdS )z%return ancestor nodes of a class noder   NF)recurs)	ancestorsr*   )r   r   levelancestorr   r   r   get_ancestors\   s   
zDiaDefGenerator.get_ancestorsc                 c   sn    |dkrdS t |j t |j  D ]}|D ]}t|tjr$|j}t|tj	r/| 
|s0q|V  qqdS )z'return associated nodes of a class noder   N)listinstance_attrs_typevalueslocals_type
isinstanceastroidInstance_proxiedr   ClassDefr*   )r   
klass_noder0   association_nodesr   r   r   r   get_associatede   s   
zDiaDefGenerator.get_associatedc                 C   sp   | j |s| |sdS | | | ||D ]}| ||d | q| ||D ]}| |||d  q*dS )z1extract recursively classes related to klass_nodeN   )r   has_noder*   r-   r2   extract_classesr>   )r   r<   r$   r%   r1   r   r   r   r   rA   s   s   
zDiaDefGenerator.extract_classesN)__name__
__module____qualname____doc__r   r   r   r   r&   r*   r-   r2   r>   rA   r   r   r   r   r	   $   s    	r	   c                   @   sx   e Zd ZdZdd ZdeddfddZd	edefd
dZde	j
ddfddZde	jddfddZde	jddfddZdS )DefaultDiadefGeneratorzgenerate minimum diagram definition for the project :

    * a package diagram including project's modules
    * a class diagram including project's classes
    c                 C   s   t | || t|  d S N)r	   r   r   r   r   r   r   r      s   zDefaultDiadefGenerator.__init__r   returnNc                 C   sJ   | 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
        r?   z	packages Nzclasses )	r
   modelenmodulesr   r   
pkgdiagramr   r   )r   r   rI   r   r   r   visit_project   s   z$DefaultDiadefGenerator.visit_project_c                 C   s   | j r	| j | jfS | jfS )z`leave the pyreverse.utils.Project node

        return the generated diagram definition
        )rL   r   )r   rN   r   r   r   leave_project   s   z$DefaultDiadefGenerator.leave_projectc                 C   s*   | j r| j| | j |j| dS dS )z_visit an astroid.Module node

        add this class to the package diagram definition
        N)rL   r   r+   r,   r   r)   r   r   r   visit_module   s   z#DefaultDiadefGenerator.visit_modulec                 C   s   |   \}}| ||| dS )z\visit an astroid.Class node

        add this class to the class diagram definition
        N)r&   rA   )r   r   r$   r%   r   r   r   visit_classdef   s   z%DefaultDiadefGenerator.visit_classdefc                 C   s   | j r| j ||j dS dS )z?visit astroid.ImportFrom  and catch modules for package diagramN)rL   add_from_dependmodnamer)   r   r   r   visit_importfrom   s   z'DefaultDiadefGenerator.visit_importfrom)rB   rC   rD   rE   r   r   rM   r   rO   r   ModulerP   r;   rQ   
ImportFromrT   r   r   r   r   rF      s    		rF   c                   @       e Zd ZdZdd Zdd ZdS )ClassDiadefGeneratorz[generate a class diagram definition including all classes related to a
    given class
    c                 C   s   t | || d S rG   )r	   r   r   r   r   r   r      s   zClassDiadefGenerator.__init__c                 C   s   t || jj| _t|jdkr|dd\}}||}n|jd }|dd }t	|
|}|  \}}| ||| | jS )z^return a class diagram definition for the given klass and its
        related klasses
        r?   r   r   r   )r   r
   rI   r   rJ   rK   rsplit
get_modulesplitnextilookupr&   rA   )r   projectklassmoduler$   r%   r   r   r   class_diagram   s   
z"ClassDiadefGenerator.class_diagramN)rB   rC   rD   rE   r   ra   r   r   r   r   rX      s    rX   c                   @   rW   )DiadefsHandlerzYhandle diagram definitions :

    get it from user (i.e. xml files) or generate them
    c                 C   s
   || _ d S rG   )r
   )r   r
   r   r   r   r      s   
zDiadefsHandler.__init__c                 C   sX   g }t || }| jjD ]}|||| q|s!t|| |}|D ]}|  q#|S )av  Get the diagrams 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`)
        )rX   r
   r   appendra   rF   r+   extract_relationships)r   r^   r   diagrams	generatorr_   diagramr   r   r   get_diadefs   s   

zDiadefsHandler.get_diadefsN)rB   rC   rD   rE   r   rh   r   r   r   r   rb      s    rb   )rE   typingr   r   r8   r   pylint.pyreverse.diagramsr   r   pylint.pyreverse.inspectorr   pylint.pyreverse.utilsr   r	   rF   rX   rb   r   r   r   r   <module>   s   \9