
    ` IeK                        d Z ddlmZ ddlZddlZddlmZ ddlZddl	Z	ddl
Z
ddl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mZmZmZ ddlmZmZmZmZmZ  G d de      Z d Z!d	 Z"d
 Z#d Z$d Z%ejL                  dk(  rdZ'ndZ'ddde'z  dfde'z  dfdde'z  dfdddddddZ(d Z)d Z*d Z+d Z,d Z-d Z.d8dZ/d  Z0 G d! d"e1      Z2 e2       Z3e3ji                          d# Z5e6d$k(  rddl7Z7d%ejp                  js                  d&d&      d%d'gd(Z: e7jv                  d)d*d+      Z<d,d-d%d.g d/d0dgd%e<e:gd0dfe:d1ejp                  js                  d2d3       ejz                  g       e< e7jn                  d)d*d+      d4
Z>ddl?Z? e?j~                         Z@ e-e>d5        eAd6 e?j~                         e@z
  z          e?j~                         Z@ e0d5      \  ZBZC ej                  d5        eAd7 e?j~                         e@z
  z         yy)9z
Input/Output Utilities

Note: 'load' functions has to return a dictionary from which a globals()
      namespace may be updated
    )print_functionN)getcwdpicklePY2to_text_string)
FakeObjectnumpypandasPILscipyc                   b    e Zd ZdZd Zd Zd Zej                  Z	ej                  Zed        Zy)MatlabStructa  
    Matlab style struct, enhanced.

    Supports dictionary and attribute style access.  Can be pickled,
    and supports code completion in a REPL.

    Examples
    ========
    >>> from spyder.utils.iofuncs import MatlabStruct
    >>> a = MatlabStruct()
    >>> a.b = 'spam'  # a["b"] == 'spam'
    >>> a.c["d"] = 'eggs'  # a.c.d == 'eggs'
    >>> print(a)
    {'c': {'d': 'eggs'}, 'b': 'spam'}

    c                 H    	 | |   S # t         $ r d|z  }t        |      w xY w)z2Access the dictionary keys for unknown attributes.z)'MatlabStruct' object has no attribute %s)KeyErrorAttributeError)selfattrmsgs      >/usr/lib/python3/dist-packages/spyder_kernels/utils/iofuncs.py__getattr__zMatlabStruct.__getattr__7   s5    	&: 	&=DC %%	&s    !c                    || j                         v s|j                  d      rt        j                  | |      S t	        j
                         }|j                  j                  rE| j                  |j                  j                        r t        j                  | |t                      n:| j                  |j                        rt        j                  | |t                      t        j                  | |      S )z
        Get a dict value; create a MatlabStruct if requesting a submember.

        Do not create a key if the attribute starts with an underscore.
        _)
keys
startswithdict__getitem__inspectcurrentframef_back_is_allowed__setitem__r   )r   r   frames      r   r   zMatlabStruct.__getitem__?   s     499;$//#"6##D$//$$&<<4#3#3ELL4G4G#HT48ell+T48d++    c                 
   t         j                  d   t         j                  d   t         j                  j                  dd      g}|j                  j                  }||j
                  dz      }t        rt        |      n|}||v S )z.Check for allowed op code in the calling frame
STORE_ATTR
LOAD_CONST	STOP_CODEr      )disopmapgetf_codeco_codef_lastir   ord)r   r"   allowedbytecodeinstructions        r   r    zMatlabStruct._is_allowedO   sm    99\*CIIl,C99==a02<<''u}}q01*-c+&;g%%r#   c                 "    | j                         S )z#Allow for code completion in a REPL)copyr   s    r   __dict__zMatlabStruct.__dict__[   s     yy{r#   N)__name__
__module____qualname____doc__r   r   r    r   r!   __setattr____delitem____delattr__propertyr6    r#   r   r   r   &   s@     &, & ""K""K r#   r   c                    t        | t              r| D cg c]  }t        |       c}S t        | t        j                        s| S t        | d      rut               }| j                  j                  D ]/  }t        | |   j                         j                               ||<   1 t        | j                  t        f|      } |       S | j                  j                  rVt               }| j                  j                  D ]/  }t        | |   j                         j                               ||<   1 |} | S | j                  j                  dk(  r>| j                         j                         } t        | t              s| g} t        |       } | S | j                   dk(  r| j#                         } | S | j                   dk(  r| j                  j                  dv rd} | S g } | S c c}w )z
    Extract a value from a Matlab file

    From the oct2py project, see
    https://pythonhosted.org/oct2py/conversions.html
    	classnameO   r   US )
isinstancelistget_matlab_valuenpndarrayhasattrr   dtypenamessqueezetolisttyperA   objectr   kindsizeitem)valvoutnameclss        r   rH   rH   a   s    #t-01 #11 c2::&
 sK fIIOO 	GD(T):):)<)C)C)EFCI	G3==6)S1u 
nIIOO 	GD(T):):)<)C)C)EFCI	G( J# 
3	kkm""$#t$%Cs# J 
Qhhj J 
Q99>>T!C J CJO 2s   Gc                 "   t         j                  t        u ry	 t         j                  j                  | d      }t	               }|j                         D ]  \  }}t        |      ||<    |d fS # t        $ r}d t        |      fcY d }~S d }~ww xY w)NNrE   T)struct_as_record)	spior   loadmatr   itemsrH   	Exceptionstr)filenamerW   datakeyvalueerrors         r   load_matlabrh      s    	uu
 eemmHtm<vIIK 	0LS%(/DI	0Tz  SZ s   AA. .	B7B	B	Bc                     t         j                  t        u ry 	 t         j                  j                  || d       y # t        $ r}t        |      cY d }~S d }~ww xY w)Nrow)oned_as)r]   r^   r   savematra   rb   )rd   rc   rg   s      r   save_matlabrm      sF    	uu

he4 5zs   "< 	A
AAAc                    t         j                  t        u ry	 t        j                  t        j
                  |             d   }t        j                  |       }t        |t         j                  j                  j                        rt        |      d fS t        |d      r|d fS ||id fS # t        $ r}d t        |      fcY d }~S d }~ww xY w)Nr[   r   r   )rI   loadr   ospsplitextbasenamerF   libnpyioNpzFiler   rK   ra   rb   )rc   rX   rd   rg   s       r   
load_arrayrv      s    	ww*
 ||CLL23A6wwx dBFFLL001:t##T6":$<%%  SZ s*   A:B* B* $B* *	C
3C?C
C
c                 B    |d|z  z   }t        j                  ||        |S )zSave numpy arrayz	_%04d.npy)rI   save)rd   rr   indexfnames       r   __save_arrayr{      s$    {U**EGGE4Lr#   little<>)z|b1N)|u1Nz%si4z%sf4)z|u2Nz%si2)r   r(   )r      )1LIFzI;16zI;16SPRGBRGBXRGBACMYKYCbCrc                    t         j                  j                  |       }	 t        |j                     \  }}|j                  d   |j                  d   f}|||fz  }t        j                  |j                         t        j                  |            j                  |      S # t
        $ r t        d|j                  z        w xY w)Nz%s mode is not supportedrC   r   )rL   )r   ImageopenDTYPESmoder   RuntimeErrorrS   rI   arraygetdatarL   reshape)rc   imgrL   extrashapes        r   __image_to_arrayr      s    
))..
"CBchh'u XXa[#((1+&E%88CKKM%9AA%HH  B5@AABs   B$ $"Cc                    t         j                  t        u st        j                  t        u ry	 t        j                  t        j                  |             d   }|t        |       id fS # t        $ r}d t        |      fcY d }~S d }~ww xY w)Nr[   r   )r   r   r   rI   r   rp   rq   rr   r   ra   rb   )rc   rX   rg   s      r   
load_imager      sr    
yyJ"((j"8 ||CLL23A6&x01477  SZ s   9A) )	B	2B>B	B	c                    	 t         j                  t        urt        j                  |       dfS t        | d      5 }t	        j
                  |      }ddd       dfS # 1 sw Y   xY w# t        $ r}dt        |      fcY d}~S d}~ww xY w)z"Load a pickle file as a dictionaryNrb)pdread_pickler   r   r   ro   ra   rb   )rc   fidrd   errs       r   load_pickler      s    >>+>>(+T11h% ({{3'(:( (  SX~s9   ,A) A) AA) A&"A) )	B	2B>B	B	c                     	 t         rd}nd}t        | |      5 }t        j                  |      }ddd       dfS # 1 sw Y   xY w# t        $ r}dt        |      fcY d}~S d}~ww xY w)z Load a json file as a dictionaryr   rN)r   r   jsonro   ra   rb   )rc   argsr   rd   r   s        r   	load_jsonr      sk    	DD(D! 	"S99S>D	"Tz	" 	"  SX~s1   A ;A A A 	A'A"A'"A'c           	      "
   t        j                  |      }t               }t        j                  t        j
                  |             d}g }i }	 | j                         D ]E  \  }}t        |      rt        |t        j                        r-	 t        j                  |      ||<   G |} | st        d      i }t         j"                  t$        urt        j&                  |      d   }	t)        | j+                               D ]v  }
	 t        | |
   t         j"                        rW| |
   j,                  dkD  rEt/        | |
   |	t1        |            }t        j2                  |      ||
df<   | j5                  |
       nt        | |
   t(        t6        f      rt        | |
   t(              rt9        | |
         }n%t;        t)        | |
   j                                     }g }|D ]q  \  }}t        |t         j"                        s!|j,                  dkD  s1t/        ||	t1        |            }t        j2                  |      ||
|f<   |j                  |       s t=        |d      D ]  }| |
   j5                  |        y |r|| d<   t        j&                  |      d   dz   }tI        |d      5 }	 t?        jJ                  | |d	
       ddd       tQ        jH                  |dtP        jR                        5 }|gt)        |jU                               D cg c]  }| c}z   D ];  }|jW                  t        j2                  |             t        jX                  |       = 	 ddd       |r%|j[                          ddj]                  |      z   }	 t        j                  |       |S # t        $ r |j                  |       Y _w xY w# t        t>        j@                  tB        tD        tF        f$ r Y w xY w# t>        j@                  tD        tB        tL        tF        t        f$ r i }| j                         D ]B  \  }}	 t?        jN                  |d	
       |||<   $# t        $ r |j                  |       Y @w xY w |st        d      t?        jJ                  ||d	
       Y w xY w# 1 sw Y   xY wc c}w # 1 sw Y   ZxY w# t        t>        j@                  tB        f$ r}t_        |      }Y d}~ed}~ww xY w# t        j                  |       w xY w)z.Save dictionary in a single file .spydata fileNzNo supported objects to saver   T)reverse__saved_arrays__.picklezw+b   )protocolw)formatz!Some objects could not be saved: z, )0rp   abspathr   oschdirdirnamer`   callablerF   types
