
    7 fD                    F   d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ ddlmZ ddlmZmZm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mZmZmZmZ ddlmZ er*ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-  ej.        dej/                  Z0d  e1e          2                                D             Z3d6dZ4d7dZ5 G d de6          Z7 G d  d!          Z8 G d" d#e          Z9 G d$ d%e          Z:d8d'Z;d9d+Z<d:d-Z=d;d/Z>d<d1Z?d=d5Z@dS )>aQ  Defines a docutils directive for inserting inheritance diagrams.

Provide the directive with one or more classes or modules (separated
by whitespace).  For modules, all of the classes in that module will
be used.

Example::

   Given the following classes:

   class A: pass
   class B(A): pass
   class C(A): pass
   class D(B, C): pass
   class E(B): pass

   .. inheritance-diagram: D E

   Produces a graph like the following:

               A
              / \
             B   C
            / \ /
           E   D

The graph is inserted as a PNG+image map into HTML and a PDF in
LaTeX.
    )annotationsN)IterableSequence)import_module)path)TYPE_CHECKINGAnycast)nodes)
directives)addnodes)figure_wrappergraphvizrender_dot_htmlrender_dot_latexrender_dot_texinfo)SphinxDirective)Node)Sphinx)BuildEnvironment)
OptionSpec)HTML5Translator)LaTeXTranslator)TexinfoTranslatorz^(?:([\w.]*)\.)?  # module names
                           (\w+)  \s* $          # class/final module name
                           c                :    g | ]}t          j        |          |S  )inspectisclass).0objs     T/var/www/equiseq/venv/lib/python3.11/site-packages/sphinx/ext/inheritance_diagram.py
<listcomp>r"   G   s6     ( ( (s/#&&(s ( ( (    objnamestrreturnr	   c                6   	 t          |           S # t          $ r Y dS t          $ rq t                              |           }|sY dS |                                \  }}|Y dS 	 t          |          }t          ||d          cY S # t          $ r Y Y dS w xY ww xY w)zImport a object or module using *name* and *currentmodule*.
    *name* should be a relative name from *currentmodule* or
    a fully-qualified name.

    Returns imported object or module.  If failed, returns None value.
    N)r   	TypeErrorImportErrormodule_sig_rematchgroupsgetattr)r$   matchedmodnameattrnamemodules        r!   
try_importr2   K   s    W%%%   tt   %%g.. 	44#NN,,?44	"7++F68T22222 	 	 	444	s8    
B%BB#BB
BBBBname
currmodulec                   d}|rt          |dz   | z             }|t          |           }|t          d| z            t          j        |          r|gS t          j        |          rYg }|j                                        D ];}t          j        |          r%|j        |j        k    r|	                    |           <|S t          d| z            )z0Import a class using its fully-qualified *name*.N.zECould not import class or module %r specified for inheritance diagramz=%r specified for inheritance diagram is not a class or module)
r2   InheritanceExceptionr   r   ismodule__dict__values
__module____name__append)r3   r4   targetclassesclss        r!   import_classesrA   h   s   F  5J,t344 ~D!!~""$()* * 	* v 	x		&	!	! ?))++ 	$ 	$Cs## $&/(I(Is###
  79= > ? ? ?r#   c                      e Zd ZdS )r7   N)r<   r;   __qualname__r   r#   r!   r7   r7      s        Dr#   r7   c                      e Zd ZdZ	 	 	 d:d;dZd<dZd=dZ	 d>d?dZd@dZdd d!d"Z	d#d$d%d&d'd(d)Z
d*d+d,ZdAd/ZdAd0Z	 	 	 	 	 dBdCd9ZdS )DInheritanceGraphz
    Given a list of classes, determines the set of classes that they inherit
    from all the way to the root "object", and then is able to generate a
    graphviz dot graph from them.
    Fr   Nr   class_names	list[str]r4   r%   show_builtinsboolprivate_basespartsintaliasesdict[str, str] | Nonetop_classesSequence[Any]r&   Nonec                    || _         |                     ||          }|                     ||||||          | _        | j        sd}	t	          |	          dS )z*class_names* is a list of child classes to show bases from.

        If *show_builtins* is True, then Python builtins will be shown
        in the graph.
        z(No classes found for inheritance diagramN)rF   _import_classes_class_info
class_infor7   )
selfrF   r4   rH   rJ   rK   rM   rO   r?   msgs
             r!   __init__zInheritanceGraph.__init__   sn     '&&{J??**7M+8%+W W 	,<C&s+++	, 	,r#   	list[Any]c                Z    g }|D ]%}|                     t          ||                     &|S )zImport a list of classes.)extendrA   )rV   rF   r4   r?   r3   s        r!   rS   z InheritanceGraph._import_classes   s:     	= 	=DNN>$
