{ "info": { "author": "Ben Samuel", "author_email": "bsamuel@unitedincome.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Libraries" ], "description": "[![CircleCI](https://circleci.com/gh/UnitedIncome/json-syntax/tree/master.svg?style=svg)](https://circleci.com/gh/UnitedIncome/json-syntax/tree/master)\n\n# json-syntax\n\nA Python library to translate between JSON compatible structures and native Python\nclasses using customizable rules.\n\n## Use case\n\nIf you're like the authors, you tried writing a encoding function that attempted to\nencode and decode by interrogating the types at runtime, maybe calling some method like\n`asdict`. This works fine for generating JSON, but it gets sketchy[1](#f1) when trying to decode the same JSON.\n\nFurther, we have annotations in Python 3! Even if you're not using a type checker, just\nlabeling the types of fields makes complex data structures far more comprehensible.\n\nThis library is aimed at projects that have a complex JSON schema that they're trying to\nstructure using libraries like [attrs][].\n\n * It exploits [gradual typing][] via annotations, [typing][] and [dataclasses][]\n * It expects classes to be *statically* described using types\n * But a fallback can be provided to handle data described at runtime\n * It provides hooks to normalize legacy inputs\n * It makes it trivial to extend the library with your own rules\n * Actions and Rules are simply functions\n * Encoders and decoders can be pickled\n * The library has no dependencies of its own on python 3.7+\n * It does not actually read or write JSON\n\n### Supported types\n\n * Atoms including `None`, `bool`, `int`, `float`, `str`.\n * Floats may optionally be represented as strings.\n * The `decimal.Decimal` class, represented as itself or in string form.\n * The `datetime.date` and `datetime.datetime` classes, represented in ISO8601 form.\n * Preliminary support for `datetime.timedelta` as ISO8601 time durations.\n * Subclasses of `enum.Enum`, represented by the string names.\n * Also, a `faux_enums` rule will accept an Enum type if you just use strings in your\n code.\n * The `typing.Optional[E]` type allows a JSON `null` to be substituted for a value.\n * Collections including `typing.List[E]`, `typing.Tuple[E, ...]`, `typing.Set[E]` and\n `typing.FrozenSet[E]`.\n * The `...` is [literal][ellipsis] and indicates a homogenous tuple, essentially a\n frozen list.\n * The `typing.Dict[K, V]` type allows a JSON object to represent a homogenous `dict`.\n * Restriction: the keys must be strings, ints, enums or dates.\n * **New**: The `typing.TypedDict` type allows a JSON object to represent a `dict` with specific\n keys.\n * Python classes implemented using `attrs.attrs`, `dataclasses.dataclass` are\n represented as JSON dicts and\n * Named tuples via `typing.NamedTuple` and heterogenous tuples via `typing.Tuple`.\n * Though, you should consider converting these to `dataclass`.\n * The `typing.Union[A, B, C]` rule will recognize alternate types by inspection.\n\nIn addition, `dataclass` and `attrs` classes support hooks to let you completely customize\ntheir JSON representation.\n\n### Extras\n\nThese were originally intended as examples for how to use the package, but they're potentially\nuseful in their own right.\n\n * [A ruleset][extras ddb] for use with AWS DynamoDB is included with basic facilities.\n * Restriction: No general support for `typing.Union`, only `Optional`.\n * Restriction: No general support for `Set`, only the special cases that are native to DynamoDB.\n * [A `Flag` psuedo-type][extras flag] allows you to use regular strings directly as flags.\n * [A rule][extras loose] that will accept a complete `datetime` and return a `date` by truncating the timestamp.\n\n## Usage\n\nThis example is also implemented in unit tests. First, let's declare some classes.\n\n```python\nimport json_syntax as syn\nfrom dataclasses import dataclass # attrs works too\nfrom decimal import Decimal\nfrom datetime import date\nfrom enum import Enum\n\n@dataclass\nclass Account:\n user: str\n transactions: List['Trans'] # Forward references work!\n balance: Decimal = Decimal()\n\nclass TransType(Enum):\n withdraw = 0\n deposit = 1\n\n@dataclass\nclass Trans:\n type: TransType\n amount: Decimal\n stamp: date\n```\n\nWe'll next set up a RuleSet and use it to construct an encoder. The `std_ruleset`\nfunction is a one-liner with some reasonable overrides. Here, we've decided that because\nsome intermediate services don't reliably retain decimal values, we're going to\nrepresent them in JSON as strings.\n\n```python\n>>> rules = syn.std_ruleset(decimals=syn.decimals_as_str)\n>>> encode_account = rules.python_to_json(typ=Account)\n>>> decode_account = rules.json_to_python(typ=Account)\n```\n\nThe RuleSet examines the type and verb, searches its list of Rules, and then uses the\nfirst one that handles that type and verb to produce an Action.\n\nFor example, `attrs_classes` is a Rule that recognizes the verbs `python_to_json` and\n`json_to_python` and will accept any class decorated with `@attr.s` or `@dataclass`.\n\nIt will scan the fields and ask the RuleSet how to encode them. So when it sees\n`Account.user`, the `atoms` rule will match and report that converting a `str` to JSON\ncan be accomplished by simply calling `str` on it. The action it returns will literally\nbe the `str` builtin.\n\nThus `attrs_classes` will build a list of attributes on `Account` and actions to convert\nthem, and constructs an action to represent them.\n\n```python\n>>> sample_value = Account(\n... 'bob', [\n... Trans(TransType.withdraw, Decimal('523.33'), date(2019, 4, 4))\n... ], Decimal('77.00')\n... )\n\n>>> encode_account(sample_value)\n{\n 'user': 'bob',\n 'transactions': [\n {\n 'type': 'withdraw',\n 'amount': '523.33',\n 'stamp': '2019-04-04'\n }\n ], 'balance': '77.00'\n}\n```\n\n#### Encoding and decoding\n\nThe aim of all this is to enable reliable usage with your preferred JSON library:\n\n```python\nwith open('myfile.json', 'r') as fh:\n my_account = decode_account(json.load(fh))\n\nwith open('myfile.json', 'w') as fh:\n json.dump(encode_account(my_account))\n```\n\n### Using generic types\n\nGenerally, the [typing][] module simple provides capital letter type names that obviously\ncorrespond to the internal types. [See TYPES for a more thorough introduction][types].\n\nAnd you specify the type of the contents as a parameter in square brackets.\n\nThus we have:\n\n * `list` and `List[E]`\n * `set` and `Set[E]`\n * `tuple` and `Tuple[E, ...]` is a special case!\n * `frozenset` and `FrozenSet[E]`\n * `dict` and `Dict[K, V]`\n\nTuple is a special case. In Python, they're often used to mean \"frozenlist\", so\n`Tuple[E, ...]` (the `...` is [the Ellipsis object][ellipsis]) indicates all elements have\nthe type `E`.\n\nThey're also used to represent an unnamed record. In this case, you can use\n`Tuple[A, B, C, D]` or however many types. It's generally better to use a `dataclass`.\n\nThe standard rules don't support:\n\n 1. Using abstract types like `Iterable` or `Mapping`.\n 2. Using type variables.\n 3. Any kind of callable, coroutine, file handle, etc.\n\n#### Support for deriving from Generic\n\nThere is experimental support for deriving from `typing.Generic`. An `attrs` or `dataclass`\nmay declare itself a generic class. If another class invokes it as `YourGeneric[Param,\nParam]`, those `Param` types will be substituted into the fields during encoding. This is\nuseful to construct parameterized container types. Example:\n\n @attr.s(auto_attribs=True)\n class Wrapper(Generic[T, M]):\n body: T\n count: int\n messages: List[M]\n\n @attr.s(auto_attribs=True)\n class Message:\n first: Wrapper[str, str]\n second: Wrapper[Dict[str, str], int]\n\n#### Unions\n\nA union type lets you present alternate types that the converters will attempt in\nsequence, e.g. `typing.Union[MyType, int, MyEnum]`.\n\nThis is implemented in the `unions` rule as a so-called[2](#f2)\nundiscriminated union. It means the module won't add any additional information to the\nvalue such as some kind of explicit tag.\n\nWhen converting from Python to JSON, the checks are generally just using `isinstance`,\nbut when converting from JSON to Python, the check may be examining strings and `dict`\nfields.\n\nThus, ambiguous values, especially JSON representations, may confuse the decoder.\nSee the section on [sharp edges][sharp] for more details.\n\n### Hooks\n\nWe'll first examine decode and encode hooks. These let us entirely rewrite the JSON\nrepresentation before the normal logic is applied.\n\nLet's suppose our `Account` class used to named the `balance` field `bal` and we need to\nsupport legacy users.\n\n```python\n@dataclass\nclass Account:\n @classmethod\n def __json_pre_decode__(cls, value):\n if 'bal' in value:\n value = dict(value)\n value['balance'] = value.pop('bal')\n return value\n\n def __json_post_encode__(self, value):\n return dict(value, bal=value['balance'])\n\n ...\n```\n\nWhen we decode the value, the following sequence of steps takes place:\n\n 1. `__json_pre_decode__` is called with `{'user': 'bob', 'bal': '77.0', ...}` and it\n returns `{'user': 'bob', 'balance': '77.0', ...}`\n 2. Decoders are called against `user` and `balance` and the other fields\n 3. The resulting dictionary is passed to `Account(**result)` to construct the instance.\n\nDuring encoding, the reverse sequence takes place:\n\n 1. The instance's fields are read and passed to encoders.\n 2. The values are combined into a `dict`.\n 3. `__json_post_encode__` is called with `{'user': 'bob', 'balance': '77.0', ...}` and\n can adjust the field name to `bal`.\n\n#### JSON type check hook\n\nType checks are only used in _json-syntax_ to support `typing.Union`; in a nutshell, the\n`unions` rule will inspect some JSON to see which variant is present.\n\nIf a type-check hook is not defined, `__json_pre_decode__` will be called before the\nstandard check is completed. (The standard check attempts to determine if required\nfields are present and have the correct type.)\n\nIf you have information that can determine the type faster, a check hook can help.\n\nGoing back to our Account example, suppose we decide to support multiple account types\nthrough a special ``class`` field. This is faster and more robust.\n\n```python\nclass AbstractAccount:\n @classmethod\n def __json_check__(cls, value):\n return isinstance(value, dict) and value.get('class') == cls.__name__\n\n@dataclass\nclass AccountA(AbstractAccount):\n ...\n\nencode_account = rules.lookup(typ=Union[AccountA, AccountB, AccountC],\n verb='python_to_json')\n```\n\n### Adding custom rules\n\nSee [the extras][] for details on custom rules, but generally a rule is just a\nfunction. Say, for instance, your type has class methods that encode and decode, this\nwould be sufficient for many cases:\n\n```python\ndef my_rule(verb, typ, ctx):\n if issubclass(typ, MyType):\n if verb == 'json_to_python':\n return typ.decoder\n elif verb == 'python_to_json':\n return typ.encoder\n```\n\nIf your rule needs an encoder or decoder for a standard type, it can call\n`ctx.lookup(verb=verb, typ=subtype)`. The helper functions defined in `json_syntax.action_v1`\nare intended to stay the same so that custom rules can reuse them.\n\n### Debugging amibguous structures\n\n(May need more docs and some test cases.)\n\nAs _json-syntax_ tries to directly translate your Python types to JSON, it is possible\nto write ambiguous structures. To avoid this, there is a handy `is_ambiguous` method:\n\n```python\n# This is true because both are represented as an array of numbers in JSON.\nrules.is_ambiguous(typ=Union[List[int], Set[int]])\n\n@dataclass\nclass Account:\n user: str\n address: str\n\n# This is true because such a dictionary would always match the contents of the account.\nrules.is_ambiguous(typ=Union[Dict[str, str], Account])\n```\n\nThe aim of this is to let you put a check in your unit tests to make sure data can be\nreliably expressed given your particular case.\n\nInternally, this is using the `PATTERN` verb to represent the JSON pattern, so this may\nbe helpful in understanding how _json-syntax_ is trying to represent your data:\n\n```python\nprint(rules.lookup(typ=MyAmbiguousClass, verb='show_pattern'))\n```\n\n### Sharp edges\n\n_The RuleSet caches encoders._ Construct a new ruleset if you want to change settings.\n\n_Encoders and decoders do very little checking._ Especially, if you're translating\nPython to JSON, it's assumed that your Python classes are correct. The encoders and\ndecoders may mask subtle issues as they are calling constructors like `str` and `int`\nfor you. And, by design, if you're translating from JSON to Python, it's assumed you\nwant to be tolerant of extra data.\n\n_Everything to do with typing._ It's a bit magical and sort of wasn't designed for this.\n[We have a guide to it to try and help][types].\n\n_Union types._ You can use `typing.Union` to allow a member to be one of some number of\nalternates, but there are some caveats. You should use the `.is_ambiguous()` method of\nRuleSet to warn you of these.\n\n_Atom rules accept specific types._ At present, the rules for atomic types (`int`,\n `str`, `bool`, `date`, `float`, `Decimal`) must be declared as exactly those types. With\nmultiple inheritance, it's not clear which rule should apply\n\n_Checks are stricter than converters._ For example, a check for `int` will check whether\nthe value is an integer, whereas the converter simply calls `int` on it. Thus there are\ninputs for where `MyType` would pass but `Union[MyType, Dummy]` will fail. (Note\nthat `Optional` is special cased to look for `None` and doesn't have this problem.)\n\n_Numbers are hard._ See the rules named `floats`, `floats_nan_str`, `decimals`,\n`decimals_as_str` for details on how to get numbers to transmit reliably. There is no rule for\nfractions or complex numbers as there's no canonical way to transmit them via JSON.\n\n## Maintenance\n\nThis package is maintained via the [poetry][] tool. Some useful commands:\n\n 1. Setup: `poetry install`\n 2. Run tests: `poetry run pytest tests/`\n 3. Reformat: `black json_syntax/ tests/`\n 4. Generate setup.py: `dephell deps convert -e setup`\n 5. Generate requirements.txt: `dephell deps convert -e req`\n\n### Running tests via docker\n\nThe environments for 3.4 through 3.9 are in `pyproject.toml`, so just run:\n\n dephell deps convert -e req # Create requirements.txt\n dephell docker run -e test34 pip install -r requirements.txt\n dephell docker run -e test34 pytest tests/\n dephell docker shell -e test34 pytest tests/\n dephell docker destroy -e test34\n\n### Notes\n\n1: Writing the encoder is deceptively easy because the instances in\nPython have complete information. The standard `json` module provides a hook to let\nyou encode an object, and another hook to recognize `dict`s that have some special\nattribute. This can work quite well, but you'll have to encode *all* non-JSON types\nwith dict-wrappers for the process to work in reverse. [\u21a9](#a1)\n\n2: A discriminated union has a tag that identifies the variant, such as\nstatus codes that indicate success and a payload, or some error. Strictly, all unions\nmust be discriminated in some way if different code paths are executed. In the `unions`\nrule, the discriminant is the class information in Python, and the structure of the JSON\ndata. A less flattering description would be that this is a \"poorly\" discriminated\nunion. [\u21a9](#a2)\n\n[poetry]: https://poetry.eustace.io/docs/#installation\n[gradual typing]: https://www.python.org/dev/peps/pep-0483/#summary-of-gradual-typing\n[the extras]: https://github.com/UnitedIncome/json-syntax/tree/master/json_syntax/extras\n[typing]: https://docs.python.org/3/library/typing.html\n[types]: https://github.com/UnitedIncome/json-syntax/blob/master/TYPES.md\n[attrs]: https://attrs.readthedocs.io/en/stable/\n[dataclasses]: https://docs.python.org/3/library/dataclasses.html\n[sharp]: https://github.com/UnitedIncome/json-syntax/blob/master/README.md#sharp-edges\n[ellipsis]: https://docs.python.org/3/library/stdtypes.html#the-ellipsis-object\n[extras ddb]: https://github.com/UnitedIncome/json-syntax/tree/master/json_syntax/extras/dynamodb.py\n[extras flag]: https://github.com/UnitedIncome/json-syntax/tree/master/json_syntax/extras/flags.py\n[extras loose]: https://github.com/UnitedIncome/json-syntax/tree/master/json_syntax/extras/loose_dates.py\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/UnitedIncome/json-syntax", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "json-syntax", "package_url": "https://pypi.org/project/json-syntax/", "platform": "", "project_url": "https://pypi.org/project/json-syntax/", "project_urls": { "Homepage": "https://github.com/UnitedIncome/json-syntax", "Repository": "https://github.com/UnitedIncome/json-syntax" }, "release_url": "https://pypi.org/project/json-syntax/2.3.1/", "requires_dist": [ "python-dateutil (>=2.7,<3.0); python_version < \"3.7\"", "typing (>=3.7,<4.0); python_version < \"3.5\"" ], "requires_python": ">=3.4,<4.0", "summary": "Generates functions to convert Python classes to JSON dumpable objects.", "version": "2.3.1", "yanked": false, "yanked_reason": null }, "last_serial": 6625344, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "70c5b9aed7b864290134703d89adc80c", "sha256": "d14d3296e493eaf73b9a3348377d60d55ec1c9eae8417255fae90ec88debd37b" }, "downloads": -1, "filename": "json_syntax-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "70c5b9aed7b864290134703d89adc80c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 42100, "upload_time": "2019-02-12T23:02:32", "upload_time_iso_8601": "2019-02-12T23:02:32.364541Z", "url": "https://files.pythonhosted.org/packages/7d/fa/0b0a35300684f10331617964734ba62d0eea1eb537d573cf0b7a969ae3f2/json_syntax-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b8d7e2e5a5f7de546dacd4c41cdb037f", "sha256": "ae20d7e85a7c42ca374ac902232c72e73940c4278d5e1f20273e6b6ea4468adb" }, "downloads": -1, "filename": "json-syntax-0.1.1.tar.gz", "has_sig": false, "md5_digest": "b8d7e2e5a5f7de546dacd4c41cdb037f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 20950, "upload_time": "2019-02-12T23:02:29", "upload_time_iso_8601": "2019-02-12T23:02:29.092138Z", "url": "https://files.pythonhosted.org/packages/f4/d6/ec86f813de989a499e4e24d1f3a371d55bea5d237d80fb728629db9c67ec/json-syntax-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "ef930362f806652e71aa3e05fba9f2c9", "sha256": "fed0076e6e52f4528128044a022cd33cabf168f1945f11a247d4983e2432edca" }, "downloads": -1, "filename": "json_syntax-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ef930362f806652e71aa3e05fba9f2c9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 47011, "upload_time": "2019-02-14T22:40:23", "upload_time_iso_8601": "2019-02-14T22:40:23.513316Z", "url": "https://files.pythonhosted.org/packages/28/06/c387821397b4c5681eeb0e7e10fe5cdc9e6a3b12a411aee13f94676deba8/json_syntax-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "44985140933a17ac1af02b7ddca93ba9", "sha256": "a06f4613ec48f903a2aa86846d2337ace38d410f47954fbb47753a2f351ff2d8" }, "downloads": -1, "filename": "json-syntax-0.1.2.tar.gz", "has_sig": false, "md5_digest": "44985140933a17ac1af02b7ddca93ba9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 22981, "upload_time": "2019-02-14T22:40:22", "upload_time_iso_8601": "2019-02-14T22:40:22.070130Z", "url": "https://files.pythonhosted.org/packages/6a/9c/b4fc3ac18af33bc97a1f72883c90d3565348926eae2ccba66b02b42583b0/json-syntax-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2a0": [ { "comment_text": "", "digests": { "md5": "50baf9cd8bbdd244788c845c6fe9b7a6", "sha256": "4ebccc098fff3152d4eba198244741f99ece14902f5cf2f846ee6a4f073debcc" }, "downloads": -1, "filename": "json_syntax-0.1.2a0-py3-none-any.whl", "has_sig": false, "md5_digest": "50baf9cd8bbdd244788c845c6fe9b7a6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 47033, "upload_time": "2019-02-14T22:22:32", "upload_time_iso_8601": "2019-02-14T22:22:32.802657Z", "url": "https://files.pythonhosted.org/packages/fa/8b/86e7c4edc206a3c5d82a23cfbc386de1696c479e36e3c9752a47adba6581/json_syntax-0.1.2a0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c3f8a3a5b71db5147b4b29115bc4dae8", "sha256": "f76ae31c16dad109e6845e5260099031c6a37faa4e7fd7833e73d82d8ebfc547" }, "downloads": -1, "filename": "json-syntax-0.1.2a0.tar.gz", "has_sig": false, "md5_digest": "c3f8a3a5b71db5147b4b29115bc4dae8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 22993, "upload_time": "2019-02-14T22:22:31", "upload_time_iso_8601": "2019-02-14T22:22:31.344487Z", "url": "https://files.pythonhosted.org/packages/1f/12/57e0fe9c46308f39d7b69c85605cac96c3196921253ae4fa1ce9aa7693a3/json-syntax-0.1.2a0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1a0": [ { "comment_text": "", "digests": { "md5": "d540f1e1df657ace7b64548cc2f7bdb5", "sha256": "4ab8fa5b4e91baf3e1b21dd79cbb7d2bbb3eab702568fd6fc8063f3707963366" }, "downloads": -1, "filename": "json_syntax-0.1a0-py3-none-any.whl", "has_sig": false, "md5_digest": "d540f1e1df657ace7b64548cc2f7bdb5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 38793, "upload_time": "2019-02-05T17:41:41", "upload_time_iso_8601": "2019-02-05T17:41:41.613141Z", "url": "https://files.pythonhosted.org/packages/69/09/94aef148ff12fc18e01528b8a9d3c12de2680549704a48b0089dccb0e8aa/json_syntax-0.1a0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1b5d10b67c4b84c11d5c805f336dafc6", "sha256": "aa0c908f8909fc2b643085bb3db317af8abd54e245c30daa2e5129288834d2f7" }, "downloads": -1, "filename": "json-syntax-0.1a0.tar.gz", "has_sig": false, "md5_digest": "1b5d10b67c4b84c11d5c805f336dafc6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 19843, "upload_time": "2019-02-05T17:41:39", "upload_time_iso_8601": "2019-02-05T17:41:39.531855Z", "url": "https://files.pythonhosted.org/packages/fd/55/9269d04268182e13fe410bdf7229d169f62f9422b0e5a480e8fdedfeb4c9/json-syntax-0.1a0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "614519e6e84600ea5dfcc852568ca843", "sha256": "cb76c63d52c2bc085ffc42b9a6aed5cee88c234f4a87a8dfd3dce3c56dab0e5f" }, "downloads": -1, "filename": "json_syntax-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "614519e6e84600ea5dfcc852568ca843", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 48249, "upload_time": "2019-03-01T17:46:18", "upload_time_iso_8601": "2019-03-01T17:46:18.900866Z", "url": "https://files.pythonhosted.org/packages/f6/75/6dc6e38058d57dec5a5e8f1b64ad9cf438aa2ba5116aaeb0285eae90c6d4/json_syntax-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9da9d13245f33092e7b79e42d21e469b", "sha256": "fdb7c9236babef0a990accbe3a006c54238780d9d7306c6b77e0c4e3740366fa" }, "downloads": -1, "filename": "json-syntax-0.2.0.tar.gz", "has_sig": false, "md5_digest": "9da9d13245f33092e7b79e42d21e469b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 23510, "upload_time": "2019-03-01T17:46:17", "upload_time_iso_8601": "2019-03-01T17:46:17.708541Z", "url": "https://files.pythonhosted.org/packages/15/1f/04f01e8fb23928c3f0d76fb6f232aa322b1e7fb8d1aa69b3c4aa8434f1c0/json-syntax-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0a0": [ { "comment_text": "", "digests": { "md5": "7b946daafe6d80ce3754468308b1c058", "sha256": "81855bcbc8734c04b8abb816b94684f517432ab7c66d36fc81c50a25a03b7ba6" }, "downloads": -1, "filename": "json_syntax-0.2.0a0-py3-none-any.whl", "has_sig": false, "md5_digest": "7b946daafe6d80ce3754468308b1c058", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 47971, "upload_time": "2019-02-28T23:20:10", "upload_time_iso_8601": "2019-02-28T23:20:10.826850Z", "url": "https://files.pythonhosted.org/packages/7d/d9/6914e30d1bde0544b50c50a6dc9cff8e76fb6d9454fdece038d48bfc67e9/json_syntax-0.2.0a0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "65cbbc57ee349bea282cd69cd61f33c2", "sha256": "294ffaa727b3eecf9f3533b7bd6fc60bb1161ff10200c8b0c1e5a37e3a43f016" }, "downloads": -1, "filename": "json-syntax-0.2.0a0.tar.gz", "has_sig": false, "md5_digest": "65cbbc57ee349bea282cd69cd61f33c2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 23008, "upload_time": "2019-02-28T23:20:08", "upload_time_iso_8601": "2019-02-28T23:20:08.950465Z", "url": "https://files.pythonhosted.org/packages/8e/01/54297236f87a101623167901ea1ca82709f432d1905ea5d030045b29ff7e/json-syntax-0.2.0a0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0a1": [ { "comment_text": "", "digests": { "md5": "892517d97446ccc1ff11ef666f95c767", "sha256": "7a125a5693c29833114232624518f74ebe9073dfe798ab3bef1a38e10f7de7f2" }, "downloads": -1, "filename": "json_syntax-0.2.0a1-py3-none-any.whl", "has_sig": false, "md5_digest": "892517d97446ccc1ff11ef666f95c767", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 47971, "upload_time": "2019-02-28T23:23:41", "upload_time_iso_8601": "2019-02-28T23:23:41.132458Z", "url": "https://files.pythonhosted.org/packages/3b/3e/dea4281c1a19c64ec49835443b94d96a34f90396b0e12ac04f7f28dd52cb/json_syntax-0.2.0a1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "612d7ac8f677ec14d2ede9c6395fcf49", "sha256": "35d4019436e5f42496d8bb823b69d36a91acc4bc78dfc61527fd575fe29c073b" }, "downloads": -1, "filename": "json-syntax-0.2.0a1.tar.gz", "has_sig": false, "md5_digest": "612d7ac8f677ec14d2ede9c6395fcf49", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 23009, "upload_time": "2019-02-28T23:23:39", "upload_time_iso_8601": "2019-02-28T23:23:39.463374Z", "url": "https://files.pythonhosted.org/packages/8f/bf/8d0d1d5e795efa4d2ea32b46bcf4a568d79664f68fbff71d987e0065cf55/json-syntax-0.2.0a1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0a2": [ { "comment_text": "", "digests": { "md5": "0593c1142490b257006ca46bb87bd99f", "sha256": "c5b3ad69dfca8bd07d993ab0b79d25103937b98bc96e8a842d2d7e918a170633" }, "downloads": -1, "filename": "json_syntax-0.2.0a2-py3-none-any.whl", "has_sig": false, "md5_digest": "0593c1142490b257006ca46bb87bd99f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 48256, "upload_time": "2019-03-01T17:11:47", "upload_time_iso_8601": "2019-03-01T17:11:47.001152Z", "url": "https://files.pythonhosted.org/packages/d6/0e/e63a0e285c8b1b711cf78c87d829a368d5a4bd4b152529789f1a82161298/json_syntax-0.2.0a2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9b41e5aa79be2fb13752084c653a1540", "sha256": "aa3f14ca9caeaa54d81aeb226e92d3e0d906fd194c674d596f9cb8d44e8b5bd4" }, "downloads": -1, "filename": "json-syntax-0.2.0a2.tar.gz", "has_sig": false, "md5_digest": "9b41e5aa79be2fb13752084c653a1540", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 23548, "upload_time": "2019-03-01T17:11:45", "upload_time_iso_8601": "2019-03-01T17:11:45.576225Z", "url": "https://files.pythonhosted.org/packages/5e/c6/f09f622c0c300a9d68655ecc27d047384339fc3a3d9fd64d8d29e1cf0613/json-syntax-0.2.0a2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0a3": [ { "comment_text": "", "digests": { "md5": "146885a8b6391e9a6291d8fe9ce9527b", "sha256": "25e9315a0ba0c27a4a0768f289793f516b440837c706b30ce68ee0cc147c96a6" }, "downloads": -1, "filename": "json_syntax-0.2.0a3-py3-none-any.whl", "has_sig": false, "md5_digest": "146885a8b6391e9a6291d8fe9ce9527b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 48270, "upload_time": "2019-03-01T17:38:45", "upload_time_iso_8601": "2019-03-01T17:38:45.891106Z", "url": "https://files.pythonhosted.org/packages/c1/56/35406b04ae1604419456a73b2d203555279ab8b73ba2cd8b707be09a8761/json_syntax-0.2.0a3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "51fe3181f369f8c79214a89ac26bc22f", "sha256": "ea718c64c1dc12602f8be9e2a3ac7e7d7e1801a9e69e475fa42da6784fd318e3" }, "downloads": -1, "filename": "json-syntax-0.2.0a3.tar.gz", "has_sig": false, "md5_digest": "51fe3181f369f8c79214a89ac26bc22f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 23531, "upload_time": "2019-03-01T17:38:44", "upload_time_iso_8601": "2019-03-01T17:38:44.681861Z", "url": "https://files.pythonhosted.org/packages/fb/19/73bdec4c6550dc3c87e0e994a8f79b16dd338e263991e1e1c0478d5d17c0/json-syntax-0.2.0a3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "b4a86a1e18738bf1c877c6be694c126b", "sha256": "df6691e41349dae03794a7745d6e249329b3c35fd3aafceab5d1d50325e40077" }, "downloads": -1, "filename": "json_syntax-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b4a86a1e18738bf1c877c6be694c126b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 25516, "upload_time": "2019-04-15T18:41:21", "upload_time_iso_8601": "2019-04-15T18:41:21.194058Z", "url": "https://files.pythonhosted.org/packages/0a/56/96c07cf40308e1685f2d025bc4dff7f57fc939e722657fe579af217f8188/json_syntax-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "404e2a7883fa497b07300fc6eb302ab5", "sha256": "ba895217fd4a28d4539f572fc539c5af709004b9c481427a261be7c351f1af59" }, "downloads": -1, "filename": "json-syntax-0.2.1.tar.gz", "has_sig": false, "md5_digest": "404e2a7883fa497b07300fc6eb302ab5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 28354, "upload_time": "2019-04-15T18:41:19", "upload_time_iso_8601": "2019-04-15T18:41:19.920606Z", "url": "https://files.pythonhosted.org/packages/b4/6a/4415453f562be32d3616fa9debfd7376060d4e46b42001bdb7d7d4ab19ea/json-syntax-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0": [ { "comment_text": "", "digests": { "md5": "9bc18ffef7f8b309c7c8c0522bb383e7", "sha256": "c5ab20da738029bec6cdab91bf287449c05ad07a0c85f45a0acb2a30c45dd18f" }, "downloads": -1, "filename": "json_syntax-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9bc18ffef7f8b309c7c8c0522bb383e7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 27781, "upload_time": "2019-04-25T21:08:16", "upload_time_iso_8601": "2019-04-25T21:08:16.358779Z", "url": "https://files.pythonhosted.org/packages/3e/50/85d29e8e8b5f7b75b929fcbc9c3d498151c018cf6dcc49392b0ec33b2b09/json_syntax-1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a11d547d3ec2e6c3cf50050c4172405b", "sha256": "d93708c182f1be91ae5a0dec78fbc89167d69846ec52df4a725f9fab26df0491" }, "downloads": -1, "filename": "json-syntax-1.0.tar.gz", "has_sig": false, "md5_digest": "a11d547d3ec2e6c3cf50050c4172405b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 30744, "upload_time": "2019-04-25T21:08:14", "upload_time_iso_8601": "2019-04-25T21:08:14.214777Z", "url": "https://files.pythonhosted.org/packages/5b/5a/97ac9644934d6c97e0b7a025a7e197df1aae9d65bc1477c1bbab807ad581/json-syntax-1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "bb24e4e5a50456759964016d6aa2fecb", "sha256": "54716a5f3a507d00f6b972da886070d859ab8bda25bb589685fa0790605ca933" }, "downloads": -1, "filename": "json_syntax-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bb24e4e5a50456759964016d6aa2fecb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 27767, "upload_time": "2019-05-24T17:34:16", "upload_time_iso_8601": "2019-05-24T17:34:16.175491Z", "url": "https://files.pythonhosted.org/packages/96/96/f832c94c156f4df7fc645568783658c2938b38707f78d2cfdb0481129196/json_syntax-1.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7301c32512e56d5dd1aaf69348a99de8", "sha256": "795ac48f9ac9f2906c891a38f1e1d96d3e40301c9588537d9708ea5fb853fa8a" }, "downloads": -1, "filename": "json-syntax-1.0.1.tar.gz", "has_sig": false, "md5_digest": "7301c32512e56d5dd1aaf69348a99de8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 30702, "upload_time": "2019-05-24T17:34:14", "upload_time_iso_8601": "2019-05-24T17:34:14.581770Z", "url": "https://files.pythonhosted.org/packages/40/5f/d1518cc51a633cc0d7d840665ed1df293b7e0a0dc2eafb78e2f97d78d5a7/json-syntax-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "a022d1f5c360d97ef6f0772a6edb94f4", "sha256": "e38e695bf77540d3a1a7253cbfea6180c80b165993eef3877f4d4a324cb036c8" }, "downloads": -1, "filename": "json_syntax-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a022d1f5c360d97ef6f0772a6edb94f4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 32853, "upload_time": "2019-10-09T19:23:43", "upload_time_iso_8601": "2019-10-09T19:23:43.099237Z", "url": "https://files.pythonhosted.org/packages/a3/b7/2339a26dba37cd7c4d68fedc4c682919bb94b236dc636b3a51b102704622/json_syntax-2.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bb2e3a854584739e8751da4a8fb39fb6", "sha256": "c33babea3e808d5f25da8ac7e0ac8b9f14d8d7d5ab6b1a07c913c4a8b00c013d" }, "downloads": -1, "filename": "json-syntax-2.0.0.tar.gz", "has_sig": false, "md5_digest": "bb2e3a854584739e8751da4a8fb39fb6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 34653, "upload_time": "2019-10-09T19:23:41", "upload_time_iso_8601": "2019-10-09T19:23:41.672176Z", "url": "https://files.pythonhosted.org/packages/65/d2/6c9ab413c0ca72995bb196bdd601a06627ebf16b0090f15d2c9a9f1c6e0d/json-syntax-2.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "2d6e4c4d951c10a6da4cc2d3d27a1978", "sha256": "fb971a8bb0c35917b623115c40e4025dd0e21d741d4baa5cfd563e13aee3a3e4" }, "downloads": -1, "filename": "json_syntax-2.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2d6e4c4d951c10a6da4cc2d3d27a1978", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 33441, "upload_time": "2019-10-17T23:08:50", "upload_time_iso_8601": "2019-10-17T23:08:50.199212Z", "url": "https://files.pythonhosted.org/packages/78/c0/3835b87140f0173be2af5a97645d4a8f1849d2ef468df954da9862dd455b/json_syntax-2.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a27b92458ce6a938d599614852b9b0ec", "sha256": "f73acac91c4acae7af147ac0c16085251af0e0f86ec28b357371726c7313f698" }, "downloads": -1, "filename": "json-syntax-2.0.1.tar.gz", "has_sig": false, "md5_digest": "a27b92458ce6a938d599614852b9b0ec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 35603, "upload_time": "2019-10-17T23:08:48", "upload_time_iso_8601": "2019-10-17T23:08:48.676443Z", "url": "https://files.pythonhosted.org/packages/f4/8c/bdd46d7775fdf0563bbe315c58781f28aff6064070ded34d3e5a4074bc17/json-syntax-2.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "d15ee4c24f4458bb76e27b9d457a230d", "sha256": "f2f9f779e149ce2a0e0b15008c19db1564b854c3828b8957fe554657c25af290" }, "downloads": -1, "filename": "json_syntax-2.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d15ee4c24f4458bb76e27b9d457a230d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 34239, "upload_time": "2019-10-24T21:01:39", "upload_time_iso_8601": "2019-10-24T21:01:39.502216Z", "url": "https://files.pythonhosted.org/packages/fc/5a/a9e14a8385d9d32a96c1b85760128fc6c644f966462733bfc47bc67c7e29/json_syntax-2.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e9a344c95d383d3dedc8e348dd155f51", "sha256": "bf7206b234857851d10345679da53720681630999e56a1d764c0666f8818b9f1" }, "downloads": -1, "filename": "json-syntax-2.0.2.tar.gz", "has_sig": false, "md5_digest": "e9a344c95d383d3dedc8e348dd155f51", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 36538, "upload_time": "2019-10-24T21:01:37", "upload_time_iso_8601": "2019-10-24T21:01:37.688811Z", "url": "https://files.pythonhosted.org/packages/b5/d5/faabad47b3e7bef3750cf11c0e3fa14527af0dcd22991a8e43173ff96d61/json-syntax-2.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "5adff0b7439eb71df0da826ee3929e51", "sha256": "6cd9772d2b19ac8e9be50e0d2a21f70c941aa925848c86177ab9745cbf95dcb2" }, "downloads": -1, "filename": "json_syntax-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5adff0b7439eb71df0da826ee3929e51", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 35040, "upload_time": "2019-12-09T23:52:01", "upload_time_iso_8601": "2019-12-09T23:52:01.661718Z", "url": "https://files.pythonhosted.org/packages/d5/d8/372e9a7a6dadd3d11abcae7739b31178b477e5834796a3ae02edfa20955f/json_syntax-2.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "140ced472bd9d702f765de50e526c825", "sha256": "063c1b2ce3f656d89029db41b55ad42775798284579fcd1ea7cacdcd3153d094" }, "downloads": -1, "filename": "json-syntax-2.1.0.tar.gz", "has_sig": false, "md5_digest": "140ced472bd9d702f765de50e526c825", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 37038, "upload_time": "2019-12-09T23:51:59", "upload_time_iso_8601": "2019-12-09T23:51:59.840305Z", "url": "https://files.pythonhosted.org/packages/87/48/1eb3377ce6d8a83d053c27f594952d35850cb831c0dca539187c56c4923a/json-syntax-2.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "abf0fb146b93dafcdee06a585a1308e3", "sha256": "ef6e5d93df2bb09c456ece9d962e03e70c655c98d62d563fea22674d7f2fd187" }, "downloads": -1, "filename": "json_syntax-2.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "abf0fb146b93dafcdee06a585a1308e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 35065, "upload_time": "2019-12-10T01:15:59", "upload_time_iso_8601": "2019-12-10T01:15:59.551300Z", "url": "https://files.pythonhosted.org/packages/63/10/c8585e1dfb027576950d712cfbc14707d6cc9a1d2a5f9a1b5369e224918f/json_syntax-2.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7a59b4bef8d17c2eae300c8a62fbd8b1", "sha256": "187701c027f75e10fd73ebf3051b7d7caa0f6e1012070d488eda242ec8e2ee38" }, "downloads": -1, "filename": "json-syntax-2.1.1.tar.gz", "has_sig": false, "md5_digest": "7a59b4bef8d17c2eae300c8a62fbd8b1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 37050, "upload_time": "2019-12-10T01:15:57", "upload_time_iso_8601": "2019-12-10T01:15:57.920150Z", "url": "https://files.pythonhosted.org/packages/27/41/ebb464d94f1392c578acec1fdbe63036537ebb1bf7f7abe1d6ef6a695ce6/json-syntax-2.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "0b88789557bbdf9a0ed224551678fdcd", "sha256": "78f8146949ffce3d6f8a7e77bac1454069f149939658b1e49bcb743ad6e13abe" }, "downloads": -1, "filename": "json_syntax-2.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0b88789557bbdf9a0ed224551678fdcd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4,<4.0", "size": 36758, "upload_time": "2020-01-16T00:32:14", "upload_time_iso_8601": "2020-01-16T00:32:14.698385Z", "url": "https://files.pythonhosted.org/packages/49/89/158aed3574a1363ec51dc9012a3becd9ecc2aae5d5639b8b1bcd069f5af6/json_syntax-2.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "442b3cd49b05c3cb2c3cd2bf3b696c40", "sha256": "a3331d3f9d7d65ce33de0d108c4753db22ad3fb1245cb6364e44a7189e99d45e" }, "downloads": -1, "filename": "json-syntax-2.2.0.tar.gz", "has_sig": false, "md5_digest": "442b3cd49b05c3cb2c3cd2bf3b696c40", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4,<4.0", "size": 38614, "upload_time": "2020-01-16T00:32:13", "upload_time_iso_8601": "2020-01-16T00:32:13.031718Z", "url": "https://files.pythonhosted.org/packages/90/a8/e38acda80c48cca6608d13d3416798c0ac1946e48a2a2a52f7388aee2e05/json-syntax-2.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.3.0": [ { "comment_text": "", "digests": { "md5": "8ebfed75b0fb622ae0afb549140d0acc", "sha256": "4430b26a7ed210825bcc24946ce3b982ea4f53cc234a3d314f2abc87c63f6c39" }, "downloads": -1, "filename": "json_syntax-2.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8ebfed75b0fb622ae0afb549140d0acc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4,<4.0", "size": 36841, "upload_time": "2020-01-27T23:28:43", "upload_time_iso_8601": "2020-01-27T23:28:43.182644Z", "url": "https://files.pythonhosted.org/packages/1a/92/c397765ef7e3b0d6bf31239d5980a6b31e0a4b1c6be54e758284657cddb3/json_syntax-2.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0c3828494f0a6e9451e085ce2fb7e52f", "sha256": "2caf64a541056a62715cce2ef6f5a26251decb3749c76d90c8f4c24294ffbbca" }, "downloads": -1, "filename": "json-syntax-2.3.0.tar.gz", "has_sig": false, "md5_digest": "0c3828494f0a6e9451e085ce2fb7e52f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4,<4.0", "size": 38694, "upload_time": "2020-01-27T23:28:41", "upload_time_iso_8601": "2020-01-27T23:28:41.441625Z", "url": "https://files.pythonhosted.org/packages/01/a3/f9e7fe419716a539fc96529cd08fbfa80ca35ccd3ed621462036da97bd29/json-syntax-2.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.3.1": [ { "comment_text": "", "digests": { "md5": "69cdd4371da3b1bd59f54c987f812991", "sha256": "00d7e6327a94bd133ad77c928e57e2f3ab30d98a601647ea164bf77dbecf262b" }, "downloads": -1, "filename": "json_syntax-2.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "69cdd4371da3b1bd59f54c987f812991", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4,<4.0", "size": 36894, "upload_time": "2020-02-13T18:52:16", "upload_time_iso_8601": "2020-02-13T18:52:16.167538Z", "url": "https://files.pythonhosted.org/packages/19/e7/8eb13a2f08d8b153714e5d3b6889da8c8698e79cc59efe3147645ce7f332/json_syntax-2.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4d14c59f20690636e87c1c4f68eeb2fb", "sha256": "605e2ae49adcc80cc0d3d6febd7f0a5efd610e0372eb8f0801353314c6863c26" }, "downloads": -1, "filename": "json-syntax-2.3.1.tar.gz", "has_sig": false, "md5_digest": "4d14c59f20690636e87c1c4f68eeb2fb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4,<4.0", "size": 38792, "upload_time": "2020-02-13T18:52:14", "upload_time_iso_8601": "2020-02-13T18:52:14.490980Z", "url": "https://files.pythonhosted.org/packages/dd/4a/5c20717cdff5ead85708e47b849f589ef50d140cf50731c2c08091ae583c/json-syntax-2.3.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "69cdd4371da3b1bd59f54c987f812991", "sha256": "00d7e6327a94bd133ad77c928e57e2f3ab30d98a601647ea164bf77dbecf262b" }, "downloads": -1, "filename": "json_syntax-2.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "69cdd4371da3b1bd59f54c987f812991", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4,<4.0", "size": 36894, "upload_time": "2020-02-13T18:52:16", "upload_time_iso_8601": "2020-02-13T18:52:16.167538Z", "url": "https://files.pythonhosted.org/packages/19/e7/8eb13a2f08d8b153714e5d3b6889da8c8698e79cc59efe3147645ce7f332/json_syntax-2.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4d14c59f20690636e87c1c4f68eeb2fb", "sha256": "605e2ae49adcc80cc0d3d6febd7f0a5efd610e0372eb8f0801353314c6863c26" }, "downloads": -1, "filename": "json-syntax-2.3.1.tar.gz", "has_sig": false, "md5_digest": "4d14c59f20690636e87c1c4f68eeb2fb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4,<4.0", "size": 38792, "upload_time": "2020-02-13T18:52:14", "upload_time_iso_8601": "2020-02-13T18:52:14.490980Z", "url": "https://files.pythonhosted.org/packages/dd/4a/5c20717cdff5ead85708e47b849f589ef50d140cf50731c2c08091ae583c/json-syntax-2.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }