o
    hg[                    @   s<  d 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	Z	ddl
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m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 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$ 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+Z+ddl,Z,ddl,m-Z- ddl,m.Z. ddl,m/Z/ ddl,m0Z0 ddl,m1Z1 dd l2m3Z3 dd!l4m5Z5 dd"l4m6Z6 dd#l7m8Z8 ddl9Z:dd$l9m;Z; dd%l9m<Z< dd&l=m>Z> ddl?Z:ddl@Z:dd'lAmBZB dd(lAmCZC dd)lDmEZE dd*lDmFZF dd+lDmGZG dd,lDmHZH dd-lDmIZI dd.lDmJZJ dd/lKmLZL dd0lMmNZN dd1lMmOZO e)rydd2lPmQZQ dd3lPmRZR dd4lSmTZT dd5lUmVZV eWZX	 e-d6ZYe/d6ZZeG d7d8 d8ej[Z\G d9d: d:e]Z^d;e:j_j`d<eafd=d>Zb		dd?e#e*e"ec d@f  dAe#e$e*eceXf   d<e*ede\f fdBdCZed<edfdDdEZfG dFdG dGZgdHecdIecd<ecfdJdKZhdHecdIecd<ecfdLdMZidNZjg ejdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhR ZkelekZmemndi emndj 		dd?e#e"ec  dAe#e$e*eceXf   d<dkfdldmZoddodpZp		dd?e#e*e"ec d@f  dAe#e$e*eceXf   d<dkfdqdrZqdHed<efdsdtZrduedvecdwe'ecdxf d<eeceaf fdydzZseG d{dn dne1Ztd|e*dejuece$ec f d<e"ec fd}d~ZvG dd dZwew Zxde ec d<e!ec fddZyeG ddk dkZzd<eafddZ{	ddezde#e& d<e>fddZ|decd<eafddZ}edddecdead<e'dece(e~ ecedf fddZdecd<e(e~ fddZde ec de ec d<dfddZdS )z:Command line options, ini-file and conftest.py processing.    N)	lru_cache)Path)dedent)FunctionType)Any)Callable)cast)Dict)Final)final)	Generator)IO)Iterable)Iterator)List)Optional)Sequence)Set)TextIO)Tuple)Type)TYPE_CHECKING)Union)HookimplMarker)HookimplOpts)HookspecMarker)HookspecOpts)PluginManager   )PathAwareHookProxy)	PrintHelp)
UsageError)determine_setup)ExceptionInfo)filter_traceback)TerminalWriter)fail)Skipped)absolutepath)bestrelpath)import_path)
ImportMode)resolve_package_path)safe_exists)Stash)PytestConfigWarning)warn_explicit_for)ArgumentParser)_TracebackStyle)TerminalReporterpytestc                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ExitCodezEncodes the valid exit codes by pytest.

    Currently users and plugins may supply other exit codes as well.

    .. versionadded:: 5.0
    r   r               N)
__name__
__module____qualname____doc__OKTESTS_FAILEDINTERRUPTEDINTERNAL_ERRORUSAGE_ERRORNO_TESTS_COLLECTED rF   rF   P/var/www/html/wtlms/venv/lib/python3.10/site-packages/_pytest/config/__init__.pyr7   \   s    r7   c                   @   s0   e Zd ZdededdfddZdefddZdS )	ConftestImportFailurepathcausereturnNc                C   s   || _ || _d S N)rI   rJ   )selfrI   rJ   rF   rF   rG   __init__t   s   
zConftestImportFailure.__init__c                 C   s"   t | jj d| j d| j dS )N: z (from ))typerJ   r<   rI   rM   rF   rF   rG   __str__}   s   "zConftestImportFailure.__str__)r<   r=   r>   r   	ExceptionrN   strrS   rF   rF   rF   rG   rH   s   s    
	rH   entryrK   c                 C   s   t | odt| jtjvS )zFilter tracebacks entries which point to pytest internals or importlib.

    Make a special case for importlib because we use it to import test modules and conftest files
    in _pytest.pathlib.import_path.
    	importlib)r$   rU   rI   splitossep)rV   rF   rF   rG   ,filter_traceback_for_conftest_import_failure   s   r[   argszos.PathLike[str]pluginsc              
   C   sh  zzt | |}W nV ty^ } zJt|j}ttj}|jd|j	 ddd |j
t|_
|j
r8|jdddn| }t|}| D ]}|j| dd qDtjW  Y d}~W S d}~ww z$|jj|d	}	zt|	W W |  W S  ty   |	 Y W |  W S w |  w  ty } zttj}|jD ]}
|jd
|
 ddd qtjW  Y d}~S d}~ww )aL  Perform an in-process test run.

    :param args:
        List of command line arguments. If `None` or not given, defaults to reading
        arguments directly from the process command line (:data:`sys.argv`).
    :param plugins: List of plugin objects to be auto-registered during initialization.

    :returns: An exit code.
    z$ImportError while loading conftest 'z'.T)redshortF)stylechainNconfigzERROR: 
)_prepareconfigrH   r#   from_exceptionrJ   r%   sysstderrlinerI   	tracebackfilterr[   getreprexconlyrU   
splitlinesrstripr7   rD   hookpytest_cmdline_main_ensure_unconfigure
ValueErrorr!   r\   )r\   r]   rc   eexc_infotwexc_reprformatted_tbri   retmsgrF   rF   rG   main   sN   




r{   c                  C   sN   zt  } tj  | W S  ty&   ttjtj}t	|tj
  Y dS w )zoThe CLI entry point of pytest.

    This function is not meant for programmable use; use `main()` instead.
    r   )r{   rg   stdoutflushBrokenPipeErrorrY   opendevnullO_WRONLYdup2fileno)coder   rF   rF   rG   console_main   s   
r   c                   @   s   e Zd ZeeZdS )cmdlineN)r<   r=   r>   staticmethodr{   rF   rF   rF   rG   r          r   rI   optnamec                 C   s"   t j| rt| d|  | S )ztArgparse type validator for filename arguments.

    :path: Path of filename.
    :optname: Name of the option.
    z must be a filename, given: rY   rI   isdirr!   rI   r   rF   rF   rG   filename_arg      r   c                 C   s"   t j| st| d|  | S )zvArgparse type validator for directory arguments.

    :path: Path of directory.
    :optname: Name of the option.
    z must be a directory, given: r   r   rF   rF   rG   directory_arg   r   r   )markr{   runnerfixtures
helpconfigpythonterminal	debuggingunittestcaptureskipping
legacypathtmpdirmonkeypatchrecwarnpastebin	assertionjunitxmldoctestcacheproviderfreeze_support	setuponly	setupplanstepwisewarningsloggingreportspython_pathunraisableexceptionthreadexceptionfaulthandlerpytesterpytester_assertionsConfigc                 C   sT   t  }t|tj| p
d|t dd}| d ur|j| dd tD ]}|| q |S )NrF   r\   r]   dirinvocation_paramsTexclude_only)PytestPluginManagerr   InvocationParamsr   cwdconsider_preparsedefault_pluginsimport_plugin)r\   r]   pluginmanagerrc   specrF   rF   rG   
get_config  s   	r   r   c                   C   s   t  jS )zObtain a new instance of the
    :py:class:`pytest.PytestPluginManager`, with default plugins
    already loaded.

    This function can be used by integration with other tools, like hooking
    into pytest to run tests into an IDE.
    )r   r   rF   rF   rF   rG   get_plugin_manager/  s   r   c                 C   s   | d u rt jdd  } nt| tjrt| g} nt| ts*d}t|| t	| t
| |}|j}z"|rJ|D ]}t|trD|| q7|| q7|jj|| d}|W S  ty`   |   w )Nr   zG`args` parameter expected to be a list of strings, got: {!r} (type: {}))r   r\   )rg   argv
isinstancerY   PathLikefspathlist	TypeErrorformatrQ   r   r   rU   consider_pluginargregisterrp   pytest_cmdline_parseBaseExceptionrr   )r\   r]   rz   rc   r   pluginrF   rF   rG   re   :  s0   


re   c                 C   s   |   r| jS | S )z<Get the directory of a path - itself if already a directory.)is_fileparent)rI   rF   rF   rG   _get_directoryZ  s   r   method	hook_type	opt_names.c           
      C   s   t r	t| s	J dd t| dg D }g }i }|D ]0}t| |t}|tur5|| d|  d||< q||v rF|| d d||< qd||< q|red|}tjj	j
|| j|d	}	ttt| |	 |S )
Nc                 S   s   h | ]}|j qS rF   name).0mrF   rF   rG   	<setcomp>j  s    z)_get_legacy_hook_marks.<locals>.<setcomp>
pytestmark=Tz=TrueF, )rQ   fullname	hook_opts)r   inspect	isroutinegetattrAttributeErrorappendjoin_pytest
deprecatedHOOK_LEGACY_MARKINGr   r>   r0   r   r   )
r   r   r   known_marks	must_warnoptsopt_nameopt_attrr   messagerF   rF   rG   _get_legacy_hook_marksb  s.   



r   c                       sj  e Zd ZdZdI fddZdededee f fdd	Z	dedee
 f fd
dZ	dJdedee dee f fddZdefddZdedefddZdKddZdeeeef  dedededee dedeeef deddfddZd edefd!d"Zd#edeeef dededdf
d$d%Zd edeeef dededdf
d&d'Zd edeej fd(d)Zded edeejef fd*d+Zd,edeeef dededejf
d-d.Zd/ejd,eddfd0d1Z d2d3dee d4eddfd5d6Z!d7eddfd8d9Z"d:ejd;eddfd<d=Z#dId>d?Z$d/ejddfd@dAZ%dBedejeee f ddfdCdDZ&dLdEedFeddfdGdHZ'  Z(S )Mr   a;  A :py:class:`pluggy.PluginManager <pluggy.PluginManager>` with
    additional pytest-specific functionality:

    * Loading plugins from the command line, ``PYTEST_PLUGINS`` env variable and
      ``pytest_plugins`` global variables found in plugins being loaded.
    * ``conftest.py`` loading during start-up.
    rK   Nc                    s   dd l }t d t | _i | _d | _d| _tdt	| _	g | _
| |j | |  tjdratj}t|dd}ztt| |jd|d	}W n	 tyT   Y nw | jj|j |   |j | _ d| _!d S )
Nr   r6   F   PYTEST_DEBUGencodingutf8r   )mode	bufferingr   )"_pytest.assertionsuperrN   set_conftest_plugins_dirpath2confmods_confcutdir_noconftestr   r   skipped_pluginsadd_hookspecshookspecr   rY   environgetrg   rh   r   r   dupr   r   rT   traceroot	setwriterwriteenable_tracingr   DummyRewriteHookrewrite_hook_configured)rM   r   errr   	__class__rF   rG   rN     s6   


zPytestPluginManager.__init__r   r   c                    sX   | dsdS |dkrdS t ||}|dur|S t||}t|s&dS t|ddS ):meta private:pytest_Npytest_pluginsimpl)tryfirsttrylastoptionalhookhookwrapper)
startswithr   parse_hookimpl_optsr   r   r   r   )rM   r   r   r   r   r	  rF   rG   r    s   


z'PytestPluginManager.parse_hookimpl_optsc                    s:   t  ||}|du rt||}|drt|dd}|S )r  Nr  r   )firstresulthistoric)r   parse_hookspec_optsr   r  r   )rM   module_or_classr   r   r   r	  rF   rG   r    s   

z'PytestPluginManager.parse_hookspec_optsc              	      sv   |t jjv rttd|dd d S t 	||}|d ur9| j
jjt||| dd t|tjr9| | |S )NzQ{} plugin has been merged into the core, please remove it from your requirements._-)r   plugin_namemanagerkwargs)r   r   DEPRECATED_EXTERNAL_PLUGINSr   warnr/   r   replacer   r   rp   pytest_plugin_registeredcall_historicdictr   types
ModuleTypeconsider_module)rM   r   r   r  r	  rF   rG   r     s,   

zPytestPluginManager.registerc                 C   s   |  |}|S rL   )
get_plugin)rM   r   r   rF   rF   rG   	getplugin  s   
zPytestPluginManager.getpluginc                 C   s   t | |S )z:Return whether a plugin with the given name is registered.)boolr(  )rM   r   rF   rF   rG   	hasplugin     zPytestPluginManager.haspluginrc   r   c                 C   s"   | dd | dd d| _dS )r  markersztryfirst: mark a hook implementation function such that the plugin machinery will try to call it first/as early as possible. DEPRECATED, use @pytest.hookimpl(tryfirst=True) instead.ztrylast: mark a hook implementation function such that the plugin machinery will try to call it last/as late as possible. DEPRECATED, use @pytest.hookimpl(trylast=True) instead.TN)addinivalue_liner  )rM   rc   rF   rF   rG   pytest_configure
  s   