;;<<<<r#   r?   %list[tuple[str, str, list[str], str]]c           	         	 i d	 fd	|D ]} 	|           t                                                    S )a  Return name and bases for all classes that are ancestors of
        *classes*.

        *parts* gives the number of dotted name parts to include in the
        displayed node names, from right to left. If given as a negative, the
        number of parts to drop from the left. A value of 0 displays the full
        dotted name. E.g. ``sphinx.ext.inheritance_diagram.InheritanceGraph``
        with ``parts=2`` or ``parts=-2`` gets displayed as
        ``inheritance_diagram.InheritanceGraph``, and as
        ``ext.inheritance_diagram.InheritanceGraph`` with ``parts=3`` or
        ``parts=-1``.

        *top_classes* gives the name(s) of the top most ancestor class to
        traverse to. Multiple names can be specified separated by comma.
        r@   r	   r&   rQ   c                   s| t           v rd S 
s| j                            d          rd S                     | 	          }                    | d          }d }	 | j        rM| j                                                            d          d         }|rd|                    dd          z  }n# t          $ r Y nw xY wg }||||f| <   |v rd S | j	        D ]d}s
|t           v r
s|j                            d          r+|
                                        |	                     |vr |           ed S )N_r   
"%s""z\")py_builtinsr<   
startswith
class_name__doc__stripsplitreplace	Exception	__bases__r=   )r@   nodenamefullnametooltipdocbaselistbaserM   all_classesrK   rJ   recurserV   rH   rO   s          r!   rs   z-InheritanceGraph._class_info.<locals>.recurse   s     SK%7%7  S\%<%<S%A%A sE7;;HsAw77H G; C+++--33D99!<C C"(3;;sE+B+B"B    #%H ((HgFK;&& " "$ )<)<$ )A)A#)F)F eW E EFFF{**GDMMM" "s   AB3 3
C ?C )r@   r	   r&   rQ   )listr:   )
rV   r?   rH   rJ   rK   rM   rO   r@   rr   rs   s
   ` ````` @@r!   rT   zInheritanceGraph._class_info   s    $  	"  	"  	"  	"  	"  	"  	"  	"  	"  	"  	"  	"  	"D  	 	CGCLLLLK&&(()))r#   r@   r	   c                    |j         }|dv r|j        }n| d|j         }|dk    r|}n3|                    d          }d                    || d                   }|||v r||         S |S )zGiven a class object, return a fully-qualified name.

        This works for things I've tested in matplotlib so far, but may not be
        completely general.
        )__builtin__builtinsr6   r   N)r;   r<   rC   rh   join)rV   r@   rK   rM   r1   rm   result
name_partss           r!   re   zInheritanceGraph.class_name   s     000|HH 553#355HA::FF!,,JXXj%122F6W#4#46?"r#   c                $    d | j         D             S )z1Get all of the class names involved in the graph.c                    g | ]	\  }}}}|
S r   r   )r   r_   rm   s      r!   r"   z8InheritanceGraph.get_all_class_names.<locals>.<listcomp>   s!    DDD0a1aDDDr#   )rU   )rV   s    r!   get_all_class_namesz$InheritanceGraph.get_all_class_names   s    DDDODDDDr#   LRz"8.0, 12.0"transparent)rankdirsizebgcolorbox
   g      ?zA"Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans"z"setlinewidth(0.5),filled"white)shapefontsizeheightfontnamestyle	fillcolorg      ?z"setlinewidth(0.5)")	arrowsizer   attrsdict[str, Any]c                ~    d                     d t          |                                          D                       S )N,c                    g | ]}d |z  S )z%s=%sr   r   xs     r!   r"   z7InheritanceGraph._format_node_attrs.<locals>.<listcomp>  s    DDD1DDDr#   rx   sorteditemsrV   r   s     r!   _format_node_attrsz#InheritanceGraph._format_node_attrs  s3    xxDDfU[[]].C.CDDDEEEr#   c                ~    d                     d t          |                                          D                       S )N c                    g | ]}d |z  S )z%s=%s;
