Exemplo n.º 1
0
 def setUpOaiRecord(self, **kwargs):
     self.oaiRecord = OaiRecord(**kwargs)
     self.observer = CallTrace('Observer')
     self.oaiRecord.addObserver(self.observer)
     def retrieveData(**kwargs):
         raise StopIteration('<data/>')
         yield
     self.observer.methods['retrieveData'] = retrieveData
     self.observer.returnValues['provenance'] = (f for f in [])
Exemplo n.º 2
0
 def __init__(self,
              repositoryName,
              adminEmail,
              repositoryIdentifier=None,
              batchSize=OaiList.DEFAULT_BATCH_SIZE,
              supportXWait=False,
              fixIdentifyBaseURL=False):
     outside = Transparent(
     ) if repositoryIdentifier == None else OaiIdentifierRename(
         repositoryIdentifier)
     self.addObserver = outside.addObserver
     self.addStrand = outside.addStrand
     self._internalObserverTree = be((Observable(), (
         OaiError(),
         (OaiIdentify(repositoryName=repositoryName,
                      adminEmail=adminEmail,
                      repositoryIdentifier=repositoryIdentifier,
                      fixIdentifyBaseURL=fixIdentifyBaseURL), (outside, )),
         (OaiList(batchSize=batchSize,
                  supportXWait=supportXWait), (OaiRecord(), (outside, ))),
         (OaiGetRecord(), (OaiRecord(), (outside, ))),
         (OaiListMetadataFormats(), (outside, )),
         (OaiListSets(), (outside, )),
     )))
Exemplo n.º 3
0
    def testGetRecordDeletedInRequestedPrefix(self):
        oaijazz = OaiJazz(self.tempdir + '/jazz')
        storage = MultiSequentialStorage(self.tempdir + "/seq-store")
        oairecord = OaiRecord()

        class MyStorage(object):
            def getData(self, identifier, name):
                return 'data'

        oaigetrecord = be((OaiGetRecord(repository=OaiRepository()),
                           (oaijazz, ), (oairecord, (MyStorage(), ))))
        oaijazz.addOaiRecord(identifier='id:0', metadataPrefixes=['A', 'B'])
        oaijazz.deleteOaiRecordInPrefixes(identifier='id:0',
                                          metadataPrefixes=['A'])
        response = oaigetrecord.getRecord(arguments=dict(
            verb=['GetRecord'],
            metadataPrefix=['A'],
            identifier=['id:0'],
        ),
                                          **self.httpkwargs)
        _, body = asString(response).split("\r\n\r\n")
        self.assertEqual(
            'deleted',
            xpathFirst(
                XML(body.encode()),
                '/oai:OAI-PMH/oai:GetRecord/oai:record/oai:header/@status'),
            body)

        response = oaigetrecord.getRecord(arguments=dict(
            verb=['GetRecord'],
            metadataPrefix=['B'],
            identifier=['id:0'],
        ),
                                          **self.httpkwargs)
        _, body = asString(response).split("\r\n\r\n")
        self.assertEqual(
            "data", xpathFirst(XML(body.encode()), '//oai:metadata/text()'))

        response = oaigetrecord.getRecord(arguments=dict(
            verb=['GetRecord'],
            metadataPrefix=['C'],
            identifier=['id:0'],
        ),
                                          **self.httpkwargs)
        _, body = asString(response).split("\r\n\r\n")
        self.assertEqual(
            'cannotDisseminateFormat',
            xpathFirst(XML(body.encode()), '/oai:OAI-PMH/oai:error/@code'))
Exemplo n.º 4
0
    def testGetRecordWithMultiSequentialStorage(self):
        oaijazz = OaiJazz(self.tempdir + '/jazz')
        oaijazz.updateMetadataFormat(prefix="oai_dc", schema="", namespace="")
        storage = MultiSequentialStorage(self.tempdir + "/seq-store")
        oairecord = OaiRecord()
        oaigetrecord = be(
            (OaiGetRecord(repository=OaiRepository()), (oaijazz, ),
             (oairecord, (RetrieveToGetDataAdapter(), (storage, )))))

        oaijazz.addOaiRecord(identifier="id0", metadataPrefixes=['oai_dc'])
        storage.addData(identifier="id0", name="oai_dc", data=b"data01")
        response = oaigetrecord.getRecord(arguments=dict(
            verb=['GetRecord'],
            metadataPrefix=['oai_dc'],
            identifier=['id0'],
        ),
                                          **self.httpkwargs)
        _, body = asString(response).split("\r\n\r\n")
        self.assertEqual(
            "data01",
            xpath(parse(BytesIO(body.encode())), '//oai:metadata')[0].text)