z$PytestPluginManager.pytest_configurer\   pyargs
noconftestrootpath
confcutdirinvocation_dir
importmodeconsider_namespace_packagesc                C   s   |rt || nd| _|| _|| _d}	|D ]*}
t|
}|d}|dkr*|d| }t || }t|r?| j||||d d}	q|	sM| j||||d dS dS )a`  Load initial conftest files given a preparsed "namespace".

        As conftest files may add their own command line options which have
        arguments ('--my-opt somepath') we might get some false positives.
        All builtin and 3rd party plugins will have been loaded, however, so
        common options will not confuse our logic here.
        NFz::r6  T)r(   r   r   _using_pyargsrU   findr-   _try_load_conftest)rM   r\   r0  r1  r2  r3  r4  r5  r6  foundanchorintitial_pathrI   ianchorrF   rF   rG   _set_initial_conftests  s8   

z*PytestPluginManager._set_initial_conftestsrI   c                 C   s   | j du rdS || j jvS )z:Whether to consider the given path to load conftests from.NT)r   parents)rM   rI   rF   rF   rG   _is_in_confcutdirR  s   

z%PytestPluginManager._is_in_confcutdirr?  c                C   sL   | j ||||d | r"|dD ]}| r!| j ||||d qd S d S )Nr8  ztest*)_loadconftestmodulesis_dirglob)rM   r?  r5  r2  r6  xrF   rF   rG   r;  a  s$   z&PytestPluginManager._try_load_conftestc          
      C   s   | j rd S | |}|| jv rd S g }t|g|jR D ]}| |r9|d }| r9| j||||d}	||	 q|| j|< d S )Nzconftest.pyr8  )	r   r   r   reversedrA  rB  r   _importconftestr   )
rM   rI   r5  r2  r6  	directoryclistr   conftestpathmodrF   rF   rG   rC  z  s&   



z(PytestPluginManager._loadconftestmodulesc                 C   s   |  |}| j|dS )NrF   )r   r   r   )rM   rI   rI  rF   rF   rG   _getconftestmodules  s   
z'PytestPluginManager._getconftestmodulesc              	   C   sF   |  |}t|D ]}z
|t||fW   S  ty   Y q	w t|rL   )rM  rG  r   r   KeyError)rM   r   rI   modulesrL  rF   rF   rG   _rget_with_confmod  s   
z&PytestPluginManager._rget_with_confmodrK  c             
   C   sB  t |}| |}|d urttj|S t|}|d u r,ztj|j= W n	 t	y+   Y nw z
t
||||d}W n tyP }	 z|	jd usEJ t||	d|	d }	~	ww | || | j| |j}
|
| jv r| j D ]%\}}|
|jv sw||
kr||v rtd|d| d|j d|| qj| d| | j||d |S )	N)r   r  r6  )rJ   z#While trying to load conftest path z, found that the module z is already loaded with path zE. This is not supposed to happen. Please report this issue to pytest.zloading conftestmodule )registration_name)rU   r(  r   r%  r&  r,   rg   rO  stemrN  r*   rT   __traceback__rH   _check_non_top_pytest_pluginsr   addr   r   itemsrA  AssertionError__file__r   r   consider_conftest)rM   rK  r5  r2  r6  conftestpath_plugin_nameexistingpkgpathrL  rt   dirpathrI   modsrF   rF   rG   rH    sT   



z#PytestPluginManager._importconftestrL  c                 C   s@   t |dr| jr| jsd}t||| jdd d S d S d S d S )Nr  af  Defining 'pytest_plugins' in a non-top-level conftest is no longer supported:
It affects the entire test suite instead of just below the conftest as expected.
  {}
Please move it to a top level conftest file at the rootdir:
  {}
For more information, visit:
  https://docs.pytest.org/en/stable/deprecations.html#pytest-plugins-in-non-top-level-conftest-filesF)pytrace)hasattrr  r9  r&   r   r   )rM   rL  rK  rz   rF   rF   rG   rT    s   	z1PytestPluginManager._check_non_top_pytest_pluginsFr   r   c                C   s   d}t |}||k rU|| }|d7 }t|trO|dkr1z|| }W n
 ty+   Y dS w |d7 }n|dr=|dd }nq| }|rJ|dsJq| | ||k s
dS dS )r  r   r   z-pNr8   no:)lenr   rU   
IndexErrorr  stripr   )rM   r\   r   r>  noptpargrF   rF   rG   r     s*   



z%PytestPluginManager.consider_preparseargc                 C   s   | dr8|dd }|tv rtd| |dkr#| d | d | | | ds6| d|  dS dS |}| | | dsK| d|  | j|d	d
 dS )r  ra  r9   Nzplugin %s cannot be disabledr   r   pytest_stepwiser  T)consider_entry_points)r  essential_pluginsr!   set_blockedunblockr   )rM   rh  r   rF   rF   rG   r     s    






z&PytestPluginManager.consider_pluginargconftestmodulerQ  c                 C   s   | j ||d dS )r  r   N)r   )rM   rn  rQ  rF   rF   rG   rY  *  s   z%PytestPluginManager.consider_conftestc                 C   s   |  tjd dS )r  PYTEST_PLUGINSN)_import_plugin_specsrY   r   r   rR   rF   rF   rG   consider_env0     z PytestPluginManager.consider_envc                 C   s   |  t|dg  dS )r  r  N)rp  r   )rM   rL  rF   rF   rG   r'  4  rr  z#PytestPluginManager.consider_moduler   c                 C   s    t |}|D ]}| | qd S rL   )_get_plugin_specs_as_listr   )rM   r   r]   import_specrF   rF   rG   rp  8  s   z(PytestPluginManager._import_plugin_specsmodnamerj  c              
   C   s
  t |tsJ d| | |s| |durdS |tv r!d| n|}| j| |r6| jd|d}|r6dS zt| W n; t	yZ } zt	d| d|j
d  |j|d}~w tyw } z| j||jpid	f W Y d}~dS d}~ww tj| }| || dS )
zImport a plugin with ``modname``.

        If ``consider_entry_points`` is True, entry point names are also
        considered to find a plugin.
        z$module name as text required, got %rNz_pytest.pytest11r   zError importing plugin "z": r    )r   rU   
is_blockedr(  builtin_pluginsr  mark_rewriteload_setuptools_entrypoints
__import__ImportErrorr\   with_tracebackrS  r'   r   r   rz   rg   rO  r   )rM   ru  rj  
importspecloadedrt   rL  rF   rF   rG   r   ?  s4   

$
z!PytestPluginManager.import_pluginrK   NrL   )rc   r   rK   N)F))r<   r=   r>   r?   rN   _PluggyPluginrU   r   r   r  r   r  r   r)  r*  r+  r/  r   r   r   r+   r@  rB  r;  rC  r%  r&  rM  r   r   rP  rH  rT  r   r   rY  rq  r'  rp  r   __classcell__rF   rF   r	  rG   r     s    3



3



 


5




 specsc                 C   sZ   | du rg S t | tjrg S t | tr| r| dS g S t | tjjr't| S t	d|  )z:Parse a plugins specification into a list of plugin names.N,zYPlugins may be specified as a sequence or a ','-separated string of plugin names. Got: %r)
r   r%  r&  rU   rX   collectionsabcr   r   r!   )r  rF   rF   rG   rs  e  s   
rs  c                   @   s   e Zd Zdd ZdS )Notsetc                 C   s   dS )Nz<NOTSET>rF   rR   rF   rF   rG   __repr__|  s   zNotset.__repr__N)r<   r=   r>   r  rF   rF   rF   rG   r  {  r   r  package_filesc                 c   s    t | } d}| D ]=}d|vo|d}|ddko|d}|r9tj|\}}|dkr8|ds8d}|V  q	|rFtj|}d}|V  q	|spg }| D ]}|d}	d	|	dd	 }
|
rd|
|
 qM|rrt|E d	H  d	S d	S d	S )
aM  Given an iterable of file names in a source distribution, return the "names" that should
    be marked for assertion rewrite.

    For example the package "pytest_mock/__init__.py" should be added as "pytest_mock" in
    the assertion rewrite mechanism.

    This function has to deal with dist-info based distributions and egg based distributions
    (which are still very much in use for "editable" installs).

    Here are the file names as seen in a dist-info based distribution:

        pytest_mock/__init__.py
        pytest_mock/_version.py
        pytest_mock/plugin.py
        pytest_mock.egg-info/PKG-INFO

    Here are the file names as seen in an egg based distribution:

        src/pytest_mock/__init__.py
        src/pytest_mock/_version.py
        src/pytest_mock/plugin.py
        src/pytest_mock.egg-info/PKG-INFO
        LICENSE
        setup.py

    We have to take in account those two distribution flavors in order to determine which
    names should be considered for assertion rewriting.

    More information:
        https://github.com/pytest-dev/pytest-mock/issues/167
    F/z.pyr   z__init__.pysetup__editable__TN)r   endswithcountrY   rI   splitextr  dirnamerX   r   r   _iter_rewritable_modules)r  	seen_somefnis_simple_module
is_packagemodule_namer  package_namenew_package_filespartsnew_fnrF   rF   rG   r    s:    

r  c                   @   s  e Zd ZU dZeejddG dd dZG dd dej	Z
dd	d
edee ddfddZedefddZedee fddZdeg df ddfddZdddZdddZdefddZd
edee dd fddZ	ddee d eej ddfd!d"Zd#edefd$d%Z e!dd&d'Z"dd*d+Z#e$dd,dd.d/Z%de&e ddfd0d1Z'de&e ddfd2d3Z(dd4d5Z)dee d6edee fd7d8Z*dee d9e+d:ee d;ed<ed=e+de,ee e
f fd>d?Z-ddee d@e+ddfdAdBZ.e$ddCde/de0e0f fdDdEZ1ddFdGZ2ddHdIZ3ddJdKZ4dLeddfdMdNZ5dee fdOdPZ6ddee d@e+ddfdQdRZ7dSe8dTe9ddfdUdVZ:dWedXeddfdYdZZ;dWefd[d\Z<dWed]ed^e=eee f fd_d`Z>dWefdadbZ?dWedcedeee  fdddeZ@dWedee fdfdgZAeBdhfdWedie+fdjdkZCddWefdldmZDddWefdndoZEdpZFeGeHdq< drZIeGeHds< dtZJeGeHdu< ddvee de9fdwdxZKeLdvedefdydzZMeLd{d|dved}eddfd~dZNdeddfddZOdddZPdS )r   a  Access to configuration values, pluginmanager and plugin hooks.

    :param PytestPluginManager pluginmanager:
        A pytest PluginManager.

    :param InvocationParams invocation_params:
        Object containing parameters regarding the :func:`pytest.main`
        invocation.
    T)frozenc                   @   sv   e Zd ZU dZeedf ed< 	 eee	ee
