
"""simple docstring"""

import json
import sys
import tempfile
import unittest
from pathlib import Path

import transformers
from transformers import (
    CONFIG_MAPPING,
    FEATURE_EXTRACTOR_MAPPING,
    AutoConfig,
    AutoFeatureExtractor,
    WavaVecaConfig,
    WavaVecaFeatureExtractor,
)
from transformers.testing_utils import DUMMY_UNKNOWN_IDENTIFIER, get_tests_dir


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

from test_module.custom_configuration import CustomConfig  # noqa E402
from test_module.custom_feature_extraction import CustomFeatureExtractor  # noqa E402


SCREAMING_SNAKE_CASE_    					=						get_tests_dir('''fixtures''')
SCREAMING_SNAKE_CASE_    					=						get_tests_dir('''fixtures/dummy_feature_extractor_config.json''')
SCREAMING_SNAKE_CASE_    					=						get_tests_dir('''fixtures/dummy-config.json''')
class      _UpperCAmelCase							(		unittest.TestCase							):




      def     a_      (							self							)						->					Dict:
          UpperCAmelCase									=					0




      def     a_      (							self							)						->					Union[str, Any]:
          UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained('facebook/wav2vec2-base-960h'							)
          self.assertIsInstance(lowercase_   ,       lowercase_							)




      def     a_      (							self							)						->					Union[str, Any]:
          UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(lowercase_							)
          self.assertIsInstance(lowercase_   ,       lowercase_							)




      def     a_      (							self							)						->					int:
          with tempfile.TemporaryDirectory() as tmpdirname:
              UpperCAmelCase									=					WavaVecaConfig()

              # remove feature_extractor_type to make sure config.json alone is enough to load feature processor locally
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(lowercase_							).to_dict()

              config_dict.pop('feature_extractor_type'							)
              UpperCAmelCase									=					WavaVecaFeatureExtractor(**lowercase_							)

              # save in new folder
              model_config.save_pretrained(lowercase_							)
              config.save_pretrained(lowercase_							)

              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(lowercase_							)

              # make sure private variable is not incorrectly saved
              UpperCAmelCase									=					json.loads(config.to_json_string()							)
              self.assertTrue('_processor_class' not in dict_as_saved							)

          self.assertIsInstance(lowercase_   ,       lowercase_							)




      def     a_      (							self							)						->					str:
          UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(lowercase_							)
          self.assertIsInstance(lowercase_   ,       lowercase_							)




      def     a_      (							self							)						->					List[str]:
          with self.assertRaisesRegex(
              lowercase_   ,       'bert-base is not a local folder and is not a valid model identifier'							):
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained('bert-base'							)




      def     a_      (							self							)						->					Tuple:
          with self.assertRaisesRegex(
              lowercase_   ,       R'aaaaaa is not a valid git identifier \(branch name, tag name or commit id\)'							):
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(lowercase_   ,       revision='aaaaaa'							)




      def     a_      (							self							)						->					Dict:
          with self.assertRaisesRegex(
              lowercase_   ,       'hf-internal-testing/config-no-model does not appear to have a file named preprocessor_config.json.'   ,       ):
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained('hf-internal-testing/config-no-model'							)




      def     a_      (							self							)						->					int:
          # If remote code is not set, we will time out when asking whether to load the model.
          with self.assertRaises(lowercase_							):
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(
                  'hf-internal-testing/test_dynamic_feature_extractor'							)
          # If remote code is disabled, we can't load this config.
          with self.assertRaises(lowercase_							):
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(
                  'hf-internal-testing/test_dynamic_feature_extractor'   ,       trust_remote_code=lowercase_							)

          UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(
              'hf-internal-testing/test_dynamic_feature_extractor'   ,       trust_remote_code=lowercase_							)
          self.assertEqual(feature_extractor.__class__.__name__   ,       'NewFeatureExtractor'							)

          # Test feature extractor can be reloaded.
          with tempfile.TemporaryDirectory() as tmp_dir:
              feature_extractor.save_pretrained(lowercase_							)
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(lowercase_   ,       trust_remote_code=lowercase_							)
          self.assertEqual(reloaded_feature_extractor.__class__.__name__   ,       'NewFeatureExtractor'							)




      def     a_      (							self							)						->					Optional[Any]:
          try:
              AutoConfig.register('custom'   ,       lowercase_							)
              AutoFeatureExtractor.register(lowercase_   ,       lowercase_							)
              # Trying to register something existing in the Transformers library will raise an error
              with self.assertRaises(lowercase_							):
                  AutoFeatureExtractor.register(lowercase_   ,       lowercase_							)

              # Now that the config is registered, it can be used as any other config with the auto-API
              UpperCAmelCase									=					CustomFeatureExtractor.from_pretrained(lowercase_							)
              with tempfile.TemporaryDirectory() as tmp_dir:
                  feature_extractor.save_pretrained(lowercase_							)
                  UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(lowercase_							)
                  self.assertIsInstance(lowercase_   ,       lowercase_							)

          finally:
              if "custom" in CONFIG_MAPPING._extra_content:
                  del CONFIG_MAPPING._extra_content["custom"]
              if CustomConfig in FEATURE_EXTRACTOR_MAPPING._extra_content:
                  del FEATURE_EXTRACTOR_MAPPING._extra_content[CustomConfig]




      def     a_      (							self							)						->					List[str]:
          class      _UpperCAmelCase							(		SCREAMING_SNAKE_CASE_							):
                __SCREAMING_SNAKE_CASE   :							Union[str, Any]							      =	True

          try:
              AutoConfig.register('custom'   ,       lowercase_							)
              AutoFeatureExtractor.register(lowercase_   ,       lowercase_							)
              # If remote code is not set, the default is to use local
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(
                  'hf-internal-testing/test_dynamic_feature_extractor'							)
              self.assertEqual(feature_extractor.__class__.__name__   ,       'NewFeatureExtractor'							)
              self.assertTrue(feature_extractor.is_local							)

              # If remote code is disabled, we load the local one.
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(
                  'hf-internal-testing/test_dynamic_feature_extractor'   ,       trust_remote_code=lowercase_							)
              self.assertEqual(feature_extractor.__class__.__name__   ,       'NewFeatureExtractor'							)
              self.assertTrue(feature_extractor.is_local							)

              # If remote is enabled, we load from the Hub
              UpperCAmelCase									=					AutoFeatureExtractor.from_pretrained(
                  'hf-internal-testing/test_dynamic_feature_extractor'   ,       trust_remote_code=lowercase_							)
              self.assertEqual(feature_extractor.__class__.__name__   ,       'NewFeatureExtractor'							)
              self.assertTrue(not hasattr(lowercase_   ,       'is_local'							)							)

          finally:
              if "custom" in CONFIG_MAPPING._extra_content:
                  del CONFIG_MAPPING._extra_content["custom"]
              if CustomConfig in FEATURE_EXTRACTOR_MAPPING._extra_content:
                  del FEATURE_EXTRACTOR_MAPPING._extra_content[CustomConfig]





"""simple docstring"""

from abc import ABC, abstractmethod
from argparse import ArgumentParser
class      _UpperCAmelCase							(		SCREAMING_SNAKE_CASE_							):




      @staticmethod
      @abstractmethod
      def     a_      (							lowercase_							)						->					Optional[Any]:
          raise NotImplementedError()




      @abstractmethod
      def     a_      (							self							)						->					Any:
          raise NotImplementedError()



