






import json
import os
import shutil
import tempfile
import unittest

import numpy as np
import pytest

from transformers import BertTokenizer, BertTokenizerFast
from transformers.models.bert.tokenization_bert import VOCAB_FILES_NAMES
from transformers.testing_utils import require_vision
from transformers.utils import IMAGE_PROCESSOR_NAME, is_vision_available


if is_vision_available():
	from PIL import Image

	from transformers import AlignProcessor, EfficientNetImageProcessor




@require_vision
class  UpperCamelCase_      (			unittest.TestCase				):



	'''simple docstring'''




	def 							_UpperCamelCase			(       self					)       ->    Any:
								snake_case_				=							tempfile.mkdtemp()

								snake_case_				=							[
								    '[UNK]',
								    '[CLS]',
								    '[SEP]',
								    '[PAD]',
								    '[MASK]',
								    'want',
								    '##want',
								    '##ed',
								    'wa',
								    'un',
								    'runn',
								    '##ing',
								    ',',
								    'low',
								    'lowest',
								]
								snake_case_				=							os.path.join(self.tmpdirname       ,			VOCAB_FILES_NAMES['vocab_file']					)
								with open(self.vocab_file       ,			'w'       ,			encoding='utf-8'					) as vocab_writer:
															vocab_writer.write(''.join([x + '\n' for x in vocab_tokens]					)					)

								snake_case_				=							{
								    'do_resize': True,
								    'size': 20,
								    'do_center_crop': True,
								    'crop_size': 18,
								    'do_normalize': True,
								    'image_mean': [0.48_145_466, 0.4_578_275, 0.40_821_073],
								    'image_std': [0.26_862_954, 0.26_130_258, 0.27_577_711],
								}
								snake_case_				=							os.path.join(self.tmpdirname       ,			a					)
								with open(self.image_processor_file       ,			'w'       ,			encoding='utf-8'					) as fp:
															json.dump(a       ,			a					)




	def 							_UpperCamelCase			(       self       ,			**a					)       ->    Optional[Any]:
								return BertTokenizer.from_pretrained(self.tmpdirname       ,			**a					)




	def 							_UpperCamelCase			(       self       ,			**a					)       ->    Optional[int]:
								return BertTokenizerFast.from_pretrained(self.tmpdirname       ,			**a					)




	def 							_UpperCamelCase			(       self       ,			**a					)       ->    Dict:
								return EfficientNetImageProcessor.from_pretrained(self.tmpdirname       ,			**a					)




	def 							_UpperCamelCase			(       self					)       ->    Tuple:
								shutil.rmtree(self.tmpdirname					)




	def 							_UpperCamelCase			(       self					)       ->    List[str]:
								snake_case_				=							[np.random.randint(2_55       ,			size=(3, 30, 4_00)       ,			dtype=np.uinta					)]
								snake_case_				=							[Image.fromarray(np.moveaxis(a       ,			0       ,			-1					)					) for x in image_inputs]
								return image_inputs




	def 							_UpperCamelCase			(       self					)       ->    List[Any]:
								snake_case_				=							self.get_tokenizer()
								snake_case_				=							self.get_rust_tokenizer()
								snake_case_				=							self.get_image_processor()

								snake_case_				=							AlignProcessor(tokenizer=a       ,			image_processor=a					)
								processor_slow.save_pretrained(self.tmpdirname					)
								snake_case_				=							AlignProcessor.from_pretrained(self.tmpdirname       ,			use_fast=a					)

								snake_case_				=							AlignProcessor(tokenizer=a       ,			image_processor=a					)
								processor_fast.save_pretrained(self.tmpdirname					)
								snake_case_				=							AlignProcessor.from_pretrained(self.tmpdirname					)

								self.assertEqual(processor_slow.tokenizer.get_vocab()       ,			tokenizer_slow.get_vocab()					)
								self.assertEqual(processor_fast.tokenizer.get_vocab()       ,			tokenizer_fast.get_vocab()					)
								self.assertEqual(tokenizer_slow.get_vocab()       ,			tokenizer_fast.get_vocab()					)
								self.assertIsInstance(processor_slow.tokenizer       ,			a					)
								self.assertIsInstance(processor_fast.tokenizer       ,			a					)

								self.assertEqual(processor_slow.image_processor.to_json_string()       ,			image_processor.to_json_string()					)
								self.assertEqual(processor_fast.image_processor.to_json_string()       ,			image_processor.to_json_string()					)
								self.assertIsInstance(processor_slow.image_processor       ,			a					)
								self.assertIsInstance(processor_fast.image_processor       ,			a					)




	def 							_UpperCamelCase			(       self					)       ->    Optional[int]:
								snake_case_				=							AlignProcessor(tokenizer=self.get_tokenizer()       ,			image_processor=self.get_image_processor()					)
								processor.save_pretrained(self.tmpdirname					)

								snake_case_				=							self.get_tokenizer(bos_token='(BOS)'       ,			eos_token='(EOS)'					)
								snake_case_				=							self.get_image_processor(do_normalize=a       ,			padding_value=1.0					)

								snake_case_				=							AlignProcessor.from_pretrained(
								    self.tmpdirname       ,			bos_token='(BOS)'       ,			eos_token='(EOS)'       ,			do_normalize=a       ,			padding_value=1.0					)

								self.assertEqual(processor.tokenizer.get_vocab()       ,			tokenizer_add_kwargs.get_vocab()					)
								self.assertIsInstance(processor.tokenizer       ,			a					)

								self.assertEqual(processor.image_processor.to_json_string()       ,			image_processor_add_kwargs.to_json_string()					)
								self.assertIsInstance(processor.image_processor       ,			a					)




	def 							_UpperCamelCase			(       self					)       ->    Tuple:
								snake_case_				=							self.get_image_processor()
								snake_case_				=							self.get_tokenizer()

								snake_case_				=							AlignProcessor(tokenizer=a       ,			image_processor=a					)

								snake_case_				=							self.prepare_image_inputs()

								snake_case_				=							image_processor(a       ,			return_tensors='np'					)
								snake_case_				=							processor(images=a       ,			return_tensors='np'					)

								for key in input_image_proc.keys():
															self.assertAlmostEqual(input_image_proc[key].sum()       ,			input_processor[key].sum()       ,			delta=1E-2					)




	def 							_UpperCamelCase			(       self					)       ->    Tuple:
								snake_case_				=							self.get_image_processor()
								snake_case_				=							self.get_tokenizer()

								snake_case_				=							AlignProcessor(tokenizer=a       ,			image_processor=a					)

								snake_case_				=							'lower newer'

								snake_case_				=							processor(text=a					)

								snake_case_				=							tokenizer(a       ,			padding='max_length'       ,			max_length=64					)

								for key in encoded_tok.keys():
															self.assertListEqual(encoded_tok[key]       ,			encoded_processor[key]					)




	def 							_UpperCamelCase			(       self					)       ->    int:
								snake_case_				=							self.get_image_processor()
								snake_case_				=							self.get_tokenizer()

								snake_case_				=							AlignProcessor(tokenizer=a       ,			image_processor=a					)

								snake_case_				=							'lower newer'
								snake_case_				=							self.prepare_image_inputs()

								snake_case_				=							processor(text=a       ,			images=a					)

								self.assertListEqual(list(inputs.keys()					)       ,			['input_ids', 'token_type_ids', 'attention_mask', 'pixel_values']					)

								# test if it raises when no input is passed
								with pytest.raises(a					):
															processor()




	def 							_UpperCamelCase			(       self					)       ->    Optional[int]:
								snake_case_				=							self.get_image_processor()
								snake_case_				=							self.get_tokenizer()

								snake_case_				=							AlignProcessor(tokenizer=a       ,			image_processor=a					)

								snake_case_				=							[[1, 4, 5, 8, 1, 0, 8], [3, 4, 3, 1, 1, 8, 9]]

								snake_case_				=							processor.batch_decode(a					)
								snake_case_				=							tokenizer.batch_decode(a					)

								self.assertListEqual(a       ,			a					)






	def 							_UpperCamelCase			(       self					)       ->    List[str]:
								snake_case_				=							self.get_image_processor()
								snake_case_				=							self.get_tokenizer()

								snake_case_				=							AlignProcessor(tokenizer=a       ,			image_processor=a					)

								snake_case_				=							'lower newer'
								snake_case_				=							self.prepare_image_inputs()

								snake_case_				=							processor(text=a       ,			images=a					)

								self.assertListEqual(list(inputs.keys()					)       ,			processor.model_input_names					)