f   ed< 	 eed< 	 dee deee	ee
f   deddfdd	ZdS )
zConfig.InvocationParamsa  Holds parameters passed during :func:`pytest.main`.

        The object attributes are read-only.

        .. versionadded:: 5.1

        .. note::

            Note that the environment variable ``PYTEST_ADDOPTS`` and the ``addopts``
            ini option are handled by pytest, not being included in the ``args`` attribute.

            Plugins accessing ``InvocationParams`` must be aware of that.
        .r\   r]   r   rK   Nc                C   s2   t | dt| t | d| t | d| d S )Nr\   r]   r   )object__setattr__tuple)rM   r\   r]   r   rF   rF   rG   rN     s   z Config.InvocationParams.__init__)r<   r=   r>   r?   r   rU   __annotations__r   r   r   r  r   r   rN   rF   rF   rF   rG   r     s"   
 r   c                   @   s,   e Zd ZdZe Ze ZeZe Z	dS )zConfig.ArgsSourcezSIndicates the source of the test arguments.

        .. versionadded:: 7.2
        N)
r<   r=   r>   r?   enumautoARGSINVOCATION_DIRINCOVATION_DIR	TESTPATHSrF   rF   rF   rG   
ArgsSource  s    r  Nr   r   r   rK   c                C   s  ddl m} ddl m} |d u r| jdd t d}t | _	 || _		 |}|d| d| d| j
d	d
| _|| _	 t | _	 | j| _| jjjd| _t| jj| _i | _d| _i | _g | _| j| d d| _| jjjt| j| jdd tjj | _!g | _"t#rddl$m%} d | _&d S d S )Nr   )FILE_OR_DIRr2   rF   r   z%(prog)s [options] [z] [z] [...]T)usage
processopt	_ispytestrc   pytestconfigF)parserr   r  r   )Cache)'
argparsingr  r3   r   r   r   argparse	Namespaceoptionr   _processopt_parserr   r.   stash_storer   r  r   r   rp   	_inicache_override_ini	_opt2dest_cleanupr   r  pytest_addoptionr#  r$  r   r  r  args_sourcer\   r   _pytest.cacheproviderr  cache)rM   r   r   r  r3   _ar  rF   rF   rG   rN     sL   



