

"""simple docstring"""





import logging
from pathlib import Path
from typing import Any, List, Tuple

import yaml


# loading package files: https://stackoverflow.com/a/20885799
try:
   import importlib.resources as pkg_resources
except ImportError:
   # Try backported to PY<37 `importlib_resources`.
   import importlib_resources as pkg_resources

from . import resources


_a					 =				'https://github.com/huggingface/datasets/tree/main/src/datasets/utils'
_a					 =				F"{BASE_REF_URL}/{__file__}"
_a					 =				logging.getLogger(__name__)




def     _A    (    UpperCamelCase_	:			str)      ->		Tuple[Any, str]:
   '''simple docstring'''


   __lowercase								=		pkg_resources.read_text(UpperCamelCase_,     UpperCamelCase_)
   return yaml.safe_load(UpperCamelCase_), F"""{BASE_REF_URL}/resources/{resource}"""


_a ,		_a					 =				load_yaml_resource('readme_structure.yaml')

_a					 =				[
    '[Needs More Information]',
    '[More Information Needed]',
    '(https://github.com/huggingface/datasets/blob/main/CONTRIBUTING.md#how-to-contribute-to-the-dataset-cards)',
]

# Dictionary representation of section/readme, error_list, warning_list
_a					 =				Tuple[dict, List[str], List[str]]




class    _lowerCAmelCase    :







 """simple docstring"""







 def __init__(     self				:     Union[str, Any],   UpperCAmelCase__				:     str,   UpperCAmelCase__				:     str,   UpperCAmelCase__				:     List[str] = None,   UpperCAmelCase__				:     bool = False      ):
    __lowercase								=		name
    __lowercase								=		level
    __lowercase								=		lines
    __lowercase								=		""
    __lowercase								=		True
    __lowercase								=		{}
    __lowercase								=		[]
    __lowercase								=		[]
    if self.lines is not None:
       self.parse(suppress_parsing_errors=UpperCAmelCase__      )


 def    _lowercase					(     self				:     int,   UpperCAmelCase__				:     bool = False      ):
    __lowercase								=		""
    __lowercase								=		[]
    __lowercase								=		False
    for line in self.lines:
       if line.strip(" \n"      ) == "":
          continue
       elif line.strip(" \n"      )[:3] == "```":
          __lowercase								=		not code_start
       elif line.split()[0] == self.level + "#" and not code_start:
          if current_sub_level != "":
             __lowercase								=		Section(UpperCAmelCase__,   self.level + "#",   UpperCAmelCase__      )
             __lowercase								=		[]
          else:
             if current_lines != []:
                self.text += "".join(UpperCAmelCase__      ).strip()
                if self.text != "" and self.text not in FILLER_TEXT:
                   __lowercase								=		False
                __lowercase								=		[]

          __lowercase								=		" ".join(line.split()[1:]      ).strip(" \n"      )
       else:
          current_lines.append(UpperCAmelCase__      )
    else:
       if current_sub_level != "":
          if current_sub_level in self.content:
             self.parsing_error_list.append(
                 F"""Multiple sections with the same heading `{current_sub_level}` have been found. Please keep only one of these sections."""      )
          __lowercase								=		Section(UpperCAmelCase__,   self.level + "#",   UpperCAmelCase__      )
       else:
          if current_lines != []:
             self.text += "".join(UpperCAmelCase__      ).strip()
             if self.text != "" and self.text not in FILLER_TEXT:
                __lowercase								=		False

    if self.level == "" and not suppress_parsing_errors:
       if self.parsing_error_list != [] or self.parsing_warning_list != []:
          __lowercase								=		__lowercase								=		"\n".join("-\t" + x for x in self.parsing_error_list + self.parsing_warning_list      )
          __lowercase								=		F"""The following issues were found while parsing the README at `{self.name}`:\n""" + errors
          raise ValueError(UpperCAmelCase__      )


 def    _lowercase					(     self				:     Tuple,   UpperCAmelCase__				:     dict      ):
    __lowercase								=		[]
    __lowercase								=		[]
    if structure["allow_empty"] is False:
       # If content is expected
       if self.is_empty_text and self.content == {}:
          # If no content is found, mention it in the error_list
          error_list.append(F"""Expected some content in section `{self.name}` but it is empty."""      )

    if structure["allow_empty_text"] is False:
       # If some text is expected
       if self.is_empty_text:
          # If no text is found, mention it in the error_list
          error_list.append(
              F"""Expected some text in section `{self.name}` but it is empty (text in subsections are ignored)."""      )
        # Subsections Validation
    if structure["subsections"] is not None:
       # If subsections are expected
       if self.content == {}:
          # If no subsections are present
          __lowercase								=		[subsection["name"] for subsection in structure["subsections"]]
          # Mention the expected values in the error_list
          error_list.append(
              F"""Section `{self.name}` expected the following subsections: {", ".join(["`"+x+"`" for x in values]      )}. Found 'None'."""      )
       else:
          # If some subsections are present
          __lowercase								=		[subsection["name"] for subsection in structure["subsections"]]
          __lowercase								=		False
          for idx, name in enumerate(UpperCAmelCase__      ):
             if name not in self.content:
                # If the expected subsection is not present
                error_list.append(F"""Section `{self.name}` is missing subsection: `{name}`."""      )
                __lowercase								=		True
             else:
                # If the subsection is present, validate subsection, return the result
                # and concat the errors from subsection to section error_list

                # Skip sublevel validation if current level is `###`
                if self.level == "###":
                   continue
                else:
                   __lowercase						,__lowercase						,__lowercase								=		self.content[name].validate(
                       structure["subsections"][idx]      )
                error_list += subsec_error_list
                warning_list += subsec_warning_list

          if has_missing_subsections:  # we only allow to have extra subsections if all the other ones are here
             for name in self.content:
                if name not in structure_names:
                   # If an extra subsection is present
                   warning_list.append(
                       F"""`{self.name}` has an extra subsection: `{name}`. Skipping further validation checks for this subsection as expected structure is unknown."""      )
    if error_list:
       # If there are errors, do not return the dictionary as it is invalid
       return {}, error_list, warning_list
    else:
       return self.to_dict(), error_list, warning_list



 def    _lowercase					(     self				:     Optional[int]      ):
    return {
        "name": self.name,
        "text": self.text,
        "is_empty_text": self.is_empty_text,
        "subsections": [value.to_dict() for value in self.content.values()],
    }







