






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


__UpperCamelCase   :   List[str]      =    get_tests_dir("""fixtures""")


class 							__UpperCamelCase     (  unittest.TestCase ):







	def 			_a (	self   :				Optional[Any]      )		->			int:
		"""simple docstring"""







		__lowercase   							=	mock.Mock()
		__lowercase   							=	500
		__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   :				Any      )		->			List[str]:
		"""simple docstring"""







		__lowercase   							=	WavaVecaFeatureExtractor.from_pretrained(
		    """https://huggingface.co/hf-internal-testing/tiny-random-wav2vec2/resolve/main/preprocessor_config.json"""      )


@is_staging_test
class 							__UpperCamelCase     (  unittest.TestCase ):







	@classmethod
	def 			_a (	cls   :				int      )		->			int:
		"""simple docstring"""







		__lowercase   							=	TOKEN
		HfFolder.save_token(_lowerCAmelCase      )







	@classmethod
	def 			_a (	cls   :				Any      )		->			Any:
		"""simple docstring"""







		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   :				Optional[Any]      )		->			str:
		"""simple docstring"""







		__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   :				int      )		->			List[Any]:
		"""simple docstring"""







		__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   :				Tuple      )		->			Dict:
		"""simple docstring"""







		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"""      )







'''simple docstring'''


import os

import pytest
import yaml

from datasets.features.features import Features, Value
from datasets.info import DatasetInfo, DatasetInfosDict


@pytest.mark.parametrize(
    'files'					,       [
        ['full:README.md', 'dataset_infos.json'],
        ['empty:README.md', 'dataset_infos.json'],
        ['dataset_infos.json'],
        ['full:README.md'],
    ]					,       )
def     SCREAMING_SNAKE_CASE							(   a_						:				Tuple					,       a_						:				Dict      ):
  __a								=       tmp_path_factory.mktemp('dset_infos_dir'      )
  if "full:README.md" in files:
    with open(dataset_infos_dir / 'README.md'					,       'w'      ) as f:
      f.write('---\ndataset_info:\n  dataset_size: 42\n---'      )
  if "empty:README.md" in files:
    with open(dataset_infos_dir / 'README.md'					,       'w'      ) as f:
      f.write(''      )
    # we want to support dataset_infos.json for backward compatibility
  if "dataset_infos.json" in files:
    with open(dataset_infos_dir / 'dataset_infos.json'					,       'w'      ) as f:
      f.write('{"default": {"dataset_size": 42}}'      )
  __a								=       DatasetInfosDict.from_directory(a_      )
  assert dataset_infos
  assert dataset_infos["default"].dataset_size == 42


@pytest.mark.parametrize(
    'dataset_info'					,       [
        DatasetInfo(),
        DatasetInfo(
            description='foo'					,       features=Features({'a': Value('int32'      )}      )					,       builder_name='builder'					,       config_name='config'					,       version='1.0.0'					,       splits=[{'name': 'train'}]					,       download_size=42					,       ),
    ]					,       )
def     SCREAMING_SNAKE_CASE							(   a_						:				Optional[int]					,       a_						:				DatasetInfo      ):
  __a								=       str(a_      )
  dataset_info.write_to_directory(a_      )
  __a								=       DatasetInfo.from_directory(a_      )
  assert dataset_info == reloaded
  assert os.path.exists(os.path.join(a_					,       'dataset_info.json'      )      )


def     SCREAMING_SNAKE_CASE							(   ):
  __a								=       DatasetInfo(
      description='foo'					,       citation='bar'					,       homepage='https://foo.bar'					,       license='CC0'					,       features=Features({'a': Value('int32'      )}      )					,       post_processed={}					,       supervised_keys=()					,       task_templates=[]					,       builder_name='builder'					,       config_name='config'					,       version='1.0.0'					,       splits=[{'name': 'train', 'num_examples': 42}]					,       download_checksums={}					,       download_size=1337					,       post_processing_size=442					,       dataset_size=1234					,       size_in_bytes=1337 + 442 + 1234					,       )
  __a								=       dataset_info._to_yaml_dict()
  assert sorted(a_      ) == sorted(DatasetInfo._INCLUDED_INFO_IN_YAML      )
  for key in DatasetInfo._INCLUDED_INFO_IN_YAML:
    assert key in dataset_info_yaml_dict
    assert isinstance(dataset_info_yaml_dict[key]					,       (list, dict, int, str)      )
  __a								=       yaml.safe_dump(a_      )
  __a								=       yaml.safe_load(a_      )
  assert dataset_info_yaml_dict == reloaded


def     SCREAMING_SNAKE_CASE							(   ):
  __a								=       DatasetInfo()
  __a								=       dataset_info._to_yaml_dict()
  assert dataset_info_yaml_dict == {}


@pytest.mark.parametrize(
    'dataset_infos_dict'					,       [
        DatasetInfosDict(),
        DatasetInfosDict({'default': DatasetInfo()}      ),
        DatasetInfosDict({'my_config_name': DatasetInfo()}      ),
        DatasetInfosDict(
            {
                'default': DatasetInfo(
                    description='foo'					,       features=Features({'a': Value('int32'      )}      )					,       builder_name='builder'					,       config_name='config'					,       version='1.0.0'					,       splits=[{'name': 'train'}]					,       download_size=42					,       )
            }      ),
        DatasetInfosDict(
            {
                'v1': DatasetInfo(dataset_size=42      ),
                'v2': DatasetInfo(dataset_size=1337      ),
            }      ),
    ]					,       )
def     SCREAMING_SNAKE_CASE							(   a_						:				List[str]					,       a_						:				DatasetInfosDict      ):
  __a								=       str(a_      )
  dataset_infos_dict.write_to_directory(a_      )
  __a								=       DatasetInfosDict.from_directory(a_      )

  # the config_name of the dataset_infos_dict take over the attribute
  for config_name, dataset_info in dataset_infos_dict.items():
    __a								=       config_name
    # the yaml representation doesn't include fields like description or citation
    # so we just test that we can recover what we can from the yaml
    __a								=       DatasetInfo._from_yaml_dict(dataset_info._to_yaml_dict()      )
  assert dataset_infos_dict == reloaded

  if dataset_infos_dict:
    assert os.path.exists(os.path.join(a_					,       'README.md'      )      )



