<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    Yt                 @   s  d 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
m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ ejd	krddlZnddlZydd
lmZ W n  ek
r   dd
lmZ Y nX ddlZddlmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7ZdZ8da9dZ:dej;dZ<da=ejd	kre>Z?dd Z@G dd deAZBG dd deCZDG dd  d eCZEG d!d" d"eEZFdS )#z
raven.base
~~~~~~~~~~

:copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
    )absolute_importN)datetime)isclass)Random)FunctionType)local)      )	get_ident)defaults)RemoteConfig)APIErrorRateLimited)jsonget_versionsget_auth_headermerge_dicts)	text_type	iteritems)
to_unicode)	transform)get_stack_infoiter_stack_frames)TransactionStack)TransportRegistrydefault_transports)Clientpythonzraven-python)nameversionc              C   s"   t j} t| dd }|d k	r|S d S )Nraven_client)sys
excepthookgetattr)hookclient r&   ;/opt/alt/python37/lib/python3.7/site-packages/raven/base.pyget_excepthook_clientE   s    r(   c               @   s   e Zd Zdd ZdS )ModuleProxyCachec             C   s2   | dd\}}tt|i i |g|}|| |< |S )N.   )rsplitr#   
__import__)selfkeymodule
class_namehandlerr&   r&   r'   __missing__M   s
    zModuleProxyCache.__missing__N)__name__
__module____qualname__r3   r&   r&   r&   r'   r)   L   s   r)   c               @   s>   e Zd ZdZdZdd Zdd ZdddZd	d
 Zdd Z	dS )ClientStater+   r   c             C   s   | j | _d | _d| _d| _d S )Nr   )ONLINEstatus