ModuleTyper4   deepcopyra   appendr   rI   rJ   r   rq   rG   r   rS   r{   lenrr   popr   	enumerateitersortedr   PicklingError	TypeErrorr   
IndexErrorr   dumpImportErrordumpstarfile
PAX_FORMATvaluesaddremovesortjoinr   )rd   rc   old_cwderror_messageskipped_keys	data_copyobj_name	obj_valuesaved_arrays	arr_fnamerX   rz   iterator	to_removery   rf   pickle_filenamefdescdata_filteredtarfnrg   s                         r   save_dictionaryr     sy   {{8$HhGHHS[["#MLI\#'::< 	2Hi
 Y':i6;6F6F,H2*.--	*BIh'	2 =>>::Z'X.q1ITYY[) "4:rzz: JOOa/ ,T$Z-0->!@58\\%5HdD\2#DJt=%d4j$7'0d'<H'+Dd1A1A1C,D'EH$&	,4 8LE5 *5"** =$)JJN(4UI585F)H %(LL$7 !-dE] ; ) 0 0 78 &,It%D 2E JNN5121> +7'(,,x03i? /5) 	>U>D%!4	>& \\(C0B0BC 	!s*+*.|/B/B/D*EFBRFG !U+,		% !	! @#yy67M 	a ! 2 ''12H %f&:&:I&
4  	 ((.)\; > "+/::< <'Hi<Y; 3<h/ % 6$++H56< %&'EFFM51==>	> 	>* G	! 	!
 &..	: .&u-. 	s  !S  1S  N!%AS  C8O>OA)O71S  (R!*O1.S  0R3	R.AR3S  #'S7 !N?;S  >N??S  (O.*S  -O..S  1AR7QRQ1	.R0Q1	1)RR!RR!!R+&S  .R33R=8S   S4S/)S7 /S44S7 7Tc                     t         j                  j                  |       }t         j                  j                  |      }t         j                  j                  ||g      }||k(  S )z&Check if a file is within a directory.)r   pathr   commonprefix)	directorytargetabs_directory
abs_targetprefixs        r   is_within_directoryr   t  sJ    GGOOI.M(JWW!!=*"=>F]""r#   c                    | j                         D ]e  }t        j                  j                  ||j                        }t        ||      r:t        dj                  t        | j                                     | j                  |||       y)zSafely extract a tar file.z'Attempted path traversal in tar file {})numeric_ownerN)

getmembersr   r   r   rX   r   ra   r   repr
extractall)r   r   membersr   membermember_paths         r   safe_extractr   |  st    .." ggll45"459@@N  NN4N>r#   c                    t        j                  |       } t               }t        j                         }t        j                  |       d}d}	 t        j                  | d      5 }t        r|j                          nt        |       ddd       t        j                  d      d   }t        |d      5 }t        j                  |j                               }ddd       i }t         j"                  t$        ur	 |j'                  d      }t)        |j+                               D ]l  \  \  }	}
}t!        j"                  t        j,                  ||      d      }|
|||	<   <t/        ||	   t0              r	|||	   |
<   X||	   j3                  |
|       n 	 t        j                  |       	 t?        j@                  |       ||fS # 1 sw Y   <xY w# 1 sw Y   xY w# t4        $ r Y Sw xY w# t6        t8        t:        f$ r}t=        |      }Y d}~{d}~ww xY w# tB        $ r}t=        |      }Y d}~||fS d}~ww xY w# t        j                  |       	 t?        j@                  |       w # tB        $ r}t=        |      }Y d}~w d}~ww xY wxY w)	z"Load dictionary from .spydata fileNr   z*.pickler   r   r   T)allow_pickle)"rp   r   r   tempfilemkdtempr   r   r   r   r   r   r   globr   loadsreadrI   ro   r   r   rG   r`   r   rF   r   insertr   r   EOFError
ValueErrorr   shutilrmtreeOSError)rc   r   
tmp_folderrd   r   r   r   r   r   rX   ry   rz   arrrg   s                 r   load_dictionaryr     s)   {{8$HhG!!#JHHZDM#2\\(C( 	"C S!		" ))J/2/4( 	.E<<

-D	.77*$#xx(:;,01C1C1E,F 6(MT55''#((:u"=DQC}%(T
#DJ5,/T
5)T
))%56 		2MM*% G	" 	"	. 	.   Hj1 .&u-.  	2*51M	2 		2MM*% 	2*51M	2s   G) $#G,G) 3$G G) 8BG G) (H GG) GG) 	G&#G) %G&&G) )H=HH9 HH9 	H6H11H69JI&%J&	J/I?:J?JJc                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)IOFunctionsc                 X    d | _         d | _        d | _        d | _        d | _        d | _        y )N)load_extensionssave_extensionsload_filterssave_filters
load_funcs
save_funcsr5   s    r   __init__zIOFunctions.__init__  s0    ##  r#   c           	      X   | j                         | j                         z   }i }i }i }i }g }g }g }|D ]d  \  }	}
}}t        |
d|	z  z         }|,|j                  |       |	||<   |||	<   |j                  |	       |J|	||<   |j                  |       |||	<   f |j	                  dt        ddj                  |      z   dz                |j                  t        d             dj                  |      | _        dj                  |      | _        || _        || _	        || _
        || _        y )Nz (*%s)r   zSupported files (*z *)zAll files (*.*)
)get_internal_funcsget_3rd_party_funcsr   r   r   r   r   r  r  r  r   r   )r   iofuncsr   r   r  r  r   r  load_extextrX   loadfuncsavefunc
filter_strs                 r   setupzIOFunctions.setup  sS   ))+D,D,D,FF

