예제 #1
0
 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")
예제 #4
0
 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'")
예제 #5
0
 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'")
예제 #6
0
 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")
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
 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)
예제 #11
0
    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_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)
예제 #13
0
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()
        ])
예제 #14
0
 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
예제 #15
0
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
예제 #16
0
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
예제 #17
0
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
예제 #18
0
 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'))
예제 #19
0
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,
    )
예제 #20
0
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'))
예제 #22
0
 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"))