Exemplo n.º 5
0
 def setUpOaiRecord(self, **kwargs):
     self.oaiRecord = OaiRecord(**kwargs)
     self.observer = CallTrace('Observer')
     self.oaiRecord.addObserver(self.observer)
     self.observer.returnValues['provenance'] = (f for f in [])
     self.observer.returnValues['getData'] = '<data/>'
Exemplo n.º 6
0
class OaiRecordTest(SeecrTestCase):
    def setUp(self):
        SeecrTestCase.setUp(self)
        self.setUpOaiRecord()

    def setUpOaiRecord(self, **kwargs):
        self.oaiRecord = OaiRecord(**kwargs)
        self.observer = CallTrace('Observer')
        self.oaiRecord.addObserver(self.observer)
        self.observer.returnValues['provenance'] = (f for f in [])
        self.observer.returnValues['getData'] = '<data/>'

    def testRecord(self):
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None)))
        self.assertEqualsWS("""<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <data/>
</metadata>
</record>""", result)
        self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods])

    def testRecordWithRetrieveData(self):
        def getData(*_, **__):
            raise DeclineMessage()
        def retrieveData(*_, **__):
            raise StopIteration('<retrieved/>')
            yield
        self.observer.methods['retrieveData'] = retrieveData
        self.observer.methods['getData'] = getData
        self.observer.returnValues.pop('getData')
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None)))
        self.assertEqualsWS("""<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <retrieved/>
</metadata>
</record>""", result)
        self.assertEquals([
            "getData(identifier='id', name='oai_dc')",
            "retrieveData(identifier='id', name='oai_dc')",
            "provenance('id')"
        ], [str(m) for m in self.observer.calledMethods])

    def testRecordWithFetchedRecords(self):
        record = MockRecord('id')
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={record.identifier: "<the>data</the>", 'abc': '<some>other data</some>'})))
        self.assertEqualsWS("""<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <the>data</the>
</metadata>
</record>""", result)
        self.assertEquals(["provenance('id')"], [str(m) for m in self.observer.calledMethods])

    def testPreciseDatestamp(self):
        self.setUpOaiRecord(preciseDatestamp=True)
        record = MockRecord('id')
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={record.identifier: "<the>data</the>", 'abc': '<some>other data</some>'})))
        self.assertEqualsWS("""<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00.123Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <the>data</the>
</metadata>
</record>""", result)

    def testRecordIsDeleted(self):
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id', deleted=True), metadataPrefix='oai_dc')))
        self.assertEqualsWS("""<record>
<header status="deleted">
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
</record>""", result)
        self.assertEquals([], [str(m) for m in self.observer.calledMethods])

    def testRecordWithDeleteInSetsSupport(self):
        self.setUpOaiRecord(deleteInSets=True)
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id', sets={'set0', 'set1'}, deletedSets={'set1'}), metadataPrefix='oai_dc')))
        self.assertEqualsWS("""<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec status="deleted">set1</setSpec>
</header>
<metadata><data/></metadata>
</record>""", result)


    def testRecordsWithoutSets(self):
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id', sets=[]), metadataPrefix='oai_dc')))
        self.assertEqualsWS("""<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
</header>
<metadata>
    <data/>
</metadata>
</record>""", result)
        self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods])

    def testRecordWithProvenance(self):
        self.observer.returnValues['provenance'] = (f for f in ['PROV','ENANCE'])
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc')))
        self.assertEqualsWS("""<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <data/>
</metadata>
<about>PROVENANCE</about>
</record>""", result)
        self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods])

    def testDeletedRecordWithProvenance(self):
        self.observer.returnValues['provenance'] = (f for f in ['PROV','ENANCE'])
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id&0', deleted=True), metadataPrefix='oai_dc')))
        self.assertEqualsWS("""<record>
<header status="deleted">
    <identifier>id&amp;0</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
</record>""", result)
        self.assertEquals([], [str(m) for m in self.observer.calledMethods])

    def testRecordForListIdentifiers(self):
        result = ''.join(compose(self.oaiRecord.oaiRecordHeader(record=MockRecord('id'), metadataPrefix='oai_dc', kwarg0="ignored")))
        self.assertEqualsWS("""<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>""", result)
        self.assertEquals([], [str(m) for m in self.observer.calledMethods])

    def testRecordWithRepositoryIdentifier(self):
        self.setUpOaiRecord(repository=OaiRepository(identifier='example.org'))
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=MockRecord('id'), metadataPrefix='oai_dc', fetchedRecords=None)))
        self.assertEqualsWS("""<record>
<header>
    <identifier>oai:example.org:id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <data/>
</metadata>
</record>""", result)
        self.assertEquals(["getData(identifier='id', name='oai_dc')", "provenance('id')"], [str(m) for m in self.observer.calledMethods])

    def testRecordWithFetchedRecordsWithRepositoryIdentifier(self):
        self.setUpOaiRecord(repository=OaiRepository(identifier='example.org'))
        record = MockRecord('id')
        result = ''.join(compose(self.oaiRecord.oaiRecord(record=record, metadataPrefix='oai_dc', fetchedRecords={record.identifier: "<the>data</the>", 'abc': '<some>other data</some>'})))
        self.assertEqualsWS("""<record>
<header>
    <identifier>oai:example.org:id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <the>data</the>
</metadata>
</record>""", result)
        self.assertEquals(["provenance('id')"], [str(m) for m in self.observer.calledMethods])
