Overview
Atlassian Sourcetree is a free Git and Mercurial client for Windows.
Atlassian Sourcetree is a free Git and Mercurial client for Mac.
dict2colander
Convert python dict (YAML, JSON) to colander schema.
Colander is library, which enables you to validate and convert YAML, JSON and HTML form data. Colander schema as it is could be defined only in Python declaratively for example like this:
import colander class Person(colander.MappingSchema): name = colander.SchemaNode(colander.String()) age = colander.SchemaNode(colander.Int(), validator=colander.Range(0, 200)) @colander.instantiate() class phones(colander.SequenceSchema): @colander.instantiate() class phone(colander.MappingSchema): location = colander.SchemaNode(colander.String(), validator=colander.OneOf(['home', 'work'])) number = colander.SchemaNode(colander.String())
With dict2colander you can define the same colander schema in dictionary and convert it to colader.MappingSchema object.
Instalation
You can install dict2colander from Python Package Index like this:
pip install dict2colander
Usage
from dict2colander import dict2colander schema_dict = { 'type': 'Mapping', 'name': 'person', 'subnodes': [ {'type': 'String', 'name': 'name'}, {'type': 'Integer', 'name': 'age', 'validators': {'Range': {'args': ('0', '200')}}}, {'type': 'Sequence', 'name': 'phones', 'subnodes': [ {'type': 'Mapping', 'name': 'phone', 'subnodes': [ {'type': 'String', 'name': 'location', 'validators': {'OneOf': {'args': (['home', 'work'],)}}}, {'type': 'String', 'name': 'number'} ]}]}, ] } schema = dict2colander(schema_dict) data = { 'name': 'keith', 'age': '20', 'friends':[('1', 'jim'),('2', 'bob'), ('3', 'joe'), ('4', 'fred')], 'phones':[{'location':'home', 'number':'555-1212'}, {'location':'work', 'number':'555-8989'},], } serialized_data = schema.deserialize(data) print serialized_data
Dict2colander is intended to make possible to read colander schemas from YAML or JSON format. So here is schema from previous example written in YAML:
--- name: person type: Mapping subnodes: - name: name type: String - name: age type: Integer validators: Range: args: ['0', '200'] - name: phones type: Sequence subnodes: - name: phone type: Mapping subnodes: - name: location type: String validators: OneOf: args: [[home, work]] - name: number type: String
Note that Range validator has arguments defined as Strings not Integers although that field age is of type Integer.
Here are data to deserialize in YAML format from first example:
--- name: keith age: 20 friends: - [1, jim] - [2, bob] - [3, joe] - [4, fred] phones: - location: home number: 555-1212 - location: work number: 555-8989
Here is example how YAML data are deserialized with schema defined in YAML document.
import yaml import dict2colander def deserialize(yaml_doc, yaml_schema): mapping_schema = dict2colander.dict2colander(yaml_schema) return mapping_schema.deserialize(yaml_doc) f = open('doc.yaml') doc = yaml.load(f) f.close() f = open('schema.yaml') schema = yaml.load(f) f.close() dict_doc = deserialize(doc, schema) print dict_doc