Skip to content

Decorate your project with some fashionable supermodels

License

Notifications You must be signed in to change notification settings

mon4ter/fashionable

Repository files navigation

fashionable

PyPI version Python version Build Status codecov

Decorate your project with some fashionable supermodels.

Decorator example

from typing import Set

from fashionable import fashionable

@fashionable
def bits_to_binary_like(bits: Set[int], length: int = 8) -> int:
    bits.add(0)
    return ''.join(str(int(b in bits)) for b in range(length, 0, -1))

bits_to_binary_like('334455')  # 11100

Model example

from typing import List, Optional

from fashionable import Attribute, Model


class Project(Model):
    id = Attribute(str, max=32)
    name = Attribute(str)
    organization = Attribute(Optional[str])
    domain = Attribute(Optional[str])
    links = Attribute(Optional[List[str]])
    
project = Project(1, 'Test')

Supermodel example with Sanic

from typing import List, Optional

from fashionable import Attribute, Supermodel
from sanic import Sanic
from sanic.response import json, HTTPResponse

app = Sanic()
app.db = ...

class Project(Supermodel):
    _ttl = 300
    id = Attribute(str, max=32)
    name = Attribute(str)
    organization = Attribute(Optional[str])
    domain = Attribute(Optional[str])
    links = Attribute(Optional[List[str]])
    
    @staticmethod
    async def _create(raw: dict):
        await app.db.project_create(raw)

    @staticmethod
    async def _get(id_: str) -> Optional[dict]:
        return await app.db.project_get(id_)

    @staticmethod
    async def _update(id_: str, raw: dict):
        await app.db.project_update(id_, raw)

    @staticmethod
    async def _delete(id_: str):
        await app.db.project_delete(id_)


@app.get('/project/<id_>')
async def project_get(request, id_):
    project = await Project.get(id_)
    return json(project)


@app.post('/project')
async def project_create(request):
    project = await Project.create(**request.json)
    return json(
        project,
        status=201,
        headers={'Location': '/project/' + project.id},
    )


@app.put('/project/<id_>')
async def project_update(request, id_):
    project = await Project.get(id_, fresh=True)
    await project.update(**request.json)
    return json(project)


@app.delete('/project/<id_>')
async def project_delete(request, id_):
    project = await Project.get(id_, fresh=True)
    await project.delete()
    return HTTPResponse(status=204)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

About

Decorate your project with some fashionable supermodels

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages