B
    \ =                 @   s  d dl mZ yd dlmZ W n ek
r4   eZY nX ye W n ek
rV   eZY nX 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mZ e	jjZg 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edDddZedd Zedd Z edd Z!ed d! Z"d"d# Z#e$d$j%Z&d%d& Z'd'd( Z(dEd)d*Z)dFd+d,Z*d-d. Z+d/d0 Z,ed1d2 Z-edGd4d5Z.dd6e
j/d7fd8d9Z0G d:d; d;Z1G d<d= d=e2Z3d>d? Z4d@dA Z5dBdC Z6dS )H    )absolute_import)
basestringN)contextmanagerc              C   s   xt D ]} |   qW d S )N)_function_cachesclear)cache r   +lib/python3.7/site-packages/Cython/Utils.pyclear_function_caches   s    
r
   c                s.   i  t   t  fdd}|_|S )Nc                 s(     | }|kr$|   } | < |S )N)get)argsres)r   f
uncomputedr   r	   wrapper%   s    z cached_function.<locals>.wrapper)r   appendobjectZuncached)r   r   r   )r   r   r   r	   cached_function!   s    
r   c                s   dj    fdd}|S )Nz
__%s_cachec                sN   t |  d }|d kr$i }t|  | ||kr4|| S | f|  }||< |S )N)getattrsetattr)selfr   r   r   )
cache_namer   r   r	   r   /   s    zcached_method.<locals>.wrapper)__name__)r   r   r   )r   r   r	   cached_method-   s    
	r   c             C   s   t j| \}}|| S )N)ospathsplitext)r   Znewsufbase_r   r   r	   replace_suffix:   s    r   c             C   s&   t j| rt |  tj| dddS )Nwz
ISO-8859-1)encoding)r   r   existsunlinkcodecsopen)r   r   r   r	   open_new_file?   s    
r&   c             C   sT   yt | }W n tk
r    Y n0X |d |  |rPt| |j|jd f d S )NzN#error Do not use this file, it is the result of a failed Cython compilation.
   )r&   EnvironmentErrorwritecloser   utimest_atimest_mtime)r   str   r   r   r	   castrate_fileN   s    r/   c             C   s   t | }||kS )N)modification_time)r   ZtimeZftimer   r   r	   file_newer_than^   s    r1   c             C   s6   yt |  W n" tk
r0   t j| s, Y nX d S )N)r   makedirsOSErrorr   isdir)r   r   r   r	   safe_makedirsc   s
    r5   c             C   s^   t j|t j| }yt|}W n tk
r>   t| Y nX t| |sNdS t	| | dS )z
    Copy file sourcefile to directory destdir (creating it if needed),
    preserving metadata. If the destination file exists and is not
    older than the source file, the copying is skipped.
    N)
r   r   joinbasenamer0   r3   r5   r1   shutilZcopy2)Z
sourcefileZdestdirZdestfileZdesttimer   r   r	   copy_file_to_dir_if_newerk   s    
r9   Fc             C   s(  |r| t tj } |rf|d }ddlm} t||s<td|rVtj|j	f|  } nt
|j	f|  } |}|rv||7 }|s|d}	t |	d d }
|	d }|| }d| }xv| D ]n}tj||}t|r|S |st||
}|d k	rtj||}t|r|S tj||||}t|r|S qW d S )Nr   )FileSourceDescriptorz$Only file sources for code supported.__init__)tuplesysr   ZCython.Compiler.Scanningr:   
isinstanceRuntimeErrorr   dirnamefilenamefind_root_package_dirsplitr6   path_existscheck_package_dir)dirsZqualified_namesuffixposZincludeZsys_pathZ	file_descr:   Zdotted_filenamenamespackage_namesZmodule_nameZmodule_filenameZpackage_filenamedirr   Zpackage_dirr   r   r	   search_include_directories~   sD    	




rN   c             C   s0   t j| }| |kr|S t|r(t|S |S d S )N)r   r   rB   is_package_dirrD   )Z	file_pathrM   r   r   r	   rD      s    rD   c             C   s,   x&|D ]}t j| |} t| sd S qW | S )N)r   r   r6   rO   )rM   rL   rB   r   r   r	   rG      s
    
