{ "info": { "author": "Mindey", "author_email": "mindey@qq.com", "bugtrack_url": null, "classifiers": [], "description": ".. image:: https://mindey.com/docs/metaform-logo.png\n\n*One star knowing it all...*\n\n.. code:: python\n\n # HAVING DATA:\n DATA = {\n 'a': 1.5,\n 'b': 1458266965.250572,\n 'c': [{'x': {'y': 'LT121000011101001000'}}, {'z': 'Omega'}]}\n\n # GETTING KNOWLEDGE:\n SCHEMA = {\n 'a': 'price#EUR|to.decimal',\n 'b': 'timestamp#date|to.unixtime',\n 'c': [{'*': 'contributions',\n 'x': {'*': 'origins', 'y': 'account#IBAN|to.string'},\n 'z': 'company#name|to.string'}],\n }\n\n # NORMALIZATION\n metaform.load(DATA).format(SCHEMA)\n\n # OR USE '*' TO REFERENCE SCHEMA TO PACK SCHEMA WITH DATA PACKETS:\n metaform.load(dict(DATA, **{'*': 'https://github.com/wefindx/schema/wiki/Sale#test'})).format()\n\n\nmetaform\n========\n\n.. image:: https://badge.fury.io/py/metaform.svg\n :target: https://badge.fury.io/py/metaform\n.. image:: https://badges.gitter.im/djrobstep/csvx.svg\n :alt: Join the chat at https://gitter.im/wefindx/metaform\n :target: https://gitter.im/wefindx/metaform\n\nMetaform is a package for hierarchical and nested data normalization.\n\n.. image:: https://wiki.mindey.com/shared/shots/53dcf81b7efd0573f07c5f562.png\n :target: https://wiki.mindey.com/shared/shots/56542f97f99a2b3886baa661f-what-is-metaform.mp4\n\nBasic Usage\n-----------\n\n``pip install metaform``\n\n.. code:: python\n\n import metaform\n\nIf your data had an asterisk~!\n------------------------------\n.. code:: python\n\n # INPUT\n metaform.load({\n '*': 'https://github.com/mindey/terms/wiki/person#foaf',\n 'url': 'http://dbpedia.org/resource/John_Lennon',\n 'fullname': 'John Lennon',\n 'birthdate': '1940-10-09',\n 'spouse': 'http://dbpedia.org/resource/Cynthia_Lennon'\n }).format(refresh=True)\n # (schemas are cached locally, pass refresh=True to redownload)\n\n # OUTPUT\n {\n '*': 'GH:mindey/terms/person#foaf',\n 'jsonld:id': 'http://dbpedia.org/resource/John_Lennon',\n 'foaf:name': 'John Lennon',\n 'schema:birthDate': datetime.datetime(1940, 10, 9, 0, 0),\n 'schema:spouse': 'http://dbpedia.org/resource/Cynthia_Lennon'\n }\n\nFor example, if you read an API data source:\n--------------------------------------------\n\n.. code:: python\n\n data = metaform.load('https://www.metaculus.com/api2/questions/')\n data['*'] ='https://github.com/wefindx/schema/wiki/Topic#metaculuscom-question'\n data.format()\n # Try it!\n\nOr, if your filenames had references to schema~\n-----------------------------------------------\n\n.. code:: python\n\n df = metaform.read_csv(\n 'https://gist.githubusercontent.com/mindey/3f2596e108a5c151f32e1967275a7689/raw/7c4c963219255008fdb438e8b9777cd658eea02e/hello-world.csv',\n schema={\n 0: 'Timestamp|to.unixtime',\n 1: 'KeyUpOrDown|lambda x: x==\"k\u2193\" and \"KeyDown\" or (x==\"k\u2191\" and \"KeyUp\")',\n 2: 'KeyName'},\n header=None\n )\n\nAlternatively, save schema to wiki like `here `_, and include the schema token inside filename by encoding it as sub-extension, that is, rename ``hello-world.csv`` to ``hello-world.GH~mindey+schema+KeyEvent@mykeylogger-01.csv``:\n\n.. code:: python\n\n # To get schema token for filename (GH~mindey+schema+KeyEvent@mykeylogger-01) do:\n metaform.metawiki.url2ext('https://github.com/mindey/schema/wiki/KeyEvent#mykeylogger-01')\n\n # Then rename filename in the source, and just read file remotely or locally from disk:\n df = metaform.read_csv('https://gist.githubusercontent.com/mindey/f33978b31468097b5003f032d5d85eb8/raw/9541191e4d99c052a7668223697ef0ef9ce37977/hello-world.GH~mindey+schema+KeyEvent@mykeylogger-01.csv', header=None)\n\n\nSo, what's happening here?\n--------------------------\n.. code:: python\n\n metaform.load( DATA ).format( SCHEMA )\n\nLet\u2019s say we have some data:\n\n.. code:: python\n\n data = {\n 'hello': 1.0,\n 'world': 2,\n 'how': ['is', {'are': {'you': 'doing'}}]\n }\n\nWe can get the template for defining schema, by ``metaform.template``:\n\n.. code:: python\n\n metaform.template(data)\n\n::\n\n {'*': '',\n 'hello': {'*': ''},\n 'how': [{'*': '', 'are': {'you': {'*': ''}}}],\n 'world': {'*': ''}}\n\nThis provides an opportunity to specify metadata for each key and the\nobject itself. For example:\n\n.. code:: python\n\n schema = { # A # schema = {\n '*': 'greeting', # L # '*': 'greeting',\n 'hello': {'*': 'length'}, # T # 'hello': 'length',\n 'world': {'*': 'atoms'}, # E # 'world': 'atoms',\n 'how': [ # R # 'how': [\n {'*': 'method', # N # {'*': 'method',\n 'are': { # A # 'are': {\n '*': 'yup', # T # '*': 'yup',\n 'you': {'*': 'me'}} # I # 'you': {'*': 'me'}}\n } # V # }\n ]} # E # ]}\n\n metaform.normalize(data, schema)\n\n::\n\n {'atoms': 2, 'length': 1.0, 'method': ['is', {'yup': {'me': 'doing'}}]}\n\nWe recommend saving schemas you create for normalizations for data\nanalytics and `driver projects `__ in\ndot-folders ``.schema``, in a JSON or YAML files in that folder.\n\nSo, we have access to all keys, and can specify, what to do with them:\n\n.. code:: python\n\n schema = {\n '*': 'greeting',\n 'hello': 'length|lambda x: x+5.',\n 'world': 'atoms|lambda x: str(x)+\"ABC\"',\n 'how': [\n {'*': 'method',\n 'are': {\n '*': 'yup',\n 'you': {'*': 'me|lambda x: \"-\".join(list(x))'}}\n }\n ]}\n\n metaform.normalize(data, schema)\n\n::\n\n {'atoms': '2ABC',\n 'length': 6.0,\n 'method': ['is', {'yup': {'me': 'd-o-i-n-g'}}]}\n\nAnd suppose, we want to define a more complex function, inconvenient via\nlambdas:\n\n.. code:: python\n\n from metaform import converters\n\n def some_func(x):\n a = 123\n b = 345\n return (b-a)*x\n\n converters.func = some_func\n\n schema = {\n '*': 'greeting',\n 'hello': 'length|to.func',\n 'world': 'atoms|lambda x: str(x)+\"ABC\"',\n 'how': [\n {'*': 'method',\n 'are': {\n '*': 'yup',\n 'you': {'*': 'me|lambda x: \"-\".join(list(x))'}}\n }\n ]}\n\n metaform.normalize(data, schema)\n\n::\n\n {'atoms': '2ABC',\n 'length': 222.0,\n 'method': ['is', {'yup': {'me': 'd-o-i-n-g'}}]}\n\nWe just renamed the keys, and normalized values! What else could we\nwant?\n\nNormalizing Data\n----------------\n\nSuppose we have similar data from different sources. For example, topics\nand comments are not so different after all, because if a comment\nbecomes large enough, it can stand as a topic of its own.\n\n.. code:: python\n\n topics = requests.get('https://api.infty.xyz/topics/?format=json').json()['results']\n comments = requests.get('https://api.infty.xyz/comments/?format=json').json()['results']\n\nLet\u2019s define templates for them, with the key names and types to match:\n\n.. code:: python\n\n topics_schema = [{\n 'id': 'topic-id',\n 'type': '|lambda x: {0: \"NEED\", 1: \"GOAL\", 2: \"IDEA\", 3: \"PLAN\", 4: \"STEP\", 5: \"TASK\"}.get(x)',\n 'owner': {'id': 'user-id'},\n 'blockchain': '|lambda x: x and True or False',\n }]\n\n normal_topics = metaform.normalize(topics, topics_schema)\n\n topics_df = pandas.io.json.json_normalize(normal_topics)\n topics_df.dtypes\n\n::\n\n blockchain bool\n body object\n categories object\n categories_names object\n children object\n comment_count int64\n created_date object\n data object\n declared float64\n editors object\n funds float64\n is_draft bool\n languages object\n matched float64\n owner.user-id int64\n owner.username object\n parents object\n title object\n topic-id int64\n type object\n updated_date object\n url object\n dtype: object\n\n.. code:: python\n\n comments_schema = [{\n 'id': 'comment-id',\n 'topic': 'topic-url',\n 'text': 'body',\n 'owner': {'id': 'user-id'},\n 'blockchain': '|lambda x: x and True or False',\n }]\n\n normal_comments = metaform.normalize(comments, comments_schema)\n\n comments_df = pandas.io.json.json_normalize(normal_comments)\n comments_df.dtypes\n\n::\n\n assumed_hours object\n blockchain bool\n body object\n claimed_hours object\n comment-id int64\n created_date object\n donated float64\n languages object\n matched float64\n owner.user-id int64\n owner.username object\n parent object\n remains float64\n topic-url object\n updated_date object\n url object\n dtype: object\n\n.. code:: python\n\n df = pandas.concat([topics_df, comments_df], sort=False)\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.com/wefindx/metaform", "keywords": "", "license": "ASK FOR PERMISSIONS", "maintainer": "", "maintainer_email": "", "name": "metaform", "package_url": "https://pypi.org/project/metaform/", "platform": "", "project_url": "https://pypi.org/project/metaform/", "project_urls": { "Homepage": "https://gitlab.com/wefindx/metaform" }, "release_url": "https://pypi.org/project/metaform/1.0.2.4/", "requires_dist": null, "requires_python": "", "summary": "A utility for defining metadata for data types and formats.", "version": "1.0.2.4", "yanked": false, "yanked_reason": null }, "last_serial": 7439235, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "3d4e847490b8f74a33c59cda564e29e5", "sha256": "f997b6e2194878cef9e40e6faa0a6c4acec5ecd971877e2f01dca85acba958fa" }, "downloads": -1, "filename": "metaform-1.0.0.tar.gz", "has_sig": false, "md5_digest": "3d4e847490b8f74a33c59cda564e29e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10274, "upload_time": "2019-05-05T15:52:22", "upload_time_iso_8601": "2019-05-05T15:52:22.081378Z", "url": "https://files.pythonhosted.org/packages/10/41/29e7e8166a2634cd0a3700b9501b69992114c5844af0547b785dd83ae6f0/metaform-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "2cfbbcd9e63a1ef52ae5e67d77e9e5c7", "sha256": "e8a6bd3b770000477ee3ce0771631eedaafb770280bb3b405f9fd0e92a3e5717" }, "downloads": -1, "filename": "metaform-1.0.1.tar.gz", "has_sig": false, "md5_digest": "2cfbbcd9e63a1ef52ae5e67d77e9e5c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12620, "upload_time": "2019-10-21T14:51:53", "upload_time_iso_8601": "2019-10-21T14:51:53.893261Z", "url": "https://files.pythonhosted.org/packages/fd/17/e2ad99534e43b9483def6ca6dbfef085741c70470fddc3ce33771f850b6a/metaform-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.1": [ { "comment_text": "", "digests": { "md5": "0aa0e693835b0c24b5b73a090d2781c7", "sha256": "8c8a7cc918937e7817ade9e1298543f475157861875f633dc0e6560d1d96778c" }, "downloads": -1, "filename": "metaform-1.0.1.1.tar.gz", "has_sig": false, "md5_digest": "0aa0e693835b0c24b5b73a090d2781c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13923, "upload_time": "2019-10-21T15:17:18", "upload_time_iso_8601": "2019-10-21T15:17:18.566776Z", "url": "https://files.pythonhosted.org/packages/00/98/660dcc38f009d04448ad8207ef4a676191caba8d578176b9e75a22ee4323/metaform-1.0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.2": [ { "comment_text": "", "digests": { "md5": "31fbdd10e25925dae6022294ca2717db", "sha256": "0200a212c5a5d1e1adddb8f3b820e20dbaaa431dff4a16fb4afbde7623bcf0b8" }, "downloads": -1, "filename": "metaform-1.0.1.2.tar.gz", "has_sig": false, "md5_digest": "31fbdd10e25925dae6022294ca2717db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14062, "upload_time": "2019-10-24T19:47:27", "upload_time_iso_8601": "2019-10-24T19:47:27.937907Z", "url": "https://files.pythonhosted.org/packages/25/c9/2cd30aed66ae88f359225811da96b05c837fb2facb2d8d6fe808099ec704/metaform-1.0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.3": [ { "comment_text": "", "digests": { "md5": "4d661b973db8be7d1aa8c61fed2f8f6a", "sha256": "f7923997b6d56bb9ec366c6dc2ef9919c4f290cfca42bba5455e6c81864414b5" }, "downloads": -1, "filename": "metaform-1.0.1.3.tar.gz", "has_sig": false, "md5_digest": "4d661b973db8be7d1aa8c61fed2f8f6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14343, "upload_time": "2019-11-07T15:53:34", "upload_time_iso_8601": "2019-11-07T15:53:34.187754Z", "url": "https://files.pythonhosted.org/packages/61/0c/dcdfce56eb722605e590bcd64e366f7367bbc883a99abc1a0f1433dac3a0/metaform-1.0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.4": [ { "comment_text": "", "digests": { "md5": "2530eef42583b14e5ffb9b58e378decc", "sha256": "fccc5a70bfa5a31a7a507669caf9aa0a36212c64c5bccaa496d89015fd0edfc0" }, "downloads": -1, "filename": "metaform-1.0.1.4.tar.gz", "has_sig": false, "md5_digest": "2530eef42583b14e5ffb9b58e378decc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14368, "upload_time": "2019-11-09T18:23:30", "upload_time_iso_8601": "2019-11-09T18:23:30.573699Z", "url": "https://files.pythonhosted.org/packages/65/72/b49a5c82143067354bebd76381ca3392ec8e43b52baba34a074ae8a26bbd/metaform-1.0.1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.5": [ { "comment_text": "", "digests": { "md5": "da84cc09bbdca4d4fa922b0db39aee37", "sha256": "e8bf0564d8b785e39eb55500ad4080d046808dc2d340d9d6f68f7de924831268" }, "downloads": -1, "filename": "metaform-1.0.1.5.tar.gz", "has_sig": false, "md5_digest": "da84cc09bbdca4d4fa922b0db39aee37", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14388, "upload_time": "2019-11-09T18:41:57", "upload_time_iso_8601": "2019-11-09T18:41:57.756687Z", "url": "https://files.pythonhosted.org/packages/e2/b9/72f4d1c2c773d20ba84bd1808837630ec45d75eeb0f056e8c0d9aae582cb/metaform-1.0.1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.6": [ { "comment_text": "", "digests": { "md5": "f5b88af0a088e7be001d82d25f370948", "sha256": "c218b2a1d7e3a082054c8af48dffb54503595641536f12a7113471bc55325f16" }, "downloads": -1, "filename": "metaform-1.0.1.6.tar.gz", "has_sig": false, "md5_digest": "f5b88af0a088e7be001d82d25f370948", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14459, "upload_time": "2019-11-09T18:58:33", "upload_time_iso_8601": "2019-11-09T18:58:33.778782Z", "url": "https://files.pythonhosted.org/packages/5b/48/3cfbc30b481b4fda63f82010217392b5bf35778d9a94a466a5211ea20196/metaform-1.0.1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.7": [ { "comment_text": "", "digests": { "md5": "2271125cabd610a5dc6b0ed9fa13bc4b", "sha256": "2f21eec354704c89076646305e5ff61bbead97b92ea7f648039c7266eb132b41" }, "downloads": -1, "filename": "metaform-1.0.1.7.tar.gz", "has_sig": false, "md5_digest": "2271125cabd610a5dc6b0ed9fa13bc4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15145, "upload_time": "2019-11-09T21:45:04", "upload_time_iso_8601": "2019-11-09T21:45:04.818895Z", "url": "https://files.pythonhosted.org/packages/9a/f2/814c88af4390a93788cca7e5c02b0bc0f5e090a9be6a8636000bff1b81f2/metaform-1.0.1.7.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.8": [ { "comment_text": "", "digests": { "md5": "979584d7b43f6ac1cc70ade33de7b065", "sha256": "1862eb3a3a8ad0e048ea0dd638f1206dd06b25e537cb93d2d8396e680e3edfa9" }, "downloads": -1, "filename": "metaform-1.0.1.8.tar.gz", "has_sig": false, "md5_digest": "979584d7b43f6ac1cc70ade33de7b065", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15005, "upload_time": "2019-11-09T21:53:56", "upload_time_iso_8601": "2019-11-09T21:53:56.258281Z", "url": "https://files.pythonhosted.org/packages/65/c1/424fe3b3cf10d01a0ed6fb364c346ebdf2952e6d45bd55c8f65891cf2075/metaform-1.0.1.8.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1.9": [ { "comment_text": "", "digests": { "md5": "8b470c416d3228f43a8808a8757d19ff", "sha256": "8026052e71a3843aebffb7cdd71e0f530810b07db85116c61a85cb1923a1a7aa" }, "downloads": -1, "filename": "metaform-1.0.1.9.tar.gz", "has_sig": false, "md5_digest": "8b470c416d3228f43a8808a8757d19ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15865, "upload_time": "2019-11-11T08:36:56", "upload_time_iso_8601": "2019-11-11T08:36:56.506146Z", "url": "https://files.pythonhosted.org/packages/a3/51/b63ee5bb736ce0dd2599fef3a86a02e26fe8b977f4197d756e7a25407706/metaform-1.0.1.9.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2.0": [ { "comment_text": "", "digests": { "md5": "65c909a64ad8314096d9c616d64f463d", "sha256": "5bf5a707470b21980b04ce779bd58ced9bd2df99e8efd37e43891fef7229ffc2" }, "downloads": -1, "filename": "metaform-1.0.2.0.tar.gz", "has_sig": false, "md5_digest": "65c909a64ad8314096d9c616d64f463d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15969, "upload_time": "2019-11-11T16:51:05", "upload_time_iso_8601": "2019-11-11T16:51:05.405332Z", "url": "https://files.pythonhosted.org/packages/5b/56/3b059d9e0a9eb47d70a80ad57afd81563878985fee8f4712b3ca245efa7f/metaform-1.0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2.1": [ { "comment_text": "", "digests": { "md5": "a984f5ab0b1cf7144ce3546ef644148d", "sha256": "420ba49b4c6ac0ba805ce4afadb7dc4240203fefcd1238903726f094e45fb293" }, "downloads": -1, "filename": "metaform-1.0.2.1.tar.gz", "has_sig": false, "md5_digest": "a984f5ab0b1cf7144ce3546ef644148d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15996, "upload_time": "2019-11-11T17:41:41", "upload_time_iso_8601": "2019-11-11T17:41:41.757294Z", "url": "https://files.pythonhosted.org/packages/90/50/d4ab32c5cf226e63f2d3a6fe66d0a09d0bf5d308b33e296cdc8f904caa22/metaform-1.0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2.2": [ { "comment_text": "", "digests": { "md5": "3b7fb09d8faa2f532823f4b129ce6b6d", "sha256": "73475c7dd325493e6325533c914a7897da15212d2dbcfde293c34311c3369883" }, "downloads": -1, "filename": "metaform-1.0.2.2.tar.gz", "has_sig": false, "md5_digest": "3b7fb09d8faa2f532823f4b129ce6b6d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17467, "upload_time": "2019-11-11T23:04:49", "upload_time_iso_8601": "2019-11-11T23:04:49.842776Z", "url": "https://files.pythonhosted.org/packages/53/02/906bc659343c55c301c4aaf0e33c69f2a9590c78438547599143a9558cf5/metaform-1.0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2.3": [ { "comment_text": "", "digests": { "md5": "0438590b371face06463c145563fa6e2", "sha256": "23252c5f7f2196cc97f2c2a5a010dd74039984a3a30906b65d2d9a9334ddb45d" }, "downloads": -1, "filename": "metaform-1.0.2.3.tar.gz", "has_sig": false, "md5_digest": "0438590b371face06463c145563fa6e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17985, "upload_time": "2020-06-09T01:44:48", "upload_time_iso_8601": "2020-06-09T01:44:48.353190Z", "url": "https://files.pythonhosted.org/packages/90/35/fa0ea7a444f7cfb547ece7290a5d9dd00f1da4b0ef8939f489e7d56cb25c/metaform-1.0.2.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2.4": [ { "comment_text": "", "digests": { "md5": "304cf17bf7a261af65304b3be5b45f85", "sha256": "82ad18862db4c0b5423128c8a8150d23ffdecf98ed630cd179a6e4309b24b55f" }, "downloads": -1, "filename": "metaform-1.0.2.4.tar.gz", "has_sig": false, "md5_digest": "304cf17bf7a261af65304b3be5b45f85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18146, "upload_time": "2020-06-09T23:31:27", "upload_time_iso_8601": "2020-06-09T23:31:27.810546Z", "url": "https://files.pythonhosted.org/packages/79/6b/f365b0fcf0c99133085b9c3b93928f78f913ebe10516b33e4ed4a1473ffd/metaform-1.0.2.4.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "304cf17bf7a261af65304b3be5b45f85", "sha256": "82ad18862db4c0b5423128c8a8150d23ffdecf98ed630cd179a6e4309b24b55f" }, "downloads": -1, "filename": "metaform-1.0.2.4.tar.gz", "has_sig": false, "md5_digest": "304cf17bf7a261af65304b3be5b45f85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18146, "upload_time": "2020-06-09T23:31:27", "upload_time_iso_8601": "2020-06-09T23:31:27.810546Z", "url": "https://files.pythonhosted.org/packages/79/6b/f365b0fcf0c99133085b9c3b93928f78f913ebe10516b33e4ed4a1473ffd/metaform-1.0.2.4.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }