
"""simple docstring"""




import subprocess
from argparse import ArgumentParser
from typing import List, Union

from huggingface_hub.hf_api import HfFolder, create_repo, whoami
from requests.exceptions import HTTPError

from . import BaseTransformersCLICommand







class 	_lowercase    (							lowerCAmelCase_					):


     '''simple docstring'''





     @staticmethod
     def 			lowerCAmelCase__							(   __UpperCamelCase	)->       Optional[Any]:
          UpperCAmelCase__				:			Optional[int]							=    parser.add_parser("login"			,      help="Log in using the same credentials as on huggingface.co"	)
          login_parser.set_defaults(func=lambda __UpperCamelCase	: LoginCommand(__UpperCamelCase	)	)
          UpperCAmelCase__				:			Optional[int]							=    parser.add_parser("whoami"			,      help="Find out which huggingface.co account you are logged in as."	)
          whoami_parser.set_defaults(func=lambda __UpperCamelCase	: WhoamiCommand(__UpperCamelCase	)	)
          UpperCAmelCase__				:			Optional[Any]							=    parser.add_parser("logout"			,      help="Log out"	)
          logout_parser.set_defaults(func=lambda __UpperCamelCase	: LogoutCommand(__UpperCamelCase	)	)

          # new system: git-based repo system
          UpperCAmelCase__				:			Dict							=    parser.add_parser(
              "repo"			,      help="Deprecated: use `huggingface-cli` instead. Commands to interact with your huggingface.co repos."			,      )
          UpperCAmelCase__				:			List[Any]							=    repo_parser.add_subparsers(
              help="Deprecated: use `huggingface-cli` instead. huggingface.co repos related commands"	)
          UpperCAmelCase__				:			str							=    repo_subparsers.add_parser(
              "create"			,      help="Deprecated: use `huggingface-cli` instead. Create a new repo on huggingface.co"	)
          repo_create_parser.add_argument(
              "name"			,      type=__UpperCamelCase			,      help="Name for your model's repo. Will be namespaced under your username to build the model id."			,      )
          repo_create_parser.add_argument("--organization"			,      type=__UpperCamelCase			,      help="Optional: organization namespace."	)
          repo_create_parser.add_argument("-y"			,      "--yes"			,      action="store_true"			,      help="Optional: answer Yes to the prompt"	)
          repo_create_parser.set_defaults(func=lambda __UpperCamelCase	: RepoCreateCommand(__UpperCamelCase	)	)







class 	_lowercase    :


     '''simple docstring'''





     _A		    =				'\u001b[1m'
     _A		    =				'\u001b[31m'
     _A		    =				'\u001b[90m'
     _A		    =				'\u001b[0m'



     @classmethod
     def 			lowerCAmelCase__							(   cls			,      __UpperCamelCase	)->       Optional[Any]:
          return F"{cls._bold}{s}{cls._reset}"



     @classmethod
     def 			lowerCAmelCase__							(   cls			,      __UpperCamelCase	)->       Optional[int]:
          return F"{cls._bold}{cls._red}{s}{cls._reset}"



     @classmethod
     def 			lowerCAmelCase__							(   cls			,      __UpperCamelCase	)->       Any:
          return F"{cls._gray}{s}{cls._reset}"





def 				a__			(					lowerCAmelCase						:							List[List[Union[str, int]]]							,     lowerCAmelCase						:							List[str]		):






     '''simple docstring'''
     UpperCAmelCase__				:			List[str]							=    [max(len(str(lowerCAmelCase		)		) for x in col		) for col in zip(*lowerCAmelCase							,     lowerCAmelCase		)]
     UpperCAmelCase__				:			Optional[int]							=    ("{{:{}}} " * len(lowerCAmelCase		)).format(*lowerCAmelCase		)
     UpperCAmelCase__				:			List[str]							=    []
     lines.append(row_format.format(*lowerCAmelCase		)		)
     lines.append(row_format.format(*["-" * w for w in col_widths]		)		)
     for row in rows:
          lines.append(row_format.format(*lowerCAmelCase		)		)
     return "\n".join(lowerCAmelCase		)







class 	_lowercase    :


     '''simple docstring'''





     def __init__(   self			,      __UpperCamelCase	)->       int:
          UpperCAmelCase__				:			Union[str, Any]							=    args







