
{T4                 @   s   d  d l  Z  d  d l Z d  d l Z d  d l m Z m Z d  d l m Z d  d l m	 Z	 e j
 d e j  Z e j
 d e j  Z e  j e  Z Gd d   d  Z d S)	    N)joinsplit)execute)Versionz
    (?:\#!\s*){0,1}  # shebang prefix
    (?P<path>
        .*?/bin/.*?)?
    (?P<name>
        python|pypy)
    (?P<version>
        \d[\.\d]*)?
    (?P<debug>
        -dbg)?
    (?P<options>.*)
    a-  
    (?P<name>.*?)
    (?:\.
        (?P<stableabi>abi\d+)
     |(?:\.
        (?P<soabi>
            (?P<impl>cpython|pypy)
            -
            (?P<ver>\d{2})
            (?P<flags>[a-z]*?)
        )
        (?:
            -(?P<multiarch>[^/]*?)
        )?
    ))?
    (?P<debug>_d)?
    \.so$c            	   @   sK  e  Z d  Z d Z d Z d Z d Z d Z f  Z i  Z	 d d d d d d d d d  Z
 d d   Z d	 d
   Z d d   Z d d   Z e d d    Z d d d d d  Z d d d  Z d d d  Z d d d  Z d d d  Z d d d  Z d d d  Z d d d   Z d d! d"  Z d d# d$  Z d d% d& d'  Z d S)(InterpreterNpythonFcpythonc             C   s  t    } | d =| d =t | t  rf x | j   D], }	 | |	 d  k r3 t | |	  | |	 <q3 q3 Wn~ | r | j d d  j   r | r t |  | d <q xC |  j |  j	   D]) \ }	 }
 | |	 d  k r |
 | |	 <q q Wn  x* | j	   D] \ }	 }
 t
 |  |	 |
  q Wd  S)Nselfvalue. version)locals
isinstancer   keysgetattrreplaceisdigitr   parseitemssetattr)r	   r
   pathnamer   debugimploptionsZparamskeyval r   +/usr/share/python3/debpython/interpreter.py__init__E   s    	"zInterpreter.__init__c             C   s   | d k ro | ro | j  d  r1 d |  j d <n | j  d  rP d |  j d <n  d | k r d |  j d <q n' | d	 k r | d  k	 r t |  } n  | d k r | d  k r t t |  |  j | <n | |  j | <d  S)Nr   r   r   r   pypyz-dbgTr   r   r   )znamezimplzdebugzoptions)
startswith__dict__r   r   r   )r	   r   r
   r   r   r   __setattr__Z   s    zInterpreter.__setattr__c             C   sO   |  j  p d } | |  j |  j  7} |  j rK | d d j |  j  7} n  | S)Nr    )r   _vstrr   r   r   )r	   resultr   r   r   __repr__j   s
    	zInterpreter.__repr__c             C   s   |  j  |  j  S)N)r&   r   )r	   r   r   r   __str__q   s    zInterpreter.__str__c             C   s_   |  j  d k r |  j S| rX t |  |  j k rX |  j rG d j |  S|  j t |  S|  j S)Nr!   zpython{}-dbg)r   r   strr   format)r	   r   r   r   r   r&   t   s    	zInterpreter._vstrc             C   sR   t  j |   } | s i  S| j   } d | k rN t | d j    | d <n  | S)a  Return dict with parsed shebang

        >>> sorted(Interpreter.parse('pypy').items())
        [('debug', None), ('name', 'pypy'), ('options', ()), ('path', None), ('version', None)]
        >>> sorted(Interpreter.parse('/usr/bin/python3.3-dbg').items())
        [('debug', '-dbg'), ('name', 'python'), ('options', ()), ('path', '/usr/bin/'), ('version', '3.3')]
        >>> sorted(Interpreter.parse('#! /usr/bin/pypy --foo').items())
        [('debug', None), ('name', 'pypy'), ('options', ('--foo',)), ('path', '/usr/bin/'), ('version', None)]
        >>> sorted(Interpreter.parse('#! /usr/bin/python3.2').items())
        [('debug', None), ('name', 'python'), ('options', ()), ('path', '/usr/bin/'), ('version', '3.2')]
        >>> sorted(Interpreter.parse('/usr/bin/python3.2-dbg --foo --bar').items())
        [('debug', '-dbg'), ('name', 'python'), ('options', ('--foo', '--bar')), ('path', '/usr/bin/'), ('version', '3.2')]
        r   )
