o
    i                     @   s   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 d dlmZ d dlmZ eeZd	d
 Zdd Zdd Zdd ZG dd dZdS )    N)_extract_span)	FRAMEWORK)	STEP_KIND)get_version)test)CIVisibility)
get_loggerc                 C   s   t | ddS )zExtract span from `step_func`._datadog_spanN)getattr)item r   _/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/pytest_bdd/_plugin.pyr      s   r   c                 C   s
   || _ dS )zStore span at `step_func`.N)r	   )r   spanr   r   r   _store_span   s   
r   c           	      C   s   t |dst |ds|S z|jg}W n ty,   z|j}W n ty)   g }Y nw Y nw |D ]K}|durzt|di }i }z.|| j D ]#\}}z||v rU|| |}W n tyd   t	
d Y nw |||< qFW q/ tyy   t	
d Y q/w q/|p~dS )zCBackwards-compatible get arguments from step_func or step_func_argsparser_pytest_bdd_parsersN
converterszargument conversion failed.zargument parsing failed.)hasattrr   AttributeErrorr   r
   parse_argumentsnameitems	Exceptionlogdebug)	step	step_funcstep_func_argsparsersr   r   
parametersargvaluer   r   r   _extract_step_func_args   s@   

r"   c              
   C   sh   zt | ||}|rt|W S W dS  ty3 } ztjddd tdt|iW  Y d}~S d}~ww )z=Get step function args as JSON, catching serialization errorsNzCould not serialize argumentsT)exc_infoerror_serializing_args)r"   jsondumps	TypeErrorr   r   str)r   r   r   extracted_step_func_argserrr   r   r   _get_step_func_args_json=   s   r+   c                   @   sd   e Zd Zdd Zeejdddd Zejdddd Zeejdd	d
d Z	edd Z
dS )_PytestBddPluginc                 C   s   t  | _d S N)r   framework_version)selfr   r   r   __init__J   s   z_PytestBddPlugin.__init__T)tryfirstc                 C   sj   t jr1t| j}|d ur3tj|jjt	| j
j}|tj|j |tj| t j||d d S d S d S )Nr   )_CIVisibilityenabled_extract_feature_spannodeospathrelpathfeaturefilenamer(   configrootdirset_tagr   NAMEr   SUITEset_codeowners_of)requestr:   scenarior   locationr   r   r   pytest_bdd_before_scenarioM   s   
z+_PytestBddPlugin.pytest_bdd_before_scenarioc           	      C   s   t jrMt|j}t jjj|j|jt	|dd}|
dd |tjt |tj| j tj|jjt|jj}|tj| t j||d t|| d S d S )NT)resource	span_typechild_ofactivate	component
pytest_bddr2   )r3   r4   r5   r6   	_instancetracer
start_spantyper   r   _set_tag_strr>   r   r   FRAMEWORK_VERSIONr.   r7   r8   r9   __code__co_filenamer(   r<   r=   FILErA   r   )	r/   rB   r:   rC   r   r   feature_spanr   rD   r   r   r   pytest_bdd_before_stepY   s"   
z'_PytestBddPlugin.pytest_bdd_before_step)trylastc                 C   s>   t |}|d urt|||}|r|tj| |  d S d S r-   )r   r+   r>   r   
PARAMETERSfinish)rB   r:   rC   r   r   r   r   step_func_args_jsonr   r   r   pytest_bdd_after_stepo   s   z&_PytestBddPlugin.pytest_bdd_after_stepc                 C   sp   t |}|d ur6t|dr|j}nt \}	}	}t|||}
|r'|tj|
 |	t
||| |  d S d S )N__traceback__)r   r   r\   sysr#   r+   r>   r   rX   set_exc_inforO   rY   )rB   r:   rC   r   r   r   	exceptionr   tb_rZ   r   r   r   pytest_bdd_step_errory   s   
z&_PytestBddPlugin.pytest_bdd_step_errorN)__name__
__module____qualname__r0   staticmethodpytesthookimplrE   rV   r[   rb   r   r   r   r   r,   I   s    




r,   )r%   r7   r]   rg   &ddtrace.contrib.internal.pytest._utilsr   r5   -ddtrace.contrib.internal.pytest_bdd.constantsr   r   )ddtrace.contrib.internal.pytest_bdd.patchr   ddtrace.extr   ddtrace.internal.ci_visibilityr   r3   ddtrace.internal.loggerr   rc   r   r   r"   r+   r,   r   r   r   r   <module>   s"     