import collections
import importlib.util
import os
import re
from pathlib import Path


lowercase  							=					"src/transformers"


# Matches is_xxx_available()
lowercase  							=					re.compile(r"is\_([a-z_]*)_available()")
# Catches a one-line _import_struct = {xxx}
lowercase  							=					re.compile(r"^_import_structure\s+=\s+\{([^\}]+)\}")
# Catches a line with a key-values pattern: "bla": ["foo", "bar"]
lowercase  							=					re.compile(r"\s+\"\S*\":\s+\[([^\]]*)\]")
# Catches a line if not is_foo_available
lowercase  							=					re.compile(r"^\s*if\s+not\s+is\_[a-z_]*\_available\(\)")
# Catches a line _import_struct["bla"].append("foo")
lowercase  							=					re.compile(r"^\s*_import_structure\[\"\S*\"\]\.append\(\"(\S*)\"\)")
# Catches a line _import_struct["bla"].extend(["foo", "bar"]) or _import_struct["bla"] = ["foo", "bar"]
lowercase  							=					re.compile(r"^\s*_import_structure\[\S*\](?:\.extend\(|\s*=\s+)\[([^\]]*)\]")
# Catches a line with an object between quotes and a comma:     "MyModel",
lowercase  							=					re.compile("^\s+\"([^\"]+)\",")
# Catches a line with objects between brackets only:    ["foo", "bar"],
lowercase  							=					re.compile("^\s+\[([^\]]+)\]")
# Catches a line with from foo import bar, bla, boo
lowercase  							=					re.compile(r"\s+from\s+\S*\s+import\s+([^\(\s].*)\n")
# Catches a line with try:
lowercase  							=					re.compile(r"^\s*try:")
# Catches a line with else:
lowercase  							=					re.compile(r"^\s*else:")





