B
    [x,                 @   s   d Z ddlZddlZddlmZ ddlmZ dd ZdZdZ	d	Z
d
ZdZdZededede
de	dediZG dd deZe Zeje dd Zdd Zdd Zdd ZejdkreZdd Zdd Zd-d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Z dS ).aD  
This module contains factory functions that attempt
to return Qt submodules from the various python Qt bindings.

It also protects against double-importing Qt with different
bindings, which is unstable and likely to crash

This is used primarily by qt and qt_for_kernel, and shouldn't
be accessed directly from the outside
    N)partial)LooseVersionc             C   s*   yt | t |kS  tk
r$   dS X dS )zcompare versionsTN)r   	TypeError)ab r   3lib/python3.7/site-packages/qtconsole/qt_loaders.pycheck_version   s    r	   ZpyqtZpyqt5Zpyqtv1ZpyqtdefaultZpysideZpyside2PySide2PySidePyQt4PyQt5c               @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )ImportDenierz`Import Hook that will guard against bad Qt imports
    once committed to a specific binding
    c             C   s   t  | _d S )N)set_ImportDenier__forbidden)selfr   r   r   __init__.   s    zImportDenier.__init__c             C   s   t j|d  | j| d S )N)sysmodulespopr   add)r   module_namer   r   r   forbid1   s    zImportDenier.forbidNc             C   s   |rd S || j kr| S d S )N)r   )r   fullnamepathr   r   r   find_module5   s    
zImportDenier.find_modulec             C   s   t d|t f d S )Nzk
    Importing %s disabled by QtConsole, which has
    already imported an incompatible Qt Binding: %s
    )ImportError
loaded_api)r   r   r   r   r   load_module;   s    zImportDenier.load_module)N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   )   s
   
r   c             C   s   | t kr(td td td nn| tkrPtd td td nF| tkrxtd td td ntd td td dS )z[Commit to a particular API, and trigger ImportErrors on subsequent
       dangerous importsr   r   r   r
   N)QT_API_PYSIDE2IDr   QT_API_PYSIDEQT_API_PYQT5)apir   r   r   
commit_apiE   s    







r(   c               C   sL   dt jkrt dkrtS tS n*dt jkr,tS dt jkr:tS dt jkrHtS dS )zReturn which API is loaded, if any

    If this returns anything besides None,
    importing any other Qt binding is unsafe.

    Returns
    -------
    None, 'pyside2', 'pyside', 'pyqt', or 'pyqtv1'
    zPyQt4.QtCore   zPySide.QtCorezPySide2.QtCorezPyQt5.QtCoreN)r   r   qtapi_versionQT_API_PYQTQT_API_PYQTv1r%   r#   r&   r   r   r   r   r   [   s    





r   c             C   s   t |  }ddl}y|t|}|dt|j |dt|j |dt|j | tks`| tkrr|dt|j | tkrt	|j
dS dS W n tk
r   d	S X dS )
an  Safely check for PyQt4/5, PySide or PySide2, without importing
       submodules

    Supports Python <= 3.3

       Parameters
       ----------
       api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyside2' | 'pyqtdefault']
            Which module to check for

       Returns
       -------
       True if the relevant module appears to be importable
    r   NQtCoreQtGuiQtSvg	QtWidgetsz1.0.3TF)api_to_moduleimp
__import__r   list__path__r&   r#   r%   r	   __version__r   )r'   r   r2   modr   r   r   has_bindings   s    r8   c          	   C   s   t |  }ddlm} dddg}| ttfkr4|d xB|D ]:}y|d||f }W n tk
rf   dS X |d	kr:dS q:W | tkrdd	l}t	|j
d
S dS )aZ  Safely check for PyQt4/5 or PySide, without importing submodules

    Supports Python >= 3.4

        Parameters
        ----------
        api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyqtdefault']
             Which module to check for

        Returns
        -------
        True if the relevant module appears to be importable
     r   )	find_specr-   r.   r/   r0   z%s.%sFNz1.0.3T)r1   importlib.utilr9   r&   r#   appendr   r%   r   r	   r6   )r'   r   r9   ZrequiredZsubmodspecr   r   r   r   has_binding_new   s     


r=   )      c              C   sF   yddl } W n tk
r    dS X y
| dS  tk
r@   dS X dS )zReturn which QString API has been set, if any

    Returns
    -------
    The QString API version (1 or 2), or None if not set
    r   NQString)sipr   getapi