-4 
	+)Cx'x#~(=>J###J/.1
+"*
3$#.1
+##J/"*
3
	+ 	A~.E.2ii.A/BBE/F  G 	HN+<=> IIl3 IIl3$$..r#   c                     ddt         t        fddt        d fddt        d fddt        t        fd	d
ddt
        d fddt
        d fddt
        d fddt
        d fddt        d fddt        d fddt        d fgS )Nz.spydatazSpyder data filesz.npyzNumPy arraysz.npzzNumPy zip arraysz.matzMatlab files)z.csvzCSV text filesimport_wizardN)z.txtz
Text filesr  Nz.jpgzJPEG imagesz.pngz
PNG imagesz.gifz
GIF imagesz.tifzTIFF imagesz.pklzPickle filesr   z.jsonz
JSON files)r   r   rv   rh   rm   r   r   r   r5   s    r   r  zIOFunctions.get_internal_funcs  s    0,o?T:+Z>kBA=
D9z48z48
D9d;NK>,	48 	r#   c           	      P   g }	 ddl m}  |d      D ]@  }	 |j                  |j                  |j                  |j
                  |j                  f       B 	 |S # t        $ r3}t        |dt        |      t        j                         Y d }~}d }~ww xY w# t        $ r Y |S w xY w)Nr   )get_spyderplugins_modsT)r^   z: )file)spyder.otherpluginsr  r   
FORMAT_EXTFORMAT_NAMEFORMAT_LOADFORMAT_SAVEr   printrb   sysstderrr   )r   other_funcsr  modrg   s        r   r	  zIOFunctions.get_3rd_party_funcs  s    		B-6 II&&(+(J KI 	 & Ic3u:6SZZHHI 		s:   B =AB 	B")BB BB 	B%$B%c                     t        j                  |      d   j                         }|| j                  v r | j                  |   ||      S d|z  S NrC   z!<b>Unsupported file type '%s'</b>)rp   rq   lowerr  )r   rd   rc   r  s       r   rx   zIOFunctions.save  sM    ll8$Q'--/$//!'4??3'h776<<r#   c                     t        j                  |      d   j                         }|| j                  v r | j                  |   |      S d d|z  fS r!  )rp   rq   r"  r  )r   rc   r  s      r   ro   zIOFunctions.load  sQ    ll8$Q'--/$//!'4??3'11<sBBBr#   N)	r7   r8   r9   r  r  r  r	  rx   ro   r?   r#   r   r   r     s!    /<$=Cr#   r   c                      y)z4Save data into filename, depending on file extensionNr?   )rd   rc   s     r   	save_autor%    s    r#   __main__rC   
   r   )dabi        zkjkj kj k j j kj k jkju   éùr(   )r   r+     kjkjg&S?i  i  )
rb   unicoderG   tupler   floatr   empty_arraydatedatetimeztest.spydataz Data saved in %.3f secondszData loaded in %.3f seconds).NF)Er:   
__future__r   r  r   os.pathr   rp   r   r   r   r   r   r   r)   r4   r   spyder_kernels.py3compatr   r   r   r    spyder_kernels.utils.lazymodulesr   r	   rI   r
   r   r   r   r]   r   r   rH   rh   rm   rv   r{   	byteorder_ENDIANr   r   r   r   r   r   r   r   r   rQ   r   iofunctionsr  r%  r7   r4  randomrandtestdictr3  testdater   exampletimet0r  example2okr   r?   r#   r   <module>rF     sO   &  	        
   I H= =84 8v0f  " ==HGG 
	
7
D	!
7
D	!w%	
 	I 
fR#
?,^SC& SCj m    	
 zRYY^^B31a&AHx}}T1a(H.!1i6Xx0&$?		tS1&bhhrl,8,,T1a8
G 	BG^,	
'9499;r>
:;	B">2LHbBIIn	
'9499;r>
:;/ r#   