{ "info": { "author": "Fabien Fleutot", "author_email": "fleutot@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6" ], "description": "JsonSchema Compact Notation\n===========================\n\n[Json-schema](https://json-schema.org/understanding-json-schema/reference/)\nis very useful to document and validate inputs and outputs of\nJSON-based REST APIs. Unfortunately, the schemas are more verbose and\nless human-readable than one may wish. This library defines a more\ncompact syntax to describe JSON schemas, as well as a parser to\nconvert such specifications into actual JSON schema.\n\nAt some point in the future, this library may also offer the way back,\nfrom JSON schemas back to a compact notation.\n\nInformal grammar\n----------------\n\nLitteral JSON types are accessible as keywords: `boolean`, `string`,\n`integer`, `number`, `null`.\n\nRegular expression strings are represented by `r`-prefixed litteral\nstrings, similar to Python's litterals: `r\"^[0-9]+$\"` converts into\n`{\"type\": \"string\", \"pattern\": \"^[0-9]+$\"}`.\n\nPredefined formats are represented by `f`-prefixed litteral\nstrings: `f\"uri\"` converts into `{\"type\": \"string\", \"format\":\n\"uri\"}`.\n\nJSON constants are introduced between back-quotes: `` `123` ``\nconverts to `{\"const\": 123}`. If several constants are joined with an\n`|` operator, they are translated into an enum: `` `1`|`2` `` converts\nto `{\"enum\": [1, 2]}`.\n\nArrays are described between square brackets:\n\n* `[]` describes every possible array, and can also be written `array`.\n* an homogeneous, non-empty array of integers is denoted `[integer+]`\n* an homogeneous, possibly empty array of integers is denoted `[integer*]`\n* an array starting with two booleans is denoted `[boolean, boolean]`.\n It can also contain additional items after those two booleans.\n* To forbid additional items, add an `only`\n keyword at the beginning of the array: `[only boolean, boolean]` will\n reject `[true, false, 1]`, whereas `[boolean, boolean]` would have\n validated it.\n* arrays support cardinal suffix between braces: `[]{7}` is an\n array of 7 elements, `[integer*]{3,8}` is an array of between 3 and\n 8 integers (inclusive), `[]{_, 9}` an array of at most 9\n elements, `[string*]{4, _}` an array of at least 4 strings.\n* a uniqueness constraint can be added with the `unique` prefix, as in\n `[unique integer+]`, which will allow `[1, 2, 3]` but not `[1, 2, 1]`\n since `1` occurs more than once.\n\nStrings and integers also support cardinal suffixes,\ne.g. `string{16}`, `integer{_, 0xFFFF}`. Integer ranges as well as\nsizes are inclusive.\n\nObjects are described between curly braces:\n\n* `{ }` describes every possible object, and can also be written\n `object`.\n* `{\"bar\": integer}` is an object with one field `\"bar\"` of type\n integer, and possibly other fields.\n* Quotes are optional around property names, if they are identifiers other\n than `\"_\"` or `\"only\"`: it's legal to write `{bar: integer}`.\n* To prevent non-listed property names from being accepted, use a\n prefix `only`, as in `{only \"bar\": integer}`.\n* property names can be forced to comply with a regex, by an\n `only r\"regex\"` prefix, which can also be a reference to a\n definition: `{only r\"^[a-z]+$\"}`, or the equivalent\n `{only } where word=r\"^[a-z]$\"+`.\n Beware that according to jsonschema, even explicitly listed\n property names must comply with the regex, for instance nothing\n can satisfy the schema `{only r\"^[0-9]+$\", \"except_this\": _}`.\n You can circumvent this limitation in several ways, e.g.\n `{only r\"^([0-9]+|except_this)$\"}`, or ``{only } where\n key = `\"except_this\"` | r\"^[0-9]+$\"``.\n* In addition to enforcing a regex on property names, one can also\n enforce a type constraint on the associated values: `{only :\n integer}`. If no naming constraint is desired, the name can be\n replaced by an underscore wildcard: `{only _: integer}`.\n* A special type `forbidden`, equivalent to JSONSchema's `false`, can\n be used to specifically forbid a property name: `{reserved_name?:\n forbidden}`. Notice that the question mark is mandatory: otherwise,\n it would both expect the property to exist, and accept no value in it.\n\nDefinitions can be used in the schema, and given with a suffix `where \nname0 = def0 and ... and nameX=defX`. References to definitions are\nput between angles, for instance `{author: } where \nuser_name = r\"^\\w+$\". When dumping the schema into actual jsonschema,\nunused definitions are pruned, and missing definitions cause an error.\nDefinitions can only occur at top-level, i.e. \n`{foo: } where bar=number` is legal, but\n`{foo: ( where bar=number)}` is not.\n\nTypes can be combined:\n\n* With infix operator `&`: `A & B` is the type of objects which\n respect both schemas `A` and `B`.\n* With infix operator `|`: `A | B` is the type of objects which\n respect at least one of the schemas `A` or `B`. `&` takes precedence\n over `|`, i.e. `A & B | C & D` is to be read as `(A&B) | (C&D)`.\n* With conditional expressions: `if A then B elif C then D else E`\n will enforce constraint `B` if constraint `A` is met, enforce `D` if\n `C` is met, or enforce `E` if neither `A` nor `C` are met. `elif`\n and `else` parts are optional. For instance, `if {country: \"USA\"}\n then {postcode: r\"\\d{5}(-\\d{4})?\"} else {postcode: string}` will\n only check the postcode with the regex if the country is `\"USA\"`.\n* Parentheses can be added to enforce precedences , e.g. `A & (B|C) & D`\n\nCombinations can also be performed on Python objects, e.g. the following\nPython expression is OK: `Schema(\"{foo: number}\") | Schema(\"{bar: number}\"),\nand produces a schema equivalent to `Schema(\"{foo: number}|{bar: number}\")`.\nWhen definitions are merged in Python with `|` or `&`, their definitions\nare merged as needed. If a definition appears on both sides, it must be equal,\ni.e. one can merge `{foo: } where n=number` with `{bar: } where n=number` \nbut not with `{foo: } where n=integer`.\n\nMore formally\n-------------\n\n schema ::= type (\u00abwhere\u00bb definitions)?\n\n definitions ::= identifier \u00ab=\u00bb type (\u00aband\u00bb identifier \u00ab=\u00bb type)*\n\n type ::= type \u00ab&\u00bb type # allOf those types; takes precedence over \u00ab|\u00bb.\n | type \u00ab|\u00bb type # anyOf those types.\n | \u00ab(\u00bb type \u00ab)\u00bb # parentheses to enforce precedence.\n | \u00abnot\u00bb type # anything but this type.\n | \u00ab`\u00bbjson_litteral\u00ab`\u00bb # just this JSON constant value.\n | \u00ab<\u00bbidentifier\u00ab>\u00bb # identifier refering to the matching top-level definition.\n | r\"regular_expression\" # String matched by this regex.\n | f\"format\" # json-schema draft7 string format.\n | \u00abstring\u00bb cardinal? # a string, with this cardinal constraint on number of chars.\n | \u00abinteger\u00bb cardinal? # an integer within the range described by cardinal.\n | \u00abinteger\u00bb \u00ab/\u00bb int # an integer which must be multiple of that int.\n | \u00abobject\u00bb # any object.\n | \u00abarray\u00bb # any array.\n | \u00abboolean\u00bb # any boolean.\n | \u00abnull\u00bb # the null value.\n | \u00abnumber\u00bb # any number.\n | \u00abforbidden\u00bb # empty type (used mostly to disallow a property name).\n | object # structurally described object.\n | array # structurally described array.\n | conditional # conditional if/then/else rule\n\n cardinal ::= \u00ab{\u00bb int \u00ab}\u00bb # Exactly that number of chars / items / properties.\n | \u00ab{\u00bb \u00ab_\u00bb, int \u00ab}\u00bb # At most that number of chars / items / properties.\n | \u00ab{\u00bb int, \u00ab_\u00bb \u00ab}\u00bb # At least that number of chars / items / properties.\n | \u00ab{\u00bb int, int \u00ab}\u00bb # A number of chars / items / properties within this range.\n\n\n object ::= \u00ab{\u00bb object_restriction? (object_key \u00ab?\u00bb? \u00ab:\u00bb type \u00ab,\u00bb...)* \u00ab}\u00bb cardinal?\n # if \u00abonly\u00bb occurs without a regex, no extra property is allowed.\n # if \u00abonly\u00bb occurs with a regex, all extra property names must match that regex.\n # if \u00ab?\u00bb occurs, the preceding property is optional, otherwise it's required.\n\n object_restriction ::= \u00f8\n # Only explicitly listed property names are accepted:\n | \u00abonly\u00bb\n # non-listed property names must conform to regex/reference:\n | \u00abonly\u00bb (r\"regex\" | \u00ab<\u00bbidentifier\u00ab>\u00bb)\n # non-listed property names must conform to regex, values to type:\n | \u00abonly\u00bb (r\"regex\" | \u00ab<\u00bbidentifier\u00ab>\u00bb | \u00ab_\u00bb)\u00ab:\u00bb type\n\n object_key ::= identifier # Litteral property name.\n | \u00ab\"\u00bbstring\u00ab\"\u00bb # Properties which aren't identifiers must be quoted.\n\n array ::= \u00ab[\u00bb \u00abonly\u00bb? \u00abunique\u00bb? (type \u00ab,\u00bb)* (\u00ab*\u00bb|\u00ab+\u00bb|\u00f8) \u00ab]\u00bb cardinal?\n # if \u00abonly\u00bb occurs, no extra item is allowed.\n # if \u00abunique\u00bb occurs, each array item must be different from every other.\n # if \u00ab*\u00bb occurs, the last type can be repeated from 0 to any times.\n # Every extra item must be of that type.\n # if \u00ab+\u00bb occurs, the last type can be repeated from 1 to any times.\n # Every extra item must be of that type.\n\n conditional ::= \u00abif\u00bb type \u00abthen\u00bb type (\u00abelif\u00bb type \u00abthen\u00bb type)* (\u00abelse\u00bb type)?\n\n int ::= /0x[0-9a-FA-F]+/ | /[0-9]+/\n identifier ::= /[A-Za-z_][A-Za-z_0-9]*/\n\n\n\nTODO\n----\n\nSome things that may be added in future versions:\n\n* on numbers:\n * ranges over floats (reusing cardinal grammar with float\n boundaries)\n * modulus constraints on floats `number/0.25`.\n * exclusive ranges in addition to inclusive ones. May use returned\n braces, e.g. `integer{0,0x100{` as an equivalent for\n `integer{0,0xFF}`?\n * ranges alone are treated as integer ranges, i.e. `{1, 5}` is a\n shortcut for `integer{1, 5}`? Not sure whether it enhances\n readability, and there would be a need for float support in\n ranges then.\n* combine string constraints: regex, format, cardinals... This can\n already be achieved with operator `&`.\n* try to embedded `#`-comments as `\"$comment\"`\n* Implementation:\n * bubble up `?` markers in grammar to the top level.\n* Syntax sugar:\n * optional marker: `foobar?` is equivalent to `foobar|null`. Not\n sure whether it's worth it, the difference between a missing\n field and a field holding `null` is most commonly not significant.\n * check that references as `propertyNames` indeed point at string\n types.\n * make keyword case-insensitive?\n * treat `{foo: forbidden}` as `{foo?: forbidden}` as it's the only\n thing that would make sense?\n* better error messages, on incorrect grammars, and on non-validating\n JSON data.\n* reciprocal feature: try and translate a JSON-schema into a shorter\n and more readable JSCN source.\n\nUsage\n-----\n\n### From command line\n\n $ echo -n '[integer*]' | jscn -\n { \"type\": \"array\",\n \"items\": {\"type\": \"integer\"},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n\n $ jscn --help\n\n usage: jscn [-h] [-o OUTPUT] [-v] [--version] [filename]\n\n Convert from a compact DSL into full JSON schema.\n\n positional arguments:\n filename Input file; use '-' to read from stdin.\n\n optional arguments:\n -h, --help show this help message and exit\n -o OUTPUT, --output OUTPUT\n Output file; defaults to stdout\n -v, --verbose Verbose output\n --version Display version and exit\n\n### From Python API\n\nPython's `jsonschema_cn` package exports two main constructors:\n\n* `Schema()`, which compiles a source string into a schema object;\n* `Definitions()`, which compiles a source string (a sequence of\n definitions separated by keyword `and`, as in rule `definitions` of\n the formal grammar.\n\nSchema objects have a `jsonschema` property, which contains the Python\ndict of the corresponding JSON schema.\n\nSchemas can be combined with Python operators `&` (`\"allOf\"`) and `|`\n(`\"anyOf\"`). When they have definitions, those definition sets are\nmerged, and definition names must not overlap.\n\nSchemas can also be combined with definitions through `|`, and\ndefinitions can be combined together also with `|`.\n\n >>> from jsonschema import Schema, Definitions\n\n >>> defs = Definitions(\"\"\"\n >>> id = r\"[a-z]+\" and\n >>> byte = integer{0,0xff}\n >>> \"\"\")\n\n >>> s = Schema(\"{only : }\") | defs\n >>> s.jsonschema\n ValueError: Missing definition for byte\n\n >>> s = s | defs\n >>> s.jsonschema\n {\"$schema\": \"http://json-schema.org/draft-07/schema#\"\n \"type\": \"object\",\n \"propertyNames\": {\"$ref\": \"#/definitions/id\"},\n \"additionalProperties\": {\"$ref\": \"#/definitions/byte\"},\n \"definitions\": {\n \"id\": {\"type\": \"string\", \"pattern\": \"[a-z]+\"},\n \"byte\": {\"type\": \"integer\", \"minimum\": 0, \"maximum\": 255}\n }\n }\n\n >>> Schema(\"[integer, boolean+]{4}\").jsonschema\n { \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"array\",\n \"minItems\": 4, \"maxItems\": 4,\n \"items\": [{\"type\": \"integer\"}],\n \"additionalItems\": {\"type\": \"boolean\"},\n }\n\nSee also\n--------\n\nIf you spend a lot of time dealing with complex JSON data structures,\nyou might also want to try [jsview](https://github.com/fab13n/jsview),\na smarter JSON formatter, which tries to effectively use both your\nscreen's width and height, by only inserting q carriage returns when\nit makes sense:\n\n $ cat >schema.cn <+], id: r\"[a-z]+\", issued: f\"date\"}\n where byte = integer{0, 0xFF}\n EOF\n\n $ jscn schema.cn\n\n {\"type\": \"object\", \"required\": [\"codes\", \"id\", \"issued\"], \"properties\": {\n \"codes\": {\"type\": \"array\", \"items\": [{\"$ref\": \"#/definitions/byte\"}], \"ad\n ditionalItems\": {\"$ref\": \"#/definitions/byte\"}}, \"id\": {\"type\": \"string\",\n \"pattern\": \"[a-z]+\"}, \"issued\": {\"type\": \"string\", \"format\": \"date\"}}, \"a\n dditionalProperties\": false, \"definitions\": {\"byte\": {\"type\": \"integer\",\n \"minimum\": 0, \"maximum\": 255}}, \"$schema\": \"http://json-schema.org/draft-\n 07/schema#\"}\n\n $ cat schema.cn | jscn - | jsview -\n\n {\n \"type\": \"object\",\n \"required\": [\"codes\", \"id\", \"issued\"],\n \"properties\": {\n \"codes\": {\n \"type\": \"array\",\n \"items\": [{\"$ref\": \"#/definitions/byte\"}],\n \"additionalItems\": {\"$ref\": \"#/definitions/byte\"}\n },\n \"id\": {\"type\": \"string\", \"pattern\": \"[a-z]+\"},\n \"issued\": {\"type\": \"string\", \"format\": \"date\"}\n },\n \"additionalProperties\": false,\n \"definitions\": {\"byte\": {\"type\": \"integer\", \"minimum\": 0, \"maximum\": 255}},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/fab13n/jsonschema_cn", "keywords": "DSL JSON schema jsonschema", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "jsonschema-cn", "package_url": "https://pypi.org/project/jsonschema-cn/", "platform": "", "project_url": "https://pypi.org/project/jsonschema-cn/", "project_urls": { "Homepage": "http://github.com/fab13n/jsonschema_cn" }, "release_url": "https://pypi.org/project/jsonschema-cn/0.25/", "requires_dist": null, "requires_python": "", "summary": "Compact notation for JSON Schemas", "version": "0.25", "yanked": false, "yanked_reason": null }, "last_serial": 9829299, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "6cc3f7cc8c5716a6287756525b7d703e", "sha256": "5fbd27990b555419252e2f846c9e663332a8b6ec322e606df9ad5723adc8ba14" }, "downloads": -1, "filename": "jsonschema_cn-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6cc3f7cc8c5716a6287756525b7d703e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8958, "upload_time": "2019-09-20T16:16:18", "upload_time_iso_8601": "2019-09-20T16:16:18.133719Z", "url": "https://files.pythonhosted.org/packages/fc/05/a655bbad92bfb6c4622afac2da16644c34a86aa28baab65a73f19ab9b817/jsonschema_cn-0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "02a51622ea9151ad9faf215d5768c43f", "sha256": "1d28a77a63f227152454808f48db99f0c6364976cc6601b0edc3b554f47a559e" }, "downloads": -1, "filename": "jsonschema_cn-0.1.tar.gz", "has_sig": false, "md5_digest": "02a51622ea9151ad9faf215d5768c43f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8596, "upload_time": "2019-09-20T16:16:20", "upload_time_iso_8601": "2019-09-20T16:16:20.526795Z", "url": "https://files.pythonhosted.org/packages/2a/e9/4f0a2cfdffed2b69008ef853bb5e74766ddd816bd16ccfff115b614bfbac/jsonschema_cn-0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.10": [ { "comment_text": "", "digests": { "md5": "ce35d0e6e7d0ad87422b001519f41cbe", "sha256": "c598d06f8ac93a63934bd1120e92f480c7563cae4deaf830810af74ed8311296" }, "downloads": -1, "filename": "jsonschema_cn-0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "ce35d0e6e7d0ad87422b001519f41cbe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17928, "upload_time": "2019-10-18T20:55:12", "upload_time_iso_8601": "2019-10-18T20:55:12.814656Z", "url": "https://files.pythonhosted.org/packages/4e/98/1d3cc5e6eeb51b63bcf4c6ead0eaf7d74bd0484356a03b2ea8e558d030a4/jsonschema_cn-0.10-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.11": [ { "comment_text": "", "digests": { "md5": "2152cd3ef17f233e2d3bc9aeb8906d19", "sha256": "35bb8f1ad32947da2304f5383321fc5d07d97f9e445059c415bf417fae59dae1" }, "downloads": -1, "filename": "jsonschema_cn-0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "2152cd3ef17f233e2d3bc9aeb8906d19", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18047, "upload_time": "2019-10-22T14:53:01", "upload_time_iso_8601": "2019-10-22T14:53:01.816147Z", "url": "https://files.pythonhosted.org/packages/52/67/ea5154b17abe30abef4f0ecb3d6f1849e0711a3a5a464d49dfc2292fd838/jsonschema_cn-0.11-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3543f038e35780167461ad585a362a83", "sha256": "f73e4fd5df5483edd2800e0abd258317ec3217b4aec289221785203659dc95ac" }, "downloads": -1, "filename": "jsonschema_cn-0.11.tar.gz", "has_sig": false, "md5_digest": "3543f038e35780167461ad585a362a83", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20453, "upload_time": "2019-10-22T14:53:03", "upload_time_iso_8601": "2019-10-22T14:53:03.214780Z", "url": "https://files.pythonhosted.org/packages/99/af/4d15bb70f59dee53a4264e57a7e83823bdd6fe15d8e90492f3017668dfab/jsonschema_cn-0.11.tar.gz", "yanked": false, "yanked_reason": null } ], "0.12": [ { "comment_text": "", "digests": { "md5": "40196b92896da9253e7d1cd942b7858c", "sha256": "2bcbd8f6011a019fe1aaef33ffe291e10925db2015fb5588d0da606e1713e6b2" }, "downloads": -1, "filename": "jsonschema_cn-0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "40196b92896da9253e7d1cd942b7858c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19556, "upload_time": "2019-10-28T09:55:45", "upload_time_iso_8601": "2019-10-28T09:55:45.927486Z", "url": "https://files.pythonhosted.org/packages/1c/14/172e311243cacac2d032d2412ba3c07854ef0fecf299e0786416c1b90523/jsonschema_cn-0.12-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "96f667c05faa713f2bb89f06eead7c16", "sha256": "4ca7dc47f560ff683ca84377cf671c64f8685e0cace8213b82ab4eedbf510c98" }, "downloads": -1, "filename": "jsonschema_cn-0.12.tar.gz", "has_sig": false, "md5_digest": "96f667c05faa713f2bb89f06eead7c16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22195, "upload_time": "2019-10-28T09:55:48", "upload_time_iso_8601": "2019-10-28T09:55:48.038667Z", "url": "https://files.pythonhosted.org/packages/8c/4e/7669100d55d06d724afb74781658235c6bb712cd703e496365190e3c6535/jsonschema_cn-0.12.tar.gz", "yanked": false, "yanked_reason": null } ], "0.13": [ { "comment_text": "", "digests": { "md5": "8c61a6a79c9aeabf81ce19155c659f78", "sha256": "f891248888a3cdef5083baf23b1cdc5f82677a8d979f66dbb50b61bdae5f2a50" }, "downloads": -1, "filename": "jsonschema_cn-0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "8c61a6a79c9aeabf81ce19155c659f78", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20454, "upload_time": "2019-10-30T10:28:30", "upload_time_iso_8601": "2019-10-30T10:28:30.398725Z", "url": "https://files.pythonhosted.org/packages/33/e5/97ec7eb82ea05bcbcda23a8a458800d13192d995e51535688ac245ac58de/jsonschema_cn-0.13-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c462c674fdcba9ea222ad3ace0c3571b", "sha256": "4dc7609ca35a39f46e51bcaa25251af60b7f1fff2f53d5217174c16dfdaad04f" }, "downloads": -1, "filename": "jsonschema_cn-0.13.tar.gz", "has_sig": false, "md5_digest": "c462c674fdcba9ea222ad3ace0c3571b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23056, "upload_time": "2019-10-30T10:28:34", "upload_time_iso_8601": "2019-10-30T10:28:34.058778Z", "url": "https://files.pythonhosted.org/packages/e0/27/6224cd0b569fe70c47cef585aea94f29fd3ff4307edb5b812207d3ff2518/jsonschema_cn-0.13.tar.gz", "yanked": false, "yanked_reason": null } ], "0.14": [ { "comment_text": "", "digests": { "md5": "611afe0cc119eb580260509c207eacfa", "sha256": "0694d56a6a50d1c6da22eb1a66163da2bd108db8f23fbc1868e77ff9df1f9777" }, "downloads": -1, "filename": "jsonschema_cn-0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "611afe0cc119eb580260509c207eacfa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20519, "upload_time": "2019-11-07T17:37:51", "upload_time_iso_8601": "2019-11-07T17:37:51.110949Z", "url": "https://files.pythonhosted.org/packages/eb/9e/d353c7c61eb105a96554696ecde0a312870ab58b57e683cb8b5a99cb8635/jsonschema_cn-0.14-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "736418978fce91f1501d9103bbaefc9d", "sha256": "0e29de825da7cf635f6905dfeb3fe2f34b62b1497fb79990bb724495af4608b8" }, "downloads": -1, "filename": "jsonschema_cn-0.14.tar.gz", "has_sig": false, "md5_digest": "736418978fce91f1501d9103bbaefc9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23111, "upload_time": "2019-11-07T17:37:53", "upload_time_iso_8601": "2019-11-07T17:37:53.200062Z", "url": "https://files.pythonhosted.org/packages/9a/b1/03d866946218498643b3b00e8b2344261f42525ea7197dae265ac8378cdd/jsonschema_cn-0.14.tar.gz", "yanked": false, "yanked_reason": null } ], "0.15": [ { "comment_text": "", "digests": { "md5": "05578856a2a3e8d40ad86f0bc321250c", "sha256": "9f11032d2c43f6b6cb004f7fa6adbec39def33c16796a73336d669ddfd4ef17a" }, "downloads": -1, "filename": "jsonschema_cn-0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "05578856a2a3e8d40ad86f0bc321250c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20711, "upload_time": "2019-11-09T11:31:28", "upload_time_iso_8601": "2019-11-09T11:31:28.971048Z", "url": "https://files.pythonhosted.org/packages/7d/33/620ea2eb6f993bd0c65fb663a46396dbe328c2418c1aef98ffb6ef0ea22c/jsonschema_cn-0.15-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "26a1ea3477d123db10e6f00d19ae7110", "sha256": "16345b7f0a420f69f0b84a27fc8a53b1da589b6a2d407e998a52ba62e7a15589" }, "downloads": -1, "filename": "jsonschema_cn-0.15.tar.gz", "has_sig": false, "md5_digest": "26a1ea3477d123db10e6f00d19ae7110", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23200, "upload_time": "2019-11-09T11:31:32", "upload_time_iso_8601": "2019-11-09T11:31:32.904033Z", "url": "https://files.pythonhosted.org/packages/31/55/cb0936afb75d9eba6684a585ac101e513aca054a0fe27daaf917944eb498/jsonschema_cn-0.15.tar.gz", "yanked": false, "yanked_reason": null } ], "0.16": [ { "comment_text": "", "digests": { "md5": "5ce1f1138984f83c4f4aae6edc0cb016", "sha256": "5be1ece5ee67ab1b3ee51fc231276d637a535590bbc744a314f74657c4c5cf9a" }, "downloads": -1, "filename": "jsonschema_cn-0.16.tar.gz", "has_sig": false, "md5_digest": "5ce1f1138984f83c4f4aae6edc0cb016", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24346, "upload_time": "2019-11-13T14:08:29", "upload_time_iso_8601": "2019-11-13T14:08:29.487461Z", "url": "https://files.pythonhosted.org/packages/bc/68/9f23a6c06ef0739f3985eb7645c221688aebdca8ab56e0a3a75693a59fc8/jsonschema_cn-0.16.tar.gz", "yanked": false, "yanked_reason": null } ], "0.17": [ { "comment_text": "", "digests": { "md5": "08f6f5fc66ffc3eed3e08c09bac01c7e", "sha256": "a1c39137e9bdee814f3cc7def642e1687cf8ca6de76c3fd2ae74f364f194c9b6" }, "downloads": -1, "filename": "jsonschema_cn-0.17.tar.gz", "has_sig": false, "md5_digest": "08f6f5fc66ffc3eed3e08c09bac01c7e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24383, "upload_time": "2019-11-13T14:33:45", "upload_time_iso_8601": "2019-11-13T14:33:45.179804Z", "url": "https://files.pythonhosted.org/packages/b4/80/584cf47128332b778c9c8b75ccfefead12a389fe1c5b5f614a170aaf421b/jsonschema_cn-0.17.tar.gz", "yanked": false, "yanked_reason": null } ], "0.18": [ { "comment_text": "", "digests": { "md5": "729595b939f50da9e1cc25fa30a106ad", "sha256": "1aecd42a120fa7c1f33e225e0c1287ef53a77152922101a6424df69a94ea7dac" }, "downloads": -1, "filename": "jsonschema_cn-0.18.tar.gz", "has_sig": false, "md5_digest": "729595b939f50da9e1cc25fa30a106ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24372, "upload_time": "2019-11-13T18:53:05", "upload_time_iso_8601": "2019-11-13T18:53:05.987575Z", "url": "https://files.pythonhosted.org/packages/c4/6f/4757e5e08983aa6c6c106406377e4e8d43f1c7741a8838e834d2835fa1e6/jsonschema_cn-0.18.tar.gz", "yanked": false, "yanked_reason": null } ], "0.19": [ { "comment_text": "", "digests": { "md5": "8871c620e2397ea8b49ba0945dfb2724", "sha256": "f8d5baeaf37894011e490c08f86b528345beff7990ff5ca0784afe6bccd248eb" }, "downloads": -1, "filename": "jsonschema_cn-0.19.tar.gz", "has_sig": false, "md5_digest": "8871c620e2397ea8b49ba0945dfb2724", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24375, "upload_time": "2019-11-14T14:33:30", "upload_time_iso_8601": "2019-11-14T14:33:30.186307Z", "url": "https://files.pythonhosted.org/packages/d2/9d/906304c38c57d35341671291f2f57cfb8ebbb4d6bc78f3eeec900fc7e9f2/jsonschema_cn-0.19.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2": [ { "comment_text": "", "digests": { "md5": "61c2db80d3de6bbb521b7664782fe7e5", "sha256": "db5d15409f33fc12dec6a93934768c3a205e7f4d95ead99ef03686013635bb60" }, "downloads": -1, "filename": "jsonschema_cn-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "61c2db80d3de6bbb521b7664782fe7e5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11505, "upload_time": "2019-09-24T08:40:06", "upload_time_iso_8601": "2019-09-24T08:40:06.850675Z", "url": "https://files.pythonhosted.org/packages/52/f1/7fd9d6756c83e2afff2b97d1d90113e64ddab627b4026a84428f43996c7b/jsonschema_cn-0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "630c8b9bbc9238f6d5219aeb546a4f27", "sha256": "164a13848ec5a901c1788651c4aefcbcc7317c385555b004d3126fa33ef2662b" }, "downloads": -1, "filename": "jsonschema_cn-0.2.tar.gz", "has_sig": false, "md5_digest": "630c8b9bbc9238f6d5219aeb546a4f27", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12262, "upload_time": "2019-09-24T08:40:10", "upload_time_iso_8601": "2019-09-24T08:40:10.538338Z", "url": "https://files.pythonhosted.org/packages/e1/3b/c3015dc33f449c5d946729e83f3ec35e42a79ce73e71cc5ea9c52337b65b/jsonschema_cn-0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.20": [ { "comment_text": "", "digests": { "md5": "466a0bd65ac2925de569d34c1ec08c41", "sha256": "77220d9f9497d6bba46fa0fc59d25814d0ac76a4be558c69f8e6585df7e4bd72" }, "downloads": -1, "filename": "jsonschema_cn-0.20.tar.gz", "has_sig": false, "md5_digest": "466a0bd65ac2925de569d34c1ec08c41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24389, "upload_time": "2019-11-15T11:47:14", "upload_time_iso_8601": "2019-11-15T11:47:14.448010Z", "url": "https://files.pythonhosted.org/packages/ad/28/c1e6d664826a84db7a1f7cbecf8f3c39bd107c305e1fce6f46cb889ab370/jsonschema_cn-0.20.tar.gz", "yanked": false, "yanked_reason": null } ], "0.21": [ { "comment_text": "", "digests": { "md5": "50ae386eddc7560e890d0833ffc4b206", "sha256": "8d667c756508b42308288473376158fe09b2e74b458f2cb9db936b3540827371" }, "downloads": -1, "filename": "jsonschema_cn-0.21.tar.gz", "has_sig": false, "md5_digest": "50ae386eddc7560e890d0833ffc4b206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24386, "upload_time": "2019-11-22T10:15:55", "upload_time_iso_8601": "2019-11-22T10:15:55.326825Z", "url": "https://files.pythonhosted.org/packages/f5/71/645912b1b425bf77b65ea185db89c4d55630a107334d354d4a2347b3c9ea/jsonschema_cn-0.21.tar.gz", "yanked": false, "yanked_reason": null } ], "0.23": [ { "comment_text": "", "digests": { "md5": "78d6fc5070eb734ff45909c6f7f696a3", "sha256": "a79cd42046a6e0eea85d108ab755498516062ff09cf43a5a9b005bb700c417c4" }, "downloads": -1, "filename": "jsonschema_cn-0.23.tar.gz", "has_sig": false, "md5_digest": "78d6fc5070eb734ff45909c6f7f696a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25921, "upload_time": "2020-01-30T12:23:10", "upload_time_iso_8601": "2020-01-30T12:23:10.350254Z", "url": "https://files.pythonhosted.org/packages/a0/06/0ad5566b254b5b75e793af245b79a52a0a0ce1e58c2763d0889e9d5078c3/jsonschema_cn-0.23.tar.gz", "yanked": false, "yanked_reason": null } ], "0.24": [ { "comment_text": "", "digests": { "md5": "8983c539bc5085ed57bc4fe9ffe327a3", "sha256": "0b7eb6247daf37e68c0b305c56eb97d0be42eb3063e89223a679a9f0024b4b7a" }, "downloads": -1, "filename": "jsonschema_cn-0.24.tar.gz", "has_sig": false, "md5_digest": "8983c539bc5085ed57bc4fe9ffe327a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26092, "upload_time": "2020-01-30T19:24:50", "upload_time_iso_8601": "2020-01-30T19:24:50.695294Z", "url": "https://files.pythonhosted.org/packages/14/4a/474d280bcb1b0d0791f51f7529a414f1c3435aa4e496c80e9682b9bd3f01/jsonschema_cn-0.24.tar.gz", "yanked": false, "yanked_reason": null } ], "0.25": [ { "comment_text": "", "digests": { "md5": "a83334b7589e01cac8d6c783253e6896", "sha256": "a6b44443f1a600604c97149158e357b5a496ef174f8d0f4a2c1028a7b5667dfc" }, "downloads": -1, "filename": "jsonschema_cn-0.25.tar.gz", "has_sig": false, "md5_digest": "a83334b7589e01cac8d6c783253e6896", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26842, "upload_time": "2021-03-20T14:27:17", "upload_time_iso_8601": "2021-03-20T14:27:17.440480Z", "url": "https://files.pythonhosted.org/packages/bb/20/2d1c183ee0f89ba98740ced22fd682afc6f153531090c8920b7d9f8a4c44/jsonschema_cn-0.25.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3": [ { "comment_text": "", "digests": { "md5": "d9ea148a11abed426aab863d11eddfd6", "sha256": "53625bf842fa6e50f88335d7d2098a7cb4a336346f348a288ff5103ca7ff9b17" }, "downloads": -1, "filename": "jsonschema_cn-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d9ea148a11abed426aab863d11eddfd6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13086, "upload_time": "2019-10-04T08:40:02", "upload_time_iso_8601": "2019-10-04T08:40:02.158777Z", "url": "https://files.pythonhosted.org/packages/98/63/e155124653130526ddc12caba0f4b83720d32ac69a0dc81e9d008b0039c5/jsonschema_cn-0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d4b4866e95d6cded7f935bf162208df2", "sha256": "36c0d0700685194a21948363d74cf8d6a8a5b6a6eb94dc961c61e3a804748ef4" }, "downloads": -1, "filename": "jsonschema_cn-0.3.tar.gz", "has_sig": false, "md5_digest": "d4b4866e95d6cded7f935bf162208df2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14925, "upload_time": "2019-10-04T08:40:05", "upload_time_iso_8601": "2019-10-04T08:40:05.838780Z", "url": "https://files.pythonhosted.org/packages/1a/7a/2bba2750290e89c438b09f7fde989c70bd40b5a4c7d660e13a0e51a171cd/jsonschema_cn-0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4": [ { "comment_text": "", "digests": { "md5": "5c0d6798e8940103a542a54bc4e6d284", "sha256": "0c7a8eb6c86efa1be2d3767e6634306121da8d6488429b388491cd6f87464c89" }, "downloads": -1, "filename": "jsonschema_cn-0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "5c0d6798e8940103a542a54bc4e6d284", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13686, "upload_time": "2019-10-04T16:21:12", "upload_time_iso_8601": "2019-10-04T16:21:12.354355Z", "url": "https://files.pythonhosted.org/packages/bf/0a/cf800865ad88ac44d5c65fe93d4ff5b2522517b3b044bf9c3a8e3e8cffac/jsonschema_cn-0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ac3b55d69d1e5c8724f446ba46d787b0", "sha256": "cbd5a514ab3b0b5ba2bec844d589f9d619718b195f36d75f235e963be490bf0c" }, "downloads": -1, "filename": "jsonschema_cn-0.4.tar.gz", "has_sig": false, "md5_digest": "ac3b55d69d1e5c8724f446ba46d787b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15530, "upload_time": "2019-10-04T16:21:16", "upload_time_iso_8601": "2019-10-04T16:21:16.465477Z", "url": "https://files.pythonhosted.org/packages/b7/12/00898517cac40354206558fe184b3f7b0dfa97cab2d85591e4c2c4707de7/jsonschema_cn-0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5": [ { "comment_text": "", "digests": { "md5": "c8eb436d47716ce70f71890f1b977d02", "sha256": "5165b2da9ae20e5b998819dc1377fff350b747326b69c6bfd70f71b2d3795081" }, "downloads": -1, "filename": "jsonschema_cn-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "c8eb436d47716ce70f71890f1b977d02", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15915, "upload_time": "2019-10-15T12:11:05", "upload_time_iso_8601": "2019-10-15T12:11:05.810782Z", "url": "https://files.pythonhosted.org/packages/e9/3f/4983d0466fc5e2a5b980a58f802d827db167476e61d09b23f765f43844e7/jsonschema_cn-0.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "54d394bfc94f79d1d65939f94f977ce0", "sha256": "917f597938691ea6f744681a4c47073524a976342d390a131a5db5aeb070161e" }, "downloads": -1, "filename": "jsonschema_cn-0.5.tar.gz", "has_sig": false, "md5_digest": "54d394bfc94f79d1d65939f94f977ce0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18592, "upload_time": "2019-10-15T12:11:10", "upload_time_iso_8601": "2019-10-15T12:11:10.705218Z", "url": "https://files.pythonhosted.org/packages/63/d6/c984bb2c39c05982758edeec53d0780744632b3db2906f9571a9bbc8be47/jsonschema_cn-0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6": [ { "comment_text": "", "digests": { "md5": "d206d6aa79dc9580a58e162516ca8d0c", "sha256": "1f4bbedd34c4b68320872c3afee6dbdeb05987ea8ff2ea4596ba71ffafbfb917" }, "downloads": -1, "filename": "jsonschema_cn-0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "d206d6aa79dc9580a58e162516ca8d0c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16672, "upload_time": "2019-10-16T15:47:58", "upload_time_iso_8601": "2019-10-16T15:47:58.808881Z", "url": "https://files.pythonhosted.org/packages/64/b3/8a403c1b648e7382591c6f365adb884892c25840f5cbf789b6d8f9c26e5e/jsonschema_cn-0.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d3fe4d9bdb87b4b5783ce32b6e7c4e80", "sha256": "6b85482a030a68549e9c8a63b74969a1418627d635fa51002163f9d95136cd69" }, "downloads": -1, "filename": "jsonschema_cn-0.6.tar.gz", "has_sig": false, "md5_digest": "d3fe4d9bdb87b4b5783ce32b6e7c4e80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19399, "upload_time": "2019-10-16T15:48:51", "upload_time_iso_8601": "2019-10-16T15:48:51.612673Z", "url": "https://files.pythonhosted.org/packages/30/ef/858e507f51dc35d2903e4ddfb153f329273228102adad6d783c69d48b32d/jsonschema_cn-0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7": [ { "comment_text": "", "digests": { "md5": "b5c96e7949a585c968188df431a313d4", "sha256": "7933d622dac5e14d7e1615cf9acf82673e89f15dc682d1deb9d526bf01bd4f0d" }, "downloads": -1, "filename": "jsonschema_cn-0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "b5c96e7949a585c968188df431a313d4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17438, "upload_time": "2019-10-17T14:14:00", "upload_time_iso_8601": "2019-10-17T14:14:00.990778Z", "url": "https://files.pythonhosted.org/packages/a3/c5/caa5d708e4450c5cc825a77869312e220a6f67ba7553138e7e7c0f78462e/jsonschema_cn-0.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b39ae4059ed66dc89aa1afe06838312c", "sha256": "02045ebe3910de309050ba727893e2ac82b5a74e7eb8e2a2a5444d1f42264d57" }, "downloads": -1, "filename": "jsonschema_cn-0.7.tar.gz", "has_sig": false, "md5_digest": "b39ae4059ed66dc89aa1afe06838312c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19825, "upload_time": "2019-10-17T14:14:10", "upload_time_iso_8601": "2019-10-17T14:14:10.786777Z", "url": "https://files.pythonhosted.org/packages/bf/76/c24cf25ff8567f2c59d60584cc7cff7e9fcf0bc7904d04a7684b71a1c933/jsonschema_cn-0.7.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a83334b7589e01cac8d6c783253e6896", "sha256": "a6b44443f1a600604c97149158e357b5a496ef174f8d0f4a2c1028a7b5667dfc" }, "downloads": -1, "filename": "jsonschema_cn-0.25.tar.gz", "has_sig": false, "md5_digest": "a83334b7589e01cac8d6c783253e6896", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26842, "upload_time": "2021-03-20T14:27:17", "upload_time_iso_8601": "2021-03-20T14:27:17.440480Z", "url": "https://files.pythonhosted.org/packages/bb/20/2d1c183ee0f89ba98740ced22fd682afc6f153531090c8920b7d9f8a4c44/jsonschema_cn-0.25.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }