Skip to main content

WTForms/struct integration to validate and serialize to packed buffers of binary data.

Project description

https://img.shields.io/travis/daviddonna/minform.svg http://img.shields.io/pypi/v/minform.svg

The declarative ease of WTForms, the small data footprint of struct.

Why does Minform exist?

Because I wanted to write declarative data schemas, like Google’s protocol buffers, but with a little more power on the Python end.

What can Minform do for me?

Minform can add a lightweight binary protocol to your WTForms forms, or add validation and web form input to your binary protocols.

How does Minform work?

An awful lot like WTForms: you subclass minform.BinaryForm, and add BinaryFields as class properties. Here’s a quick example:

import minform

class MyForm(minform.BinaryForm):
    '''
    This is a subclass of wtforms.Form: you can validate data with it,
    construct it from an HTML form, extract the data as a Python dict, etc.
    '''
    first_name = minform.BytesField('First Name', max_length=10)
    last_name = minform.BytesField('Last Name', max_length=10)
    age = minform.UInt8Field('Age')

#               first_name (10)          last_name (10)           age (1)
packed_data = b'David\x00\x00\x00\x00\x00Donna\x00\x00\x00\x00\x00\x18'
form = MyForm.unpack(packed_data)
assert form.data == {
    'first_name': b'David',
    'last_name': b'Donna',
    'age': 24,
}

next_form = MyForm(first_name=b'Foo', last_name=b'Barsson', age=100)
packed = next_form.pack()
assert packed == b'Foo\x00\x00\x00\x00\x00\x00\x00Barsson\x00\x00\x00\x64'

Because the library is built on struct, binary serializations of a form’s data are in fixed-length buffers. This makes them easier to store, and easy to map onto relatively naive serializations of C structs. It also allows for clear documentation of the binary format, because the data maps predictably onto different positions in a packed buffer.

Compound BinaryFields allow you to create nested structures that still serialize into flat buffers.

class MyBigBadForm(minform.BinaryForm):
    """
    This is taking a turn for campy criminality.
    """
    riches = minforms.Int16Field()
    goons = minform.BinaryFieldList(Person, max_entries=4, length=minform.EXPLICIT)

squad = MyBigBadForm(riches=55223, goons=[
    {'first_name': 'Joey', 'last_name': 'Schmoey', 'age': 32},
    {'first_name': 'Manny', 'last_name': 'The Man', 'age': 40},
    {'first_name': 'Gerta', 'last_name': 'Goethe', 'age': 52},
])
assert squad.pack() == (b'\xd7\xb7' +                                  # riches
                        b'\x03' +                                      # goons prefix
                        b'Joey\0\0\0\0\0\0Schmoey\0\0\0\x32' +         # goons[0]
                        b'Manny\0\0\0\0\0The Man\0\0\0\x40' +          # goons[1]
                        b'Gerta\0\0\0\0\0Goethe\0\0\0\0\x52' +         # goons[2]
                        b'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0') # goons[3]

For more detailed examples, read the full docs at https://minform.readthedocs.org.

History

0.1.0 (10/28/2015)

Initial release

Project details


Download files

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

Source Distribution

minform-0.1.2.tar.gz (25.7 kB view details)

Uploaded Source

File details

Details for the file minform-0.1.2.tar.gz.

File metadata

  • Download URL: minform-0.1.2.tar.gz
  • Upload date:
  • Size: 25.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for minform-0.1.2.tar.gz
Algorithm Hash digest
SHA256 be9d54c35c6ad6db2c9c305eb9329a076777d1ca6427552d869a835bd3a73016
MD5 d6cd1637809c8d841d6811a9355bed13
BLAKE2b-256 ec52b3522adb3963acc4d96f04191bd8465b65e258db3d862b0702ea1440c977

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page