def test_expando(self): class Author(db.Expando): name = db.StringProperty() class Novel(db.Expando): title = db.StringProperty() author = db.ReferenceProperty(Author) a = Author(name='Jane Austen') a.put() k = str(a.key()) b = Novel(title='Sense and Sensibility', author=a) self.assertEquals(b.author, a) try: encoder = pyamf.get_encoder(pyamf.AMF0) encoder.writeElement(b) self.assertEquals(encoder.stream.getvalue(), '\x03\x00\x04_key\x05\x00\x06author\x03\x00\x04_key\x02%s%s' '\x00\x04name\x02\x00\x0bJane Austen\x00\x00\t\x00\x05title' '\x02\x00\x15Sense and Sensibility\x00\x00\t' % ( struct.pack('>H', len(k)), k)) encoder = pyamf.get_encoder(pyamf.AMF3) encoder.writeElement(b) self.assertEquals(encoder.stream.getvalue(), '\n;\x01\t_key\rauthor\x0btitle\x01\n+\x01\x00\tname\x06%s%s' '\x06\x17Jane Austen\x01\x06+Sense and Sensibility\x01' % ( amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT), k)) # now test with aliases .. pyamf.register_class(Author, 'Author') pyamf.register_class(Novel, 'Novel') encoder = pyamf.get_encoder(pyamf.AMF0) encoder.writeElement(b) self.assertEquals(encoder.stream.getvalue(), '\x10\x00\x05Novel' '\x00\x04_key\x05\x00\x06author\x10\x00\x06Author\x00\x04_key' '\x02%s%s\x00\x04name\x02\x00\x0bJane Austen\x00\x00\t\x00' '\x05title\x02\x00\x15Sense and Sensibility\x00\x00\t' % ( struct.pack('>H', len(k)), k)) encoder = pyamf.get_encoder(pyamf.AMF3) encoder.writeElement(b) self.assertEquals(encoder.stream.getvalue(), '\n;\x0bNovel\t_key\rauthor\x0btitle\x01\n+\rAuthor\x02\tname' '\x06%s%s\x06\x17Jane Austen\x01\x06+Sense and Sensibility' '\x01' % (amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT), k)) finally: a.delete()
def encodeKey(self, key, encoding): """ Returns an AMF encoded representation of a L{db.Key} instance. @param key: The L{db.Key} to be encoded. @type key: L{db.Key} @param encoding: The AMF version. """ if hasattr(key, 'key'): # we have a db.Model instance try: key = key.key() except db.NotSavedError: key = None if not key: # the AMF representation of None if encoding == pyamf.AMF3: return '\x01' return '\x05' k = str(key) if encoding == pyamf.AMF3: return '\x06%s%s' % ( amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT), k) return '\x02%s%s' % (struct.pack('>H', len(k)), k)
def test_amf3(self): d = pyamf.get_decoder(pyamf.AMF3) b = d.stream b.write('\n\x0b\x07Pet\tname\x06\x0fJessica\t_key\x06%s%s\x13birthdate' '\x08\x01B^\xc4\xae\xaa\x00\x00\x00!weight_in_pounds\x04\x05\x07' 'foo\x06\x07bar\ttype\x06\x07cat%%spayed_or_neutered\x02\x01' % ( amf3.encode_int(len(self.key) << 1 | amf3.REFERENCE_BIT), self.key)) b.seek(0) x = d.readElement() self.assertTrue(isinstance(x, PetExpando)) self.assertEquals(x.__class__, PetExpando) self.assertEquals(x.type, self.jessica.type) self.assertEquals(x.weight_in_pounds, self.jessica.weight_in_pounds) self.assertEquals(x.birthdate, datetime.date(1986, 10, 2)) self.assertEquals(x.spayed_or_neutered, self.jessica.spayed_or_neutered) # now check db.Expando internals self.assertEquals(x.key(), self.jessica.key()) self.assertEquals(x.kind(), self.jessica.kind()) self.assertEquals(x.parent(), self.jessica.parent()) self.assertEquals(x.parent_key(), self.jessica.parent_key()) self.assertTrue(x.is_saved())
def test_save_amf3(self): self.jessica.put() k = str(self.jessica.key()) encoder = pyamf.get_encoder(pyamf.AMF3) encoder.writeElement(self.jessica) self.assertEquals(encoder.stream.getvalue(), '\nk\x01\t_key\x13birthdate\tname%%spayed_or_neutered\ttype!' 'weight_in_pounds\x06%s%s\x08\x01B^\xc4\xae\xaa\x00\x00\x00\x06' '\x0fJessica\x02\x06\x07cat\x04\x05\x01' % ( amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT), k))
def test_expando(self): class Author(db.Expando): name = db.StringProperty() class Novel(db.Expando): title = db.StringProperty() author = db.ReferenceProperty(Author) a = Author(name='Jane Austen') self.put(a) k = str(a.key()) amf0_k = struct.pack('>H', len(k)) + k amf3_k = amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT) + k b = Novel(title='Sense and Sensibility', author=a) self.assertIdentical(b.author, a) bytes = ('\x03', ('\x00\x05title\x02\x00\x15Sense and Sensibility', '\x00\x04_key\x02' + amf0_k, '\x00\x06author\x03', ('\x00\x04name\x02\x00\x0bJane Austen', '\x00\x04_key\x05'), '\x00\x00\t'), '\x00\x00\t') self.assertEncodes(b, bytes, encoding=pyamf.AMF0) bytes = ('\n\x0b\x01', (('\rauthor\n\x0b\x01', ('\t_key\x06' + amf3_k, '\tname\x06\x17Jane Austen\x01'), '\x02\x01'), '\x0btitle\x06+Sense and Sensibility'), '\x01') self.assertEncodes(b, bytes, encoding=pyamf.AMF3) # now test with aliases .. pyamf.register_class(Author, 'Author') pyamf.register_class(Novel, 'Novel') bytes = ('\x10\x00\x05Novel', ('\x00\x05title\x02\x00\x15Sense and Sensibility', '\x00\x04_key\x02' + amf0_k, '\x00\x06author\x10\x00\x06Author', ('\x00\x04name\x02\x00\x0bJane Austen', '\x00\x04_key\x05'), '\x00\x00\t'), '\x00\x00\t') self.assertEncodes(b, bytes, encoding=pyamf.AMF0) bytes = ('\n\x0b\x0bNovel', (('\rauthor\n\x0b\rAuthor', ('\t_key\x06' + amf3_k, '\tname\x06\x17Jane Austen\x01'), '\x06\x01'), '\x0btitle\x06+Sense and Sensibility'), '\x01') self.assertEncodes(b, bytes, encoding=pyamf.AMF3)
def test_amf3(self): encoded_key = '%s%s' % ( amf3.encode_int(len(self.key) << 1 | amf3.REFERENCE_BIT), self.key) bytes = ( '\n\x0b\x07Pet\tname\x06\x0fJessica\t_key\x06%s\x13birthdate' '\x08\x01B^\xc4\xae\xaa\x00\x00\x00!weight_in_pounds\x04\x05\x07' 'foo\x06\x07bar\ttype\x06\x07cat%%spayed_or_neutered\x02\x01' % ( encoded_key)) x = self.decode(bytes, encoding=pyamf.AMF3) self._check_model(x)
def test_amf3(self): encoded_key = '%s%s' % ( amf3.encode_int(len(self.key) << 1 | amf3.REFERENCE_BIT), self.key) bytes = ( '\n\x0b\x07Pet\tname\x06\x0fJessica\t_key\x06%s\x13birthdate' '\x08\x01B^\xc4\xae\xaa\x00\x00\x00!weight_in_pounds\x04\x05\x07' 'foo\x06\x07bar\ttype\x06\x07cat%%spayed_or_neutered\x02\x01' % (encoded_key)) x = self.decode(bytes, encoding=pyamf.AMF3) self._check_model(x)
def test_save_amf3(self): self.put(self.jessica) k = str(self.jessica.key()) encoded_key = '%s%s' % ( amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT), k) bytes = ('\n\x0b\x01', ('\tname\x06\x0fJessica', '\t_key\x06%s' % encoded_key, '\x13birthdate\x08\x01B^\xc4\xae\xaa\x00\x00\x00', '!weight_in_pounds\x04\x05', '\x07foo\x06\x07bar', '\ttype\x06\x07cat', '%spayed_or_neutered\x02\x01')) self.assertEncodes(self.jessica, bytes, encoding=pyamf.AMF3)
def test_save_amf3(self): self.put(self.jessica) k = str(self.jessica.key()) encoded_key = '%s%s' % (amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT), k) bytes = ( '\n\x0b\x01', ( '\tname\x06\x0fJessica', '\t_key\x06%s' % encoded_key, '\x13birthdate\x08\x01B^\xc4\xae\xaa\x00\x00\x00', '!weight_in_pounds\x04\x05', '\ttype\x06\x07cat', '%spayed_or_neutered\x02\x01' )) self.assertEncodes(self.jessica, bytes, encoding=pyamf.AMF3)
def test_amf3(self): encoder = pyamf.get_encoder(pyamf.AMF3) context = encoder.context stream = encoder.stream s = str(self.jessica.key()) self.assertFalse(hasattr(context, 'gae_objects')) encoder.writeObject(self.jessica) self.assertTrue(hasattr(context, 'gae_objects')) self.assertEquals(context.gae_objects, {PetModel: {s: self.jessica}}) self.assertEquals(stream.getvalue(), '\nk\x01\t_key\x13birthdate\t' 'name%%spayed_or_neutered\ttype!weight_in_pounds\x06%s%s\x08\x01' 'B^\xc4\xae\xaa\x00\x00\x00\x06\x0fJessica\x02\x06\x07cat\x04' '\x05\x01' % (amf3.encode_int(len(s) << 1 | amf3.REFERENCE_BIT), s)) stream.truncate() encoder.writeObject(self.jessica2) self.assertTrue(hasattr(context, 'gae_objects')) self.assertEquals(context.gae_objects, {PetModel: {s: self.jessica}}) self.assertEquals(stream.getvalue(), '\n\x00')
def test_expando(self): class Author(db.Expando): name = db.StringProperty() class Novel(db.Expando): title = db.StringProperty() author = db.ReferenceProperty(Author) a = Author(name='Jane Austen') self.put(a) k = str(a.key()) amf0_k = struct.pack('>H', len(k)) + k amf3_k = amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT) + k b = Novel(title='Sense and Sensibility', author=a) self.assertIdentical(b.author, a) bytes = ( '\x03', ( '\x00\x05title\x02\x00\x15Sense and Sensibility', '\x00\x04_key\x02' + amf0_k, '\x00\x06author\x03', ( '\x00\x04name\x02\x00\x0bJane Austen', '\x00\x04_key\x05' ), '\x00\x00\t' ), '\x00\x00\t') self.assertEncodes(b, bytes, encoding=pyamf.AMF0) bytes = ( '\n\x0b\x01', (( '\rauthor\n\x0b\x01', ( '\t_key\x06' + amf3_k, '\tname\x06\x17Jane Austen\x01' ), '\x02\x01'), '\x0btitle\x06+Sense and Sensibility' ), '\x01') self.assertEncodes(b, bytes, encoding=pyamf.AMF3) # now test with aliases .. pyamf.register_class(Author, 'Author') pyamf.register_class(Novel, 'Novel') bytes = ( '\x10\x00\x05Novel', ( '\x00\x05title\x02\x00\x15Sense and Sensibility', '\x00\x04_key\x02' + amf0_k, '\x00\x06author\x10\x00\x06Author', ( '\x00\x04name\x02\x00\x0bJane Austen', '\x00\x04_key\x05' ), '\x00\x00\t' ), '\x00\x00\t') self.assertEncodes(b, bytes, encoding=pyamf.AMF0) bytes = ( '\n\x0b\x0bNovel', (( '\rauthor\n\x0b\rAuthor', ( '\t_key\x06' + amf3_k, '\tname\x06\x17Jane Austen\x01' ), '\x06\x01'), '\x0btitle\x06+Sense and Sensibility' ), '\x01') self.assertEncodes(b, bytes, encoding=pyamf.AMF3)
def test_expando(self): class Author(db.Expando): name = db.StringProperty() class Novel(db.Expando): title = db.StringProperty() author = db.ReferenceProperty(Author) a = Author(name="Jane Austen") a.put() k = str(a.key()) amf0_k = struct.pack(">H", len(k)) + k amf3_k = amf3.encode_int(len(k) << 1 | amf3.REFERENCE_BIT) + k b = Novel(title="Sense and Sensibility", author=a) self.assertIdentical(b.author, a) bytes = ( "\x03", ( "\x00\x05title\x02\x00\x15Sense and Sensibility", "\x00\x04_key\x02" + amf0_k, "\x00\x06author\x03", ("\x00\x04name\x02\x00\x0bJane Austen", "\x00\x04_key\x05"), "\x00\x00\t", ), "\x00\x00\t", ) self.assertEncodes(b, bytes, encoding=pyamf.AMF0) bytes = ( "\n\x0b\x01", ( ("\rauthor\n\x0b\x01", ("\t_key\x06" + amf3_k, "\tname\x06\x17Jane Austen\x01"), "\x02\x01"), "\x0btitle\x06+Sense and Sensibility", ), "\x01", ) self.assertEncodes(b, bytes, encoding=pyamf.AMF3) # now test with aliases .. pyamf.register_class(Author, "Author") pyamf.register_class(Novel, "Novel") bytes = ( "\x10\x00\x05Novel", ( "\x00\x05title\x02\x00\x15Sense and Sensibility", "\x00\x04_key\x02" + amf0_k, "\x00\x06author\x10\x00\x06Author", ("\x00\x04name\x02\x00\x0bJane Austen", "\x00\x04_key\x05"), "\x00\x00\t", ), "\x00\x00\t", ) self.assertEncodes(b, bytes, encoding=pyamf.AMF0) bytes = ( "\n\x0b\x0bNovel", ( ("\rauthor\n\x0b\rAuthor", ("\t_key\x06" + amf3_k, "\tname\x06\x17Jane Austen\x01"), "\x06\x01"), "\x0btitle\x06+Sense and Sensibility", ), "\x01", ) self.assertEncodes(b, bytes, encoding=pyamf.AMF3)