Exemplo n.º 7
0
 def setUpOaiRecord(self, **kwargs):
     self.oaiRecord = OaiRecord(**kwargs)
     self.observer = CallTrace('Observer')
     self.oaiRecord.addObserver(self.observer)
     self.observer.returnValues['provenance'] = (f for f in [])
     self.observer.returnValues['getData'] = '<data/>'
Exemplo n.º 8
0
class OaiRecordTest(SeecrTestCase):
    def setUp(self):
        SeecrTestCase.setUp(self)
        self.setUpOaiRecord()

    def setUpOaiRecord(self, **kwargs):
        self.oaiRecord = OaiRecord(**kwargs)
        self.observer = CallTrace('Observer')
        self.oaiRecord.addObserver(self.observer)
        self.observer.returnValues['provenance'] = (f for f in [])
        self.observer.returnValues['getData'] = '<data/>'

    def testRecord(self):
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord('id'),
                                         metadataPrefix='oai_dc',
                                         fetchedRecords=None)))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <data/>
</metadata>
</record>""", result)
        self.assertEqual(
            ["getData(identifier='id', name='oai_dc')", "provenance('id')"],
            [str(m) for m in self.observer.calledMethods])

    def testRecordWithRetrieveData(self):
        def getData(*_, **__):
            raise DeclineMessage()

        def retrieveData(*_, **__):
            return '<retrieved/>'
            yield

        self.observer.methods['retrieveData'] = retrieveData
        self.observer.methods['getData'] = getData
        self.observer.returnValues.pop('getData')
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord('id'),
                                         metadataPrefix='oai_dc',
                                         fetchedRecords=None)))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <retrieved/>
</metadata>
</record>""", result)
        self.assertEqual([
            "getData(identifier='id', name='oai_dc')",
            "retrieveData(identifier='id', name='oai_dc')", "provenance('id')"
        ], [str(m) for m in self.observer.calledMethods])

    def testRecordWithFetchedRecords(self):
        record = MockRecord('id')
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=record,
                                         metadataPrefix='oai_dc',
                                         fetchedRecords={
                                             record.identifier:
                                             "<the>data</the>",
                                             'abc': '<some>other data</some>'
                                         })))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <the>data</the>
