



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

				__snake_case     :Tuple			       =True
except ImportError:
				__snake_case     :Dict			       =False

__snake_case     :str			       =logging.get_logger(__name__)  # pylint: disable=invalid-name






def  lowerCamelCase_	(      lowerCAmelCase__	:	Namespace				)       ->							str:

							'''simple docstring'''






							return AddNewModelCommand(args.testing			,	args.testing_file			,	path=args.path				)



class        lowerCAmelCase__					(  _lowerCamelCase       ):


				@staticmethod
				def __UpperCamelCase						(							__UpperCamelCase      :  ArgumentParser       )		->     Tuple:
											A      						=    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=__UpperCamelCase						, help='Configuration file on which to run.'       )
											add_new_model_parser.add_argument(
											    '--path'						, type=__UpperCamelCase						, help='Path to cookiecutter. Should only be used for testing purposes.'       )
											add_new_model_parser.set_defaults(func=__UpperCamelCase       )


				def __init__(							self      :  Any						, __UpperCamelCase      :  bool						, __UpperCamelCase      :  str						, __UpperCamelCase      :  Dict=None						, *__UpperCamelCase      :  List[str]       )		->     Optional[Any]:
											A      						=    testing
											A      						=    testing_file
											A      						=    path


				def __UpperCamelCase						(							self      :  List[str]       )		->     Union[str, Any]:
											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
											A      						=    [directory for directory in os.listdir() if 'cookiecutter-template-' == directory[:22]]
											if len(__UpperCamelCase       ) > 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.'       )

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

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

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

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

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

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

											A      						=    'PyTorch' in generate_tensorflow_pytorch_and_flax
											A      						=    'TensorFlow' in generate_tensorflow_pytorch_and_flax
											A      						=    'Flax' in generate_tensorflow_pytorch_and_flax

											A      						=    f'''{path_to_transformer_root}/src/transformers/models/{lowercase_model_name}'''
											os.makedirs(__UpperCamelCase						, exist_ok=__UpperCamelCase       )
											os.makedirs(f'''{path_to_transformer_root}/tests/models/{lowercase_model_name}'''						, exist_ok=__UpperCamelCase       )

											# 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(__UpperCamelCase      :  List[str]       ):
																		with open(__UpperCamelCase						, 'r'       ) as f:
																									A      						=    f.readlines()
																		with open(__UpperCamelCase						, 'w'       ) as f:
																									for line in lines:
																																if "# Copied from transformers." not in line:
																																							f.write(__UpperCamelCase       )

											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(__UpperCamelCase      :  str						, __UpperCamelCase      :  str						, __UpperCamelCase      :  List[str]       ):
																		# Create temp file
																		A						,   A      						=    mkstemp()
																		A      						=    False
																		with fdopen(__UpperCamelCase						, 'w'       ) as new_file:
																									with open(__UpperCamelCase       ) as old_file:
																																for line in old_file:
																																							new_file.write(__UpperCamelCase       )
																																							if line_to_copy_below in line:
																																														A      						=    True
																																														for line_to_copy in lines_to_copy:
																																																					new_file.write(__UpperCamelCase       )

																		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(__UpperCamelCase						, __UpperCamelCase       )
																		# Remove original file
																		remove(__UpperCamelCase       )
																		# Move new file
																		move(__UpperCamelCase						, __UpperCamelCase       )

											def skip_units(__UpperCamelCase      :  List[Any]       ):
																		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(__UpperCamelCase      :  Tuple       ):
																		with open(__UpperCamelCase       ) as datafile:
																									A      						=    []
																									A      						=    False
																									A      						=    False
																									for line in datafile:
																																if "# To replace in: " in line and "##" not in line:
																																							A      						=    line.split('"'       )[1]
																																							A      						=    skip_units(__UpperCamelCase       )
																																elif "# Below: " in line and "##" not in line:
																																							A      						=    line.split('"'       )[1]
																																							A      						=    skip_units(__UpperCamelCase       )
																																elif "# End." in line and "##" not in line:
																																							if not skip_file and not skip_snippet:
																																														replace(__UpperCamelCase						, __UpperCamelCase						, __UpperCamelCase       )

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

																		remove(__UpperCamelCase       )

											replace_in_files(f'''{directory}/to_replace_{lowercase_model_name}.py'''       )
											os.rmdir(__UpperCamelCase       )




from ...configuration_utils import PretrainedConfig
from ...utils import logging


__snake_case     :List[str]			       =logging.get_logger(__name__)

__snake_case     :int			       ={'openai-gpt': 'https://huggingface.co/openai-gpt/resolve/main/config.json'}



class        lowerCAmelCase__					(  _lowerCamelCase       ):
				A_   :     Optional[Any]								=     'openai-gpt'
				A_   :     Any								=     {
				    'max_position_embeddings': 'n_positions',
				    'hidden_size': 'n_embd',
				    'num_attention_heads': 'n_head',
				    'num_hidden_layers': 'n_layer',
				}


				def __init__(							self      :  List[Any]						, __UpperCamelCase      :  List[str]=40_478						, __UpperCamelCase      :  List[Any]=512						, __UpperCamelCase      :  List[Any]=768						, __UpperCamelCase      :  Optional[int]=12						, __UpperCamelCase      :  Dict=12						, __UpperCamelCase      :  List[str]="gelu"						, __UpperCamelCase      :  str=0.1						, __UpperCamelCase      :  Optional[Any]=0.1						, __UpperCamelCase      :  Union[str, Any]=0.1						, __UpperCamelCase      :  List[str]=1e-5						, __UpperCamelCase      :  List[Any]=0.0_2						, __UpperCamelCase      :  str="cls_index"						, __UpperCamelCase      :  int=True						, __UpperCamelCase      :  int=None						, __UpperCamelCase      :  Optional[int]=True						, __UpperCamelCase      :  Tuple=0.1						, **__UpperCamelCase      :  List[Any]						, )		->     List[str]:
											A      						=    vocab_size
											A      						=    n_positions
											A      						=    n_embd
											A      						=    n_layer
											A      						=    n_head
											A      						=    afn
											A      						=    resid_pdrop
											A      						=    embd_pdrop
											A      						=    attn_pdrop
											A      						=    layer_norm_epsilon
											A      						=    initializer_range
											A      						=    summary_type
											A      						=    summary_use_proj
											A      						=    summary_activation
											A      						=    summary_first_dropout
											A      						=    summary_proj_to_labels
											super().__init__(**__UpperCamelCase       )