{ "info": { "author": "Fabian Barkhau", "author_email": "fabian.barkhau@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "######\napigen\n######\n\nEasily create a CLI and JSON-RPC interface from a common API definition.\n\n============\nInstallation\n============\n\n::\n\n pip install apigen\n\n======================\nExample API definition\n======================\n\nI simple example application with an add command.\n\n.. code:: python\n\n # from examples/basic.py\n import apigen\n\n\n # automatically added verison command will use module version if present\n # rpc exceptions will also include module version if persent\n __version__ = \"1.0.0\"\n\n\n class Calculator(apigen.Definition): # Programm name taken from class name.\n \"\"\"Example Programm\"\"\" # Programm help text taken from class doc string.\n\n @apigen.command()\n def add(self, a, b): # Command name and args taken from method.\n \"\"\"adds two items\"\"\" # Help text taken from method doc string.\n return a + b # Returned rpc/cli output (must be JSON serializable).\n\n\n if __name__ == \"__main__\":\n apigen.run(Calculator) # Run CLI interface.\n\n\nThe created CLI/RPC interface behaves as you would expect from a python class.\n\n - Programm arguments are taken from the __init__ method.\n - Command arguments are taken from the respective command methods.\n - Manditory and optional arguments work just like you would expect in python.\n - In addition arguments with the default value False are flags in the CLI.\n\n.. code:: python\n\n # from examples/arguments.py\n import apigen\n\n\n class ArgumentsExample(apigen.Definition):\n\n def __init__(self, quiet=False, config_path=\"default/path.json\"):\n self.quiet = quiet\n self.config_path = config_path\n\n @apigen.command()\n def show_args(self, first, second, optional=\"Default\"):\n if not self.quiet:\n print(\"noise\")\n return { 'first': first, 'second': second, 'optional': optional }\n\n\n if __name__ == \"__main__\":\n apigen.run(ArgumentsExample)\n\n\n=======================================\nGenerated CLI interface (uses argparse)\n=======================================\n\nGenerated CLI interface.\n\n::\n\n # Program, command and arguments order.\n $ python program.py [program arguments] [command arguments]\n\n # Argument format.\n $ python program.py positional_argument_value --optional_argument=value --flag\n\n\nShowing the generated help.\n\n::\n\n # Show programm help text.\n $ python examples/basic.py --help\n\n # Show command help text\n $ python examples/basic.py startserver --help\n\n\nCLI arguments must be given as json data.The json data automatically is\nunmarshalled before calling the command function and the returned result is\nautomatically marshalled.\n\n::\n\n $ python examples/basic.py add 1 2\n 3\n\n $ python examples/basic.py add 1.1 2.2\n 3.3000000000000003\n\n $ python examples/basic.py add \"foo\" \"bar\"\n \"foobar\"\n\n $ python examples/basic.py add \"[1,2,3]\" \"[4,5,6]\"\n [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6\n ]\n\n\n\n===============================================\nClient side json-rpc usage with python-jsonrpc.\n===============================================\n\nStarting the jsonrpc server from the command line.\n\n::\n\n $ python examples/basic.py startserver\n Starting Calculator json-rpc service at http://localhost:8080\n\n\n\nRPC arguments must be given as json serializable data. The arguments will\nautomatically be marshalled and unmarshalled.\n\n.. code:: python\n\n\n >>> import pyjsonrpc\n\n >>> rpc = pyjsonrpc.HttpClient(url = \"http://localhost:8080\")\n\n >>> rpc.add(1, 2)\n 3\n\n >>> rpc.add(1.1, 2.2)\n 3.3000000000000003\n\n >>> rpc.add(\"foo\", \"bar\")\n u'foobar'\n\n >>> rpc.add([1,2,3], [4,5,6])\n [1, 2, 3, 4, 5, 6]\n\n\nClient side exception handeling.\n\n.. code:: python\n\n # from examples/exceptions.py\n import json\n import pyjsonrpc\n\n\n rpc = pyjsonrpc.HttpClient(url=\"http://localhost:8080\")\n try:\n print rpc.add(1, \"str\")\n except pyjsonrpc.rpcerror.JsonRpcError as e:\n print e.code # see http://www.jsonrpc.org/specification#error_object\n\n # Server error if an exception is raised during the call.\n if e.code <= -32000 and e.code >= -32099:\n print e.message # source exception message\n data = json.loads(e.data)\n print data[\"classname\"] # source exception class name\n print data[\"repr\"] # source exception repr string\n print data[\"traceback\"] # source exception traceback\n print data[\"version\"] # source module version if present\n\n\nStarting the jsonrpc service from within python.\n\n.. code:: python\n\n import basic\n api = basic.Calculator()\n api.startserver()\n\n\nGetting a pyjsonrpc.HttpRequestHandler for further use.\n\n.. code:: python\n\n import basic\n api = basic.Calculator()\n api.get_http_request_handler()\n\n\n==========================================\nClient side json-rpc usage with javascript\n==========================================\n\n.. code:: javascript\n\n // from examples/node.js\n\n // https://www.npmjs.com/package/node-json-rpc\n // npm install node-json-rpc\n var rpc = require('node-json-rpc');\n\n var client = new rpc.Client({\n port: 8080,\n host: '127.0.0.1',\n path: '/',\n });\n\n client.call({\n \"jsonrpc\": \"2.0\",\n \"method\": \"add\",\n \"params\": {\n a: 1,\n b: 3\n },\n \"id\": 0\n },\n function(err, res) {\n if (err) {\n console.log(\"Error add\");\n console.log(err);\n } else {\n console.log(\"Success add\");\n console.log(res);\n }\n }\n );\n\n::\n\n $ node examples/node.js\n Success add\n { jsonrpc: '2.0', id: 0, result: 4 }", "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/F483/apigen/", "keywords": "CLI,JSON,RPC,JSON-RPC,API,Remote Procedure Call,JavaScript Object Notation,argparse,Data Interchange", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "apigen", "package_url": "https://pypi.org/project/apigen/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/apigen/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/F483/apigen/" }, "release_url": "https://pypi.org/project/apigen/1.5.0/", "requires_dist": null, "requires_python": null, "summary": "Easily create a CLI and JSON-RPC interface from a common API definition.", "version": "1.5.0" }, "last_serial": 1974575, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "67724670765ef24436e75418596e525f", "sha256": "46007bd3eabaedf0de27eb3246fce881c387c7f0e552b4f0ff4ff5037048cb96" }, "downloads": -1, "filename": "apigen-0.1.0.tar.gz", "has_sig": false, "md5_digest": "67724670765ef24436e75418596e525f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3484, "upload_time": "2015-04-19T18:34:24", "url": "https://files.pythonhosted.org/packages/40/e6/8a9164982d44e135471e69cc40ea25a03740ba3ea9587db9b53f8c55015e/apigen-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "e21943cebea20e23876e726e62ad753b", "sha256": "3e8be8cc9f8d5dbcd9676237ef06e1b55c566ca76499952eabaf9284b983b99a" }, "downloads": -1, "filename": "apigen-0.1.1.tar.gz", "has_sig": false, "md5_digest": "e21943cebea20e23876e726e62ad753b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3927, "upload_time": "2015-04-19T18:46:49", "url": "https://files.pythonhosted.org/packages/35/d2/71add27a380b2b4e1d3e5e11f73873537d9d15629beb7a9d41007e4cc9ff/apigen-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "a251b4f08fd79df4c5294ee330467f99", "sha256": "edcec21b2757c1c8b81823d5a09c348640b6717e37c0b05956d9753316b0ab8f" }, "downloads": -1, "filename": "apigen-0.1.2.tar.gz", "has_sig": false, "md5_digest": "a251b4f08fd79df4c5294ee330467f99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3910, "upload_time": "2015-04-21T13:34:08", "url": "https://files.pythonhosted.org/packages/4c/5b/77f24fa44baf6f20f02616f8f5dec13e16319bcb4a8baba1c4f3d45078b7/apigen-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "93e6f3587fefa9f2daceca6d3e6c5c8b", "sha256": "aa409b140a6b619c22626add5cf6e9200b9a61bd4d8b05ef08b4a0f5b0c1ca07" }, "downloads": -1, "filename": "apigen-0.1.3.tar.gz", "has_sig": false, "md5_digest": "93e6f3587fefa9f2daceca6d3e6c5c8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4054, "upload_time": "2015-04-21T14:11:19", "url": "https://files.pythonhosted.org/packages/a2/39/2f793e3c7098c1d6f6cfca6a15e8ea47a00075075d8868fb8c5f5aa9aacc/apigen-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "9260c1d5d23fedfe02e06204bd725248", "sha256": "4f2842090bab2bef7975746098d84d953978e1f21b5c90a9f762c65e5b6c6985" }, "downloads": -1, "filename": "apigen-0.1.4.tar.gz", "has_sig": false, "md5_digest": "9260c1d5d23fedfe02e06204bd725248", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4303, "upload_time": "2015-04-25T14:54:40", "url": "https://files.pythonhosted.org/packages/58/ea/3111ad9100beda4204c4de4cb406249befc43280a3ffdd3347ad4304f365/apigen-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "7fda40b7deeaf2187e9d7a8642926159", "sha256": "d16ee7f6e74f13c0085463e0c7bdb6a90e5f2eea05f1bf2cc4fca0ed7813b8f6" }, "downloads": -1, "filename": "apigen-0.1.5.tar.gz", "has_sig": false, "md5_digest": "7fda40b7deeaf2187e9d7a8642926159", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4458, "upload_time": "2015-04-25T15:36:29", "url": "https://files.pythonhosted.org/packages/14/f1/553f04a9cacc0ef031a0c0d78e1d0b5a36209181964fd9be6625cddee5c7/apigen-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "c1c0311e96e0fb64bdfb5a759f9c77d0", "sha256": "c421548e4136c6f8dd818ee7dfbe8a98d89a9dd201116e05814fc94ad2b683ae" }, "downloads": -1, "filename": "apigen-0.1.6.tar.gz", "has_sig": false, "md5_digest": "c1c0311e96e0fb64bdfb5a759f9c77d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4486, "upload_time": "2015-05-13T13:16:16", "url": "https://files.pythonhosted.org/packages/0b/70/cbc646c7291cb0711a7712734aa449dd3ff29de44b23e7bb8e5a26b0f2f8/apigen-0.1.6.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "82c620eeaf2003143b6348f2fcbf6f93", "sha256": "991369389ec09ed94994096b68059735e5ac890f3660058cd4a103d78580691a" }, "downloads": -1, "filename": "apigen-1.1.6.tar.gz", "has_sig": false, "md5_digest": "82c620eeaf2003143b6348f2fcbf6f93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4564, "upload_time": "2015-06-08T16:49:21", "url": "https://files.pythonhosted.org/packages/4c/86/419a4ddf9df4a9ab5d5234af26bdc4ef86aa13c66b7b33e0f86089bccca6/apigen-1.1.6.tar.gz" } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "3d3bfe3e62b0427c4bf42e60bc8565a2", "sha256": "b68480a00d6d421acd01b182caa21592ef1a90face3126bbf4272d6848a1d0d0" }, "downloads": -1, "filename": "apigen-1.1.7.tar.gz", "has_sig": false, "md5_digest": "3d3bfe3e62b0427c4bf42e60bc8565a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4536, "upload_time": "2015-06-08T16:52:51", "url": "https://files.pythonhosted.org/packages/a0/4e/5cd6576e62f3b6dcec1f8d8bf13cddfab9e036df98e67c0cdc702962142b/apigen-1.1.7.tar.gz" } ], "1.1.8": [ { "comment_text": "", "digests": { "md5": "d60672c0b476c528d75df771d28301cb", "sha256": "5e71919631b4132738d99341fbb9c744727a9c2fbce03d4da6bedf9261f921e0" }, "downloads": -1, "filename": "apigen-1.1.8.tar.gz", "has_sig": false, "md5_digest": "d60672c0b476c528d75df771d28301cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4812, "upload_time": "2015-06-12T14:54:01", "url": "https://files.pythonhosted.org/packages/38/34/172912af2d56bcc6d77166bd0c6341c56e4165a14f3a60bee594e5061624/apigen-1.1.8.tar.gz" } ], "1.2.10": [ { "comment_text": "", "digests": { "md5": "818b26bc090247a8ae79f488c6c4bcf3", "sha256": "c3b9f49f89e625819e091fa160fdbbba81d84650cf7cb50bedd169ccdb3e3e5e" }, "downloads": -1, "filename": "apigen-1.2.10.tar.gz", "has_sig": false, "md5_digest": "818b26bc090247a8ae79f488c6c4bcf3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5378, "upload_time": "2015-06-18T13:15:30", "url": "https://files.pythonhosted.org/packages/2b/ec/362b266081aa51c56e887369ea3a5bc21d1fc92e7d8b82bedf88cb579db0/apigen-1.2.10.tar.gz" } ], "1.2.11": [ { "comment_text": "", "digests": { "md5": "1e04a7485f5d6fd1cd8ac547292df155", "sha256": "16446b5b522b27733def79677aad5d5ce609ebda240d1696844f2eb573eabd88" }, "downloads": -1, "filename": "apigen-1.2.11.tar.gz", "has_sig": false, "md5_digest": "1e04a7485f5d6fd1cd8ac547292df155", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5385, "upload_time": "2015-07-02T19:26:28", "url": "https://files.pythonhosted.org/packages/2f/50/23fe237d8de9be0c1016f51861c6658a6c06d801cd7fe6b35a15b72a8660/apigen-1.2.11.tar.gz" } ], "1.2.12": [ { "comment_text": "", "digests": { "md5": "18aa77ad6f90a343d0cbf628bf99d760", "sha256": "bffd61ffbdeea1a7e3e5e6446d2336f21eca797396a40508e67d96361d83c884" }, "downloads": -1, "filename": "apigen-1.2.12.tar.gz", "has_sig": false, "md5_digest": "18aa77ad6f90a343d0cbf628bf99d760", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6377, "upload_time": "2015-07-03T16:28:14", "url": "https://files.pythonhosted.org/packages/0d/6a/1b212009b9b0899be658e5ee2a0fc05fe6ed8c15628054ab02ec8fa0f97c/apigen-1.2.12.tar.gz" } ], "1.2.8": [ { "comment_text": "", "digests": { "md5": "2c7be222c0227fc8dfcbb715c134c3f3", "sha256": "850b11ba64dc50ac18625b81f1093c5d1e794630dae8a0e7a65a10a502b4ed6b" }, "downloads": -1, "filename": "apigen-1.2.8.tar.gz", "has_sig": false, "md5_digest": "2c7be222c0227fc8dfcbb715c134c3f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5245, "upload_time": "2015-06-17T14:55:30", "url": "https://files.pythonhosted.org/packages/30/43/d25b0131eb65e13589a1d9960d651e349502e92d252ad9b7ed762a180bb6/apigen-1.2.8.tar.gz" } ], "1.2.9": [ { "comment_text": "", "digests": { "md5": "9a340f0e28875c6a5b6f11a7ad39e576", "sha256": "9ab5a30092256e1e80066fb7a2f6fe68aa347bd243582a786621d3cb4bbc6b60" }, "downloads": -1, "filename": "apigen-1.2.9.tar.gz", "has_sig": false, "md5_digest": "9a340f0e28875c6a5b6f11a7ad39e576", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5354, "upload_time": "2015-06-17T16:58:34", "url": "https://files.pythonhosted.org/packages/b0/4f/549a082b43bbec104bc877a7e77dfeb99d761cec241e2957fbd0430676ae/apigen-1.2.9.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "58d1bec135c564e76f7237f9004ddd6b", "sha256": "9d2d37cd8d19db51b5d53613baaebb5fe4d879477330268aa88cfb942fd5b24a" }, "downloads": -1, "filename": "apigen-1.3.0.tar.gz", "has_sig": false, "md5_digest": "58d1bec135c564e76f7237f9004ddd6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6555, "upload_time": "2015-07-08T20:35:12", "url": "https://files.pythonhosted.org/packages/73/29/897d431caeef330ab6662fda24cf8d0371fe2c9a8c72c3ef7eef78f3223d/apigen-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "d50db6e2eb723fb1a7a30e7434419092", "sha256": "665362191c78d3c64407392558ae22c22ab6e810c0958c486683b07c9fd9041f" }, "downloads": -1, "filename": "apigen-1.3.1.tar.gz", "has_sig": false, "md5_digest": "d50db6e2eb723fb1a7a30e7434419092", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6579, "upload_time": "2015-07-08T20:44:29", "url": "https://files.pythonhosted.org/packages/ac/f1/60220135c4bea30eace558f713fea23def9a8f50b9c0d0de6b0d55ec5a25/apigen-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "4070af8a82eacdd94427d7dad2eabf49", "sha256": "b8f087dd10aa29bb60a09a83642b9f4d47b07659b6e5ddbc66d142163780d80f" }, "downloads": -1, "filename": "apigen-1.3.2.tar.gz", "has_sig": false, "md5_digest": "4070af8a82eacdd94427d7dad2eabf49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6577, "upload_time": "2015-07-09T16:57:32", "url": "https://files.pythonhosted.org/packages/e5/5c/7ce7b0093dceeb11beea5cf55acbac1d67b4f0ae8c539cff34c63d1bda73/apigen-1.3.2.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "149ea447d98547eb12044e5329ca2199", "sha256": "a484fcbf936ab65466e345d76226e373b519aa2d36060e6eeb73e987e7b03e78" }, "downloads": -1, "filename": "apigen-1.3.3.tar.gz", "has_sig": false, "md5_digest": "149ea447d98547eb12044e5329ca2199", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6573, "upload_time": "2015-07-10T16:30:05", "url": "https://files.pythonhosted.org/packages/a7/3d/5f6a2e30121f5def37492e773604bcccc6c105e6cecb8e84058a7a991a04/apigen-1.3.3.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "5ca876d334a99479134ec6dd02aeb0e3", "sha256": "96f786bf7806f0f52051aeeb0229aa55ededaa8b94dd1f424808345ad31d28ef" }, "downloads": -1, "filename": "apigen-1.4.0.tar.gz", "has_sig": false, "md5_digest": "5ca876d334a99479134ec6dd02aeb0e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6634, "upload_time": "2015-07-24T17:41:09", "url": "https://files.pythonhosted.org/packages/e6/44/4b645505c1c8d179913d5d39b8def9fdb2ba5691f3197b3bde28e8b06364/apigen-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "ef1086b22ef6c6fd7e5d720137c18ec7", "sha256": "2554db62c8bdea6ccd438f4a239ead272077cfe4bcce293316946b2e09e9de7a" }, "downloads": -1, "filename": "apigen-1.4.1-py2-none-any.whl", "has_sig": false, "md5_digest": "ef1086b22ef6c6fd7e5d720137c18ec7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9509, "upload_time": "2016-01-06T19:39:04", "url": "https://files.pythonhosted.org/packages/09/32/f239f5e75c6ee5b36d62c1fa5861edfe1d7d0e97e3473dac4dc5d47020d5/apigen-1.4.1-py2-none-any.whl" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "8c56b6c15c2bf7e8bf4db31606f54027", "sha256": "7dbfcb909736c712d70b5889dfd7df72a2d821ab9d39134a8202155e064d7a6b" }, "downloads": -1, "filename": "apigen-1.4.2-py2-none-any.whl", "has_sig": false, "md5_digest": "8c56b6c15c2bf7e8bf4db31606f54027", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9527, "upload_time": "2016-01-09T22:13:01", "url": "https://files.pythonhosted.org/packages/cf/fa/13af5ff5a2cab3a45bd6bfcc64780d6ea5499c94cf61cb1f45fc6f18698a/apigen-1.4.2-py2-none-any.whl" } ], "1.4.3": [ { "comment_text": "", "digests": { "md5": "8d1cfe2f367dea0816ed842354d65dc9", "sha256": "814ed55fc87dd00baf32af4a833b0e65d0e60123bd33f7484838446e4aa04028" }, "downloads": -1, "filename": "apigen-1.4.3-py2-none-any.whl", "has_sig": false, "md5_digest": "8d1cfe2f367dea0816ed842354d65dc9", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9521, "upload_time": "2016-01-13T21:52:45", "url": "https://files.pythonhosted.org/packages/c3/09/eca2825f3cdbd4f54b27d76d94466378daac84e215a9678dd501f63d6e77/apigen-1.4.3-py2-none-any.whl" } ], "1.4.4": [ { "comment_text": "", "digests": { "md5": "0ac60fb2a5f2ac0577ebefababe525a3", "sha256": "25c49b8ba10d7bd0a46f33218aeee840b8322a57b733e15ed8bdf8c928cc4e2c" }, "downloads": -1, "filename": "apigen-1.4.4-py2-none-any.whl", "has_sig": false, "md5_digest": "0ac60fb2a5f2ac0577ebefababe525a3", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9548, "upload_time": "2016-02-22T15:28:24", "url": "https://files.pythonhosted.org/packages/d8/a6/5728ee3fd119bf04f3213c99cc34e6a4c40c090e5a40aa968978e80492da/apigen-1.4.4-py2-none-any.whl" } ], "1.4.5": [ { "comment_text": "", "digests": { "md5": "d3b15e739d6409e98fd3a7516b932acf", "sha256": "0530dee06b2e41a69f9a11bb88fd1f21f0b13cd5538a5eabb0cb2123481b2960" }, "downloads": -1, "filename": "apigen-1.4.5-py2-none-any.whl", "has_sig": false, "md5_digest": "d3b15e739d6409e98fd3a7516b932acf", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9568, "upload_time": "2016-02-24T15:38:48", "url": "https://files.pythonhosted.org/packages/41/2a/ba26a6795eac59b5e0495a42aa52c633d438d0f379c4c29e6b18fdcf2149/apigen-1.4.5-py2-none-any.whl" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "f4795683282039eb972186ceec49f7db", "sha256": "9e72675aca19656af8567df0d1089355ca408656e6e26972a250409ab57b3c5f" }, "downloads": -1, "filename": "apigen-1.5.0-py2-none-any.whl", "has_sig": false, "md5_digest": "f4795683282039eb972186ceec49f7db", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9541, "upload_time": "2016-02-24T16:41:59", "url": "https://files.pythonhosted.org/packages/18/a2/a65d72324f58d3de628bbdbc87f0a047f9c9a5e107755ac04e1242897786/apigen-1.5.0-py2-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f4795683282039eb972186ceec49f7db", "sha256": "9e72675aca19656af8567df0d1089355ca408656e6e26972a250409ab57b3c5f" }, "downloads": -1, "filename": "apigen-1.5.0-py2-none-any.whl", "has_sig": false, "md5_digest": "f4795683282039eb972186ceec49f7db", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9541, "upload_time": "2016-02-24T16:41:59", "url": "https://files.pythonhosted.org/packages/18/a2/a65d72324f58d3de628bbdbc87f0a047f9c9a5e107755ac04e1242897786/apigen-1.5.0-py2-none-any.whl" } ] }