




import unittest

from transformers import ErnieMTokenizer
from transformers.testing_utils import get_tests_dir, require_sentencepiece, require_tokenizers, slow

from ...test_tokenization_common import TokenizerTesterMixin


UpperCAmelCase__    :							Dict       		=     get_tests_dir('fixtures/spiece.model')

@require_sentencepiece
@require_tokenizers
class   UpperCAmelCase    (      UpperCAmelCase_ ,       unittest.TestCase ):
   __SCREAMING_SNAKE_CASE		:				int      					=       ErnieMTokenizer
   __SCREAMING_SNAKE_CASE		:				Optional[Any]      					=       False
   __SCREAMING_SNAKE_CASE		:				Dict      					=       True
   __SCREAMING_SNAKE_CASE		:				Union[str, Any]      					=       False
   __SCREAMING_SNAKE_CASE		:				Dict      					=       False






   def 			_a    (						self :							Dict  )->      Any:
     super().setUp()

     # We have a SentencePiece fixture for testing
     _lowercase:			List[Any]      =     ErnieMTokenizer(_lowercase    ,       unk_token='<unk>'    ,       pad_token='<pad>'  )
     tokenizer.save_pretrained(self.tmpdirname  )






   def 			_a    (						self :							Any    ,       UpperCamelCase_ :							Dict  )->      Optional[int]:
     _lowercase:			Optional[int]      =     'this is a test'
     _lowercase:			Dict      =     'this is a test'
     return input_text, output_text






   def 			_a    (						self :							Optional[int]  )->      Any:
     _lowercase:			str      =     '<pad>'
     _lowercase:			Optional[Any]      =     0

     self.assertEqual(self.get_tokenizer()._convert_token_to_id(_lowercase  )    ,       _lowercase  )
     self.assertEqual(self.get_tokenizer()._convert_id_to_token(_lowercase  )    ,       _lowercase  )






   def 			_a    (						self :							str  )->      Dict:
     _lowercase:			List[str]      =     list(self.get_tokenizer().get_vocab().keys()  )

     self.assertEqual(vocab_keys[0]    ,       '<pad>'  )
     self.assertEqual(vocab_keys[1]    ,       '<unk>'  )
     self.assertEqual(vocab_keys[-1]    ,       '▁eloquent'  )
     self.assertEqual(len(_lowercase  )    ,       3_00_00  )






   def 			_a    (						self :							int  )->      Dict:
     self.assertEqual(self.get_tokenizer().vocab_size    ,       3_00_00  )






   def 			_a    (						self :							Tuple  )->      List[str]:
     if not self.test_rust_tokenizer:
       return

     _lowercase:			Optional[int]      =     self.get_tokenizer()
     _lowercase:			Optional[Any]      =     self.get_rust_tokenizer()

     _lowercase:			Tuple      =     'I was born in 92000, and this is falsé.'

     _lowercase:			Union[str, Any]      =     tokenizer.tokenize(_lowercase  )
     _lowercase:			List[Any]      =     rust_tokenizer.tokenize(_lowercase  )
     self.assertListEqual(_lowercase    ,       _lowercase  )

     _lowercase:			Any      =     tokenizer.encode(_lowercase    ,       add_special_tokens=_lowercase  )
     _lowercase:			List[Any]      =     rust_tokenizer.encode(_lowercase    ,       add_special_tokens=_lowercase  )
     self.assertListEqual(_lowercase    ,       _lowercase  )

     _lowercase:			Union[str, Any]      =     self.get_rust_tokenizer()
     _lowercase:			Optional[Any]      =     tokenizer.encode(_lowercase  )
     _lowercase:			str      =     rust_tokenizer.encode(_lowercase  )
     self.assertListEqual(_lowercase    ,       _lowercase  )






   def 			_a    (						self :							Tuple  )->      Tuple:
     _lowercase:			Optional[int]      =     ErnieMTokenizer(_lowercase    ,       do_lower_case=_lowercase    ,       unk_token='<unk>'    ,       pad_token='<pad>'  )

     _lowercase:			Tuple      =     tokenizer.tokenize('This is a test'  )
     self.assertListEqual(_lowercase    ,       ['▁this', '▁is', '▁a', '▁test']  )

     self.assertListEqual(tokenizer.convert_tokens_to_ids(_lowercase  )    ,       [48, 25, 21, 12_89]  )

     _lowercase:			Union[str, Any]      =     tokenizer.tokenize('I was born in 92000, and this is falsé.'  )
     # ErnieMTokenizer(paddlenlp implementation) outputs '9' instead of '_9' so to mimic that '_9' is changed to '9'
     self.assertListEqual(
         _lowercase    ,       ['▁i', '▁was', '▁born', '▁in', '9', '2000', ',', '▁and', '▁this', '▁is', '▁fal', 's', 'é', '.']  )
     _lowercase:			int      =     tokenizer.convert_tokens_to_ids(_lowercase  )
     self.assertListEqual(_lowercase    ,       [31, 23, 3_86, 19, 5_18, 30_50, 15, 17, 48, 25, 82_56, 18, 1, 9]  )

     _lowercase:			Optional[int]      =     tokenizer.convert_ids_to_tokens(_lowercase  )
     self.assertListEqual(
         _lowercase    ,       ['▁i', '▁was', '▁born', '▁in', '9', '2000', ',', '▁and', '▁this', '▁is', '▁fal', 's', '<unk>', '.']    ,       )






   def 			_a    (						self :							Optional[Any]  )->      Any:
     _lowercase:			Tuple      =     ErnieMTokenizer(_lowercase    ,       unk_token='<unk>'    ,       pad_token='<pad>'  )

     _lowercase:			List[Any]      =     tokenizer.encode('sequence builders'  )
     _lowercase:			Optional[int]      =     tokenizer.encode('multi-sequence build'  )

     _lowercase:			Union[str, Any]      =     tokenizer.build_inputs_with_special_tokens(_lowercase  )
     _lowercase:			Optional[int]      =     tokenizer.build_inputs_with_special_tokens(_lowercase    ,       _lowercase  )

     assert encoded_sentence == [tokenizer.cls_token_id] + text + [tokenizer.sep_token_id]
     assert encoded_pair == [tokenizer.cls_token_id] + text + [tokenizer.sep_token_id] + [
         tokenizer.sep_token_id
     ] + text_a + [tokenizer.sep_token_id]






   @slow
   def 			_a    (						self :							Any  )->      Tuple:
     # fmt: off
     _lowercase:			Dict      =     {'input_ids': [[0, 1_10_62, 8_27_72, 7, 15, 8_27_72, 5_38, 5_15_29, 2_37, 1_71_98, 12_90, 2_06, 9, 21_51_75, 13_14, 1_36, 1_71_98, 12_90, 2_06, 9, 5_63_59, 42, 12_20_09, 9, 1_64_66, 16, 8_73_44, 45_37, 9, 47_17, 7_83_81, 6, 15_99_58, 7, 15, 2_44_80, 6_18, 4, 5_27, 2_26_93, 9, 3_04, 4, 27_77, 2_44_80, 98_74, 4, 4_35_23, 5_94, 4, 8_03, 1_83_92, 3_31_89, 18, 4, 4_35_23, 2_44_47, 5, 5, 5, 16, 1_00, 2_49_55, 8_36_58, 96_26, 14_40_57, 15, 8_39, 2_23_35, 16, 1_36, 2_49_55, 8_36_58, 8_34_79, 15, 3_91_02, 7_24, 16, 6_78, 6_45, 64_60, 13_28, 45_89, 42, 12_20_09, 11_57_74, 23, 35_59, 13_28, 4_68_76, 7, 1_36, 5_38_94, 19_40, 4_22_27, 4_11_59, 1_77_21, 8_23, 4_25, 4, 2_75_12, 9_87_22, 2_06, 1_36, 55_31, 49_70, 9_19, 1_73_36, 5, 2], [0, 2_00_80, 6_18, 83, 8_27_75, 47, 4_79, 9, 15_17, 73, 5_38_94, 3_33, 8_05_81, 11_01_17, 1_88_11, 52_56, 12_95, 51, 15_25_26, 2_97, 79_86, 3_90, 12_44_16, 5_38, 3_54_31, 2_14, 98, 1_50_44, 2_57_37, 1_36, 71_08, 4_37_01, 23, 7_56, 13_53_55, 7, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 5_81, 6_37_73, 11_94_55, 6, 14_77_97, 8_82_03, 7, 6_45, 70, 21, 32_85, 1_02_69, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]}
     # fmt: on

     self.tokenizer_integration_test_util(
         expected_encoding=_lowercase    ,       model_name='susnato/ernie-m-base_pytorch'    ,       sequences=[
             'Transformers (formerly known as pytorch-transformers and pytorch-pretrained-bert) provides '
             'general-purpose architectures (BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet...) for Natural '
             'Language Understanding (NLU) and Natural Language Generation (NLG) with over32+ pretrained '
             'models in100+ languages and deep interoperability between Jax, PyTorch and TensorFlow.',
             'BERT is designed to pre-train deep bidirectional representations from unlabeled text by jointly '
             'conditioning on both left and right context in all layers.',
             'The quick brown fox jumps over the lazy dog.',
         ]    ,       )








'''simple docstring'''

import importlib
import os
import platform
from pathlib import Path

from packaging import version

from .utils.logging import get_logger


A:   str						=					get_logger(__name__)

# Datasets
A:   Optional[Any]						=					"https://s3.amazonaws.com/datasets.huggingface.co/datasets/datasets"
A:   Any						=					"https://cdn-datasets.huggingface.co/datasets/datasets"
A:   Dict						=					"https://raw.githubusercontent.com/huggingface/datasets/{revision}/datasets/{path}/{name}"

# Metrics
A:   List[str]						=					"https://s3.amazonaws.com/datasets.huggingface.co/datasets/metrics"
A:   Any						=					"https://cdn-datasets.huggingface.co/datasets/metric"
A:   List[str]						=					"https://raw.githubusercontent.com/huggingface/datasets/{revision}/metrics/{path}/{name}"

# Hub
A:   str						=					os.environ.get("HF_ENDPOINT", "https://huggingface.co")
A:   List[Any]						=					HF_ENDPOINT + "/datasets/{repo_id}/resolve/{revision}/{path}"
A:   List[Any]						=					"main"

A:   Any						=					version.parse(platform.python_version())

if PY_VERSION < version.parse("3.8"):
						import importlib_metadata
else:
						import importlib.metadata as importlib_metadata

# General environment variables accepted values for booleans
A:   Optional[Any]						=					{"1", "ON", "YES", "TRUE"}
A:   Optional[int]						=					ENV_VARS_TRUE_VALUES.union({"AUTO"})


# Imports
A:   Any						=					version.parse(importlib_metadata.version("dill"))
A:   str						=					version.parse(importlib_metadata.version("pandas"))
A:   Tuple						=					version.parse(importlib_metadata.version("pyarrow"))

A:   str						=					os.environ.get("USE_TF", "AUTO").upper()
A:   List[Any]						=					os.environ.get("USE_TORCH", "AUTO").upper()
A:   Union[str, Any]						=					os.environ.get("USE_JAX", "AUTO").upper()

A:   Dict						=					"N/A"
A:   Optional[int]						=					False

if USE_TORCH in ENV_VARS_TRUE_AND_AUTO_VALUES and USE_TF not in ENV_VARS_TRUE_VALUES:
						A:   List[str]						=					importlib.util.find_spec("torch") is not None
						if TORCH_AVAILABLE:
												try:
																		A:   List[str]						=					version.parse(importlib_metadata.version("torch"))
																		logger.info(f"""PyTorch version {TORCH_VERSION} available.""")
												except importlib_metadata.PackageNotFoundError:
																		pass
else:
						logger.info("Disabling PyTorch because USE_TF is set")

A:   Union[str, Any]						=					"N/A"
A:   Dict						=					False

if USE_TF in ENV_VARS_TRUE_AND_AUTO_VALUES and USE_TORCH not in ENV_VARS_TRUE_VALUES:
						A:   Optional[Any]						=					importlib.util.find_spec("tensorflow") is not None
						if TF_AVAILABLE:
												# For the metadata, we have to look for both tensorflow and tensorflow-cpu
												for package in [
												    "tensorflow",
												    "tensorflow-cpu",
												    "tensorflow-gpu",
												    "tf-nightly",
												    "tf-nightly-cpu",
												    "tf-nightly-gpu",
												    "intel-tensorflow",
												    "tensorflow-rocm",
												    "tensorflow-macos",
												]:
																		try:
																								A:   Any						=					version.parse(importlib_metadata.version(package))
																		except importlib_metadata.PackageNotFoundError:
																								continue
																		else:
																								break
												else:
																		A:   Any						=					False
						if TF_AVAILABLE:
												if TF_VERSION.major < 2:
																		logger.info(f"""TensorFlow found but with version {TF_VERSION}. `datasets` requires version 2 minimum.""")
																		A:   Tuple						=					False
												else:
																		logger.info(f"""TensorFlow version {TF_VERSION} available.""")
else:
						logger.info("Disabling Tensorflow because USE_TORCH is set")


A:   Any						=					"N/A"
A:   int						=					False

if USE_JAX in ENV_VARS_TRUE_AND_AUTO_VALUES:
						A:   Dict						=					importlib.util.find_spec("jax") is not None and importlib.util.find_spec("jaxlib") is not None
						if JAX_AVAILABLE:
												try:
																		A:   List[str]						=					version.parse(importlib_metadata.version("jax"))
																		logger.info(f"""JAX version {JAX_VERSION} available.""")
												except importlib_metadata.PackageNotFoundError:
																		pass
else:
						logger.info("Disabling JAX because USE_JAX is set to False")


A:   Optional[Any]						=					os.environ.get("USE_BEAM", "AUTO").upper()
A:   Any						=					"N/A"
A:   List[Any]						=					False
if USE_BEAM in ENV_VARS_TRUE_AND_AUTO_VALUES:
						try:
												A:   Tuple						=					version.parse(importlib_metadata.version("apache_beam"))
												A:   Dict						=					True
												logger.info(f"""Apache Beam version {BEAM_VERSION} available.""")
						except importlib_metadata.PackageNotFoundError:
												pass
else:
						logger.info("Disabling Apache Beam because USE_BEAM is set to False")


# Optional tools for data loading
A:   Union[str, Any]						=					importlib.util.find_spec("sqlalchemy") is not None

# Optional tools for feature decoding
A:   Optional[int]						=					importlib.util.find_spec("PIL") is not None
A:   Dict						=					importlib.util.find_spec("soundfile") is not None and version.parse(
    importlib.import_module("soundfile").__libsndfile_version__
) >= version.parse("1.0.31")
A:   Any						=					importlib.util.find_spec("soundfile") is not None and version.parse(
    importlib.import_module("soundfile").__libsndfile_version__
) >= version.parse("1.1.0")

# Optional compression tools
A:   Optional[Any]						=					importlib.util.find_spec("rarfile") is not None
A:   Any						=					importlib.util.find_spec("zstandard") is not None
A:   Union[str, Any]						=					importlib.util.find_spec("lz4") is not None
A:   str						=					importlib.util.find_spec("py7zr") is not None


# Cache location
A:   Any						=					"~/.cache"
A:   Tuple						=					os.getenv("XDG_CACHE_HOME", DEFAULT_XDG_CACHE_HOME)
A:   Dict						=					os.path.join(XDG_CACHE_HOME, "huggingface")
A:   List[str]						=					os.path.expanduser(os.getenv("HF_HOME", DEFAULT_HF_CACHE_HOME))

A:   int						=					os.path.join(HF_CACHE_HOME, "datasets")
A:   int						=					Path(os.getenv("HF_DATASETS_CACHE", DEFAULT_HF_DATASETS_CACHE))

A:   int						=					os.path.join(HF_CACHE_HOME, "metrics")
A:   int						=					Path(os.getenv("HF_METRICS_CACHE", DEFAULT_HF_METRICS_CACHE))

A:   Any						=					os.path.join(HF_CACHE_HOME, "modules")
A:   Tuple						=					Path(os.getenv("HF_MODULES_CACHE", DEFAULT_HF_MODULES_CACHE))

A:   List[str]						=					"downloads"
A:   Tuple						=					os.path.join(HF_DATASETS_CACHE, DOWNLOADED_DATASETS_DIR)
A:   Union[str, Any]						=					Path(os.getenv("HF_DATASETS_DOWNLOADED_DATASETS_PATH", DEFAULT_DOWNLOADED_DATASETS_PATH))

A:   Tuple						=					"extracted"
A:   Optional[int]						=					os.path.join(DEFAULT_DOWNLOADED_DATASETS_PATH, EXTRACTED_DATASETS_DIR)
A:   Optional[int]						=					Path(os.getenv("HF_DATASETS_EXTRACTED_DATASETS_PATH", DEFAULT_EXTRACTED_DATASETS_PATH))

# Download count for the website
A:   Union[str, Any]						=					(
    os.environ.get("HF_UPDATE_DOWNLOAD_COUNTS", "AUTO").upper() in ENV_VARS_TRUE_AND_AUTO_VALUES
)

# Batch size constants. For more info, see:
# https://github.com/apache/arrow/blob/master/docs/source/cpp/arrays.rst#size-limitations-and-recommendations)
A:   List[str]						=					1_0_0_0

# Size of the preloaded record batch in `Dataset.__iter__`
A:   Tuple						=					1_0

# Pickling tables works only for small tables (<4GiB)
# For big tables, we write them on disk instead
A:   List[Any]						=					4 << 3_0

# Max shard size in bytes (e.g. to shard parquet datasets in push_to_hub or download_and_prepare)
A:   List[str]						=					"500MB"

# Parquet configuration
A:   Union[str, Any]						=					1_0_0
A:   Optional[int]						=					1_0_0
A:   Any						=					1_0_0

# Offline mode
A:   List[str]						=					os.environ.get("HF_DATASETS_OFFLINE", "AUTO").upper() in ENV_VARS_TRUE_VALUES

# In-memory
A:   Any						=					0  # Disabled
A:   List[str]						=					float(os.environ.get("HF_DATASETS_IN_MEMORY_MAX_SIZE", DEFAULT_IN_MEMORY_MAX_SIZE))

# File names
A:   List[str]						=					"dataset.arrow"
A:   Optional[int]						=					"indices.arrow"
A:   List[str]						=					"state.json"
A:   Tuple						=					"dataset_info.json"
A:   Tuple						=					"dataset_infos.json"
A:   Dict						=					"LICENSE"
A:   Optional[Any]						=					"metric_info.json"
A:   Any						=					"dataset_dict.json"

A:   Dict						=					"datasets_modules"

A:   List[str]						=					2_5_5

# Streaming
A:   Any						=					2_0
A:   Dict						=					5

# Datasets without script
A:   Union[str, Any]						=					2_0_0
A:   Union[str, Any]						=					1_0
A:   List[Any]						=					2_0_0

# Progress bars
A:   Tuple						=					0.05  # 20 progress updates per sec
