B Y9'@sdZddlmZmZddlZddlZddlZddlZddlZddl m Z ddl m Z e dZdddZdd d Zd d Zd dZdddZe dfddZd ddZd!ddZe ddfddZdS)"z raven.utils.stacks ~~~~~~~~~~~~~~~~~~~~~~~~~~ :copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. )absolute_importdivisionN) transform) iteritemszcoding[:=]\s*([-\w.]+)c Csd}|dk rRt|drRy||}Wnttfk r@d}YnX|dk rR|}|dkryt|}Wnttfk rdSX|sdStd||}t |d|t |}yBdd|||D}|| d} d d||d|D} Wnt k rdSXt |t | t | fS) z Returns context_lines before and after lineno from file. Returns (pre_context_lineno, pre_context, context_line, post_context). N get_source)NNNrcSsg|]}|dqS)z )strip).0liner C/opt/alt/python37/lib/python3.7/site-packages/raven/utils/stacks.py Bsz'get_lines_from_file..z cSsg|]}|dqS)z )r)r r r r r r Gs)hasattrr ImportErrorIOError splitlines linecachegetlinesOSErrormaxminlenr IndexError slim_string) filenamelineno context_linesloader module_namesourceZ lower_boundZ upper_bound pre_context context_line post_contextr r r get_lines_from_files8 r#cCs"y||Stk r|SXdS)z f_locals is not guaranteed to have .get(), but it will always support __getitem__. Even if it doesn't, we return ``default``. N) Exception)f_localskeydefaultr r r _getitem_from_frameUsr(csDtdrj}ntdr$j}nttfdd|DS)zu Given something that closely resembles a dictionary, we attempt to coerce it into a propery dictionary. iterkeyskeysc3s|]}||fVqdS)Nr )r k)dictishr r lszto_dict..)rr)r* ValueErrordict)r,mr )r,r to_dict`s   r1ccsJxD|rDt|drDt|jdi}t|ds<|jt|ddfV|j}qWdS)z Given a traceback object, it will iterate over all frames that do not contain the ``__traceback_hide__`` local variable. tb_framer%__traceback_hide__ tb_linenoN)rgetattrr2r(tb_next)tbr%r r r iter_traceback_framesos  r8ccsV|stdd}x.r%r3)inspectstackr5r()framesframerr%r r r iter_stack_framess  r?ic Cst|dd}|sdSt|ts@y t|}Wntk r>dSXi}d}xDt|D]8\}}||}tt|}|||krR|||<||7}qRW|S)Nr%r)r5 isinstancer/r1r$rrrepr) r> transformerZ max_var_sizer%f_varsZf_sizer+vZv_sizer r r get_frame_localss"      rEc Cs\d}g}g}x4|D],}|d7}|dr4||q||qW||krN|S||}t|}t||d}|rt|d} x~|| | D]0}|dd|dd|dd|d8}qWn:x8|D]0}|dd|dd|dd|d8}qW|s|S||} t| d} x<|| | D]*}|dd|dd|ddq*W|S) z~ Removes various excess metadata from middle frames which go beyond ``frame_allowance``. Returns ``frames``. rrZin_appr9varsNr r")getappendrrintpop) r=frame_allowanceZ frames_lenZ app_framesZ system_framesr> remainingZ app_countZsystem_allowanceZhalf_maxZ app_allowancer r r slim_frame_datasD               rNcCs4|s|St||kr(|d|ddS|d|S)Nz...)r)valuelengthr r r rs  rTc Csd}g}x|D]}t|ttfr.|\}}n |}|j}t|di} t| drPqt|di} t|dd} | r~|jj} |jj} nd} d} t| d}t| d}|r|d 8}|dk r| rt | |d ||\}}}n d \}}}yBt j | d d d j }| |tjdd d dtj}Wntk r0| }YnX|s<| }| ||pHd| pPd|d d}|r|t||d}|r|||d<|dk r||||d||qWdt||di}|S)a Given a list of frames, returns a list of stack information dictionary objects that are JSON-ready. We have to be careful here as certain implementations of the _Frame class do not contain the necessary data to lookup all of the information we want. Tr%r3 f_globalsf_codeN __loader____name__r)NNN.rr9z )abs_pathrmodulefunctionr)rBrG)r r!r"r=)rL)r@listtuplef_linenor5r(rT co_filenameco_namer#sysmodulessplit__file__rsplitosseplstripr$rEupdaterIrN)r=rBcapture_localsrLr3resultZ frame_infor>rr%rSrTrZr\rrr r!r" base_filenamerZ frame_resultrCZ stackinfor r r get_stack_infosb           &     rn)NN)N)N)rF)rO)__doc__ __future__rrr;rrergrbZraven.utils.serializerrZraven.utils.compatrcompileZ _coding_rer#r(r1r8r?rErNrrnr r r r s&    =   4