import os from cellxgene_gateway import env from cellxgene_gateway.dir_util import make_h5ad, make_annotations, annotations_suffix def recurse_dir(path): if not os.path.exists(path): raise CellxgeneException( "The given path does not exist.", status.HTTP_400_BAD_REQUEST ) all_entries = os.listdir(path) def is_h5ad(el): return el.endswith('.h5ad') and os.path.isfile(os.path.join(path, el)) h5ad_entries = [x for x in all_entries if is_h5ad(x)] annotation_dir_entries = [x for x in all_entries if x.endswith(annotations_suffix) and make_h5ad(x) in h5ad_entries] def list_annotations(el): full_path = os.path.join(path, el) if not os.path.isdir(full_path): entries = [] else: entries = [{ "name": x[:-13] if (len(x) > 13 and x[-13] in ['-','_']) else ( x[:-4] if x.endswith('.csv') else x), "path": os.path.join(full_path, x).replace(env.cellxgene_data, ""), } for x in os.listdir(full_path) if x.endswith('.csv') and os.path.isfile(os.path.join(full_path, x))] return [{"name":'new', "class":'new', "path":full_path.replace(env.cellxgene_data, "")}] + entries def make_entry(el): full_path = os.path.join(path, el) if el in h5ad_entries: return { "path": full_path.replace(env.cellxgene_data, ""), "name": el, "type": "file", "annotations": list_annotations(make_annotations(el)), } elif os.path.isdir(full_path) and el not in annotation_dir_entries: return { "path": full_path.replace(env.cellxgene_data, ""), "name": el, "type": "directory", "children": recurse_dir(full_path), } else: return { "path": full_path, "name": el, "type": "neither", } return [make_entry(x) for x in os.listdir(path)] def render_entries(entries): return "