docs: def _get_run_input_common_fields(executable_input, **kwargs):
          '''
          Takes the same arguments as the run method. Creates an input hash for the /executable-xxxx/run method,
          translating ONLY the fields that can be handled uniformly across all executables: project, folder, name, tags,
          properties, details, depends_on, allow_ssh, debug, delay_workspace_destruction, ignore_reuse, and extra_args.
          '''
          project = kwargs.get('project') or dxpy.WORKSPACE_ID
  
          run_input = {"input": executable_input}
          for arg in ['folder', 'name', 'tags', 'properties', 'details']:
              if kwargs.get(arg) is not None:
                  run_input[arg] = kwargs[arg]
  
          if kwargs.get('instance_type') is not None or kwargs.get('cluster_spec') is not None:
              instance_type_srd = SystemRequirementsDict.from_instance_type(kwargs.get('instance_type'))
              cluster_spec_srd = SystemRequirementsDict(kwargs.get('cluster_spec'))
              run_input["systemRequirements"] = (instance_type_srd + cluster_spec_srd).as_dict()
  
          if kwargs.get('depends_on') is not None:
              run_input["dependsOn"] = []
              if isinstance(kwargs['depends_on'], list):
                  for item in kwargs['depends_on']:
                      if isinstance(item, DXJob) or isinstance(item, DXDataObject):
                          if item.get_id() is None:
                              raise DXError('A dxpy handler given in depends_on does not have an ID set')
                          run_input["dependsOn"].append(item.get_id())
                      elif isinstance(item, basestring):
                          run_input['dependsOn'].append(item)
                      else:
                          raise DXError('Expected elements of depends_on to only be either instances of DXJob or DXDataObject, or strings')
              else:
                  raise DXError('Expected depends_on field to be a list')
  
          if kwargs.get('delay_workspace_destruction') is not None:
              run_input["delayWorkspaceDestruction"] = kwargs['delay_workspace_destruction']
  
          if kwargs.get('allow_ssh') is not None:
              run_input["allowSSH"] = kwargs['allow_ssh']
  
          if kwargs.get('debug') is not None:
              run_input["debug"] = kwargs['debug']
  
          if kwargs.get('priority') is not None:
              run_input["priority"] = kwargs['priority']
  
          if kwargs.get('ignore_reuse') is not None:
              run_input["ignoreReuse"] = kwargs['ignore_reuse']
  
          if dxpy.JOB_ID is None:
              run_input["project"] = project
  
          if kwargs.get('extra_args') is not None:
              merge(run_input, kwargs['extra_args'])
  
          return run_input