

import json
import os
import tempfile
import unittest
import unittest.mock as mock
from pathlib import Path

from requests.exceptions import HTTPError

from transformers.utils import (
    CONFIG_NAME,
    FLAX_WEIGHTS_NAME,
    TF2_WEIGHTS_NAME,
    TRANSFORMERS_CACHE,
    WEIGHTS_NAME,
    cached_file,
    get_file_from_repo,
    has_file,
)


_a:    List[str] 							=			"""hf-internal-testing/tiny-random-bert"""
_a:    Optional[Any] 							=			os.path.join(TRANSFORMERS_CACHE, """models--hf-internal-testing--tiny-random-bert""")
_a:    Tuple 							=			"""9b8c223d42b2188cb49d29af482996f9d0f3e5a6"""

class 						__UpperCamelCase    (					unittest.TestCase						):




	def       __A					(		self	:						Optional[int]							):


		'''simple docstring'''







		UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	UpperCamelCase_							)
		# Should have downloaded the file in here
		self.assertTrue(os.path.isdir(UpperCamelCase_							)							)
		# Cache should contain at least those three subfolders:
		for subfolder in ["blobs", "refs", "snapshots"]:
			self.assertTrue(os.path.isdir(os.path.join(UpperCamelCase_		,	UpperCamelCase_							)							)							)
		with open(os.path.join(UpperCamelCase_		,	"refs"		,	"main"							)							) as f:
			UpperCAmelCase_       				=			f.read()
		self.assertEqual(UpperCamelCase_		,	os.path.join(UpperCamelCase_		,	"snapshots"		,	UpperCamelCase_		,	UpperCamelCase_							)							)
		self.assertTrue(os.path.isfile(UpperCamelCase_							)							)

		# File is cached at the same place the second time.
		UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	UpperCamelCase_							)
		self.assertEqual(UpperCamelCase_		,	UpperCamelCase_							)

		# Using a specific revision to test the full commit hash.
		UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	UpperCamelCase_		,	revision="9b8c223"							)
		self.assertEqual(UpperCamelCase_		,	os.path.join(UpperCamelCase_		,	"snapshots"		,	UpperCamelCase_		,	UpperCamelCase_							)							)




	def       __A					(		self	:						Dict							):


		'''simple docstring'''







		with self.assertRaisesRegex(UpperCamelCase_		,	"is not a valid model identifier"							):
			UpperCAmelCase_       				=			cached_file("tiny-random-bert"		,	UpperCamelCase_							)

		with self.assertRaisesRegex(UpperCamelCase_		,	"is not a valid git identifier"							):
			UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	UpperCamelCase_		,	revision="aaaa"							)

		with self.assertRaisesRegex(UpperCamelCase_		,	"does not appear to have a file named"							):
			UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	"conf"							)




	def       __A					(		self	:						Optional[int]							):


		'''simple docstring'''







		with self.assertRaisesRegex(UpperCamelCase_		,	"does not appear to have a file named"							):
			UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	"conf"							)

		with open(os.path.join(UpperCamelCase_		,	"refs"		,	"main"							)							) as f:
			UpperCAmelCase_       				=			f.read()
		self.assertTrue(os.path.isfile(os.path.join(UpperCamelCase_		,	".no_exist"		,	UpperCamelCase_		,	"conf"							)							)							)

		UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	"conf"		,	_raise_exceptions_for_missing_entries=UpperCamelCase_							)
		self.assertIsNone(UpperCamelCase_							)

		UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	"conf"		,	local_files_only=UpperCamelCase_		,	_raise_exceptions_for_missing_entries=UpperCamelCase_							)
		self.assertIsNone(UpperCamelCase_							)

		UpperCAmelCase_       				=			mock.Mock()
		UpperCAmelCase_       				=			500
		UpperCAmelCase_       				=			{}
		UpperCAmelCase_       				=			HTTPError
		UpperCAmelCase_       				=			{}

		# Under the mock environment we get a 500 error when trying to reach the tokenizer.
		with mock.patch("requests.Session.request"		,	return_value=UpperCamelCase_							) as mock_head:
			UpperCAmelCase_       				=			cached_file(UpperCamelCase_		,	"conf"		,	_raise_exceptions_for_connection_errors=UpperCamelCase_							)
			self.assertIsNone(UpperCamelCase_							)
			# This check we did call the fake head request
			mock_head.assert_called()




	def       __A					(		self	:						Dict							):


		'''simple docstring'''







		self.assertTrue(has_file("hf-internal-testing/tiny-bert-pt-only"		,	UpperCamelCase_							)							)
		self.assertFalse(has_file("hf-internal-testing/tiny-bert-pt-only"		,	UpperCamelCase_							)							)
		self.assertFalse(has_file("hf-internal-testing/tiny-bert-pt-only"		,	UpperCamelCase_							)							)




	def       __A					(		self	:						str							):


		'''simple docstring'''







		self.assertIsNone(get_file_from_repo("bert-base-cased"		,	"ahah.txt"							)							)

		# The function raises if the repository does not exist.
		with self.assertRaisesRegex(UpperCamelCase_		,	"is not a valid model identifier"							):
			get_file_from_repo("bert-base-case"		,	UpperCamelCase_							)

		# The function raises if the revision does not exist.
		with self.assertRaisesRegex(UpperCamelCase_		,	"is not a valid git identifier"							):
			get_file_from_repo("bert-base-cased"		,	UpperCamelCase_		,	revision="ahaha"							)

		UpperCAmelCase_       				=			get_file_from_repo("bert-base-cased"		,	UpperCamelCase_							)
		# The name is the cached name which is not very easy to test, so instead we load the content.
		UpperCAmelCase_       				=			json.loads(open(UpperCamelCase_		,	"r"							).read()							)
		self.assertEqual(config["hidden_size"]		,	768							)




	def       __A					(		self	:						str							):


		'''simple docstring'''







		with tempfile.TemporaryDirectory() as tmp_dir:
			UpperCAmelCase_       				=			Path(UpperCamelCase_							) / "a.txt"
			filename.touch()
			self.assertEqual(get_file_from_repo(UpperCamelCase_		,	"a.txt"							)		,	str(UpperCamelCase_							)							)

			self.assertIsNone(get_file_from_repo(UpperCamelCase_		,	"b.txt"							)							)


from .imports import is_tqdm_available


if is_tqdm_available():
				from tqdm.auto import tqdm as _tqdm

from ..state import PartialState



def       __lowerCAmelCase      (						A = True       ,     *A       ,     **A    ):
	if not is_tqdm_available():
		raise ImportError("Accelerate's `tqdm` module requires `tqdm` to be installed. Please run `pip install tqdm`."    )
	UpperCAmelCase_       				=			False
	if main_process_only:
		UpperCAmelCase_       				=			PartialState().local_process_index == 0
	return _tqdm(*A       ,     **A       ,     disable=A    )