class 	_lowercase    (							lowerCAmelCase_					):


     '''simple docstring'''





     def 			lowerCAmelCase__							(   self	)->       Tuple:
          print(
              ANSI.red(
                  "ERROR! `huggingface-cli login` uses an outdated login mechanism "
                  "that is not compatible with the Hugging Face Hub backend anymore. "
                  "Please use `huggingface-cli login instead."	)	)







class 	_lowercase    (							lowerCAmelCase_					):


     '''simple docstring'''





     def 			lowerCAmelCase__							(   self	)->       Tuple:
          print(
              ANSI.red(
                  "WARNING! `transformers-cli whoami` is deprecated and will be removed in v5. Please use "
                  "`huggingface-cli whoami` instead."	)	)
          UpperCAmelCase__				:			Tuple							=    HfFolder.get_token()
          if token is None:
               print("Not logged in"	)
               exit()
          try:
               UpperCAmelCase__				,						UpperCAmelCase__				:			Optional[int]							=    whoami(__UpperCamelCase	)
               print(__UpperCamelCase	)
               if orgs:
                    print(ANSI.bold("orgs: "	)			,      ",".join(__UpperCamelCase	)	)
          except HTTPError as e:
               print(__UpperCamelCase	)
               print(ANSI.red(e.response.text	)	)
               exit(1	)







class 	_lowercase    (							lowerCAmelCase_					):


     '''simple docstring'''





     def 			lowerCAmelCase__							(   self	)->       Any:
          print(
              ANSI.red(
                  "ERROR! `transformers-cli logout` uses an outdated logout mechanism "
                  "that is not compatible with the Hugging Face Hub backend anymore. "
                  "Please use `huggingface-cli logout instead."	)	)







class 	_lowercase    (							lowerCAmelCase_					):


     '''simple docstring'''





     def 			lowerCAmelCase__							(   self	)->       Dict:
          print(
              ANSI.red(
                  "WARNING! Managing repositories through transformers-cli is deprecated. "
                  "Please use `huggingface-cli` instead."	)	)
          UpperCAmelCase__				:			Dict							=    HfFolder.get_token()
          if token is None:
               print("Not logged in"	)
               exit(1	)
          try:
               UpperCAmelCase__				:			Tuple							=    subprocess.check_output(["git", "--version"]	).decode("utf-8"	)
               print(ANSI.gray(stdout.strip()	)	)
          except FileNotFoundError:
               print("Looks like you do not have git installed, please install."	)

          try:
               UpperCAmelCase__				:			Dict							=    subprocess.check_output(["git-lfs", "--version"]	).decode("utf-8"	)
               print(ANSI.gray(stdout.strip()	)	)
          except FileNotFoundError:
               print(
                   ANSI.red(
                       "Looks like you do not have git-lfs installed, please install."
                       " You can install from https://git-lfs.github.com/."
                       " Then run `git lfs install` (you only have to do this once)."	)	)
          print(""	)

          UpperCAmelCase__				,						UpperCAmelCase__				:			str							=    whoami(__UpperCamelCase	)
          UpperCAmelCase__				:			List[str]							=    self.args.organization if self.args.organization is not None else user
          UpperCAmelCase__				:			Optional[Any]							=    F"{namespace}/{self.args.name}"
          print(F"You are about to create {ANSI.bold(__UpperCamelCase	)}"	)

          if not self.args.yes:
               UpperCAmelCase__				:			List[str]							=    input("Proceed? [Y/n] "	).lower()
               if not (choice == "" or choice == "y" or choice == "yes"):
                    print("Abort"	)
                    exit()
          try:
               UpperCAmelCase__				:			Union[str, Any]							=    create_repo(__UpperCamelCase			,      name=self.args.name			,      organization=self.args.organization	)
          except HTTPError as e:
               print(__UpperCamelCase	)
               print(ANSI.red(e.response.text	)	)
               exit(1	)
          print("\nYour repo now lives at:"	)
          print(F"  {ANSI.bold(__UpperCamelCase	)}"	)
          print("\nYou can clone it locally with the command below, and commit/push as usual."	)
          print(F"\n  git clone {url}"	)
          print(""	)





"""simple docstring"""




import argparse
import collections
import importlib.util
import os
import re


# All paths are set with the intent you should run this script from the root of the repo with the command
# python utils/check_table.py
A__   :						List[str] 							=     """src/diffusers"""
A__   :						List[str] 							=     """docs/source/en"""
A__   :						List[Any] 							=     """."""