r   r   s     r!   r"   z8InheritanceGraph._format_graph_attrs.<locals>.<listcomp>  s    FFF1
QFFFr#   r   r   s     r!   _format_graph_attrsz$InheritanceGraph._format_graph_attrs  s3    wwFFu{{}}0E0EFFFGGGr#   r3   urlsenvBuildEnvironment | Nonegraph_attrsdict | None
node_attrs
edge_attrsc                (   |i }| j                                         }| j                                        }| j                                        }	||                    |           ||                    |           ||	                    |           |r]|                    |j        j                   |                    |j        j                   |	                    |j        j                   g }
|
	                    d|z             |
	                    | 
                    |                     t          | j                  D ]\  }}}}|                                }||v rd||         z  |d<   d|d<   |r||d<   |
	                    d|d	|                     |          d
           |D ]4}|
	                    d|d|d	|                     |	          d
           5|
	                    d           d                    |
          S )aV  Generate a graphviz dot graph from the classes that were passed in
        to __init__.

        *name* is the name of the graph.

        *urls* is a dictionary mapping class names to HTTP URLs.

        *graph_attrs*, *node_attrs*, *edge_attrs* are dictionaries containing
        key/value pairs to pass on as graphviz properties.
        Nzdigraph %s {
ra   URLz"_top"r>   rn   z  "z" [z];
z" -> "z}
r   )default_graph_attrscopydefault_node_attrsdefault_edge_attrsupdateconfiginheritance_graph_attrsinheritance_node_attrsinheritance_edge_attrsr=   r   r   rU   r   rx   )rV   r3   r   r   r   r   r   g_attrsn_attrse_attrsresrm   basesrn   this_node_attrs	base_names                   r!   generate_dotzInheritanceGraph.generate_dot  sC     <D*//11)..00)..00"NN;'''!NN:&&&!NN:&&& 	>NN3:=>>>NN3:<===NN3:<===

#d*+++

4++G44555.4T_.E.E 	? 	?*D(E7%llnnO4)/$x.)@&,4) 5-4	*JJJd55oFFFFH I I I # ? ?	


%IIttt 33G<<<<> ? ? ? ?? 	

5wws||r#   )FFr   Nr   )rF   rG   r4   r%   rH   rI   rJ   rI   rK   rL   rM   rN   rO   rP   r&   rQ   )rF   rG   r4   r%   r&   rY   )r?   rY   rH   rI   rJ   rI   rK   rL   rM   rN   rO   rP   r&   r\   )r   N)r@   r	   rK   rL   rM   rN   r&   r%   )r&   rG   )r   r   r&   r%   )NNNNN)r3   r%   r   rN   r   r   r   r   r   r   r   r   r&   r%   )r<   r;   rC   rf   rX   rS   rT   re   r}   r   r   r   r   r   r   r   r#   r!   rE   rE      sQ        
 W\;<UW, , , , ,"   9* 9* 9* 9*x JN    ,E E E E    .-  & 
F F F FH H H H EI4804/3/3	5 5 5 5 5 5 5r#   rE   c                      e Zd ZdZdS )inheritance_diagramzN
    A docutils node to use as a placeholder for the inheritance diagram.
    N)r<   r;   rC   rf   r   r#   r!   r   r   P  s          	Dr#   r   c                  b    e Zd ZU dZdZdZdZdZee	j
        e	j        e	j        dZded<   ddZdS )InheritanceDiagramzJ
    Run when the inheritance_diagram directive is first encountered.
    F   r   T)rK   private-basescaptiontop-classesr   option_specr&   
list[Node]c           	     p   t                      }| j        j        |_        | j        d                                         }| j                            d                              d          }| j        	                    dd          |d<   d
                    |          |d<   g |d<   | j        	                    dd                              d	          D ]3}|                                }|r|d                             |           4	 t          || j        j        	                    d
          |d         d| j        v | j        j        |d                   }n># t"          $ r1}|j        j                            || j                  gcY d }~S d }~ww xY w|                                D ]1} |dd|z  |d| j                  \  }}	|                    |           2||d<   d| j        vr|                     |           |gS t1          | || j        d                   }
|                     |
           |
gS )Nr   pyclassrK   z, contentr   r   r   z	py:moduler   )rK   rJ   rM   rO   )linez:class:`%s`graphr   )r   statedocument	argumentsrh   r   
get_domainroleoptionsgetrx   rg   r=   rE   ref_contextr   inheritance_aliasr7   reporterwarninglinenor}   r[   add_namer   )rV   noderF   
class_roler@   r   errr3   refnodesr   figures              r!   runzInheritanceDiagram.runf  sU   "$$
+nQ'--//X((..33G<<
((!44W))K00Y ]<##M266<<SAA 	0 	0C))++C 0]#**3///	K$TX155kBB7m-=5 /1 1 1EE $ 	K 	K 	KM*223T[2IIJJJJJJJ	K --// 	" 	"D$*-tQ
D DKHaKK!!!! WDL((MM$6M#D$Y0GHHFMM&!!!8Os   
AE 
F$&F
FFN)r&   r   )r<   r;   rC   rf   has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacerL   r   flag	unchangedunchanged_requiredr   __annotations__r   r   r#   r!   r   r   W  s           K $#'!4	 K    + + + + + +r#   r   r   c                    | d         t          | d                   z                                   }t          j        |d                                          dd          S )Nr   rK   F)usedforsecurityi)r%   encodehashlibmd5	hexdigest)r   encodeds     r!   get_graph_hashr     sR    IT']!3!33;;==G;w666@@BB344HHr#   rV   r   rQ   c                r   |d         }t          |          }d|z  }| j        j        j        j                                        }t          j        | j        j        | j        j	        z             }i }t          t          t          j                 |          }|D ]}	|	                    d          Z|	                    dd          s#|	d                             dd          d	         }
n|	d
         }
