{ "info": { "author": "Kyle Lahnakoski", "author_email": "kyle@lahnakoski.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# More JSON Tools!\n\nThis set of modules solves three problems:\n\n* We want to iterate over massive JSON easily (`mo_json.stream`)\n* A bijection between strictly typed JSON, and dynamic typed JSON.\n* Flexible JSON parser to handle comments, and other forms\n* JSON encoding is slow (`mo_json.encode`)\n\n\n## Running tests\n\n pip install -r tests/requirements.txt\n set PYTHONPATH=. \n python.exe -m unittest discover tests\n\n\n## Module Details\n\n### Method `mo_json.value2json()`\n\nConvert a `dict`, list, or primitive value to a utf-8 encoded JSON string.\n\n### Method `mo_json.json2value()`\n\nConvert a utf-8 encoded string to a data structure \n\n\n### Method `mo_json.scrub()`\n\nRemove, or convert, a number of objects from a structure that are not JSON-izable. It is faster to `scrub` and use the default (aka c-based) python encoder than it is to use `default` serializer that forces the use of an interpreted python encoder. \n\n----------------------\n\n### Module `mo_json.stream`\n\nA module that supports queries over very large JSON\nstrings. The overall objective is to make a large JSON document appear like\na hierarchical database, where arrays of any depth, can be queried like\ntables. \n\n\n#### Limitations\n\nThis is not a generic streaming JSON parser. It is only intended to breakdown the top-level array, or object for less memory usage. \n\n* **Array values must be the last object property** - If you query into a \n nested array, all sibling properties found after that array must be ignored \n (must not be in the `expected_vars`). The code will raise an exception if\n you can not extract all expected variables.\n\n----------------------\n\n### Method `mo_json.stream.parse()`\n\nWill return an iterator over all objects found in the JSON stream.\n\n**Parameters:**\n\n* **json** - a parameter-less function, when called returns some number of\n bytes from the JSON stream. It can also be a string.\n* **path** - a dot-delimited string specifying the path to the nested JSON. Use \n `\".\"` if your JSON starts with `[`, and is a list.\n* **expected_vars** - a list of strings specifying the full property names \n required (all other properties are ignored)\n\n#### Common Usage\n\nThe most common use of `parse()` is to iterate over all the objects in a large, top-level, array:\n\n parse(json, path=\".\", required_vars=[\".\"]}\n\nFor example, given the following JSON: \n\n [\n {\"a\": 1},\n {\"a\": 2},\n {\"a\": 3},\n {\"a\": 4}\n ]\n\nreturns a generator that provides\n\n {\"a\": 1}\n {\"a\": 2}\n {\"a\": 3}\n {\"a\": 4}\n\n\n#### Examples\n\n**Simple Iteration**\n\n json = {\"b\": \"done\", \"a\": [1, 2, 3]}\n parse(json, path=\"a\", required_vars=[\"a\", \"b\"]}\n\nWe will iterate through the array found on property `a`, and return both `a` and `b` variables. It will return the following values:\n\n {\"b\": \"done\", \"a\": 1}\n {\"b\": \"done\", \"a\": 2}\n {\"b\": \"done\", \"a\": 3}\n\n\n**Bad - Property follows array**\n\nThe same query, but different JSON with `b` following `a`:\n\n json = {\"a\": [1, 2, 3], \"b\": \"done\"}\n parse(json, path=\"a\", required_vars=[\"a\", \"b\"]}\n\nSince property `b` follows the array we're iterating over, this will raise an error.\n\n**Good - No need for following properties**\n\nThe same JSON, but different query, which does not require `b`:\n\n json = {\"a\": [1, 2, 3], \"b\": \"done\"}\n parse(json, path=\"a\", required_vars=[\"a\"]}\n\nIf we do not require `b`, then streaming will proceed just fine:\n\n {\"a\": 1}\n {\"a\": 2}\n {\"a\": 3}\n\n**Complex Objects**\n\nThis streamer was meant for very long lists of complex objects. Use dot-delimited naming to refer to full name of the property\n\n json = [{\"a\": {\"b\": 1, \"c\": 2}}, {\"a\": {\"b\": 3, \"c\": 4}}, ...\n parse(json, path=\".\", required_vars=[\"a.c\"])\n\nThe dot (`.`) can be used to refer to the top-most array. Notice the structure is maintained, but only includes the required variables.\n\n {\"a\": {\"c\": 2}}\n {\"a\": {\"c\": 4}}\n ...\n\n**Nested Arrays**\n\nNested array iteration is meant to mimic a left-join from parent to child table;\nas such, it includes every record in the parent. \n\n json = [\n {\"o\": 1: \"a\": [{\"b\": 1}: {\"b\": 2}: {\"b\": 3}: {\"b\": 4}]},\n {\"o\": 2: \"a\": {\"b\": 5}},\n {\"o\": 3}\n ]\n parse(json, path=[\".\", \"a\"], required_vars=[\"o\", \"a.b\"])\n\nThe `path` parameter can be a list, which is used to indicate which properties\nare expected to have an array, and to iterate over them. Please notice if no\narray is found, it is treated like a singleton array, and missing arrays still\nproduce a result.\n\n {\"o\": 1, \"a\": {\"b\": 1}}\n {\"o\": 1, \"a\": {\"b\": 2}}\n {\"o\": 1, \"a\": {\"b\": 3}}\n {\"o\": 1, \"a\": {\"b\": 4}}\n {\"o\": 2, \"a\": {\"b\": 5}}\n {\"o\": 3}\n\n**Large top-level objects**\n\nSome JSON is a single large object, rather than an array of objects. In these cases, you can use the `items` operator to iterate through all name/value pairs of an object:\n\n json = {\n \"a\": \"test\",\n \"b\": 2,\n \"c\": [1, 2]\n }\n parse(json, {\"items\":\".\"}, {\"name\", \"value\"}) \n\nproduces an iterator of\n\n {\"name\": \"a\", \"value\":\"test\"} \n {\"name\": \"b\", \"value\":2} \n {\"name\": \"c\", \"value\":[1,2]} \n\n----------------------\n\n### Module `typed_encoder`\n\n\nOne reason that NoSQL documents stores are wonderful is their schema can automatically expand to accept new properties. Unfortunately, this flexibility is not limitless; A string assigned to property prevents an object being assigned to the same, or visa-versa. This flexibility is under attack by the strict-typing zealots; who, in their self righteous delusion, believe explicit types are better. They make the lives of humans worse; as we are forced to toil over endless schema modifications.\n\nThis module translates JSON documents into \"typed\" form; which allows document containers to store both objects and primitives in the same property. This also enables the storage of values with no containing object! \n\nThe typed JSON has a different form than the original, and queries into the document store must take this into account. This conversion is intended to be hidden behind a query abstraction layer that can understand this format.\n\n#### How it works\n\nThere are three main conversions:\n\n1. Primitive values are replaced with single-property objects, where the property name indicates the data type of the value stored:\n```\n {\"a\": true} -> {\"a\": {\"~b~\": true}} \n {\"a\": 1 } -> {\"a\": {\"~n~\": 1 }} \n {\"a\": \"1\" } -> {\"a\": {\"~s~\": \"1\" }}\n```\n2. JSON objects get an additional property, `~e~`, to mark existence. This allows us to query for object existence, and to count the number of objects.\n``` \n {\"a\": {}} -> {\"a\": {}, \"~e~\": 1} \n```\n3. JSON arrays are contained in a new object, along with `~e~` to count the number of elements in the array:\n``` \n {\"a\": [1, 2, 3]} -> {\"a\": {\n \"~e~\": 3, \n \"~N~\":[\n {\"~n~\": 1},\n {\"~n~\": 2},\n {\"~n~\": 3}\n ]\n }}\n```\nPlease notice the sum of `a.~e~` works for both objects and arrays; letting us interpret sub-objects as single-value nested object arrays. \n\n### Function `typed_encode()`\n\nAccepts a `dict`, `list`, or primitive value, and generates the typed JSON that can be inserted into a document store.\n\n### Function `json2typed()`\n\nConverts an existing JSON unicode string and returns the typed JSON unicode string for the same.\n\n\n----------------------\n\n\n### Module `mo_json.encode`\n\n### Function: `mo_json.encode.json_encoder()`\n\n----------------------\n\n**Update Mar2016** - *PyPy version 5.x appears to have improved C integration to\nthe point that the C library callbacks are no longer a significant overhead:\nThis pure Python JSON encoder is no longer faster than a compound C/Python\nsolution.*\n\nFast JSON encoder used in `convert.value2json()` when running in Pypy. Run the\n[speedtest](https://github.com/klahnakoski/pyLibrary/blob/dev/tests/speedtest_json.py)\nto compare with default implementation and ujson", "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/klahnakoski/mo-json", "keywords": "", "license": "MPL 2.0", "maintainer": "", "maintainer_email": "", "name": "mo-json", "package_url": "https://pypi.org/project/mo-json/", "platform": "", "project_url": "https://pypi.org/project/mo-json/", "project_urls": { "Homepage": "https://github.com/klahnakoski/mo-json" }, "release_url": "https://pypi.org/project/mo-json/2.53.19239/", "requires_dist": null, "requires_python": "", "summary": "More JSON Tools!", "version": "2.53.19239" }, "last_serial": 5738249, "releases": { "1.0.17035": [ { "comment_text": "", "digests": { "md5": "a0fa38caf149f9135d83a368b39f7def", "sha256": "49f2810ee4eb54773ae01cb3282f84c9f42b2277f8768e29b62c932a80d01858" }, "downloads": -1, "filename": "mo_json-1.0.17035-py2.7.egg", "has_sig": false, "md5_digest": "a0fa38caf149f9135d83a368b39f7def", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 43319, "upload_time": "2017-02-03T20:57:52", "url": "https://files.pythonhosted.org/packages/38/fe/9d587f9ae4d25f11bb5ccf4702b5837f97c4cba5da3df264b0514b14d850/mo_json-1.0.17035-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "c4f1e714e03e636a2ec6737274debbfa", "sha256": "5dae2825bc6a36eabeae047dbbcee2f51f531ad209fb09728fe4a1690ce35812" }, "downloads": -1, "filename": "mo-json-1.0.17035.zip", "has_sig": false, "md5_digest": "c4f1e714e03e636a2ec6737274debbfa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27655, "upload_time": "2017-02-03T20:57:57", "url": "https://files.pythonhosted.org/packages/91/53/799785f7bbf5dba82700d128c614b78425e2c8f3ea3d8d271fb64c4e3b1d/mo-json-1.0.17035.zip" } ], "1.0.17039": [ { "comment_text": "", "digests": { "md5": "f8a99f3118150d8fa1225ee939cbb720", "sha256": "bc80e1d3e857eadbb82bc49040a3da2f56c4af5c495806ac3b0e0f4c7d3f2aaa" }, "downloads": -1, "filename": "mo_json-1.0.17039-py2.7.egg", "has_sig": false, "md5_digest": "f8a99f3118150d8fa1225ee939cbb720", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 43610, "upload_time": "2017-02-07T14:46:00", "url": "https://files.pythonhosted.org/packages/e7/78/624f0b9b9e11f5014bd72805c972f265df9f637e7db9177b9d398e75bda1/mo_json-1.0.17039-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "c6bf2907b1a93faabee3e40c72b93430", "sha256": "377932550a4abbc01849d069be4fb71cacfbc776926c5bbb566c7aa84820ec4a" }, "downloads": -1, "filename": "mo-json-1.0.17039.zip", "has_sig": false, "md5_digest": "c6bf2907b1a93faabee3e40c72b93430", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28013, "upload_time": "2017-02-07T14:46:05", "url": "https://files.pythonhosted.org/packages/e1/24/7fdd64280c280c8ea61868785132fd1e6a76eeb0161a884aa2750baa5bf0/mo-json-1.0.17039.zip" } ], "1.0.17041": [ { "comment_text": "", "digests": { "md5": "eef660c1844ac70f5e346bfe446caa52", "sha256": "d6abe8e21d39b32dfab768957ca38c320d8c71e2b3bf3316a99a791a3cf3a13d" }, "downloads": -1, "filename": "mo_json-1.0.17041-py2.7.egg", "has_sig": false, "md5_digest": "eef660c1844ac70f5e346bfe446caa52", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 19971, "upload_time": "2017-02-09T16:40:05", "url": "https://files.pythonhosted.org/packages/e1/7a/375761bfc4af022e411b7efe8404a4ce96cccd742e10414c6faf0889ae3f/mo_json-1.0.17041-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "05c142a974c83b146c3784729098a5ac", "sha256": "69cbf85be7f03e738db00b6ce078744798bff1e826df9412b7d2050b1df2494c" }, "downloads": -1, "filename": "mo-json-1.0.17041.zip", "has_sig": false, "md5_digest": "05c142a974c83b146c3784729098a5ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28000, "upload_time": "2017-02-09T16:40:10", "url": "https://files.pythonhosted.org/packages/cf/dd/06ef2ae61eb6176dcc9e46987a819c8d70248c70422f74e15877817d8acb/mo-json-1.0.17041.zip" } ], "1.0.17049": [ { "comment_text": "", "digests": { "md5": "64efcbc363e164b770a4e67a82d3f9ae", "sha256": "8196188bff493a0081a205e2b7aa8359dfcbfeeb4e70d62519dcc1087c5aab78" }, "downloads": -1, "filename": "mo_json-1.0.17049-py2.7.egg", "has_sig": false, "md5_digest": "64efcbc363e164b770a4e67a82d3f9ae", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 19973, "upload_time": "2017-02-18T02:10:12", "url": "https://files.pythonhosted.org/packages/24/9f/196bfdc87563da5284fd906b9f99b67202d4a1ab2124d17bcb9711b56eee/mo_json-1.0.17049-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "ff72e75f5978820ae1454abc082e0c38", "sha256": "ece17a3c23fa4c6746b2044a8039a90eccaff259b38acc7452925496744d21b2" }, "downloads": -1, "filename": "mo-json-1.0.17049.zip", "has_sig": false, "md5_digest": "ff72e75f5978820ae1454abc082e0c38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28004, "upload_time": "2017-02-18T02:10:16", "url": "https://files.pythonhosted.org/packages/2a/2b/1c6f900008c41d2f325ee5e6e890928994fe9bd6f9abf676f3b091f89117/mo-json-1.0.17049.zip" } ], "1.0.17056": [ { "comment_text": "", "digests": { "md5": "ee6a1471ea4877d048913ef3799ed996", "sha256": "a9cbed1eaa5c49804f7da98cdc63b4e51d217c9145c4420b97d6d916f9d5b41a" }, "downloads": -1, "filename": "mo_json-1.0.17056-py2.7.egg", "has_sig": false, "md5_digest": "ee6a1471ea4877d048913ef3799ed996", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 19973, "upload_time": "2017-02-25T20:29:11", "url": "https://files.pythonhosted.org/packages/0d/cf/5a924f6e339877a8303f4a89aa93ef95bff1373be152d1d11c737a0fa783/mo_json-1.0.17056-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "cc60fabf0dc518a37e686206286f362c", "sha256": "1e9d8c01adcce78e99ec1d970a2a800f512c1156cb808b7350436b7e63972997" }, "downloads": -1, "filename": "mo-json-1.0.17056.zip", "has_sig": false, "md5_digest": "cc60fabf0dc518a37e686206286f362c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28005, "upload_time": "2017-02-25T20:29:15", "url": "https://files.pythonhosted.org/packages/da/57/bf1f03fe295d1ba3cc50d259fa3d16b5fbc2563f1e9038e81b2642fea63d/mo-json-1.0.17056.zip" } ], "1.0.17085": [ { "comment_text": "", "digests": { "md5": "7af910d3a0b363b73532244b329fbb79", "sha256": "a02a588bdc531433acdc6fb45c11cbd5dd09375e818318c5cf70be9a7e16656a" }, "downloads": -1, "filename": "mo_json-1.0.17085-py2.7.egg", "has_sig": false, "md5_digest": "7af910d3a0b363b73532244b329fbb79", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 19988, "upload_time": "2017-03-26T12:37:21", "url": "https://files.pythonhosted.org/packages/72/37/bdca72bb09b23b2cc8cb0b69fcc5556c84cdf273b822315c3673a76c9ba9/mo_json-1.0.17085-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "8ecc1439c82fbd994a870b0c938d2e4d", "sha256": "187f72ae28370f232f1e78a9dca81361512924b8927b451fd90f6634ef3683ec" }, "downloads": -1, "filename": "mo-json-1.0.17085.zip", "has_sig": false, "md5_digest": "8ecc1439c82fbd994a870b0c938d2e4d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28020, "upload_time": "2017-03-26T12:37:24", "url": "https://files.pythonhosted.org/packages/72/05/aef88cb2e92b65a45dd2bd2130fc598ebf68806102fef2ea3fd5f91f272a/mo-json-1.0.17085.zip" } ], "1.0.17131": [ { "comment_text": "", "digests": { "md5": "167eff3106fc28f0a5deff6c49f01377", "sha256": "da06b62171e976093ee7806803f2cd220a37d9b2f019a174e3dc0b15f0c07448" }, "downloads": -1, "filename": "mo-json-1.0.17131.zip", "has_sig": false, "md5_digest": "167eff3106fc28f0a5deff6c49f01377", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35807, "upload_time": "2017-05-11T13:43:09", "url": "https://files.pythonhosted.org/packages/84/d5/a561cbb42b6b91d7406938702e8ac282a43beeb5b154afd7cb93b2fec770/mo-json-1.0.17131.zip" } ], "1.0.17168": [ { "comment_text": "", "digests": { "md5": "d76be109d84d23b2c4133c0e276fa3d5", "sha256": "db90af0c198f23b84434bd5a499a80e8a643dc1562ff2fce34d803b1de12608f" }, "downloads": -1, "filename": "mo-json-1.0.17168.zip", "has_sig": false, "md5_digest": "d76be109d84d23b2c4133c0e276fa3d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35879, "upload_time": "2017-06-17T20:35:00", "url": "https://files.pythonhosted.org/packages/a8/4c/228f2b1de7c40faf2150a9925674aedc0558c9602992e620d292f631434a/mo-json-1.0.17168.zip" } ], "1.0.17227": [ { "comment_text": "", "digests": { "md5": "44e777cf3dd36f19eeabea32c0a0f312", "sha256": "6dd0673d7cea2a54c02b32ccfccda5f55afbb0b3797e0a12df2f2605d9d332d7" }, "downloads": -1, "filename": "mo-json-1.0.17227.zip", "has_sig": false, "md5_digest": "44e777cf3dd36f19eeabea32c0a0f312", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35986, "upload_time": "2017-08-15T12:58:27", "url": "https://files.pythonhosted.org/packages/4f/8f/df33372f07c88f03f585cda9230f56695b1114053f0a39893499628ff30b/mo-json-1.0.17227.zip" } ], "1.0.17236": [ { "comment_text": "", "digests": { "md5": "60214023abb964abc23d8f08641f32ad", "sha256": "46af959ae877c60b45e56f45ebdefd127af1630fa9245a6e1fb2c47a06925980" }, "downloads": -1, "filename": "mo-json-1.0.17236.zip", "has_sig": false, "md5_digest": "60214023abb964abc23d8f08641f32ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36194, "upload_time": "2017-08-24T16:58:07", "url": "https://files.pythonhosted.org/packages/4b/7a/67a74c8fd40cdd605070a8f3c89d1f2eacd4c22f14283c03bbc12038fb16/mo-json-1.0.17236.zip" } ], "1.2.17304": [ { "comment_text": "", "digests": { "md5": "76d84262e0aeb93ff3847ec2119a1c50", "sha256": "86ee47ba2e630feb599187d0a7b979c76202555094536cd263be00f2af11896a" }, "downloads": -1, "filename": "mo-json-1.2.17304.tar.gz", "has_sig": false, "md5_digest": "76d84262e0aeb93ff3847ec2119a1c50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22943, "upload_time": "2017-10-31T12:50:40", "url": "https://files.pythonhosted.org/packages/e9/b2/11242fae68acd15216cf2e68de8c0adee91985a8818980926df648a521aa/mo-json-1.2.17304.tar.gz" } ], "2.1.17319": [ { "comment_text": "", "digests": { "md5": "7df03f58c90bc81d370aaf488a2fbc42", "sha256": "25429f348befe0969fd8e3622dbe31ff17639162ace502b59c4990f922b22382" }, "downloads": -1, "filename": "mo-json-2.1.17319.tar.gz", "has_sig": false, "md5_digest": "7df03f58c90bc81d370aaf488a2fbc42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23100, "upload_time": "2017-11-15T19:22:33", "url": "https://files.pythonhosted.org/packages/de/d0/89152cc8533a929058d5dc8cf6df447196927876c29f34764c45c742b009/mo-json-2.1.17319.tar.gz" } ], "2.1.18025": [ { "comment_text": "", "digests": { "md5": "45ea49eb8d02ec5d01c5c1bc8ebfae9e", "sha256": "561bd6d1e2b743c098b37d5afcefce1390bc99c0889de28ce4f1ef45692dfd91" }, "downloads": -1, "filename": "mo-json-2.1.18025.tar.gz", "has_sig": false, "md5_digest": "45ea49eb8d02ec5d01c5c1bc8ebfae9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22443, "upload_time": "2018-01-25T17:39:49", "url": "https://files.pythonhosted.org/packages/42/d1/e5951e07a0c336e333e90fc3502ef6197ed83f8ef1fc131bfa666ab88b55/mo-json-2.1.18025.tar.gz" } ], "2.16.18199": [ { "comment_text": "", "digests": { "md5": "e58e06365f16ee75d224ef6aa0d93470", "sha256": "9b81432267936635306e7143181b89b6a5d5161ca2ae33f590fcb9ee7dedbe0b" }, "downloads": -1, "filename": "mo-json-2.16.18199.tar.gz", "has_sig": false, "md5_digest": "e58e06365f16ee75d224ef6aa0d93470", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25344, "upload_time": "2018-07-18T12:18:08", "url": "https://files.pythonhosted.org/packages/5d/a2/3a1da31d26c2d0fdeb2000258e34a88dd271e1f3f3c198c5653b915a5ee2/mo-json-2.16.18199.tar.gz" } ], "2.18.18240": [ { "comment_text": "", "digests": { "md5": "8b01c97a5e6fba63adbabba71b9955e2", "sha256": "d8b59c54349bfea52a69305264956d41e2a0903a1d99ce0ae0a7cdb1750076e9" }, "downloads": -1, "filename": "mo-json-2.18.18240.tar.gz", "has_sig": false, "md5_digest": "8b01c97a5e6fba63adbabba71b9955e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25567, "upload_time": "2018-08-28T13:22:17", "url": "https://files.pythonhosted.org/packages/d5/38/9b514816e802db00a6eb6635c1f645c2d7ab7409c820e11e209f5da4454c/mo-json-2.18.18240.tar.gz" } ], "2.33.19026": [ { "comment_text": "", "digests": { "md5": "0f769b7feb4941f19dc9a6c1bb3b6835", "sha256": "f3b8ac6adc6c26f3ae64fb09e727e2f7b730531b6a48987a6ca9160bce4ea441" }, "downloads": -1, "filename": "mo-json-2.33.19026.tar.gz", "has_sig": false, "md5_digest": "0f769b7feb4941f19dc9a6c1bb3b6835", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19494, "upload_time": "2019-01-26T15:04:28", "url": "https://files.pythonhosted.org/packages/97/f3/8fe6a4e091fd9bd4d0824d4a7f3090cb893f6c4216e2136d504659ff0059/mo-json-2.33.19026.tar.gz" } ], "2.40.19027": [ { "comment_text": "", "digests": { "md5": "5c93aa310e23c4c6267f9ab46f01dff5", "sha256": "729e5bebac456ec9c51dca7f1e4a2a6e646ef5fdb64977a2e85fa6566475cf4e" }, "downloads": -1, "filename": "mo-json-2.40.19027.tar.gz", "has_sig": false, "md5_digest": "5c93aa310e23c4c6267f9ab46f01dff5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19517, "upload_time": "2019-01-27T01:53:32", "url": "https://files.pythonhosted.org/packages/a3/d5/900979600d1e06ad0181bf1720b80795cde02bdd145c1e75962dbc8e924d/mo-json-2.40.19027.tar.gz" } ], "2.43.19055": [ { "comment_text": "", "digests": { "md5": "f78cd194ae5f4053b4154241a8aa0505", "sha256": "2ee78dbd16653c5fdb95b11baf95b20c45c610b7550d06b22b748ac21b4707c8" }, "downloads": -1, "filename": "mo-json-2.43.19055.tar.gz", "has_sig": false, "md5_digest": "f78cd194ae5f4053b4154241a8aa0505", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19482, "upload_time": "2019-02-24T18:49:58", "url": "https://files.pythonhosted.org/packages/08/17/a10a2e6ab73da8f715917a1c2c348b603bc01a5579455bcc684d69424484/mo-json-2.43.19055.tar.gz" } ], "2.53.19239": [ { "comment_text": "", "digests": { "md5": "649280ebf1e2677a9dd330f83c775f5c", "sha256": "5f679ce94e7e4176d39ec3569c9d2c5a06083abcb25d65cd6ac5748dabec72c8" }, "downloads": -1, "filename": "mo-json-2.53.19239.tar.gz", "has_sig": false, "md5_digest": "649280ebf1e2677a9dd330f83c775f5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19552, "upload_time": "2019-08-27T17:25:02", "url": "https://files.pythonhosted.org/packages/ef/dc/5b2bbf45257c81f3e15825c5849c0e76c1520dd5dfbd5e9fef9b0dfe141b/mo-json-2.53.19239.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "649280ebf1e2677a9dd330f83c775f5c", "sha256": "5f679ce94e7e4176d39ec3569c9d2c5a06083abcb25d65cd6ac5748dabec72c8" }, "downloads": -1, "filename": "mo-json-2.53.19239.tar.gz", "has_sig": false, "md5_digest": "649280ebf1e2677a9dd330f83c775f5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19552, "upload_time": "2019-08-27T17:25:02", "url": "https://files.pythonhosted.org/packages/ef/dc/5b2bbf45257c81f3e15825c5849c0e76c1520dd5dfbd5e9fef9b0dfe141b/mo-json-2.53.19239.tar.gz" } ] }