Skip to main content

prophy: fast data interchange format toolchain

Project description

prophy is a cross-language, cross-platform data interchange format. It has compiler and runtime libraries and is similar in purpose to:

Requirements

  • Python 2.7
  • libclang, at least 3.4
  • Python libclang adapter with corresponding version

Encoding

prophy message wire format differs from other toolchains. There are no field tags, message delimiters and integer packing.

This protobuf message:

message Test {
    required int32 x = 1;
}

with x set to 150 encodes as:

08 96 01

while this prophy message:

#include <stdint.h>
struct Test {
    int32_t x;
};

with x set to 150 encodes as:

96 00 00 00

or:

00 00 00 96

depending on endianness.

prophy ensures that each field in message is aligned. This allows to manipulate message directly in serialized buffer and contributes to encoding speed.

prophy supports integers, enums, arrays and unions.

Sack

One format in which prophy message can be defined is a mix of C language and patches, called sack.

With this definition (test.hpp):

#include <stdint.h>
struct Test {
    uint32_t num_of_x;
    uint32_t x[1];
};

and this patch (patch.txt):

Test dynamic x num_of_x

this command:

prophyc --sack --patch patch.txt --python_out . test.hpp

creates a Python codec (test.py):

import prophy
class Test(prophy.struct):
    __metaclass__ = prophy.struct_generator
    _descriptor = [('num_of_x', prophy.u32),
                   ('x', prophy.array(prophy.u32, bound = 'num_of_x'))]

which can be used in following way:

>>> import test
>>> msg = test.Test()
>>> msg.x[:] = [1, 2]
>>> msg.encode('<')
'\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00'
>>> print x
x: 1
x: 2

Isar

Another format is xml, called isar.

With this definition (test.xml):

<xml>
    <struct name="Test">
        <member name="x" type="u32">
            <dimension isVariableSize="true"/>
        </member>
    </struct>
</xml>

this command:

prophyc --isar --python_out . test.xml

generates identical codec to one from previous example.

Work remaining

Prophy is a work in progress. In order to make it resemble mature frameworks it needs:

  • C/C++ outputs in prophyc compiler,
  • dedicated message definition language as input.

Project details


Release history Release notifications

History Node

1.1.1

History Node

1.1.0

History Node

1.0.2

History Node

1.0.1

History Node

1.0.0

History Node

0.8

History Node

0.7.8

History Node

0.7.7

History Node

0.7.6

History Node

0.7.5

History Node

0.7.4

History Node

0.7.3

History Node

0.7.2

History Node

0.7.1

History Node

0.7

History Node

0.6

History Node

0.5.1

History Node

0.5

History Node

0.4.2

History Node

0.4.1

History Node

0.4

History Node

0.3

This version
History Node

0.2.5

History Node

0.2.4

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
prophy-0.2.5.tar.gz (15.4 kB) Copy SHA256 hash SHA256 Source None Jun 12, 2014

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page