def 				a__			(					lowerCAmelCase						:							List[str]							,     lowerCAmelCase						:							Any							,     lowerCAmelCase						:							List[Any]		):






     '''simple docstring'''
     with open(lowerCAmelCase							,     "r"							,     encoding="utf-8"							,     newline="\n"		) as f:
          UpperCAmelCase__				:			List[str]							=    f.readlines()
     # Find the start prompt.
     UpperCAmelCase__				:			Union[str, Any]							=    0
     while not lines[start_index].startswith(lowerCAmelCase		):
          start_index += 1
     start_index += 1

     UpperCAmelCase__				:			List[Any]							=    start_index
     while not lines[end_index].startswith(lowerCAmelCase		):
          end_index += 1
     end_index -= 1

     while len(lines[start_index]		) <= 1:
          start_index += 1
     while len(lines[end_index]		) <= 1:
          end_index -= 1
     end_index += 1
     return "".join(lines[start_index:end_index]		), start_index, end_index, lines


# Add here suffixes that are used to identify models, separated by |
A__   :						Tuple 							=     """Model|Encoder|Decoder|ForConditionalGeneration"""
# Regexes that match TF/Flax/PT model names.
A__   :						Any 							=     re.compile(R"""TF(.*)(?:Model|Encoder|Decoder|ForConditionalGeneration)""")
A__   :						Tuple 							=     re.compile(R"""Flax(.*)(?:Model|Encoder|Decoder|ForConditionalGeneration)""")
# Will match any TF or Flax model too so need to be in an else branch afterthe two previous regexes.
A__   :						List[Any] 							=     re.compile(R"""(.*)(?:Model|Encoder|Decoder|ForConditionalGeneration)""")


# This is to make sure the diffusers module imported is the one in the repo.
A__   :						List[Any] 							=     importlib.util.spec_from_file_location(
    """diffusers""",
    os.path.join(TRANSFORMERS_PATH, """__init__.py"""),
    submodule_search_locations=[TRANSFORMERS_PATH],
)
A__   :						Dict 							=     spec.loader.load_module()



def 				a__			(					lowerCAmelCase						:							List[str]		):






     '''simple docstring'''
     UpperCAmelCase__				:			Dict							=    re.finditer(".+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)"							,     lowerCAmelCase		)
     return [m.group(0		) for m in matches]



def 				a__			(					lowerCAmelCase						:							Tuple							,     lowerCAmelCase						:							Union[str, Any]		):






     '''simple docstring'''
     UpperCAmelCase__				:			List[Any]							=    2 if text == "✅" or text == "❌" else len(lowerCAmelCase		)
     UpperCAmelCase__				:			Any							=    (width - text_length) // 2
     UpperCAmelCase__				:			List[Any]							=    width - text_length - left_indent
     return " " * left_indent + text + " " * right_indent



