code: def new_config():
      
      config = ConfigDict()
      config["module-path"] = qprompt.ask_str(
          "Top-level module path",
          blk=False,
          vld=os.path.exists,
          hlp=MODULE_PATH_HELP)
  
      python_version = qprompt.ask_str(
          'Python version (blank for auto detection)',
          vld=_validate_python_version,
          hlp=PYTHON_VERSION_HELP)
      config['python-version'] = python_version
  
      timeout = qprompt.ask_str(
          'Test execution timeout (seconds)',
          vld=float,
          blk=False,
          hlp="The number of seconds to let a test run before terminating it.")
      config['timeout'] = float(timeout)
      config['excluded-modules'] = []
  
      config["test-command"] = qprompt.ask_str(
          "Test command",
          blk=False,
          hlp=TEST_COMMAND_HELP)
  
      menu = qprompt.Menu()
      for at_pos, engine_name in enumerate(execution_engine_names()):
          menu.add(str(at_pos), engine_name)
      config["execution-engine"] = ConfigDict()
      config['execution-engine']['name'] = menu.show(header="Execution engine", returns="desc")
  
      config["cloning"] = ConfigDict()
      config['cloning']['method'] = 'copy'
      config['cloning']['commands'] = []
  
      return config
docs: Prompt user for config variables and generate new config.
  
      Returns: A new ConfigDict.