Skip to main content

mapping jsonschema for sqlalchemy models

Project description

https://travis-ci.org/podhmo/alchemyjsonschema.svg
# -*- coding:utf-8 -*-
import sqlalchemy as sa
import sqlalchemy.orm as orm
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Group(Base):
    """model for test"""
    __tablename__ = "Group"

    pk = sa.Column(sa.Integer, primary_key=True, doc="primary key")
    name = sa.Column(sa.String(255), default="", nullable=False)


class User(Base):
    __tablename__ = "User"

    pk = sa.Column(sa.Integer, primary_key=True, doc="primary key")
    name = sa.Column(sa.String(255), default="", nullable=True)
    group_id = sa.Column(sa.Integer, sa.ForeignKey(Group.pk), nullable=False)
    group = orm.relationship(Group, uselist=False, backref="users")


## ------SingleModelWalker--------
import pprint as pp
from alchemyjsonschema import SchemaFactory
from alchemyjsonschema import SingleModelWalker

factory = SchemaFactory(SingleModelWalker)
pp.pprint(factory(User))

"""
{'properties': {'group_id': {'type': 'integer'},
                'name': {'maxLength': 255, 'type': 'string'},
                'pk': {'description': 'primary key', 'type': 'integer'}},
 'required': ['pk', 'group_id'],
 'title': 'User',
 'type': 'object'}
"""


## ------OneModelOnlyWalker--------
import pprint as pp
from alchemyjsonschema import SchemaFactory
from alchemyjsonschema import OneModelOnlyWalker

factory = SchemaFactory(OneModelOnlyWalker)
pp.pprint(factory(User))

"""
{'properties': {'name': {'maxLength': 255, 'type': 'string'},
                'pk': {'description': 'primary key', 'type': 'integer'}},
 'required': ['pk'],
 'title': 'User',
 'type': 'object'}
"""


## ------AlsoChildrenWalker--------
import pprint as pp
from alchemyjsonschema import SchemaFactory
from alchemyjsonschema import AlsoChildrenWalker

factory = SchemaFactory(AlsoChildrenWalker)
pp.pprint(factory(User))

"""
{'definitions': {'Group': {'properties': {'pk': {'description': 'primary key',
                                                 'type': 'integer'},
                                          'name': {'maxLength': 255,
                                                   'type': 'string'}},
                           'type': 'object'}},
 'properties': {'pk': {'description': 'primary key', 'type': 'integer'},
                'name': {'maxLength': 255, 'type': 'string'},
                'group': {'$ref': '#/definitions/Group'}},
 'required': ['pk'],
 'title': 'User',
 'type': 'object'}
"""

pp.pprint(factory(Group))

"""
{'definitions': {'User': {'properties': {'pk': {'description': 'primary key',
                                                'type': 'integer'},
                                         'name': {'maxLength': 255,
                                                  'type': 'string'}},
                          'type': 'object'}},
 'description': 'model for test',
 'properties': {'pk': {'description': 'primary key', 'type': 'integer'},
                'name': {'maxLength': 255, 'type': 'string'},
                'users': {'items': {'$ref': '#/definitions/User'},
                          'type': 'array'}},
 'required': ['pk', 'name'],
 'title': 'Group',
 'type': 'object'}
"""

has alchemyjsonschema command

help

$ alchemyjsonschema --help
usage: alchemyjsonschema [-h]
                         [--walker {noforeignkey,foreignkey,structual,control}]
                         [--decision {default,comfortable}] [--depth DEPTH]
                         [--decision-relationship DECISION_RELATIONSHIP]
                         [--decision-foreignkey DECISION_FOREIGNKEY]
                         [--out-dir OUT_DIR]
                         target

positional arguments:
  target                the module or class to extract schemas from

optional arguments:
  -h, --help            show this help message and exit
  --walker {noforeignkey,foreignkey,structual,control}
  --decision {default,comfortable}
  --depth DEPTH
  --decision-relationship DECISION_RELATIONSHIP
  --decision-foreignkey DECISION_FOREIGNKEY
  --out-dir OUT_DIR

target models

class Group(Base):
    __tablename__ = "Group"
    query = Session.query_property()

    pk = sa.Column(sa.Integer, primary_key=True, doc="primary key")
    name = sa.Column(sa.String(255), default="", nullable=False)
    color = sa.Column(sa.Enum("red", "green", "yellow", "blue"))
    created_at = sa.Column(sa.DateTime, nullable=True)


class User(Base):
    __tablename__ = "User"
    query = Session.query_property()

    pk = sa.Column(sa.Integer, primary_key=True, doc="primary key")
    name = sa.Column(sa.String(255), default="", nullable=False)
    group_id = sa.Column(sa.Integer, sa.ForeignKey(Group.pk), nullable=False)
    group = orm.relationship(Group, uselist=False, backref="users")
    created_at = sa.Column(sa.DateTime, nullable=True)

dump schema (commandline)

$ alchemyjsonschema alchemyjsonschema.tests.models:Group --walker structual

{
  "required": [
    "pk",
    "name"
  ],
  "definitions": {
    "User": {
      "type": "object",
      "properties": {
        "pk": {
          "type": "integer",
          "description": "primary key"
        },
        "name": {
          "maxLength": 255,
          "type": "string"
        },
        "created_at": {
          "format": "date-time",
          "type": "string"
        }
      }
    }
  },
  "title": "Group",
  "type": "object",
  "properties": {
    "pk": {
      "type": "integer",
      "description": "primary key"
    },
    "name": {
      "maxLength": 255,
      "type": "string"
    },
    "color": {
      "enum": [
        "red",
        "green",
        "yellow",
        "blue"
      ],
      "maxLength": 6,
      "type": "string"
    },
    "created_at": {
      "format": "date-time",
      "type": "string"
    },
    "users": {
      "items": {
        "$ref": "#/definitions/User"
      },
      "type": "array"
    }
  }
}
  • 0.3: swagger support(thanks of isysd)

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

alchemyjsonschema-0.3.3.tar.gz (13.5 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