last_checkretry_numberretry_after)r.   r&   r&   r'   __init__\   s    zClientState.__init__c             C   s@   | j | jkrdS | jp$t| jdd }t | j |kr<dS dS )NT   r	   F)r9   r8   r<   minr;   timer:   )r.   intervalr&   r&   r'   
should_tryb   s    zClientState.should_tryc             C   s*   | j | _|  jd7  _t | _|| _d S )Nr+   )ERRORr9   r;   r@   r:   r<   )r.   r<   r&   r&   r'   set_failm   s    
zClientState.set_failc             C   s   | j | _d | _d| _d| _d S )Nr   )r8   r9   r:   r;   r<   )r.   r&   r&   r'   set_successs   s    zClientState.set_successc             C   s   | j | jkS )N)r9   rC   )r.   r&   r&   r'   did_faily   s    zClientState.did_failN)r   )
r4   r5   r6   r8   rC   r=   rB   rD   rE   rF   r&   r&   r&   r'   r7   X   s   
r7   c               @   s  e Zd ZdZedZdZee	dZ
d^dd	Zd
d Zd_ddZdd Zdd Zdd Zedd Zdd Zdd Zdd Zdd Zd`ddZd d! Zd"d# Zd$d% Zdad&d'Zd(d) Zed*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"dbd4d5Z#d6d7 Z$d8d9 Z%d:d; Z&d<d= Z'd>d? Z(dcd@dAZ)dddBdCZ*dedDdEZ+dFdG Z,dHdI Z-dJdK Z.dLdM Z/dfdNdOZ0dPdQ Z1dgdRdSZ2dhdUdVZ3dWdX Z4dYdZ Z5e5Z6ed[d\ Z7e7j8d]d\ Z7dS )ir   aU  
    The base Raven client.

    Will read default configuration from the environment variable
    ``SENTRY_DSN`` if available.

    >>> from raven import Client

    >>> # Read configuration from ``os.environ['SENTRY_DSN']``
    >>> client = Client()

    >>> # Specify a DSN explicitly
    >>> client = Client(dsn='https://public_key:secret_key@sentry.local/project_id')

    >>> # Record an exception
    >>> try:
    >>>     1/0
    >>> except ZeroDivisionError:
    >>>     ident = client.get_ident(client.captureException())
    >>>     print "Exception caught; reference is %s" % ident
    raven6)Z
transportsNFTc	             K   s~  |	}
t  | _|| _| j}t | _td|j|j	f | _
td| _td| _i | _| || t|
dppg | _t|
dpg | _t|
dp|
dptj| _t|
dptj| _t|
d	tj| _t|
d
ptj| _t|
dptj| _ |
d| _!|
dd| _"|
d| _#| j#d kr:tj$| _#|
d}|d krfdt%t&dg d d  i}|| _'|
dpzi | _(|
dpd | _)|
dpt*j+d| _,| -|
d| _.|
dd k	r|
dnd| _/t0 | _1t|
dpd| _2t3 | _4t5|| _6| 7 s"| j
8d t9d kr0| a9t: | _;|| _<ddl=m>} || | _?|rb| @  |rp| A  | B| d S )Nz%s.%szsentry.errorszsentry.errors.uncaughtinclude_pathsexclude_pathsr   machineauto_log_stackscapture_localsstring_max_lengthlist_max_lengthsiteinclude_versionsT
processorscontextzsys.argvargvtagsenvironmentreleaseZHEROKU_SLUG_COMMITrepossample_rater+   ignore_exceptionsr&   zaRaven is not configured (logging is disabled). Please see the documentation for more information.r   )Context)Cr   _local_stateraise_send_errors	__class__r7   statelogging	getLoggerr5   r4   loggererror_loggeruncaught_logger_transport_cacheset_dsnsetgetrI   rJ   r   r   NAMEr   boolZAUTO_LOG_STACKSrL   ZCAPTURE_LOCALSrM   intZMAX_LENGTH_STRINGrN   ZMAX_LENGTH_LISTrO   rP   rQ   rR   Z
PROCESSORSr#   r!   extrarU   rV   osenvironrW   _format_reposrX   rY   r   transactionrZ   r)   module_cacher   _random
is_enabledinfoRavenget_thread_identZmain_thread_idenable_breadcrumbsZraven.contextr[   _contextinstall_sys_hookinstall_logging_hookhook_libraries)r.   dsnr]   	transportry   rz   r{   rw   Z_random_seedoptionsoclsrS   r[   r&   r&   r'   r=      sn     





zClient.__init__c             C   sL   |si S i }x:t |D ].\}}|d dkr<tjt|j}|||< qW |S )Nr   /)r   rm   pathabspathr-   __file__)r.   valueresultr   configr&   r&   r'   ro      s    zClient._format_reposc             C   s   |s*t jdr*d}| j| t jd }|| jkrh|sDt|d}ntj||| jd}|| j|< || _	n| j| | _	| jd
| j	 d S )NZ
SENTRY_DSNz8Configuring Raven from environment variable 'SENTRY_DSN')r}   )r}   Ztransport_registryzConfiguring Raven for host: {0})rm   rn   rh   rb   debugre   r   Zfrom_string	_registryremoteformat)r.   r|   r}   msgr   r&   r&   r'   rf      s    



zClient.set_dsnc                s*   t d krtja  fdd} |_|t_d S )Nc                 s    j | dd t|   d S )Nfatal)exc_infolevel)captureException__excepthook__)r   )r.   r&   r'   handle_exception  s    z1Client.install_sys_hook.<locals>.handle_exception)r   r!   r"   r    )r.   r   r&   )r.   r'   ry     s
    zClient.install_sys_hookc             C   s   ddl m} |  d S )Nr   )rz   )raven.breadcrumbsrz   )r.   rz   r&   r&   r'   rz     s    zClient.install_logging_hookc             C   s   ddl m} || d S )Nr   )r{   )r   r{   )r.   	librariesr{   r&   r&   r'   r{     s    zClient.hook_librariesc             C   s   | j || d S )N)r   register_scheme)r   schemeZtransport_classr&   r&   r'   r   "  s    zClient.register_schemec             c   s$   x| j D ]}| j| | V  qW d S )N)rR   rq   )r.   	processorr&   r&   r'   get_processors&  s    zClient.get_processorsc             C   s<   | j s
i S tj}t| j}d|d |d |d |d< |S )Nz{0}.{1}.{2}r   r+   r	   r   )rQ   r!   version_infor   rI   r   )r.   r   modulesr&   r&   r'   get_module_versions*  s    
zClient.get_module_versionsc             C   s   t dt |S )z
        Returns a searchable string representing a message.

        >>> result = client.capture(**kwargs)
        >>> ident = client.get_ident(result)
        zVClient.get_ident is deprecated. The event ID is now returned as the result of capture.)warningswarnDeprecationWarning)r.   r   r&   r&   r'   r
   7  s    zClient.get_identc             C   s   | j | | S )N)rq   )r.   r   r&   r&   r'   get_handlerC  s    zClient.get_handlerc             C   s*   |   sdS | j }|s|S d||f S )z
        Returns a public DSN which is consumable by raven-js

        >>> # Return scheme-less DSN
        >>> print client.get_public_dsn()

        >>> # Specify a scheme to use (http or https)
        >>> print client.get_public_dsn('https')
        Nz%s:%s)rs   r   get_public_dsn)r.   r   urlr&   r&   r'   r   F  s    

zClient.get_public_dsnc          	   C   sv   d}d}y2t |d o|d jj}|d r4|d jp6d}W n ttfk
rR   Y nX |d t |d |t |d |fS )Nr   r	   r+   )idtb_framef_codetb_lastiAttributeError
IndexError)r.   r   Zcode_idZlast_idr&   r&   r'   _get_exception_keyW  s    

zClient._get_exception_keyc             C   s   |  |}|| jjkS )N)r   rS   exceptions_to_skip)r.   r   r/   r&   r&   r'   skip_error_for_loggingi  s    
zClient.skip_error_for_loggingc             C   s   |  |}| jj| d S )N)r   rS   r   add)r.   r   r/   r&   r&   r'   record_exception_seenm  s    
zClient.record_exception_seenc
                s  t  j}t| jj|}|di  |di  d|kr@d| }| |}|jf |
}|	dd}|
drt|d }x$t|D ]\}}||kr~|||< q~W |dkrd|kr| j}|rd|kr|d	krt }n|}t|| j| jd
}|d|i | jrx| |D ]|}|
ddk	rq|
d  s0q drFd|d< n8t fdd| jD oxt fdd| jD  |d< qW |s| j }|
ds|

dptj|d< |
ds| j|d< |
ds|  |d< | jdk	r| j|d< | jdk	r| j|d< t| j|d ||d< t| j |d ||d< |	ddpN| j!}|rf|d d| |rt||d< |	r|	|d< x"| " D ]}||#| qW d|kr|

d|$||d< x*t|d D ]\}}t%||d |< qW x,t|d D ]\}}| ||d |< q W |d| j&j' |d|pBt()  |d| |d| |dt* |dt+ |d | j, | j-r| jj./ }|r|d!d"|i |S )#z
        Captures, processes and serializes an event into a dict object

        The result of ``build_msg`` should be a standardized dict, with
        all default values available.
        rU   rl   r*   zraven.events.%sculpritN	exception
stacktraceT)ZtransformerrM   Zin_appr0   zraven.Fc             3   s   | ]}  |V  qd S )N)
startswith).0x)r   r&   r'   	<genexpr>  s    z#Client.build_msg.<locals>.<genexpr>c             3   s   | ]}  |V  qd S )N)r   )r   r   )r   r&   r'   r     s    r   Zserver_namer   rW   rV   rP   fingerprintmessageproject	timestamp
time_spentevent_idplatformZsdkrX   breadcrumbsvalues)0uuidZuuid4hexr   rS   data
setdefaultr   capturepoprh   r   rL   r   r   r   rM   updaterI   _iter_framesr   anyrJ   rp   peekr`   rC   r   r   rW   rV   rU   rl   rP   r   processZ	to_stringr   r   r   r   utcnowPLATFORM_NAME	SDK_VALUErX   rw   r   Z
get_buffer)r.   
event_typer   dater   rl   stack
public_keyrU   r   kwargsr   r2   r   r   kvframes
stack_infoframerP   r   r/   r   Zcrumbsr&   )r   r'   	build_msgq  s    







