方便处理模型转换的工具
Project description
===========
pyJSON models
===========
.. image:: https://badge.fury.io/py/jsonmodels.png
:target: http://badge.fury.io/py/jsonmodels
.. image:: https://travis-ci.org/beregond/jsonmodels.png?branch=master
:target: https://travis-ci.org/beregond/jsonmodels
.. image:: https://img.shields.io/pypi/dm/jsonmodels.svg
:target: https://pypi.python.org/pypi/jsonmodels
.. image:: https://coveralls.io/repos/beregond/jsonmodels/badge.png
:target: https://coveralls.io/r/beregond/jsonmodels
`jsonmodels` 是一个能够方便得处理json格式数据和模型数据转化的工具
* Free software: GPL3
* Documentation: http://jsonmodels.rtfd.org
* Source: https://gitee.com/huichengip_chenxf/jsonmodels
特性
--------
* 完全支持 Python 2.7, 3.3, 3.4, 3.5, 3.6.
* 支持 PyPy (see implementation notes in docs for more details).
* 创建类似Django一样的models:
.. code-block:: python
from jsonmodels import models, fields, errors, validators
class Cat(models.Base):
name = fields.StringField(required=True)
breed = fields.StringField()
love_humans = fields.IntField(nullable=True)
class Dog(models.Base):
name = fields.StringField(required=True)
age = fields.IntField()
class Car(models.Base):
registration_number = fields.StringField(required=True)
engine_capacity = fields.FloatField()
color = fields.StringField()
class Person(models.Base):
name = fields.StringField(required=True)
surname = fields.StringField(required=True)
nickname = fields.StringField(nullable=True)
car = fields.EmbeddedField(Car)
pets = fields.ListField([Cat, Dog], nullable=True)
* 通过属性访问值:
.. code-block:: python
>>> cat = Cat()
>>> cat.populate(name='Garfield')
>>> cat.name
'Garfield'
>>> cat.breed = 'mongrel'
>>> cat.breed
'mongrel'
* 验证模型:
.. code-block:: python
>>> person = Person(name='Chuck', surname='Norris')
>>> person.validate()
None
>>> dog = Dog()
>>> dog.validate()
*** ValidationError: Field "name" is required!
* 转化模型为python的格式或者json:
.. code-block:: python
>>> cat = Cat(name='Garfield')
>>> dog = Dog(name='Dogmeat', age=9)
>>> car = Car(registration_number='ASDF 777', color='red')
>>> person = Person(name='Johny', surname='Bravo', pets=[cat, dog])
>>> person.car = car
>>> person.to_struct()
{
'car': {
'color': 'red',
'registration_number': 'ASDF 777'
},
'surname': 'Bravo',
'name': 'Johny',
'nickname': None,
'pets': [
{'name': 'Garfield'},
{'age': 9, 'name': 'Dogmeat'}
]
}
>>> import json
>>> person_json = json.dumps(person.to_struct())
* 你不想写json元数据? pyjsonmodels能为你做这件事:
.. code-block:: python
>>> person = Person()
>>> person.to_json_schema()
{
'additionalProperties': False,
'required': ['surname', 'name'],
'type': 'object',
'properties': {
'car': {
'additionalProperties': False,
'required': ['registration_number'],
'type': 'object',
'properties': {
'color': {'type': 'string'},
'engine_capacity': {'type': ''},
'registration_number': {'type': 'string'}
}
},
'surname': {'type': 'string'},
'name': {'type': 'string'},
'nickname': {'type': ['string', 'null']}
'pets': {
'items': {
'oneOf': [
{
'additionalProperties': False,
'required': ['name'],
'type': 'object',
'properties': {
'breed': {'type': 'string'},
'name': {'type': 'string'}
}
},
{
'additionalProperties': False,
'required': ['name'],
'type': 'object',
'properties': {
'age': {'type': 'number'},
'name': {'type': 'string'}
}
},
{
'type': 'null'
}
]
},
'type': 'array'
}
}
}
* 验证模型和用验证器, 最终影响生成的json元数据:
.. code-block:: python
>>> class Person(models.Base):
...
... name = fields.StringField(
... required=True,
... validators=[
... validators.Regex('^[A-Za-z]+$'),
... validators.Length(3, 25),
... ],
... )
... age = fields.IntField(
... nullable=True,
... validators=[
... validators.Min(18),
... validators.Max(101),
... ]
... )
... nickname = fields.StringField(
... required=True,
... nullable=True
... )
...
>>> person = Person()
>>> person.age = 11
>>> person.validate()
*** ValidationError: '11' is lower than minimum ('18').
>>> person.age = None
>>> person.validate()
None
>>> person.age = 19
>>> person.name = 'Scott_'
>>> person.validate()
*** ValidationError: Value "Scott_" did not match pattern "^[A-Za-z]+$".
>>> person.name = 'Scott'
>>> person.validate()
None
>>> person.nickname = None
>>> person.validate()
*** ValidationError: Field is required!
>>> person.to_json_schema()
{
"additionalProperties": false,
"properties": {
"age": {
"maximum": 101,
"minimum": 18,
"type": ["number", "null"]
},
"name": {
"maxLength": 25,
"minLength": 3,
"pattern": "/^[A-Za-z]+$/",
"type": "string"
},
"nickname": {,
"type": ["string", "null"]
}
},
"required": [
"nickname",
"name"
],
"type": "object"
}
想知道更多的内容请访问文档.
* 对于循环引用,可以支持懒加载:
.. code-block:: python
>>> class Primary(models.Base):
...
... name = fields.StringField()
... secondary = fields.EmbeddedField('Secondary')
>>> class Secondary(models.Base):
...
... data = fields.IntField()
... first = fields.EmbeddedField('Primary')
* 用定义的方式也可以处理循环引用:
.. code-block:: python
>>> class File(models.Base):
...
... name = fields.StringField()
... size = fields.FloatField()
>>> class Directory(models.Base):
...
... name = fields.StringField()
... children = fields.ListField(['Directory', File])
>>> class Filesystem(models.Base):
...
... name = fields.StringField()
... children = fields.ListField([Directory, File])
>>> Filesystem.to_json_schema()
{
"type": "object",
"properties": {
"name": {"type": "string"}
"children": {
"items": {
"oneOf": [
"#/definitions/directory",
"#/definitions/file"
]
},
"type": "array"
}
},
"additionalProperties": false,
"definitions": {
"directory": {
"additionalProperties": false,
"properties": {
"children": {
"items": {
"oneOf": [
"#/definitions/directory",
"#/definitions/file"
]
},
"type": "array"
},
"name": {"type": "string"}
},
"type": "object"
},
"file": {
"additionalProperties": false,
"properties": {
"name": {"type": "string"},
"size": {"type": "number"}
},
"type": "object"
}
}
}
* 比较json元数据:
.. code-block:: python
>>> from jsonmodels.utils import compare_schemas
>>> schema1 = {'type': 'object'}
>>> schema2 = {'type': 'array'}
>>> compare_schemas(schema1, schema1)
True
>>> compare_schemas(schema1, schema2)
False
更多
----
文档中已经描述很详细:
http://jsonmodels.rtfd.org.
History
-------
2.3 (2018-02-04)
++++++++++++++++
* Added name mapping for fields.
* Added value parsing to IntField.
* Fixed bug with ECMA regex flags recognition.
2.2 (2017-08-21)
++++++++++++++++
* Fixed time fields, when value is not required.
* Dropped support for python 2.6
* Added support for python 3.6
* Added nullable param for fields.
* Improved model representation.
2.1.5 (2017-02-01)
++++++++++++++++++
* Fixed DateTimefield error when value is None.
* Fixed comparing models without required values.
2.1.4 (2017-01-24)
++++++++++++++++++
* Allow to compare models based on their type and fields (rather than their
reference).
2.1.3 (2017-01-16)
++++++++++++++++++
* Fixed generated schema.
* Improved JSON serialization.
2.1.2 (2016-01-06)
++++++++++++++++++
* Fixed memory leak.
2.1.1 (2015-11-15)
++++++++++++++++++
* Added support for Python 2.6, 3.2 and 3.5.
2.1 (2015-11-02)
++++++++++++++++
* Added lazy loading of types.
* Added schema generation for circular models.
* Improved readability of validation error.
* Fixed structure generation for list field.
2.0.1 (2014-11-15)
++++++++++++++++++
* Fixed schema generation for primitives.
2.0 (2014-11-14)
++++++++++++++++
* Fields now are descriptors.
* Empty required fields are still validated only during explicite validations.
Backward compatibility breaks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Renamed _types to types in fields.
* Renamed _items_types to items_types in ListField.
* Removed data transformers.
* Renamed module `error` to `errors`.
* Removed explicit validation - validation occurs at assign time.
* Renamed `get_value_replacement` to `get_default_value`.
* Renamed modules `utils` to `utilities`.
1.4 (2014-07-22)
++++++++++++++++
* Allowed validators to modify generated schema.
* Added validator for maximum value.
* Added utilities to convert regular expressions between Python and ECMA
formats.
* Added validator for regex.
* Added validator for minimum value.
* By default "validators" property of field is an empty list.
1.3.1 (2014-07-13)
++++++++++++++++++
* Fixed generation of schema for BoolField.
1.3 (2014-07-13)
++++++++++++++++
* Added new fields (BoolField, TimeField, DateField and DateTimeField).
* ListField is always not required.
* Schema can be now generated from class itself (not from an instance).
1.2 (2014-06-18)
++++++++++++++++
* Fixed values population, when value is not dictionary.
* Added custom validators.
* Added tool for schema comparison.
1.1.1 (2014-06-07)
++++++++++++++++++
* Added possibility to populate already initialized data to EmbeddedField.
* Added `compare_schemas` utility.
1.1 (2014-05-19)
++++++++++++++++
* Added docs.
* Added json schema generation.
* Added tests for PEP8 and complexity.
* Moved to Python 3.4.
* Added PEP257 compatibility.
* Added help text to fields.
1.0.5 (2014-04-14)
++++++++++++++++++
* Added data transformers.
1.0.4 (2014-04-13)
++++++++++++++++++
* List field now supports simple types.
1.0.3 (2014-04-10)
++++++++++++++++++
* Fixed compatibility with Python 3.
* Fixed `str` and `repr` methods.
1.0.2 (2014-04-03)
++++++++++++++++++
* Added deep data initialization.
1.0.1 (2014-04-03)
++++++++++++++++++
* Added `populate` method.
1.0 (2014-04-02)
++++++++++++++++
* First stable release on PyPI.
0.1.0 (2014-03-17)
++++++++++++++++++
* First release on PyPI.
pyJSON models
===========
.. image:: https://badge.fury.io/py/jsonmodels.png
:target: http://badge.fury.io/py/jsonmodels
.. image:: https://travis-ci.org/beregond/jsonmodels.png?branch=master
:target: https://travis-ci.org/beregond/jsonmodels
.. image:: https://img.shields.io/pypi/dm/jsonmodels.svg
:target: https://pypi.python.org/pypi/jsonmodels
.. image:: https://coveralls.io/repos/beregond/jsonmodels/badge.png
:target: https://coveralls.io/r/beregond/jsonmodels
`jsonmodels` 是一个能够方便得处理json格式数据和模型数据转化的工具
* Free software: GPL3
* Documentation: http://jsonmodels.rtfd.org
* Source: https://gitee.com/huichengip_chenxf/jsonmodels
特性
--------
* 完全支持 Python 2.7, 3.3, 3.4, 3.5, 3.6.
* 支持 PyPy (see implementation notes in docs for more details).
* 创建类似Django一样的models:
.. code-block:: python
from jsonmodels import models, fields, errors, validators
class Cat(models.Base):
name = fields.StringField(required=True)
breed = fields.StringField()
love_humans = fields.IntField(nullable=True)
class Dog(models.Base):
name = fields.StringField(required=True)
age = fields.IntField()
class Car(models.Base):
registration_number = fields.StringField(required=True)
engine_capacity = fields.FloatField()
color = fields.StringField()
class Person(models.Base):
name = fields.StringField(required=True)
surname = fields.StringField(required=True)
nickname = fields.StringField(nullable=True)
car = fields.EmbeddedField(Car)
pets = fields.ListField([Cat, Dog], nullable=True)
* 通过属性访问值:
.. code-block:: python
>>> cat = Cat()
>>> cat.populate(name='Garfield')
>>> cat.name
'Garfield'
>>> cat.breed = 'mongrel'
>>> cat.breed
'mongrel'
* 验证模型:
.. code-block:: python
>>> person = Person(name='Chuck', surname='Norris')
>>> person.validate()
None
>>> dog = Dog()
>>> dog.validate()
*** ValidationError: Field "name" is required!
* 转化模型为python的格式或者json:
.. code-block:: python
>>> cat = Cat(name='Garfield')
>>> dog = Dog(name='Dogmeat', age=9)
>>> car = Car(registration_number='ASDF 777', color='red')
>>> person = Person(name='Johny', surname='Bravo', pets=[cat, dog])
>>> person.car = car
>>> person.to_struct()
{
'car': {
'color': 'red',
'registration_number': 'ASDF 777'
},
'surname': 'Bravo',
'name': 'Johny',
'nickname': None,
'pets': [
{'name': 'Garfield'},
{'age': 9, 'name': 'Dogmeat'}
]
}
>>> import json
>>> person_json = json.dumps(person.to_struct())
* 你不想写json元数据? pyjsonmodels能为你做这件事:
.. code-block:: python
>>> person = Person()
>>> person.to_json_schema()
{
'additionalProperties': False,
'required': ['surname', 'name'],
'type': 'object',
'properties': {
'car': {
'additionalProperties': False,
'required': ['registration_number'],
'type': 'object',
'properties': {
'color': {'type': 'string'},
'engine_capacity': {'type': ''},
'registration_number': {'type': 'string'}
}
},
'surname': {'type': 'string'},
'name': {'type': 'string'},
'nickname': {'type': ['string', 'null']}
'pets': {
'items': {
'oneOf': [
{
'additionalProperties': False,
'required': ['name'],
'type': 'object',
'properties': {
'breed': {'type': 'string'},
'name': {'type': 'string'}
}
},
{
'additionalProperties': False,
'required': ['name'],
'type': 'object',
'properties': {
'age': {'type': 'number'},
'name': {'type': 'string'}
}
},
{
'type': 'null'
}
]
},
'type': 'array'
}
}
}
* 验证模型和用验证器, 最终影响生成的json元数据:
.. code-block:: python
>>> class Person(models.Base):
...
... name = fields.StringField(
... required=True,
... validators=[
... validators.Regex('^[A-Za-z]+$'),
... validators.Length(3, 25),
... ],
... )
... age = fields.IntField(
... nullable=True,
... validators=[
... validators.Min(18),
... validators.Max(101),
... ]
... )
... nickname = fields.StringField(
... required=True,
... nullable=True
... )
...
>>> person = Person()
>>> person.age = 11
>>> person.validate()
*** ValidationError: '11' is lower than minimum ('18').
>>> person.age = None
>>> person.validate()
None
>>> person.age = 19
>>> person.name = 'Scott_'
>>> person.validate()
*** ValidationError: Value "Scott_" did not match pattern "^[A-Za-z]+$".
>>> person.name = 'Scott'
>>> person.validate()
None
>>> person.nickname = None
>>> person.validate()
*** ValidationError: Field is required!
>>> person.to_json_schema()
{
"additionalProperties": false,
"properties": {
"age": {
"maximum": 101,
"minimum": 18,
"type": ["number", "null"]
},
"name": {
"maxLength": 25,
"minLength": 3,
"pattern": "/^[A-Za-z]+$/",
"type": "string"
},
"nickname": {,
"type": ["string", "null"]
}
},
"required": [
"nickname",
"name"
],
"type": "object"
}
想知道更多的内容请访问文档.
* 对于循环引用,可以支持懒加载:
.. code-block:: python
>>> class Primary(models.Base):
...
... name = fields.StringField()
... secondary = fields.EmbeddedField('Secondary')
>>> class Secondary(models.Base):
...
... data = fields.IntField()
... first = fields.EmbeddedField('Primary')
* 用定义的方式也可以处理循环引用:
.. code-block:: python
>>> class File(models.Base):
...
... name = fields.StringField()
... size = fields.FloatField()
>>> class Directory(models.Base):
...
... name = fields.StringField()
... children = fields.ListField(['Directory', File])
>>> class Filesystem(models.Base):
...
... name = fields.StringField()
... children = fields.ListField([Directory, File])
>>> Filesystem.to_json_schema()
{
"type": "object",
"properties": {
"name": {"type": "string"}
"children": {
"items": {
"oneOf": [
"#/definitions/directory",
"#/definitions/file"
]
},
"type": "array"
}
},
"additionalProperties": false,
"definitions": {
"directory": {
"additionalProperties": false,
"properties": {
"children": {
"items": {
"oneOf": [
"#/definitions/directory",
"#/definitions/file"
]
},
"type": "array"
},
"name": {"type": "string"}
},
"type": "object"
},
"file": {
"additionalProperties": false,
"properties": {
"name": {"type": "string"},
"size": {"type": "number"}
},
"type": "object"
}
}
}
* 比较json元数据:
.. code-block:: python
>>> from jsonmodels.utils import compare_schemas
>>> schema1 = {'type': 'object'}
>>> schema2 = {'type': 'array'}
>>> compare_schemas(schema1, schema1)
True
>>> compare_schemas(schema1, schema2)
False
更多
----
文档中已经描述很详细:
http://jsonmodels.rtfd.org.
History
-------
2.3 (2018-02-04)
++++++++++++++++
* Added name mapping for fields.
* Added value parsing to IntField.
* Fixed bug with ECMA regex flags recognition.
2.2 (2017-08-21)
++++++++++++++++
* Fixed time fields, when value is not required.
* Dropped support for python 2.6
* Added support for python 3.6
* Added nullable param for fields.
* Improved model representation.
2.1.5 (2017-02-01)
++++++++++++++++++
* Fixed DateTimefield error when value is None.
* Fixed comparing models without required values.
2.1.4 (2017-01-24)
++++++++++++++++++
* Allow to compare models based on their type and fields (rather than their
reference).
2.1.3 (2017-01-16)
++++++++++++++++++
* Fixed generated schema.
* Improved JSON serialization.
2.1.2 (2016-01-06)
++++++++++++++++++
* Fixed memory leak.
2.1.1 (2015-11-15)
++++++++++++++++++
* Added support for Python 2.6, 3.2 and 3.5.
2.1 (2015-11-02)
++++++++++++++++
* Added lazy loading of types.
* Added schema generation for circular models.
* Improved readability of validation error.
* Fixed structure generation for list field.
2.0.1 (2014-11-15)
++++++++++++++++++
* Fixed schema generation for primitives.
2.0 (2014-11-14)
++++++++++++++++
* Fields now are descriptors.
* Empty required fields are still validated only during explicite validations.
Backward compatibility breaks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Renamed _types to types in fields.
* Renamed _items_types to items_types in ListField.
* Removed data transformers.
* Renamed module `error` to `errors`.
* Removed explicit validation - validation occurs at assign time.
* Renamed `get_value_replacement` to `get_default_value`.
* Renamed modules `utils` to `utilities`.
1.4 (2014-07-22)
++++++++++++++++
* Allowed validators to modify generated schema.
* Added validator for maximum value.
* Added utilities to convert regular expressions between Python and ECMA
formats.
* Added validator for regex.
* Added validator for minimum value.
* By default "validators" property of field is an empty list.
1.3.1 (2014-07-13)
++++++++++++++++++
* Fixed generation of schema for BoolField.
1.3 (2014-07-13)
++++++++++++++++
* Added new fields (BoolField, TimeField, DateField and DateTimeField).
* ListField is always not required.
* Schema can be now generated from class itself (not from an instance).
1.2 (2014-06-18)
++++++++++++++++
* Fixed values population, when value is not dictionary.
* Added custom validators.
* Added tool for schema comparison.
1.1.1 (2014-06-07)
++++++++++++++++++
* Added possibility to populate already initialized data to EmbeddedField.
* Added `compare_schemas` utility.
1.1 (2014-05-19)
++++++++++++++++
* Added docs.
* Added json schema generation.
* Added tests for PEP8 and complexity.
* Moved to Python 3.4.
* Added PEP257 compatibility.
* Added help text to fields.
1.0.5 (2014-04-14)
++++++++++++++++++
* Added data transformers.
1.0.4 (2014-04-13)
++++++++++++++++++
* List field now supports simple types.
1.0.3 (2014-04-10)
++++++++++++++++++
* Fixed compatibility with Python 3.
* Fixed `str` and `repr` methods.
1.0.2 (2014-04-03)
++++++++++++++++++
* Added deep data initialization.
1.0.1 (2014-04-03)
++++++++++++++++++
* Added `populate` method.
1.0 (2014-04-02)
++++++++++++++++
* First stable release on PyPI.
0.1.0 (2014-03-17)
++++++++++++++++++
* First release on PyPI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pyjsonmodels-2.4.tar.gz
(21.2 kB
view details)
Built Distribution
File details
Details for the file pyjsonmodels-2.4.tar.gz
.
File metadata
- Download URL: pyjsonmodels-2.4.tar.gz
- Upload date:
- Size: 21.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37e48dc7f09d4272ba2df6c308f06dd4c9771d0d8ab7d004c61f7faed0750314 |
|
MD5 | d9ee1cb7efbd97e22cd885853b7b2277 |
|
BLAKE2b-256 | ec92c42395342614aef13f575ae80b5e49892f3e7e80be5e788110ca9331a729 |
File details
Details for the file pyjsonmodels-2.4-py2.py3-none-any.whl
.
File metadata
- Download URL: pyjsonmodels-2.4-py2.py3-none-any.whl
- Upload date:
- Size: 20.5 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 74774aa16f72b5297ccaecb4432092d2d6e36a79e386926d8fe7557ddc5ca73e |
|
MD5 | 3abd6ed1e4cd553e5ec29095b1c190ba |
|
BLAKE2b-256 | a202072b4b7b26b4712a59665ee2b958d5d44e89bf1c12504e91b9b70b4ccd67 |