def 				a__			(					):






     '''simple docstring'''
     UpperCAmelCase__				:			int							=    diffusers_module.models.auto.configuration_auto.CONFIG_MAPPING_NAMES
     UpperCAmelCase__				:			Optional[int]							=    {
         name: config_mapping_names[code]
         for code, name in diffusers_module.MODEL_NAMES_MAPPING.items()
         if code in config_mapping_names
     }
     UpperCAmelCase__				:			Optional[int]							=    {name: config.replace("ConfigMixin"							,     ""		) for name, config in model_name_to_config.items()}

     # Dictionaries flagging if each model prefix has a slow/fast tokenizer, backend in PT/TF/Flax.
     UpperCAmelCase__				:			str							=    collections.defaultdict(lowerCAmelCase		)
     UpperCAmelCase__				:			Optional[int]							=    collections.defaultdict(lowerCAmelCase		)
     UpperCAmelCase__				:			str							=    collections.defaultdict(lowerCAmelCase		)
     UpperCAmelCase__				:			str							=    collections.defaultdict(lowerCAmelCase		)
     UpperCAmelCase__				:			Union[str, Any]							=    collections.defaultdict(lowerCAmelCase		)

     # Let's lookup through all diffusers object (once).
     for attr_name in dir(lowerCAmelCase		):
          UpperCAmelCase__				:			List[str]							=    None
          if attr_name.endswith("Tokenizer"		):
               UpperCAmelCase__				:			Union[str, Any]							=    slow_tokenizers
               UpperCAmelCase__				:			Optional[Any]							=    attr_name[:-9]
          elif attr_name.endswith("TokenizerFast"		):
               UpperCAmelCase__				:			List[str]							=    fast_tokenizers
               UpperCAmelCase__				:			Union[str, Any]							=    attr_name[:-13]
          elif _re_tf_models.match(lowerCAmelCase		) is not None:
               UpperCAmelCase__				:			Union[str, Any]							=    tf_models
               UpperCAmelCase__				:			Optional[int]							=    _re_tf_models.match(lowerCAmelCase		).groups()[0]
          elif _re_flax_models.match(lowerCAmelCase		) is not None:
               UpperCAmelCase__				:			List[Any]							=    flax_models
               UpperCAmelCase__				:			Any							=    _re_flax_models.match(lowerCAmelCase		).groups()[0]
          elif _re_pt_models.match(lowerCAmelCase		) is not None:
               UpperCAmelCase__				:			str							=    pt_models
               UpperCAmelCase__				:			List[str]							=    _re_pt_models.match(lowerCAmelCase		).groups()[0]

          if lookup_dict is not None:
               while len(lowerCAmelCase		) > 0:
                    if attr_name in model_name_to_prefix.values():
                         UpperCAmelCase__				:			Optional[Any]							=    True
                         break
                    # Try again after removing the last word in the name
                    UpperCAmelCase__				:			Union[str, Any]							=    "".join(camel_case_split(lowerCAmelCase		)[:-1]		)

    # Let's build that table!
     UpperCAmelCase__				:			Tuple							=    list(model_name_to_config.keys()		)
     model_names.sort(key=str.lower		)
     UpperCAmelCase__				:			Dict							=    ["Model", "Tokenizer slow", "Tokenizer fast", "PyTorch support", "TensorFlow support", "Flax Support"]
     # We'll need widths to properly display everything in the center (+2 is to leave one extra space on each side).
     UpperCAmelCase__				:			List[str]							=    [len(lowerCAmelCase		) + 2 for c in columns]
     UpperCAmelCase__				:			Union[str, Any]							=    max([len(lowerCAmelCase		) for name in model_names]		) + 2

     # Build the table per se
     UpperCAmelCase__				:			str							=    "|" + "|".join([_center_text(lowerCAmelCase							,     lowerCAmelCase		) for c, w in zip(lowerCAmelCase							,     lowerCAmelCase		)]		) + "|\n"
     # Use ":-----:" format to center-aligned table cell texts
     table += "|" + "|".join([":" + "-" * (w - 2) + ":" for w in widths]		) + "|\n"

     UpperCAmelCase__				:			List[Any]							=    {True: "✅", False: "❌"}
     for name in model_names:
          UpperCAmelCase__				:			Optional[Any]							=    model_name_to_prefix[name]
          UpperCAmelCase__				:			List[Any]							=    [
              name,
              check[slow_tokenizers[prefix]],
              check[fast_tokenizers[prefix]],
              check[pt_models[prefix]],
              check[tf_models[prefix]],
              check[flax_models[prefix]],
          ]
          table += "|" + "|".join([_center_text(lowerCAmelCase							,     lowerCAmelCase		) for l, w in zip(lowerCAmelCase							,     lowerCAmelCase		)]		) + "|\n"
     return table



def 				a__			(					lowerCAmelCase						:							Union[str, Any]=False		):






     '''simple docstring'''
     UpperCAmelCase__				,						UpperCAmelCase__				,						UpperCAmelCase__				,						UpperCAmelCase__				:			int							=    _find_text_in_file(
         filename=os.path.join(lowerCAmelCase							,     "index.mdx"		)							,     start_prompt="<!--This table is updated automatically from the auto modules"							,     end_prompt="<!-- End table-->"							,     )
     UpperCAmelCase__				:			Optional[Any]							=    get_model_table_from_auto_modules()

     if current_table != new_table:
          if overwrite:
               with open(os.path.join(lowerCAmelCase							,     "index.mdx"		)							,     "w"							,     encoding="utf-8"							,     newline="\n"		) as f:
                    f.writelines(lines[:start_index] + [new_table] + lines[end_index:]		)
          else:
               raise ValueError(
                   "The model table in the `index.mdx` has not been updated. Run `make fix-copies` to fix this."		)


if __name__ == "__main__":
    A__   :						Union[str, Any] 							=     argparse.ArgumentParser()
    parser.add_argument("""--fix_and_overwrite""", action="""store_true""", help="""Whether to fix inconsistencies.""")
    A__   :						str 							=     parser.parse_args()

    check_model_table(args.fix_and_overwrite)



