def write_yamls(self): dandiset_yaml = YAMLRenderer().render(self.metadata.metadata) self._yaml_storage.save(self._dandiset_yaml_path, ContentFile(dandiset_yaml)) assets_yaml = YAMLRenderer().render( [asset.metadata.metadata for asset in self.assets.all()] ) self._yaml_storage.save(self._assets_yaml_path, ContentFile(assets_yaml))
def test_render_decimal(self): """ Test YAML decimal rendering. """ renderer = YAMLRenderer() content = renderer.render({'field': Decimal('111.2')}, 'application/yaml') self.assertYAMLContains(content.decode('utf-8'), "field: '111.2'")
def test_render_hyperlink(self): """ Test YAML Hyperlink rendering. """ renderer = YAMLRenderer() content = renderer.render({'field': Hyperlink('http://pépé.com?great-answer=42', 'test')}, 'application/yaml') self.assertYAMLContains(content.decode('utf-8'), "field: http://pépé.com?great-answer=42")
def test_render_decimal(self): """ Test YAML decimal rendering. """ renderer = YAMLRenderer() content = renderer.render( {"field": Decimal("111.2")}, "application/yaml" ) self.assertYAMLContains(content.decode("utf-8"), "field: '111.2'")
def test_render_hyperlink(self): """ Test YAML Hyperlink rendering. """ renderer = YAMLRenderer() content = renderer.render( {'field': Hyperlink('http://pépé.com?great-answer=42', 'test')}, 'application/yaml') self.assertYAMLContains(content.decode('utf-8'), "field: http://pépé.com?great-answer=42")
def test_render(self): """ Test basic YAML rendering. """ _yaml_repr = "foo:\n- bar\n- baz\n" obj = {"foo": ["bar", "baz"]} renderer = YAMLRenderer() content = renderer.render(obj, "application/yaml") self.assertEqual(content.decode("utf-8"), _yaml_repr)
def test_render(self): """ Test basic YAML rendering. """ _yaml_repr = 'foo:\n- bar\n- baz\n' obj = {'foo': ['bar', 'baz']} renderer = YAMLRenderer() content = renderer.render(obj, 'application/yaml') self.assertEqual(content.decode('utf-8'), _yaml_repr)
def test_render_hyperlink(self): """ Test YAML Hyperlink rendering. """ renderer = YAMLRenderer() content = renderer.render( {"field": Hyperlink("http://pépé.com?great-answer=42", "test")}, "application/yaml", ) self.assertYAMLContains( content.decode("utf-8"), "field: http://pépé.com?great-answer=42" )
def test_render_and_parse(self): """ Test rendering and then parsing returns the original object. IE obj -> render -> parse -> obj. """ obj = {'foo': ['bar', 'baz']} renderer = YAMLRenderer() parser = YAMLParser() content = renderer.render(obj, 'application/yaml') data = parser.parse(BytesIO(content)) self.assertEqual(obj, data)
def test_version_rest_publish(api_client, user, version, asset): assign_perm('owner', user, version.dandiset) api_client.force_authenticate(user=user) version.assets.add(asset) resp = api_client.post( f'/api/dandisets/{version.dandiset.identifier}/versions/{version.version}/publish/' ) assert resp.data == { 'dandiset': { 'identifier': version.dandiset.identifier, 'created': TIMESTAMP_RE, 'modified': TIMESTAMP_RE, }, 'version': VERSION_ID_RE, 'name': version.name, 'created': TIMESTAMP_RE, 'modified': TIMESTAMP_RE, 'asset_count': 1, 'size': version.size, } published_version = Version.objects.get(version=resp.data['version']) assert published_version assert version.dandiset.versions.count() == 2 # The original asset should now be in both versions assert asset == version.assets.get() assert asset == published_version.assets.get() assert asset.versions.count() == 2 # TODO this will fail if the test is run twice in the same minute. # The same version ID will be generated in the second test, # but the dandiset.yaml will still be present from the first test, creating a mismatch. # The solution is to remove the file if it already exists in models.Version.write_yamls(). with published_version._yaml_storage.open( published_version._dandiset_yaml_path) as f: assert f.read() == YAMLRenderer().render( published_version.metadata.metadata) with published_version._yaml_storage.open( published_version._assets_yaml_path) as f: assert f.read() == YAMLRenderer().render([ asset.metadata.metadata for asset in published_version.assets.all() ])
def get_renderer(self): """ Cf from rest_framework.renderers import JSONRenderer """ if ROA_FORMAT == 'json': return JSONRenderer() elif ROA_FORMAT == 'xml': return XMLRenderer() elif ROAException == 'yaml': return YAMLRenderer() else: raise NotImplementedError
def test_write_dandiset_yaml(storage: Storage, version: Version): # Pretend like AssetBlob was defined with the given storage # The task piggybacks off of the AssetBlob storage to write the yamls AssetBlob.blob.field.storage = storage write_dandiset_yaml(version) expected = YAMLRenderer().render(version.metadata) dandiset_yaml_path = ( f'{settings.DANDI_DANDISETS_BUCKET_PREFIX}' f'dandisets/{version.dandiset.identifier}/{version.version}/dandiset.yaml' ) with storage.open(dandiset_yaml_path) as f: assert f.read() == expected
def test_write_assets_yaml(storage: Storage, version: Version, asset_factory): # Pretend like AssetBlob was defined with the given storage # The task piggybacks off of the AssetBlob storage to write the yamls AssetBlob.blob.field.storage = storage # Create a new asset in the version so there is information to write version.assets.add(asset_factory()) write_assets_yaml(version) expected = YAMLRenderer().render( [asset.metadata for asset in version.assets.all()]) assets_yaml_path = ( f'{settings.DANDI_DANDISETS_BUCKET_PREFIX}' f'dandisets/{version.dandiset.identifier}/{version.version}/assets.yaml' ) with storage.open(assets_yaml_path) as f: assert f.read() == expected
def test_write_dandiset_yaml_already_exists(storage: Storage, version: Version): # Pretend like AssetBlob was defined with the given storage # The task piggybacks off of the AssetBlob storage to write the yamls AssetBlob.blob.field.storage = storage # Save an invalid file for the task to overwrite dandiset_yaml_path = ( f'{settings.DANDI_DANDISETS_BUCKET_PREFIX}' f'dandisets/{version.dandiset.identifier}/{version.version}/dandiset.yaml' ) storage.save(dandiset_yaml_path, ContentFile(b'wrong contents')) write_dandiset_yaml(version) expected = YAMLRenderer().render(version.metadata) with storage.open(dandiset_yaml_path) as f: assert f.read() == expected
def test_proper_encoding(self): _yaml_repr = 'countries:\n- United Kingdom\n- France\n- España' obj = {'countries': ['United Kingdom', 'France', 'España']} renderer = YAMLRenderer() content = renderer.render(obj, 'application/yaml') self.assertEqual(content.strip(), _yaml_repr.encode('utf-8'))
def write_assets_yaml(version: Version, logger=None): _write_manifest_file( assets_yaml_path(version), YAMLRenderer().render([asset.metadata for asset in version.assets.all()]), logger, )
def write_dandiset_yaml(version: Version, logger=None): _write_manifest_file( dandiset_yaml_path(version), YAMLRenderer().render(version.metadata), logger, )
def test_proper_encoding(self): _yaml_repr = "countries:\n- United Kingdom\n- France\n- España" obj = {"countries": ["United Kingdom", "France", "España"]} renderer = YAMLRenderer() content = renderer.render(obj, "application/yaml") self.assertEqual(content.strip(), _yaml_repr.encode("utf-8"))