class    _lowerCAmelCase    (      lowercase  ):  # Level 0







 """simple docstring"""







 def __init__(     self				:     str,   UpperCAmelCase__				:     str,   UpperCAmelCase__				:     List[str],   UpperCAmelCase__				:     dict = None,   UpperCAmelCase__				:     bool = False      ):
    super().__init__(name=UpperCAmelCase__,   level=""      )  # Not using lines here as we need to use a child class parse
    __lowercase								=		structure
    __lowercase								=		-2
    __lowercase								=		0
    __lowercase								=		lines
    if self.lines is not None:
       self.parse(suppress_parsing_errors=UpperCAmelCase__      )


 def    _lowercase					(     self				:     Any      ):
    if self.structure is None:
       __lowercase						,__lowercase						,__lowercase								=		self._validate(UpperCAmelCase__      )
    else:
       __lowercase						,__lowercase						,__lowercase								=		self._validate(self.structure      )
    if error_list != [] or warning_list != []:
       __lowercase								=		"\n".join(["-\t" + x for x in error_list + warning_list]      )
       __lowercase								=		F"""The following issues were found for the README at `{self.name}`:\n""" + errors
       raise ValueError(UpperCAmelCase__      )


 @classmethod
 def    _lowercase					(     cls				:     int,   UpperCAmelCase__				:     Path,   UpperCAmelCase__				:     dict = None,   UpperCAmelCase__				:     bool = False      ):
    with open(UpperCAmelCase__,   encoding="utf-8"      ) as f:
       __lowercase								=		f.readlines()
    return cls(UpperCAmelCase__,   UpperCAmelCase__,   UpperCAmelCase__,   suppress_parsing_errors=UpperCAmelCase__      )


 @classmethod
 def    _lowercase					(     cls				:     List[Any],   UpperCAmelCase__				:     str,   UpperCAmelCase__				:     dict = None,   UpperCAmelCase__				:     str = "root",   UpperCAmelCase__				:     bool = False      ):
    __lowercase								=		string.split("\n"      )
    return cls(UpperCAmelCase__,   UpperCAmelCase__,   UpperCAmelCase__,   suppress_parsing_errors=UpperCAmelCase__      )


 def    _lowercase					(     self				:     Union[str, Any],   UpperCAmelCase__				:     bool = False      ):
    # Skip Tags
    __lowercase								=		0

    for line in self.lines:
       self.yaml_tags_line_count += 1
       if line.strip(" \n"      ) == "---":
          self.tag_count += 1
          if self.tag_count == 2:
             break
       line_count += 1
    if self.tag_count == 2:
       __lowercase								=		self.lines[line_count + 1 :]  # Get the last + 1 th item.
    else:
       __lowercase								=		self.lines[self.tag_count :]
    super().parse(suppress_parsing_errors=UpperCAmelCase__      )


 def __str__(     self				:     Union[str, Any]      ):
    return str(self.to_dict()      )



 def    _lowercase					(     self				:     str,   UpperCAmelCase__				:     Optional[int]      ):
    __lowercase								=		[]
    __lowercase								=		[]
    if self.yaml_tags_line_count == 0:
       warning_list.append("Empty YAML markers are present in the README."      )
    elif self.tag_count == 0:
       warning_list.append("No YAML markers are present in the README."      )
    elif self.tag_count == 1:
       warning_list.append("Only the start of YAML tags present in the README."      )
    # Check how many first level sections are present.
    __lowercase								=		len(self.content.keys()      )
    if num_first_level_keys > 1:
       # If more than one, add to the error list, continue
       error_list.append(
           F"""The README has several first-level headings: {", ".join(["`"+x+"`" for x in list(self.content.keys()      )]      )}. Only one heading is expected. Skipping further validation for this README."""      )
    elif num_first_level_keys < 1:
       # If less than one, append error.
       error_list.append(
           "The README has no first-level headings. One heading is expected. Skipping further validation for this README."      )

    else:
       # If one exactly
       __lowercase								=		list(self.content.keys()      )[0]  # Get the key
       if start_key.startswith("Dataset Card for"      ):  # Check correct start
          # If the starting is correct, validate all the sections
          __lowercase						,__lowercase						,__lowercase								=		self.content[start_key].validate(
              readme_structure["subsections"][0]      )
          error_list += sec_error_list
          warning_list += sec_warning_list
       else:
          # If not found, append error
          error_list.append(
              "No first-level heading starting with `Dataset Card for` found in README. Skipping further validation for this README."      )
    if error_list:
       # If there are errors, do not return the dictionary as it is invalid
       return {}, error_list, warning_list
    else:
       return self.to_dict(), error_list, warning_list


