def testTooMany(self): class A(Object): m = List.T(Int.T()) xmltagname = 'a' a = A(m=[1, 2, 3]) class A(Object): m = Int.T() xmltagname = 'a' with self.assertRaises(ArgumentError): load_xml_string(a.dump_xml())
def testSObject(self): class DotName(SObject): network = String.T() station = String.T() def __init__(self, s=None, **kwargs): if s is not None: network, station = s.split('.') kwargs = dict(network=network, station=station) SObject.__init__(self, **kwargs) def __str__(self): return '.'.join((self.network, self.station)) class X(Object): xmltagname = 'root' dn = DotName.T() x = X(dn=DotName(network='abc', station='def')) self.assertEqual(x.dn.network, 'abc') self.assertEqual(x.dn.station, 'def') x = load_string(dump(x)) self.assertEqual(x.dn.network, 'abc') self.assertEqual(x.dn.station, 'def') x = load_xml_string(dump_xml(x)) self.assertEqual(x.dn.network, 'abc') self.assertEqual(x.dn.station, 'def')
def testArray(self): from pyrocko.guts_array import Array import numpy as num shapes = [(None,), (1,), (10,), (1000,)] for shape in shapes: for serialize_as in ('base64', 'table', 'npy', 'base64+meta'): class A(Object): xmltagname = 'aroot' arr = Array.T( shape=shape, dtype=num.int, serialize_as=serialize_as, serialize_dtype='>i8') n = shape[0] or 10 a = A(arr=num.arange(n, dtype=num.int)) b = load_string(a.dump()) self.assertTrue(num.all(a.arr == b.arr)) if serialize_as != 'base64+meta': b = load_xml_string(a.dump_xml()) self.assertTrue(num.all(a.arr == b.arr)) if shape[0] is not None: with self.assertRaises(ValidationError): a = A(arr=num.arange(n+10, dtype=num.int)) a.validate() for s0 in [None, 2, 10]: for s1 in [None, 2, 10]: class A(Object): xmltagname = 'aroot' arr = Array.T( shape=(s0, s1), dtype=num.int) n0 = s0 or 100 n1 = s1 or 100 a = A(arr=num.arange(n0*n1, dtype=num.int).reshape((n0, n1))) b = load_string(a.dump()) self.assertTrue(num.all(a.arr == b.arr)) b = load_xml_string(a.dump_xml()) self.assertTrue(num.all(a.arr == b.arr))
def testArray(self): from pyrocko.guts_array import Array import numpy as num shapes = [(None,), (1,), (10,), (1000,)] for shape in shapes: for serialize_as in ('base64', 'table'): class A(Object): xmltagname = 'aroot' arr = Array.T( shape=shape, dtype=num.int, serialize_as=serialize_as, serialize_dtype='>i8') n = shape[0] or 1000 a = A(arr=num.arange(n, dtype=num.int)) b = load_string(a.dump()) self.assertTrue(num.all(a.arr == b.arr)) b = load_xml_string(a.dump_xml()) self.assertTrue(num.all(a.arr == b.arr)) if shape[0] is not None: with self.assertRaises(ValidationError): a = A(arr=num.arange(n+10, dtype=num.int)) a.validate() for s0 in [None, 2, 10]: for s1 in [None, 2, 10]: class A(Object): xmltagname = 'aroot' arr = Array.T( shape=(s0, s1), dtype=num.int) n0 = s0 or 100 n1 = s1 or 100 a = A(arr=num.arange(n0*n1, dtype=num.int).reshape((n0, n1))) b = load_string(a.dump()) self.assertTrue(num.all(a.arr == b.arr)) b = load_xml_string(a.dump_xml()) self.assertTrue(num.all(a.arr == b.arr))
def testContentStyleXML(self): class Duration(Object): unit = String.T(optional=True, xmlstyle='attribute') uncertainty = Float.T(optional=True) value = Float.T(optional=True, xmlstyle='content') xmltagname = 'duration' s = '<duration unit="s"><uncertainty>1.0</uncertainty>10.5</duration>' dur = load_xml_string(s) self.assertEqual(dur.value, float('10.5')) self.assertEqual(dur.unit, 's') self.assertEqual(dur.uncertainty, float('1.0')) self.assertEqual(re.sub(r'\n\s*', '', dur.dump_xml()), s)
def basicTypeTest(self): class X(Object): a = Type.T() b = Type.T(optional=True) c = Type.T(default=sample) d = List.T(Type.T()) e = Tuple.T(1, Type.T()) xmltagname = 'x' x = X(a=sample_in, e=(sample_in,)) x.d.append(sample_in) if sample_in is not sample: with self.assertRaises(ValidationError): x.validate() x.validate(regularize=sample_in is not sample) self.assertEqualNanAware(sample, x.a) if not xml: x2 = load_string(x.dump()) else: x2 = load_xml_string(x.dump_xml()) self.assertEqualNanAware(x.a, x2.a) self.assertIsNone(x.b) self.assertIsNone(x2.b) self.assertEqualNanAware(sample, x.c) self.assertEqualNanAware(sample, x2.c) self.assertTrue(isinstance(x.d, list)) self.assertTrue(isinstance(x2.d, list)) self.assertEqualNanAware(x.d[0], sample) self.assertEqualNanAware(x2.d[0], sample) self.assertEqual(len(x.d), 1) self.assertEqual(len(x2.d), 1) self.assertTrue(isinstance(x.e, tuple)) self.assertTrue(isinstance(x2.e, tuple)) self.assertEqualNanAware(x.e[0], sample) self.assertEqualNanAware(x2.e[0], sample) self.assertEqual(len(x.e), 1) self.assertEqual(len(x2.e), 1)
def testUnion(self): class X1(Object): xmltagname = 'root' m = Union.T(members=[Int.T(), StringChoice.T(['small', 'large'])]) class U(Union): members = [Int.T(), StringChoice.T(['small', 'large'])] class X2(Object): xmltagname = 'root' m = U.T() for X in [X1, X2]: X = X1 x1 = X(m='1') with self.assertRaises(ValidationError): x1.validate() x1.validate(regularize=True) self.assertEqual(x1.m, 1) x2 = X(m='small') x2.validate() x3 = X(m='fail!') with self.assertRaises(ValidationError): x3.validate() with self.assertRaises(ValidationError): x3.validate(regularize=True) for x in [x1, x2]: y = load_string(x.dump()) self.assertEqual(x.m, y.m) for x in [x1, x2]: y = load_xml_string(x.dump_xml()) self.assertEqual(x.m, y.m)
def testPO(self): class SKU(StringPattern): pattern = '\\d{3}-[A-Z]{2}' class Comment(String): xmltagname = 'comment' class Quantity(Int): pass class USAddress(Object): country = String.T( default='US', optional=True, xmlstyle='attribute') name = String.T() street = String.T() city = String.T() state = String.T() zip = Float.T() class Item(Object): part_num = SKU.T(xmlstyle='attribute') product_name = String.T() quantity = Quantity.T() us_price = Float.T(xmltagname='USPrice') comment = Comment.T(optional=True) ship_date = DateTimestamp.T(optional=True) class Items(Object): item_list = List.T(Item.T()) class PurchaseOrderType(Object): order_date = DateTimestamp.T(optional=True, xmlstyle='attribute') ship_to = USAddress.T() bill_to = USAddress.T() comment = Comment.T(optional=True) items = Items.T() class PurchaseOrder(PurchaseOrderType): xmltagname = 'purchaseOrder' xml = '''<?xml version="1.0"?> <purchaseOrder orderDate="1999-10-20"> <shipTo country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Mill Valley</city> <state>CA</state> <zip>90952</zip> </shipTo> <billTo country="US"> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Old Town</city> <state>PA</state> <zip>95819</zip> </billTo> <comment>Hurry, my lawn is going wild</comment> <items> <item partNum="872-AA"> <productName>Lawnmower</productName> <quantity>1</quantity> <USPrice>148.95</USPrice> <comment>Confirm this is electric</comment> </item> <item partNum="926-AA"> <productName>Baby Monitor</productName> <quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>1999-05-21</shipDate> </item> </items> </purchaseOrder> ''' po1 = load_xml_string(xml) po2 = load_xml_string(po1.dump_xml()) for (path1, obj1), (path2, obj2) in zip(walk(po1), walk(po2)): assert path1 == path2 assert path_to_str(path1) == path_to_str(path2) assert type(obj1) is type(obj2) if not isinstance(obj1, Object): assert obj1 == obj2 for _ in zip_walk(po1): pass self.assertEqual(po1.dump(), po2.dump())
def testPO(self): class SKU(StringPattern): pattern = '\\d{3}-[A-Z]{2}' class Comment(String): xmltagname = 'comment' class Quantity(Int): pass class USAddress(Object): country = String.T( default='US', optional=True, xmlstyle='attribute') name = String.T() street = String.T() city = String.T() state = String.T() zip = Float.T() class Item(Object): part_num = SKU.T(xmlstyle='attribute') product_name = String.T() quantity = Quantity.T() us_price = Float.T(xmltagname='USPrice') comment = Comment.T(optional=True) ship_date = DateTimestamp.T(optional=True) class Items(Object): item_list = List.T(Item.T()) class PurchaseOrderType(Object): order_date = DateTimestamp.T(optional=True, xmlstyle='attribute') ship_to = USAddress.T() bill_to = USAddress.T() comment = Comment.T(optional=True) items = Items.T() class PurchaseOrder(PurchaseOrderType): xmltagname = 'purchaseOrder' xml = '''<?xml version="1.0"?> <purchaseOrder orderDate="1999-10-20"> <shipTo country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Mill Valley</city> <state>CA</state> <zip>90952</zip> </shipTo> <billTo country="US"> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Old Town</city> <state>PA</state> <zip>95819</zip> </billTo> <comment>Hurry, my lawn is going wild</comment> <items> <item partNum="872-AA"> <productName>Lawnmower</productName> <quantity>1</quantity> <USPrice>148.95</USPrice> <comment>Confirm this is electric</comment> </item> <item partNum="926-AA"> <productName>Baby Monitor</productName> <quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>1999-05-21</shipDate> </item> </items> </purchaseOrder> ''' po1 = load_xml_string(xml) po2 = load_xml_string(po1.dump_xml()) self.assertEqual(po1.dump(), po2.dump())