$




zClient.build_msgc             C   s   t || j| jdS )N)rO   rN   )r   rO   rN   )r.   r   r&   r&   r'   r     s    zClient.transformc             C   s   | j S )aT  
        Updates this clients thread-local context for future events.

        >>> def view_handler(view_func, *args, **kwargs):
        >>>     client.context.merge(tags={'key': 'value'})
        >>>     try:
        >>>         return view_func(*args, **kwargs)
        >>>     finally:
        >>>         client.context.clear()
        )rx   )r.   r&   r&   r'   rS     s    zClient.contextc             C   s   | j d|iS )z{
        Update the user context for future events.

        >>> client.user_context({'email': 'foo@example.com'})
        user)rS   merge)r.   r   r&   r&   r'   user_context  s    zClient.user_contextc             K   s   | j d|iS )z|
        Update the http context for future events.

        >>> client.http_context({'url': 'http://example.com'})
        Zrequest)rS   r   )r.   r   r   r&   r&   r'   http_context  s    zClient.http_contextc             K   s   | j d|iS )zo
        Update the extra context for future events.

        >>> client.extra_context({'foo': 'bar'})
        rl   )rS   r   )r.   r   r   r&   r&   r'   extra_context$  s    zClient.extra_contextc             K   s   | j d|iS )zr
        Update the tags context for future events.

        >>> client.tags_context({'version': '1.0'})

        rU   )rS   r   )r.   r   r   r&   r&   r'   tags_context.  s    zClient.tags_contextc	             K   s   |   sdS |	d}
