aromanovich / jsl

A Python DSL for describing JSON schemas
http://jsl.readthedocs.org/
Other
218 stars 21 forks source link

It is not so obvious how to export the result of get_schema() so it is a schema #17

Closed mulkieran closed 8 years ago

mulkieran commented 8 years ago

Running the simple introductory example in the docs gets me this:

Directory.get_schema(ordered=True)
OrderedDict([('$schema', 'http://json-schema.org/draft-04/schema#'), ('definitions', {'__main__.File': OrderedDict([('type', 'object'), ('properties', OrderedDict([('name', OrderedDict([('type', 'string')])), ('content', OrderedDict([('type', 'string')]))])), ('required', ['name', 'content']), ('additionalProperties', False)]), '__main__.Directory': OrderedDict([('type', 'object'), ('properties', OrderedDict([('name', OrderedDict([('type', 'string')])), ('content', OrderedDict([('type', 'array'), ('items', OrderedDict([('oneOf', [{'$ref': '#/definitions/__main__.File'}, {'$ref': '#/definitions/__main__.Directory'}])]))]))])), ('required', ['name', 'content']), ('additionalProperties', False)])}), ('$ref', '#/definitions/__main__.Directory')])

This is all improved with ordered is False.

>>> Directory.get_schema(ordered=False)
{'definitions': {'__main__.File': {'additionalProperties': False, 'required': ['name', 'content'], 'type': 'object', 'properties': {'content': {'type': 'string'}, 'name': {'type': 'string'}}}, '__main__.Directory': {'additionalProperties': False, 'required': ['name', 'content'], 'type': 'object', 'properties': {'content': {'items': {'oneOf': [{'$ref': '#/definitions/__main__.File'}, {'$ref': '#/definitions/__main__.Directory'}]}, 'type': 'array'}, 'name': {'type': 'string'}}}}, '$schema': 'http://json-schema.org/draft-04/schema#', '$ref': '#/definitions/__main__.Directory'}

Pretty print helps with unordered:

>>> pprint.pprint(Directory.get_schema(ordered=False))
{'$ref': '#/definitions/__main__.Directory',
 '$schema': 'http://json-schema.org/draft-04/schema#',
 'definitions': {'__main__.Directory': {'additionalProperties': False,
                                        'properties': {'content': {'items': {'oneOf': [{'$ref': '#/definitions/__main__.File'},
                                                                                       {'$ref': '#/definitions/__main__.Directory'}]},
                                                                   'type': 'array'},
                                                       'name': {'type': 'string'}},
                                        'required': ['name', 'content'],
                                        'type': 'object'},
                 '__main__.File': {'additionalProperties': False,
                                   'properties': {'content': {'type': 'string'},
                                                  'name': {'type': 'string'}},
                                   'required': ['name', 'content'],
                                   'type': 'object'}}}

But, it would be nice to be able to export the result to a file simply, or if docs had a recommended best way.

aklim007 commented 8 years ago

jsonshema is json

>>> shema
OrderedDict([('$schema', 'http://json-schema.org/draft-04/schema#'), ('definitions', {'__main__.Directory': OrderedDict([('type', 'object'), ('properties', OrderedDict([('name', OrderedDict([('type', 'string')])), ('content', OrderedDict([('type', 'array'), ('items', OrderedDict([('oneOf', [{'$ref': '#/definitions/__main__.File'}, {'$ref': '#/definitions/__main__.Directory'}])]))]))])), ('required', ['name', 'content']), ('additionalProperties', False)]), '__main__.File': OrderedDict([('type', 'object'), ('properties', OrderedDict([('name', OrderedDict([('type', 'string')])), ('content', OrderedDict([('type', 'string')]))])), ('required', ['name', 'content']), ('additionalProperties', False)])}), ('$ref', '#/definitions/__main__.Directory')])
>>> print(json.dumps(shema, ensure_ascii=False, indent=4))
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "definitions": {
        "__main__.Directory": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string"
                },
                "content": {
                    "type": "array",
                    "items": {
                        "oneOf": [
                            {
                                "$ref": "#/definitions/__main__.File"
                            },
                            {
                                "$ref": "#/definitions/__main__.Directory"
                            }
                        ]
                    }
                }
            },
            "required": [
                "name",
                "content"
            ],
            "additionalProperties": false
        },
        "__main__.File": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string"
                },
                "content": {
                    "type": "string"
                }
            },
            "required": [
                "name",
                "content"
            ],
            "additionalProperties": false
        }
    },
    "$ref": "#/definitions/__main__.Directory"
}
mulkieran commented 8 years ago

Thanks.

It is obvious in retrospect.