def _testAddTaleCreator(self):
        from server.lib.manifest import Manifest

        manifest_doc = Manifest(self.tale, self.user)
        self.assertTrue(len(manifest_doc.manifest["schema:author"]))
    def _testDataSet(self):
        from server.lib.manifest import Manifest

        # Test that all of the files in the dataSet are added
        reference_aggregates = [
            {
                "uri": "doi:10.5065/D6862DM8",
                "bundledAs": {
                    "folder":
                    "../data/Humans and Hydrology at High Latitudes: Water Use Information/"
                },
                "size": 28848454,
            },
            {
                "uri":
                "https://cn.dataone.org/cn/v2/resolve/urn:uuid:01a53103-8db1-46b3-967c-b42acf69ae08",
                "bundledAs": {
                    "folder": "../data/",
                    "filename": "usco2005.xls"
                },
                "schema:isPartOf": "doi:10.5065/D6862DM8",
                "size": 6427136,
            },
            {
                "uri":
                "globus://82f1b5c6-6e9b-11e5-ba47-22000b92c6ec//published/publication_113/data/D_whites_darks_AJS.hdf",
                "bundledAs": {
                    "folder": "../data/",
                    "filename": "D_whites_darks_AJS.hdf",
                },
                "schema:isPartOf": "doi:10.18126/M2301J",
                "size": 8786120536,
            },
            {
                "uri":
                "globus://82f1b5c6-6e9b-11e5-ba47-22000b92c6ec//published/publication_1106/data/Dmax",
                "bundledAs": {
                    "folder": "../data/Dmax/"
                },
                "schema:isPartOf": "doi:10.18126/M2662X",
                "size": 105050561,
            },
            {
                "uri":
                "https://www.gw-openscience.org/s/events/BBH_events_v3.json",
                "bundledAs": {
                    "folder": "../data/",
                    "filename": "BBH_events_v3.json"
                },
                "size": 2202,
            },
            {
                "uri":
                "https://www.gw-openscience.org/s/events/GW170104/GW170104_4_template.hdf5",
                "bundledAs": {
                    "folder": "../data/GW170104/",
                    "filename": "GW170104_4_template.hdf5",
                },
                "size": 1056864,
            },
            {
                "uri":
                "https://www.gw-openscience.org/s/events/GW170104/H-H1_LOSC_4_V1-1167559920-32.hdf5",
                "bundledAs": {
                    "folder": "../data/GW170104/",
                    "filename": "H-H1_LOSC_4_V1-1167559920-32.hdf5",
                },
                "size": 1033609,
            },
            {
                "uri":
                "https://www.gw-openscience.org/s/events/GW170104/L-L1_LOSC_4_V1-1167559920-32.hdf5",
                "bundledAs": {
                    "folder": "../data/GW170104/",
                    "filename": "L-L1_LOSC_4_V1-1167559920-32.hdf5",
                },
                "size": 1005007,
            },
            {
                "uri": "../LICENSE",
                "schema:license": "CC-BY-4.0"
            },
        ]
        from operator import itemgetter

        reference_aggregates = sorted(reference_aggregates,
                                      key=itemgetter("uri"))
        manifest_doc = Manifest(self.tale, self.user)
        for i, aggregate in enumerate(
                sorted(manifest_doc.manifest["aggregates"],
                       key=itemgetter("uri"))):
            self.assertDictEqual(aggregate, reference_aggregates[i])

        # Check the datasets
        reference_datasets = [
            {
                "@id": "doi:10.18126/M2662X",
                "@type": "Dataset",
                "name":
                "A Machine Learning Approach for  Engineering Bulk Metallic Glass Alloys",
                "identifier": "doi:10.18126/M2662X",
            },
            {
                "@id": "doi:10.18126/M2301J",
                "@type": "Dataset",
                "name": "Twin-mediated Crystal Growth: an Enigma Resolved",
                "identifier": "doi:10.18126/M2301J",
            },
            {
                "@id": "doi:10.5065/D6862DM8",
                "@type": "Dataset",
                "name":
                "Humans and Hydrology at High Latitudes: Water Use Information",
                "identifier": "doi:10.5065/D6862DM8",
            },
        ]

        reference_datasets = sorted(reference_datasets, key=itemgetter("@id"))
        for i, dataset in enumerate(
                sorted(manifest_doc.manifest["Datasets"],
                       key=itemgetter("@id"))):
            self.assertDictEqual(dataset, reference_datasets[i])