zConfig.__init__c                 C      | j S )znThe path to the :ref:`rootdir <rootdir>`.

        :type: pathlib.Path

        .. versionadded:: 6.1
        )	_rootpathrR   rF   rF   rG   r2  C     zConfig.rootpathc                 C   r  )zThe path to the :ref:`configfile <configfiles>`.

        :type: Optional[pathlib.Path]

        .. versionadded:: 6.1
        )_inipathrR   rF   rF   rG   inipathM  r  zConfig.inipathfuncc                 C   s   | j | dS )zxAdd a function to be called when the config object gets out of
        use (usually coinciding with pytest_unconfigure).N)r  r   )rM   r  rF   rF   rG   add_cleanupW  s   zConfig.add_cleanupc                 C   s^   | j rJ d| _ t  td | jjjt| dd W d    d S 1 s(w   Y  d S )NTdefaultrb   r  )r  r   catch_warningssimplefilterrp   r/  r#  r$  rR   rF   rF   rG   _do_configure\  s   


"zConfig._do_configurec                 C   sH   | j rd| _ | jj| d g | jj_| jr"| j }|  | jsd S d S )NFrb   )r  rp   pytest_unconfigurer/  _call_historyr  pop)rM   finrF   rF   rG   rr   c  s   

zConfig._ensure_unconfigurec                 C   s   | j d}|d usJ |jS )Nterminalreporter)r   r(  _tw)rM   r  rF   rF   rG   get_terminal_writerl  s
   zConfig.get_terminal_writerr\   c                 C   s   z|  | W | S  tyB   t| jddsd|v r%ddlm} ||   t| jdds4d|v s4d|v rA| j   t	j
d	  w )
NversionFz	--versionr   )showversionhelpz--helpz-hz8
NOTE: displaying only minimal help due to UsageError.

)parser!   r   r  _pytest.helpconfigr  r  
_getparser
print_helprg   r|   r  )rM   r   r\   r  rF   rF   rG   r   s  s"   	zConfig.pytest_cmdline_parseexcinfor  c                 C   s   |rt |ddrd}nd}|jdt |dd|d}| jj||d}t|s<t|d	D ]}tj	d
|  tj
  q,d S d S )N	fulltraceFlongnativeT
