
"""simple docstring"""



import tempfile
import unittest

from transformers import TaConfig, is_torch_available
from transformers.testing_utils import (
    require_sentencepiece,
    require_tokenizers,
    require_torch,
    slow,
    torch_device,
)

from ...generation.test_utils import GenerationTesterMixin
from ...test_modeling_common import ModelTesterMixin, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
 import torch

 from transformers import AutoTokenizer, UMTaForConditionalGeneration, UMTaForQuestionAnswering, UMTaModel




class 		a_						:







    def __init__(			self			:       Tuple     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       List[Any]=99     ,					__UpperCamelCase			:       Optional[int]=13     ,					__UpperCamelCase			:       List[str]=7     ,					__UpperCamelCase			:       List[Any]=9     ,					__UpperCamelCase			:       List[Any]=True     ,					__UpperCamelCase			:       str=True     ,					__UpperCamelCase			:       int=False     ,					__UpperCamelCase			:       int=32     ,					__UpperCamelCase			:       Dict=5     ,					__UpperCamelCase			:       Optional[int]=4     ,					__UpperCamelCase			:       Any=37     ,					__UpperCamelCase			:       List[Any]=8     ,					__UpperCamelCase			:       Optional[int]=0.1     ,					__UpperCamelCase			:       str=0.0_0_2     ,					__UpperCamelCase			:       Union[str, Any]=1     ,					__UpperCamelCase			:       List[Any]=0     ,					__UpperCamelCase			:       Tuple=0     ,					__UpperCamelCase			:       Optional[int]=None     ,					__UpperCamelCase			:       Any=None     ,					)		->List[Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   parent
        _UpperCAmelCase          =   batch_size
        _UpperCAmelCase          =   encoder_seq_length
        _UpperCAmelCase          =   decoder_seq_length
        # For common tests
        _UpperCAmelCase          =   self.decoder_seq_length
        _UpperCAmelCase          =   is_training
        _UpperCAmelCase          =   use_attention_mask
        _UpperCAmelCase          =   use_labels
        _UpperCAmelCase          =   vocab_size
        _UpperCAmelCase          =   hidden_size
        _UpperCAmelCase          =   num_hidden_layers
        _UpperCAmelCase          =   num_attention_heads
        _UpperCAmelCase          =   d_ff
        _UpperCAmelCase          =   relative_attention_num_buckets
        _UpperCAmelCase          =   dropout_rate
        _UpperCAmelCase          =   initializer_factor
        _UpperCAmelCase          =   eos_token_id
        _UpperCAmelCase          =   pad_token_id
        _UpperCAmelCase          =   decoder_start_token_id
        _UpperCAmelCase          =   None
        _UpperCAmelCase          =   decoder_layers







    def      _snake_case					(			self			:       Union[str, Any]     )		->Union[str, Any]:






        '''simple docstring'''






        return TaConfig.from_pretrained("""google/umt5-base"""     )







    def      _snake_case					(			self			:       List[Any]     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       List[Any]     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       Tuple=None     ,					__UpperCamelCase			:       Optional[Any]=None     ,					__UpperCamelCase			:       Optional[Any]=None     ,					__UpperCamelCase			:       Any=None     ,					__UpperCamelCase			:       str=None     ,					)		->int:






        '''simple docstring'''






        if attention_mask is None:
            _UpperCAmelCase          =   input_ids.ne(config.pad_token_id     )
        if decoder_attention_mask is None:
            _UpperCAmelCase          =   decoder_input_ids.ne(config.pad_token_id     )
        if head_mask is None:
            _UpperCAmelCase          =   torch.ones(config.num_hidden_layers     ,					config.num_attention_heads     ,					device=__UpperCamelCase     )
        if decoder_head_mask is None:
            _UpperCAmelCase          =   torch.ones(config.num_decoder_layers     ,					config.num_attention_heads     ,					device=__UpperCamelCase     )
        if cross_attn_head_mask is None:
            _UpperCAmelCase          =   torch.ones(
                config.num_decoder_layers     ,					config.num_attention_heads     ,					device=__UpperCamelCase     )
        return {
            "input_ids": input_ids,
            "decoder_input_ids": decoder_input_ids,
            "attention_mask": attention_mask,
            "decoder_attention_mask": decoder_attention_mask,
            "head_mask": head_mask,
            "decoder_head_mask": decoder_head_mask,
            "cross_attn_head_mask": cross_attn_head_mask,
        }







    def      _snake_case					(			self			:       List[Any]     )		->Union[str, Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   ids_tensor([self.batch_size, self.encoder_seq_length]     ,					self.vocab_size     )
        _UpperCAmelCase          =   ids_tensor([self.batch_size, self.decoder_seq_length]     ,					self.vocab_size     )

        # we need to clamp the input ids here to avoid having pad token in between
        # this is because for NllbMoe the position_ids are prepared such that
        # all pad tokens have pos id = 2 and rest are between 2..seq_length
        # and the seq_length here is seq_length - num_pad_tokens
        # but when using past, there is no way of knowing if the past input ids had
        # pad tokens in them, which results in incorrect seq_lenth and which in turn results in
        # position_ids being off by num_pad_tokens in past input
        _UpperCAmelCase          =   input_ids.clamp(self.pad_token_id + 1     )
        _UpperCAmelCase          =   decoder_input_ids.clamp(self.pad_token_id + 1     )

        _UpperCAmelCase          =   self.get_config()
        _UpperCAmelCase          =   config.num_attention_heads
        _UpperCAmelCase          =   self.prepare_inputs_dict(__UpperCamelCase     ,					__UpperCamelCase     ,					__UpperCamelCase     )
        return config, input_dict







    def      _snake_case					(			self			:       Union[str, Any]     )		->Any:






        '''simple docstring'''






        _UpperCAmelCase    ,_UpperCAmelCase          =   self.prepare_config_and_inputs()
        return config, inputs_dict







    def      _snake_case					(			self			:       Dict     )		->List[str]:






        '''simple docstring'''






        return TaConfig(
            vocab_size=1_66     ,					d_model=self.hidden_size     ,					d_ff=self.d_ff     ,					d_kv=self.hidden_size // self.num_attention_heads     ,					num_layers=self.num_hidden_layers     ,					num_decoder_layers=self.decoder_layers     ,					num_heads=self.num_attention_heads     ,					relative_attention_num_buckets=self.relative_attention_num_buckets     ,					dropout_rate=self.dropout_rate     ,					initializer_factor=self.initializer_factor     ,					eos_token_id=self.eos_token_id     ,					bos_token_id=self.pad_token_id     ,					pad_token_id=self.pad_token_id     ,					decoder_start_token_id=self.decoder_start_token_id     ,					)







    def      _snake_case					(			self			:       Tuple     )		->Dict:






        '''simple docstring'''






        return TaConfig(
            vocab_size=self.vocab_size     ,					d_model=self.hidden_size     ,					d_ff=self.d_ff     ,					d_kv=self.hidden_size // self.num_attention_heads     ,					num_layers=self.num_hidden_layers     ,					num_decoder_layers=self.decoder_layers     ,					num_heads=self.num_attention_heads     ,					relative_attention_num_buckets=self.relative_attention_num_buckets     ,					dropout_rate=self.dropout_rate     ,					initializer_factor=self.initializer_factor     ,					eos_token_id=self.eos_token_id     ,					bos_token_id=self.pad_token_id     ,					pad_token_id=self.pad_token_id     ,					decoder_start_token_id=self.decoder_start_token_id     ,					)







    def      _snake_case					(			self			:       List[Any]     ,					__UpperCamelCase			:       Union[str, Any]     ,					__UpperCamelCase			:       Any     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       Optional[Any]     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       List[str]     ,					)		->List[str]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModel(config=__UpperCamelCase     )
        model.to(__UpperCamelCase     )
        model.eval()
        _UpperCAmelCase          =   model(
            input_ids=__UpperCamelCase     ,					decoder_input_ids=__UpperCamelCase     ,					attention_mask=__UpperCamelCase     ,					decoder_attention_mask=__UpperCamelCase     ,					)
        _UpperCAmelCase          =   model(input_ids=__UpperCamelCase     ,					decoder_input_ids=__UpperCamelCase     )
        _UpperCAmelCase          =   result.last_hidden_state
        _UpperCAmelCase          =   result.past_key_values
        _UpperCAmelCase          =   result.encoder_last_hidden_state

        self.parent.assertEqual(encoder_output.size()     ,					(self.batch_size, self.encoder_seq_length, self.hidden_size)     )
        self.parent.assertEqual(decoder_output.size()     ,					(self.batch_size, self.decoder_seq_length, self.hidden_size)     )
        # There should be `num_layers` key value embeddings stored in decoder_past
        self.parent.assertEqual(len(__UpperCamelCase     )     ,					config.num_layers     )
        # There should be a self attn key, a self attn value, a cross attn key and a cross attn value stored in each decoder_past tuple
        self.parent.assertEqual(len(decoder_past[0]     )     ,					4     )







    def      _snake_case					(			self			:       Union[str, Any]     ,					__UpperCamelCase			:       List[Any]     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       Union[str, Any]     ,					__UpperCamelCase			:       List[str]     ,					)		->str:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModel(config=__UpperCamelCase     ).get_decoder().to(__UpperCamelCase     ).eval()
        # first forward pass
        _UpperCAmelCase          =   model(__UpperCamelCase     ,					use_cache=__UpperCamelCase     )
        _UpperCAmelCase          =   model(__UpperCamelCase     )
        _UpperCAmelCase          =   model(__UpperCamelCase     ,					use_cache=__UpperCamelCase     )

        self.parent.assertTrue(len(__UpperCamelCase     ) == len(__UpperCamelCase     )     )
        self.parent.assertTrue(len(__UpperCamelCase     ) == len(__UpperCamelCase     ) + 1     )

        _UpperCAmelCase    ,_UpperCAmelCase          =   outputs.to_tuple()

        # create hypothetical next token and extent to next_input_ids
        _UpperCAmelCase          =   ids_tensor((self.batch_size, 1)     ,					config.vocab_size     )

        # append to next input_ids and
        _UpperCAmelCase          =   torch.cat([input_ids, next_tokens]     ,					dim=-1     )

        _UpperCAmelCase          =   model(__UpperCamelCase     )["""last_hidden_state"""]
        _UpperCAmelCase          =   model(__UpperCamelCase     ,					past_key_values=__UpperCamelCase     )["""last_hidden_state"""]

        # select random slice
        _UpperCAmelCase          =   ids_tensor((1,)     ,					output_from_past.shape[-1]     ).item()
        _UpperCAmelCase          =   output_from_no_past[:, -1, random_slice_idx].detach()
        _UpperCAmelCase          =   output_from_past[:, 0, random_slice_idx].detach()

        # test that outputs are equal for slice
        self.parent.assertTrue(torch.allclose(__UpperCamelCase     ,					__UpperCamelCase     ,					atol=1e-3     )     )







    def      _snake_case					(			self			:       Optional[int]     ,					__UpperCamelCase			:       int     ,					__UpperCamelCase			:       Dict     ,					)		->List[str]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModel(config=__UpperCamelCase     ).to(__UpperCamelCase     ).half().eval()
        _UpperCAmelCase          =   model(**__UpperCamelCase     )["""last_hidden_state"""]
        self.parent.assertFalse(torch.isnan(__UpperCamelCase     ).any().item()     )







@require_torch
class 		a_						( _UpperCAmelCase     ,						_UpperCAmelCase     ,						_UpperCAmelCase     ,						unittest.TestCase	):
    a      :				List[str]     =				(
        (UMTaModel, UMTaForConditionalGeneration, UMTaForQuestionAnswering) if is_torch_available() else ()
    )
    a      :				Tuple     =				(UMTaForConditionalGeneration,) if is_torch_available() else ()
    a      :				Optional[Any]     =				(
        {
            'conversational': UMTaForConditionalGeneration,
            'feature-extraction': UMTaModel,
            'summarization': UMTaForConditionalGeneration,
            'text2text-generation': UMTaForConditionalGeneration,
            'translation': UMTaForConditionalGeneration,
            'question-answering': UMTaForQuestionAnswering,
        }
        if is_torch_available()
        else {}
    )
    a      :				Any     =				True
    a      :				Optional[int]     =				False
    a      :				Any     =				False
    a      :				Optional[int]     =				True
    a      :				Optional[Any]     =				True
    # The small UMT5 model needs higher percentages for CPU/MP tests
    a      :				int     =				[0.8, 0.9]







    def      _snake_case					(			self			:       Optional[Any]     )		->Union[str, Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModelTester(self     )







    @unittest.skip("""Test has a segmentation fault on torch 1.8.0"""     )
    def      _snake_case					(			self			:       Union[str, Any]     )		->Union[str, Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   self.model_tester.prepare_config_and_inputs()
        _UpperCAmelCase          =   UMTaModel(config_and_inputs[0]     ).to(__UpperCamelCase     )
        with tempfile.TemporaryDirectory() as tmpdirname:
            torch.onnx.export(
                __UpperCamelCase     ,					(config_and_inputs[1], config_and_inputs[3], config_and_inputs[2])     ,					f"""{tmpdirname}/t5_test.onnx"""     ,					export_params=__UpperCamelCase     ,					opset_version=9     ,					input_names=["""input_ids""", """decoder_input_ids"""]     ,					)







    @unittest.skipIf(torch_device == """cpu"""     ,					"""Cant do half precision"""     )
    def      _snake_case					(			self			:       Tuple     )		->Optional[int]:






        '''simple docstring'''






        _UpperCAmelCase          =   self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_model_fpaa_forward(*__UpperCamelCase     )







    def      _snake_case					(			self			:       Any     )		->Any:






        '''simple docstring'''






        _UpperCAmelCase          =   ["""encoder_attentions""", """decoder_attentions""", """cross_attentions"""]
        _UpperCAmelCase          =   self.model_tester.prepare_config_and_inputs()
        _UpperCAmelCase          =   config_and_inputs[0]
        _UpperCAmelCase          =   UMTaForConditionalGeneration(__UpperCamelCase     ).eval()
        model.to(__UpperCamelCase     )

        _UpperCAmelCase          =   {
            """head_mask""": torch.zeros(config.num_layers     ,					config.num_heads     ,					device=__UpperCamelCase     ),
            """decoder_head_mask""": torch.zeros(config.num_decoder_layers     ,					config.num_heads     ,					device=__UpperCamelCase     ),
            """cross_attn_head_mask""": torch.zeros(config.num_decoder_layers     ,					config.num_heads     ,					device=__UpperCamelCase     ),
        }

        for attn_name, (name, mask) in zip(__UpperCamelCase     ,					head_masking.items()     ):
            _UpperCAmelCase          =   {name: mask}
            # Explicitly pass decoder_head_mask as it is required from T5 model when head_mask specified
            if name == "head_mask":
                _UpperCAmelCase          =   torch.ones(
                    config.num_decoder_layers     ,					config.num_heads     ,					device=__UpperCamelCase     )

            _UpperCAmelCase          =   model.generate(
                config_and_inputs[1]["""input_ids"""]     ,					num_beams=1     ,					max_length=3     ,					output_attentions=__UpperCamelCase     ,					return_dict_in_generate=__UpperCamelCase     ,					**__UpperCamelCase     ,					)
            # We check the state of decoder_attentions and cross_attentions just from the last step
            _UpperCAmelCase          =   out[attn_name] if attn_name == attention_names[0] else out[attn_name][-1]
            self.assertEqual(sum([w.sum().item() for w in attn_weights]     )     ,					0.0     )







    @unittest.skip("""Does not work on the tiny model as we keep hitting edge cases."""     )
    def      _snake_case					(			self			:       Tuple     )		->List[Any]:






        '''simple docstring'''






        pass







@require_torch
@require_sentencepiece
@require_tokenizers
class 		a_						( unittest.TestCase	):







    @slow
    @unittest.skip(
        """Unless we stop stripping left and right by default for all special tokens, the expected ids obtained here will not match the original ones. Wait for https://github.com/huggingface/transformers/pull/23909 to be merged"""     )
    def      _snake_case					(			self			:       Optional[Any]     )		->Optional[Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaForConditionalGeneration.from_pretrained("""google/umt5-small"""     ,					return_dict=__UpperCamelCase     ).to(__UpperCamelCase     )
        _UpperCAmelCase          =   AutoTokenizer.from_pretrained("""google/umt5-small"""     ,					use_fast=__UpperCamelCase     ,					legacy=__UpperCamelCase     )
        _UpperCAmelCase          =   [
            """Bonjour monsieur <extra_id_0> bien <extra_id_1>.""",
            """No se como puedo <extra_id_0>.""",
            """This is the reason why we <extra_id_0> them.""",
            """The <extra_id_0> walks in <extra_id_1>, seats""",
            """A <extra_id_0> walks into a bar and orders a <extra_id_1> with <extra_id_2> pinch of <extra_id_3>.""",
        ]
        _UpperCAmelCase          =   tokenizer(__UpperCamelCase     ,					return_tensors="""pt"""     ,					padding=__UpperCamelCase     ).input_ids
        # fmt: off
        _UpperCAmelCase          =   torch.tensor(
            [
                [ 3_85_30, 21_07_03, 25_62_99, 14_10, 25_62_98, 2_74, 1, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0],
                [   8_26, 3_21, 6_71, 2_59_22, 25_62_99, 2_74, 1, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0],
                [  14_60, 3_39, 3_12, 1_90_14, 1_06_20, 7_58, 25_62_99, 23_55,2_74, 1, 0, 0, 0, 0, 0, 0,0, 0],
                [   5_17, 25_62_99, 1_48_69, 2_81, 3_01, 25_62_98, 2_75, 11_99_83,1, 0, 0, 0, 0, 0, 0, 0,0, 0],
                [   3_20, 25_62_99, 1_48_69, 2_81, 22_34, 2_89, 22_75, 3_33,6_13_91, 2_89, 25_62_98, 5_43, 25_62_97, 16_87_14, 3_29, 25_62_96,2_74, 1],
            ]     )
        # fmt: on
        torch.testing.assert_allclose(__UpperCamelCase     ,					__UpperCamelCase     )

        _UpperCAmelCase          =   model.generate(input_ids.to(__UpperCamelCase     )     )
        _UpperCAmelCase          =   [
            """<pad><extra_id_0> et<extra_id_1> [eod] <extra_id_2><extra_id_55>.. [eod] 💐 💐 💐 💐 💐 💐 💐 💐 💐 💐 💐 <extra_id_56>ajšietosto<extra_id_56>lleux<extra_id_19><extra_id_6>ajšie</s>""",
            """<pad><extra_id_0>.<extra_id_1>.,<0x0A>...spech <0x0A><extra_id_20> <extra_id_21></s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
            """<pad><extra_id_0> are not going to be a part of the world. We are not going to be a part of<extra_id_1> and<extra_id_2><0x0A><extra_id_48>.<extra_id_48></s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
            """<pad><extra_id_0> door<extra_id_1>, the door<extra_id_2> 피해[/</s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
            """<pad><extra_id_0>nyone who<extra_id_1> drink<extra_id_2> a<extra_id_3> alcohol<extra_id_4> A<extra_id_5> A. This<extra_id_6> I<extra_id_7><extra_id_52><extra_id_53></s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
        ]
        _UpperCAmelCase          =   tokenizer.batch_decode(__UpperCamelCase     )
        self.assertEqual(__UpperCamelCase     ,					__UpperCamelCase     )

"""simple docstring"""



import collections
import json
import math
import os
import re
import time
from fnmatch import fnmatch
from typing import Dict

import requests
from slack_sdk import WebClient


a					:	int							=		WebClient(token=os.environ['''CI_SLACK_BOT_TOKEN'''])


def  _UpperCamelCase	(						_A      )    ->  List[str]:





    """simple docstring"""

    _UpperCAmelCase          =   test_results.split(""" """      )

    _UpperCAmelCase          =   0
    _UpperCAmelCase          =   0

    # When the output is short enough, the output is surrounded by = signs: "== OUTPUT =="
    # When it is too long, those signs are not present.
    _UpperCAmelCase          =   expressions[-2] if """=""" in expressions[-1] else expressions[-1]

    for i, expression in enumerate(_A      ):
        if "failed" in expression:
            failed += int(expressions[i - 1]      )
        if "passed" in expression:
            success += int(expressions[i - 1]      )

    return failed, success, time_spent


def  _UpperCamelCase	(						_A      )    ->  int:





    """simple docstring"""

    _UpperCAmelCase          =   {}
    _UpperCAmelCase          =   None
    _UpperCAmelCase          =   False
    for line in failures_short_lines.split("""\n"""      ):
        if re.search(R"""_ \[doctest\]"""					,      _A      ):
            _UpperCAmelCase          =   True
            _UpperCAmelCase          =   line.split(""" """      )[2]
        elif in_error and not line.split(""" """      )[0].isdigit():
            _UpperCAmelCase          =   line
            _UpperCAmelCase          =   False

    return failures




class 		a_						:







    def __init__(			self			:       Union[str, Any]     ,					__UpperCamelCase			:       str     ,					__UpperCamelCase			:       Dict     )		->Union[str, Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   title

        _UpperCAmelCase          =   doc_test_results["""time_spent"""].split(""","""     )[0]
        _UpperCAmelCase          =   doc_test_results["""success"""]
        _UpperCAmelCase          =   doc_test_results["""failures"""]
        _UpperCAmelCase          =   self.n_success + self.n_failures

        # Failures and success of the modeling tests
        _UpperCAmelCase          =   doc_test_results







    @property
    def      _snake_case					(			self			:       int     )		->str:






        '''simple docstring'''






        _UpperCAmelCase          =   [self._time_spent]
        _UpperCAmelCase          =   0

        for time in time_spent:
            _UpperCAmelCase          =   time.split(""":"""     )

            # Time can be formatted as xx:xx:xx, as .xx, or as x.xx if the time spent was less than a minute.
            if len(__UpperCamelCase     ) == 1:
                _UpperCAmelCase          =   [0, 0, time_parts[0]]

            _UpperCAmelCase    ,_UpperCAmelCase    ,_UpperCAmelCase          =   int(time_parts[0]     ), int(time_parts[1]     ), float(time_parts[2]     )
            total_secs += hours * 36_00 + minutes * 60 + seconds

        _UpperCAmelCase    ,_UpperCAmelCase    ,_UpperCAmelCase          =   total_secs // 36_00, (total_secs % 36_00) // 60, total_secs % 60
        return f"""{int(__UpperCamelCase     )}h{int(__UpperCamelCase     )}m{int(__UpperCamelCase     )}s"""







    @property
    def      _snake_case					(			self			:       List[Any]     )		->Dict:






        '''simple docstring'''






        return {"type": "header", "text": {"type": "plain_text", "text": self.title}}







    @property
    def      _snake_case					(			self			:       Optional[Any]     )		->Dict:






        '''simple docstring'''






        return {
            "type": "section",
            "text": {
                "type": "plain_text",
                "text": f"""🌞 There were no failures: all {self.n_tests} tests passed. The suite ran in {self.time}.""",
                "emoji": True,
            },
            "accessory": {
                "type": "button",
                "text": {"type": "plain_text", "text": "Check Action results", "emoji": True},
                "url": f"""https://github.com/huggingface/transformers/actions/runs/{os.environ["GITHUB_RUN_ID"]}""",
            },
        }







    @property
    def      _snake_case					(			self			:       Union[str, Any]     )		->Dict:






        '''simple docstring'''






        return {
            "type": "section",
            "text": {
                "type": "plain_text",
                "text": (
                    f"""There were {self.n_failures} failures, out of {self.n_tests} tests.\nThe suite ran in"""
                    f""" {self.time}."""
                ),
                "emoji": True,
            },
            "accessory": {
                "type": "button",
                "text": {"type": "plain_text", "text": "Check Action results", "emoji": True},
                "url": f"""https://github.com/huggingface/transformers/actions/runs/{os.environ["GITHUB_RUN_ID"]}""",
            },
        }







    @property
    def      _snake_case					(			self			:       List[str]     )		->Dict:






        '''simple docstring'''






        _UpperCAmelCase          =   40
        _UpperCAmelCase          =   {k: v["""failed"""] for k, v in doc_test_results.items() if isinstance(__UpperCamelCase     ,					__UpperCamelCase     )}

        _UpperCAmelCase          =   """"""
        for category, failures in category_failures.items():
            if len(__UpperCamelCase     ) == 0:
                continue

            if report != "":
                report += "\n\n"

            report += f"""*{category} failures*:""".ljust(line_length // 2     ).rjust(line_length // 2     ) + "\n"
            report += "`"
            report += "`\n`".join(__UpperCamelCase     )
            report += "`"

        return {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": f"""The following examples had failures:\n\n\n{report}\n""",
            },
        }







    @property
    def      _snake_case					(			self			:       Union[str, Any]     )		->str:






        '''simple docstring'''






        _UpperCAmelCase          =   [self.header]

        if self.n_failures > 0:
            blocks.append(self.failures     )

        if self.n_failures > 0:
            blocks.extend([self.category_failures]     )

        if self.n_failures == 0:
            blocks.append(self.no_failures     )

        return json.dumps(__UpperCamelCase     )







    @staticmethod
    def      _snake_case					(			)		->Any:






        '''simple docstring'''






        _UpperCAmelCase          =   [
            {
                """type""": """section""",
                """text""": {
                    """type""": """plain_text""",
                    """text""": """There was an issue running the tests.""",
                },
                """accessory""": {
                    """type""": """button""",
                    """text""": {"""type""": """plain_text""", """text""": """Check Action results""", """emoji""": True},
                    """url""": f"""https://github.com/huggingface/transformers/actions/runs/{os.environ["GITHUB_RUN_ID"]}""",
                },
            }
        ]

        print("""Sending the following payload"""     )
        print(json.dumps({"""blocks""": json.loads(__UpperCamelCase     )}     )     )

        client.chat_postMessage(
            channel=os.environ["""CI_SLACK_CHANNEL_ID_DAILY"""]     ,					text="""There was an issue running the tests."""     ,					blocks=__UpperCamelCase     ,					)







    def      _snake_case					(			self			:       Tuple     )		->Optional[Any]:






        '''simple docstring'''






        print("""Sending the following payload"""     )
        print(json.dumps({"""blocks""": json.loads(self.payload     )}     )     )

        _UpperCAmelCase          =   f"""{self.n_failures} failures out of {self.n_tests} tests,""" if self.n_failures else """All tests passed."""

        _UpperCAmelCase          =   client.chat_postMessage(
            channel=os.environ["""CI_SLACK_CHANNEL_ID_DAILY"""]     ,					blocks=self.payload     ,					text=__UpperCamelCase     ,					)







    def      _snake_case					(			self			:       List[Any]     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       Any     ,					__UpperCamelCase			:       Any     ,					__UpperCamelCase			:       List[str]     )		->str:






        '''simple docstring'''






        _UpperCAmelCase          =   """"""
        for key, value in failures.items():
            _UpperCAmelCase          =   value[:2_00] + """ [Truncated]""" if len(__UpperCamelCase     ) > 2_50 else value
            failures_text += f"""*{key}*\n_{value}_\n\n"""

        _UpperCAmelCase          =   job_name
        _UpperCAmelCase          =   {"""type""": """section""", """text""": {"""type""": """mrkdwn""", """text""": text}}

        if job_link is not None:
            _UpperCAmelCase          =   {
                """type""": """button""",
                """text""": {"""type""": """plain_text""", """text""": """GitHub Action job""", """emoji""": True},
                """url""": job_link,
            }

        return [
            {"type": "header", "text": {"type": "plain_text", "text": title.upper(), "emoji": True}},
            content,
            {"type": "section", "text": {"type": "mrkdwn", "text": failures_text}},
        ]







    def      _snake_case					(			self			:       int     )		->Optional[Any]:






        '''simple docstring'''






        if self.thread_ts is None:
            raise ValueError("""Can only post reply if a post has been made."""     )

        _UpperCAmelCase          =   self.doc_test_results.pop("""job_link"""     )
        self.doc_test_results.pop("""failures"""     )
        self.doc_test_results.pop("""success"""     )
        self.doc_test_results.pop("""time_spent"""     )

        _UpperCAmelCase          =   sorted(self.doc_test_results.items()     ,					key=lambda __UpperCamelCase     : t[0]     )
        for job, job_result in sorted_dict:
            if len(job_result["""failures"""]     ):
                _UpperCAmelCase          =   f"""*Num failures* :{len(job_result["failed"]     )} \n"""
                _UpperCAmelCase          =   job_result["""failures"""]
                _UpperCAmelCase          =   self.get_reply_blocks(__UpperCamelCase     ,					__UpperCamelCase     ,					__UpperCamelCase     ,					text=__UpperCamelCase     )

                print("""Sending the following reply"""     )
                print(json.dumps({"""blocks""": blocks}     )     )

                client.chat_postMessage(
                    channel=os.environ["""CI_SLACK_CHANNEL_ID_DAILY"""]     ,					text=f"""Results for {job}"""     ,					blocks=__UpperCamelCase     ,					thread_ts=self.thread_ts["""ts"""]     ,					)

                time.sleep(1     )







def  _UpperCamelCase	(						)    ->  List[str]:





    """simple docstring"""

    _UpperCAmelCase          =   os.environ["""GITHUB_RUN_ID"""]
    _UpperCAmelCase          =   F"""https://api.github.com/repos/huggingface/transformers/actions/runs/{run_id}/jobs?per_page=100"""
    _UpperCAmelCase          =   requests.get(_A      ).json()
    _UpperCAmelCase          =   {}

    try:
        jobs.update({job["""name"""]: job["""html_url"""] for job in result["""jobs"""]}      )
        _UpperCAmelCase          =   math.ceil((result["""total_count"""] - 1_0_0) / 1_0_0      )

        for i in range(_A      ):
            _UpperCAmelCase          =   requests.get(url + F"""&page={i + 2}"""      ).json()
            jobs.update({job["""name"""]: job["""html_url"""] for job in result["""jobs"""]}      )

        return jobs
    except Exception as e:
        print("""Unknown error, could not fetch links."""					,      _A      )

    return {}


def  _UpperCamelCase	(						_A      )    ->  Optional[int]:





    """simple docstring"""

    _UpperCAmelCase          =   {}

    if os.path.exists(_A      ):
        _UpperCAmelCase          =   os.listdir(_A      )
        for file in files:
            try:
                with open(os.path.join(_A					,      _A      )					,      encoding="""utf-8"""      ) as f:
                    _UpperCAmelCase          =   f.read()
            except UnicodeDecodeError as e:
                raise ValueError(F"""Could not open {os.path.join(_A					,      _A      )}."""      ) from e

    return _artifact


def  _UpperCamelCase	(						)    ->  int:





    """simple docstring"""

    class 		a_						:







        def __init__(			self			:       List[Any]     ,					__UpperCamelCase			:       str     )		->Tuple:






            '''simple docstring'''






            _UpperCAmelCase          =   name
            _UpperCAmelCase          =   []







        def __str__(			self			:       int     )		->Optional[Any]:






            '''simple docstring'''






            return self.name







        def      _snake_case					(			self			:       Dict     ,					__UpperCamelCase			:       str     )		->int:






            '''simple docstring'''






            self.paths.append({"""name""": self.name, """path""": path}     )







    _UpperCAmelCase          =   {}

    _UpperCAmelCase          =   filter(os.path.isdir					,      os.listdir()      )
    for directory in directories:
        _UpperCAmelCase          =   directory
        if artifact_name not in _available_artifacts:
            _UpperCAmelCase          =   Artifact(_A      )

            _available_artifacts[artifact_name].add_path(_A      )

    return _available_artifacts


if __name__ == "__main__":
 a					:	Dict							=		get_job_links()
 a					:	Dict							=		retrieve_available_artifacts()

 a					:	Optional[int]							=		collections.OrderedDict(
     [
         ('''*.py''', '''API Examples'''),
         ('''*.md''', '''MD Examples'''),
     ]
 )

 # This dict will contain all the information relative to each doc test category:
 # - failed: list of failed tests
 # - failures: dict in the format 'test': 'error_message'
 a					:	Dict							=		{
     v: {
         '''failed''': [],
         '''failures''': {},
     }
     for v in docs.values()
 }

 # Link to the GitHub Action job
 a					:	int							=		github_actions_job_links.get('''run_doctests''')

 a					:	Tuple							=		available_artifacts['''doc_tests_gpu_test_reports'''].paths[0]
 a					:	Optional[Any]							=		retrieve_artifact(artifact_path['''name'''])
 if "stats" in artifact:
  a		, a		, a					:	str							=		handle_test_results(artifact['''stats'''])
  a					:	Tuple							=		failed
  a					:	int							=		success
  a					:	Any							=		time_spent[1:-1] + ''', '''

  a					:	Dict							=		extract_first_line_failure(artifact['''failures_short'''])
  for line in artifact["summary_short"].split('''\n'''):
   if re.search('''FAILED''', line):
    a					:	List[Any]							=		line.replace('''FAILED ''', '''''')
    a					:	Tuple							=		line.split()[0].replace('''\n''', '''''')

    if "::" in line:
     a		, a					:	Union[str, Any]							=		line.split('''::''')
    else:
     a		, a					:	Optional[Any]							=		line, line

    for file_regex in docs.keys():
     if fnmatch(file_path, file_regex):
      a					:	List[Any]							=		docs[file_regex]
      doc_test_results[category]["failed"].append(test)

      a					:	Optional[Any]							=		all_failures[test] if test in all_failures else '''N/A'''
      a					:	List[str]							=		failure
      break

 a					:	List[Any]							=		Message('''🤗 Results of the doc tests.''', doc_test_results)
 message.post()
 message.post_reply()