</metadata>
</record>""", result)
        self.assertEqual(["provenance('id')"],
                         [str(m) for m in self.observer.calledMethods])

    def testPreciseDatestamp(self):
        self.setUpOaiRecord(preciseDatestamp=True)
        record = MockRecord('id')
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=record,
                                         metadataPrefix='oai_dc',
                                         fetchedRecords={
                                             record.identifier:
                                             "<the>data</the>",
                                             'abc': '<some>other data</some>'
                                         })))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00.123Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <the>data</the>
</metadata>
</record>""", result)

    def testRecordIsDeleted(self):
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord('id', deleted=True),
                                         metadataPrefix='oai_dc')))
        self.assertEqualsWS(
            """<record>
<header status="deleted">
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
</record>""", result)
        self.assertEqual([], [str(m) for m in self.observer.calledMethods])

    def testRecordWithDeleteInSetsSupport(self):
        self.setUpOaiRecord(deleteInSets=True)
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord(
                    'id', sets={'set0', 'set1'}, deletedSets={'set1'}),
                                         metadataPrefix='oai_dc')))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec status="deleted">set1</setSpec>
</header>
<metadata><data/></metadata>
</record>""", result)

    def testRecordsWithoutSets(self):
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord('id', sets=[]),
                                         metadataPrefix='oai_dc')))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
</header>
<metadata>
    <data/>
</metadata>
</record>""", result)
        self.assertEqual(
            ["getData(identifier='id', name='oai_dc')", "provenance('id')"],
            [str(m) for m in self.observer.calledMethods])

    def testRecordWithProvenance(self):
        self.observer.returnValues['provenance'] = (
            f for f in ['PROV', 'ENANCE'])
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord('id'),
                                         metadataPrefix='oai_dc')))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <data/>
</metadata>
<about>PROVENANCE</about>
</record>""", result)
        self.assertEqual(
            ["getData(identifier='id', name='oai_dc')", "provenance('id')"],
            [str(m) for m in self.observer.calledMethods])

    def testDeletedRecordWithProvenance(self):
        self.observer.returnValues['provenance'] = (
            f for f in ['PROV', 'ENANCE'])
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord('id&0',
                                                           deleted=True),
                                         metadataPrefix='oai_dc')))
        self.assertEqualsWS(
            """<record>
<header status="deleted">
    <identifier>id&amp;0</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
</record>""", result)
        self.assertEqual([], [str(m) for m in self.observer.calledMethods])

    def testRecordForListIdentifiers(self):
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecordHeader(record=MockRecord('id'),
                                               metadataPrefix='oai_dc',
                                               kwarg0="ignored")))
        self.assertEqualsWS(
            """<header>
    <identifier>id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>""", result)
        self.assertEqual([], [str(m) for m in self.observer.calledMethods])

    def testRecordWithRepositoryIdentifier(self):
        self.setUpOaiRecord(repository=OaiRepository(identifier='example.org'))
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=MockRecord('id'),
                                         metadataPrefix='oai_dc',
                                         fetchedRecords=None)))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>oai:example.org:id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <data/>
</metadata>
</record>""", result)
        self.assertEqual(
            ["getData(identifier='id', name='oai_dc')", "provenance('id')"],
            [str(m) for m in self.observer.calledMethods])

    def testRecordWithFetchedRecordsWithRepositoryIdentifier(self):
        self.setUpOaiRecord(repository=OaiRepository(identifier='example.org'))
        record = MockRecord('id')
        result = ''.join(
            compose(
                self.oaiRecord.oaiRecord(record=record,
                                         metadataPrefix='oai_dc',
                                         fetchedRecords={
                                             record.identifier:
                                             "<the>data</the>",
                                             'abc': '<some>other data</some>'
                                         })))
        self.assertEqualsWS(
            """<record>
<header>
    <identifier>oai:example.org:id</identifier>
    <datestamp>2011-03-25T10:45:00Z</datestamp>
    <setSpec>set0</setSpec>
    <setSpec>set1</setSpec>
</header>
<metadata>
    <the>data</the>
</metadata>
</record>""", result)
        self.assertEqual(["provenance('id')"],
                         [str(m) for m in self.observer.calledMethods])