docs: def upload_jterator_project_files(self, directory):
          '''Uploads the *jterator* project description from files on disk in
          YAML format. It expects a ``pipeline.yaml`` file in `directory` and
          optionally ``*handles.yaml`` files in a ``handles`` subfolder of
          `directory`.
  
          Parameters
          ----------
          directory: str
              path to the root folder where files are located
  
          See also
          --------
          :meth:`tmclient.api.TmClient.upload_jterator_project`
          '''
          logger.info(
              'load jterator project description from directory: %s', directory
          )
          if not os.path.exists(directory):
              raise OSError('Directory does not exit: {0}'.format(directory))
  
          pipeline_filename = os.path.join(directory, 'pipeline.yaml')
          if not os.path.exists(pipeline_filename):
              raise OSError(
                  'Pipeline description file does not exist: {0}'.format(
                      pipeline_filename
                  )
              )
          logger.debug('load pipeline filename: %s', pipeline_filename)
          with open(pipeline_filename) as f:
              pipeline_description = yaml.safe_load(f.read())
  
          handles_subdirectory = os.path.join(directory, 'handles')
          if not os.path.exists(handles_subdirectory):
              logger.warn(
                  'handles subdirectory does not exist: %s', handles_subdirectory
              )
          handles_filename_pattern = os.path.join(
              handles_subdirectory, '*.handles.yaml'
          )
          handles_descriptions = dict()
          for handles_filename in glob.glob(handles_filename_pattern):
              name = os.path.splitext(os.path.splitext(
                  os.path.basename(handles_filename)
              )[0])[0]
              logger.debug('load handles file: %s', handles_filename)
              with open(handles_filename) as f:
                  handles_descriptions[name] = yaml.safe_load(f.read())
  
          self.upload_jterator_project(
              pipeline_description, handles_descriptions
          )