[pyoai][Emiliano D'Alterio] Merged GIT pull request #6 (https://...

[email protected] Thu, 03 Oct 2013 12:11:04 +0200
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Emiliano D'Alterio
date:      Thu Oct 03 12:11:00 2013 +0200
revision:  162:ca55d79083e3 in pyoai
branch:    
details:   https://hg.infrae.com/pyoai?cmd=changeset;node=ca55d79083e3
modified:  src/oaipmh/client.py src/oaipmh/common.py src/oaipmh/metadata.py
added:     
removed:   
log:       Merged GIT pull request #6 (https://github.com/infrae/pyoai/pull/6).


diffstat:

 src/oaipmh/client.py   |  27 +++++++++++++++++----------
 src/oaipmh/common.py   |  18 +++++++++++++-----
 src/oaipmh/metadata.py |   2 +-
 3 files changed, 31 insertions(+), 16 deletions(-)

diffs (120 lines):

diff -r 2056f88f5365 -r ca55d79083e3 src/oaipmh/client.py
--- a/src/oaipmh/client.py	Wed Aug 28 13:13:04 2013 +0200
+++ b/src/oaipmh/client.py	Thu Oct 03 12:11:00 2013 +0200
@@ -8,6 +8,7 @@
 from types import SliceType
 from lxml import etree
 import time
+import codecs
 
 from oaipmh import common, metadata, validation, error
 from oaipmh.datestamp import datestamp_to_datetime, datetime_to_datestamp
@@ -299,24 +300,30 @@
     
 class Client(BaseClient):
     def __init__(
-            self, base_url, metadata_registry=None, credentials=None):
+            self, base_url, metadata_registry=None, credentials=None, local_file=False):
         BaseClient.__init__(self, metadata_registry)
         self._base_url = base_url
+        self._local_file = local_file
         if credentials is not None:
             self._credentials = base64.encodestring('%s:%s' % credentials)
         else:
             self._credentials = None
             
     def makeRequest(self, **kw):
-        """Actually retrieve XML from the server.
+        """Either load a local XML file or actually retrieve XML from a server.
         """
-        # XXX include From header?
-        headers = {'User-Agent': 'pyoai'}
-        if self._credentials is not None:
-            headers['Authorization'] = 'Basic ' + self._credentials.strip()
-        request = urllib2.Request(
-            self._base_url, data=urlencode(kw), headers=headers)
-        return retrieveFromUrlWaiting(request)
+        if self._local_file:
+            with codecs.open(self._base_url, 'r', 'utf-8') as xmlfile:
+                text = xmlfile.read()
+            return text.encode('ascii', 'replace')
+        else:
+            # XXX include From header?
+            headers = {'User-Agent': 'pyoai'}
+            if self._credentials is not None:
+                headers['Authorization'] = 'Basic ' + self._credentials.strip()
+            request = urllib2.Request(
+                self._base_url, data=urlencode(kw), headers=headers)
+            return retrieveFromUrlWaiting(request)
 
 def buildHeader(header_node, namespaces):
     e = etree.XPathEvaluator(header_node, 
@@ -326,7 +333,7 @@
         str(e('string(oai:datestamp/text())')))
     setspec = [str(s) for s in e('oai:setSpec/text()')]
     deleted = e("@status = 'deleted'") 
-    return common.Header(identifier, datestamp, setspec, deleted)
+    return common.Header(header_node, identifier, datestamp, setspec, deleted)
 
 def ResumptionListGenerator(firstBatch, nextBatch):
     result, token = firstBatch()
diff -r 2056f88f5365 -r ca55d79083e3 src/oaipmh/common.py
--- a/src/oaipmh/common.py	Wed Aug 28 13:13:04 2013 +0200
+++ b/src/oaipmh/common.py	Thu Oct 03 12:11:00 2013 +0200
@@ -3,7 +3,8 @@
 from oaipmh import error
 
 class Header(object):
-    def __init__(self, identifier, datestamp, setspec, deleted):
+    def __init__(self, element, identifier, datestamp, setspec, deleted):
+        self._element = element
         # force identifier to be a string, it might be 
         # an lxml.etree._ElementStringResult...
         try:
@@ -13,10 +14,13 @@
         self._datestamp = datestamp
         self._setspec = setspec
         self._deleted = deleted
-        
+
+    def element(self):
+        return self._element
+
     def identifier(self):
         return self._identifier
-    
+
     def datestamp(self):
         return self._datestamp
 
@@ -27,12 +31,16 @@
         return self._deleted
 
 class Metadata(object):
-    def __init__(self, map):
+    def __init__(self, element, map):
+        self._element = element
         self._map = map
 
+    def element(self):
+        return self._element
+
     def getMap(self):
         return self._map
-    
+
     def getField(self, name):
         return self._map[name]
 
diff -r 2056f88f5365 -r ca55d79083e3 src/oaipmh/metadata.py
--- a/src/oaipmh/metadata.py	Wed Aug 28 13:13:04 2013 +0200
+++ b/src/oaipmh/metadata.py	Thu Oct 03 12:11:00 2013 +0200
@@ -80,7 +80,7 @@
             else:
                 raise Error, "Unknown field type: %s" % field_type
             map[field_name] = value
-        return common.Metadata(map)
+        return common.Metadata(element, map)
 
 oai_dc_reader = MetadataReader(
     fields={