if __name__ == "__main__":
   from argparse import ArgumentParser

   _a					 =				ArgumentParser(usage='Validate the content (excluding YAML tags) of a README.md file.')
   ap.add_argument('readme_filepath')
   _a					 =				ap.parse_args()
   _a					 =				Path(args.readme_filepath)
   _a					 =				ReadMe.from_readme(readme_filepath)







"""simple docstring"""





import tempfile
import unittest

from diffusers import (
    DDIMScheduler,
    DDPMScheduler,
    DPMSolverMultistepScheduler,
    EulerAncestralDiscreteScheduler,
    EulerDiscreteScheduler,
    PNDMScheduler,
    logging,
)
from diffusers.configuration_utils import ConfigMixin, register_to_config
from diffusers.utils.testing_utils import CaptureLogger




class    _lowerCAmelCase    (      lowercase  ):







 """simple docstring"""







 __UpperCAmelCase      :   Tuple  						=      "config.json"


 @register_to_config
 def __init__(     self				:     List[str],   UpperCAmelCase__				:     Dict=2,   UpperCAmelCase__				:     str=5,   UpperCAmelCase__				:     List[Any]=(2, 5),   UpperCAmelCase__				:     Dict="for diffusion",   UpperCAmelCase__				:     Optional[int]=[1, 3],   ):
    pass







class    _lowerCAmelCase    (      lowercase  ):







 """simple docstring"""







 __UpperCAmelCase      :   List[str]  						=      "config.json"


 @register_to_config
 def __init__(     self				:     Optional[int],   UpperCAmelCase__				:     List[str]=2,   UpperCAmelCase__				:     List[str]=5,   UpperCAmelCase__				:     List[Any]=(2, 5),   UpperCAmelCase__				:     str="for diffusion",   UpperCAmelCase__				:     str=[1, 3],   ):
    pass







