diff --git a/debian/control b/debian/control --- a/debian/control +++ b/debian/control @@ -18,9 +18,9 @@ python3-click, python3-vcversioner, python3-djangorestframework, - python3-djangorestframework-xml, python3-requests, python3-lxml, + python3-xmltodict, patool Standards-Version: 3.9.6 Homepage: https://forge.softwareheritage.org/source/swh-deposit/ diff --git a/requirements.txt b/requirements.txt --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,5 @@ click Django djangorestframework -djangorestframework-xml lxml +xmltodict diff --git a/swh/deposit/api/common.py b/swh/deposit/api/common.py --- a/swh/deposit/api/common.py +++ b/swh/deposit/api/common.py @@ -553,9 +553,7 @@ 'Atom entry deposit is supposed to send for metadata. ' 'If the body is empty, there is no metadata.') - external_id = req.data.get( - '{http://www.w3.org/2005/Atom}external_identifier', - headers['slug']) + external_id = req.data.get('external_identifier', headers['slug']) deposit = self._deposit_put(deposit_id=deposit_id, in_progress=headers['in-progress'], diff --git a/swh/deposit/parsers.py b/swh/deposit/parsers.py --- a/swh/deposit/parsers.py +++ b/swh/deposit/parsers.py @@ -8,10 +8,12 @@ """ -from decimal import Decimal +import xmltodict + +from django.conf import settings +from rest_framework.parsers import BaseParser from rest_framework.parsers import FileUploadParser from rest_framework.parsers import MultiPartParser -from rest_framework_xml.parsers import XMLParser class SWHFileUploadZipParser(FileUploadParser): @@ -22,23 +24,29 @@ class SWHFileUploadTarParser(FileUploadParser): - """File upload parser limited to zip archive. + """File upload parser limited to tarball (tar, tar.gz, tar.*) archives. """ media_type = 'application/x-tar' -class SWHXMLParser(XMLParser): - def _type_convert(self, value): - """Override the default type converter to avoid having decimal in the - resulting output. +class SWHXMLParser(BaseParser): + """ + XML parser. + """ + media_type = 'application/xml' + def parse(self, stream, media_type=None, parser_context=None): """ - value = super()._type_convert(value) - if isinstance(value, Decimal): - value = str(value) - - return value + Parses the incoming bytestream as XML and returns the resulting data. + """ + parser_context = parser_context or {} + encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) + data = xmltodict.parse(stream, encoding=encoding, + process_namespaces=False) + if 'entry' in data: + data = data['entry'] + return data class SWHAtomEntryParser(SWHXMLParser): diff --git a/swh/deposit/tests/api/test_deposit.py b/swh/deposit/tests/api/test_deposit.py --- a/swh/deposit/tests/api/test_deposit.py +++ b/swh/deposit/tests/api/test_deposit.py @@ -102,8 +102,7 @@ self.assertEquals(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - actual_state = response_content[ - '{http://www.w3.org/2005/Atom}deposit_status'] + actual_state = response_content['deposit_status'] self.assertEquals(actual_state, DEPOSIT_STATUS_REJECTED) @istest diff --git a/swh/deposit/tests/api/test_deposit_atom.py b/swh/deposit/tests/api/test_deposit_atom.py --- a/swh/deposit/tests/api/test_deposit_atom.py +++ b/swh/deposit/tests/api/test_deposit_atom.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017 The Software Heritage developers +# Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -269,15 +269,13 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) dr = DepositRequest.objects.get(deposit=deposit) self.assertIsNotNone(dr.metadata) - sw_version = dr.metadata.get( - '{https://doi.org/10.5063/SCHEMA/CODEMETA-2.0}softwareVersion') + sw_version = dr.metadata.get('codemeta:softwareVersion') self.assertEquals(sw_version, '10.4') @istest @@ -358,8 +356,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.collection, self.collection) @@ -399,8 +396,7 @@ response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.collection, self.collection) @@ -438,8 +434,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.collection, self.collection) @@ -475,8 +470,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = int(response_content['deposit_id']) deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.collection, self.collection) @@ -503,8 +497,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = int(response_content['deposit_id']) deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.collection, self.collection) diff --git a/swh/deposit/tests/api/test_deposit_binary.py b/swh/deposit/tests/api/test_deposit_binary.py --- a/swh/deposit/tests/api/test_deposit_binary.py +++ b/swh/deposit/tests/api/test_deposit_binary.py @@ -174,8 +174,7 @@ # then response_content = parse_xml(BytesIO(response.content)) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) @@ -189,15 +188,12 @@ self.assertRegex(deposit_request.archive.name, self.archive['name']) response_content = parse_xml(BytesIO(response.content)) - self.assertEqual( - response_content['{http://www.w3.org/2005/Atom}deposit_archive'], - self.archive['name']) - self.assertEqual( - response_content['{http://www.w3.org/2005/Atom}deposit_id'], - deposit.id) - self.assertEqual( - response_content['{http://www.w3.org/2005/Atom}deposit_status'], - deposit.status) + self.assertEqual(response_content['deposit_archive'], + self.archive['name']) + self.assertEqual(int(response_content['deposit_id']), + deposit.id) + self.assertEqual(response_content['deposit_status'], + deposit.status) edit_se_iri = reverse('edit_se_iri', args=[self.collection.name, deposit.id]) @@ -384,8 +380,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) @@ -409,8 +404,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id2 = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id2 = response_content['deposit_id'] deposit2 = Deposit.objects.get(pk=deposit_id2) @@ -448,8 +442,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.status, 'partial') @@ -538,8 +531,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) diff --git a/swh/deposit/tests/api/test_deposit_delete.py b/swh/deposit/tests/api/test_deposit_delete.py --- a/swh/deposit/tests/api/test_deposit_delete.py +++ b/swh/deposit/tests/api/test_deposit_delete.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017 The Software Heritage developers +# Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information diff --git a/swh/deposit/tests/api/test_deposit_multipart.py b/swh/deposit/tests/api/test_deposit_multipart.py --- a/swh/deposit/tests/api/test_deposit_multipart.py +++ b/swh/deposit/tests/api/test_deposit_multipart.py @@ -147,8 +147,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) @@ -166,8 +165,7 @@ self.archive['name']) else: self.assertEquals( - deposit_request.metadata[ - '{http://www.w3.org/2005/Atom}id'], + deposit_request.metadata['id'], 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a') @istest @@ -215,8 +213,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) @@ -234,8 +231,7 @@ self.archive['name']) else: self.assertEquals( - deposit_request.metadata[ - '{http://www.w3.org/2005/Atom}id'], + deposit_request.metadata['id'], 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a') @istest @@ -283,8 +279,7 @@ self.assertEqual(response.status_code, status.HTTP_201_CREATED) response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = response_content['deposit_id'] deposit = Deposit.objects.get(pk=deposit_id) self.assertEqual(deposit.status, 'partial') @@ -303,8 +298,7 @@ self.archive['name']) else: self.assertEquals( - deposit_request.metadata[ - '{http://www.w3.org/2005/Atom}id'], + deposit_request.metadata['id'], 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a') replace_metadata_uri = response._headers['location'][1] @@ -333,8 +327,7 @@ self.archive['name']) else: self.assertEquals( - deposit_request.metadata[ - '{http://www.w3.org/2005/Atom}id'], + deposit_request.metadata['id'], 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa7b') # FAILURE scenarios @@ -377,7 +370,7 @@ self.assertEqual(response.status_code, status.HTTP_415_UNSUPPORTED_MEDIA_TYPE) self.assertTrue( - 'Only 1 application/zip (or application/x-tar) archive' in \ + 'Only 1 application/zip (or application/x-tar) archive' in response.content.decode('utf-8')) # when diff --git a/swh/deposit/tests/api/test_deposit_read_metadata.py b/swh/deposit/tests/api/test_deposit_read_metadata.py --- a/swh/deposit/tests/api/test_deposit_read_metadata.py +++ b/swh/deposit/tests/api/test_deposit_read_metadata.py @@ -51,11 +51,10 @@ }, 'origin_metadata': { 'metadata': { - '{http://www.w3.org/2005/Atom}external_identifier': - 'some-external-id', - '{http://www.w3.org/2005/Atom}url': - 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + '@xmlns': 'http://www.w3.org/2005/Atom', + 'external_identifier':'some-external-id', + 'url': 'https://hal-test.archives-ouvertes.fr/' + + 'some-external-id' }, 'provider': { 'provider_name': 'hal', @@ -79,11 +78,10 @@ 'committer': SWH_PERSON, 'date': None, 'metadata': { - '{http://www.w3.org/2005/Atom}external_identifier': - 'some-external-id', - '{http://www.w3.org/2005/Atom}url': - 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + '@xmlns': 'http://www.w3.org/2005/Atom', + 'external_identifier': 'some-external-id', + 'url': 'https://hal-test.archives-ouvertes.fr/' + + 'some-external-id' }, 'type': 'tar' }, @@ -137,11 +135,10 @@ }, 'origin_metadata': { 'metadata': { - '{http://www.w3.org/2005/Atom}external_identifier': - 'some-external-id', - '{http://www.w3.org/2005/Atom}url': - 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + '@xmlns': 'http://www.w3.org/2005/Atom', + 'external_identifier': 'some-external-id', + 'url': 'https://hal-test.archives-ouvertes.fr/' + + 'some-external-id' }, 'provider': { 'provider_name': 'hal', @@ -166,11 +163,10 @@ 'type': 'tar', 'message': 'hal: Deposit %s in collection hal' % deposit_id, 'metadata': { - '{http://www.w3.org/2005/Atom}external_identifier': - 'some-external-id', - '{http://www.w3.org/2005/Atom}url': - 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + '@xmlns': 'http://www.w3.org/2005/Atom', + 'external_identifier': 'some-external-id', + 'url': 'https://hal-test.archives-ouvertes.fr/' + + 'some-external-id' }, 'parents': [swh_id] }, diff --git a/swh/deposit/tests/api/test_deposit_status.py b/swh/deposit/tests/api/test_deposit_status.py --- a/swh/deposit/tests/api/test_deposit_status.py +++ b/swh/deposit/tests/api/test_deposit_status.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017 The Software Heritage developers +# Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -61,13 +61,10 @@ self.assertEqual(status_response.status_code, status.HTTP_200_OK) r = parse_xml(BytesIO(status_response.content)) - self.assertEqual(r['{http://www.w3.org/2005/Atom}deposit_id'], - deposit.id) - self.assertEqual(r['{http://www.w3.org/2005/Atom}deposit_status'], - DEPOSIT_STATUS_DEPOSITED) - self.assertEqual( - r['{http://www.w3.org/2005/Atom}deposit_status_detail'], - DEPOSIT_STATUS_DETAIL[DEPOSIT_STATUS_DEPOSITED]) + self.assertEqual(int(r['deposit_id']), deposit.id) + self.assertEqual(r['deposit_status'], DEPOSIT_STATUS_DEPOSITED) + self.assertEqual(r['deposit_status_detail'], + DEPOSIT_STATUS_DETAIL[DEPOSIT_STATUS_DEPOSITED]) @istest def status_with_swh_id(self): @@ -87,15 +84,11 @@ # then self.assertEqual(status_response.status_code, status.HTTP_200_OK) r = parse_xml(BytesIO(status_response.content)) - self.assertEqual(r['{http://www.w3.org/2005/Atom}deposit_id'], - deposit_id) - self.assertEqual(r['{http://www.w3.org/2005/Atom}deposit_status'], - _status) - self.assertEqual( - r['{http://www.w3.org/2005/Atom}deposit_status_detail'], - DEPOSIT_STATUS_DETAIL[DEPOSIT_STATUS_LOAD_SUCCESS]) - self.assertEqual(r['{http://www.w3.org/2005/Atom}deposit_swh_id'], - _swh_id) + self.assertEqual(int(r['deposit_id']), deposit_id) + self.assertEqual(r['deposit_status'], _status) + self.assertEqual(r['deposit_status_detail'], + DEPOSIT_STATUS_DETAIL[DEPOSIT_STATUS_LOAD_SUCCESS]) + self.assertEqual(r['deposit_swh_id'], _swh_id) @istest def status_on_unknown_deposit(self): diff --git a/swh/deposit/tests/api/test_deposit_update.py b/swh/deposit/tests/api/test_deposit_update.py --- a/swh/deposit/tests/api/test_deposit_update.py +++ b/swh/deposit/tests/api/test_deposit_update.py @@ -130,8 +130,7 @@ self.assertEquals(len(list(requests)), 1) metadata = requests[0].metadata - self.assertEquals(metadata["{http://www.w3.org/2005/Atom}foobar"], - 'bar') + self.assertEquals(metadata['foobar'], 'bar') # check we did not touch the other parts requests = list(DepositRequest.objects.filter( @@ -227,8 +226,7 @@ self.assertEquals(len(list(requests)), 3) # a new one was added - self.assertEquals(requests[1].metadata[ - "{http://www.w3.org/2005/Atom}foobar"], 'bar') + self.assertEquals(requests[1].metadata['foobar'], 'bar') # check we did not touch the other parts requests = list(DepositRequest.objects.filter( diff --git a/swh/deposit/tests/api/test_parser.py b/swh/deposit/tests/api/test_parser.py new file mode 100644 --- /dev/null +++ b/swh/deposit/tests/api/test_parser.py @@ -0,0 +1,104 @@ +# Copyright (C) 2018 The Software Heritage developers +# See the AUTHORS file at the top-level directory of this distribution +# License: GNU General Public License version 3, or any later version +# See top-level LICENSE file for more information + +import io + +from collections import OrderedDict +from nose.tools import istest +from rest_framework.test import APITestCase + +from swh.deposit.parsers import SWHXMLParser + + +class ParsingTest(APITestCase): + """Access to main entry point is ok without authentication + + """ + @istest + def parsing_without_duplicates(self): + xml_no_duplicate = io.BytesIO(b''' + + Awesome Compiler + + GPL3.0 + https://opensource.org/licenses/GPL-3.0 + + Python3 + + author1 + Inria + + ocaml + http://issuetracker.com + ''') + + actual_result = SWHXMLParser().parse(xml_no_duplicate) + expected_dict = OrderedDict( + [('@xmlns', 'http://www.w3.org/2005/Atom'), + ('@xmlns:codemeta', + 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0'), + ('title', 'Awesome Compiler'), + ('codemeta:license', + OrderedDict([('codemeta:name', 'GPL3.0'), + ('codemeta:url', + 'https://opensource.org/licenses/GPL-3.0')])), + ('codemeta:runtimePlatform', 'Python3'), + ('codemeta:author', + OrderedDict([('codemeta:name', 'author1'), + ('codemeta:affiliation', 'Inria')])), + ('codemeta:programmingLanguage', 'ocaml'), + ('codemeta:issueTracker', 'http://issuetracker.com')]) + self.assertEqual(expected_dict, actual_result) + + @istest + def parsing_with_duplicates(self): + xml_with_duplicates = io.BytesIO(b''' + + Another Compiler + GNU/Linux + + GPL3.0 + https://opensource.org/licenses/GPL-3.0 + + Un*x + + author1 + Inria + + + author2 + Inria + + ocaml + haskell + + spdx + http://spdx.org + + python3 + ''') + + actual_result = SWHXMLParser().parse(xml_with_duplicates) + + expected_dict = OrderedDict([ + ('@xmlns', 'http://www.w3.org/2005/Atom'), + ('@xmlns:codemeta', 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0'), + ('title', 'Another Compiler'), + ('codemeta:runtimePlatform', ['GNU/Linux', 'Un*x']), + ('codemeta:license', + [OrderedDict([('codemeta:name', 'GPL3.0'), + ('codemeta:url', + 'https://opensource.org/licenses/GPL-3.0')]), + OrderedDict([('codemeta:name', 'spdx'), + ('codemeta:url', 'http://spdx.org')])]), + ('codemeta:author', + [OrderedDict([('codemeta:name', 'author1'), + ('codemeta:affiliation', 'Inria')]), + OrderedDict([('codemeta:name', 'author2'), + ('codemeta:affiliation', 'Inria')])]), + ('codemeta:programmingLanguage', ['ocaml', 'haskell', 'python3'])]) + self.assertEqual(expected_dict, actual_result) diff --git a/swh/deposit/tests/common.py b/swh/deposit/tests/common.py --- a/swh/deposit/tests/common.py +++ b/swh/deposit/tests/common.py @@ -123,8 +123,7 @@ # then assert response.status_code == status.HTTP_201_CREATED response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = int(response_content['deposit_id']) return deposit_id def create_complex_binary_deposit(self, status_partial=False): @@ -146,8 +145,7 @@ # then assert response.status_code == status.HTTP_201_CREATED response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = int(response_content['deposit_id']) return deposit_id def update_binary_deposit(self, deposit_id, status_partial=False): @@ -162,8 +160,7 @@ # then # assert response.status_code == status.HTTP_201_CREATED response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = int(response_content['deposit_id']) return deposit_id @@ -336,9 +333,7 @@ HTTP_CONTENT_DISPOSITION='attachment; filename=filename0') response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] - + deposit_id = int(response_content['deposit_id']) return deposit_id def create_deposit_with_status( @@ -375,8 +370,7 @@ assert response.status_code == status.HTTP_201_CREATED response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = int(response_content['deposit_id']) return deposit_id def create_deposit_partial_with_data_in_args(self, data): @@ -399,8 +393,7 @@ assert response.status_code == status.HTTP_201_CREATED response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content[ - '{http://www.w3.org/2005/Atom}deposit_id'] + deposit_id = int(response_content['deposit_id']) return deposit_id def _update_deposit_with_status(self, deposit_id, status_partial=False): diff --git a/swh/deposit/tests/loader/test_loader.py b/swh/deposit/tests/loader/test_loader.py --- a/swh/deposit/tests/loader/test_loader.py +++ b/swh/deposit/tests/loader/test_loader.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017 The Software Heritage developers +# Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -232,7 +232,7 @@ """ self.deposit_metadata_id = self.add_metadata_to_deposit( - self.deposit_id) + self.deposit_id) args = [self.collection.name, self.deposit_metadata_id] archive_url = reverse(PRIVATE_GET_RAW_CONTENT, args=args) @@ -254,32 +254,37 @@ self.assertEquals(len(self.loader.state['tool']), 1) self.assertEquals(len(self.loader.state['provider']), 1) - atom = '{http://www.w3.org/2005/Atom}' - codemeta = '{https://doi.org/10.5063/SCHEMA/CODEMETA-2.0}' + codemeta = 'codemeta:' expected_origin_metadata = { - atom + 'author': { - atom + 'email': 'hal@ccsd.cnrs.fr', - atom + 'name': 'HAL' + '@xmlns': 'http://www.w3.org/2005/Atom', + '@xmlns:codemeta': 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0', + 'author': { + 'email': 'hal@ccsd.cnrs.fr', + 'name': 'HAL' }, codemeta + 'url': - 'https://hal-test.archives-ouvertes.fr/hal-01243065', + 'https://hal-test.archives-ouvertes.fr/hal-01243065', codemeta + 'runtimePlatform': 'phpstorm', - codemeta + 'license': { - codemeta + 'name': - 'CeCILL Free Software License Agreement v1.1' - }, + codemeta + 'license': [ + { + codemeta + 'name': 'GNU General Public License v3.0 only' + }, + { + codemeta + 'name': 'CeCILL Free Software License Agreement v1.1' # noqa + } + ], codemeta + 'author': { codemeta + 'name': 'Morane Gruenpeter' }, - codemeta + 'programmingLanguage': 'C', + codemeta + 'programmingLanguage': ['php', 'python', 'C'], codemeta + 'applicationCategory': 'test', codemeta + 'dateCreated': '2017-05-03T16:08:47+02:00', - codemeta + 'version': 1, - atom + 'external_identifier': 'hal-01243065', - atom + 'title': 'Composing a Web of Audio Applications', + codemeta + 'version': '1', + 'external_identifier': 'hal-01243065', + 'title': 'Composing a Web of Audio Applications', codemeta + 'description': 'this is the description', - atom + 'id': 'hal-01243065', - atom + 'client': 'hal', + 'id': 'hal-01243065', + 'client': 'hal', codemeta + 'keywords': 'DSP programming,Web', codemeta + 'developmentStatus': 'stable' }