ValueError)rA   r   r   r   r*      s    
r*   c             C   s8   t | sdS t }| tkr(|ttdgkS || dgkS dS )z?Safely query whether an API is importable, without importing itFN)r8   r   QT_API_PYQT_DEFAULTr+   r,   )r'   Zcurrentr   r   r   
can_import   s    rE   r)   c             C   s   ddl }| dk	r(|d|  |d|  ddlm}m}m} t|jdsVtd|j |j	|_
|j|_|d} | dkr|tnt}||||fS )	z
    Import PyQt4

    Parameters
    ----------
    version : 1, 2, or None
      Which QString/QVariant API to use. Set to None to use the system
      default

    ImportErrors rasied within this function are non-recoverable
    r   Nr@   ZQVariant)r.   r-   r/   z4.7z)QtConsole requires PyQt4 >= 4.7, found %s   )rA   Zsetapir   r.   r-   r/   r	   ZPYQT_VERSION_STRr   
pyqtSignalSignalpyqtSlotSlotrB   r,   r+   )versionrA   r.   r-   r/   r'   r   r   r   import_pyqt4   s    

rL   c              C   sx   ddl m} m}m}m}m} ddl}| j| _| j	| _
td}|j|j |j|j |j|j t}| |||fS )zX
    Import PyQt5

    ImportErrors rasied within this function are non-recoverable
    r   )r-   r/   r0   r.   QtPrintSupportNQtGuiCompat)r   r-   r/   r0   r.   rM   rA   rG   rH   rI   rJ   types
ModuleType__dict__updater&   )r-   r/   r0   r.   rM   rA   rN   r'   r   r   r   import_pyqt5  s    
rS   c              C   s    ddl m} m}m} || |tfS )zY
    Import PySide

    ImportErrors raised within this function are non-recoverable
    r   )r.   r-   r/   )r   r.   r-   r/   r%   )r.   r-   r/   r   r   r   import_pyside!  s    rT   c              C   s\   ddl m} m}m}m}m} td}|j	| j |j	|j |j	|j |||t
fS )zZ
    Import PySide2

    ImportErrors raised within this function are non-recoverable
    r   )r.   r-   r/   r0   rM   rN   )r
   r.   r-   r/   r0   rM   rO   rP   rQ   rR   r#   )r.   r-   r/   r0   rM   rN   r   r   r   import_pyside2+  s    
rU   c             C   s   t ttttttttt	tddt
t	tddi}t }|r<|g} x| D ]V}||krrtd|ddd | D f t|s|qB||  }|d }t| |S W td	|tttttttt | f dS )
a  
    Import Qt, given a preference list of permissible bindings.

    It is safe to call this function multiple times.  If a Qt binding
    has already been loaded, it will be returned regardless of the
    preference list.

    Parameters
    ----------
    api_options: List of strings
        The order of APIs to try. Valid items are 'pyside2', 'pyside', 'pyqt',
        'pyqt5', 'pyqtv1' and 'pyqtdefault'

    Returns
    -------

    A tuple of QtCore, QtGui, QtSvg, QT_API
    The first three are the Qt modules. The last is the string
    indicating which module was loaded.

    Raises
    ------
    ImportError, if it isn't possible to import any requested bindings
    (because they aren't installed).
    rF   )rK   Nz'Invalid Qt API %r, valid values are: %sz, c             S   s   g | ]}d | qS )z%rr   ).0kr   r   r   
<listcomp>h  s    zload_qt.<locals>.<listcomp>a  
    Could not load requested Qt binding. Please ensure that
    PyQt4 >= 4.7, PyQt5, PySide >= 1.0.3 or PySide2 is available,
    and only one is imported per session.

    Currently-imported Qt library:   %r
    PyQt4 installed:                 %s
    PyQt5 installed:                 %s
    PySide >= 1.0.3 installed:       %s
    PySide2 installed:               %s
    Tried to load:                   %r
    )r#   rU   r%   rT   r+   rL   r&   rS   r,   r   rD   r   RuntimeErrorjoinkeysrE   r(   r   r8   )Zapi_optionsloadersZloadedr'   resultr   r   r   load_qt<  s6    
 
r_   c              C   sX   t  } | tkrddlm} n8| tkr2ddlm} n"| tkrHddlm} nddlm} |S )z)Load QTest module from the loaded QT API.r   )QTest)	r   r&   ZPyQt5.QtTestr`   r%   ZPySide.QtTestr#   ZPySide2.QtTestZPyQt4.QtTest)r'   r`   r   r   r   
load_qtest  s    ra   )r)   )!r"   r   rO   	functoolsr   Zdistutils.versionr   r	   r+   r&   r,   rD   r%   r#   r1   objectr   r$   	meta_pathr;   r(   r   r8   r=   version_infor*   rE   rL   rS   rT   rU   r_   ra   r   r   r   r   <module>
   sD   	((

%
I