SHEBANG_REsearch	groupdicttupler   )Zshebangr'   r   r   r   r   ~   s    zInterpreter.parsec             C   s   t  | p |  j  } |  j d k r- d } n@ | t  d  >rJ d | } n# | t  d  >rg d | } n d } | r d | } n  | r d	 | | f } n  | S)
a  Return path to site-packages directory.

        Note that returned path is not the final location of .py files

        >>> i = Interpreter('python')
        >>> i.sitedir(version='3.1')
        '/usr/lib/python3/dist-packages/'
        >>> i.sitedir(version='2.5')
        '/usr/lib/python2.5/site-packages/'
        >>> i.sitedir(version=Version('2.7'))
        '/usr/lib/python2.7/dist-packages/'
        >>> i.sitedir(version='3.1', gdb=True, package='python3-foo')
        'debian/python3-foo/usr/lib/debug/usr/lib/python3/dist-packages/'
        >>> i.sitedir(version=Version('3.2'))
        '/usr/lib/python3/dist-packages/'
        >>> Interpreter('pypy').sitedir(version='2.0')
        '/usr/lib/pypy/dist-packages/'
        r!   z/usr/lib/pypy/dist-packages/z2.6z /usr/lib/python%s/site-packages/z3.0z /usr/lib/python%s/dist-packages/z/usr/lib/python3/dist-packages/z/usr/lib/debug%szdebian/%s%s)r   r   r   )r	   Zgdbpackager   r   r   r   r   sitedir   s    	zInterpreter.sitedirc             C   s   t  | p |  j  } d |  j k r* d n d } | t  d  k rJ | | St |  \ } } | j d  sx | d 7} n  t | d d | d d
  |  j |  | f  S)a  Given path to a .py file, return path to its .pyc/.pyo file.

        This function is inspired by Python 3.2's imp.cache_from_source.

        :param fpath: path to file name
        :param version: Python version

        >>> i = Interpreter('python')
        >>> i.cache_file('foo.py', Version('3.1'))
        'foo.pyc'
        >>> i.cache_file('bar/foo.py', '3.2')
        'bar/__pycache__/foo.cpython-32.pyc'
        z-Oocz3.1z.py__pycache__z
