def test_generate_ro_manifest_update(self): logger.info( self.getTestHeader( 'create bag with auto-generation of RO manifest in update mode' )) try: bdb.make_bag(self.test_data_dir, algs=['md5', 'sha1', 'sha256', 'sha512'], remote_file_manifest=ospj(self.test_config_dir, 'test-fetch-manifest.json')) bdb.generate_ro_manifest(self.test_data_dir, overwrite=True) ro = bdbro.read_bag_ro_metadata(self.test_data_dir) old_agg_dict = dict() for entry in ro.get("aggregates", []): old_agg_dict[entry["uri"]] = entry bdbro.add_file_metadata(ro, local_path="../data/FAKE.txt", bundled_as=bdbro.make_bundled_as()) bdbro.write_bag_ro_metadata(ro, self.test_data_dir) bdb.generate_ro_manifest(self.test_data_dir, overwrite=False) ro = bdbro.read_bag_ro_metadata(self.test_data_dir) for entry in ro.get("aggregates", []): if entry["uri"] in old_agg_dict: self.assertTrue(entry["bundledAs"]["uri"] == old_agg_dict[ entry["uri"]]["bundledAs"]["uri"]) except Exception as e: self.fail(get_typed_exception(e))
def test_generate_ro_manifest_overwrite(self): logger.info( self.getTestHeader( 'create bag with auto-generation of RO manifest in overwrite mode' )) try: bdb.make_bag(self.test_data_dir, algs=['md5', 'sha1', 'sha256', 'sha512'], remote_file_manifest=ospj(self.test_config_dir, 'test-fetch-manifest.json')) bdb.generate_ro_manifest(self.test_data_dir, overwrite=True) ro = bdbro.read_bag_ro_metadata(self.test_data_dir) agg_dict = dict() for entry in ro.get("aggregates", []): agg_dict[entry["uri"]] = entry for test_entry in self.ro_test_aggregates: self.assertTrue(test_entry["uri"] in agg_dict) entry = agg_dict[test_entry["uri"]] bundled_as = entry.get("bundledAs") if bundled_as: if "filename" in bundled_as: self.assertTrue(test_entry["bundledAs"]["filename"] == bundled_as["filename"]) if "folder" in bundled_as: self.assertTrue(test_entry["bundledAs"]["folder"] == bundled_as["folder"]) except Exception as e: self.fail(get_typed_exception(e))
def generate_ro_manifest(bag_path, overwrite=False, config_file=DEFAULT_CONFIG_FILE): bag = bdbagit.BDBag(bag_path) bag_ro_metadata_path = os.path.abspath( os.path.join(bag_path, "metadata", "manifest.json")) exists = os.path.isfile(bag_ro_metadata_path) if exists and not overwrite: logger.info("Auto-generating RO manifest: update existing file.") ro_metadata = bdbro.read_bag_ro_metadata(bag_path) else: logger.info( "Auto-generating RO manifest: %s." % "creating new file" if not exists else "overwrite existing file") ro_metadata = bdbro.init_ro_manifest( author_name=bag.info.get("Contact-Name"), author_orcid=bag.info.get("Contact-Orcid"), creator_name=bdbro.BAG_CREATOR_NAME, creator_uri=bdbro.BAG_CREATOR_URI) config = read_config(config_file) resolvers = config.get( ID_RESOLVER_TAG, DEFAULT_ID_RESOLVERS) if config else DEFAULT_ID_RESOLVERS fetched = bag.fetch_entries() local = bag.payload_files() for url, length, filename in fetched: if url.startswith("minid:") or url.startswith("ark:"): url = "".join(["http://", resolvers[0], "/", url]) bdbro.add_file_metadata(ro_metadata, source_url=url, bundled_as=bdbro.make_bundled_as( folder=os.path.dirname(filename), filename=os.path.basename(filename)), update_existing=True) for path in local: bdbro.add_file_metadata(ro_metadata, local_path=path.replace("\\", "/"), bundled_as=bdbro.make_bundled_as(), update_existing=True) bdbro.write_bag_ro_metadata(ro_metadata, bag_path) profile = bag.info.get(BAG_PROFILE_TAG) if profile == BDBAG_PROFILE_ID: bag.info.update({BAG_PROFILE_TAG: BDBAG_RO_PROFILE_ID}) bag.save()