B
    u9aF                 @   sh  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Zdd ZG dd dZ	ddd	d
Z
dd Zdd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!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#d=d> Z$d?d@ Z%dAdB Z&dHdCdDZ'dEdF Z(e)dGkrde(  dS )IzK
Collect various information about Python to help debugging test failures.
    )print_functionNc             C   s*   | d krd S t | } tdd| } |  S )Nz\s+ )strresubstrip)text r	    /usr/lib/python3.7/pythoninfo.pynormalize_text   s
    r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )
PythonInfoc             C   s
   i | _ d S )N)info)selfr	   r	   r
   __init__   s    zPythonInfo.__init__c             C   s\   || j krtd| |d kr"d S t|tsNt|ts>t|}| }|sNd S || j |< d S )Nzduplicate key: %r)r   
ValueError
isinstanceintr   r   )r   keyvaluer	   r	   r
   add   s    


zPythonInfo.addc             C   s   dd | j  D S )zU
        Get information as a key:value dictionary where values are strings.
        c             S   s   i | ]\}}t ||qS r	   )r   ).0r   r   r	   r	   r
   
<dictcomp>.   s    z(PythonInfo.get_infos.<locals>.<dictcomp>)r   items)r   r	   r	   r
   	get_infos*   s    zPythonInfo.get_infosN)__name__
__module____qualname__r   r   r   r	   r	   r	   r
   r      s   r   )	formatterc            C   sL   xF|D ]>}t ||d }|d kr q|| }|d k	r:|||}| || qW d S )N)getattr)info_addobjZname_fmt
attributesr   attrr   namer	   r	   r
   copy_attributes1   s    

r$   c             C   s2   yt ||}W n tk
r"   d S X | || d S )N)r   AttributeError)r   r#   modZ	attr_namer   r	   r	   r
   	copy_attr<   s
    r'   c            C   sH   yt ||}W n tk
r"   d S X | }|d k	r:||}| || d S )N)r   r%   )r   r#   r&   Z	func_namer   funcr   r	   r	   r
   	call_funcD   s    r)   c             C   s   d}t | td| t| dtd t| dtd t }ttdrPd|t f }| d	| x\d
