11import dataclasses
2- import os
2+ import _pytest . nodes
33import random
4+ import os
45import typing
56
6- import requests # type: ignore[import-untyped]
7+ import requests
78import opentelemetry .sdk .resources
89from opentelemetry .sdk .trace import export
910from opentelemetry .sdk .trace import TracerProvider , SpanProcessor , ReadableSpan
1314)
1415
1516from pytest_mergify import utils
17+ import pytest_mergify .quarantine
1618
1719import pytest_mergify .resources .ci as resources_ci
20+ from opentelemetry .semconv ._incubating .attributes import vcs_attributes
1821import pytest_mergify .resources .github_actions as resources_gha
1922import pytest_mergify .resources .pytest as resources_pytest
2023import pytest_mergify .resources .mergify as resources_mergify
@@ -60,6 +63,10 @@ class MergifyCIInsights:
6063 "MERGIFY_API_URL" , "https://api.mergify.com"
6164 )
6265 )
66+ branch_name : typing .Optional [str ] = dataclasses .field (
67+ init = False ,
68+ default = None ,
69+ )
6370 exporter : typing .Optional [export .SpanExporter ] = dataclasses .field (
6471 init = False , default = None
6572 )
@@ -70,7 +77,14 @@ class MergifyCIInsights:
7077 dataclasses .field (init = False , default = None )
7178 )
7279 test_run_id : str = dataclasses .field (
73- default_factory = lambda : random .getrandbits (64 ).to_bytes (8 , "big" ).hex ()
80+ init = False ,
81+ default_factory = lambda : random .getrandbits (64 ).to_bytes (8 , "big" ).hex (),
82+ )
83+ quarantined_tests : typing .Optional [pytest_mergify .quarantine .Quarantine ] = (
84+ dataclasses .field (
85+ init = False ,
86+ default = None ,
87+ )
7488 )
7589
7690 def __post_init__ (self ) -> None :
@@ -122,3 +136,24 @@ def __post_init__(self) -> None:
122136
123137 self .tracer_provider .add_span_processor (span_processor )
124138 self .tracer = self .tracer_provider .get_tracer ("pytest-mergify" )
139+
140+ # Retrieve the branch name based on the detected resources's attributes
141+ branch_name = resource .attributes .get (
142+ vcs_attributes .VCS_REF_BASE_NAME ,
143+ resource .attributes .get (vcs_attributes .VCS_REF_HEAD_NAME ),
144+ )
145+ if branch_name is not None :
146+ # `str` cast just for `mypy`
147+ self .branch_name = str (branch_name )
148+
149+ if self .token and self .repo_name and self .branch_name :
150+ self .quarantined_tests = pytest_mergify .quarantine .Quarantine (
151+ self .api_url ,
152+ self .token ,
153+ self .repo_name ,
154+ self .branch_name ,
155+ )
156+
157+ def mark_test_as_quarantined_if_needed (self , item : _pytest .nodes .Item ) -> None :
158+ if self .quarantined_tests is not None and item in self .quarantined_tests :
159+ self .quarantined_tests .mark_test_as_quarantined (item )
0 commit comments