|
dk	r^| |
r,dS | |
sT| jjd|
d t d dS | |
 | j	||||||fd|i|	}|dkr| j
}| j |k r| jf | |d | j_|d S )a  
        Captures and processes an event and pipes it off to SentryClient.send.

        To use structured data (interfaces) with capture:

        >>> capture('raven.events.Message', message='foo', data={
        >>>     'request': {
        >>>         'url': '...',
        >>>         'data': {},
        >>>         'query_string': '...',
        >>>         'method': 'POST',
        >>>     },
        >>>     'logger': 'logger.name',
        >>> }, extra={
        >>>     'key': 'value',
        >>> })

        The finalized ``data`` structure contains the following (some optional)
        builtin values:

        >>> {
        >>>     # the culprit and version information
        >>>     'culprit': 'full.module.name', # or /arbitrary/path
        >>>
        >>>     # all detectable installed modules
        >>>     'modules': {
        >>>         'full.module.name': 'version string',
        >>>     },
        >>>
        >>>     # arbitrary data provided by user
        >>>     'extra': {
        >>>         'key': 'value',
        >>>     }
        >>> }

        :param event_type: the module path to the Event class. Builtins can use
                           shorthand class notation and exclude the full module
                           path.
        :param data: the data base, useful for specifying structured data
                           interfaces. Any key which contains a '.' will be
                           assumed to be a data interface.
        :param date: the datetime of this event
        :param time_spent: a integer value representing the duration of the
                           event (in milliseconds)
        :param extra: a dictionary of additional standard metadata
        :param stack: a stacktrace for the event
        :param tags: dict of extra tags
        :param sample_rate: a float in the range [0, 1] to sample this message
        :return: a tuple with a 32-length string identifying this event
        Nr   z*Not capturing exception due to filters: %sr   )r   rU   r   )rs   rh   r   should_capturerb   rt   r!   r   r   r   rY   rr   randomsendr\   last_event_id)r.   r   r   r   r   rl   r   rU   rY   r   r   r&   r&   r'   r   9  s*    5



zClient.capturec             C   s
   | j  S )zg
        Return a boolean describing whether the client should attempt to send
        events.
        )r   Z	is_active)r.   r&   r&   r'   rs     s    zClient.is_enabledc             c   s\   d|kr$x|d d D ]
}|V  qW d|krXx*|d d d d  dg D ]
}|V  qJW d S )Nr   r   r   r   )rh   )r.   r   r   r&   r&   r'   r     s    
"zClient._iter_framesc             C   s   | j   d S )N)r_   rE   )r.   r&   r&   r'   _successful_send  s    zClient._successful_sendc             C   sn   d}t |tr8t |tr|j}| jdt|j|j n| jjd||dd|id | 	| | j
j|d d S )Nr   z*Sentry responded with an API error: %s(%s)z,Sentry responded with an error: %s (url: %s)Tr   )r   rl   )r<   )
isinstancer   r   r<   rc   errortyper4   r   _log_failed_submissionr_   rD   )r.   excr   r   r<   r&   r&   r'   _failed_send  s    


zClient._failed_sendc          
   C   s   | dd}|g}d|krd|d d d krxR|d d d d dg D ]2}|d|d	d
|dd|ddd  qLW | j| dS )zj
        Log a reasonable representation of an event that should have been sent
        to Sentry
        r   z<no message value>r   r   r   r   r   z-  File "%(fn)s", line %(lineno)s, in %(func)sfilenameZunknown_filenamelinenofunctionZunknown_function)fnr   funcN)r   rh   appendrd   r   )r.   r   r   outputr   r&   r&   r'   r     s    "

zClient._log_failed_submissionc          
      s   |d kri }j s4j s4    d S jdt   fdd}y@j	 }|j
r| |j| n| |   W n2 tk
r } zj r || W d d }~X Y nX d S )Nz"Sending message of length %d to %sc                s    |   d S )N)r   decode)e)r   r.   r   r&   r'   failed_send  s    z'Client.send_remote.<locals>.failed_send)r]   r_   rB   r   r   rb   r   lenr   Zget_transportZis_asyncZ
async_sendr   r   	Exception)r.   r   r   headersr   r}   r   r&   )r   r.   r   r'   send_remote  s&    


zClient.send_remotec             K   s   |  |}| j||dS )zV
        Serializes the message and passes the payload onto ``send_encoded``.
        )auth_header)encodesend_encoded)r.   r   r   r   r&   r&   r'   r     s    
zClient.sendc             K   sb   dt jf }|s4t }t| j||| jj| jjd}|||  dd}| j	f | jj
||d|S )z
        Given an already serialized message, signs the message and passes the
        payload off to ``send_remote``.
        zraven-python/%s)protocolr   r%   Zapi_keyZ
api_secretzapplication/octet-stream)z
User-AgentzX-Sentry-AuthzContent-EncodingzContent-Type)r   r   r   )rG   VERSIONr@   r   protocol_versionr   r   Z
secret_keyget_content_encodingr   Zstore_endpoint)r.   r   r   r   Zclient_stringr   r   r&   r&   r'   r     s$    zClient.send_encodedc             C   s   dS )Ndeflater&   )r.   r&   r&   r'   r     s    zClient.get_content_encodingc             C   s   t t|dS )z8
        Serializes ``data`` into a raw string.
        utf8)zlibcompressr   dumpsr   )r.   r   r&   r&   r'   r   
  s    zClient.encodec             C   s   t t|dS )z2
        Unserializes a string, ``data``.
        r   )r   loadsr   
decompressr   )r.   r   r&   r&   r'   r     s    zClient.decodec             K   s   | j dd|i|S )zr
        Creates an event from ``message``.

        >>> client.captureMessage('My event just happened!')
        raven.events.Messager   )r  )r   )r.   r   r   r&   r&   r'   captureMessage  s    zClient.captureMessagec             K   s,   |dks|dkrt  }| jdd|i|S )a  
        Creates an event from an exception.

        >>> try:
        >>>     exc_info = sys.exc_info()
        >>>     client.captureException(exc_info)
        >>> finally:
        >>>     del exc_info

        If exc_info is not provided, or is set to True, then this method will
        perform the ``exc_info = sys.exc_info()`` and the requisite clean-up
        for you.

        ``kwargs`` are passed through to ``.capture``.
        NTraven.events.Exceptionr   )r  )r!   r   r   )r.   r   r   r&   r&   r'   r     s    zClient.captureExceptionc                s   |d dj jf  | j}dd |D }dd |D }dd |D }|krTdS j|krbdS  |krndS tfdd|D rdS t fd	d|D rdS d
