class_docstr: Fill-in metadata and options that can be automatically derived
  (from other metadata/options, the file system or conventions)
class_docstr_tok: ["Fill-in","metadata","and","options","that","can","be","automatically","derived","(","from","other","metadata\/options",",","the","file","system","or","conventions",")"]
docstr: Try to find all packages and modules under the project root.
  
  Since the ``flat-layout`` is more dangerous in terms of accidentally including
  extra files/directories, this function is more conservative and will raise an
  error if multiple packages or modules are found.
  
  This assumes that multi-package dists are uncommon and refuse to support that
  use case in order to be able to prevent unintended errors.
code: def _analyse_flat_layout(self) -> bool:
      """Try to find all packages and modules under the project root.
  
      Since the ``flat-layout`` is more dangerous in terms of accidentally including
      extra files/directories, this function is more conservative and will raise an
      error if multiple packages or modules are found.
  
      This assumes that multi-package dists are uncommon and refuse to support that
      use case in order to be able to prevent unintended errors.
      """
      log.debug(f"`flat-layout` detected -- analysing {self._root_dir}")
      return (
          self._analyse_flat_packages() or self._analyse_flat_modules()
      )
  
imports: import itertools
  import os
  from fnmatch import fnmatchcase
  from glob import glob
  from pathlib import Path
  from typing import TYPE_CHECKING, Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union
  import _distutils_hack.override
  from distutils import log
  from distutils.util import convert_path
label_desc: Use image node_id 11 for calling the ConfigDiscovery obj's underlying member method code with example usage: obj._analyse_flat_layout() and returns: unknown