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`

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
        )