o
    Zh8                     @   s  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	 d dl
mZ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mZ d d
lmZ z-d dlm  mZ d dlm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+ W n e,y   edw erd dl-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5 d dl)m6Z6 d dl7m8Z8m9Z9 d dlm:Z:m;Z; ed G dd deZ<dd Z=G dd de Z>G dd de>Z?dd  Z@d!d" ZAd#d$ ZBd%d& ZCd'd( ZDdS ))    N)cached_propertyisawaitable)configure_scope
start_span)OP)IntegrationDidNotEnable)ignore_logger)Hub_should_send_default_pii)capture_internal_exceptionsevent_from_exceptionloggerpackage_version_get_installed_modules)TYPE_CHECKING)Schema)SchemaExtension)should_skip_tracing)SentryTracingExtensionSentryTracingExtensionSync)async_base_viewsync_base_viewz#strawberry-graphql is not installed)AnyCallable	GeneratorListOptional)GraphQLErrorGraphQLResolveInfo)GraphQLHTTPResponse)ExecutionContextExecutionResult)EventEventProcessorzstrawberry.executionc                   @   s&   e Zd ZdZdddZedd ZdS )StrawberryIntegration
strawberryNc                 C   s    |dvrt d||| _d S )N)NFTz6Invalid value for async_execution: "{}" (must be bool))
ValueErrorformatasync_execution)selfr*    r,   Y/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/integrations/strawberry.py__init__-   s   
zStrawberryIntegration.__init__c                  C   sD   t d} | d u rtd| | dk rtdt  t  t  d S )Nzstrawberry-graphqlz)Unparsable strawberry-graphql version: {})r         z-strawberry-graphql 0.209.5 or newer required.)r   r	   r)   _patch_schema_init_patch_execute_patch_views)versionr,   r,   r-   
setup_once7   s   
z StrawberryIntegration.setup_onceN)__name__
__module____qualname__
identifierr.   staticmethodr5   r,   r,   r,   r-   r&   *   s
    

r&   c                     s   t j  fdd} | t _d S )Nc                    s   t jt}|d u r | g|R i |S |dpg }|jd ur%|j}nt|}td|r0dnd|r5dnd dd |D }|	|rEt
nt ||d<  | g|R i |S )	N
extensionszfAssuming strawberry is running %s. If not, initialize it as StrawberryIntegration(async_execution=%s).asyncsyncFalseTruec                 S   s   g | ]
}|t tfvr|qS r,   )StrawberrySentryAsyncExtensionStrawberrySentrySyncExtension).0	extensionr,   r,   r-   
<listcomp>b   s    zK_patch_schema_init.<locals>._sentry_patched_schema_init.<locals>.<listcomp>)r   currentget_integrationr&   getr*   _guess_if_using_asyncr   infoappendSentryAsyncExtensionSentrySyncExtension)r+   argskwargsintegrationr<   Zshould_use_async_extensionZold_schema_initr,   r-   _sentry_patched_schema_initM   s(   



z7_patch_schema_init.<locals>._sentry_patched_schema_init)r   r.   )rR   r,   rQ   r-   r1   I   s   
%r1   c                   @   s^   e Zd ZddddZedd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )rL   Nexecution_contextc                C   s   |r|| _ d S d S r6   rS   )r+   rT   r,   r,   r-   r.   v   s   
zSentryAsyncExtension.__init__c                 C   s*   |  | jj}| jjrd| jj|S |S )Nz{}:{})
hash_queryrT   queryoperation_namer)   )r+   Z
query_hashr,   r,   r-   _resource_name   s   z#SentryAsyncExtension._resource_namec                 C   s   t |d S )Nzutf-8)hashlibmd5encode	hexdigest)r+   rV   r,   r,   r-   rU      s   zSentryAsyncExtension.hash_queryc                 c   s$   | j j| _d}tj}| j j drd}tj}n| j j dr(d}tj	}|}| jr5|d
| j7 }tjjd| j|dd t }|jrR|jj||d| _nt||d| _W d    n1 scw   Y  | jd	| | jd
| j | jd| j j | jd| j d V  | j  d S )NrV   ZmutationZsubscriptionz {}zgraphql.operation)rW   operation_type)categorydataopdescriptionzgraphql.operation.typezgraphql.operation.namezgraphql.documentzgraphql.resource_name)rT   rW   Z_operation_namer   ZGRAPHQL_QUERYrV   strip
startswithZGRAPHQL_MUTATIONZGRAPHQL_SUBSCRIPTIONr)   r   rF   Zadd_breadcrumbr   spanstart_childgraphql_spanr   set_datarX   finish)r+   r]   ra   rb   scoper,   r,   r-   on_operation   sB   

z!SentryAsyncExtension.on_operationc                 c   *    | j jtjdd| _d V  | j  d S )NZ
validationr`   )rg   rf   r   ZGRAPHQL_VALIDATEZvalidation_spanri   r+   r,   r,   r-   on_validate      z SentryAsyncExtension.on_validatec                 c   rl   )NZparsingr`   )rg   rf   r   ZGRAPHQL_PARSEZparsing_spanri   rm   r,   r,   r-   on_parse   ro   zSentryAsyncExtension.on_parsec                 C   s
   t ||S r6   )strawberry_should_skip_tracing)r+   _nextrJ   r,   r,   r-   r      s   
z(SentryAsyncExtension.should_skip_tracingc                    s0   |||g|R i |}t |r|I d H }|S r6   r   )r+   rr   rootrJ   rN   rO   resultr,   r,   r-   _resolve   s
   
