ó
    î9bhÍ4  ã                   óð   • S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJ	r	  \R                  " S\R                  5      r\R                  " S\R                  5      r\ R                  " \5      r " S S5      rg)	é    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                   óÔ   • \ rS rSrSrSrSrSrSrSr	0 r
  SS jrS rS	 rS
 rS r\S 5       rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)ÚInterpreteré<   NÚpythonFÚcpython© c                 óÚ  • [        5       nUS	 US	 [        U[        5      (       a,  UR                  5        H  n	X‰   b  M
  [	        X5      X‰'   M     OuU(       an  UR                  SS5      R                  5       (       a  U(       d  [        U5      US'   O3U R                  U5      R                  5        H  u  pšX‰   b  M  X¨U	'   M     UR                  5        H  u  pš[        X	U
5        M     g )NÚselfÚvalueÚ.Ú Úversion)ÚlocalsÚ
isinstancer   ÚkeysÚgetattrÚreplaceÚisdigitr   ÚparseÚitemsÚsetattr)r   r   ÚpathÚnamer   ÚdebugÚimplÚoptionsÚparamsÚkeyÚvals              Ú+/usr/share/python3/debpython/interpreter.pyÚ__init__ÚInterpreter.__init__E   sÂ   € ä“ˆØ�6ˆNØ�7ˆOä�eœ[×)Ñ)Ø—{‘{–}�Ø‘;Ó&Ü")¨%Ó"5�F“Kò %ö Ø�}‰}˜S "Ó%×-Ñ-×/Ñ/¾Ü$+¨E£N��yÒ!à $§
¡
¨5Ó 1× 7Ñ 7Ö 9‘H�CØ‘{Ó*Ø&)˜s›ñ !:ð Ÿ™ž‰HˆCÜ�D˜sÖ#ò 'ó    c                 ór  • US:X  ah  U(       aa  UR                  S5      (       a  SU R                  S'   O%UR                  S5      (       a  SU R                  S'   SU;   a  SU R                  S'   OUS	:X  a  Ub  [        U5      nUS
;   a!  Uc  [        [        U5      U R                  U'   g X R                  U'   g )Nr   r
   r   r   Úpypyz-dbgTr   r   )r   r   r   r    )Ú