S )Nr   z%s.%sc             s   s   | ]}t |tr|V  qd S )N)r   
basestring)r   r   r&   r&   r'   r   8  s    z(Client.should_capture.<locals>.<genexpr>c             s   s   | ]}| d r|V  qdS )*N)endswith)r   r   r&   r&   r'   r   9  s    c             s   s   | ]}t |r|V  qd S )N)r   )r   r   r&   r&   r'   r   :  s    Fc             3   s   | ]}t  |V  qd S )N)
issubclass)r   r   )exc_typer&   r'   r   B  s    c             3   s    | ]}  |d d V  qd S )Nr   )r   )r   r   )exc_namer&   r'   r   D  s    T)r5   r4   rZ   r   )r.   r   Z
exclusionsZstring_exclusionsZwildcard_exclusionsZclass_exclusionsr&   )r  r  r'   r   4  s"    
zClient.should_capturec                sR   d}t f}t|tr|}n|dk	r&|}tj fdd}||}|rN||S |S )a  
        Wrap a function or code block in try/except and automatically call
        ``.captureException`` if it raises an exception, then the exception
        is reraised.

        By default, it will capture ``Exception``

        >>> @client.capture_exceptions
        >>> def foo():
        >>>     raise Exception()

        >>> with client.capture_exceptions():
        >>>    raise Exception()

        You can also specify exceptions to be caught specifically

        >>> @client.capture_exceptions((IOError, LookupError))
        >>> def bar():
        >>>     ...

        >>> with client.capture_exceptions((IOError, LookupError)):
        >>>    ...

        ``kwargs`` are passed through to ``.captureException``.
        Nc             3   s2   y
d V  W n" | k
r,   j f    Y nX d S )N)r   )
exceptions)r   r.   r&   r'   make_decoratorj  s
    
z1Client.capture_exceptions.<locals>.make_decorator)r   r   r   
contextlibcontextmanager)r.   Zfunction_or_exceptionsr   r   r  r  	decoratorr&   )r   r.   r'   capture_exceptionsH  s    
zClient.capture_exceptionsr&   c             K   s   | j d|||d|S )zi
        Creates an event for a SQL query.

        >>> client.captureQuery('SELECT * FROM foo')
        raven.events.Query)queryparamsengine)r  )r   )r.   r  r  r  r   r&   r&   r'   captureQueryx  s    zClient.captureQueryc             K   s   t dt | jf |S )Nz8captureExceptions is deprecated, used context() instead.)r   r   r   rS   )r.   r   r&   r&   r'   captureExceptions  s    zClient.captureExceptionsc             O   s   | j jj|| dS )zp
        Records a breadcrumb with the current context.  They will be
        sent with the next event.
        N)rS   r   record)r.   argsr   r&   r&   r'   captureBreadcrumb  s    zClient.captureBreadcrumbc             C   s   t | jdd S )Nr   )r#   r\   )r.   r&   r&   r'   r     s    zClient.last_event_idc             C   s   || j _d S )N)r\   r   )r.   r   r&   r&   r'   r     s    )NFNTTNTN)NN)N)NNNNNNNN)NNNNNNN)N)N)N)N)N)r&   N)9r4   r5   r6   __doc__r`   ra   rb   r   r   r   r   r=   ro   rf   ry   rz   r{   classmethodr   r   r   r
   r   r   r   r   r   r   r   propertyrS   r   r   r   r   r   rs   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r  r  Zcapture_breadcrumbr   setterr&   r&   r&   r'   r   }   sn   

   
Q

  
 


 
Q




0


r   c               @   s   e Zd ZdZdd ZdS )DummyClientz"Sends messages into an empty void.c             K   s   d S )Nr&   )r.   r   r&   r&   r'   r     s    zDummyClient.sendN)r4   r5   r6   r  r   r&   r&   r&   r'   r     s   r   )Gr  
__future__r   r   r`   rm   r!   r@   r   r   r   inspectr   r   r   typesr   	threadingr   r   r  contextlib2threadr
   rv   ImportError_threadrG   Z
raven.confr   Zraven.conf.remoter   Zraven.exceptionsr   r   Zraven.utilsr   r   r   r   Zraven.utils.compatr   r   Zraven.utils.encodingr   Zraven.utils.serializerr   Zraven.utils.stacksr   r   Zraven.utils.transactionr   Zraven.transport.registryr   r   Zraven.events__all__r   r   r   r   ru   strr  r(   dictr)   objectr7   r   r   r&   r&   r&   r'   <module>   sf   


%      &