showlocals)funcargsr  r`   )excreprr  rd   zINTERNALERROR> %s
)r   rl   rp   pytest_internalerroranyrU   rX   rg   rh   r  r}   )rM   r  r  r`   r  resri   rF   rF   rG   notify_exception  s   zConfig.notify_exceptionnodeidc                 C   s*   | j j| jkr| j| }t| j j|}|S rL   )r   r   r2  r)   )rM   r  fullpathrF   rF   rG   cwd_relative_nodeid  s   
zConfig.cwd_relative_nodeidc                 C   sB   t |}|jj| |j|dd |jjD ]}|j| q|S )z$Constructor usable for subprocesses.Faddopts)r   r  __dict__updater  r]   r   r   )clsoption_dictr\   rc   rF  rF   rF   rG   fromdictargs  s   zConfig.fromdictargsrf  r1   c                 C   sT   |j |j D ]}|j| j|< qt|dr&t| j|js(t| j|j|j d S d S d S )Nr  )_short_opts
_long_optsdestr  r`  r  setattrr  )rM   rf  r   rF   rF   rG   r    s   
zConfig._processopt)r  early_configc                 C   sj   |j |jj|jj|d|jj|jdd\}}| jj	||jj|jj
|j|jj|jj|jj|dd d S )N	testpathsFr\   r0  r  r4  r2  r   r6  )r\   r0  r1  r2  r3  r4  r5  r6  )_decide_argsknown_args_namespacefile_or_dirr0  getinir   r   r2  r   r@  r1  r3  r5  )rM   r  r\   r  rF   rF   rG   pytest_load_initial_conftests  s(   

z$Config.pytest_load_initial_conftestsc                 C   s   | j j|t| jd\}}t|j|j| |jpd | jj	d\}}}|| _
|| _|| _t| j| j jd< t| j| j jd< | j ddd | j dd	 | j jd
ddg d |jpZd| _d S )N	namespace)inifiler\   rootdir_cmd_argr4  rootdirr  r  zExtra command line optionsr\   
minversionz!Minimally required pytest versionrequired_pluginsz.Plugins that must be present for pytest to run)rQ   r  rF   )r  parse_known_and_unknown_argscopyr  r"   inifilenamer  r  r   r   r  r  inicfgrU   r2  
extra_infor  addinioverride_inir  )rM   r\   nsunknown_argsr2  r  r  rF   rF   rG   _initini  s.   
zConfig._initinic                 C   sl   | j |\}}t|dd}|dkr/ddl}z|j| }W n ty)   d}Y nw | | | | dS )zInstall the PEP 302 import hook if using assertion rewriting.

        Needs to parse the --assert=<mode> option from the commandline
        and find all the installed plugins to mark them for rewriting
        by the importhook.
        
assertmodeplainrewriter   N)	r  r  r   r   r   install_importhookSystemError_mark_plugins_for_rewrite_warn_about_missing_assertion)rM   r\   r  r	  r   r   rp   rF   rF   rG   _consider_importhook  s   
zConfig._consider_importhookc                 C   sH   || j _tjdrdS dd tj D }t|D ]}|	| qdS )zGiven an importhook, mark for rewrite any top-level
        modules or packages in the distribution package for
        all pytest plugins.PYTEST_DISABLE_PLUGIN_AUTOLOADNc                 s   s<    | ]}t d d |jD r|jpg D ]}t|V  qqdS )c                 s   s    | ]}|j d kV  qdS )rv  N)group)r   eprF   rF   rG   	<genexpr>  s    z=Config._mark_plugins_for_rewrite.<locals>.<genexpr>.<genexpr>N)r  entry_pointsfilesrU   )r   distfilerF   rF   rG   r  	  s    z3Config._mark_plugins_for_rewrite.<locals>.<genexpr>)
r   r  rY   r   r   rW   metadatadistributionsr  rz  )rM   rp   r  r   rF   rF   rG   r    s   z Config._mark_plugins_for_rewriteviac                 C   s6   || j _z| j j|t| jd W | j `|S | j `w )zValidate known args.r  )r  _config_source_hintr  r  r  )rM   r\   r  rF   rF   rG   _validate_args  s   zConfig._validate_argsr0  r  r4  r2  r   c                C   s   |rt jj}|}||fS ||kr>t jj}|r|}n'g }|D ]}	|ttj|	dd q|r=|s=|r=d}
| jt	|
dd ng }|sKt jj
}t|g}||fS )zDecide the args (initial paths/nodeids) to use given the relevant inputs.

        :param warn: Whether can issue warnings.

        :returns: The args and the args source. Guaranteed to be non-empty.
        T)	recursivezNo files were found in testpaths; consider removing or adjusting your testpaths configuration. Searching recursively from the current directory instead.r9   
stacklevel)r   r  r  r  extendsortedrE  iglobissue_config_time_warningr/   r  rU   )rM   r\   r0  r  r4  r2  r   sourceresultrI   warning_textrF   rF   rG   r    s0   
zConfig._decide_argsr  c              
   C   s  |rt jdd}t|r| t|d| |d d < | | |r2| | dd| |d d < | j	j
|t| jd| _|   | | | jj|dd t jd	s\| jd
 | j  | j	j
|t| jd| _|   |   | jjd u r| jd urt| jj}nt| j}|| j_z| jj| || j	d W d S  ty } z| jjs| jjr| j t!d|j" dd n W Y d }~d S d }~ww )NPYTEST_ADDOPTSrw  zvia PYTEST_ADDOPTSr  zvia addopts configr  Fr   r  rv  )r  r\   r  z"could not load initial conftests: r8   r!  )#rY   r   r   rb  r  shlexrX   r
  r  r  parse_known_argsr  r  r  _checkversionr  r   r   r{  rq  _validate_plugins_warn_about_skipped_pluginsr3  r  rU   r   r2  rp   r  rH   r  r  r&  r/   rI   )rM   r\   r  env_addoptsr3  rt   rF   rF   rG   	_preparseL  sX   






zConfig._preparse)wrapperc                 c   s    zd V W |    S |    w rL   )_validate_config_optionsrR   rF   rF   rG   pytest_collection  s   zConfig.pytest_collectionc                 C   sz   dd l }| jdd }|r9ddlm} t|ts |d| j ||||j	kr;|| j d| d|j	 dd S d S )Nr   r  Versionz'%s: 'minversion' must be a single valuez: 'minversion' requires pytest-z, actual pytest-')
r6   r  r   packaging.versionr6  r   rU   r!   r  __version__)rM   r6   minverr6  rF   rF   rG   r-    s   
	zConfig._checkversionc                 C   s(   t |  D ]}| d| d qd S )NzUnknown config option: rd   )r$  _get_unknown_ini_keys_warn_or_fail_if_strict)rM   keyrF   rF   rG   r3    s   zConfig._validate_config_optionsc           
   	   C   s   t | d}|sd S ddlm} ddlm} ddlm} | j }dd |D }g }|D ]4}z||}	W n |yC   |	| Y q-w |	j
|vrO|	| q-|	jj|||	j
 dd	sa|	| q-|rntd
d|d S )Nr   r   )InvalidRequirement)Requirementr5  c                 S   s   i | ]	\}}|j |jqS rF   )project_namer  )r   r  r  rF   rF   rG   
<dictcomp>  s    z,Config._validate_plugins.<locals>.<dictcomp>T)prereleaseszMissing required plugins: {}r   )r$  r  packaging.requirementsr>  r?  r8  r6  r   list_plugin_distinfor   r   	specifiercontainsr!   r   r   )
rM   r   r>  r?  r6  plugin_infoplugin_dist_infomissing_pluginsrequired_pluginreqrF   rF   rG   r.    s8   



zConfig._validate_pluginsr   c                 C   s&   | j jrt|| jt|dd d S )Nr9   r!  )r  strict_configr!   r&  r/   )rM   r   rF   rF   rG   r<    s   zConfig._warn_or_fail_if_strictc                    s   | j j  fdd| jD S )Nc                    s   g | ]}| vr|qS rF   rF   )r   r   parser_inicfgrF   rG   
<listcomp>  s    z0Config._get_unknown_ini_keys.<locals>.<listcomp>)r  _inidictr  rR   rF   rM  rG   r;    s   zConfig._get_unknown_ini_keysc                 C   s   | j g ks	J d| jjjt| jdd | j||d d| j_z%| jj	|| j
| j
d}| j|| jj| d| jj| jdd\| _ | _W d S  tyO   Y d S w )	Nz:can only parse cmdline args at most once per Config object)r   r  r  Tr  r  r  )r\   rp   pytest_addhooksr#  r$  r   r1  r  after_preparseparse_setoptionr  r  r  r0  r  r   r   r2  r  r    )rM   r\   r  rF   rF   rG   r    s.   

zConfig.parsewarningr"  c                 C   s   | j drdS | jjpg }| d}tjdd}tdt| t	|| tj
||d W d   n1 s8w   Y  |rbt|d }|jj|j|jjf}| jjjt|d	 d
d|dd dS dS )a  Issue and handle a warning during the "configure" stage.

        During ``pytest_configure`` we can't capture warnings using the ``catch_warnings_for_item``
        function because it is not possible to have hook wrappers around ``pytest_configure``.

        This function is mainly intended for plugins that need to issue warnings during
        ``pytest_configure`` (or similar stages).

        :param warning: The warning instance.
        :param stacklevel: stacklevel forwarded to warnings.warn.
        r   NfilterwarningsT)recordalwaysr!  r   r   rc   rw  )warning_messagewhenr  locationr  )r   rx  r  pythonwarningsr  r   r  r  rQ   apply_warning_filtersr   rg   	_getframef_codeco_filenamef_linenoco_namerp   pytest_warning_recordedr#  r$  )rM   rT  r"  cmdline_filtersconfig_filtersrecordsframerZ  rF   rF   rG   r&    s*   


z Config.issue_config_time_warningr   ri   c                 C   s&   |  |}t|tsJ || dS )zAdd a line to an ini-file option. The option must have been
        declared but might not yet be set in which case the line becomes
        the first line in its value.N)r  r   r   r   )rM   r   ri   rF  rF   rF   rG   r.    s   
zConfig.addinivalue_linec                 C   s8   z| j | W S  ty   | | | j |< }| Y S w )a8  Return configuration value from an :ref:`ini file <configfiles>`.

        If a configuration value is not defined in an
        :ref:`ini file <configfiles>`, then the ``default`` value provided while
        registering the configuration through
        :func:`parser.addini <pytest.Parser.addini>` will be returned.
        Please note that you can even provide ``None`` as a valid
        default value.

        If ``default`` is not provided while registering using
        :func:`parser.addini <pytest.Parser.addini>`, then a default value
        based on the ``type`` parameter passed to
        :func:`parser.addini <pytest.Parser.addini>` will be returned.
        The default values based on ``type`` are:
        ``paths``, ``pathlist``, ``args`` and ``linelist`` : empty list ``[]``
        ``bool`` : ``False``
        ``string`` : empty string ``""``

        If neither the ``default`` nor the ``type`` parameter is passed
        while registering the configuration through
        :func:`parser.addini <pytest.Parser.addini>`, then the configuration
        is treated as a string and a default empty string '' is returned.

        If the specified name hasn't been registered through a prior
        :func:`parser.addini <pytest.Parser.addini>` call (usually from a
        plugin), a ValueError is raised.
        )r  rN  _getini)rM   r   valrF   rF   rG   r    s   zConfig.getinirQ   valuec                 C   s   d| }t ||)Nzunknown configuration type: )rs   )rM   r   rQ   ri  rz   rF   rF   rG   _getini_unknown_type4  s   

zConfig._getini_unknown_typec           	   
      sZ  z| j j| \}}}W n ty } ztd||d }~ww | |}|d u r<z| j| }W n ty;   | Y S w |}|dkrd| jd urK| jjn| jj	 t
|trYt|n|} fdd|D S |dkrtt
|trrt|S |S |dkrt
|trdd tdd	 |d
D S |S |dkrtt| S |dkr|S |d u r|S | |||S )Nzunknown configuration value: pathsc                    s   g | ]} | qS rF   rF   )r   rF  dprF   rG   rO  [      z"Config._getini.<locals>.<listcomp>r\   linelistc                 S   s   g | ]}|r|qS rF   rF   )r   trF   rF   rG   rO  `  rn  c                 S   s   |   S rL   rd  )rF  rF   rF   rG   <lambda>`  s    z Config._getini.<locals>.<lambda>rd   r*  string)r  rP  rN  rs   _get_override_ini_valuer  r  r   r   r   r   rU   r+  rX   map
_strtoboolrd  rj  )	rM   r   descriptionrQ   r  rt   override_valueri  input_valuesrF   rl  rG   rg  8  sD   


zConfig._getinirI   c                 C   s   z| j ||\}}W n
 ty   Y d S w |jd usJ t|jj}g }|D ]}t|tjr4t|}n|	dtj
}t|| }|| q'|S )Nr  )r   rP  rN  rX  r   r   r   rY   r   r!  rZ   r(   r   )rM   r   rI   rL  relrootsmodpathvaluesrelrootrF   rF   rG   _getconftest_pathlistl  s   
zConfig._getconftest_pathlistc                 C   s`   d }| j D ](}z
|dd\}}W n ty& } z	td|d|d }~ww ||kr-|}q|S )Nr   r   z3-o/--override-ini expects option=value style (got: z).)r  rX   rs   r!   )rM   r   ri  
ini_configr=  user_ini_valuert   rF   rF   rG   rt  }  s    

