
import sys
import tempfile
import unittest
import unittest.mock as mock
from pathlib import Path

from huggingface_hub import HfFolder, delete_repo
from requests.exceptions import HTTPError

from transformers import AutoFeatureExtractor, WavaVecaFeatureExtractor
from transformers.testing_utils import TOKEN, USER, get_tests_dir, is_staging_test


sys.path.append(str(Path(__file__).parent.parent / "utils"))

from test_module.custom_feature_extraction import CustomFeatureExtractor  # noqa E402


lowercase__		:str			  =   get_tests_dir("fixtures")







class     lowercase		( unittest.TestCase		):




							def 			A__				(    self):
												lowercase						     =						mock.Mock()
												lowercase						     =						5_0_0
												lowercase						     =						{}
												lowercase						     =						HTTPError
												lowercase						     =						{}

												# Download this model to make sure it's in the cache.
												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained('''hf-internal-testing/tiny-random-wav2vec2''')
												# Under the mock environment we get a 500 error when trying to reach the model.
												with mock.patch('''requests.Session.request'''       ,return_value=_lowerCAmelCase) as mock_head:
																	lowercase						     =						WavaVecaFeatureExtractor.from_pretrained('''hf-internal-testing/tiny-random-wav2vec2''')
																	# This check we did call the fake head request
																	mock_head.assert_called()





							def 			A__				(    self):
												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained(
												    '''https://huggingface.co/hf-internal-testing/tiny-random-wav2vec2/resolve/main/preprocessor_config.json''')







@is_staging_test
class     lowercase		( unittest.TestCase		):




							@classmethod
							def 			A__				(    cls):
												lowercase						     =						TOKEN
												HfFolder.save_token(_lowerCAmelCase)




							@classmethod
							def 			A__				(    cls):

												try:
																	delete_repo(token=cls._token       ,repo_id='''test-feature-extractor''')
												except HTTPError:
																	pass

												try:
																	delete_repo(token=cls._token       ,repo_id='''valid_org/test-feature-extractor-org''')
												except HTTPError:
																	pass

												try:
																	delete_repo(token=cls._token       ,repo_id='''test-dynamic-feature-extractor''')
												except HTTPError:
																	pass




							def 			A__				(    self):
												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained(_lowerCAmelCase)
												feature_extractor.push_to_hub('''test-feature-extractor'''       ,use_auth_token=self._token)

												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained(f'{USER}/test-feature-extractor')
												for k, v in feature_extractor.__dict__.items():
																	self.assertEqual(_lowerCAmelCase       ,getattr(_lowerCAmelCase       ,_lowerCAmelCase))

												# Reset repo
												delete_repo(token=self._token       ,repo_id='''test-feature-extractor''')

												# Push to hub via save_pretrained
												with tempfile.TemporaryDirectory() as tmp_dir:
																	feature_extractor.save_pretrained(
																	    _lowerCAmelCase       ,repo_id='''test-feature-extractor'''       ,push_to_hub=_lowerCAmelCase       ,use_auth_token=self._token)

												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained(f'{USER}/test-feature-extractor')
												for k, v in feature_extractor.__dict__.items():
																	self.assertEqual(_lowerCAmelCase       ,getattr(_lowerCAmelCase       ,_lowerCAmelCase))




							def 			A__				(    self):
												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained(_lowerCAmelCase)
												feature_extractor.push_to_hub('''valid_org/test-feature-extractor'''       ,use_auth_token=self._token)

												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained('''valid_org/test-feature-extractor''')
												for k, v in feature_extractor.__dict__.items():
																	self.assertEqual(_lowerCAmelCase       ,getattr(_lowerCAmelCase       ,_lowerCAmelCase))

												# Reset repo
												delete_repo(token=self._token       ,repo_id='''valid_org/test-feature-extractor''')

												# Push to hub via save_pretrained
												with tempfile.TemporaryDirectory() as tmp_dir:
																	feature_extractor.save_pretrained(
																	    _lowerCAmelCase       ,repo_id='''valid_org/test-feature-extractor-org'''       ,push_to_hub=_lowerCAmelCase       ,use_auth_token=self._token)

												lowercase						     =						WavaVecaFeatureExtractor.from_pretrained('''valid_org/test-feature-extractor-org''')
												for k, v in feature_extractor.__dict__.items():
																	self.assertEqual(_lowerCAmelCase       ,getattr(_lowerCAmelCase       ,_lowerCAmelCase))





							def 			A__				(    self):
												CustomFeatureExtractor.register_for_auto_class()
												lowercase						     =						CustomFeatureExtractor.from_pretrained(_lowerCAmelCase)

												feature_extractor.push_to_hub('''test-dynamic-feature-extractor'''       ,use_auth_token=self._token)

												# This has added the proper auto_map field to the config
												self.assertDictEqual(
												    feature_extractor.auto_map       ,{'''AutoFeatureExtractor''': '''custom_feature_extraction.CustomFeatureExtractor'''}       ,)

												lowercase						     =						AutoFeatureExtractor.from_pretrained(
												    f'{USER}/test-dynamic-feature-extractor'       ,trust_remote_code=_lowerCAmelCase)
												# Can't make an isinstance check because the new_feature_extractor is from the CustomFeatureExtractor class of a dynamic module
												self.assertEqual(new_feature_extractor.__class__.__name__       ,'''CustomFeatureExtractor''')





lowercase__		:List[str]			  =   6_5521



def 	UpperCamelCase   (							lowerCAmelCase__		):
					'''simple docstring'''
					lowercase						     =						1
					lowercase						     =						0
					for plain_chr in plain_text:
										lowercase						     =						(a + ord(lowerCAmelCase__		)) % MOD_ADLER
										lowercase						     =						(b + a) % MOD_ADLER
					return (b << 16) | a