|	                    d          ||
<   q|	                    d          L|dk    r%|dz   |	                    d          z   ||	d
         <   d|	                    d          z   ||	d
         <   |                    ||| j        j                  }t#          | ||i ddd|d         z              t$          j        )zZ
    Output the graph for HTML.  This will insert a PNG with clickable
    image map.
    r   inheritance%srefuriNinternalT#r   reftitlerefidSVG)r   inheritancezInheritance diagram of r   )alt)r   builderr   r   graphviz_output_formatupperr   basenamecurrent_docname
out_suffixr
   r   r   pending_xrefr   rsplitr   r   r   SkipNode)rV   r   r   
graph_hashr3   r   current_filenamer   pending_xrefschildrefnamedotcodes               r!   html_visit_inheritance_diagramr    s   
 ME%%JZ'D "\-4KQQSS}T\%ADLD[%[\\D("78$??M C C99X*99Z.. ,/00a88<
+!IIh//DMMYYw+%..*:S*@599WCUCU*UU:&''*-		'0B0B*BU:&'  t1A BBGD$]M1DOCE E E E
.r#   r   c                    |d         }t          |          }d|z  }|                    || j        j        ddi          }t	          | ||i d           t
          j        )z>
    Output the graph for LaTeX.  This will insert a PDF.
    r   r   r   	"6.0,6.0"r   r   r   )r   r   r   r   r   r   r   rV   r   r   r   r3   r  s         r!   latex_visit_inheritance_diagramr	    so     ME%%JZ'D  4<+;.4k-B ! D DGT4"m<<<
.r#   r   c                    |d         }t          |          }d|z  }|                    || j        j        ddi          }t	          | ||i d           t
          j        )z@
    Output the graph for Texinfo.  This will insert a PNG.
    r   r   r   r  r  r   )r   r   r   r   r   r   r   r  s         r!   !texinfo_visit_inheritance_diagramr    so    
 ME%%JZ'D  4<+;.4k-B ! D DGtT7B>>>
.r#   nodes.NodeVisitorc                    t           j        )N)r   r   )rV   r   s     r!   skipr    s
    
.r#   appr   r   c           	        |                      d           |                     t          t          d ft          d ft
          d ft
          d ft          d f           |                     dt                     | 	                    di d           | 	                    di d           | 	                    di d           | 	                    di d           t          j        d	d
S )Nzsphinx.ext.graphviz)latexhtmltextmantexinfozinheritance-diagramr   Fr   r   r   T)versionparallel_read_safe)setup_extensionadd_noder   r	  r  r  r  add_directiver   add_config_valuesphinx__display_version__)r  s    r!   setupr    s    -...LL.5,d3D\4L2D9  ; ; ; +-?@@@2B>>>12u===12u===,b%8881NNNr#   )r$   r%   r&   r	   )r3   r%   r4   r%   r&   r	   )r   r   r&   r%   )rV   r   r   r   r&   rQ   )rV   r   r   r   r&   rQ   )rV   r   r   r   r&   rQ   )rV   r  r   r   r&   rQ   )r  r   r&   r   )Arf   
__future__r   rw   r   r   recollections.abcr   r   	importlibr   osr   typingr   r	   r
   docutilsr   docutils.parsers.rstr   r  r   sphinx.ext.graphvizr   r   r   r   r   sphinx.util.docutilsr   docutils.nodesr   sphinx.applicationr   sphinx.environmentr   sphinx.util.typingr   sphinx.writers.htmlr   sphinx.writers.latexr   sphinx.writers.texinfor   compileVERBOSEr*   varsr:   rc   r2   rA   rj   r7   rE   r   r   r   r  r	  r  r  r  r   r#   r!   <module>r3     ss   < # " " " " "    				 . . . . . . . . # # # # # #       + + + + + + + + + +       + + + + + +                     1 0 0 0 0 0 9######))))))333333------333333444444888888
  "
, ,
( (dd8nn3355 ( ( (   :? ? ? ?>	 	 	 	 	9 	 	 	B B B B B B B BJ	 	 	 	 	( 	 	 	: : : : : : : :zI I I I
! ! ! !H          O O O O O Or#   