D ]T}tt|}|d krxq`t|dd }|sq`t|dd }|rd||f }| d| | q`W ttd}|rd}nd}| d| d S )N)
_frameworkabiflagsapi_versionbuiltin_module_names	byteorderdont_write_bytecode
executableflags
float_infofloat_repr_style	hash_info
hexversionimplementationint_infomaxsize
maxunicodepathplatformprefixthread_infoversionversion_infoZwinverzsys.%szsys.androidapilevelZgetandroidapilevelzsys.windowsversionZgetwindowsversiongetfilesystemencodeerrorsz%s/%szsys.filesystem_encoding)stdinstdoutstderrencodingerrorszsys.%s.encodingZgettotalrefcountz$Yes (sys.gettotalrefcount() present)z#No (sys.gettotalrefcount() missing)Py_DEBUG)r$   sysr)   getfilesystemencodinghasattrr@   r   )r   r!   rD   r#   streamrE   rF   r   r	   r	   r
   collect_sysO   s0    




rK   c             C   sl   dd l }| }dtt|}| d| | d|  | d|j dd d|   }|rh| d	| d S )
Nr   r   zplatform.architecturezplatform.python_implementationzplatform.platformT)Zaliasedz%s %szplatform.libc_ver)r;   ZarchitecturejoinfilterboolZpython_implementationlibc_verr   )r   r;   ZarchrO   r	   r	   r
   collect_platform   s    

rP   c             C   s   dd l }| d|d d S )Nr   zlocale.encodingF)localegetpreferredencoding)r   rQ   r	   r	   r
   collect_locale   s    rS   c             C   s$   | dt d | dt d d S )Nzbuiltins.float.float_formatfloatzbuiltins.float.double_formatZdouble)rT   __getformat__)r   r	   r	   r
   collect_builtins   s    rV   c          
   C   s  dd l }dd }d}t| |d||d t| d|d t| d	|d
 t| d|d t| d|d dd }t| d|d|d t|dry| }W n tk
r   Y nX | d| t| d|d t| d|d td}xV|j D ]H\}}|	 }	|	|ks|	
ds|	
dr|	dr| d| | qW t|drX|d}
||
 | dd |
  t|d!ryRy|d"|j d#}W n, tk
r } zd$| }W d d }~X Y nX | d%| W n4 tk
r } z|jtjkrڂ W d d }~X Y nX d S )&Nr   c             S   s&   | dkrt tdd |D S |S d S )N)supports_follow_symlinkssupports_fdsupports_effective_idsc             s   s   | ]}|j V  qd S )N)r   )r   r(   r	   r	   r
   	<genexpr>   s    z2collect_os.<locals>.format_attr.<locals>.<genexpr>)r   sorted)r"   r   r	   r	   r
   format_attr   s    zcollect_os.<locals>.format_attr)r#   supports_bytes_environrY   rX   rW   zos.%s)r   zos.cwdgetcwdzos.uidgetuidzos.gidgetgidzos.unameunamec             S   s   d tt| S )Nz, )rL   mapr   )groupsr	   r	   r
   format_groups   s    z!collect_os.<locals>.format_groupsz	os.groups	getgroupsgetloginzos.loginzos.cpu_count	cpu_countz
os.loadavg
getloadavg)>APPDATAZARZ	ARCHFLAGSZARFLAGSZAUDIODEVCCCFLAGSCOLUMNSZCOMPUTERNAMEZCOMSPECZCPPZCPPFLAGSZDISPLAYZDISTUTILS_DEBUGZDISTUTILS_USE_SDKZDYLD_LIBRARY_PATHZENSUREPIP_OPTIONSZHISTORY_FILEHOMEZ	HOMEDRIVEZHOMEPATHZIDLESTARTUPLANGZLDFLAGSZLDSHAREDZLD_LIBRARY_PATHZLINESZMACOSX_DEPLOYMENT_TARGETZMAILCAPSZ	MAKEFLAGSZMIXERDEVZMSSDKPATHZPATHEXTZPIP_CONFIG_FILEZPLATZPOSIXLY_CORRECTZPY_SAX_PARSERZProgramFileszProgramFiles(x86)ZRUNNING_ON_VALGRINDZSDK_TOOLS_BINZSERVER_SOFTWARESHELLSOURCE_DATE_EPOCHZ
SYSTEMROOTZTEMPZTERMZTILE_LIBRARYZTIX_LIBRARYZTMPZTMPDIRZTRAVISZTZZUSERPROFILEZVIRTUAL_ENVZWAYLAND_DISPLAYZWINDIRZ_PYTHON_HOST_PLATFORMZ_PYTHON_PROJECT_BASEZ_PYTHON_SYSCONFIGDATA_NAME__PYVENV_LAUNCHER__)ZPYTHONLC_ZVSZ	COMNTOOLSzos.environ[%s]umaskzos.umaskz%03o	getrandom   zready (initialized)znot seeded yet (%s)zos.getrandom)osr$   r)   rI   rf   OSError	frozensetenvironr   upper
startswithendswithrt   ru   GRND_NONBLOCKBlockingIOErrorerrnoZENOSYS)r   rw   r\   r!   rd   ZloginZENV_VARSr#   r   ra   maskstateexcr	   r	   r
   
collect_os   sR    

?


r   c             C   s   ydd l }W n tk
r    d S X dd }d}t| |d||d t|ds|t|dd	}d
|krj| dd
 nd|kr|| dd d S )Nr   c             S   s   t |trd| S |S d S )Nz%#x)r   r   )r"   r   r	   r	   r
   r\   7  s    
z%collect_readline.<locals>.format_attr)Z_READLINE_VERSIONZ_READLINE_RUNTIME_VERSION_READLINE_LIBRARY_VERSIONzreadline.%s)r   r   __doc__ zlibedit readlinezreadline.libraryzGNU readline)readlineImportErrorr$   rI   r   )r   r   r\   r!   docr	   r	   r
   collect_readline1  s    

r   c             C   sd   dd l }y,|jdddg|j|jdd}| d }W n tk
rH   d S X | d }| d| d S )Nr   Zgdbz-nxz	--versionT)rB   rC   universal_newlinesZgdb_version)
subprocessPopenPIPEcommunicaterx   
splitlines)r   r   procr>   r	   r	   r
   collect_gdbN  s    r   c             C   sx   ydd l }W n tk
r    Y nX d}t| |d| ydd l}W n tk
rT   Y n X | }|dd}| d| d S )Nr   )Z
TK_VERSIONZTCL_VERSIONz
tkinter.%sr   
patchlevelztkinter.info_patchlevel)_tkinterr   r$   tkinterZTclZcall)r   r   r!   r   Ztclr   r	   r	   r
   collect_tkinter_  s    r   c          
   C   s   dd l }| d|   d}t| |d| t|drxVdD ]N}y&tjdd ||}W d Q R X W n tk
rv   Y q8X | d	| | q8W d S )
Nr   z	time.time)ZaltzoneZdaylightZtimezoneZtznameztime.%sget_clock_info)clockZ	monotonicZperf_counterZprocess_timeZthread_timetimeT)recordztime.get_clock_info(%s))r   r$   rI   warningscatch_warningsr   r   )r   r   r!   r   Z
clock_infor	   r	   r
   collect_timer  s    

r   c             C   s6   ydd l }W n tk
r    d S X | d|j   d S )Nr   zdatetime.datetime.now)datetimer   Znow)r   r   r	   r	   r
   collect_datetime  s
    r   c             C   sH   dd l }x:dD ]2}||}|dkr*|s*qt|}| d| | qW d S )Nr   )ZABIFLAGSANDROID_API_LEVELrj   ZCCSHAREDrk   ZCFLAGSFORSHAREDZCONFIG_ARGSZHOST_GNU_TYPEZMACHDEPZ	MULTIARCHZOPTZ	PY_CFLAGSZPY_CFLAGS_NODISTZPY_CORE_LDFLAGSZ
PY_LDFLAGSZPY_LDFLAGS_NODISTZPY_STDMODULE_CFLAGSrF   ZPy_ENABLE_SHAREDrp   ZSOABIr<   r   zsysconfig[%s])	sysconfigget_config_varr   )r   r   r#   r   r	   r	   r
   collect_sysconfig  s    
r   c             C   sD   ydd l }W n tk
r    d S X dd }d}t| |d||d d S )Nr   c             S   s   |  drd| S |S d S )NZOP_z%#8x)r|   )r"   r   r	   r	   r
   r\     s    
z collect_ssl.<locals>.format_attr)ZOPENSSL_VERSIONZOPENSSL_VERSION_INFOZHAS_SNIZOP_ALLZOP_NO_TLSv1_1zssl.%s)r   )sslr   r$   )r   r   r\   r!   r	   r	   r
   collect_ssl  s    r   c             C   s   dd l }| }| d| d S )Nr   zsocket.hostname)socketZgethostname)r   r   Zhostnamer	   r	   r
   collect_socket  s    r   c             C   s8   ydd l }W n tk
r    d S X d}t| |d| d S )Nr   )r>   Zsqlite_versionz
sqlite3.%s)sqlite3r   r$   )r   r   r!   r	   r	   r
   collect_sqlite  s    r   c             C   s8   ydd l }W n tk
r    d S X d}t| |d| d S )Nr   )ZZLIB_VERSIONZZLIB_RUNTIME_VERSIONzzlib.%s)zlibr   r$   )r   r   r!   r	   r	   r
   collect_zlib  s    r   c             C   s<   yddl m} W n tk
r$   d S X d}t| |d| d S )Nr   )expat)ZEXPAT_VERSIONzexpat.%s)Zxml.parsersr   r   r$   )r   r   r!   r	   r	   r
   collect_expat  s    r   c             C   s8   ydd l }W n tk
r    d S X d}t| |d| d S )Nr   )Z__libmpdec_version__z_decimal.%s)_decimalr   r$   )r   r   r!   r	   r	   r
   collect_decimal  s    r   c             C   sB   ydd l }W n tk
r    d S X t| d|d t| d|d d S )Nr   zpymem.allocatorZpymem_getallocatorsnamezpymem.with_pymallocZWITH_PYMALLOC)	_testcapir   r)   r'   )r   r   r	   r	   r
   collect_testcapi  s    r   c             C   sv   ydd l }W n tk
r    d S X dd t|D }x.|D ]&}t||}||}| d| | q:W t| d|d d S )Nr   c             S   s   g | ]}| d r|qS )ZRLIMIT_)r|   )r   r"   r	   r	   r
   
<listcomp>  s    z$collect_resource.<locals>.<listcomp>zresource.%szresource.pagesizeZgetpagesize)resourcer   dirr   Z	getrlimitr)   )r   r   Zlimitsr#   r   r   r	   r	   r
   collect_resource  s    


r   c             C   sJ   yddl m} W n tk
r$   d S X dd t|D }t| |d| d S )Nr   )test_socketc             S   s   g | ]}| d r|qS )ZHAVE_)r|   )r   r#   r	   r	   r
   r     s    z'collect_test_socket.<locals>.<listcomp>ztest_socket.%s)testr   r   r   r$   )r   r   r!   r	   r	   r
   collect_test_socket  s    r   c             C   sX   yddl m} W n tk
r$   d S X d}t| |d| t| d|d t| d|d d S )	Nr   )support)ZIPV6_ENABLEDztest_support.%sztest_support._is_gui_availableZ_is_gui_availablez test_support.python_is_optimizedZpython_is_optimized)r   r   r   r$   r)   )r   r   r!   r	   r	   r
   collect_test_support#  s    r   c       	      C   s   dd l }dd l}|d}|s"d S ydd l}||}W n tk
rT   | }Y nX |d y|j||j|j	dd}W n t
k
r   d S X | d }|jrd S | d }t|}| d| d S )Nr   rj   z	--versionT)rB   rC   r   z
CC.version)r   r   r   shlexsplitr   appendr   r   ZSTDOUTrx   r   
returncoder   r   )	r   r   r   rj   r   argsr   rB   r   r	   r	   r
   
collect_cc0  s0    

r   c             C   s@   yddl m} W n tk
r$   d S X | ddtt| d S )Nr   )_GDBM_VERSIONzgdbm.GDBM_VERSION.)Z_gdbmr   r   rL   rb   r   )r   r   r	   r	   r
   collect_gdbmS  s
    r   c             C   sv   yddl m} W n tk
r$   d S X | }xDt|D ]8}|| }x*t|D ]}| d||f t||  qLW q6W d S )Nr   )get_configsz%s[%s])Z_testinternalcapir   r   r[   repr)r   r   Zall_configsZconfig_typeZconfigr   r	   r	   r
   collect_get_config\  s    r   c             C   s   dd l }t| |dd d S )Nr   zsubprocess.%s)Z_USE_POSIX_SPAWN)r   r$   )r   r   r	   r	   r
   collect_subprocessk  s    r   c             C   s   d}| j }xttttttttt	t
tttttttttttttttfD ]p}y|| W qB tk
r } z@d}td|j tjd tj tjd ttjd tj!  W d d }~X Y qBX qBW |S )NFTzERROR: %s() failed)file)"r   r   rV   r   rS   rP   r   r   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	Exceptionprintr   rG   rC   	traceback	print_excflush)r   errorr   Zcollect_funcr   r	   r	   r
   collect_infop  sL    


 r   c             C   sn   d}t | t dt|  t   |  }t| }x,|D ]$\}}|dd}t d||f  q<W t   d S )NzPython debug information=
r   z%s: %s)r   lenr   r[   r   replace)r   r   titleZinfosr   r   r	   r	   r
   	dump_info  s    r   c              C   s6   t  } t| }t|  |r2tdtjd td d S )Nz"Collection failed: exit with error)r   rv   )r   r   r   r   rG   rC   exit)r   r   r	   r	   r
   main  s    r   __main__)N)*r   Z
__future__r   r   r   rG   r   r   r   r   r$   r'   r)   rK   rP   rS   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   <module>   sT   9 	#




#	0


