Skip to main content

Flexible, extensible Python data structures for general usage

Project description

Flexible, extensible Python data structures for general usage. Get data in and out, reliably, without boilerplate and with speed!

middle stands on the shoulders of attrs and aims to be as simple as possible to get data from complex objects to Python primitives and vice-versa, with validators, converters and a lot of sugar! middle can be used with your preferred web framework, background job application, configuration parsing and many others!

>>> from typing import Dict, List
>>> import middle

>>> class Game(middle.Model):
...     name: str = middle.field()
...     score: float = middle.field(minimum=0, maximum=10)
...     resolution_tested: str = middle.field(pattern="^\d+x\d+$")
...     genre: List[str] = middle.field(unique_items=True)
...     rating: Dict[str, float] = middle.field(max_properties=5)

>>> data = {
...     "name": "Cities: Skylines",
...     "score": 9.0,
...     "resolution_tested": "1920x1200",
...     "genre": ["Simulators", "City Building"],
...     "rating": {
...         "IGN": 8.5,
...         "Gamespot": 8.0,
...         "Steam": 4.5
...     }
... }

>>> game = Game(**data)

>>> game
Game(name='Cities: Skylines', score=9.0, resolution_tested='1920x1200', genre=['Simulators', 'City Building'], rating={'IGN': 8.5, 'Gamespot': 8.0, 'Steam': 4.5})

>>> middle.asdict(game)
{'name': 'Cities: Skylines', 'score': 9.0, 'resolution_tested': '1920x1200', 'genre': ['Simulators', 'City Building'], 'rating': {'IGN': 8.5, 'Gamespot': 8.0, 'Steam': 4.5}}

middle is flexible enough to understand Enum, nested models and a large variety of types declared on the typing Python module out of the box. Also, you can extend it to your own classes!

TODO

  • Alias options to populate classes;

  • Read-only and write-only fields;

  • Better error handling (almost everywhere);

  • Lots of documentation;

  • Create a benchmark suite against other solutions;

  • Some formatters are still missing;

Done

  • If possible, fine grain the converters, so a str input value of {} doesn’t end up as str({});

  • Get date and datetime converters to be customizable, instead of an if isinstance statement;

  • Implement more validators and a registerable for more metadata options;

  • Implement a better “type dispatcher” based on more complex rules (other than type(field.type) delivered by functools.singledispatch) because the typing module has changed a bit between Python 3.6 and 3.7;

  • Support more types (typing.Tuple, decimal.Decimal);

  • Get 100% (or closer) in code coverage;

Future discussions

  • In Python 3.7, a neat feature was added: dataclasses. I know it sounds really awesome to not depend on a 3rd-party library - such as attrs, but the latest provides a lot of functionalities that can’t be found on Python 3.7 dataclasses (for now), so I’ll leave this open for further discussion.

Documentation

https://middle.readthedocs.io/en/latest/

Inspiration and Thanks

I really got inspired to create this library by observing a lot of other libraries and tools, specially:

  • attrs: how such a simple library can be such flexible, extendable and fast?

  • cattrs: for its speed on creating attrs instances from dict and to instances again;

  • pydantic: for such pythonic and beautiful approach on creating classes using typing hints;

  • mashmallow: it is one of the most feature rich modelling APIs I’ve seen;

  • apistar: it’s almost magical!

  • Sanic: “Gotta go fast!

  • ionelmc/cookiecutter-pylibrary: The most complete (or interesting) cookiecutter template I found so far (make sure to read this article too);

License

middle is a free software distributed under the MIT license.

Changelog

v0.1.1 on 2018-07-02

  • Add proper unit testing and support for Python 3.6 and 3.7

  • Made the API a bit more flexible

  • Code format and check done with black

v0.1.0 on 2018-06-21

  • First release on PyPI.

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

middle-0.1.1.linux-x86_64.tar.gz (23.8 kB view hashes)

Uploaded Source

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