Skip to main content

Data handling made easy

Project description

Simple Model

https://badge.fury.io/py/pysimplemodel.svg https://img.shields.io/badge/python-3.6-blue.svg https://img.shields.io/github/license/lamenezes/simple-model.svg https://travis-ci.org/lamenezes/simple-model.svg?branch=master https://coveralls.io/repos/github/lamenezes/simple-model/badge.svg?branch=master

SimpleModel offers a simple way to handle data using classes instead of a plenty of lists and dicts.

It has simple objectives:

  • Define your fields easily (just a tuple, nor dicts or instances of type classes whatever)

  • Support for field validation

  • Conversion to dict

That’s it. If you want something more complex there are plenty of libraries and frameworks that does a lot of cool stuff.

How to install

pip install pysimplemodel

How to use

from simple_model import Model
from simple_model.exceptions import ValidationError


class Person(Model):
    age: int
    height: float
    name: str
    weight: float

    class Meta:
        allow_empty = ('height', 'weight')

    def clean_name(self, name):
        return name.strip()

    def validate_age(self, age):
        if age < 0 or age > 150:
            raise ValidationError('Invalid value for age "{!r}"'.format(age))

    def validate_height(self, height):
        if height <= 0:
            raise ValidationError('Invalid value for height "{!r}"'.format(age))
>>> person = Person(age=18.0, name='John Doe ')
>>> person.name
'John Doe '
>>> person.clean()
>>> person.name
'John Doe'
>>> person.age
18
>>> person.validate(raise_exception=False)
True
>>> dict(person)
{
    'age': 18,
    'height': '',
    'name': 'John Doe',
    'weight': '',
}

Validation

Model values aren’t validated until the validated method is called:

>>> person = Person()  # no exception
>>> person.validate()
...
EmptyField: name field cannot be empty
>>> person = Person(name='Jane Doe', age=60)
>>> person.validate()  # now it's ok!

You may change the validate method to return a boolean instead of raising an exception:

>>> person = Person()
>>> person.validate(raise_exception=False)
False
>>> person = Person(name='Jane Doe', age=60)
>>> person.validate(raise_exception=False)
True

Cleaning

Sometimes it is necessary to clean some values of your models, this can be easily done using simple-model:

class CleanPerson(Model):
    age: int
    name: str

    def clean_name(self, name):
        return name.strip()


>>> person = CleanPerson(name='John Doe  \n', age='10')
>>> person.name, person.age
('John Doe  \n', '10')
>>> person.clean()
>>> person.name, person.age
('John Doe', 10)

Build many models

It’s possible to build many models in a single step, it can be done by passing an iterable to the build_many method.

>>> people = [
    {'name': 'John Doe'},
    {'name': 'John Doe II'},
]
>>> models = Person.build_many(people)

Conversion to Dict

To convert to dict is pretty straight-forward task:

>>> person = Person(name='Jane Doe', age=60)
>>> dict(person)
{
    'age': 60,
    'height': None,
    'name': 'Jane Doe',
    'weight': None,
}

Simple model also supports dict conversion of nested models:

class SocialPerson(Model):
    friend: Person
    name: str


>>> person = Person(name='Jane Doe', age=60)
>>> other_person = SocialPerson(name='John Doe', friend=person)
>>> dict(other_person)
{
    'friend': {
        'age': 60,
        'height': None,
        'name': 'Jane Doe',
        'weight': None,
    },
    'name': 'John Doe',
}

It also supports nested models as lists:

import typing


class MoreSocialPerson(Model):
    friends: typing.List[Friend]
    name: str


>>> person = Person(name='Jane Doe', age=60)
>>> other_person = Person(name='John Doe', age=15)
>>> social_person = MoreSocialPerson(name='Foo Bar', friends=[person, other_person])
>>> dict(social_person)
{
    'name': 'Foo Bar',
    'friends': [
        {
            'age': 60,
            'height': None,
            'name': 'Jane Doe',
            'weight': None,
        },
        {
            'age': 15,
            'height': None,
            'name': 'John Doe',
            'weight': None,
        }
    ]
}

Changes

1.1.4 / 2018-05-03

  • Fix Model.clean(): call model validate after model cleaning instead of field validate after field cleaning

1.1.3 / 2018-27-02

  • Fix model_many_builder to stop raising errors when empty iterable is received as argument

1.1.2 / 2018-21-02

  • Fix field conversion to only happen when value is not None

  • Raise exception when trying to convert field with invalid model type

  • Fix model fields to stop including some methods and properties

1.1.1 / 2018-15-02

  • Fix attribute default value as function so when the model receives the field value the default value is ignored

1.1.0 / 2018-15-02

  • Fix setup.py long_description

  • Allow models fields be defined with class attributes without typing

  • Fix type conversion on fields using typing.List[...]

  • Bugfix: remove Meta attribute from model class meta fields

  • Fields attributes may receive function as default values. The function is executed (without passing arguments to it) on model instantiation

1.0.2 / 2018-01-10

  • Add missing function name to __all__ on simple_model.__init__

1.0.1 / 2018-01-10

  • Fix setup.py

1.0.0 / 2018-01-10

  • Move model field customization to Meta class inside model

  • Support field definition using type hints (python 3.6 only)

  • Drop support for python 3.4 and 3.5

  • Remove DynamicModel

  • Add Changes file and automate versioning from parsing it

  • Move main docs to sphinx

  • Improve documentation

0.15.0 / 2017-19-12

  • Use pipenv

  • Drop python 3.3 support

0.14.0 / 2017-21-11

  • Add model_many_builder(). It builds lists of models from data lists

  • Fix travis config

0.13.0 / 2017-21-11

  • Transfrom BaseModel.is_empty from an instance method to a class method

  • Don’t raise an exception when BaseModel.build_many receives empty iterable. Instead returns another empty iterable

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

pysimplemodel-1.1.4.tar.gz (7.9 kB view details)

Uploaded Source

File details

Details for the file pysimplemodel-1.1.4.tar.gz.

File metadata

File hashes

Hashes for pysimplemodel-1.1.4.tar.gz
Algorithm Hash digest
SHA256 0982a6c3b376fb175cf8c8aaf62b3be16fa4dccda9075a4c80d9a7e34698af78
MD5 eb6f1b7e5df439a465995720b0215e98
BLAKE2b-256 bc3acbf36f09e45770a7fb1bda31307f191f5b4f94d987b04f569617b8113a5a

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