code: def find_project(self):  # type: () -> List[str]
          
          folders = [f for f in os.listdir(".") if os.path.isdir(f)]
  
          candidates = []
          setup = self.setup_py_source()
          for folder in folders:
              if os.path.isfile(folder + "/__init__.py"):
                  dunder_source = self._read_file(folder + "/__init__.py")
                  project = folder
                  if setup:
                      # prevents test folders & other junk
                      in_setup = (
                          "'{0}".format(project) not in setup
                          and '"{0}"'.format(project) not in setup
                      )
                      in_dunder = (
                          "'{0}".format(dunder_source) not in setup
                          and '"{0}"'.format(dunder_source) not in setup
                      )
  
                      if not in_setup and not in_dunder:
                          continue
  
                  candidates.append(folder)
  
          # TODO: parse setup.cfg
          if not candidates:
              candidates = candidates + self.find_single_file_project()
          if not candidates:
              candidates = candidates + self.find_malformed_single_file_project()
  
          candidates = list(set([x for x in candidates if x]))
  
          # too many
          if not candidates:
              candidates.extend(self.via_find_packages())
              candidates = list(set([x for x in candidates if x]))
  
          if len(candidates) > 1:
              for unlikely in [
                  "test",
                  "tests",
                  "example",
                  "examples",
                  "demo",
                  "demos",
                  "test_files",
              ]:
                  if unlikely in candidates:
                      logger.warning("Assuming {0} is not the project".format(unlikely))
                      candidates.remove(unlikely)
                  if len(candidates) == 1:
                      break
  
          # too few or too many
          if len(candidates) != 1:
              likely_name = self.name_from_setup_py()
              if likely_name in candidates:
                  return [likely_name]
          return list(set([x for x in candidates if x]))
docs: Get all candidate projects
          :return: