o
    ªZhw  ã                   @   s,   d dl mZ ddlmZ G dd„ deƒZdS )é   )ÚLoadScopeSchedulingé    )ÚProducerc                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚLoadGroupSchedulingzóImplement load scheduling across nodes, but grouping test by xdist_group mark.

    This class behaves very much like LoadScopeScheduling, but it groups tests by xdist_group mark
    instead of the module or class to which they belong to.
    Nc                    s0   t ƒ  ||¡ |d u rtdƒ| _d S |j| _d S )NÚloadgroupsched)ÚsuperÚ__init__r   Úlogr   )ÚselfÚconfigr	   ©Ú	__class__© úP/var/www/html/lang_env/lib/python3.10/site-packages/xdist/scheduler/loadgroup.pyr      s   zLoadGroupScheduling.__init__c                 C   s&   |  d¡|  d¡kr| d¡d S |S )a  Determine the scope (grouping) of a nodeid.

        There are usually 3 cases for a nodeid::

            example/loadsuite/test/test_beta.py::test_beta0
            example/loadsuite/test/test_delta.py::Delta1::test_delta0
            example/loadsuite/epsilon/__init__.py::epsilon.epsilon

        #. Function in a test module.
        #. Method of a class in a test module.
        #. Doctest in a function in a package.

        With loadgroup, two cases are added::

            example/loadsuite/test/test_beta.py::test_beta0
            example/loadsuite/test/test_delta.py::Delta1::test_delta0
            example/loadsuite/epsilon/__init__.py::epsilon.epsilon
            example/loadsuite/test/test_gamma.py::test_beta0@gname
            example/loadsuite/test/test_delta.py::Gamma1::test_gamma0@gname

        This function will group tests with the scope determined by splitting the first ``@``
        from the right. That is, test will be grouped in a single work unit when they have
        same group name. In the above example, scopes will be::

            example/loadsuite/test/test_beta.py::test_beta0
            example/loadsuite/test/test_delta.py::Delta1::test_delta0
            example/loadsuite/epsilon/__init__.py::epsilon.epsilon
            gname
            gname
        ú@ú]éÿÿÿÿ)ÚrfindÚsplit)r
   Znodeidr   r   r   Ú_split_scope   s   z LoadGroupScheduling._split_scope)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__r   r   r   r   r      s    r   N)Z	loadscoper   Zxdist.remoter   r   r   r   r   r   Ú<module>   s    