



import json
import os
import shutil
import warnings
from argparse import ArgumentParser, Namespace
from pathlib import Path
from typing import List

from ..utils import logging
from . import BaseTransformersCLICommand


try:
			from cookiecutter.main import cookiecutter

			lowerCAmelCase__		:					List[Any]							=True
except ImportError:
			lowerCAmelCase__		:					Optional[int]							=False

lowerCAmelCase__		:					int							=logging.get_logger(__name__)  # pylint: disable=invalid-name






def      __lowercase       (			a__       )    ->			Any:
							return AddNewModelCommand(args.testing							,       args.testing_file							,       path=args.path       )

class        UpperCAmelCase_  (       UpperCamelCase_	):

						'''simple docstring'''




						@staticmethod
						def 	_A     (   _A		):







													'''simple docstring'''

													__SCREAMING_SNAKE_CASE									= parser.add_parser('add-new-model'		)
													add_new_model_parser.add_argument('--testing'				,							action='store_true'				,							help='If in testing mode.'		)
													add_new_model_parser.add_argument('--testing_file'				,							type=_A				,							help='Configuration file on which to run.'		)
													add_new_model_parser.add_argument(
													    '--path'				,							type=_A				,							help='Path to cookiecutter. Should only be used for testing purposes.'		)
													add_new_model_parser.set_defaults(func=_A		)






						def __init__(   self				,							_A				,							_A				,							_A=None				,							*_A		):







													'''simple docstring'''

													__SCREAMING_SNAKE_CASE									= testing
													__SCREAMING_SNAKE_CASE									= testing_file
													__SCREAMING_SNAKE_CASE									= path






						def 	_A     (   self		):







													'''simple docstring'''

													warnings.warn(
													    'The command `transformers-cli add-new-model` is deprecated and will be removed in v5 of Transformers. '
													    'It is not actively maintained anymore, so might give a result that won\'t pass all tests and quality '
													    'checks, you should use `transformers-cli add-new-model-like` instead.'		)
													if not _has_cookiecutter:
																				raise ImportError(
																				    'Model creation dependencies are required to use the `add_new_model` command. Install them by running '
																				    'the following at the root of your `transformers` clone:\n\n\t$ pip install -e .[modelcreation]\n'		)
													# Ensure that there is no other `cookiecutter-template-xxx` directory in the current working directory
													__SCREAMING_SNAKE_CASE									= [directory for directory in os.listdir() if 'cookiecutter-template-' == directory[:22]]
													if len(_A		) > 0:
																				raise ValueError(
																				    'Several directories starting with `cookiecutter-template-` in current working directory. '
																				    'Please clean your directory by removing all folders starting with `cookiecutter-template-` or '
																				    'change your working directory.'		)

													__SCREAMING_SNAKE_CASE									= (
													    Path(_A		).parent.parent.parent.parent if self._path is None else Path(self._path		).parent.parent
													)
													__SCREAMING_SNAKE_CASE									= path_to_transformer_root / 'templates' / 'adding_a_new_model'

													# Execute cookiecutter
													if not self._testing:
																				cookiecutter(str(_A		)		)
													else:
																				with open(self._testing_file				,							'r'		) as configuration_file:
																											__SCREAMING_SNAKE_CASE									= json.load(_A		)

																				cookiecutter(
																				    str(path_to_cookiecutter if self._path is None else self._path		)				,							no_input=_A				,							extra_context=_A				,							)

													__SCREAMING_SNAKE_CASE									= [directory for directory in os.listdir() if 'cookiecutter-template-' in directory[:22]][0]

													# Retrieve configuration
													with open(directory + '/configuration.json'				,							'r'		) as configuration_file:
																				__SCREAMING_SNAKE_CASE									= json.load(_A		)

													__SCREAMING_SNAKE_CASE									= configuration['lowercase_modelname']
													__SCREAMING_SNAKE_CASE									= configuration['generate_tensorflow_pytorch_and_flax']
													os.remove(f"""{directory}/configuration.json"""		)

													__SCREAMING_SNAKE_CASE									= 'PyTorch' in generate_tensorflow_pytorch_and_flax
													__SCREAMING_SNAKE_CASE									= 'TensorFlow' in generate_tensorflow_pytorch_and_flax
													__SCREAMING_SNAKE_CASE									= 'Flax' in generate_tensorflow_pytorch_and_flax

													__SCREAMING_SNAKE_CASE									= f"""{path_to_transformer_root}/src/transformers/models/{lowercase_model_name}"""
													os.makedirs(_A				,							exist_ok=_A		)
													os.makedirs(f"""{path_to_transformer_root}/tests/models/{lowercase_model_name}"""				,							exist_ok=_A		)

													# Tests require submodules as they have parent imports
													with open(f"""{path_to_transformer_root}/tests/models/{lowercase_model_name}/__init__.py"""				,							'w'		):
																				pass

													shutil.move(
													    f"""{directory}/__init__.py"""				,							f"""{model_dir}/__init__.py"""				,							)
													shutil.move(
													    f"""{directory}/configuration_{lowercase_model_name}.py"""				,							f"""{model_dir}/configuration_{lowercase_model_name}.py"""				,							)

													def remove_copy_lines(_A		):
																				with open(_A				,							'r'		) as f:
																											__SCREAMING_SNAKE_CASE									= f.readlines()
																				with open(_A				,							'w'		) as f:
																											for line in lines:
																																		if "# Copied from transformers." not in line:
																																									f.write(_A		)

													if output_pytorch:
																				if not self._testing:
																											remove_copy_lines(f"""{directory}/modeling_{lowercase_model_name}.py"""		)

																				shutil.move(
																				    f"""{directory}/modeling_{lowercase_model_name}.py"""				,							f"""{model_dir}/modeling_{lowercase_model_name}.py"""				,							)

																				shutil.move(
																				    f"""{directory}/test_modeling_{lowercase_model_name}.py"""				,							f"""{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_{lowercase_model_name}.py"""				,							)
													else:
																				os.remove(f"""{directory}/modeling_{lowercase_model_name}.py"""		)
																				os.remove(f"""{directory}/test_modeling_{lowercase_model_name}.py"""		)

													if output_tensorflow:
																				if not self._testing:
																											remove_copy_lines(f"""{directory}/modeling_tf_{lowercase_model_name}.py"""		)

																				shutil.move(
																				    f"""{directory}/modeling_tf_{lowercase_model_name}.py"""				,							f"""{model_dir}/modeling_tf_{lowercase_model_name}.py"""				,							)

																				shutil.move(
																				    f"""{directory}/test_modeling_tf_{lowercase_model_name}.py"""				,							f"""{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_tf_{lowercase_model_name}.py"""				,							)
													else:
																				os.remove(f"""{directory}/modeling_tf_{lowercase_model_name}.py"""		)
																				os.remove(f"""{directory}/test_modeling_tf_{lowercase_model_name}.py"""		)

													if output_flax:
																				if not self._testing:
																											remove_copy_lines(f"""{directory}/modeling_flax_{lowercase_model_name}.py"""		)

																				shutil.move(
																				    f"""{directory}/modeling_flax_{lowercase_model_name}.py"""				,							f"""{model_dir}/modeling_flax_{lowercase_model_name}.py"""				,							)

																				shutil.move(
																				    f"""{directory}/test_modeling_flax_{lowercase_model_name}.py"""				,							f"""{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_flax_{lowercase_model_name}.py"""				,							)
													else:
																				os.remove(f"""{directory}/modeling_flax_{lowercase_model_name}.py"""		)
																				os.remove(f"""{directory}/test_modeling_flax_{lowercase_model_name}.py"""		)

													shutil.move(
													    f"""{directory}/{lowercase_model_name}.md"""				,							f"""{path_to_transformer_root}/docs/source/en/model_doc/{lowercase_model_name}.md"""				,							)

													shutil.move(
													    f"""{directory}/tokenization_{lowercase_model_name}.py"""				,							f"""{model_dir}/tokenization_{lowercase_model_name}.py"""				,							)

													shutil.move(
													    f"""{directory}/tokenization_fast_{lowercase_model_name}.py"""				,							f"""{model_dir}/tokenization_{lowercase_model_name}_fast.py"""				,							)

													from os import fdopen, remove
													from shutil import copymode, move
													from tempfile import mkstemp

													def replace(_A				,							_A				,							_A		):
																				# Create temp file
																				__SCREAMING_SNAKE_CASE							,	__SCREAMING_SNAKE_CASE									= mkstemp()
																				__SCREAMING_SNAKE_CASE									= False
																				with fdopen(_A				,							'w'		) as new_file:
																											with open(_A		) as old_file:
																																		for line in old_file:
																																									new_file.write(_A		)
																																									if line_to_copy_below in line:
																																																__SCREAMING_SNAKE_CASE									= True
																																																for line_to_copy in lines_to_copy:
																																																							new_file.write(_A		)

																				if not line_found:
																											raise ValueError(f"""Line {line_to_copy_below} was not found in file."""		)

																				# Copy the file permissions from the old file to the new file
																				copymode(_A				,							_A		)
																				# Remove original file
																				remove(_A		)
																				# Move new file
																				move(_A				,							_A		)

													def skip_units(_A		):
																				return (
																				    ("generating PyTorch" in line and not output_pytorch)
																				    or ("generating TensorFlow" in line and not output_tensorflow)
																				    or ("generating Flax" in line and not output_flax)
																				)

													def replace_in_files(_A		):
																				with open(_A		) as datafile:
																											__SCREAMING_SNAKE_CASE									= []
																											__SCREAMING_SNAKE_CASE									= False
																											__SCREAMING_SNAKE_CASE									= False
																											for line in datafile:
																																		if "# To replace in: " in line and "##" not in line:
																																									__SCREAMING_SNAKE_CASE									= line.split('"'		)[1]
																																									__SCREAMING_SNAKE_CASE									= skip_units(_A		)
																																		elif "# Below: " in line and "##" not in line:
																																									__SCREAMING_SNAKE_CASE									= line.split('"'		)[1]
																																									__SCREAMING_SNAKE_CASE									= skip_units(_A		)
																																		elif "# End." in line and "##" not in line:
																																									if not skip_file and not skip_snippet:
																																																replace(_A				,							_A				,							_A		)

																																									__SCREAMING_SNAKE_CASE									= []
																																		elif "# Replace with" in line and "##" not in line:
																																									__SCREAMING_SNAKE_CASE									= []
																																		elif "##" not in line:
																																									lines_to_copy.append(_A		)

																				remove(_A		)

													replace_in_files(f"""{directory}/to_replace_{lowercase_model_name}.py"""		)
													os.rmdir(_A		)











from ..utils import DummyObject, requires_backends

class        UpperCAmelCase_  (       metaclass=UpperCamelCase_	):

						'''simple docstring'''




						UpperCamelCase__      :			Optional[int]      =  ['''speech''']






						def __init__(   self				,							*_A				,							**_A		):







													'''simple docstring'''

													requires_backends(self				,							['speech']		)







class        UpperCAmelCase_  (       metaclass=UpperCamelCase_	):

						'''simple docstring'''




						UpperCamelCase__      :			Optional[int]      =  ['''speech''']






						def __init__(   self				,							*_A				,							**_A		):







													'''simple docstring'''

													requires_backends(self				,							['speech']		)






