{ "info": { "author": "Tyler Tolton", "author_email": "tjtolton@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "=========================\nSchemagic / Schemagic.web\n=========================\n.. image:: https://img.shields.io/badge/pypi-v0.9.1-blue.svg\n :target: https://pypi.python.org/pypi/schemagic\n.. image:: https://img.shields.io/badge/ReadTheDocs-latest-red.svg\n :target: http://schemagic.readthedocs.io/en/latest/schemagic.html\n.. image:: https://travis-ci.org/Mechrophile/schemagic.svg?branch=master\n :target: https://travis-ci.org/Mechrophile/schemagic/\nRemove the Guesswork from Data Processing\n=========================================\n\n\nSchemagic is a rather utilitarian re-imagining of the wonderful and powerful clojure library `Schema `_!\nSchemagic.web is what programmers do when they hate web programming, but want to make their programs accessible to the web.\n\n\nInstallation\n------------\n\nIt's a wheel on Pypi, and it's 2 and 3 compatible.\nTo install Schemagic, simply:\n\n.. code-block:: bash\n\n $ pip install schemagic\n\nWhat is schemagic?\n------------------\n\nOne of the difficulties with large scale, multi-team python efforts is the overhead of understanding the kind of data\n(e.g., list of strings, nested map from long to string to double) that a function or a webservice expects and returns.\nPython lacks static typing and, moreover, static typing is insufficient to capture and validate custom business types,\nwhich ultimately is what holds back teams from rapidly iterating on each others work.[1]\n\nTo you, the programmer, schemagic is all about three things:\n\n* data **description** using the simplest python data structures and an easily extensible syntax\n* data **communication** between teams, enhancing documentation, giving feedback when something went wrong.\n* data **validation** based on descriptions of data that have been documented and communicated.\n Comments describing the shape of data are insufficient in real world applications.\n Unless the documentation is backed up by programmatic verification, the documentation gets initially ignored,\n and ultimately falls behind the actual program behavior.\n\nIn other words, **schemagic is all about data**.\n\n\nGetting Acquainted with Schemagic\n---------------------------------\n\nLets build a schema and start using it.\n\n.. code-block:: python\n\n >>> import schemagic\n >>> list_of_ints = [int]\n >>> schemagic.validate_against_schema(list_of_ints, [1, 2, 3])\n [1, 2, 3]\n >>> schemagic.validate_against_schema(list_of_ints, [\"hello\", \"my friends\"])\n Traceback (most recent call last):\n ...\n ValueError: invalid literal for int() with base 10: 'hello'\n\nThe error you see here (customizeable) is the error you get when you try to call:\n\n.. code-block:: python\n\n >>> int(\"hello\")\n Traceback (most recent call last):\n ...\n ValueError: invalid literal for int() with base 10: 'hello'\n\nAnd it occurred because list_of_ints specified that the function to check every member of the list against was int()\n\n\nBasic Schemagic Usage\n---------------------\n\nSchema checking is quite flexible, and all checks are done recursively. Lets go through some more examples:\n\n**Map Template**:\n*if you only provide a schema with one (callable) key and one value*\n\n.. code-block:: python\n\n >>> string_to_int_map = {str:int}\n >>> schemagic.validate_against_schema(string_to_int_map, {\"hello\": 5, \"friends\": 6})\n {'friends': 6, 'hello': 5}\n\n**Map with Specific Keys**\n*if you provide a schema with strings as keys*\n\n.. code-block:: python\n\n >>> friend_record = {\"name\":str, \"age\": int}\n >>> schemagic.validate_against_schema(friend_record, {\"name\": \"Tyler\", \"age\": 400})\n {'name': 'Tyler', 'age': 400}\n\n**Sequence Template**:\n*if you provide a sequence containing only one item as a schema*\n\n.. code-block:: python\n\n >>> list_of_ints = [int]\n >>> schemagic.validate_against_schema(list_of_ints, [1, 2, 3, 4])\n [1, 2, 3, 4]\n\n**Strict Sequence**:\n*if you provide a sequence with multiple items as a schema*\n\n.. code-block:: python\n\n >>> list_with_3_items_int_str_and_intstrmap = [int, str, {int: str}]\n >>> schemagic.validate_against_schema(list_with_3_items_int_str_and_intstrmap, [1, \"hello\", {5: \"friends\", 12: \"and\", 90: \"world\"}])\n [1, \"hello\", {5: \"friends\", 12: \"and\", 90: \"world\"}]\n\n**Validation Function**:\n*if you provide a function as a schema*\n\n.. code-block:: python\n\n >>> def null(data):\n ... if data is not None:\n ... raise TypeError(\"expected Nonetype, got {0}\".format(data))\n >>> schemagic.validate_against_schema(null, None)\n >>> schemagic.validate_against_schema(null, \"hello!\")\n Traceback (most recent call last):\n ...\n TypeError: expected Nonetype, got hello\n\n\n**Compose Schema Definitions Recursively Ad Nauseam**:\n*this is where the real value lies*\n\n.. code-block:: python\n\n >>> def enum(*possible_values):\n ... def _validator(data):\n ... if not data in possible_values:\n ... raise ValueError()\n ... return data\n ... return _validator\n >>> event = {\n ... \"event_type\": enum(\"PRODUCTION\", \"DEVELOPMENT\"),\n ... \"event_name\": str\n ...}\n >>> dispatch_request = {\n ... \"events\": [event],\n ... \"requested_by\": str\n ...}\n >>> schemagic.validate_against_schema(dispatch_request,\n ... {\"events\": [{\"event_type\": \"DEVELOPMENT\",\n ... \"event_name\": \"demo_business_process\"},\n ... {\"event_type\": \"DEVELOPMENT\",\n ... \"event_name\": \"demo_other_business_process\"}],\n ... \"requested_by\": \"Tyler Tolton\"})\n {\"events\": [{\"event_type\": \"DEVELOPMENT\", \"event_name\": \"demo_business_process\"}, {\"event_type\": \"DEVELOPMENT\", \"event_name\": \"demo_other_business_process\"}], \"requested_by\": \"Tyler Tolton\"}\n\n\nSchemagic.validator Usage\n-------------------------\n\n**Use the Schemagic.validator for increased message clarity and control**:\n\n.. code-block:: python\n\n >>> list_of_ints_validator = schemagic.validator([int], \"Business Type: list of integers\")\n >>> list_of_ints_validator([1, \"not an int\", 3])\n Traceback (most recent call last):\n ...\n ValueError: Bad value provided for Business Type: list of integers. - error: ValueError: invalid literal for int() with base 10: 'not an int' schema: [] value: [1, 'not an int', 3]\n\n**Supply predicate to prevent/enable validation conditionally**:\n\n.. code-block:: python\n\n >>> __env__ = None\n >>> WHEN_IN_DEV_ENV = lambda: __env__ == \"DEV\"\n >>> validate_in_dev = partial(schemagic.validator, validation_predicate=WHEN_IN_DEV_ENV)\n >>> list_of_ints_validator = validate_in_dev([int], \"integer list\")\n >>> __env__ = \"DEV\"\n >>> list_of_ints_validator([1, \"not an int\", 3])\n Traceback (most recent call last):\n ...\n ValueError: Bad value provided for integer list. - error: ValueError: invalid literal for int() with base 10: 'not an int' schema: [] value: [1, 'not an int', 3]\n >>> __env__ = \"PROD\"\n >>> list_of_ints_validator([1, \"not an int\", 3])\n [1, \"not an int\", 3]\n\n\n**Coerce data as it is validated**:\n*note: validate_against_schema will do this automatically. see docs on validator.*\n\n.. code-block:: python\n\n >>> validate_and_coerce = partial(schemagic.validator, coerce_data=True)\n >>> list_of_ints_validator_and_coercer = validate_and_coerce([int], \"integer list\")\n >>> list_of_ints_validator_only = schemagic.validator([int], \"integer_list\")\n >>> list_of_ints_validator_only([\"1\", \"2\", \"3\"])\n [\"1\", \"2\", \"3\"]\n >>> # Note that the if you pass an integer string to int() it returns an integer.\n >>> # this makes it s dual purpose validator and coercer.\n >>> list_of_ints_validator_and_coercer([\"1\", \"2\", \"3\"])\n [1, 2, 3]\n\n\nSchemagic.web\n-------------\n\nSchemagic.web is where rubber meets the road in practical usage. It provides an easy way to communicate between\nservices, between developers, and between development teams in an agile environment. The webservice business world was\nthe furnace in which schemagic was forged. Get ready to outsource yourself.\n\nTo demo the schemagic.web workflow, lets assume the roles of the first people in the world to discover a way\nto (gasp) compute the fibonacci sequence in python.\n\n*note: this code is all pulled from Peter Norvig's excellent* `Design of Computer Programs `_ *Udacity class.*\n\n.. code-block:: python\n\n def memo(fn):\n _cache = {}\n def _f(*args):\n try:\n return _cache[args]\n except KeyError:\n _cache[args] = result = fn(*args)\n return result\n except TypeError:\n return fn(*args)\n _f.cache = _cache\n return _f\n\n @memo\n def fib(n):\n if n == 0 or n == 1:\n return 1\n else:\n return fib(n - 1) + fib(n - 2)\n\n >>> fib(30)\n 1346269\n\nBrilliant! Well, now we'll of course want to share this discovery with the world in the form of a microservice, so that\nothers need not know the inner workings of this complex and dangerous algorithm.\n\nLets walk through how we might set up this webservice in flask:\n\n.. code-block:: python\n\n from flask import Flask, json\n from fibonacci import fib # assuming we implemented the function in fibonnaci.py\n\n app = Flask(__name__)\n\n @app.route(\"/fibonacci/\")\n def web_fib_endpoint(index):\n try:\n index = int(index)\n except ValueError:\n return Response(\n status=400,\n response=\"Argument to /fibonacci/ must be an integer\"\n )\n return Response(\n status=200,\n response=json.dumps(fib(index))\n )\n\n\n if __name__ == '__main__':\n app.run(port=5000)\n\n\nWhile this pattern is certainly serviceable, it is rather heavyweight to simply expose a function to the web.\nAdditionally, the code doesn't lend itself well to easily documenting its input and output.\nLets see an adapted version of this code using schemagic.web utilities.\n\n.. code-block:: python\n\n from flask.app import Flask\n from fibonacci import fib # assuming we implemented the function in fibonnaci.py\n from schemagic.web import service_registry\n\n app = Flask(__name__)\n register_fibonnacci_services = service_registry(app)\n\n register_fibonnacci_services(\n dict(rule=\"/fibonacci\",\n input_schema=int,\n output_schema=int,\n fn=fib))\n\n if __name__ == '__main__':\n app.run(port=5000)\n\nThere, now we simply *describe* our service with data.\nWhat is the service endpoint, what is the input, what is the output,\nand what is the implementation that delivers the contract defined herein.\n\n#. The webservices all uniformally use POST requests to transmit data. The data supplied to the endpoints comes from the payload of the request.\n\nHow to Contribute\n-----------------\n#. This codebase uses the popular `git flow `_ model for version control\n#. Fork `the repository`_ and make a branch off of develop, (ideally using the naming convention feature/your-feature)\n#. When you've finished your feature, make a pull request back into develop.\n#. Once you've made your pull request, email `the maintainer`_ and let me know!\n#. Finally, if you ever have any questions about how or what to contribute, feel free to send an email!\n\n.. _`the repository`: https://github.com/TJTolton/schemagic\n.. _`the maintainer`: tjtolton@gmail.com\n\nDocumentation\n=============\n\nThis project autogenerates it's documentation using sphinx and hosts it using readthedocs. It can be viewed `here `_\n\n\n.. [1] Please note: this description is adapted from the excellently phrased introduction to the `prismatic/schema `_ clojure library this project was based on\n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Mechrophile/schemagic", "keywords": "schema,schemas,schemata,validate,validation,validatorjson,REST,webservice,flask,POSTagile", "license": "LGPL", "maintainer": null, "maintainer_email": null, "name": "schemagic", "package_url": "https://pypi.org/project/schemagic/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/schemagic/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/Mechrophile/schemagic" }, "release_url": "https://pypi.org/project/schemagic/0.9.1/", "requires_dist": null, "requires_python": null, "summary": "Define the shape of your data with simple python data structures. Use those data descriptions to validate your application.", "version": "0.9.1" }, "last_serial": 2240456, "releases": { "0.1.12": [ { "comment_text": "", "digests": { "md5": "2d1a28241fa51cfbe00f6ab4a473b647", "sha256": "11f6bc556cda0bf3d37e0122b3d84ceee81f10324f93328bc059f5f330c76575" }, "downloads": -1, "filename": "schemagic-0.1.12.zip", "has_sig": false, "md5_digest": "2d1a28241fa51cfbe00f6ab4a473b647", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4548, "upload_time": "2016-06-14T16:32:57", "url": "https://files.pythonhosted.org/packages/b5/1a/abd7619ffb2ab644515b2712a2911634881af023789d7f9c68ba8d4ce50b/schemagic-0.1.12.zip" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "07e11518d7272db894bf7d02793b969a", "sha256": "d423d82419c376c598bd62569636f4ee74d1c9205d3faaa5020b20cdd889efdf" }, "downloads": -1, "filename": "schemagic-0.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "07e11518d7272db894bf7d02793b969a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7297, "upload_time": "2016-06-17T17:31:39", "url": "https://files.pythonhosted.org/packages/15/6e/2a3f795e5cc46d7093ee45c4c43edb51c061e623d23e160a1e040c318d56/schemagic-0.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f122956bb1b7a7304a70db0e654b08d", "sha256": "6bfd6a889bf0cb31e260bffa1c94eef36a8f08876fc478bb62b6a84d4fa6f9d1" }, "downloads": -1, "filename": "schemagic-0.2.0.tar.gz", "has_sig": false, "md5_digest": "7f122956bb1b7a7304a70db0e654b08d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4604, "upload_time": "2016-06-17T17:31:35", "url": "https://files.pythonhosted.org/packages/16/b9/810fec73afacc037fc6cec2f6d0874e3d44de9eaba6d972968ef637fbbef/schemagic-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "79acc5f8ab15caeed0e0d3e445774f5b", "sha256": "64afe926f2e755c54c75f5e814493449e09a2e13602175fd9a9d42b5edd1d9da" }, "downloads": -1, "filename": "schemagic-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "79acc5f8ab15caeed0e0d3e445774f5b", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7815, "upload_time": "2016-06-22T21:52:04", "url": "https://files.pythonhosted.org/packages/9d/40/20c93852b61b5cd48be933cd43f42ee5094361ee0a4c1380fa9bfce62708/schemagic-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cab2f7bb2405afdae1ade6e9c976dc8c", "sha256": "f1c57c301d5ccfe18a239e9560f9d6242a00b83204f53476383df0a711aabeb0" }, "downloads": -1, "filename": "schemagic-0.3.0.tar.gz", "has_sig": false, "md5_digest": "cab2f7bb2405afdae1ade6e9c976dc8c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8436, "upload_time": "2016-06-22T21:51:58", "url": "https://files.pythonhosted.org/packages/12/e0/9777acaf836db7b204a8ab7a879a59ae9b76806eee7d0a2d69b42ad394f2/schemagic-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "9750b4f34168b96bc9d1f10d1a62e43c", "sha256": "761533786f85cea1b569573b8af20ceab9df33dca4bd6833ccd750465a311346" }, "downloads": -1, "filename": "schemagic-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9750b4f34168b96bc9d1f10d1a62e43c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7781, "upload_time": "2016-06-22T22:07:47", "url": "https://files.pythonhosted.org/packages/bc/c2/716e90c91b2e849b1255319480c059104f8424a494e1604c68ac2d0da477/schemagic-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8041f79a86bbd4e3606d6af1980c86c7", "sha256": "146a0059d70113ecd0a37f664efbb28bbdf56f369522ae777dd7216d25d6ad17" }, "downloads": -1, "filename": "schemagic-0.3.1.tar.gz", "has_sig": false, "md5_digest": "8041f79a86bbd4e3606d6af1980c86c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8431, "upload_time": "2016-06-22T22:07:43", "url": "https://files.pythonhosted.org/packages/bb/27/6ac80a76317c659505d3d4b028f25d2febbaa4e5e0ed480d20b6da76b433/schemagic-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "f950e16417a2a05f9b8efdb365bbc12a", "sha256": "26a6cef7441afa251f803049328b5e9aa135e1d3ccd7eec4b9597afa3eaaac4f" }, "downloads": -1, "filename": "schemagic-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f950e16417a2a05f9b8efdb365bbc12a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7817, "upload_time": "2016-06-22T22:16:13", "url": "https://files.pythonhosted.org/packages/06/ff/4e61a0ac531af42a214e8e6b2273955ad9a0ab9f5d23c176bb5e635e4e58/schemagic-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "89ea8c4542691a3d7d9d02876c6a81df", "sha256": "0baa3e0ba34074ce20f845fc657f67a5c9ab7aab03ca45bfca9a66df2deede16" }, "downloads": -1, "filename": "schemagic-0.3.2.tar.gz", "has_sig": false, "md5_digest": "89ea8c4542691a3d7d9d02876c6a81df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8454, "upload_time": "2016-06-22T22:16:08", "url": "https://files.pythonhosted.org/packages/43/28/7538c1cb9ee8ba149aedb0849124e04c5404c0eabff91ed947bf31b78458/schemagic-0.3.2.tar.gz" } ], "0.3.21": [ { "comment_text": "", "digests": { "md5": "71c4500b10bd07d3739481c5dc682fdb", "sha256": "6444dcd6c10b36f233a7717d65766855935a1647e15ffed2556b496855dea196" }, "downloads": -1, "filename": "schemagic-0.3.21-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "71c4500b10bd07d3739481c5dc682fdb", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7830, "upload_time": "2016-06-22T22:22:30", "url": "https://files.pythonhosted.org/packages/cf/04/71ce412653d9a6111df8b492734c135d14ac97fc30f6c85b4ee3d4439396/schemagic-0.3.21-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1b8301bc90aea493665f3e7b25d34d79", "sha256": "301c0eb25f968dda8c90f36daf23a6cfba993297850ffc709c4e2540368bc3dd" }, "downloads": -1, "filename": "schemagic-0.3.21.tar.gz", "has_sig": false, "md5_digest": "1b8301bc90aea493665f3e7b25d34d79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8447, "upload_time": "2016-06-22T22:22:26", "url": "https://files.pythonhosted.org/packages/fb/bf/809bd1f934feb3daa8c33aef3ff423e48c9ba0afcc949476a52143bd7bda/schemagic-0.3.21.tar.gz" } ], "0.3.22": [ { "comment_text": "", "digests": { "md5": "3b608fc3c1908b35a91693ecd3ff156c", "sha256": "9a4a883015ec5d4592a54a2e66d8ba0203e3a1660b30272de3bf626a5caef71a" }, "downloads": -1, "filename": "schemagic-0.3.22-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3b608fc3c1908b35a91693ecd3ff156c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7815, "upload_time": "2016-06-22T22:29:02", "url": "https://files.pythonhosted.org/packages/f7/9d/5949cbfa667eaf6a83aa6ba2f99c691222a498941de7132497209fcc7302/schemagic-0.3.22-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8529a48d66fe5dc116424a384548aca5", "sha256": "e1d4e059ccb6f8ea1e6fd19e70995e4bb952c6bf5cf010a5ba259678e8589a3f" }, "downloads": -1, "filename": "schemagic-0.3.22.tar.gz", "has_sig": false, "md5_digest": "8529a48d66fe5dc116424a384548aca5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8423, "upload_time": "2016-06-22T22:28:58", "url": "https://files.pythonhosted.org/packages/47/7d/c95c6542f809d1d3f78f849033143b38a41f2433c6f4e583d81f382f5301/schemagic-0.3.22.tar.gz" } ], "0.3.23": [ { "comment_text": "", "digests": { "md5": "26b47c9cdc1c2644aec617d07f035bd8", "sha256": "c1b5c00020db41b3bdb8af7e65367c1094c5e66b5814d402cb4bc65e1c9be054" }, "downloads": -1, "filename": "schemagic-0.3.23-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "26b47c9cdc1c2644aec617d07f035bd8", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7815, "upload_time": "2016-06-22T22:40:30", "url": "https://files.pythonhosted.org/packages/2d/7a/35705fd90bcc1e2812025f40717ab465421ff3b648ff194b32f10e902c45/schemagic-0.3.23-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "daa7941f8da4d7b2487fc707c8a77a28", "sha256": "40bc202ce25692d5db7da656227032dce70121b4a0224b483b84789fb21554f1" }, "downloads": -1, "filename": "schemagic-0.3.23.tar.gz", "has_sig": false, "md5_digest": "daa7941f8da4d7b2487fc707c8a77a28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8431, "upload_time": "2016-06-22T22:40:26", "url": "https://files.pythonhosted.org/packages/26/1b/1007a6484b1c7d581a8f20f35bc156d018cdd98dcc05248eebf851dfb34a/schemagic-0.3.23.tar.gz" } ], "0.3.25": [ { "comment_text": "", "digests": { "md5": "9f220d9cd3bf4806cb0c9ad6997b0df1", "sha256": "acdbd7594565157da20dd3045e90451036b8feb8fb28a02683efc50885249bda" }, "downloads": -1, "filename": "schemagic-0.3.25-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9f220d9cd3bf4806cb0c9ad6997b0df1", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11249, "upload_time": "2016-06-24T20:48:08", "url": "https://files.pythonhosted.org/packages/ec/ee/d1bfce9a25d41a9d99ebdcaf7961f5317f916aa536b3e5cee358dad9738e/schemagic-0.3.25-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "afabd457428ad222384fced4f1c90be3", "sha256": "d688b2bfad5c95c92684a403360e3fcae781527db84cf58495883f41b619b21c" }, "downloads": -1, "filename": "schemagic-0.3.25.tar.gz", "has_sig": false, "md5_digest": "afabd457428ad222384fced4f1c90be3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12765, "upload_time": "2016-06-24T20:47:42", "url": "https://files.pythonhosted.org/packages/e1/f8/343c07f729e92bb1de4e2bd8ff0a3a8d7c25197a8c6b92abb73b0f57bcc4/schemagic-0.3.25.tar.gz" } ], "0.3.26": [ { "comment_text": "", "digests": { "md5": "f385ae090513d9addba97d2e05360200", "sha256": "1eb500c8a04b4f41177ec92318b8fa4ba780d09d21fd4837f9f972ca5271cf08" }, "downloads": -1, "filename": "schemagic-0.3.26-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f385ae090513d9addba97d2e05360200", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11245, "upload_time": "2016-06-25T16:38:00", "url": "https://files.pythonhosted.org/packages/96/59/fecb0912496bef74645b06985271687e2ed2e7a8e599c119ca1688ec58f0/schemagic-0.3.26-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6881d4170432b9785959291253aaa1e1", "sha256": "ae11c9780401e21c123767c047de8590cb2b226d0f3f47d2106bd36abf816672" }, "downloads": -1, "filename": "schemagic-0.3.26.tar.gz", "has_sig": false, "md5_digest": "6881d4170432b9785959291253aaa1e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12666, "upload_time": "2016-06-25T16:37:56", "url": "https://files.pythonhosted.org/packages/29/05/59a1f1f480543b50ac5090134e5f0686108588f361bda8486a7df6a6e8d0/schemagic-0.3.26.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "fde8e0eff954e8d0b2d7bc5643cc8bcd", "sha256": "190ef1bd210f214aa7d6ec2edfe6f16050c9784038a5d4bbf019e85ac854d751" }, "downloads": -1, "filename": "schemagic-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fde8e0eff954e8d0b2d7bc5643cc8bcd", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11323, "upload_time": "2016-06-26T20:33:19", "url": "https://files.pythonhosted.org/packages/aa/4c/1f1cf4fc099d59eb85b1e427ef2957d660287e345b084b550882777b75f9/schemagic-0.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5a8048f2d06fd12c3d0091f18fdaba12", "sha256": "8ebeb1b1738e9b29b12c9610141ec470802781425527ac86817528c1e3b7ec83" }, "downloads": -1, "filename": "schemagic-0.7.0.tar.gz", "has_sig": false, "md5_digest": "5a8048f2d06fd12c3d0091f18fdaba12", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12736, "upload_time": "2016-06-26T20:33:15", "url": "https://files.pythonhosted.org/packages/e9/f5/01d42a05480f4744fdea817f7eb8802782312ff6f4febdaa004ae825f4d2/schemagic-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "9756f71408d2d99bf4c62d96f65405a7", "sha256": "52e4af133a4e2fc8afd41b8b64f61b0cac7a03a25758a9f3c661588aac8a595c" }, "downloads": -1, "filename": "schemagic-0.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9756f71408d2d99bf4c62d96f65405a7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11323, "upload_time": "2016-06-27T12:29:49", "url": "https://files.pythonhosted.org/packages/48/24/31f91889414ffc7c7f180589be7c21b72868e23daf7398fcde8c1860f0d7/schemagic-0.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3097376b963affa3c6f9630bc902e413", "sha256": "89e222f94a9b00661bda9f950a187652636063358f2d9282d271efbd803cb269" }, "downloads": -1, "filename": "schemagic-0.8.0.tar.gz", "has_sig": false, "md5_digest": "3097376b963affa3c6f9630bc902e413", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13460, "upload_time": "2016-06-27T12:29:45", "url": "https://files.pythonhosted.org/packages/99/c2/2221c01da82415807f496f1dfcc4fbb76af9321c21ab718ce55018ac7d19/schemagic-0.8.0.tar.gz" } ], "0.8.9": [ { "comment_text": "", "digests": { "md5": "6b6db1577693ed0c0ec7d9795256c808", "sha256": "c4cec37c1555424ef1bdf6e18f2dffebaf8880c614382b6c3edd4c370c19f0fe" }, "downloads": -1, "filename": "schemagic-0.8.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6b6db1577693ed0c0ec7d9795256c808", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11408, "upload_time": "2016-07-04T20:28:54", "url": "https://files.pythonhosted.org/packages/d3/cd/8e060632b7744160fd73c21fd7ecd853c731d59befb58751a48fe0b247de/schemagic-0.8.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4fdfa63a28cd84a0363aeb6740c45839", "sha256": "a9cf7eb9bd9a344c8c9d621972114bf331606efb6f773aa4e9c7b0173713e6f1" }, "downloads": -1, "filename": "schemagic-0.8.9.tar.gz", "has_sig": false, "md5_digest": "4fdfa63a28cd84a0363aeb6740c45839", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13575, "upload_time": "2016-07-04T20:28:50", "url": "https://files.pythonhosted.org/packages/95/04/31219c8d4ae0a99483c347cb91660722d8ad86b98e359d5b639b5d2f93b9/schemagic-0.8.9.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "8624055c3f2ed561807769c8546e2fc3", "sha256": "90d93135d8d84f6552c7a5422e9cd8d18f5229730f725d53f3f9f4b31c74dea0" }, "downloads": -1, "filename": "schemagic-0.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8624055c3f2ed561807769c8546e2fc3", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12002, "upload_time": "2016-07-08T19:04:11", "url": "https://files.pythonhosted.org/packages/8a/19/7054c7b3b69e07410a1de38f0036c57a06b2bd4db2546cbad3dac7727116/schemagic-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca924698e0f2d23087987c9d53d308c4", "sha256": "6cfd6744f864797c13eefa290786fbfeed077a878ef67f3969c5d472fba0b0b6" }, "downloads": -1, "filename": "schemagic-0.9.0.tar.gz", "has_sig": false, "md5_digest": "ca924698e0f2d23087987c9d53d308c4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14057, "upload_time": "2016-07-08T19:04:07", "url": "https://files.pythonhosted.org/packages/d0/5c/bb3641e120478ae7bfc1fcc60e9aeb7a8bc3bdd12cd1a8ce1de37e43c45d/schemagic-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "d6ad9d966bac5e5cdd0aaf20d0ef54cc", "sha256": "51bdf907b61272dd4c2b8b267dab8e0be54776889ffa929fe329ffe31bb44437" }, "downloads": -1, "filename": "schemagic-0.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6ad9d966bac5e5cdd0aaf20d0ef54cc", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11985, "upload_time": "2016-07-24T06:53:05", "url": "https://files.pythonhosted.org/packages/27/49/e046482dd231ec39e0f12a78cfd645d628f6ba15d8a7d8d316f3748cc6b2/schemagic-0.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "058d46c3fb892444ae5882a0d56a48ad", "sha256": "3aa306e8a730976bec7f53341b8fc55798c8cbae5285be91117422ab2267ab27" }, "downloads": -1, "filename": "schemagic-0.9.1.tar.gz", "has_sig": false, "md5_digest": "058d46c3fb892444ae5882a0d56a48ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13957, "upload_time": "2016-07-24T06:53:03", "url": "https://files.pythonhosted.org/packages/3e/85/caa1b548e1bc201707c1b2cdf90a8a0b26390779835a2d0c66089371499f/schemagic-0.9.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d6ad9d966bac5e5cdd0aaf20d0ef54cc", "sha256": "51bdf907b61272dd4c2b8b267dab8e0be54776889ffa929fe329ffe31bb44437" }, "downloads": -1, "filename": "schemagic-0.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6ad9d966bac5e5cdd0aaf20d0ef54cc", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11985, "upload_time": "2016-07-24T06:53:05", "url": "https://files.pythonhosted.org/packages/27/49/e046482dd231ec39e0f12a78cfd645d628f6ba15d8a7d8d316f3748cc6b2/schemagic-0.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "058d46c3fb892444ae5882a0d56a48ad", "sha256": "3aa306e8a730976bec7f53341b8fc55798c8cbae5285be91117422ab2267ab27" }, "downloads": -1, "filename": "schemagic-0.9.1.tar.gz", "has_sig": false, "md5_digest": "058d46c3fb892444ae5882a0d56a48ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13957, "upload_time": "2016-07-24T06:53:03", "url": "https://files.pythonhosted.org/packages/3e/85/caa1b548e1bc201707c1b2cdf90a8a0b26390779835a2d0c66089371499f/schemagic-0.9.1.tar.gz" } ] }