zConfig._get_override_ini_valueFskipc              
   C   s   | j ||}zt| j|}|du r|rt||W S  tyI } z#|tur.|W  Y d}~S |r=ddl}|d|d td||d}~ww )ai  Return command line option value.

        :param name: Name of the option.  You may also specify
            the literal ``--OPT`` option instead of the "dest" option name.
        :param default: Default value if no option of that name exists.
        :param skip: If True, raise pytest.skip if option does not exists
            or has a None value.
        Nr   zno z option foundzno option named )	r  r   r   r  r   notsetr6   r  rs   )rM   r   r  r  rh  rt   r6   rF   rF   rG   	getoption  s   	zConfig.getoptionc                 C   s
   |  |S )z$Deprecated, use getoption() instead.r  rM   r   rI   rF   rF   rG   getvalue     
zConfig.getvaluec                 C   s   | j |ddS )z-Deprecated, use getoption(skip=True) instead.T)r  r  r  rF   rF   rG   getvalueorskip  r,  zConfig.getvalueorskip
assertionsVERBOSITY_ASSERTIONS
test_casesVERBOSITY_TEST_CASESr  _VERBOSITY_INI_DEFAULTverbosity_typec                 C   s\   | j j}t|tsJ |du r|S t|}|| jjvr|S | |}|tj	kr*|S t|S )a4  Retrieve the verbosity level for a fine-grained verbosity type.

        :param verbosity_type: Verbosity type to get level for. If a level is
            configured for the given type, that value will be returned. If the
            given type is not a known verbosity type, the global verbosity
            level will be returned. If the given type is None (default), the
            global verbosity level will be returned.

        To configure a level for a fine-grained verbosity type, the
        configuration file should have a setting for the configuration name
        and a numeric value for the verbosity level. A special value of "auto"
        can be used to explicitly use the global verbosity level.

        Example:
        .. code-block:: ini

            # content of pytest.ini
            [pytest]
            verbosity_assertions = 2

        .. code-block:: console

            pytest -v

        .. code-block:: python

            print(config.get_verbosity())  # 1
            print(config.get_verbosity(Config.VERBOSITY_ASSERTIONS))  # 2
        N)
r  verboser   intr   _verbosity_ini_namer  rP  r  r  )rM   r  global_levelini_namelevelrF   rF   rG   get_verbosity  s   


zConfig.get_verbosityc                 C   s
   d|  S )N
