{ "info": { "author": "Nick Frost", "author_email": "nickfrostatx@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Flask", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development" ], "description": "Flask-Hookserver\n================\n\n.. image:: https://img.shields.io/travis/nickfrostatx/flask-hookserver.svg\n :target: https://travis-ci.org/nickfrostatx/flask-hookserver\n\n.. image:: https://img.shields.io/coveralls/nickfrostatx/flask-hookserver.svg\n :target: https://coveralls.io/github/nickfrostatx/flask-hookserver\n\n.. image:: https://img.shields.io/pypi/v/flask-hookserver.svg\n :target: https://pypi.python.org/pypi/flask-hookserver\n\n.. image:: https://img.shields.io/pypi/l/flask-hookserver.svg\n :target: https://raw.githubusercontent.com/nickfrostatx/flask-hookserver/master/LICENSE\n\nGitHub webhooks using Flask.\n\nThis tool receives webhooks from GitHub and passes the data along to a\nuser-defined function. It validates the HMAC signature, and checks that the\noriginating IP address comes from the GitHub IP block.\n\nSupports Flask >= 0.9\n\nInstallation\n------------\n\n.. code-block:: bash\n\n $ pip install Flask-Hookserver\n\nUsage\n-----\n\n.. code-block:: python\n\n from flask import Flask\n from flask.ext.hookserver import Hooks\n\n app = Flask(__name__)\n app.config['GITHUB_WEBHOOKS_KEY'] = 'my_secret_key'\n\n hooks = Hooks(app, url='/hooks')\n\n @hooks.hook('ping')\n def ping(data, guid):\n return 'pong'\n\n app.run()\n\nAnd there we go! ``localhost:8000/hooks`` will now accept GitHub webhook\nevents.\n\nConfig\n------\n\nSignature and IP validation are both optional, but turned on by default. They\ncan each be turned off with a config flag.\n\n.. code-block:: python\n\n app = HookServer(__name__)\n app.config['VALIDATE_IP'] = False\n app.config['VALIDATE_SIGNATURE'] = False\n\nIf ``VALIDATE_SIGNATURE`` is set to ``True``, you need to supply the secret key\nin ``app.config['GITHUB_WEBHOOKS_KEY']``.\n\nExceptions\n----------\n\nIf anything goes wrong, a regular ``HTTPException`` will be raised. Possible\nerrors include:\n\n- 400: Some headers are missing\n- 400: The request body isn't valid JSON\n- 400: The signature is missing or incorrect\n- 403: The request originated from an invalid IP address\n- 503: Could not download the valid webhooks IP block from GitHub\n\n\n.. :changelog:\n\nHistory\n-------\n\n1.1.0 (2016-04-10)\n++++++++++++++++++\n\n- Use GITHUB_WEBHOOKS_KEY if provided, fallback on SECRET_KEY\n\n1.0.0 (2015-12-25)\n++++++++++++++++++\n\n- Refactor into a proper Flask extension\n- Move from hookserver to flask.ext.hookserver\n- Introduce a single hooks object that can be registered to multiple apps\n- Remove importable blueprint and standalone Flask app\n- Rename KEY to GITHUB_WEBHOOKS_KEY\n\n0.3.2 (2015-11-28)\n++++++++++++++++++\n\n- Don't actually connect to GitHub from test suite\n- Deploy to PyPI from Travis\n\n0.3.1 (2015-11-19)\n++++++++++++++++++\n\n- Accept unicode keys\n- Default to true for VALIDATE_IP and VALIDATE_SIGNATURE if missing\n\n0.3.0 (2015-11-08)\n++++++++++++++++++\n\n- Move hooks URL route into a blueprint\n- Report rate limit expire time when the GitHub request limit is exceeded\n\n0.2.1 (2015-10-21)\n++++++++++++++++++\n\n- Install Requests security dependencies\n\n0.2.0 (2015-10-21)\n++++++++++++++++++\n\n- Proper Python 2.7 support\n- Respect GitHub rate limit of 60 requests per hour\n- Make key param to HookServer optional\n- Add optional param url\n- Use VALIDATE_IP and VALIDATE_SIGNATURE instead of DEBUG\n- Simplify some error messages\n- Add test suite\n\n0.1.4 (2015-04-07)\n++++++++++++++++++\n\n- Support IPv4 addresses mapped to IPv6\n\n0.1.3 (2014-07-10)\n++++++++++++++++++\n\n- Fix Python 2 bug in IP address decoding\n\n0.1.2 (2014-07-09)\n++++++++++++++++++\n\n- Ignore HMAC in debug mode\n\n0.1.1 (2014-07-08)\n++++++++++++++++++\n\n- Reload GitHub IP block on each request\n\n0.1.0 (2014-07-07)\n++++++++++++++++++\n\n- Initial release", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nickfrostatx/flask-hookserver", "keywords": "github,webhooks,flask", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "flask-hookserver", "package_url": "https://pypi.org/project/flask-hookserver/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/flask-hookserver/", "project_urls": { "Homepage": "https://github.com/nickfrostatx/flask-hookserver" }, "release_url": "https://pypi.org/project/flask-hookserver/1.1.0/", "requires_dist": [ "Flask (>=0.9)", "Werkzeug (>=0.7)", "requests[security] (>=2.3.0)" ], "requires_python": "", "summary": "Server for GitHub webhooks using Flask", "version": "1.1.0" }, "last_serial": 2056762, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ac1f242640c319ed98fa81cb7875d1ed", "sha256": "5fed4132d5accc8bda0261404b966bbaff883d9d7870f33d0e9753c02e61f75e" }, "downloads": -1, "filename": "flask-hookserver-0.1.tar.gz", "has_sig": false, "md5_digest": "ac1f242640c319ed98fa81cb7875d1ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3269, "upload_time": "2014-07-08T21:01:28", "url": "https://files.pythonhosted.org/packages/69/aa/d992397ec2e3e8af08dc44e5ef7b7ea85326f1a804c563708aa260b1dbba/flask-hookserver-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "aa0e466e24bae92311b5211ff28c4a5a", "sha256": "8f2dac96501326c36cc48e6145bc4a4a821093ebca8d688a4c238273bae6cd48" }, "downloads": -1, "filename": "flask-hookserver-0.1.1.tar.gz", "has_sig": false, "md5_digest": "aa0e466e24bae92311b5211ff28c4a5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3249, "upload_time": "2014-07-09T00:59:20", "url": "https://files.pythonhosted.org/packages/fc/ae/c3e55340937e7b004ce08aea6c35fc2f31978a93be918bd208af0d016b1c/flask-hookserver-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "c7ad61d26c6863b2f6cca82af142384a", "sha256": "d48c70c9c36c6e2e0f092f7171e0033943979e97f7bab484c7f561f9f33a2d5b" }, "downloads": -1, "filename": "flask-hookserver-0.1.2.tar.gz", "has_sig": false, "md5_digest": "c7ad61d26c6863b2f6cca82af142384a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3222, "upload_time": "2014-07-09T23:13:13", "url": "https://files.pythonhosted.org/packages/de/2e/5f7077d33c29ee0f3c65d71b1808aa9a7b199da403f081fd4bf910e31edd/flask-hookserver-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "5becc7690dc3e1d08539836d75320796", "sha256": "bfd473d81516778c978c5ca7e72c71c5b96f9c8c10965b715af7ad4309975dbd" }, "downloads": -1, "filename": "flask-hookserver-0.1.3.tar.gz", "has_sig": false, "md5_digest": "5becc7690dc3e1d08539836d75320796", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3168, "upload_time": "2014-07-11T02:18:49", "url": "https://files.pythonhosted.org/packages/33/86/bde39c6ce694687a22b4295a5c84d660f31dc25bbdf82a8ae7899e00fde2/flask-hookserver-0.1.3.tar.gz" } ], "0.1.4": [], "0.2.0": [ { "comment_text": "", "digests": { "md5": "a6a0f32a1939ec46f24106be6da2c31e", "sha256": "12a85cb0ba44f100c7e3d56545d559bbfeba14c1c301b5f18dd928e74a54c427" }, "downloads": -1, "filename": "flask_hookserver-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a6a0f32a1939ec46f24106be6da2c31e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 5216, "upload_time": "2015-10-21T08:38:51", "url": "https://files.pythonhosted.org/packages/e1/68/24126183e57aab4373d2e1ad654d09156920ce58616fdac288491cb07e8b/flask_hookserver-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d2ff74e980390a155bb3fd1a32a22b8c", "sha256": "b9bbd14da56fc4f021c61463cdd57e43299de358c064a39db74c18621f8898e9" }, "downloads": -1, "filename": "flask-hookserver-0.2.0.tar.gz", "has_sig": false, "md5_digest": "d2ff74e980390a155bb3fd1a32a22b8c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4897, "upload_time": "2015-10-21T08:36:14", "url": "https://files.pythonhosted.org/packages/00/1f/04be2cb37c67e2ce136a0d5a305f9d272285c87f94192e329aef5ccce51c/flask-hookserver-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "f35cff69b237cd90dd5942ae887a5b5f", "sha256": "a6dd207075f2053069e37a89e78bdcc8373c663efc6404c6dcb3f2926439099a" }, "downloads": -1, "filename": "flask_hookserver-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f35cff69b237cd90dd5942ae887a5b5f", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 7464, "upload_time": "2015-10-21T18:31:45", "url": "https://files.pythonhosted.org/packages/80/71/8deab5e7ff0a7c7d9ca1d6e90b897ee0d2e0e95655e5d5139812b201c1b9/flask_hookserver-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f658616dce058022587a8e629f53d23b", "sha256": "d87cf4e244226f56f9089aea1275208129fd7359a1d0585d69f99e695404c50d" }, "downloads": -1, "filename": "flask-hookserver-0.2.1.tar.gz", "has_sig": false, "md5_digest": "f658616dce058022587a8e629f53d23b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5561, "upload_time": "2015-10-21T18:31:31", "url": "https://files.pythonhosted.org/packages/11/9e/3b758d1b555a10b0100732294f921f7f2f07cd72dd8046a932728af6f21b/flask-hookserver-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "11cfabbbf5d10c6770541dc0ece17f86", "sha256": "ec7199bcc5f70d658f2330f40a3373644ffcab928864ebb70c0823a4fb87b42d" }, "downloads": -1, "filename": "flask_hookserver-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "11cfabbbf5d10c6770541dc0ece17f86", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 9029, "upload_time": "2015-11-09T02:22:24", "url": "https://files.pythonhosted.org/packages/73/97/88c4d992db0ba201056378fe7116741af5ef6b1769e5b7a11b69d3484e6d/flask_hookserver-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8f0461fed7729bba89dcdbd106f48b85", "sha256": "4a8c95bbf924b83e88058bef0de190e45882a3749b78b984f97ac97a78ff9f8a" }, "downloads": -1, "filename": "flask-hookserver-0.3.0.tar.gz", "has_sig": false, "md5_digest": "8f0461fed7729bba89dcdbd106f48b85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6608, "upload_time": "2015-11-09T02:22:03", "url": "https://files.pythonhosted.org/packages/0c/7f/ea038b994af1cbad0f47ab05d3d78394b8bc0a319c423be59d55d55228dc/flask-hookserver-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "7e33090d1ce98e0b593a9d21b3443cc9", "sha256": "82a05113b0c824fcd231140d224c3c5bae7880303a474d322746b0703113ee94" }, "downloads": -1, "filename": "flask_hookserver-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7e33090d1ce98e0b593a9d21b3443cc9", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 9073, "upload_time": "2015-11-19T21:37:53", "url": "https://files.pythonhosted.org/packages/73/41/39e8c75e9d8fb88ea166ba96bd34f1c7adfa9bd8fe4fdfce390b3733f45e/flask_hookserver-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d7757e1e0b3b53ae04eb3caf3ff09bf0", "sha256": "d7f6d11477b707ac0a8f650c90687b2b1b0a4fea46bddd0ec4b8e3eed5ee513e" }, "downloads": -1, "filename": "flask-hookserver-0.3.1.tar.gz", "has_sig": false, "md5_digest": "d7757e1e0b3b53ae04eb3caf3ff09bf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6575, "upload_time": "2015-11-19T21:37:44", "url": "https://files.pythonhosted.org/packages/20/f5/ad7778a6121cf783eacac735dd38044b3af19982a1d7d30c5f4a38d7e68b/flask-hookserver-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "011ec41c93fe20bd68b7e95250f4aa10", "sha256": "5061564124ca48c7db1aef8d19d0b5a8ef2475a62e6f852a551eccb30ef94e54" }, "downloads": -1, "filename": "flask_hookserver-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "011ec41c93fe20bd68b7e95250f4aa10", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9163, "upload_time": "2015-11-28T10:18:42", "url": "https://files.pythonhosted.org/packages/7f/89/72496344585d6b4e68172421bd9dc668dd90b0086be1def8a02a967318a9/flask_hookserver-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96d890d1eba7c9951856ede7a747fc7c", "sha256": "cf91a46bc6488b03a6e74e670e6a9fe1d4766a1b7e5e8f94eff5d9750ee523e8" }, "downloads": -1, "filename": "flask-hookserver-0.3.2.tar.gz", "has_sig": false, "md5_digest": "96d890d1eba7c9951856ede7a747fc7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7161, "upload_time": "2015-11-28T10:18:50", "url": "https://files.pythonhosted.org/packages/19/9c/01b929557bca29063447426d8cf25de2ee6d1cac3814a218d92ccd00e4f8/flask-hookserver-0.3.2.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "cbbd6cd5b6d4f89b4412be4ad6410f26", "sha256": "09822751f68aec25dff834dc1d9634d134e8a2787266a0e40b3b40308be28fef" }, "downloads": -1, "filename": "Flask_Hookserver-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cbbd6cd5b6d4f89b4412be4ad6410f26", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8378, "upload_time": "2015-12-25T10:15:22", "url": "https://files.pythonhosted.org/packages/f8/83/00c95bb9d3e972567827f4a347c9e15558f75d5ec1950d35e92f3e0aff7a/Flask_Hookserver-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "678d8e6cd7e72c2c83a3dd70662b8f9f", "sha256": "5509a6faa2bffbd14264f78092ec6ffb5014f929ec934a2feb9b95bf5bd7a78a" }, "downloads": -1, "filename": "Flask-Hookserver-1.0.0.tar.gz", "has_sig": false, "md5_digest": "678d8e6cd7e72c2c83a3dd70662b8f9f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6286, "upload_time": "2015-12-25T10:15:32", "url": "https://files.pythonhosted.org/packages/d8/7f/c665e00f2b04d245413774fcbbe806a64c8f86ddbdb08598fb7cbf9aefc3/Flask-Hookserver-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "e492abd4f6b0dad4330c83bd228c95ce", "sha256": "6ace808bbbf62936293bcf791ee26ba1d4a8360d18b65fedecb1f51dff07dee6" }, "downloads": -1, "filename": "Flask_Hookserver-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e492abd4f6b0dad4330c83bd228c95ce", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7672, "upload_time": "2016-04-10T23:24:41", "url": "https://files.pythonhosted.org/packages/65/3e/508e1af9213b5219f93d5a8c61a6d953514b7622dea8a1b7ed9d15eca2a8/Flask_Hookserver-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "77599e7d611a5b3ad7ca754e23b2cd1f", "sha256": "dcb41c3cafb053419ec60aee574d4f90c28c6fd3cab7131c7e2b86c6f87da9f2" }, "downloads": -1, "filename": "Flask-Hookserver-1.1.0.tar.gz", "has_sig": false, "md5_digest": "77599e7d611a5b3ad7ca754e23b2cd1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6080, "upload_time": "2016-04-10T23:24:51", "url": "https://files.pythonhosted.org/packages/83/be/b555f8a4dc84bab9b9b49517a6a0eec687eb6af1218d6227464d32c88ca8/Flask-Hookserver-1.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e492abd4f6b0dad4330c83bd228c95ce", "sha256": "6ace808bbbf62936293bcf791ee26ba1d4a8360d18b65fedecb1f51dff07dee6" }, "downloads": -1, "filename": "Flask_Hookserver-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e492abd4f6b0dad4330c83bd228c95ce", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7672, "upload_time": "2016-04-10T23:24:41", "url": "https://files.pythonhosted.org/packages/65/3e/508e1af9213b5219f93d5a8c61a6d953514b7622dea8a1b7ed9d15eca2a8/Flask_Hookserver-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "77599e7d611a5b3ad7ca754e23b2cd1f", "sha256": "dcb41c3cafb053419ec60aee574d4f90c28c6fd3cab7131c7e2b86c6f87da9f2" }, "downloads": -1, "filename": "Flask-Hookserver-1.1.0.tar.gz", "has_sig": false, "md5_digest": "77599e7d611a5b3ad7ca754e23b2cd1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6080, "upload_time": "2016-04-10T23:24:51", "url": "https://files.pythonhosted.org/packages/83/be/b555f8a4dc84bab9b9b49517a6a0eec687eb6af1218d6227464d32c88ca8/Flask-Hookserver-1.1.0.tar.gz" } ] }