rG   c             C   s,   x&dD ]}t j| |}t|rdS qW d S )N)z__init__.pyz__init__.pycz__init__.pyxz__init__.pxdr'   )r   r   r6   rF   )Zdir_pathrC   r   r   r   r	   rO      s    
rO   c             C   s   t j| rdS yft}t|dd }|rtt j| }||rt|t|d d  }y|| dS  t	k
rr   dS X W n t
k
r   Y nX dS )NTarchiver'   F)r   r   r"   
__loader__r   normpath
startswithlenget_dataIOError	NameError)r   loaderZarchive_pathrR   arcnamer   r   r	   rF      s"    


rF   c             C   sJ   t | trFy&t }|d kr$t }| |} W n tk
rD   Y nX | S )N)r@   bytesr?   getfilesystemencodinggetdefaultencodingdecodeUnicodeDecodeError)rC   Zfilename_encodingr   r   r	   decode_filename   s    
r_   s   (\w*coding)[:=]\s*([-\w.]+)c             C   s   d}d}x2t |dk r:| d}||7 }|d}|s
P q
W t|d }|rj|ddkrj|d	d
S t |dkrt|d }|r|d	d
S dS )Nr          i     
r   r'   s   c_string_encoding   z	iso8859-1zUTF-8)rT   readrE   _match_file_encodinggroupr]   )r   linesstartdatamr   r   r	   detect_opened_file_encoding   s     

rk   c             C   s   |  ddkr| d dS )z
    Read past a BOM at the beginning of a source file.
    This could be added to the scanner, but it's *substantially* easier
    to keep it at this level.
    r'   u   ﻿r   N)rd   seek)r   r   r   r	   skip_bom
  s    rm   c             C   s   d }yL|d kr>t | d}t|}|d t j|||d}nt j| ||d}W n^ tk
r   tj| rn y"t	}| 
|jrt|| ||}W n ttfk
r   Y nX Y nX |d krt| t| |S )Nrbr   )r!   errors)ior%   rk   rl   TextIOWrapperr3   r   r   r"   rQ   rS   rP   open_source_from_loaderrW   AttributeErrorFileNotFoundErrorrm   )source_filenamer!   error_handlingstreamr   rX   r   r   r	   open_source_file  s.    
rx   c             C   sB   t j|}|t| jd d  }| |}tjt|||dS )Nr'   )r!   ro   )	r   r   rR   rT   rP   rU   rp   rq   BytesIO)rX   ru   r!   rv   ZnrmpathrY   ri   r   r   r	   rr   3  s    
rr   c             C   s   d}| d d dkr$d}| dd  } t | dk r<t| d} n~| d dkr| d }|dkrlt| dd  d	} q|d
krt| dd  d} q|dkrt| dd  d} qt| d} n
t| d} |r|  S | S )NFr'   -Trc   r   0ZxX   ZoO   ZbB)rT   int)valueZis_negZliteral_typer   r   r	   str_to_number>  s"    
r   c             C   s,   t | trt| } d|   ko$dk n   S )Ni   l        )r@   r   r   )r   r   r   r	   long_literalZ  s    
r   c              C   sz   dt jkrt jd S d} t jdkrFtjdkr:t jd} nt jd} | rdt j| rdt j	| dS t jt j	dd	S )
z
    Return the base directory containing Cython's caches.

    Priority:

    1. CYTHON_CACHE_DIR
    2. (OS X): ~/Library/Caches/Cython
       (posix not OS X): XDG_CACHE_HOME/cython if XDG_CACHE_HOME defined
    3. ~/.cython

    ZCYTHON_CACHE_DIRNposixdarwinz~/Library/CachesZXDG_CACHE_HOMEcython~z.cython)