%s.%s.py%sN   )r   r   r   r   endswithr   	magic_tag)r	   Zfpathr   Z	last_charfdirfnamer   r   r   
cache_file   s    zInterpreter.cache_filec             C   s   t  | p |  j  } |  j |  \ } } | j d d  d } | rx | d j |  7} | rx | d j |  7} qx n  |  j r |  j d k r | t  d  >r | d 7} n  d	 j |  S)
z5Return extension name with soname and multiarch tags.r      r   z.{}z-{}r   3Z_dz{}.so)r   r   _get_configr   r+   r   r   )r	   r   r   soabi	multiarchr'   r   r   r   ext_file   s    zInterpreter.ext_filec             C   sT   t  | p |  j  } |  j d k r8 | t  d  >r8 d S|  j d |  } t |  S)zReturn magic number.r   r=   r   z"import imp; print(imp.get_magic()))r   r   r   _executeeval)r	   r   r'   r   r   r   magic_number   s
    zInterpreter.magic_numberc             C   sH   t  | p |  j  } |  j d k r8 | t  d  >r8 d S|  j d |  S)zReturn Python magic tag (used in __pycache__ dir to tag files).

        >>> i = Interpreter('python')
        >>> i.magic_tag(version='3.2')
        'cpython-32'
        r   z3.2r   z import imp; print(imp.get_tag()))r   r   r   rB   )r	   r   r   r   r   r8      s    zInterpreter.magic_tagc             C   s^   t  | p |  j  } y |  j |  \ } } Wn) t k
 rY t j d d d d SYn X| S)zReturn multiarch tag.zcannot get multiarchexc_infoTr   )r   r   r>   	Exceptionlogr   )r	   r   r?   r@   r   r   r   r@      s    	zInterpreter.multiarchc             C   sH   t  | p |  j  } |  j d k rD | t  d  ?rD d j | j  Sd  S)Nr   z3.2zabi{})r   r   r   r+   major)r	   r   r   r   r   	stableabi  s    zInterpreter.stableabic             C   s^   t  | p |  j  } y |  j |  \ } } Wn) t k
 rY t j d d d d SYn X| S)zReturn SOABI flag (used to in .so files).

        >>> i = Interpreter('python')
        >>> i.soabi(version=Version('3.3'))
        'cpython-33m'
        zcannot get soabirE   Tr   )r   r   r>   rF   rG   r   )r	   r   r?   r@   r   r   r   r?   	  s    	zInterpreter.soabic       	      C   s  t  | p |  j  } d | k r< | j d d  \ } } n d } t j |  } | s[ d S| j   } | d ru d St |  d | } | d r d j | d d	 | d d  | _ n  | j r | d
 s d | d p d k r d | _ n  y | j	   \ } } Wn) t
 k
 r0t j d d d d SYn X| d } | j d k ry| j d ?ry| j d  ry| d d  } n  | d s| rd j | | d p|  } | d s| rd j | | d p|  } qn  | d 7} | | k rd St | |  S)a  Return extension file name if file can be renamed.

        >>> i = Interpreter('python')
        >>> i.check_extname('foo.so', version='3.3') # doctest: +ELLIPSIS
        'foo.cpython-33m-....so'
        >>> i.check_extname('foo.abi3.so', version='3.3')
        >>> i.check_extname('foo/bar/bazmodule.so', version='3.3') # doctest: +ELLIPSIS
        'foo/bar/baz.cpython-33m-....so'
        /r<   r   NrI   r   verz{}.{}r   r   dflagsTzcannot get soabi/multiarchrE   r   r   z3.2module   r?   r@   z{}-{}z.soi)r   r   rsplit
EXTFILE_REr-   r.   r   r+   r   r>   rF   rG   r   r7   r   )	r	   r:   r   r9   infoir?   r@   r'   r   r   r   check_extname  s>    


(*	
+"
zInterpreter.check_extnamec             C   s   t  | p |  j  } |  j d k s] |  j d k rf | d ?rG | d >s] | d ?s] | d k rf d } n d } | d 7} |  j | |  j d	  } y t j d
 | d <Wn t k
 r Yn X| S)Nr!   r   z2.6r=   z3.1zimport sysconfig as s;z%from distutils import sysconfig as s;zOprint("__SEP__".join(i or "" for i in s.get_config_vars("SOABI", "MULTIARCH")))Z__SEP__ZDEB_HOST_MULTIARCHr<   )r   r   r   rB   r   osenvironKeyError)r	   r   cmdZ	conf_varsr   r   r   r>   K  s    	
zInterpreter._get_configTc             C   s   t  | p |  j  } d j |  j |  | j d d   } | rb | |  j j k rb |  j j | St |  } | d d k r t j	 | d  t
 d j | | d    n  | d j   } t |  d k r | d } n  | r | |  j j | <n  | S)	Nz
{} -c '{}''
returncoder   stderrz{} failed with status code {}stdoutr<   )r   r   r+   r&   r   	__class___cacher   rG   r   rF   
splitlineslen)r	   commandr   cacheoutputr'   r   r   r   rB   ^  s    'zInterpreter._execute)__name__
__module____qualname__r   r   r   r   r   r   r^   r    r$   r(   r)   r&   staticmethodr   r1   r;   rA   rD   r8   r@   rI   r?   rT   r>   rB   r   r   r   r   r   <   s2   
&1r   )loggingrU   reos.pathr   r   	debpythonr   debpython.versionr   compileVERBOSEr,   rQ   	getLoggerrd   rG   r   r   r   r   r   <module>   s   