
    ci              	          d Z ddlZddlZddlZddlZddlZddlZddlZddlZg dZ	 ej                  e      Zdedej                  dej                  fdZdd	d
ej"                  ej$                  ef   deddfdZd Zej,                  dej"                  ej$                  ef   dej.                  fd       Zej,                  dd       Zej,                  dej"                  ej$                  edf   dej2                  ej.                     fd       Zdej"                  ej$                  edf   dej2                  ej.                     fdZdddej"                  ej$                  edf   dej"                  ej$                  edf   dej.                  fdZdedddedej2                  e   dej8                  e   defdZy)z3Generic re-useable self-contained helper functions.    N)attachmkdirsmapping_itemspromote_pathlikepromote_pathlike_directorydeprecate_positional_argsnameobjectreturnc                      fd}|S )a  Return a decorator doing ``setattr(object, name)`` with its argument.

    >>> spam = type('Spam', (object,), {})()  # doctest: +NO_EXE

    >>> @attach(spam, 'eggs')
    ... def func():
    ...     pass

    >>> spam.eggs  # doctest: +ELLIPSIS
    <function func at 0x...>
    c                 "    t        |        | S )N)setattr)funcr	   r
   s    6/tmp/pip-target-z3e9_cxr/lib/python/graphviz/_tools.py	decoratorzattach.<locals>.decorator#   s    d#     )r
   r	   r   s   `` r   r   r      s     r   i  )modefilenamer   c                   t         j                  j                  |       }|syt        j	                  d|       t        j
                  ||d       y)zPRecursively create directories up to the path of ``filename``
        as needed.Nzos.makedirs(%r)T)r   exist_ok)ospathdirnamelogdebugmakedirs)r   r   r   s      r   r   r   *   s;     ggooh'GII)KKdT2r   c                    t        | j                               }t        |       t        u rt        t	        |            }|S )ay  Return an iterator over the ``mapping`` items,
        sort if it's a plain dict.

    >>> list(mapping_items({'spam': 0, 'ham': 1, 'eggs': 2}))  # doctest: +NO_EXE
    [('eggs', 2), ('ham', 1), ('spam', 0)]

    >>> from collections import OrderedDict
    >>> list(mapping_items(OrderedDict(enumerate(['spam', 'ham', 'eggs']))))
    [(0, 'spam'), (1, 'ham'), (2, 'eggs')]
    )iteritemstypedictsorted)mappingresults     r   r   r   4   s3     '--/"FG}fVn%Mr   filepathc                     y)z(Return path object for path-like-object.Nr   r&   s    r   r   r   E       r   c                     y)zReturn None for None.Nr   r(   s    r   r   r   J   r)   r   c                     y)z9Return path object or ``None`` depending on ``filepath``.Nr   r(   s    r   r   r   O   r)   r   c                 4    | t        j                  |       S dS )zReturn path-like object ``filepath`` promoted into a path object.

    See also:
        https://docs.python.org/3/glossary.html#term-path-like-object
    N)pathlibPathr(   s    r   r   r   U   s     &.%97<<!CtCr   )default	directoryr/   c               `    t        j                  | |       S |xs t        j                        S )zReturn path-like object ``directory`` promoted into a path object (default to ``os.curdir``).

    See also:
        https://docs.python.org/3/glossary.html#term-path-like-object
    )r-   r.   r   curdir)r0   r/   s     r   r   r   _   s2     <<Y%:	 3 3$1		3 3r      )
ignore_argcategory
stacklevelsupported_numberr4   r5   r6   c                 x      dk\  s
J d        d }|S t        t              sJ dz   fd}|S )a  Mark supported_number of positional arguments as the maximum.

    Args:
        supported_number: Number of positional arguments
            for which no warning is raised.
        ignore_arg: Name of positional argument to ignore.
        category: Type of Warning to raise
            or None to return a nulldecorator
            returning the undecorated function.
        stacklevel: See :func:`warning.warn`.

    Returns:
        Return a decorator raising a category warning
            on more than supported_number positional args.

    See also:
        https://docs.python.org/3/library/exceptions.html#FutureWarning
        https://docs.python.org/3/library/exceptions.html#DeprecationWarning
        https://docs.python.org/3/library/exceptions.html#PendingDeprecationWarning
    r   zsupported_number => 0: c                     | S )z Return the undecorated function.r   )r   s    r   nulldecoratorz0deprecate_positional_args.<locals>.nulldecorator   s    Kr   r3   c           
         	
 t        j                         }|j                  j                         D cg c].  \  }}|j                  t         j
                  j                  k(  r|0 c}}	
3	D cg c]
  }|k(  s	| }}|sJ d       
t        |      z  
d dnd	d  }|sJ t        j                  d j                   j                  |        j                  j                  d      j                  d      \  }}r|r|rJ dkD  rd	ndt        j                          	
 f	d
       }|S c c}}w c c}w )Nz#ignore_arg must be a positional argz (ignoring z)) z$deprecate positional args: %s.%s(%r)__legacyr3   sc                  Z  	 t        |       kD  rt        |       }t        t        j                  |            }t        |      }|sJ dj                  d |j                         D              }t        j                  d
 d d  dt        |       d| d 	        	| i |S )
Nz, c              3   0   K   | ]  \  }}| d |  yw)=Nr   ).0r	   values      r   	<genexpr>zPdeprecate_positional_args.<locals>.decorator.<locals>.wrapper.<locals>.<genexpr>   s)      #J'2tU '+V1UI#6 #Js   zThe signature of z will be reduced to z positional arg z: pass z as keyword arg)r6   r5   )
lenzipr"   	itertoolsislicejoinr    warningswarnlist)argskwargs	call_args	supported
deprecatedwantedargnamesr5   check_numberr   	func_namequalifications_r6   r7   s         r   wrapperz=deprecate_positional_args.<locals>.decorator.<locals>.wrapper   s    4y<'$/	 !1!1)\!JK	!)_
!!z #J6@6F6F6H#J J 1) =%%5$6obT- !$y/!2'&QSPTV *4'/	1 (((r   )inspect	signature
parametersr    kind	ParameterPOSITIONAL_OR_KEYWORDrG   r   r   
__module____qualname____name__lstrip	partition	functoolswraps)r   r\   r	   paramignoredrS   seprestrZ   rU   rV   rW   rX   rY   r5   r4   r6   r7   s   `        @@@@@r   r   z,deprecate_positional_args.<locals>.decorator   s^   %%d+	,5,@,@,F,F,H N[T5zzW%6%6%L%LL  N'!(0GDJ4FtGGGAAA7CL(L)*R8MM./0
z		8//4#4#4j	B MM((-	(229=	3#T22$q(Sb			) 	) 
	)  QN Hs   3E9
EE)
issubclassWarning)r7   r4   r5   r6   r:   r   s   ````  r   r   r   k   s\    2 q P$;<L;O"PP 	 h(((!OJ*X r   )r&   Nr   N)__doc__rf   r[   rI   loggingr   r-   typingrL   __all__	getLoggerrc   r   strAnyCallabler   UnionPathLikeintr   r   overloadr.   r   Optionalr   PendingDeprecationWarningTyperm   r   r   r   r   <module>r}      s
   9     	   ( g! 6::  & HM 3V\\"++s"23 3 3QU 3" 3v||BKK,<= 3W\\ 3 3     Dv||BKKd,BC D //',,7D D
Dv||BKKd,BC D //',,7D PT	3&,,r{{C7M*N 	3(.R[[#t5K(L	3$+LL	3 BF?X01	R03R*0//#*>R )/G(<R +.	Rr   