Пример #1
0
    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()
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
    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())
Пример #5
0
    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))
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
    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)
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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')
Пример #12
0
    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)
Пример #13
0
    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)