verbosity_rF   )r  rF   rF   rG   r    r  zConfig._verbosity_ini_namer  r3   r  c                 C   s   | j t||dtjd dS )a  Add a output verbosity configuration option for the given output type.

        :param parser: Parser for command line arguments and ini-file values.
        :param verbosity_type: Fine-grained verbosity category.
        :param help: Description of the output this type controls.

        The value should be retrieved via a call to
        :py:func:`config.get_verbosity(type) <pytest.Config.get_verbosity>`.
        rs  )r  rQ   r  N)r  r   r  r  )r  r  r  rF   rF   rG   _add_verbosity_ini  s   
zConfig._add_verbosity_inir   c                 C   s2   t  s|dkr
d}nd}| jt|dd d S d S )Nr  zRASSERTIONS ARE NOT EXECUTED and FAILING TESTS WILL PASS.  Are you using python -O?zassertions not in test modules or plugins will be ignored because assert statements are not executed by the underlying Python interpreter (are you using python -O?)
r9   r!  )_assertion_supportedr&  r/   )rM   r   r)  rF   rF   rG   r    s   
z$Config._warn_about_missing_assertionc                 C   s4   | j jD ]\}}| jtd|d| dd qd S )Nzskipped plugin rO   r8   r!  )r   r   r&  r/   )rM   r  rz   rF   rF   rG   r/    s   z"Config._warn_about_skipped_pluginsr  rL   )rK   r   )rf  r1   rK   N)r  r   rK   N)T)Qr<   r=   r>   r?   r   dataclasses	dataclassr   r  Enumr  r   r   rN   propertyr   r2  r  r   r  r  rr   r%   r  r   rU   r   r#   r   r  r  r  r  classmethodr  r  hookimplr  r   r
  r  r  r  r*  r   r  r1  r   r  r4  r-  r3  r.  r<  r;  r  Warningr  r&  r.  r  r   rj  rg  r~  rt  r  r  r  r  r  r
   r  r  r  r  r   r  r  r  r/  rF   rF   rF   rG   r     s   
 

!
B		

	


	
	
-6


!#"$4-c                   C   s   zJ  t y   Y dS w )NFT)rW  rF   rF   rF   rG   r    s
   r  rc   r  c                 C   s\   t |d}| jjdkrd|_n	| jjdkrd|_| jjdkr#d|_|S | jjdkr,d|_|S )zCreate a TerminalWriter instance configured according to the options
    in the config object.

    Every code which requires a TerminalWriter object and has access to a
    config object should use this function.
    )r  yesTnoF)r%   r  color	hasmarkupcode_highlight)rc   r  rv   rF   rF   rG   create_terminal_writer  s   
	r  rh  c                 C   s.   |   } | dv r
dS | dv rdS td| )a  Convert a string representation of truth to True or False.

    True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
    are 'n', 'no', 'f', 'false', 'off', and '0'.  Raises ValueError if
    'val' is anything else.

    .. note:: Copied from distutils.util.
    )yr  rp  trueon1T)re  r  ffalseoff0Fzinvalid truth value )lowerrs   )rh  rF   rF   rG   rv  5  s   	rv  2   )maxsizerh  escapezwarnings._ActionKindc             
   C   s  d}t d|  d}| d}t|dkr,d}t dt| d| d	}t|j|d
t|dk r=|d t|dk s2dd |D \}}}	}
}zt|}W n tjyh } zt|jt	|d
dd}~ww zt
|	}W n ty   t }|jdd}t|j|d
dw |r|rt|}|
r|rt|
d }
|rzt|}|dk rtdW n ty } zt|jd|d| d
dd}~ww d}||||
|fS )zParse a warnings filter string.

    This is copied from warnings._setoption with the following changes:

    * Does not apply the filter.
    * Escaping is optional.
    * Raises UsageError so we get nice error messages on failure.
    TzF        while parsing the following warning configuration:

          z8

        This error occurred:

        {error}
        :r;   zJhttps://docs.python.org/3/library/warnings.html#describing-warning-filtersz            Too many fields (z), expected at most 5 separated by colons:

              action:message:category:module:line

            For more information please consult: z
            )errorrw  c                 s   s    | ]}|  V  qd S rL   rq  )r   srF   rF   rG   r  r  s    z'parse_warning_filter.<locals>.<genexpr>Nr  )r`   z\Zr   znumber is negativezinvalid lineno rO   )r   rX   rb  r!   r   r   r   
_getaction_OptionErrorrU   _resolve_warning_categoryrT   r#   from_currentrl   rer  r  rs   )rh  r  __tracebackhide__error_templater  doc_urlr  action_r   	category_modulelineno_actionrt   categoryru   exception_textlinenorF   rF   rG   parse_warning_filterG  sn   
	

r  r  c                 C   sr   d}| st S d| vrddl}| }n| d\}}}t|dd|g}t||}t|t s2t| dttt  |S )z
    Copied from warnings._getcategory, but changed so it lets exceptions (specially ImportErrors)
    propagate so we can get access to their tracebacks (#9218).
    T.r   Nz is not a Warning subclass)	r  builtins
rpartitionr|  r   
issubclassr!   r   r   )r  r  r   klassr  r  catrF   rF   rG   r    s   

r  rd  rc  c                 C   s<   | D ]}t jt|dd  q|D ]}t jt|dd  qdS )z8Applies pytest-configured filters to the warnings moduleF)r  TN)r   rU  r  )rd  rc  rh  rF   rF   rG   r\    s
   r\  )NN)rK   r   rL   )r?   r  collections.abcr  r  r  r  	functoolsr   rE  importlib.metadatarW   r   rY   pathlibr   r  r+  rg   textwrapr   r%  r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   pluggyr   r   r   r   r   compatr   
exceptionsr    r!   	findpathsr"   _pytest._coder   r#   r$   _pytest._ior%   _pytest.deprecated_pytest.hookspec_pytest.outcomesr&   r'   _pytest.pathlibr(   r)   r*   r+   r,   r-   _pytest.stashr.   _pytest.warning_typesr/   r0   r  r1   r3   _pytest._code.coder4   _pytest.terminalr5   r  r  r  r   IntEnumr7   rT   rH   _codeTracebackEntryr*  r[   rU   r  r{   r   r   r   r   rk  r   r   ry  rU  r   r   re   r   r   r   r&  rs  r  r  r  r   r  r  rv  r  r  r  r\  rF   rF   rF   rG   <module>   s  	


2	






 


    e
A      U

G