diff --git a/jsd/_lib.py b/jsd/_lib.py index 56d76a8..b439357 100644 --- a/jsd/_lib.py +++ b/jsd/_lib.py @@ -13,35 +13,65 @@ import six -class _ObjectMeta(type): +class _TypeMeta(type): + + #def __new__(meta, name, bases, dct): + # dct['_keywords'] = [] + # for name, obj in six.iteritems(dct): + # if not name.startswith('__') and not callable(obj): + # print name + # dct['_keywords'].append(name) + + # return super(_TypeMeta, meta).__new__(meta, name, bases, dct) + + def __new__(meta, name, bases, dct): + dct['_keywords'] = {} + for name, obj in six.iteritems(dct): + if not name.startswith('__') and not callable(obj): + print name + dct['_keywords'][name] = obj + + return super(_TypeMeta, meta).__new__(meta, name, bases, dct) + + +class _ObjectMeta(_TypeMeta): def __new__(meta, name, bases, dct): - dct.update({ - 'properties': {}, - 'required_properties': [], - 'required': False, - }) + properties = {} + required_properties = [] for _name, obj in list(dct.items()): if isinstance(obj, _Type): del dct[_name] - dct['properties'][_name] = obj + properties[_name] = obj if obj.required: - dct['required_properties'].append(_name) + required_properties.append(_name) - return super(_ObjectMeta, meta).__new__(meta, name, bases, dct) + cls = super(_ObjectMeta, meta).__new__(meta, name, bases, dct) + cls.properties = properties + cls.required_properties = required_properties + return cls +@six.add_metaclass(_TypeMeta) class _Type(object): def __init__(self, required=False, **kwargs): self.required = required def json(self): + obj_json = dict() if self.required: - return {'type': self.__class__.__name__.lower()} + obj_json['type'] = self.type.lower() else: - return {'type': [self.__class__.__name__.lower(), 'null']} + obj_json['type'] = [self.type.lower(), 'null'] + + for k, v in six.iteritems(self._keywords): + if k == '_keywords': + continue + obj_json[k] = v + + return obj_json @six.add_metaclass(_ObjectMeta) @@ -63,7 +93,11 @@ class Object(_Type): class String(_Type): - pass + type = 'string' + minLength = None + maxLength = None + format = None + pattern = None class Array(_Type):