zSentryAsyncExtension._resolvec              
      s   |  ||r| j|||g|R i |I d H S d|j|j}| jjtjd|d=}|	d|j |	d|jj
 |	d| |	ddtt|j  | j|||g|R i |I d H W  d    S 1 slw   Y  d S 	Nz{}.{}zresolving {}r`   zgraphql.field_namezgraphql.parent_typezgraphql.field_pathzgraphql.path.)r   ru   r)   parent_type
field_namerg   rf   r   GRAPHQL_RESOLVErh   namejoinmapstrpathas_listr+   rr   rs   rJ   rN   rO   Z
field_pathre   r,   r,   r-   resolve   s   " $zSentryAsyncExtension.resolve)r7   r8   r9   r.   r   rX   rU   rk   rn   rp   r   ru   r   r,   r,   r,   r-   rL   u   s    	
	+

	rL   c                   @   s   e Zd Zdd ZdS )rM   c              
   O   s   |  ||r|||g|R i |S d|j|j}| jjtjd|d8}|d|j |d|jj	 |d| |dd
tt|j  |||g|R i |W  d    S 1 saw   Y  d S rv   )r   r)   rx   ry   rg   rf   r   rz   rh   r{   r|   r}   r~   r   r   r   r,   r,   r-   r      s   $zSentrySyncExtension.resolveN)r7   r8   r9   r   r,   r,   r,   r-   rM      s    rM   c                     s4   t j t j fdd} fdd}| t _|t _d S )Nc                     s   t j}|t}|d u r | i |I d H S  | i |I d H }d|v rH|jrH| }t|d }|| W d    |S 1 sCw   Y  |S NrT   r   rF   rG   r&   errorsr   _make_request_event_processoradd_event_processorrN   rO   hubrP   rt   rj   event_processor)old_execute_asyncr,   r-   _sentry_patched_execute_async  s    


z5_patch_execute.<locals>._sentry_patched_execute_asyncc                     s   t j}|t}|d u r | i |S  | i |}d|v rA|jrA| }t|d }|| W d    |S 1 s<w   Y  |S r   r   r   )old_execute_syncr,   r-   _sentry_patched_execute_sync  s   


z4_patch_execute.<locals>._sentry_patched_execute_sync)strawberry_schemaexecuteZexecute_sync)r   r   r,   )r   r   r-   r2      s   
r2   c                     sH   t jjtjj fdd}  fdd}dd  | t j_|tj_d S )Nc                       | ||  | || d S r6   r,   r+   r   response_data)_sentry_patched_handle_errorsold_async_view_handle_errorsr,   r-   (_sentry_patched_async_view_handle_errors0     z>_patch_views.<locals>._sentry_patched_async_view_handle_errorsc                    r   r6   r,   r   )r   old_sync_view_handle_errorsr,   r-   '_sentry_patched_sync_view_handle_errors5  r   z=_patch_views.<locals>._sentry_patched_sync_view_handle_errorsc           
      S   s   t j}|t}|d u rd S |sd S | }t|}|| W d    n1 s*w   Y  t ) |D ]}t||j	r@|j	j
nd |jddd\}}	|j||	d q5W d    d S 1 s^w   Y  d S )NF)typeZhandled)Zclient_optionsZ	mechanism)hint)r   rF   rG   r&   r   _make_response_event_processorr   r   r   clientoptionsr:   Zcapture_event)
r+   r   r   r   rP   rj   r   erroreventr   r,   r,   r-   r   :  s,   


"z3_patch_views.<locals>._sentry_patched_handle_errors)r   ZAsyncBaseHTTPViewZ_handle_errorsr   ZSyncBaseHTTPView)r   r   r,   )r   r   r   r-   r3   +  s   
r3   c                        fdd}|S )Nc              
      s   t  X t r0| di }d|d< |ds/d ji} jr# j|d<  jr+ j|d< ||d< nz| d d= W n ttfyB   Y nw W d    | S W d    | S W d    | S 1 s^w   Y  | S )NrequestgraphqlZ
api_targetr_   rV   	variablesZoperationName)	r   r   
setdefaultrH   rV   r   rW   KeyError	TypeError)r   r   Zrequest_datar_   rS   r,   r-   inner_  s8   






z,_make_request_event_processor.<locals>.innerr,   )rT   r   r,   rS   r-   r   \  s   r   c                    r   )Nc                    sZ   t    t r| di }d i|d< W d    | S W d    | S 1 s&w   Y  | S )Ncontextsr_   response)r   r   r   )r   r   r   r   r,   r-   r   ~  s   

z-_make_response_event_processor.<locals>.innerr,   )r   r   r,   r   r-   r   {  s   	r   c                 C   s.   t | v rdS t| v rdS th dtt @ S )NTF>   Z	starletteZfastapiZstarliteZlitestar)rA   rB   boolsetr   )r<   r,   r,   r-   rI     s   rI   )ErY   	functoolsr   inspectr   Z
sentry_sdkr   r   Zsentry_sdk.constsr   Zsentry_sdk.integrationsr   r	   Zsentry_sdk.integrations.loggingr
   Zsentry_sdk.hubr   r   Zsentry_sdk.utilsr   r   r   r   r   Zsentry_sdk._typesr   Zstrawberry.schema.schemaZschemar   r'   r   Zstrawberry.extensionsr   Z#strawberry.extensions.tracing.utilsr   rq   Zstrawberry.extensions.tracingr   rA   r   rB   Zstrawberry.httpr   r   ImportErrortypingr   r   r   r   r   r   r   r    r!   Zstrawberry.typesr"   r#   r$   r%   r&   r1   rL   rM   r2   r3   r   r   rI   r,   r,   r,   r-   <module>   sH    ,v-1