def 						__UpperCAmelCase			(     a_):
							if _re_test_backend.search(a_) is None:
														return None
							snake_case_				=							[b[0] for b in _re_backend.findall(a_)]
							backends.sort()
							return "_and_".join(a_)





def 						__UpperCAmelCase			(     a_):
							with open(a_							,     'r'							,     encoding='utf-8'							,     newline='\n') as f:
														snake_case_				=							f.readlines()

							snake_case_				=							0
							while line_index < len(a_) and not lines[line_index].startswith('_import_structure = {'):
														line_index += 1

							# If this is a traditional init, just return.
							if line_index >= len(a_):
														return None

							# First grab the objects without a specific backend in _import_structure
							snake_case_				=							[]
							while not lines[line_index].startswith('if TYPE_CHECKING') and find_backend(lines[line_index]) is None:
														snake_case_				=							lines[line_index]
														# If we have everything on a single line, let's deal with it.
														if _re_one_line_import_struct.search(a_):
																					snake_case_				=							_re_one_line_import_struct.search(a_).groups()[0]
																					snake_case_				=							re.findall('\[([^\]]+)\]'							,     a_)
																					for imp in imports:
																												objects.extend([obj[1:-1] for obj in imp.split(', ')])
																					line_index += 1
																					continue
														snake_case_				=							_re_import_struct_key_value.search(a_)
														if single_line_import_search is not None:
																					snake_case_				=							[obj[1:-1] for obj in single_line_import_search.groups()[0].split(', ') if len(a_) > 0]
																					objects.extend(a_)
														elif line.startswith(' ' * 8 + '"'):
																					objects.append(line[9:-3])
														line_index += 1

							snake_case_				=							{'none': objects}
							# Let's continue with backend-specific objects in _import_structure
							while not lines[line_index].startswith('if TYPE_CHECKING'):
														# If the line is an if not is_backend_available, we grab all objects associated.
														snake_case_				=							find_backend(lines[line_index])
														# Check if the backend declaration is inside a try block:
														if _re_try.search(lines[line_index - 1]) is None:
																					snake_case_				=							None

														if backend is not None:
																					line_index += 1

																					# Scroll until we hit the else block of try-except-else
																					while _re_else.search(lines[line_index]) is None:
																												line_index += 1

																					line_index += 1

																					snake_case_				=							[]
																					# Until we unindent, add backend objects to the list
																					while len(lines[line_index]) <= 1 or lines[line_index].startswith(' ' * 4):
																												snake_case_				=							lines[line_index]
																												if _re_import_struct_add_one.search(a_) is not None:
																																			objects.append(_re_import_struct_add_one.search(a_).groups()[0])
																												elif _re_import_struct_add_many.search(a_) is not None:
																																			snake_case_				=							_re_import_struct_add_many.search(a_).groups()[0].split(', ')
																																			snake_case_				=							[obj[1:-1] for obj in imports if len(a_) > 0]
																																			objects.extend(a_)
																												elif _re_between_brackets.search(a_) is not None:
																																			snake_case_				=							_re_between_brackets.search(a_).groups()[0].split(', ')
																																			snake_case_				=							[obj[1:-1] for obj in imports if len(a_) > 0]
																																			objects.extend(a_)
																												elif _re_quote_object.search(a_) is not None:
																																			objects.append(_re_quote_object.search(a_).groups()[0])
																												elif line.startswith(' ' * 8 + '"'):
																																			objects.append(line[9:-3])
																												elif line.startswith(' ' * 12 + '"'):
																																			objects.append(line[13:-3])
																												line_index += 1

																					snake_case_				=							objects
														else:
																					line_index += 1

    # At this stage we are in the TYPE_CHECKING part, first grab the objects without a specific backend
							snake_case_				=							[]
							while (
							    line_index < len(a_)
							    and find_backend(lines[line_index]) is None
							    and not lines[line_index].startswith('else')
							):
														snake_case_				=							lines[line_index]
														snake_case_				=							_re_import.search(a_)
														if single_line_import_search is not None:
																					objects.extend(single_line_import_search.groups()[0].split(', '))
														elif line.startswith(' ' * 8):
																					objects.append(line[8:-2])
														line_index += 1

							snake_case_				=							{'none': objects}
							# Let's continue with backend-specific objects
							while line_index < len(a_):
														# If the line is an if is_backend_available, we grab all objects associated.
														snake_case_				=							find_backend(lines[line_index])
														# Check if the backend declaration is inside a try block:
														if _re_try.search(lines[line_index - 1]) is None:
																					snake_case_				=							None

														if backend is not None:
																					line_index += 1

																					# Scroll until we hit the else block of try-except-else
																					while _re_else.search(lines[line_index]) is None:
																												line_index += 1

																					line_index += 1

																					snake_case_				=							[]
																					# Until we unindent, add backend objects to the list
																					while len(lines[line_index]) <= 1 or lines[line_index].startswith(' ' * 8):
																												snake_case_				=							lines[line_index]
																												snake_case_				=							_re_import.search(a_)
																												if single_line_import_search is not None:
																																			objects.extend(single_line_import_search.groups()[0].split(', '))
																												elif line.startswith(' ' * 12):
																																			objects.append(line[12:-2])
																												line_index += 1

																					snake_case_				=							objects
														else:
																					line_index += 1

							return import_dict_objects, type_hint_objects





