Changeset 658
- Timestamp:
- 10/01/08 12:08:03 (2 months ago)
- Files:
-
- trunk/vo/setup.py (modified) (1 diff)
- trunk/vo/test/regression.bin.tabledata.truth.xml (added)
- trunk/vo/vo/converters.py (modified) (1 diff)
- trunk/vo/vo/tree.py (modified) (32 diffs)
- trunk/vo/vo/xmlutil.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/vo/setup.py
r637 r658 8 8 author_email="mdroe@stsci.edu", 9 9 url="PENDING", 10 packages=["vo"], 11 scripts=["scripts/votable2recarray"] 10 packages=["vo"] 12 11 ) trunk/vo/vo/converters.py
r637 r658 169 169 return _zero_int 170 170 encoded = value.encode('utf_16_be') 171 return self._write_length(len(encoded) ) + encoded171 return self._write_length(len(encoded) / 2) + encoded 172 172 173 173 def _binoutput_fixed(self, value): trunk/vo/vo/tree.py
r641 r658 36 36 import cStringIO 37 37 import gzip 38 from operator import attrgetter 38 39 import re 39 40 import urllib2 … … 214 215 self.action = action 215 216 216 def _get_ID(self): return self._ID217 217 def _set_ID(self, ID): 218 218 check_id(ID) 219 219 self._ID = ID 220 220 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 224 223 def _set_content_role(self, content_role): 225 224 assert content_role in (None, 'query', 'hints', 'doc', 'location'), \ … … 228 227 def _del_content_role(self): self._content_role = None 229 228 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 233 231 def _set_content_type(self, content_type): 234 232 xmlutil.check_mime_content_type(content_type) … … 236 234 def _del_content_type(self): self._content_type = None 237 235 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 241 238 def _set_href(self, href): 242 239 xmlutil.check_anyuri(href) … … 244 241 def _del_href(self): self._href = None 245 242 href = property( 246 _get_href, _set_href, _del_href)243 attrgetter('_href'), _set_href, _del_href) 247 244 248 245 … … 274 271 self.value = value 275 272 276 def _get_ID(self): return self._ID277 273 def _set_ID(self, ID): 278 274 check_id(ID) 279 275 self._ID = ID 280 276 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 284 279 def _set_name(self, name): 285 280 assert name is not None, \ … … 287 282 xmlutil.check_token(name, 'name') 288 283 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 292 286 def _set_value(self, value): 293 287 assert value is not None, \ … … 295 289 check_string(value, 'value') 296 290 self._value = value 297 value = property( _get_value, _set_value)291 value = property(attrgetter('_value'), _set_value) 298 292 299 293 … … 365 359 null = property(_get_null, _set_null) 366 360 367 def _get_ID(self): return self._ID368 361 def _set_ID(self, ID): 369 362 check_id(ID) 370 363 self._ID = ID 371 364 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 375 367 def _set_type(self, type): 376 368 assert type in ('legal', 'actual'), 'type must be "legal" or "actual"' 377 369 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 381 372 def _set_ref(self, ref): 382 373 check_id(ref, 'ref') … … 397 388 self._ref = ref 398 389 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 402 392 def _set_min_inclusive(self, inclusive): 403 393 if inclusive == 'yes': … … 409 399 def _del_min_inclusive(self): self._min_inclusive = True 410 400 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 414 403 def _set_max_inclusive(self, inclusive): 415 404 if inclusive == 'yes': … … 421 410 def _del_max_inclusive(self): self._max_inclusive = True 422 411 max_inclusive = property( 423 _get_max_inclusive, _set_max_inclusive, _del_max_inclusive)412 attrgetter('_max_inclusive'), _set_max_inclusive, _del_max_inclusive) 424 413 425 414 def parse(self, iterator, config): … … 607 596 self.converter = converters.get_converter(self) 608 597 609 def _get_ID(self): return self._ID610 598 def _set_ID(self, ID): 611 599 check_id(ID) 612 600 self._ID = ID 613 601 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 617 604 def _set_name(self, name): 618 605 xmlutil.check_token(name, 'name') 619 606 self._name = name 620 607 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 624 610 def _set_datatype(self, datatype): 625 611 assert datatype is not None, \ … … 629 615 "Invalid datatype attribute '%s'" % datatype 630 616 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 634 619 def _set_precision(self, precision): 635 620 assert precision is None or re.match("[FE]?[0-9]+", precision), \ … … 637 622 self._precision = precision 638 623 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 642 627 def _set_width(self, width): 643 628 if width is not None: … … 646 631 self._width = width 647 632 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) 649 634 650 635 # ref on FIELD and PARAM behave differently than elsewhere -- here 651 636 # they're just informational, such as to refer to a coordinate 652 637 # system. 653 def _get_ref(self): return self._ref654 638 def _set_ref(self, ref): 655 639 check_id(ref, 'ref') 656 640 self._ref = ref 657 641 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 661 644 def _set_ucd(self, ucd): 662 645 check_ucd(ucd) 663 646 self._ucd = ucd 664 647 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 668 650 def _set_unit(self, unit): 669 651 xmlutil.check_token(unit, 'unit') 670 652 self._unit = unit 671 653 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 675 656 def _set_arraysize(self, arraysize): 676 657 assert arraysize is None or \ … … 679 660 self._arraysize = arraysize 680 661 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 684 665 def _set_type(self, type): 685 666 if type is not None: … … 688 669 self._type = type 689 670 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) 691 672 692 673 def parse(self, iterator, config): … … 771 752 self._value = value 772 753 773 def _get_value(self): return self._value774 754 def _set_value(self, value): 775 755 assert value is not None, 'value is required for all PARAM' … … 778 758 else: 779 759 self._value = value 780 value = property( _get_value, _set_value)760 value = property(attrgetter('_value'), _set_value) 781 761 782 762 def _setup(self): … … 827 807 self.system = system 828 808 829 def _get_ID(self): return self._ID830 809 def _set_ID(self, ID): 831 810 assert ID is not None, "ID is required for COOSYS" 832 811 check_id(ID) 833 812 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 837 815 def _set_system(self, system): 838 816 assert system in ('eq_FK4', 'eq_FK5', 'ICRS', 'ecl_FK4', 'ecl_FK5', … … 842 820 self._system = system 843 821 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 847 824 def _set_equinox(self, equinox): 848 825 check_astroyear(equinox) 849 826 self._equinox = equinox 850 827 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 854 830 def _set_epoch(self, epoch): 855 831 check_astroyear(epoch) 856 832 self._epoch = epoch 857 833 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) 859 835 860 836 … … 877 853 self.ref = ref 878 854 879 def _get_ref(self): return self._ref880 855 def _set_ref(self, ref): 881 856 check_id(ref, 'ref') 882 857 self._ref = ref 883 858 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) 885 860 886 861 def get_ref(self): … … 911 886 self.ref = ref 912 887 913 def _get_ref(self): return self._ref914 888 def _set_ref(self, ref): 915 889 check_id(ref, 'ref') 916 890 self._ref = ref 917 891 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) 919 893 920 894 def get_ref(self): … … 975 949 self.entries = util.HomogeneousList((FieldRef, ParamRef, Group, Param)) 976 950 977 def _get_ID(self): return self._ID978 951 def _set_ID(self, ID): 979 952 check_id(ID) 980 953 self._ID = ID 981 954 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 985 957 def _set_name(self, name): 986 958 xmlutil.check_token(name, 'name') 987 959 self._name = name 988 960 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 992 963 def _set_ref(self, ref): 993 964 check_id(ref, 'ref') 994 965 self._ref = ref 995 966 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 999 969 def _set_ucd(self, ucd): 1000 970 check_ucd(ucd) 1001 971 self._ucd = ucd 1002 972 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) 1004 974 1005 975 def parse(self, iterator, config): … … 1173 1143 self.params = util.HomogeneousList(Param) 1174 1144 self.groups = util.HomogeneousList(Group) 1175 self.links = util.HomogeneousList(Link)1145 self.links = util.HomogeneousList(Link) 1176 1146 1177 1147 self.array = np.array([]) 1178 1148 self.mask = np.array([]) 1179 1149 1180 def _get_ID(self): return self._ID1181 1150 def _set_ID(self, ID): 1182 1151 check_id(ID) 1183 1152 self._ID = ID 1184 1153 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 1188 1156 def _set_name(self, name): 1189 1157 xmlutil.check_token(name, 'name') 1190 1158 self._name = name 1191 1159 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 1195 1162 def _set_ref(self, ref): 1196 1163 # When the ref changes, we want to verify that it will work … … 1212 1179 self._ref = ref 1213 1180 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 1217 1183 def _set_ucd(self, ucd): 1218 1184 check_ucd(ucd) 1219 1185 self._ucd = ucd 1220 1186 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 1224 1189 def _set_format(self, format): 1225 1190 assert format in ('tabledata', 'binary') 1226 1191 self._format = format 1192 format = property(attrgetter('_format'), _set_format) 1227 1193 1228 1194 def parse(self, iterator, config): … … 1253 1219 for event, tag, data in iterator: 1254 1220 if event == 'start': 1255 if tag == 'FIELD':1256 self.fields.append(1221 tag_mapping = { 1222 'FIELD': lambda: self.fields.append( 1257 1223 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( 1261 1226 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': 1270 1236 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))() 1273 1241 elif event == 'end': 1274 1242 if tag == 'DESCRIPTION': … … 1345 1313 # Parse the entire row into a list of strings 1346 1314 1347 # TODO: Support 'encoding' attribute on TD element1348 1315 rowdata = [] 1349 1316 binary = False 1350 1317 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) 1357 1327 elif event == 'end': 1358 1328 if tag == 'TD': … … 1679 1649 self.resources = util.HomogeneousList(Resource) 1680 1650 1681 def _get_ID(self): return self._ID1682 1651 def _set_ID(self, ID): 1683 1652 check_id(ID) 1684 1653 self._ID = ID 1685 1654 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 1689 1657 def _set_name(self, name): 1690 1658 xmlutil.check_token(name, 'name') 1691 1659 self._name = name 1692 1660 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 1696 1663 def _set_type(self, type): 1697 1664 assert type in ('results', 'meta'), 'type must be "results" or "meta"' 1698 1665 self._type = type 1699 type = property( _get_type, _set_type)1666 type = property(attrgetter('_type'), _set_type) 1700 1667 1701 1668 def parse(self, votable, iterator, config): 1702 1669 for event, tag, data in iterator: 1703 1670 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( 1716 1677 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 pass1728 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))() 1730 1691 elif event == 'end' and tag == 'DESCRIPTION': 1731 1692 if self.description is not None: … … 1836 1797 self.resources = util.HomogeneousList(Resource) 1837 1798 1838 def _get_ID(self): return self._ID1839 1799 def _set_ID(self, ID): 1840 1800 check_id(ID) 1841 1801 self._ID = ID 1842 1802 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) 1844 1804 1845 1805 def parse(self, iterator, config): … … 1862 1822 for event, tag, data in iterator: 1863 1823 if event == 'start': 1864 if tag == 'PARAM':1865 self.params.append(1824 tag_mapping = { 1825 'PARAM': lambda: self.params.append( 1866 1826 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( 1878 1836 "The 'DEFINITIONS' element is deprecated in VOTable " + 1879 1837 "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 1885 1846 elif event == 'end': 1886 1847 if tag == 'DESCRIPTION': trunk/vo/vo/xmlutil.py
r637 r658 90 90 91 91 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[:] 94 94 95 95 def start(self, tag, attrs): 96 96 self._queue.append(('start', tag, attrs or {})) 97 self._data = []97 del self._data[:] 98 98 99 99 def __init__(self, file, buffersize = 2 ** 10): … … 123 123 def get_xml_iterator(source): 124 124 """ 125 TODO: Document me 125 Returns an iterator over the elements of an XML file. See 126 fast_iterparse for more information. 126 127 """ 127 128 context = fast_iterparse(source)
