3
^J                 @   sB  d Z ddlZddlZddlZddlmZ dZd	d
 Zdd Zdd Z	dd Z
i Zi Zi Zi ZejdkrddlZejjZe	eZnddlZej Ze	eZedd edd edd edd edd edd edd  ed!d" ed#d$ ed%d& ed'd& ed(d) ed*d+ ed,d- ed.d/ ed0d/ ed1d/ ed2d/ ed3d4 ed5d4 ed6d7 ed8d9 ed:d; ed<d= ed>d? ed@dA edBdC edDdE edFdG edHdI edJdK eddM edNdO edPdQ edRdS edTdU edVdW edXdY edZd[ ed\d] ed^d_ ed`da edbdc eddde edfdg edhdi edjdk edldm edndo edpdq edrds edtdu eddv edwdx edydz ed{d| ed}d~ edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd edd eddÃ eddŃ eddu eddƃ eddǃ eddȃ eddɃ edd˃ edd̓ e
eZi Zddτ Zedd edd  edd" edd$ edd& edd- edd9 edd? eddI eddk eddo eddu edd edd edd edd edd edd edd eddM edd˃ eddv eddƃ eddǃ eddɃ edd̓ edd edd edd eddÃ eddŃ xej D ]Zeee< qW eej Zdd Zdd Z dd Z!ejfddZ"ejfddZ#dd Z$e%dkr>e$  dS )uh  
Everything you ever wanted to know about Python versions and their
magic numbers. And a little bit more...

by_magic: in this dictionary, the key is a magic byte string like
# b'ó
' and its value is a canonic version string, like
# '2.7'

by_version: in this dictionary, the key is a canonic version string like '2.7,
and its value is a magic byte string like b'ó
' canonic
name, like '2.7'

magicint2version:  in this dictionary, the key is an magic integer, e.g. 62211,
and the value is its canonic versions string, e.g. '2.7'

PYTHON_MAGIC_INT: The magic integer for the current running Python interpreter
    N)IS_PYPY0   @   p         c             C   s   |t | < |tt| < d S )N)magicint2versionversions	int2magic)	magic_intversion r   H/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/xdis/magics.pyadd_magic_from_int)   s    r   c             C   sR   | dkrt jd| d S tjdkr>t jd| tdd	td
d	S t jd| dd
S dS )u   Given a magic int like 62211, compute the corresponding magic byte string
     b'ó
' using the conversion method that does this.

    See also dictionary magic2nt2version which has precomputed these values
    for knonwn magic_int's.
        z<Hs       r   z<Hcczutf-8
N)r   r   )r   r   )structpacksysversion_infobytes)r   r   r   r   r
   .   s    
r
   c             C   s   t jd| d S )u  Given a magic byte string, e.g. b'ó
', compute the
    corresponding magic integer, e.g. 62211, using the conversion
    method that does this.

    See also dictionary magic2nt2version which has precomputed these values
    for knonwn magic_int's.

    z<Hccr   )r   unpack)magicr   r   r   	magic2int@   s    	r   c             C   sL   xFt | j D ]6\}}|tkr.t|gt|< nt| j| |t|< qW tS )N)listitemsby_magicsetadd
by_version)magicsmvr   r   r   __by_versionL   s    r&   r      i  z1.0i  z1.1i.  z1.3i  z1.4iN  z1.5i  z1.6i  z2.0i*  z2.1i-  z2.2i;  z2.3a0iE  iY  z2.4a0ic  z2.4a3im  z2.4b1iw  z2.5a0i  i  i  i  z2.5b3i  i  z2.5c1i  z2.5c2i  z
2.5dropboxi  z2.6a0i  z2.6a1i  z2.7a0i  z2.7a0+1i  z2.7a0+2i  z2.7a0+3i  z2.7ia
  z2.7pyston-0.6.1   z2.7pypyi  z3.000i  z3.000+1i  z3.000+2i  z3.000+3i  z3.000+4i  z3.000+5i  z3.000+6i  z3.000+7i  z3.000+8i	  z3.000+9i  z3.000+10i  z3.000+11i  z3.000+12i'  z3.0a4i;  z3.0a5iE  z3.1a0iO  z3.1a0+iX  z3.2a0ib  z3.2a1il  z3.2a2z3.2pypyiv  z3.3a0i  z3.3a0+i  z3.3a1i  z3.3a2i  z3.3a4i  z3.4a1i  z3.4a1+1i  z3.4a1+2i  z3.4a1+3i  z3.4a4i  z3.4a4+i  z3.4rc2i  z3.5a0i  z3.5b1i  z3.5b2i  z3.5i  z3.5.2i   z3.6a0i!  z3.6a0+1i*  z3.6a1i+  z3.6a1+1i,  z3.6a1+2i-  z3.6b1i/  z3.6b1+1i0  z3.6b1+2i1  z3.6b1+3i2  z3.6b2i3  z3.6rc1i>  z3.7.0alpha0i?  z3.7.0alpha3i@  z
3.7.0beta2iA  z
3.7.0beta3iB  z3.7.0iH  z3.8.0a1iI  z3.8.0a3+iR  z3.8.0a1+iS  iT  z
3.8.0beta2iU  z	3.8.0rc1+i^  z3.9.0alpha1z3.3pypyz3.5pypyz	3.6.1pypyz3.6pypyi  z2.7.1b3JythonizV  z2.7.7Pystonc             C   sL   xF| j  D ]:}|t|< t| t|< yt| tt|< W q
   Y q