def 						__UpperCAmelCase			(     a_							,     a_):

							def find_duplicates(a_):
														return [k for k, v in collections.Counter(a_).items() if v > 1]

							if list(import_dict_objects.keys()) != list(type_hint_objects.keys()):
														return ["Both sides of the init do not have the same backends!"]

							snake_case_				=							[]
							for key in import_dict_objects.keys():
														snake_case_				=							find_duplicates(import_dict_objects[key])
														if duplicate_imports:
																					errors.append(f'''Duplicate _import_structure definitions for: {duplicate_imports}''')
														snake_case_				=							find_duplicates(type_hint_objects[key])
														if duplicate_type_hints:
																					errors.append(f'''Duplicate TYPE_CHECKING objects for: {duplicate_type_hints}''')

														if sorted(set(import_dict_objects[key])) != sorted(set(type_hint_objects[key])):
																					snake_case_				=							'base imports' if key == 'none' else f'''{key} backend'''
																					errors.append(f'''Differences for {name}:''')
																					for a in type_hint_objects[key]:
																												if a not in import_dict_objects[key]:
																																			errors.append(f'''  {a} in TYPE_HINT but not in _import_structure.''')
																					for a in import_dict_objects[key]:
																												if a not in type_hint_objects[key]:
																																			errors.append(f'''  {a} in _import_structure but not in TYPE_HINT.''')
							return errors





