Package: schematec
Schematec=========.. image:: https://travis-ci.org/mylokin/redisext.svg?branch=master:target: https://travis-ci.org/mylokin/redisextSchematec is a set of tools that makes input data validation easier.The purpose of this code is attempt to bring simplicity to applicationslogics using separation of data validation and actual data processing.Quickstart----------.. code:: pythonimport schematec as sschema = s.dictionary(id=s.integer & s.required,name=s.string,tags=s.array(s.string),).. code:: python>>> data = {...     'id': '1',...     'name': 'Red Hot Chili Peppers',...     'tags': ['funk', 'rock'],...     'rank': '1',... }>>> schema(data){'id': 1, 'name': u'Red Hot Chili Peppers', 'tags': [u'funk', u'rock']}Concepts--------Schematec module is based on three basic concepts:* Schema* Validator* ConverterSchema^^^^^^Term "schema" is used to describe complex data struct such as dictionary(hashmap)or array(list). Schemas has two different types of validation (it is not related toarray schemas):* Default - Only values with required validator are required, other values are optional* Weak - All values are optional`schematec.exc.SchemaError` is raised in case provided data is incorrect.Order of schema validations:#. Unbound Validators#. Schemas(inner)#. Converters#. Bound ValidatorsValidator^^^^^^^^^Term "validator" describes callable objects that perform different types of checks.There are two types of validators in schematec:* Bound - type related, for example "max length" validator is bound to sized type.* Unbound - universal, for example "required" validator.Raises `schematec.exc.ValidationError`.Schematec provides following validators:requiredcheck if value is providedlengthcheck iterable for max lengthregexcheck if given value is validConverter^^^^^^^^^Term "converter" is used to describe cast functions. Schematec supports subset of JSONdata types.Basic types:- integer(int)- string(str)- boolean(bool)Containers:- array(list)- dictionary(dict)Raises `schematec.exc.ConvertationError`.Convertation rules=================integer-------#. Any int or long value#. Any suitable string/unicode#. Boolean valuenumber-------#. Any float or int or long value#. Any suitable string/unicode#. Boolean valuestring------#. Any suitable string/unicode#. Any int or long valueboolean-------#. Boolean value#. 0 or 1#. '0' or '1'#. u'0' or u'1'dictionary----------#. Any mapping value(collections.Mapping)array-----#. Any iterable value(collections.Iterable), but not a mappingComplex Descriptors==================="Schema", "validator" and "converter" are internally referenced as "descriptors". Common task iscreation of complex validation rules for a field(or "complex descriptors"). To do this use bitwise"and" operator on descriptors:.. code:: python>>> import schematec>>> schematec.integer & schematec.required<schematec.abc.ComplexDescriptor object at 0x10b05a0d0>Sugar Schema============Schematec supports additional "magic" way to define your schemas. You can use simple dicts and liststo describe your data. For example:.. code:: python>>> import schematec as s>>> schema = {...     'a': [{...         'b': s.integer,...     }]... }>>> data = {...     'a': [{'b': 1}, {'b': '1'}, {}]... }>>> s.process(schema, data){'a': [{'b': 1}, {'b': 1}, {}]}Examples========Recursive schema----------------.. code:: pythonimport schematec as sschema = s.dictionary(id=s.integer & s.required,entity=s.dictionary(name=s.string & s.required,value=s.string,)).. code:: python>>> data = {...     'id': 1,...     'entity': {...         'name': 'song',...         'value': 'californication',...     }... }>>> schema(data){'id': 1, 'entity': {'name': u'song', 'value': u'californication'}}Errors handling---------------.. code:: pythonimport schematec as sschema = s.dictionary(id=s.integer & s.required,entity=s.dictionary(name=s.string & s.required,value=s.string,)).. code:: python>>> data = {...     'id': 1,...     'entity': {...         'value': 'californication',...     }... }>>> schema(data)Traceback (most recent call last):File "<stdin>", line 1, in <module>File "schematec/schema.py", line 44, in __call__value = schema(value, weak=weak)File "schematec/schema.py", line 32, in __call__validator(name, data)File "schematec/validators.py", line 12, in __call__raise exc.ValidationError(name)schematec.exc.ValidationError: name