






"""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


_UpperCamelCase							:       Any       					=		'https://github.com/huggingface/datasets/tree/main/src/datasets/utils'
_UpperCamelCase							:       Any       					=		f'''{BASE_REF_URL}/{__file__}'''
_UpperCamelCase							:       List[Any]       					=		logging.getLogger(__name__)




def      snake_case    (A_ :str ):







  '''simple docstring'''

  a	:     Union[str, Any]							=  pkg_resources.read_text(A_      ,     A_ )
  return yaml.safe_load(A_ ), f'''{BASE_REF_URL}/resources/{resource}'''


_UpperCamelCase					,	_UpperCamelCase							:       Optional[Any]       					=		load_yaml_resource('readme_structure.yaml')

_UpperCamelCase							:       Dict       					=		[
    '[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
_UpperCamelCase							:       Union[str, Any]       					=		Tuple[dict, List[str], List[str]]






class 		snake_case    :





    def __init__(				self      :   int							,						A      :   str							,						A      :   str							,						A      :   List[str] = None							,						A      :   bool = False     ):


      '''simple docstring'''




      a	:     Optional[int]							=  name
      a	:     List[Any]							=  level
      a	:     List[Any]							=  lines
      a	:     Dict							=  ''
      a	:     str							=  True
      a	:     Any							=  {}
      a	:     List[str]							=  []
      a	:     Tuple							=  []
      if self.lines is not None:
        self.parse(suppress_parsing_errors=A     )





    def 							lowerCamelCase__ (				self      :   Any							,						A      :   bool = False     ):


      '''simple docstring'''




      a	:     Optional[Any]							=  ''
      a	:     Tuple							=  []
      a	:     Any							=  False
      for line in self.lines:
        if line.strip(' \n'     ) == "":
          continue
        elif line.strip(' \n'     )[:3] == "```":
          a	:     Optional[Any]							=  not code_start
        elif line.split()[0] == self.level + "#" and not code_start:
          if current_sub_level != "":
            a	:     List[Any]							=  Section(A							,						self.level + '#'							,						A     )
            a	:     Optional[int]							=  []
          else:
            if current_lines != []:
              self.text += "".join(A     ).strip()
              if self.text != "" and self.text not in FILLER_TEXT:
                a	:     int							=  False
              a	:     Tuple							=  []

          a	:     Optional[int]							=  ' '.join(line.split()[1:]     ).strip(' \n'     )
        else:
          current_lines.append(A     )
      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.'''     )
          a	:     Any							=  Section(A							,						self.level + '#'							,						A     )
        else:
          if current_lines != []:
            self.text += "".join(A     ).strip()
            if self.text != "" and self.text not in FILLER_TEXT:
              a	:     Tuple							=  False

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





    def 							lowerCamelCase__ (				self      :   Tuple							,						A      :   dict     ):


      '''simple docstring'''




      a	:     int							=  []
      a	:     Union[str, Any]							=  []
      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
          a	:     List[str]							=  [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
          a	:     List[Any]							=  [subsection['name'] for subsection in structure['subsections']]
          a	:     Dict							=  False
          for idx, name in enumerate(A     ):
            if name not in self.content:
              # If the expected subsection is not present
              error_list.append(F'''Section `{self.name}` is missing subsection: `{name}`.'''     )
              a	:     Optional[int]							=  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:
                a,	a,	a	:     List[Any]							=  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 							lowerCamelCase__ (				self      :   List[Any]     ):


      '''simple docstring'''




      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 		snake_case    (    UpperCAmelCase			):  # Level 0





    def __init__(				self      :   Dict							,						A      :   str							,						A      :   List[str]							,						A      :   dict = None							,						A      :   bool = False     ):


      '''simple docstring'''




      super().__init__(name=A							,						level=''     )  # Not using lines here as we need to use a child class parse
      a	:     List[Any]							=  structure
      a	:     List[Any]							=  -2
      a	:     Tuple							=  0
      a	:     Any							=  lines
      if self.lines is not None:
        self.parse(suppress_parsing_errors=A     )





    def 							lowerCamelCase__ (				self      :   Tuple     ):


      '''simple docstring'''




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





    @classmethod
    def 							lowerCamelCase__ (				cls      :   Any							,						A      :   Path							,						A      :   dict = None							,						A      :   bool = False     ):


      '''simple docstring'''




      with open(A							,						encoding='utf-8'     ) as f:
        a	:     Union[str, Any]							=  f.readlines()
      return cls(A							,						A							,						A							,						suppress_parsing_errors=A     )





    @classmethod
    def 							lowerCamelCase__ (				cls      :   Union[str, Any]							,						A      :   str							,						A      :   dict = None							,						A      :   str = "root"							,						A      :   bool = False     ):


      '''simple docstring'''




      a	:     int							=  string.split('\n'     )
      return cls(A							,						A							,						A							,						suppress_parsing_errors=A     )





    def 							lowerCamelCase__ (				self      :   Optional[int]							,						A      :   bool = False     ):


      '''simple docstring'''




      a	:     Union[str, Any]							=  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:
        a	:     Any							=  self.lines[line_count + 1 :]  # Get the last + 1 th item.
      else:
        a	:     Optional[Any]							=  self.lines[self.tag_count :]
      super().parse(suppress_parsing_errors=A     )





    def __str__(				self      :   Tuple     ):


      '''simple docstring'''




      return str(self.to_dict()     )





    def 							lowerCamelCase__ (				self      :   Dict							,						A      :   Tuple     ):


      '''simple docstring'''




      a	:     Optional[Any]							=  []
      a	:     int							=  []
      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.
      a	:     Optional[Any]							=  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
        a	:     str							=  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
          a,	a,	a	:     Tuple							=  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

   _UpperCamelCase							:       str       					=		ArgumentParser(usage='Validate the content (excluding YAML tags) of a README.md file.')
   ap.add_argument('readme_filepath')
   _UpperCamelCase							:       str       					=		ap.parse_args()
   _UpperCamelCase							:       Dict       					=		Path(args.readme_filepath)
   _UpperCamelCase							:       List[str]       					=		ReadMe.from_readme(readme_filepath)












"""simple docstring"""


from __future__ import annotations




def      snake_case    (A_ :int ):







  '''simple docstring'''

  assert (
      isinstance(A_      ,     A_ ) and mask > 0
  ), f'''mask needs to be positive integer, your input {mask}'''
  a	:     Any							=  []
  a	:     Union[str, Any]							=  mask

  while submask:
    all_submasks.append(A_ )
    a	:     Any							=  (submask - 1) & mask

  return all_submasks


if __name__ == "__main__":
   import doctest

   doctest.testmod()