def 						__UpperCAmelCase			(     ):
							snake_case_				=							[]
							for root, _, files in os.walk(a_):
														if "__init__.py" in files:
																					snake_case_				=							os.path.join(a_							,     '__init__.py')
																					snake_case_				=							parse_init(a_)
																					if objects is not None:
																												snake_case_				=							analyze_results(*a_)
																												if len(a_) > 0:
																																			snake_case_				=							f'''Problem in {fname}, both halves do not define the same objects.\n{errors[0]}'''
																																			failures.append('\n'.join(a_))
							if len(a_) > 0:
														raise ValueError('\n\n'.join(a_))





def 						__UpperCAmelCase			(     ):
							snake_case_				=							[]
							for path, directories, files in os.walk(a_):
														for folder in directories:
																					# Ignore private modules
																					if folder.startswith('_'):
																												directories.remove(a_)
																												continue
																					# Ignore leftovers from branches (empty folders apart from pycache)
																					if len(list((Path(a_) / folder).glob('*.py'))) == 0:
																												continue
																					snake_case_				=							str((Path(a_) / folder).relative_to(a_))
																					snake_case_				=							short_path.replace(os.path.sep							,     '.')
																					submodules.append(a_)
														for fname in files:
																					if fname == "__init__.py":
																												continue
																					snake_case_				=							str((Path(a_) / fname).relative_to(a_))
																					snake_case_				=							short_path.replace('.py'							,     '').replace(os.path.sep							,     '.')
																					if len(submodule.split('.')) == 1:
																												submodules.append(a_)
							return submodules


lowercase  							=					[
    "convert_pytorch_checkpoint_to_tf2",
    "modeling_flax_pytorch_utils",
]





def 						__UpperCAmelCase			(     ):
							# This is to make sure the transformers module imported is the one in the repo.
							snake_case_				=							importlib.util.spec_from_file_location(
							    'transformers'							,     os.path.join(a_							,     '__init__.py')							,     submodule_search_locations=[PATH_TO_TRANSFORMERS]							,     )
							snake_case_				=							spec.loader.load_module()

							snake_case_				=							[
							    module
							    for module in get_transformers_submodules()
							    if module not in IGNORE_SUBMODULES and module not in transformers._import_structure.keys()
							]
							if len(a_) > 0:
														snake_case_				=							'\n'.join(f'''- {module}''' for module in module_not_registered)
														raise ValueError(
														    'The following submodules are not properly registered in the main init of Transformers:\n'
														    f'''{list_of_modules}\n'''
														    'Make sure they appear somewhere in the keys of `_import_structure` with an empty list as value.')


if __name__ == "__main__":
	check_all_inits()
	check_submodules()