startswithÚ__dict__r   r   r   )r   r   r   s      r$   Ú__setattr__ÚInterpreter.__setattr__Z   s£   € Ø�6‹>žeØ×Ñ ×)Ñ)Ø(1�—‘˜fÒ%Ø×!Ñ! &×)Ñ)Ø(.�—‘˜fÑ%Ø˜‹Ø)-�—‘˜gÑ&øØ�YÓ 5Ñ#4Ü˜E“NˆEØÐ7Ó7¸E¹Mä")¬+°tÓ"<ˆD�M‰M˜$Òà"'�M‰M˜$Òr'   c                 óÎ   • U R                   =(       d    SnXR                  U R                  5      -  nU R                  (       a!  USSR	                  U R                  5      -   -  nU$ )Nr   Ú )r   Ú_vstrr   r    r   )r   Úresults     r$   Ú__repr__ÚInterpreter.__repr__j   sL   € Ø—‘—˜bˆØ—*‘*˜TŸ\™\Ó*Ñ*ˆØ�<�<Ø�c˜CŸH™H T§\¡\Ó2Ñ2Ñ2ˆFØˆr'   c                 ó8   • U R                  U R                  5      $ ©N)r0   r   )r   s    r$   Ú__str__ÚInterpreter.__str__q   s   € Ø�z‰z˜$Ÿ,™,Ó'Ð'r'   c                 ó  • U R                   S:X  a  U R                  $ U(       aS  [        U5      U R                  ;  a:  U R                  (       a  SR	                  U5      $ U R                  [        U5      -   $ U R                  $ )Nr)   zpython{}-dbg)r   r   Ústrr   Úformat©r   r   s     r$   r0   ÚInterpreter._vstrt   s_   € Ø�9‰9˜Óà—9‘9ÐÞ”s˜7“|¨4¯9©9Ó4Ø�z�zØ%×,Ñ,¨WÓ5Ð5Ø—9‘9œs 7›|Ñ+Ð+Ø�y‰yÐr'   c                 ó¬   • [         R                  U 5      nU(       d  0 $ UR                  5       nSU;   a  [        US   R	                  5       5      US'   U$ )aS  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   )Úshebangr1   s     r$   r   ÚInterpreter.parse~   sT   € ô  ×"Ñ" 7Ó+ˆÞØˆIØ×!Ñ!Ó#ˆØ˜Óä % f¨YÑ&7×&=Ñ&=Ó&?Ó @ˆF�9ÑØˆr'   c                 ó  • [        U=(       d    U R                  5      nU R                  S:X  a  SnO4U[        S5      -  (       a  SU-  nOU[        S5      -  (       a  SU-  nOSnU(       a  SU-  nU(       a	  S	U< U< 3nU$ )
ag  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/ú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/)r   r   r   )r   ÚgdbÚpackager   r   s        r$   ÚsitedirÚInterpreter.sitedir—   sz   € ô& ˜'×1 T§\¡\Ó2ˆð �9‰9˜ÓØ1‰DØœ ›×&Ø5¸Ñ?‰DØœ ›×&Ø5¸Ñ?‰Dà4ˆDæØ%¨Ñ,ˆDßÚ$+ªTÐ2ˆDàˆr'   c           	      ó0  • [        U=(       d    U R                  5      nSU R                  ;   a  SOSnU[        S5      ::  a  X-   $ [        U5      u  pEUR	                  S5      (       d  US-  n[        USUSS < S	U R                  U5      < SU< 35      $ )
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Úcú3.1z.pyÚ__pycache__Néýÿÿÿr   )r   r   r    r   Úendswithr   Ú	magic_tag)r   Úfpathr   Ú	last_charÚfdirÚfnames         r$   Ú
cache_fileÚInterpreter.cache_file½   s�   € ô ˜'×1 T§\¡\Ó2ˆØ 4§<¡<Ó/‘C°Sˆ	Ø”g˜e“nÓ$ØÑ$Ð$ä˜E“l‰ˆØ�~‰~˜e×$Ñ$Ø�U‰NˆEÜ�D˜-Ø˜3˜B“Z §¡°Ö!8º)ð*Eó Fð 	Fr'   c                 óŽ  • [        U=(       d    U R                  5      nU R                  U5      u  p4UR                  SS5      S   nU(       a/  USR	                  U5      -  nU(       a  USR	                  U5      -  nU R
                  (       a(  U R                  S:X  a  U[        S5      -  (       a  US-  nS	R	                  U5      $ )
z5Return extension name with soname and multiarch tags.r   é   r   z.{}z-{}r   Ú3Ú_dz{}.so)r   r   Ú_get_configr   r:   r   r   )r   r   r   ÚsoabiÚ	multiarchr1   s         r$   Úext_fileÚInterpreter.ext_fileÖ   sŸ   € ä˜'×1 T§\¡\Ó2ˆØ×+Ñ+¨GÓ4ÑˆØ—‘˜C Ó# AÑ&ˆÞØ�e—l‘l 5Ó)Ñ)ˆFÞØ˜%Ÿ,™, yÓ1Ñ1�Ø�:�:˜$Ÿ)™) yÓ0Øœw s›|×+Ø�d‰NˆFØ�~‰~˜fÓ%Ð%r'   c                 óÀ   • [        U=(       d    U R                  5      nU R                  S:X  a  U[        S5      -  (       a  gU R                  SU5      n[	        U5      $ )zReturn magic number.r   rZ   r   z9import importlib.util; print(importlib.util.MAGIC_NUMBER))r   r   r   Ú_executeÚeval)r   r   r1   s      r$   Úmagic_numberÚInterpreter.magic_numberä   sK   € ä˜'×1 T§\¡\Ó2ˆØ�9‰9˜	Ó! g´¸³×&=ØØ—‘ÐZÐ\cÓdˆÜ�F‹|Ðr'   c                 óª   • [        U=(       d    U R                  5      nU R                  S:X  a  U[        S5      -  (       a  gU R                  SU5      $ )z‹Return Python magic tag (used in __pycache__ dir to tag files).

>>> i = Interpreter('python')
>>> i.magic_tag(version='3.2')
'cpython-32'
r   ú3.2r   z/import sys; print(sys.implementation.cache_tag))r   r   r   rb   r;   s     r$   rQ   ÚInterpreter.magic_tagì   sD   € ô ˜'×1 T§\¡\Ó2ˆØ�9‰9˜	Ó! g´¸³×&?ØØ�}‰}ÐNÐPWÓXÐXr'   c                 ó²   • [        U=(       d    U R                  5      n U R                  U5      u  p#U$ ! [         a    [        R                  SSS9   gf = f)zReturn multiarch tag.zcannot get multiarchT©Úexc_infor   ©r   r   r\   Ú	ExceptionÚlogr   ©r   r   r]   r^   s       r$   r^   ÚInterpreter.multiarchø   sZ   € ä˜'×1 T§\¡\Ó2ˆð	Ø#×/Ñ/°Ó8ÑˆEð
 Ðøô	 ó 	Ü�I‰IÐ,°tˆIÑ<áð	úó    5 µAÁAc                 ó¾   • [        U=(       d    U R                  5      nU R                  S:X  a/  U[        S5      -	  (       a  SR                  UR                  5      $ g g )Nr   rg   zabi{})r   r   r   r:   Úmajorr;   s     r$   Ú	stableabiÚInterpreter.stableabi  sH   € Ü˜'×1 T§\¡\Ó2ˆà�9‰9˜	Ó! g´¸³×&?Ø—>‘> '§-¡-Ó0Ð0ð '@Ð!r'   c                 ó²   • [        U=(       d    U R                  5      n U R                  U5      u  p#U$ ! [         a    [        R                  SSS9   gf = f)z{Return SOABI flag (used to in .so files).

>>> i = Interpreter('python')
>>> i.soabi(version=Version('3.3'))
'cpython-33m'
zcannot get soabiTrj   r   rl   ro   s       r$   r]   ÚInterpreter.soabi	  s[   € ô ˜'×1 T§\¡\Ó2ˆð	Ø#×/Ñ/°Ó8ÑˆEð
 ˆøô	 ó 	Ü�I‰IÐ(°4ˆIÑ8áð	úrq   c                 ó–  • [        U=(       d    U R                  5      nSU;   a  UR                  SS5      u  p1OSn[        R	                  U5      nU(       d  gUR                  5       nUS   (       a  g[        XS9nUS   (       a#  SR                  US   S	   US   S   5      Ul        UR                  (       d#  US
   (       d  SUS   =(       d    S;   a  SUl         UR                  5       u  pgUS   nUR                  S:X  a/  UR                  S-	  (       a  UR                  S5      (       a  USS nUS   (       d  U(       aK  SR                  X„S   =(       d    U5      nUS   (       d  U(       a  SR                  X„S   =(       d    U5      nUS-  nX:X  a  g[        X85      $ ! [         a    [        R                  SSS9   gf = f)aP  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'
Ú/rY   r   Nrt   )r   Úverz{}.{}r   r   ÚdÚflagsTzcannot get soabi/multiarchrj   r   r   rg   Úmoduleiúÿÿÿr]   r^   z{}-{}z.so)r   r   ÚrsplitÚ
EXTFILE_REr?   r@   r   r:   r   r\   rm   rn   r   rP   r   )	r   rU   r   rT   ÚinfoÚir]   r^   r1   s	            r$   Úcheck_extnameÚInterpreter.check_extname  sŒ  € ô ˜'×1 T§\¡\Ó2ˆà�%‹<ØŸ,™, s¨AÓ.‰KˆD�%àˆDä× Ñ  Ó'ˆÞØØ�~‰~Óˆà�×àä˜Ñ.ˆØ��;ØŸ™ t¨E¡{°1¡~°t¸E±{À1±~ÓFˆAŒIØ�w�w˜D ŸM¨S°T¸'±]×5HÀbÓ-IØˆAŒGð	Ø Ÿ}™}›ÑˆEð �f‘ˆØ�6‰6�YÓ 1§9¡9°×#5¸&¿/¹/È(×:SÑ:SØ˜C˜R�[ˆFØ��=žEØ—^‘^ F°©M×,B¸UÓCˆFØ�K× ¦IØ Ÿ™¨°[Ñ0A×0NÀYÓO�à�%‰ˆØ‹?ØÜ�DÓ!Ð!øô ó 	Ü�I‰IÐ2¸TˆIÑBÙð	ús   ÃF' Æ'GÇGc                 ón  • [        U=(       d    U R                  5      nU R                  S:X  d4  U R                  S:X  a'  US-	  (       a
  US-  (       d  US-	  (       d  US:X  a  SnOSnUS-  nU R                  X!5      R	                  S	5      n [
        R                  S
   US'   U$ ! [         a     U$ f = f)Nr)   r   rE   rZ   rM   z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")))Ú__SEP__ÚDEB_HOST_MULTIARCHrY   )r   r   r   rb   r   ÚosÚenvironÚKeyError)r   r   ÚcmdÚ	conf_varss       r$   r\   ÚInterpreter._get_configK  s¸   € Ü˜'×1 T§\¡\Ó2ˆð �9‰9˜Ó $§)¡)¨yÓ"8Ø˜5×  W°§^Ø˜e×# w°#£~Ø*‰Cà9ˆCØð Dñ 	Dˆà—M‘M #Ó/×5Ñ5°iÓ@ˆ	ð	ÜŸ:™:Ð&:Ñ;ˆI�a‰Lð Ðøô ó 	ØØÐð	ús   ÂB& Â&
B4Â3B4c                 óú  • [        U=(       d    U R                  5      nU R                  U5      SU4nU(       a2  XR                  R                  ;   a  U R                  R                  U   $ [        U5      nUS   S:w  a5  [        R                  US   5        [        SR                  XS   5      5      eUS   R                  5       n[        U5      S:X  a  US   nU(       a  XPR                  R                  U'   U$ )Nz-cÚ
returncoder   Ústderrz{} failed with status code {}ÚstdoutrY   )r   r   r0   Ú	__class__Ú_cacher   rn   r   rm   r:   Ú
splitlinesÚlen)r   Úcommandr   ÚcacheÚoutputr1   s         r$   rb   ÚInterpreter._execute^  sØ   € Ü˜'×1 T§\¡\Ó2ˆØ—:‘:˜gÓ&¨¨gÐ6ˆÞ�W§¡× 5Ñ 5Ó5Ø—>‘>×(Ñ(¨Ñ1Ð1ä˜Ó!ˆØ�,Ñ 1Ó$Ü�I‰I�f˜XÑ&Ô'ÜÐ;×BÑBÀ7ÐS_ÑL`ÓaÓbÐbà˜Ñ!×,Ñ,Ó.ˆäˆv‹;˜!ÓØ˜A‘YˆFæØ-3�N‰N×!Ñ! 'Ñ*àˆr'   )NNNNNNN)FNNr5   )NT)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r   r   r   r    r’   r%   r,   r2   r6   r0   Ústaticmethodr   rH   rV   r_   rd   rQ   r^   rt   r]   r‚   r\   rb   Ú__static_attributes__r   r'   r$   r   r   <   s“   † Ø€DØ€DØ€GØ€EØ€DØ€GØ€FàAEØ04ô$ò*(ò ò(òð ñó ðô0$ôLFô2&ôô
Yô	ô1ôô"/"ôb÷&r'   r   )Úloggingr‡   ÚreÚos.pathr   r   Ú	debpythonr   Údebpython.versionr   ÚcompileÚVERBOSEr>   r   Ú	getLoggerr™   rn   r   r   r'   r$   Ú<module>r§      sq   ðó* Û 	Û 	ß Ý Ý %à�ZŠZð ð 
�‰ó€
ð �ZŠZð ð  �j‰jó!€
ð" ×Ò˜Ó!€÷uò ur'   