Changeset 658

Show
Ignore:
Timestamp:
10/01/08 12:08:03 (2 months ago)
Author:
mdroe
Message:

Lots of speed and correctness improvements.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/vo/setup.py

    r637 r658  
    88      author_email="mdroe@stsci.edu", 
    99      url="PENDING", 
    10       packages=["vo"], 
    11       scripts=["scripts/votable2recarray"] 
     10      packages=["vo"] 
    1211      ) 
  • trunk/vo/vo/converters.py

    r637 r658  
    169169            return _zero_int 
    170170        encoded = value.encode('utf_16_be') 
    171         return self._write_length(len(encoded)) + encoded 
     171        return self._write_length(len(encoded) / 2) + encoded 
    172172 
    173173    def _binoutput_fixed(self, value): 
  • trunk/vo/vo/tree.py

    r641 r658  
    3636import cStringIO 
    3737import gzip 
     38from operator import attrgetter 
    3839import re 
    3940import urllib2 
     
    214215        self.action = action 
    215216 
    216     def _get_ID(self): return self._ID 
    217217    def _set_ID(self, ID): 
    218218        check_id(ID) 
    219219        self._ID = ID 
    220220    def _del_ID(self): self._ID = None 
    221     ID = property(_get_ID, _set_ID, _del_ID) 
    222  
    223     def _get_content_role(self): return self._content_role 
     221    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
     222 
    224223    def _set_content_role(self, content_role): 
    225224        assert content_role in (None, 'query', 'hints', 'doc', 'location'), \ 
     
    228227    def _del_content_role(self): self._content_role = None 
    229228    content_role = property( 
    230         _get_content_role, _set_content_role, _del_content_role) 
    231  
    232     def _get_content_type(self): return self._content_type 
     229        attrgetter('_content_role'), _set_content_role, _del_content_role) 
     230 
    233231    def _set_content_type(self, content_type): 
    234232        xmlutil.check_mime_content_type(content_type) 
     
    236234    def _del_content_type(self): self._content_type = None 
    237235    content_type = property( 
    238         _get_content_type, _set_content_type, _del_content_type) 
    239  
    240     def _get_href(self): return self._href 
     236        attrgetter('_content_type'), _set_content_type, _del_content_type) 
     237 
    241238    def _set_href(self, href): 
    242239        xmlutil.check_anyuri(href) 
     
    244241    def _del_href(self): self._href = None 
    245242    href = property( 
    246         _get_href, _set_href, _del_href) 
     243        attrgetter('_href'), _set_href, _del_href) 
    247244 
    248245 
     
    274271        self.value = value 
    275272 
    276     def _get_ID(self): return self._ID 
    277273    def _set_ID(self, ID): 
    278274        check_id(ID) 
    279275        self._ID = ID 
    280276    def _del_ID(self): self._ID = None 
    281     ID = property(_get_ID, _set_ID, _del_ID) 
    282  
    283     def _get_name(self): return self._name 
     277    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
     278 
    284279    def _set_name(self, name): 
    285280        assert name is not None, \ 
     
    287282        xmlutil.check_token(name, 'name') 
    288283        self._name = name 
    289     name = property(_get_name, _set_name) 
    290  
    291     def _get_value(self): return self._value 
     284    name = property(attrgetter('_name'), _set_name) 
     285 
    292286    def _set_value(self, value): 
    293287        assert value is not None, \ 
     
    295289        check_string(value, 'value') 
    296290        self._value = value 
    297     value = property(_get_value, _set_value) 
     291    value = property(attrgetter('_value'), _set_value) 
    298292 
    299293 
     
    365359    null = property(_get_null, _set_null) 
    366360 
    367     def _get_ID(self): return self._ID 
    368361    def _set_ID(self, ID): 
    369362        check_id(ID) 
    370363        self._ID = ID 
    371364    def _del_ID(self): self._ID = None 
    372     ID = property(_get_ID, _set_ID, _del_ID) 
    373  
    374     def _get_type(self): return self._type 
     365    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
     366 
    375367    def _set_type(self, type): 
    376368        assert type in ('legal', 'actual'), 'type must be "legal" or "actual"' 
    377369        self._type = type 
    378     type = property(_get_type, _set_type) 
    379  
    380     def _get_ref(self): return self._ref 
     370    type = property(attrgetter('_type'), _set_type) 
     371 
    381372    def _set_ref(self, ref): 
    382373        check_id(ref, 'ref') 
     
    397388        self._ref = ref 
    398389    def _del_ref(self): self._ref = None 
    399     ref = property(_get_ref, _set_ref, _del_ref) 
    400  
    401     def _get_min_inclusive(self): return self._min_inclusive 
     390    ref = property(attrgetter('_ref'), _set_ref, _del_ref) 
     391 
    402392    def _set_min_inclusive(self, inclusive): 
    403393        if inclusive == 'yes': 
     
    409399    def _del_min_inclusive(self): self._min_inclusive = True 
    410400    min_inclusive = property( 
    411         _get_min_inclusive, _set_min_inclusive, _del_min_inclusive) 
    412  
    413     def _get_max_inclusive(self): return self._max_inclusive 
     401        attrgetter('_min_inclusive'), _set_min_inclusive, _del_min_inclusive) 
     402 
    414403    def _set_max_inclusive(self, inclusive): 
    415404        if inclusive == 'yes': 
     
    421410    def _del_max_inclusive(self): self._max_inclusive = True 
    422411    max_inclusive = property( 
    423         _get_max_inclusive, _set_max_inclusive, _del_max_inclusive) 
     412        attrgetter('_max_inclusive'), _set_max_inclusive, _del_max_inclusive) 
    424413 
    425414    def parse(self, iterator, config): 
     
    607596        self.converter = converters.get_converter(self) 
    608597 
    609     def _get_ID(self): return self._ID 
    610598    def _set_ID(self, ID): 
    611599        check_id(ID) 
    612600        self._ID = ID 
    613601    def _del_ID(self): self._ID = None 
    614     ID = property(_get_ID, _set_ID, _del_ID) 
    615  
    616     def _get_name(self): return self._name 
     602    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
     603 
    617604    def _set_name(self, name): 
    618605        xmlutil.check_token(name, 'name') 
    619606        self._name = name 
    620607    def _del_name(self): self._name = None 
    621     name = property(_get_name, _set_name, _del_name) 
    622  
    623     def _get_datatype(self): return self._datatype 
     608    name = property(attrgetter('_name'), _set_name, _del_name) 
     609 
    624610    def _set_datatype(self, datatype): 
    625611        assert datatype is not None, \ 
     
    629615            "Invalid datatype attribute '%s'" % datatype 
    630616        self._datatype = datatype 
    631     datatype = property(_get_datatype, _set_datatype) 
    632  
    633     def _get_precision(self): return self._precision 
     617    datatype = property(attrgetter('_datatype'), _set_datatype) 
     618 
    634619    def _set_precision(self, precision): 
    635620        assert precision is None or re.match("[FE]?[0-9]+", precision), \ 
     
    637622        self._precision = precision 
    638623    def _del_precision(self): self._precision = None 
    639     precision = property(_get_precision, _set_precision, _del_precision) 
    640  
    641     def _get_width(self): return self._width 
     624    precision = property( 
     625        attrgetter('_precision'), _set_precision, _del_precision) 
     626 
    642627    def _set_width(self, width): 
    643628        if width is not None: 
     
    646631        self._width = width 
    647632    def _del_width(self): self._width = width 
    648     width = property(_get_width, _set_width, _del_width) 
     633    width = property(attrgetter('_width'), _set_width, _del_width) 
    649634 
    650635    # ref on FIELD and PARAM behave differently than elsewhere -- here 
    651636    # they're just informational, such as to refer to a coordinate 
    652637    # system. 
    653     def _get_ref(self): return self._ref 
    654638    def _set_ref(self, ref): 
    655639        check_id(ref, 'ref') 
    656640        self._ref = ref 
    657641    def _del_ref(self): self._ref = None 
    658     ref = property(_get_ref, _set_ref, _del_ref) 
    659  
    660     def _get_ucd(self): return self._ucd 
     642    ref = property(attrgetter('_ref'), _set_ref, _del_ref) 
     643 
    661644    def _set_ucd(self, ucd): 
    662645        check_ucd(ucd) 
    663646        self._ucd = ucd 
    664647    def _del_ucd(self): self._ucd = None 
    665     ucd = property(_get_ucd, _set_ucd, _del_ucd) 
    666  
    667     def _get_unit(self): return self._unit 
     648    ucd = property(attrgetter('_ucd'), _set_ucd, _del_ucd) 
     649 
    668650    def _set_unit(self, unit): 
    669651        xmlutil.check_token(unit, 'unit') 
    670652        self._unit = unit 
    671653    def _del_unit(self): self._unit = None 
    672     unit = property(_get_unit, _set_unit, _del_unit) 
    673  
    674     def _get_arraysize(self): return self._arraysize 
     654    unit = property(attrgetter('_unit'), _set_unit, _del_unit) 
     655 
    675656    def _set_arraysize(self, arraysize): 
    676657        assert arraysize is None or \ 
     
    679660        self._arraysize = arraysize 
    680661    def _del_arraysize(self): self._arraysize = None 
    681     arraysize = property(_get_arraysize, _set_arraysize, _del_arraysize) 
    682  
    683     def _get_type(self): return self._type 
     662    arraysize = property( 
     663        attrgetter('_arraysize'), _set_arraysize, _del_arraysize) 
     664 
    684665    def _set_type(self, type): 
    685666        if type is not None: 
     
    688669        self._type = type 
    689670    def _del_type(self): self._type = None 
    690     type = property(_get_type, _set_type, _del_type) 
     671    type = property(attrgetter('_type'), _set_type, _del_type) 
    691672 
    692673    def parse(self, iterator, config): 
     
    771752        self._value = value 
    772753 
    773     def _get_value(self): return self._value 
    774754    def _set_value(self, value): 
    775755        assert value is not None, 'value is required for all PARAM' 
     
    778758        else: 
    779759            self._value = value 
    780     value = property(_get_value, _set_value) 
     760    value = property(attrgetter('_value'), _set_value) 
    781761 
    782762    def _setup(self): 
     
    827807        self.system = system 
    828808 
    829     def _get_ID(self): return self._ID 
    830809    def _set_ID(self, ID): 
    831810        assert ID is not None, "ID is required for COOSYS" 
    832811        check_id(ID) 
    833812        self._ID = ID 
    834     ID = property(_get_ID, _set_ID) 
    835  
    836     def _get_system(self): return self._system 
     813    ID = property(attrgetter('_ID'), _set_ID) 
     814 
    837815    def _set_system(self, system): 
    838816        assert system in ('eq_FK4', 'eq_FK5', 'ICRS', 'ecl_FK4', 'ecl_FK5', 
     
    842820        self._system = system 
    843821    def _del_system(self): self._system = None 
    844     system = property(_get_system, _set_system, _del_system) 
    845  
    846     def _get_equinox(self): return self._equinox 
     822    system = property(attrgetter('_system'), _set_system, _del_system) 
     823 
    847824    def _set_equinox(self, equinox): 
    848825        check_astroyear(equinox) 
    849826        self._equinox = equinox 
    850827    def _del_equinox(self): self._equinox = None 
    851     equinox = property(_get_equinox, _set_equinox, _del_equinox) 
    852  
    853     def _get_epoch(self): return self._epoch 
     828    equinox = property(attrgetter('_equinox'), _set_equinox, _del_equinox) 
     829 
    854830    def _set_epoch(self, epoch): 
    855831        check_astroyear(epoch) 
    856832        self._epoch = epoch 
    857833    def _del_epoch(self): self._epoch = None 
    858     epoch = property(_get_epoch, _set_epoch, _del_epoch) 
     834    epoch = property(attrgetter('_epoch'), _set_epoch, _del_epoch) 
    859835 
    860836 
     
    877853        self.ref = ref 
    878854 
    879     def _get_ref(self): return self._ref 
    880855    def _set_ref(self, ref): 
    881856        check_id(ref, 'ref') 
    882857        self._ref = ref 
    883858    def _del_ref(self): self._ref = None 
    884     ref = property(_get_ref, _set_ref, _del_ref) 
     859    ref = property(attrgetter('_ref'), _set_ref, _del_ref) 
    885860 
    886861    def get_ref(self): 
     
    911886        self.ref = ref 
    912887 
    913     def _get_ref(self): return self._ref 
    914888    def _set_ref(self, ref): 
    915889        check_id(ref, 'ref') 
    916890        self._ref = ref 
    917891    def _del_ref(self): self._ref = None 
    918     ref = property(_get_ref, _set_ref, _del_ref) 
     892    ref = property(attrgetter('_ref'), _set_ref, _del_ref) 
    919893 
    920894    def get_ref(self): 
     
    975949        self.entries = util.HomogeneousList((FieldRef, ParamRef, Group, Param)) 
    976950 
    977     def _get_ID(self): return self._ID 
    978951    def _set_ID(self, ID): 
    979952        check_id(ID) 
    980953        self._ID = ID 
    981954    def _del_ID(self): self._ID = None 
    982     ID = property(_get_ID, _set_ID, _del_ID) 
    983  
    984     def _get_name(self): return self._name 
     955    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
     956 
    985957    def _set_name(self, name): 
    986958        xmlutil.check_token(name, 'name') 
    987959        self._name = name 
    988960    def _del_name(self): self._name = None 
    989     name = property(_get_name, _set_name, _del_name) 
    990  
    991     def _get_ref(self): return self._ref 
     961    name = property(attrgetter('_name'), _set_name, _del_name) 
     962 
    992963    def _set_ref(self, ref): 
    993964        check_id(ref, 'ref') 
    994965        self._ref = ref 
    995966    def _del_ref(self): self._ref = None 
    996     ref = property(_get_ref, _set_ref, _del_ref) 
    997  
    998     def _get_ucd(self): return self._ucd 
     967    ref = property(attrgetter('_ref'), _set_ref, _del_ref) 
     968 
    999969    def _set_ucd(self, ucd): 
    1000970        check_ucd(ucd) 
    1001971        self._ucd = ucd 
    1002972    def _del_ucd(self): self._ucd = None 
    1003     ucd = property(_get_ucd, _set_ucd, _del_ucd) 
     973    ucd = property(attrgetter('_ucd'), _set_ucd, _del_ucd) 
    1004974 
    1005975    def parse(self, iterator, config): 
     
    11731143        self.params = util.HomogeneousList(Param) 
    11741144        self.groups = util.HomogeneousList(Group) 
    1175         self.links = util.HomogeneousList(Link) 
     1145        self.links = util.HomogeneousList(Link) 
    11761146 
    11771147        self.array = np.array([]) 
    11781148        self.mask = np.array([]) 
    11791149 
    1180     def _get_ID(self): return self._ID 
    11811150    def _set_ID(self, ID): 
    11821151        check_id(ID) 
    11831152        self._ID = ID 
    11841153    def _del_ID(self): self._ID = None 
    1185     ID = property(_get_ID, _set_ID, _del_ID) 
    1186  
    1187     def _get_name(self): return self._name 
     1154    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
     1155 
    11881156    def _set_name(self, name): 
    11891157        xmlutil.check_token(name, 'name') 
    11901158        self._name = name 
    11911159    def _del_name(self): self._name = None 
    1192     name = property(_get_name, _set_name, _del_name) 
    1193  
    1194     def _get_ref(self): return self._ref 
     1160    name = property(attrgetter('_name'), _set_name, _del_name) 
     1161 
    11951162    def _set_ref(self, ref): 
    11961163        # When the ref changes, we want to verify that it will work 
     
    12121179        self._ref = ref 
    12131180    def _del_ref(self): self._ref = None 
    1214     ref = property(_get_ref, _set_ref, _del_ref) 
    1215  
    1216     def _get_ucd(self): return self._ucd 
     1181    ref = property(attrgetter('_ref'), _set_ref, _del_ref) 
     1182 
    12171183    def _set_ucd(self, ucd): 
    12181184        check_ucd(ucd) 
    12191185        self._ucd = ucd 
    12201186    def _del_ucd(self): self._ucd = None 
    1221     ucd = property(_get_ucd, _set_ucd, _del_ucd) 
    1222  
    1223     def _get_format(self): return self._format 
     1187    ucd = property(attrgetter('_ucd'), _set_ucd, _del_ucd) 
     1188 
    12241189    def _set_format(self, format): 
    12251190        assert format in ('tabledata', 'binary') 
    12261191        self._format = format 
     1192    format = property(attrgetter('_format'), _set_format) 
    12271193 
    12281194    def parse(self, iterator, config): 
     
    12531219            for event, tag, data in iterator: 
    12541220                if event == 'start': 
    1255                     if tag == 'FIELD': 
    1256                         self.fields.append( 
     1221                    tag_mapping = { 
     1222                        'FIELD': lambda: self.fields.append( 
    12571223                            Field(self._votable, config=config, **data).parse( 
    1258                                 iterator, config)) 
    1259                     elif tag == 'PARAM': 
    1260                         self.params.append( 
     1224                                iterator, config)), 
     1225                        'PARAM': lambda: self.params.append( 
    12611226                            Param(self._votable, config=config, **data).parse( 
    1262                                 iterator, config)) 
    1263                     elif tag == 'GROUP': 
    1264                         self.groups.append( 
    1265                             Group(self, **data).parse(iterator, config)) 
    1266                     elif tag == 'LINK': 
    1267                         self.links.append( 
    1268                             Link(**data).parse(iterator, config)) 
    1269                     elif tag == 'DATA': 
     1227                                iterator, config)), 
     1228                        'GROUP': lambda: self.groups.append( 
     1229                            Group(self, **data).parse(iterator, config)), 
     1230                        'LINK': lambda: self.links.append( 
     1231                            Link(**data).parse(iterator, config)), 
     1232                        'DESCRIPTION': lambda: None 
     1233                        } 
     1234 
     1235                    if tag == 'DATA': 
    12701236                        break 
    1271                     elif tag != 'DESCRIPTION': 
    1272                         warn_or_raise("Unknown tag '%s'. Ignoring" % tag) 
     1237 
     1238                    tag_mapping.get( 
     1239                        tag, 
     1240                        lambda: warn_or_raise("Unknown tag '%s'. Ignoring" % tag))() 
    12731241                elif event == 'end': 
    12741242                    if tag == 'DESCRIPTION': 
     
    13451313                # Parse the entire row into a list of strings 
    13461314 
    1347                 # TODO: Support 'encoding' attribute on TD element 
    13481315                rowdata = [] 
    13491316                binary = False 
    13501317                for event, tag, data in iterator: 
    1351                     if event == 'start' and tag == 'TD': 
    1352                         encoding = data.get('encoding', None) 
    1353                         if encoding == 'base64': 
    1354                             binary = True 
    1355                         else: 
    1356                             binary = False 
     1318                    if event == 'start': 
     1319                        if tag == 'TD': 
     1320                            encoding = data.get('encoding', None) 
     1321                            if encoding == 'base64': 
     1322                                binary = True 
     1323                            else: 
     1324                                binary = False 
     1325                        elif tag != 'TR': 
     1326                            warn_or_raise("Unknown tag '%s'. Ignoring." % tag) 
    13571327                    elif event == 'end': 
    13581328                        if tag == 'TD': 
     
    16791649        self.resources = util.HomogeneousList(Resource) 
    16801650 
    1681     def _get_ID(self): return self._ID 
    16821651    def _set_ID(self, ID): 
    16831652        check_id(ID) 
    16841653        self._ID = ID 
    16851654    def _del_ID(self): self._ID = None 
    1686     ID = property(_get_ID, _set_ID, _del_ID) 
    1687  
    1688     def _get_name(self): return self._name 
     1655    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
     1656 
    16891657    def _set_name(self, name): 
    16901658        xmlutil.check_token(name, 'name') 
    16911659        self._name = name 
    16921660    def _del_name(self): self._name = None 
    1693     name = property(_get_name, _set_name, _del_name) 
    1694  
    1695     def _get_type(self): return self._type 
     1661    name = property(attrgetter('_name'), _set_name, _del_name) 
     1662 
    16961663    def _set_type(self, type): 
    16971664        assert type in ('results', 'meta'), 'type must be "results" or "meta"' 
    16981665        self._type = type 
    1699     type = property(_get_type, _set_type) 
     1666    type = property(attrgetter('_type'), _set_type) 
    17001667 
    17011668    def parse(self, votable, iterator, config): 
    17021669        for event, tag, data in iterator: 
    17031670            if event == 'start': 
    1704                 if tag == 'TABLE': 
    1705                     if self.type == 'meta': 
    1706                         warn_or_raise( 
    1707                             "RESOURCE type is 'meta', but contains data.", 
    1708                             config) 
    1709                     self.tables.append( 
    1710                         Table(votable, **data).parse(iterator, config)) 
    1711                 elif tag == 'INFO': 
    1712                     self.infos.append( 
    1713                         Info(**data).parse(iterator, config)) 
    1714                 elif tag == 'PARAM': 
    1715                     self.params.append( 
     1671                tag_mapping = { 
     1672                    'TABLE': lambda: self.tables.append( 
     1673                        Table(votable, **data).parse(iterator, config)), 
     1674                    'INFO': lambda: self.infos.append( 
     1675                        Info(**data).parse(iterator, config)), 
     1676                    'PARAM': lambda: self.params.append( 
    17161677                        Param(votable, config=config, **data).parse( 
    1717                             iterator, config)) 
    1718                 elif tag == 'COOSYS': 
    1719                     self.coordinate_systems.append( 
    1720                         CooSys(**data).parse(iterator, config)) 
    1721                 elif tag == 'RESOURCE': 
    1722                     self.resources.append( 
    1723                         Resource(**data).parse(votable, iterator, config)) 
    1724                 elif tag == 'LINK': 
    1725                     self.links.append(Link(**data).parse(iterator, config)) 
    1726                 elif tag == 'DESCRIPTION': 
    1727                     pass 
    1728                 else: 
    1729                     warn("Unknown tag '%s' found.  Ignoring." % tag
     1678                            iterator, config)), 
     1679                    'COOSYS': lambda: self.coordinate_systems.append( 
     1680                        CooSys(**data).parse(iterator, config)), 
     1681                    'RESOURCE': lambda: self.resources.append( 
     1682                        Resource(**data).parse(votable, iterator, config)), 
     1683                    'LINK': lambda: self.links.append( 
     1684                        Link(**data).parse(iterator, config)), 
     1685                    'DESCRIPTION': lambda: None 
     1686                    } 
     1687 
     1688                tag_mapping.get( 
     1689                    tag, 
     1690                    lambda: warn("Unknown tag '%s' found.  Ignoring." % tag))(
    17301691            elif event == 'end' and tag == 'DESCRIPTION': 
    17311692                if self.description is not None: 
     
    18361797        self.resources = util.HomogeneousList(Resource) 
    18371798 
    1838     def _get_ID(self): return self._ID 
    18391799    def _set_ID(self, ID): 
    18401800        check_id(ID) 
    18411801        self._ID = ID 
    18421802    def _del_ID(self): self._ID = None 
    1843     ID = property(_get_ID, _set_ID, _del_ID) 
     1803    ID = property(attrgetter('_ID'), _set_ID, _del_ID) 
    18441804 
    18451805    def parse(self, iterator, config): 
     
    18621822        for event, tag, data in iterator: 
    18631823            if event == 'start': 
    1864                 if tag == 'PARAM': 
    1865                     self.params.append( 
     1824                tag_mapping = { 
     1825                    'PARAM': lambda: self.params.append( 
    18661826                        Param(self, config=config, **data).parse( 
    1867                             iterator, config)) 
    1868                 elif tag == 'RESOURCE': 
    1869                     self.resources.append( 
    1870                         Resource(**data).parse(self, iterator, config)) 
    1871                 elif tag == 'COOSYS': 
    1872                     self.coordinate_systems.append( 
    1873                         CooSys(**data).parse(iterator, config)) 
    1874                 elif tag == 'INFO': 
    1875                     self.infos.append(Info(**data).parse(iterator, config)) 
    1876                 elif tag == 'DEFINITIONS': 
    1877                     warn_or_raise( 
     1827                            iterator, config)), 
     1828                    'RESOURCE': lambda: self.resources.append( 
     1829                        Resource(**data).parse( 
     1830                            self, iterator, config)), 
     1831                    'COOSYS': lambda: self.coordinate_systems.append( 
     1832                        CooSys(**data).parse(iterator, config)), 
     1833                    'INFO': lambda: self.infos.append( 
     1834                        Info(**data).parse(iterator, config)), 
     1835                    'DEFINITIONS': lambda: warn_or_raise( 
    18781836                        "The 'DEFINITIONS' element is deprecated in VOTable " + 
    18791837                        "1.1.  Ignoring.", 
    1880                         config) 
    1881                 elif tag == 'DESCRIPTION': 
    1882                     pass 
    1883                 else: 
    1884                     warn_or_raise("Unknown tag '%s' found.  Ignoring." % tag) 
     1838                        config), 
     1839                    'DESCRIPTION': lambda: None 
     1840                    } 
     1841 
     1842                tag_mapping.get( 
     1843                    tag, 
     1844                    lambda: warn_or_raise("Unknown tag '%s' found.  Ignoring." % tag))() 
     1845 
    18851846            elif event == 'end': 
    18861847                if tag == 'DESCRIPTION': 
  • trunk/vo/vo/xmlutil.py

    r637 r658  
    9090 
    9191        def end(self, tag): 
    92             self._queue.append(('end', tag, self._data)) 
    93             self._data = [
     92            self._queue.append(('end', tag, self._data[:])) 
     93            del self._data[:
    9494 
    9595        def start(self, tag, attrs): 
    9696            self._queue.append(('start', tag, attrs or {})) 
    97             self._data = [
     97            del self._data[:
    9898 
    9999    def __init__(self, file, buffersize = 2 ** 10): 
     
    123123def get_xml_iterator(source): 
    124124    """ 
    125     TODO: Document me 
     125    Returns an iterator over the elements of an XML file.  See 
     126    fast_iterparse for more information. 
    126127    """ 
    127128    context = fast_iterparse(source)