Ejemplo n.º 3
0
def copyVersionsAndRuns(event: events.Event) -> None:
    def get_dir_path(root_id_key, tale):
        if root_id_key == "versionsRootId":
            return util.getTaleVersionsDirPath(tale)
        elif root_id_key == "runsRootId":
            return util.getTaleRunsDirPath(tale)

    old_tale, new_tale, target_version_id, shallow = event.info
    if shallow and not target_version_id:
        return
    creator = User().load(new_tale["creatorId"], force=True)
    versions_map = {}
    for root_id_key in ("versionsRootId", "runsRootId"):
        old_root = Folder().load(old_tale[root_id_key],
                                 user=creator,
                                 level=AccessType.READ)
        new_root = Folder().load(new_tale[root_id_key],
                                 user=creator,
                                 level=AccessType.WRITE)
        old_root_path = get_dir_path(root_id_key, old_tale)
        new_root_path = get_dir_path(root_id_key, new_tale)
        for src in Folder().childFolders(old_root, "folder", user=creator):
            if shallow and str(src["_id"]) != target_version_id:
                continue
            dst = Folder().createFolder(new_root, src["name"], creator=creator)
            if root_id_key == "versionsRootId":
                versions_map[str(src["_id"])] = str(dst["_id"])
            filtered_folder = Folder().filter(dst, creator)
            for key in src:
                if key not in filtered_folder and key not in dst:
                    dst[key] = copy.deepcopy(src[key])

            src_path = old_root_path / str(src["_id"])
            dst_path = new_root_path / str(dst["_id"])
            dst_path.mkdir(parents=True)
            shutil.copytree(src_path,
                            dst_path,
                            dirs_exist_ok=True,
                            symlinks=True)
            dst.update({
                "fsPath": dst_path.absolute().as_posix(),
                "isMapping": True,
                "created": src["created"],  # preserve timestamps
                "updated": src["updated"],
            })
            if root_id_key == "runsRootId":
                current_version = dst_path / "version"
                new_version_id = versions_map[current_version.resolve().name]
                new_version_path = (
                    "../../../../versions/"
                    f"{str(new_tale['_id'])[:2]}/{new_tale['_id']}/{new_version_id}"
                )
                current_version.unlink()
                current_version.symlink_to(new_version_path, True)
                dst["runVersionId"] = ObjectId(new_version_id)
            dst = Folder().save(dst, validate=False, triggerEvents=False)
        # update the time on root
        Folder().updateFolder(new_root)

    versions_root = Folder().load(new_tale["versionsRootId"],
                                  user=creator,
                                  level=AccessType.WRITE)
    for version in Folder().childFolders(versions_root, "folder",
                                         user=creator):
        tale = copy.deepcopy(new_tale)
        tale.update(VersionHierarchyModel().restoreTaleFromVersion(version))
        manifest = Manifest(tale,
                            creator,
                            versionId=version["_id"],
                            expand_folders=False)
        dst_path = pathlib.Path(version["fsPath"])
        with open(dst_path / "manifest.json", "w") as fp:
            fp.write(manifest.dump_manifest())

    Folder().updateFolder(versions_root)
    if target_version_id:
        new_version_id = versions_map[str(target_version_id)]
        target_version = Folder().load(new_version_id,
                                       level=AccessType.READ,
                                       user=creator)
        VersionHierarchyModel().restore(new_tale, target_version, creator)