class    _lowerCAmelCase    (      lowercase  ):







 """simple docstring"""







 __UpperCAmelCase      :   str  						=      "config.json"


 @register_to_config
 def __init__(     self				:     Union[str, Any],   UpperCAmelCase__				:     Union[str, Any]=2,   UpperCAmelCase__				:     str=5,   UpperCAmelCase__				:     Optional[int]=(2, 5),   UpperCAmelCase__				:     str="for diffusion",   UpperCAmelCase__				:     str=[1, 3],   UpperCAmelCase__				:     Dict=[1, 3],   ):
    pass







class    _lowerCAmelCase    (      lowercase  ):







 """simple docstring"""







 __UpperCAmelCase      :   List[str]  						=      "config.json"


 @register_to_config
 def __init__(     self				:     Union[str, Any],   UpperCAmelCase__				:     Any=2,   UpperCAmelCase__				:     Union[str, Any]=5,   UpperCAmelCase__				:     Optional[Any]=(2, 5),   UpperCAmelCase__				:     List[str]="for diffusion",   UpperCAmelCase__				:     Optional[Any]=[1, 5],   UpperCAmelCase__				:     Dict=[5, 4],   ):
    pass







class    _lowerCAmelCase    (      unittest.TestCase  ):







 """simple docstring"""







 def    _lowercase					(     self				:     Optional[int]      ):
    with self.assertRaises(UpperCAmelCase__      ):
       ConfigMixin.load_config("dummy_path"      )


 def    _lowercase					(     self				:     Optional[int]      ):
    __lowercase								=		SampleObject()
    __lowercase								=		obj.config
    assert config["a"] == 2
    assert config["b"] == 5
    assert config["c"] == (2, 5)
    assert config["d"] == "for diffusion"
    assert config["e"] == [1, 3]

    # init ignore private arguments
    __lowercase								=		SampleObject(_name_or_path="lalala"      )
    __lowercase								=		obj.config
    assert config["a"] == 2
    assert config["b"] == 5
    assert config["c"] == (2, 5)
    assert config["d"] == "for diffusion"
    assert config["e"] == [1, 3]

    # can override default
    __lowercase								=		SampleObject(c=6      )
    __lowercase								=		obj.config
    assert config["a"] == 2
    assert config["b"] == 5
    assert config["c"] == 6
    assert config["d"] == "for diffusion"
    assert config["e"] == [1, 3]

    # can use positional arguments.
    __lowercase								=		SampleObject(1,   c=6      )
    __lowercase								=		obj.config
    assert config["a"] == 1
    assert config["b"] == 5
    assert config["c"] == 6
    assert config["d"] == "for diffusion"
    assert config["e"] == [1, 3]


 def    _lowercase					(     self				:     Tuple      ):
    __lowercase								=		SampleObject()
    __lowercase								=		obj.config

    assert config["a"] == 2
    assert config["b"] == 5
    assert config["c"] == (2, 5)
    assert config["d"] == "for diffusion"
    assert config["e"] == [1, 3]

    with tempfile.TemporaryDirectory() as tmpdirname:
       obj.save_config(UpperCAmelCase__      )
       __lowercase								=		SampleObject.from_config(SampleObject.load_config(UpperCAmelCase__      )      )
       __lowercase								=		new_obj.config

    # unfreeze configs
    __lowercase								=		dict(UpperCAmelCase__      )
    __lowercase								=		dict(UpperCAmelCase__      )

    assert config.pop("c"      ) == (2, 5)  # instantiated as tuple
    assert new_config.pop("c"      ) == [2, 5]  # saved & loaded as list because of json
    config.pop("_use_default_values"      )
    assert config == new_config


 def    _lowercase					(     self				:     Any      ):
    __lowercase								=		logging.get_logger("diffusers.configuration_utils"      )
    # 30 for warning
    logger.setLevel(3_0      )

    with CaptureLogger(UpperCAmelCase__      ) as cap_logger:
       __lowercase								=		DDIMScheduler.from_pretrained(
           "hf-internal-testing/tiny-stable-diffusion-torch",   subfolder="scheduler"      )

    assert ddim.__class__ == DDIMScheduler
    # no warning should be thrown
    assert cap_logger.out == ""


 def    _lowercase					(     self				:     int      ):
    __lowercase								=		logging.get_logger("diffusers.configuration_utils"      )
    # 30 for warning
    logger.setLevel(3_0      )

    with CaptureLogger(UpperCAmelCase__      ) as cap_logger:
       __lowercase								=		EulerDiscreteScheduler.from_pretrained(
           "hf-internal-testing/tiny-stable-diffusion-torch",   subfolder="scheduler"      )

    assert euler.__class__ == EulerDiscreteScheduler
    # no warning should be thrown
    assert cap_logger.out == ""


 def    _lowercase					(     self				:     Optional[Any]      ):
    __lowercase								=		logging.get_logger("diffusers.configuration_utils"      )
    # 30 for warning
    logger.setLevel(3_0      )

    with CaptureLogger(UpperCAmelCase__      ) as cap_logger:
       __lowercase								=		EulerAncestralDiscreteScheduler.from_pretrained(
           "hf-internal-testing/tiny-stable-diffusion-torch",   subfolder="scheduler"      )

    assert euler.__class__ == EulerAncestralDiscreteScheduler
    # no warning should be thrown
    assert cap_logger.out == ""


 def    _lowercase					(     self				:     str      ):
    __lowercase								=		logging.get_logger("diffusers.configuration_utils"      )
    # 30 for warning
    logger.setLevel(3_0      )

    with CaptureLogger(UpperCAmelCase__      ) as cap_logger:
       __lowercase								=		PNDMScheduler.from_pretrained(
           "hf-internal-testing/tiny-stable-diffusion-torch",   subfolder="scheduler"      )

    assert pndm.__class__ == PNDMScheduler
    # no warning should be thrown
    assert cap_logger.out == ""


 def    _lowercase					(     self				:     Optional[Any]      ):
    __lowercase								=		logging.get_logger("diffusers.configuration_utils"      )
    # 30 for warning
    logger.setLevel(3_0      )

    with CaptureLogger(UpperCAmelCase__      ) as cap_logger:
       __lowercase								=		DDPMScheduler.from_pretrained(
           "hf-internal-testing/tiny-stable-diffusion-torch",   subfolder="scheduler",   prediction_type="sample",   beta_end=8,   )

    with CaptureLogger(UpperCAmelCase__      ) as cap_logger_a:
       __lowercase								=		DDPMScheduler.from_pretrained("google/ddpm-celebahq-256",   beta_start=8_8      )

    assert ddpm.__class__ == DDPMScheduler
    assert ddpm.config.prediction_type == "sample"
    assert ddpm.config.beta_end == 8
    assert ddpm_a.config.beta_start == 8_8

    # no warning should be thrown
    assert cap_logger.out == ""
    assert cap_logger_a.out == ""


 def    _lowercase					(     self				:     List[Any]      ):
    __lowercase								=		logging.get_logger("diffusers.configuration_utils"      )
    # 30 for warning
    logger.setLevel(3_0      )

    with CaptureLogger(UpperCAmelCase__      ) as cap_logger:
       __lowercase								=		DPMSolverMultistepScheduler.from_pretrained(
           "hf-internal-testing/tiny-stable-diffusion-torch",   subfolder="scheduler"      )

    assert dpm.__class__ == DPMSolverMultistepScheduler
    # no warning should be thrown
    assert cap_logger.out == ""



 def    _lowercase					(     self				:     str      ):
    # let's first save a config that should be in the form
    #    a=2,
    #    b=5,
    #    c=(2, 5),
    #    d="for diffusion",
    #    e=[1, 3],

    __lowercase								=		SampleObject()

    __lowercase								=		{k: v for k, v in config.config.items() if not k.startswith("_"      )}

    # make sure that default config has all keys in `_use_default_values`
    assert set(config_dict.keys()      ) == set(config.config._use_default_values      )

    with tempfile.TemporaryDirectory() as tmpdirname:
       config.save_config(UpperCAmelCase__      )

       # now loading it with SampleObject2 should put f into `_use_default_values`
       __lowercase								=		SampleObjecta.from_config(UpperCAmelCase__      )

       assert "f" in config._use_default_values
       assert config.f == [1, 3]

    # now loading the config, should **NOT** use [1, 3] for `f`, but the default [1, 4] value
    # **BECAUSE** it is part of `config._use_default_values`
    __lowercase								=		SampleObjecta.from_config(config.config      )
    assert new_config.f == [5, 4]

    config.config._use_default_values.pop()
    __lowercase								=		SampleObjecta.from_config(config.config      )
    assert new_config_a.f == [1, 3]

    # Nevertheless "e" should still be correctly loaded to [1, 3] from SampleObject2 instead of defaulting to [1, 5]
    assert new_config_a.e == [1, 3]




