
"""simple docstring"""

import os

import pytest
import yaml

from datasets.features.features import Features, Value
from datasets.info import DatasetInfo, DatasetInfosDict






@pytest.mark.parametrize(
    'files'    , [
        ['full:README.md', 'dataset_infos.json'],
        ['empty:README.md', 'dataset_infos.json'],
        ['dataset_infos.json'],
        ['full:README.md'],
    ]    , )
def 							A						(    snake_case				:str    , snake_case				:Optional[int]		)				->     Optional[int]:
 __UpperCamelCase      =	tmp_path_factory.mktemp('dset_infos_dir'		)
 if "full:README.md" in files:
  with open(dataset_infos_dir / 'README.md'    , 'w'		) as f:
   f.write('---\ndataset_info:\n  dataset_size: 42\n---'		)
 if "empty:README.md" in files:
  with open(dataset_infos_dir / 'README.md'    , 'w'		) as f:
   f.write(''		)
    # we want to support dataset_infos.json for backward compatibility
 if "dataset_infos.json" in files:
  with open(dataset_infos_dir / 'dataset_infos.json'    , 'w'		) as f:
   f.write('{"default": {"dataset_size": 42}}'		)
 __UpperCamelCase      =	DatasetInfosDict.from_directory(snake_case		)
 assert dataset_infos
 assert dataset_infos["default"].dataset_size == 4_2






@pytest.mark.parametrize(
    'dataset_info'    , [
        DatasetInfo(),
        DatasetInfo(
            description='foo'    , features=Features({'a': Value('int32'		)}		)    , builder_name='builder'    , config_name='config'    , version='1.0.0'    , splits=[{'name': 'train'}]    , download_size=4_2    , ),
    ]    , )
def 							A						(    snake_case				:List[Any]    , snake_case				:DatasetInfo		)				->     Union[str, Any]:
 __UpperCamelCase      =	str(snake_case		)
 dataset_info.write_to_directory(snake_case		)
 __UpperCamelCase      =	DatasetInfo.from_directory(snake_case		)
 assert dataset_info == reloaded
 assert os.path.exists(os.path.join(snake_case    , 'dataset_info.json'		)		)






def 							A						(    )				->     Union[str, Any]:
 __UpperCamelCase      =	DatasetInfo(
     description='foo'    , citation='bar'    , homepage='https://foo.bar'    , license='CC0'    , features=Features({'a': Value('int32'		)}		)    , post_processed={}    , supervised_keys=()    , task_templates=[]    , builder_name='builder'    , config_name='config'    , version='1.0.0'    , splits=[{'name': 'train', 'num_examples': 4_2}]    , download_checksums={}    , download_size=1_3_3_7    , post_processing_size=4_4_2    , dataset_size=1_2_3_4    , size_in_bytes=1_3_3_7 + 4_4_2 + 1_2_3_4    , )
 __UpperCamelCase      =	dataset_info._to_yaml_dict()
 assert sorted(snake_case		) == sorted(DatasetInfo._INCLUDED_INFO_IN_YAML		)
 for key in DatasetInfo._INCLUDED_INFO_IN_YAML:
  assert key in dataset_info_yaml_dict
  assert isinstance(dataset_info_yaml_dict[key]    , (list, dict, int, str)		)
 __UpperCamelCase      =	yaml.safe_dump(snake_case		)
 __UpperCamelCase      =	yaml.safe_load(snake_case		)
 assert dataset_info_yaml_dict == reloaded






def 							A						(    )				->     List[str]:
 __UpperCamelCase      =	DatasetInfo()
 __UpperCamelCase      =	dataset_info._to_yaml_dict()
 assert dataset_info_yaml_dict == {}






@pytest.mark.parametrize(
    'dataset_infos_dict'    , [
        DatasetInfosDict(),
        DatasetInfosDict({'default': DatasetInfo()}		),
        DatasetInfosDict({'my_config_name': DatasetInfo()}		),
        DatasetInfosDict(
            {
                'default': DatasetInfo(
                    description='foo'    , features=Features({'a': Value('int32'		)}		)    , builder_name='builder'    , config_name='config'    , version='1.0.0'    , splits=[{'name': 'train'}]    , download_size=4_2    , )
            }		),
        DatasetInfosDict(
            {
                'v1': DatasetInfo(dataset_size=4_2		),
                'v2': DatasetInfo(dataset_size=1_3_3_7		),
            }		),
    ]    , )
def 							A						(    snake_case				:Optional[Any]    , snake_case				:DatasetInfosDict		)				->     List[str]:
 __UpperCamelCase      =	str(snake_case		)
 dataset_infos_dict.write_to_directory(snake_case		)
 __UpperCamelCase      =	DatasetInfosDict.from_directory(snake_case		)

 # the config_name of the dataset_infos_dict take over the attribute
 for config_name, dataset_info in dataset_infos_dict.items():
  __UpperCamelCase      =	config_name
  # the yaml representation doesn't include fields like description or citation
  # so we just test that we can recover what we can from the yaml
  __UpperCamelCase      =	DatasetInfo._from_yaml_dict(dataset_info._to_yaml_dict()		)
 assert dataset_infos_dict == reloaded

 if dataset_infos_dict:
  assert os.path.exists(os.path.join(snake_case    , 'README.md'		)		)





"""simple docstring"""

def 							A						(    snake_case				:int		)				->     int:
 __UpperCamelCase      =	abs(snake_case		)
 __UpperCamelCase      =	0
 while n > 0:
  res += n % 1_0
  n //= 1_0
 return res






def 							A						(    snake_case				:int		)				->     int:
 __UpperCamelCase      =	abs(snake_case		)
 return n if n < 1_0 else n % 1_0 + sum_of_digits(n // 1_0		)






def 							A						(    snake_case				:int		)				->     int:
 return sum(int(snake_case		) for c in str(abs(snake_case		)		)		)






def 							A						(    )				->     None:
 from collections.abc import Callable
 from timeit import timeit

 def benchmark_a_function(snake_case				:Callable    , snake_case				:int		) -> None:
  __UpperCamelCase      =	f'{func.__name__}({value})'
  __UpperCamelCase      =	timeit(f'__main__.{call}'    , setup='import __main__'		)
  print(f'{call:56} = {func(snake_case		)} -- {timing:.4f} seconds'		)

 for value in (2_6_2_1_4_4, 1_1_2_5_8_9_9_9_0_6_8_4_2_6_2_4, 1_2_6_7_6_5_0_6_0_0_2_2_8_2_2_9_4_0_1_4_9_6_7_0_3_2_0_5_3_7_6):
  for func in (sum_of_digits, sum_of_digits_recursion, sum_of_digits_compact):
   benchmark_a_function(snake_case    , snake_case		)
  print()


if __name__ == "__main__":
      import doctest

      doctest.testmod()
      benchmark()



