def unorganised_runfolder(name="180124_A00181_0019_BH72M5DMXX", root_path="/foo"): sample_indexes = sample_index_generator() lane_numbers = lane_generator() runfolder = Runfolder(name=name, path=os.path.join(root_path, name)) runfolder.projects = [ runfolder_project(runfolder, project_name=p, sample_indexes=sample_indexes, lane_numbers=lane_numbers) for p in fake_projects ] # add another project with missing files project = runfolder_project(runfolder, project_name="JKL_123", sample_indexes=sample_indexes, lane_numbers=lane_numbers) project.project_files = [] runfolder.projects.append(project) checksums = {} for project in runfolder.projects: for sample in project.samples: for sample_file in sample.sample_files: checksums[os.path.relpath( sample_file.file_path, os.path.dirname(runfolder.path))] = sample_file.checksum for project_file in project.project_files: checksums[os.path.relpath( project_file.file_path, os.path.dirname(runfolder.path))] = project_file.checksum runfolder.checksums = checksums return runfolder
def _get_runfolders(self): # TODO Filter based on expression for runfolders... runfolder_expression = r"^\d+_" directories = self.file_system_service.find_runfolder_directories( self._base_path) for directory in directories: if re.match(runfolder_expression, os.path.basename(directory)): name = os.path.basename(directory) path = os.path.join(self._base_path, directory) projects_base_dir = os.path.join(path, "Projects") project_directories = self.file_system_service.find_project_directories( projects_base_dir) runfolder = Runfolder(name=name, path=path, projects=None) def project_from_dir(d): return Project(name=os.path.basename(d), path=os.path.join(projects_base_dir, d), runfolder_path=path) # There are scenarios where there are no project directories in the runfolder, # i.e. when fastq files have not yet been divided into projects if project_directories: runfolder.projects = map(project_from_dir, project_directories) yield runfolder
def _get_runfolder_object(self, directory, ignore_errors=False): name = os.path.basename(directory) path = os.path.join(self._base_path, directory) runfolder = Runfolder(name=name, path=path, projects=None) self._add_checksums_for_runfolder(runfolder, ignore_errors=ignore_errors) self._add_projects_to_runfolder(runfolder) return runfolder
def _get_runfolders(self): # TODO Filter based on expression for runfolders... runfolder_expression = r"^\d+_" directories = self.file_system_service.find_runfolder_directories( self._base_path) for directory in directories: if re.match(runfolder_expression, os.path.basename(directory)): name = os.path.basename(directory) path = os.path.join(self._base_path, directory) runfolder = Runfolder(name=name, path=path, projects=None) self._add_projects_to_runfolder(runfolder) yield runfolder
def organise_runfolder(self, runfolder_id, lanes, projects, force): """ Organise a runfolder in preparation for delivery. This will create separate subdirectories for each of the projects and symlink all files belonging to the project to be delivered under this directory. :param runfolder_id: the name of the runfolder to be organised :param lanes: if not None, only samples on any of the specified lanes will be organised :param projects: if not None, only projects in this list will be organised :param force: if True, a previously organised project will be renamed with a unique suffix :raises ProjectAlreadyOrganisedException: if a project has already been organised and force is False :return: a Runfolder instance representing the runfolder after organisation """ # retrieve a runfolder object and project objects to be organised runfolder = self.runfolder_service.find_runfolder(runfolder_id) projects_on_runfolder = list( self.runfolder_service.find_projects_on_runfolder( runfolder, only_these_projects=projects)) # handle previously organised projects organised_projects_path = os.path.join(runfolder.path, "Projects") for project in projects_on_runfolder: self.check_previously_organised_project(project, organised_projects_path, force) # organise the projects and return a new Runfolder instance organised_projects = [] for project in projects_on_runfolder: organised_projects.append( self.organise_project(runfolder, project, organised_projects_path, lanes)) return Runfolder(runfolder.name, runfolder.path, projects=organised_projects, checksums=runfolder.checksums)
fake_directories = [ "160930_ST-E00216_0111_BH37CWALXX", "160930_ST-E00216_0112_BH37CWALXX" ] fake_projects = ["ABC_123", "DEF_456"] def mock_file_system_service(directories, projects): mock_file_system_service_instance = MagicMock() mock_file_system_service_instance.find_runfolder_directories.return_value = directories mock_file_system_service_instance.find_project_directories.return_value = projects return mock_file_system_service_instance _runfolder1 = Runfolder(name="160930_ST-E00216_0111_BH37CWALXX", path="/foo/160930_ST-E00216_0111_BH37CWALXX") _runfolder1.projects = [ RunfolderProject( name="ABC_123", path="/foo/160930_ST-E00216_0111_BH37CWALXX/Projects/ABC_123", runfolder_path=_runfolder1.path), RunfolderProject( name="DEF_456", path="/foo/160930_ST-E00216_0111_BH37CWALXX/Projects/DEF_456", runfolder_path=_runfolder1.path) ] _runfolder2 = Runfolder(name="160930_ST-E00216_0112_BH37CWALXX", path="/foo/160930_ST-E00216_0112_BH37CWALXX")