Source code for parameter.adapter

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""This module provides predefined adapter."""
from __future__ import print_function, division, unicode_literals

import json

import six

from .model import BaseAdapter
from .exception import ArgumentInvalidError


[docs]class TornadoAdapter(BaseAdapter): """Tornado adapter. Usage:: from tornado import web from parameter import Model, Argument, types from parameter.adapter import TornadoAdapter class UserEntity(Model): username = Argument("username", types.String, max_len=100) password = Argument("password", types.String, max_len=64) name = Argument("name", types.Unicode, max_len=50) arg = Argument("age", types.Integer, default=18) class DemoHandler(web.RequestHandler): def get(self): entity = UserEntity(TornadoAdapter(self)) self.write({ "name": entity.name, "age": entity.age, }) """ def __init__(self, handler): """Initialize :param handler: Instance of Tornao RequestHandler. :type handler: :class:`tornado.web.RequestHandler` """ self.handler = handler def get_argument(self, name, default, *args, **kwargs): return self.handler.get_argument(name, default=default, *args, **kwargs) def get_arguments(self, name, *args, **kwargs): return self.handler.get_arguments(name, *args, **kwargs)
[docs]class JSONAdapter(BaseAdapter): """JSON adapter to get arguments from a JSON object. Usage:: from parameter import Model, Argument, types from parameter.adapter import JSONAdapter data = {"a": 1, "b": 2} class DataEntity(Model): a = Argument("a", types.Integer) b = Argument("b", types.Integer) adapter = JSONAdapter(data) entity = DataEntity(adapter) print(entity.a) # 1 print(entity.b) # 2 Nested:: from parameter import Model, Argument, types from parameter.adapter import JSONAdapter data = {"a": 1, "b": 2, "person": {"age": 18, "name": "Gray"}} class PersonEntity(Model): are = Argument("age", types.Integer) name = Argument("name", types.Unicode) class DataEntity(Model): a = Argument("a", types.Integer) b = Argument("b", types.Integer) person = Argument("person", types.Nested(PersonEntity)) adapter = JSONAdapter(data) entity = DataEntity(adapter) print(entity.a) # 1 print(entity.b) # 2 print(entity.person.age) # 18 print(entity.person.name) # Gray """ def __init__(self, data): """Initialize :param data: JSON Data, it can be an instance of str or dict, if it is an instance of str it must be an json string. """ if isinstance(data, six.binary_type): data = data.decode("utf8") if isinstance(data, six.text_type): data = json.loads(data) if not isinstance(data, dict): raise TypeError("``data`` must be a json string or dict") self.data = data def get_argument(self, name, default): return self.data.get(name, default) def get_arguments(self, name): ret = self.data.get(name) if not isinstance(ret, (list, tuple)): raise ArgumentInvalidError( "``%s`` except a sequence, but got %s." % ( name, type(ret)), name, TypeError()) return ret @staticmethod def spawn(data): return JSONAdapter(data)