B
    \)                 @   s   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mZ ddlm	Z	m
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 )zQ
Utilities for getting information about IPython and the system it's running in.
    N)release)_sysinfoencodingc             C   sN   t jrdt jfS tjdtjtj| dd}| \}}|rJd| dfS dS )a  Get short form of commit hash given directory `pkg_path`

    We get the commit hash from (in order of preference):

    * IPython.utils._sysinfo.commit
    * git output, if we are in a git repository

    If these fail, we return a not-found placeholder tuple

    Parameters
    ----------
    pkg_path : str
       directory containing package
       only used for getting commit from active repo

    Returns
    -------
    hash_from : str
       Where we got the hash from - description
    hash_str : str
       short form of hash
    Zinstallationzgit rev-parse --short HEADT)stdoutstderrcwdshellZ
repositoryascii)z(none found)z<not found>)r   Zcommit
subprocessPopenPIPEZcommunicatestripdecode)pkg_pathprocZrepo_commit_ r   4lib/python3.7/site-packages/IPython/utils/sysinfo.pypkg_commit_hash   s    

r   c             C   s8   t | \}}ttj| ||tjtjtjt tjt	j
d
S )zReturn dict describing the context of this package

    Parameters
    ----------
    pkg_path : str
       path containing __init__.py for package

    Returns
    -------
    context : dict
       with named parameters of interest
    )
Zipython_versionZipython_pathZcommit_sourceZcommit_hashsys_versionZsys_executableZsys_platformplatformZos_nameZdefault_encoding)r   dictr   versionsys
executabler   osnamer   ZDEFAULT_ENCODING)r   srcZhshr   r   r   pkg_infoD   s    r   c           
   C   s,   t j} | | | | td}t|S )zBReturn useful information about IPython and the system, as a dict.z..)r   pathrealpathdirnameabspathjoin__file__r   )pr   r   r   r   get_sys_info_   s    r&   c               C   s   t t S )au  Return useful information about IPython and the system, as a string.

    Examples
    --------
    ::
    
        In [2]: print(sys_info())
        {'commit_hash': '144fdae',      # random
         'commit_source': 'repository',
         'ipython_path': '/home/fperez/usr/lib/python2.6/site-packages/IPython',
         'ipython_version': '0.11.dev',
         'os_name': 'posix',
         'platform': 'Linux-2.6.35-22-generic-i686-with-Ubuntu-10.10-maverick',
         'sys_executable': '/usr/bin/python',
         'sys_platform': 'linux2',
         'sys_version': '2.6.6 (r266:84292, Sep 15 2010, 15:52:39) \n[GCC 4.4.5]'}
    )pprintZpformatr&   r   r   r   r   sys_infoe   s    r(   c               C   s
   t dS )z2Return the number of active CPUs on a Unix system.SC_NPROCESSORS_ONLN)r   sysconfr   r   r   r   _num_cpus_unixy   s    r+   c              C   s    t jdddgt jd} | j S )z4Return the number of active CPUs on a Darwin system.Zsysctlz-nzhw.ncpu)r   )r
   r   r   r   read)r%   r   r   r   _num_cpus_darwin~   s    r-   c               C   s   t jdS )z5Return the number of active CPUs on a Windows system.ZNUMBER_OF_PROCESSORS)r   environgetr   r   r   r   _num_cpus_windows   s    r0   c              C   sF   t ttd} | t t }ytdt| }W n   d}Y nX |S )a  Return the effective number of CPUs in the system as an integer.

   This cross-platform function makes an attempt at finding the total number of
   available CPUs in the system, as returned by various underlying system and
   python calls.

   If it can't find a sensible answer, it returns 1 (though an error *may* make
   it return a large positive number that's actually incorrect).
   )ZLinuxZDarwinZWindows   )r+   r-   r0   r/   r   systemmaxint)Z	ncpufuncsZncpufuncZncpusr   r   r   num_cpus   s    

r5   )__doc__r   r   r'   r   r
   ZIPython.corer   ZIPython.utilsr   r   r   r   r&   r(   r+   r-   r0   r5   r   r   r   r   <module>   s   &