Changeset 5550


Ignore:
Timestamp:
03/08/09 16:55:08 (10 years ago)
Author:
pjkersha
Message:

ndg.security.common.utils: fixes to TypedList? and prettyPrint classes. prettyPrint now correctly substitutes namespace prefixes from ElementTree._namespace_map

Location:
TI12-security/trunk/python
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/utils/__init__.py

    r5538 r5550  
    1010__revision__ = '$Id: $' 
    1111try: # python 2.5 
    12     from xml.etree import cElementTree as ElementTree 
     12    from xml.etree import cElementTree, ElementTree 
    1313except ImportError: 
    1414    # if you've installed it yourself it comes this way 
    15     import cElementTree as ElementTree 
     15    import cElementTree, ElementTree 
    1616 
    1717# Fred Lundh's customisation for C14N functionality - egg available from 
     
    8989    return f.getvalue() 
    9090 
    91  
    92 def prettyPrint(elem, indent='', html=0, space=' '*4): 
     91def prettyPrint(*arg, **kw): 
    9392    '''Lightweight pretty printing of ElementTree elements''' 
     93     
     94    # Keep track of namespace declarations made so they're not repeated 
     95    declaredNss = [] 
     96     
    9497    def estrip(elem): 
    9598        ''' Just want to get rid of unwanted whitespace ''' 
     
    97100            return '' 
    98101        else: 
    99             # just in case the elem is another simple type - e.g. int - wrapper 
    100             # it as a string 
     102            # just in case the elem is another simple type - e.g. int -  
     103            # wrapper it as a string 
    101104            return str(elem).strip() 
    102          
    103     strAttrib = ''.join([' %s="%s"'% (att, attVal)  
    104                          for att, attVal in elem.attrib.items()]) 
    105              
    106     result = '%s<%s%s>%s' % (indent, elem.tag, strAttrib, estrip(elem.text)) 
    107      
    108     children = len(elem) 
    109     if children: 
    110         result += ''.join(['\n'+ prettyPrint(item, indent=indent+space)  
    111                            for item in elem]) + \ 
    112                 '\n%s%s</%s>' % (indent, estrip(item.tail), elem.tag) 
    113     else: 
    114         result += '</%s>' % elem.tag 
    115          
    116     return result 
     105 
     106    def _prettyPrint(elem, indent='', html=0, space=' '*4): 
     107        '''Most of the work done in this wrapped function - wrapped so that 
     108        state can be maintained for declared namespace declarations during 
     109        recursive calls using "declaredNss" above'''   
     110        strAttrib = ''.join([' %s="%s"' % (att, attVal)  
     111                             for att, attVal in elem.attrib.items()]) 
     112         
     113        namespace = getNs(elem) 
     114        nsPrefix = ElementTree._namespace_map.get(namespace) 
     115        if nsPrefix is None: 
     116            raise KeyError('prettyPrint: missing namespace "%s" for '  
     117                           'ElementTree._namespace_map' % namespace) 
     118             
     119        tag = "%s:%s" % (nsPrefix, getLocalName(elem)) 
     120         
     121        # Put in namespace declaration if one doesn't already exist 
     122        if namespace in declaredNss: 
     123            nsDeclaration = '' 
     124        else: 
     125            nsDeclaration = ' xmlns:%s="%s"' % (nsPrefix, namespace) 
     126            declaredNss.append(namespace) 
     127             
     128        result = '%s<%s%s%s>%s' % (indent, tag, nsDeclaration, strAttrib,  
     129                                   estrip(elem.text)) 
     130         
     131        children = len(elem) 
     132        if children: 
     133            result += ''.join(['\n'+ _prettyPrint(item, indent=indent+space)  
     134                               for item in elem]) + \ 
     135                    '\n%s%s</%s>' % (indent, estrip(item.tail), tag) 
     136        else: 
     137            result += '</%s>' % tag 
     138             
     139        return result 
     140     
     141    return _prettyPrint(*arg, **kw) 
    117142 
    118143 
     
    143168    """ 
    144169     
    145     def __init__(self, objectType, *arg, **kw): 
     170    def __init__(self, elementType, *arg, **kw): 
    146171        """ 
    147         @type objectType: type/iterable 
    148         @param objectType: object type or types which the list is allowed to 
    149         contain.  If more than one type, pass as a list, tuple or other  
    150         iterable 
     172        @type elementType: type/tuple 
     173        @param elementType: object type or types which the list is allowed to 
     174        contain.  If more than one type, pass as a tuple 
    151175        """ 
    152         self.__objectType = objectType 
     176        self.__elementType = elementType 
    153177        super(TypedList, self).__init__(*arg, **kw) 
    154          
     178     
     179    def _getElementType(self): 
     180        return self.__elementType 
     181     
     182    elementType = property(fget=_getElementType,  
     183                           doc="The allowed type or types for list elements") 
     184      
    155185    def extend(self, iter): 
    156186        for i in iter: 
    157             if not isinstance(i, self.__objectType): 
    158                 raise TypeError("List items must be of type %r" %  
    159                                 self.__objectType) 
     187            if not isinstance(i, self.__elementType): 
     188                raise TypeError("List items must be of type %s" %  
     189                                (self.__elementType,)) 
    160190                 
    161191        return super(TypedList, self).extend(iter) 
     
    163193    def __iadd__(self, iter): 
    164194        for i in iter: 
    165             if not isinstance(i, self.__objectType): 
    166                 raise TypeError("List items must be of type %r" %  
    167                                 self.__objectType) 
     195            if not isinstance(i, self.__elementType): 
     196                raise TypeError("List items must be of type %s" %  
     197                                (self.__elementType,)) 
     198                     
    168199        return super(TypedList, self).__iadd__(iter) 
    169200          
    170201    def append(self, item): 
    171         if not isinstance(item, self.__objectType): 
    172             raise TypeError("List items must be of type %r" % 
    173                             self.__objectType) 
     202        if not isinstance(item, self.__elementType): 
     203                raise TypeError("List items must be of type %s" %  
     204                                (self.__elementType,)) 
     205     
    174206        return super(TypedList, self).append(item) 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/attributeauthority/saml/test_samlinterface.py

    r5538 r5550  
    4343                       [('Content-length', str(len(response))), 
    4444                        ('Content-type', 'text/xml')]) 
    45         return response 
     45        return [response] 
    4646 
    4747         
     
    119119                                 status=200) 
    120120        print response.status 
    121         print response.body 
     121 
     122        from ndg.security.common.utils import prettyPrint 
     123        soapResponse = SOAPEnvelope() 
     124        from cStringIO import StringIO 
     125        responseStream = StringIO() 
     126        responseStream.write(response.body) 
     127        responseStream.seek(0) 
     128        soapResponse.parse(responseStream) 
     129        print "Pretty print..." 
     130        print prettyPrint(soapResponse.elem) 
    122131         
    123132 
Note: See TracChangeset for help on using the changeset viewer.