r   environnamer?   platformr   
expanduserr   r4   r6   )parentr   r   r	   get_cython_cache_dir`  s    



r   rc   c          
   #   s   d  }t | }zt  \}t ||  zXt | g   fdd} fdd}ddlm} ||d}d|_|  |V  W d t ||  |d k	r|	  X W d t | X d S )	Nc           	      s:   z(x"t d} | r  |  qP qW W d t  X d S )Ni  )r   rd   r   r*   )d)ri   pipe_inr   r	   copy  s    
zcaptured_fd.<locals>.copyc                 s   d  } r| } | S )Nr`   )r6   r]   )output)ri   r!   r   r	   
get_output  s    

zcaptured_fd.<locals>.get_outputr   )Thread)targetT)
r   duppipedup2r*   Z	threadingr   Zdaemonrh   r6   )rw   r!   tZorig_streamZpipe_outr   r   r   r   )ri   r!   r   r	   captured_fd  s&    



r   rb   Tc             C   sb   |r| | |  y
|j}W n tk
r8   |}Y nX | |  |rR| | |r^|  d S )N)r)   flushbufferrs   )sZheader_textendfiler   outr   r   r	   print_bytes  s    




r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )LazyStrc             C   s
   || _ d S )N)callback)r   r   r   r   r	   r=     s    zLazyStr.__init__c             C   s   |   S )N)r   )r   r   r   r	   __str__  s    zLazyStr.__str__c             C   s   |   S )N)r   )r   r   r   r	   __repr__  s    zLazyStr.__repr__c             C   s   |   | S )N)r   )r   rightr   r   r	   __add__  s    zLazyStr.__add__c             C   s   ||    S )N)r   )r   leftr   r   r	   __radd__  s    zLazyStr.__radd__N)r   
__module____qualname__r=   r   r   r   r   r   r   r   r	   r     s
   r   c               @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )
OrderedSetr   c             C   s   g | _ t | _| | d S )N)_listset_setupdate)r   elementsr   r   r	   r=     s    zOrderedSet.__init__c             C   s
   t | jS )N)iterr   )r   r   r   r	   __iter__  s    zOrderedSet.__iter__c             C   s   x|D ]}|  | qW d S )N)add)r   r   er   r   r	   r     s    
zOrderedSet.updatec             C   s&   || j kr"| j| | j | d S )N)r   r   r   r   )r   r   r   r   r	   r     s    
zOrderedSet.addN)r   )r   r   r   r=   r   r   r   r   r   r   r	   r     s   
r   c                s    fdd}|S )z6Class decorator for creating a class with a metaclass.c                sl   | j  }|d}|d k	rDt|tr,|g}x|D ]}|| q2W |dd  |dd   | j| j|S )N	__slots____dict____weakref__)r   r   r   r@   strpopr   	__bases__)clsZ	orig_varsslotsZ	slots_var)	metaclassr   r	   r     s    



zadd_metaclass.<locals>.wrapperr   )r   r   r   )r   r	   add_metaclass  s    r   c             C   s   | dks|  drtdd S )Nr   zcython.z;cython is a special module, cannot be used as a module name)rS   
ValueError)Zfull_module_namer   r   r	   $raise_error_if_module_name_forbidden  s    r   c             C   s   g }d}xXt d| D ]H}|dkrHdddd| }|ddg dd	 }q|d
kr|t| qW |dgd	  dd }|d	  |7  < d}x|D ]}|d> | }qW d| S )zn
    Parse and translate '4.3a1' into the readable hex representation '0x040300A1' (like PY_HEX_VERSION).
       z
([.abrc]+))abZrc         r   Nra   r;      r}   z0x%08X)rerE   r   r~   )Zversion_stringZdigitsZrelease_statusdigit
hexversionr   r   r	   build_hex_version  s    
r   )FF)NN)NN)rc   N)7Z
__future__r   Z__builtin__r   ImportErrorr   rt   rW   r3   r   r?   r   rp   r$   r8   
contextlibr   r   getmtimer0   r   r
   r   r   r   r&   r/   r1   r5   r9   rN   rD   rG   rO   rF   r_   compilesearchre   rk   rm   rx   rr   r   r   r   r   stdoutr   r   r   r   r   r   r   r   r   r   r	   <module>   sb   

.



!
	(