X q
W d S )N)splitcanonic_python_versionr#   float)r	   Zcanonicr%   r   r   r   add_canonic_versions;  s    r,   z1.5.1 1.5.2z2.0.1z2.1.1 2.1.2 2.1.3z2.2.3z	2.3 2.3.7z'2.4 2.4.0 2.4.1 2.4.2 2.4.3 2.4.5 2.4.6z-2.5 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6z2.6 2.6.6 2.6.7 2.6.8 2.6.9z2.7.0 2.7.1 2.7.2 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 2.7.10 2.7.11 2.7.12 2.7.13 2.7.14 2.7.15 2.7.15candidate1 2.7.16 2.7.17rc1 2.7.17candidate1 2.7.17 2.7.18z3.0 3.0.0 3.0.1z'3.1 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5z-3.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6z<3.3 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7rc1 3.3.7zF3.4 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 3.4.9 3.4.10z3.5 3.5.0 3.5.1z/3.5.2 3.5.3 3.5.4 3.5.5 3.5.6 3.5.7 3.5.8 3.5.9zL3.6b2 3.6 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.6.9 3.6.10z3.7b1z3.8a1z2.7.10pypy 2.7.13pypyz2.7.3b0Jythonz	3.2.5pypyz	3.3.5pypyz	3.5.3pypyz	3.6.9pypyz2.7.8Pystonz83.7 3.7.0beta5 3.7.1 3.7.2 3.7.3 3.7.4 3.7.5 3.7.6 3.7.7z3.8.0alpha0 3.8.0alpha3 3.8.0a0z13.8b4 3.8.0candidate1 3.8 3.8.0 3.8.1 3.8.2 3.8.3z33.9 3.9.0 3.9.0a1+ 3.9.0a2+ 3.9.0alpha1 3.9.0alpha2c             C   s    t | tjd|tjd| d S )NZBBBBz<HBB)printr   r   )textr   r   r   r   __show  s    r/   c             C   s   t t|  S )a<  Convert a Python magic int into a 'canonic' floating-point number,
    e.g. 2.7, 3.7. runtime error is raised if "version" is not found.

    Note that there can be several magic_int's that map to a single floating-
    point number. For example 3320 (3.5.a0), 3340 (3.5b1), and 3351 (3.5.2)
    all map to 3.5.
    )py_str2floatr   )r   r   r   r   magic_int2float  s    r1   c             C   s   t jdd| }|tkrt| }xttj D ]\}}||kr,ytt| S    yTt jd|}|rzt|jd|jd S t jd|}|rt|jd|jd S W n   Y nX Y q,X q,W t	d|  dS )	aA  Convert a Python version into a two-digit 'canonic' floating-point number,
    e.g. 2.5, 3.6.

    A runtime error is raised if "version" is not found.

    Note that there can be several strings that map to a single floating-
    point number. For example 3.2a1, 3.2.0, 3.2.2, 3.2.6 among others all map to
    3.2.
    z(pypy|dropbox)$ z^(\d\.)(\d+)\.(\d+)      z^(\d\.)(\d)(\d+)?[abr]z0Can't find a valid Python version for version %sN)
resubr#   r   r   r+   r*   matchgroupRuntimeError)Zorig_versionr   r   r%   r$   r   r   r   r0     s.    

r0   c             C   s   dj dd | dd D }| d dkrL|ddj dd | dd	 D  7 }trZ|d
7 }nLy$dd	l}|j }|dkr|||7 }W n& tk
r   Y n tk
r   Y nX t|S )a  Convert a sys.versions_info-compatible list into a 'canonic'
    floating-point number which that can then be used to look up a
    magic number.  Note that this can only be used for released version
    of C Python, not interim development versions, since we can't
    represent that as a floating-point number.

    For handling Pypy, pyston, jython, etc. and interim versions of
    C Python, use sysinfo2magic.
    .c             S   s   g | ]}t |qS r   )str).0r%   r   r   r   
<listcomp>  s    z!sysinfo2float.<locals>.<listcomp>r   r   finalr2   c             S   s   g | ]}t |qS r   )r;   )r<   ir   r   r   r=     s    NpypyJythonPyston)rA   rB   )joinr   platformpython_implementationImportErrorAttributeErrorr0   )r   vers_strrD   r   r   r   sysinfo2float  s     
$
rI   c             C   s   dj dd | dd D }| d dkrH|dj dd | dd	 D 7 }trV|d
7 }n:y$dd	l}|j }|dkrx||7 }W n tk
r   Y nX t| S )zConvert a list sys.versions_info compatible list into a 'canonic'
    floating-point number which that can then be used to look up a
    magic number.  Note that this can raise an exception.
    r:   c             S   s   g | ]}t |qS r   )r;   )r<   r%   r   r   r   r=     s    z!sysinfo2magic.<locals>.<listcomp>r   r   r>   r2   c             S   s   g | ]}t |qS r   )r;   )r<   r%   r   r   r   r=     s    Nr@   rA   rB   )rA   rB   )rC   r   rD   rE   rF   r#   )r   rH   rD   r   r   r   sysinfo2magic  s     
rJ   c              C   sv   t d } tt }tt| t| t|  t  td| tdt tt| t| t|  tt  t	 tksrt
d S )Nz2.0z#This Python interpreter has versionzMagic code: )r#   r   MAGICr-   typelenreprPYTHON_MAGIC_INTrI   rJ   AssertionError)Zmagic_20Zmagic_currentr   r   r   test  s    


rQ   __main__)r   r   r   r   r   )r   r'   i
  is  )&__doc__r5   r   r   xdisr   ZIS_PYPY3r   r
   r   r&   r   r"   r   r	   r   	importlibutilMAGIC_NUMBERrK   rO   imp	get_magicr#   r*   r,   valuesr%   r    keysZpython_versionsr/   r1   r0   rI   rJ   rQ   __name__r   r   r   r   <module>!   s^  


























































































































'!
