{ "info": { "author": "Alexander Tsukanov", "author_email": "aliaksandr.tsukanau@itechart-group.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Object Brokering" ], "description": "[![Happyly on PyPI](https://img.shields.io/pypi/v/happyly.svg)](https://pypi.python.org/pypi/happyly)\n[![Python version](https://img.shields.io/pypi/pyversions/happyly.svg)](https://pypi.python.org/pypi/happyly)\n[![Build Status](https://travis-ci.com/equeumco/happyly.svg?branch=master)](https://travis-ci.com/equeumco/happyly)\n[![Documentation Status](https://readthedocs.org/projects/happyly/badge/?version=latest)](https://happyly.readthedocs.io/en/latest/?badge=latest)\n\n# Description\nHappyly helps to abstract your business logic from messaging stuff,\nso that your code is maintainable and ensures separation of concerns.\nActual actions your code perform are abstracted into universal *Handlers*\nwhich can be used with any serialization technology or messaging protocol without any change.\n\nHappyly can be used with Flask, Celery, Django, Kafka or whatever\ntechnology which is utilized for messaging.\nHappyly also provides first-class support of Google Pub/Sub.\n\n![Happyly's pipeline](https://github.com/equeumco/happyly/blob/master/docs/images/callbacks_with_failures.png\n \"Here's how Happyly manages execution of pipeline stages\")\n\n# Why this name?\nHappyly stands for HAndlers for Pub/sub as a PYthon LibrarY\n\nThe lib was originally created for usage with Google Pub/Sub,\nbut it then turned out that the idea is much more universal and can simplify\ntransition between messaging and serialization technologies.\n\n# Installation\n```pip install happyly```\n\nFor additional components use\n ```pip install happyly[google-cloud-pubsub]```\n or\n ```pip install happyly[flask]```\n or\n ```pip install happyly[redis]```\n\n# Documentation\n[Read the docs](https://happyly.readthedocs.io/en/latest/)\n\n# Development\n1. Create and activate a virtual environment (e.g. `python -m venv env; source env/bin/activate`).\n2. Install [`flit`](https://flit.readthedocs.io/en/latest/): `pip install flit`.\n3. Use `flit` to install the package with all development dependencies: `flit install`.\n Repeat this whenever you want to account for new code changes\n or dependencies.\n4. Note that the repository uses [pre-commit](https://pre-commit.com/)\n to auto-check code for style and types.\n Enable it for your cloned repo with `pre-commit install`.\n5. In order to run tests, use either `pytest` (tests against your current python version)\n or `tox` (will try to test against all supported python versions).\n6. When you are ready to deploy the project,\n use [`bumpversion`](https://github.com/c4urself/bump2version):\n `bumpversion patch` (or `minor`, or `major`) and then `git push && git push --tags`.\n [Travis](https://travis-ci.org/equeumco/happyly) will detect it\n and automatically deploy the package to PyPI.\n It is also advised to create a new release on GitHub\n describing significant changes since the previous version.\n *Important:* at the time of writing, the package `bumpversion` in PyPI is unmaintained\n and has several issues. Please use `bump2version` instead.\n It will automatically be installed with `flit install` as a developmment dependency,\n so no need to install it manually.\n\n# Note about versioning scheme\nWe use semantic versioning with added `rc` stage:\neach version (major, minor or patch) will start with `rc1` variant,\nwhich is then advanced either to `rc2` etc using `bumpversion rc`\nor \"released\" using `bumpversion rel` (which removed `rcN` suffix completely).\n\nFrom the `bumpversin`'s point of view, there are two additional version parts:\n`rel` (which can be either `alpha`, `rc` or missing = `release`)\nand `rc` which denotes number of release candidate.\n`alpha` is not used by `bumpversion` directly\nbut can be used when specifying version manually: `bumpversion [major|minor|patch] --new-version 1.1.0alpha1`.\nIf you use `bumpversion rel` on such version, it will first transition from `alphaN` to `rc1`,\nand only then will it switch to `release`, rejecting `rc` suffix.\n\nIf you want to release new version skipping `rc` stage (probably a `patch` version)\nthen you can use either of these methods:\n\n1. `bumpversion --new-version 1.0.1` (substitute the desired new version) - not recommended;\n2. Recommended approach: `bumpversion --no-tag patch && bumpversion rel`.\nThis will create an intermediary commit for `rc` but won't create a tag for it\nand hence won't trigger deployment for intermediary `rc1` version.\n\n# License\n\nThe code inside this repository is licensed under\n[MIT License](https://github.com/equeumco/happyly/blob/master/LICENSE),\nwhile images and documentation material are licensed under\n[Creative Commons BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).\n", "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/equeumco/happyly", "keywords": "", "license": "MIT for code, CC BY-NC-SA 4.0 for images and docs", "maintainer": "", "maintainer_email": "", "name": "happyly", "package_url": "https://pypi.org/project/happyly/", "platform": "", "project_url": "https://pypi.org/project/happyly/", "project_urls": { "Documentation": "https://happyly.readthedocs.io/en/latest/", "Homepage": "https://github.com/equeumco/happyly" }, "release_url": "https://pypi.org/project/happyly/0.9.0/", "requires_dist": [ "attrs>=19.1", "marshmallow>=2.15,<3", "bump2version>=0.5.10; extra == \"dev\"", "pre-commit>=1.14.4; extra == \"dev\"", "sphinx>=2.0.0; extra == \"doc\"", "sphinx-rtd-theme>=0.4.3; extra == \"doc\"", "sphinx-autodoc-typehints>=1.6.0; extra == \"doc\"", "flask>=1.0; extra == \"flask\"", "google-cloud-pubsub>=0.37.2; extra == \"google-cloud-pubsub\"", "redis>=3.0; extra == \"redis\"", "pytest>=4.3.0; extra == \"test\"", "tox>=3.7.0; extra == \"test\"" ], "requires_python": ">=3.6", "summary": "Conveniently separate your business logic from messaging stuff.", "version": "0.9.0" }, "last_serial": 5269587, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "ef87a32c1feef99d2cadcf9cdf3e1da0", "sha256": "b285e48c282ba7aca09c3816a5d4ddd4156aeb1be56d06912e9a0de898dcb6a8" }, "downloads": -1, "filename": "happyly-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ef87a32c1feef99d2cadcf9cdf3e1da0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6409, "upload_time": "2019-03-12T22:53:00", "url": "https://files.pythonhosted.org/packages/bc/67/fa757d4da788071335bfebdfc7452619edf3311121c4b1951f9c01a80a4f/happyly-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "682543b1e994e109c6d905f64348be07", "sha256": "74bab9dfe5fb728147fa589b62c495d29a50351e1e2f99fe8045afef9d402eee" }, "downloads": -1, "filename": "happyly-0.1.1.tar.gz", "has_sig": false, "md5_digest": "682543b1e994e109c6d905f64348be07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5717, "upload_time": "2019-03-14T08:49:59", "url": "https://files.pythonhosted.org/packages/d1/2b/a554ad05172ce59ab5f259a8a1a78510900a968bda215b353e34cdafc03b/happyly-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "9bbdfafced7fa5d68c87ca437c407886", "sha256": "c89966e6f483c99081d333515cd6b044ee8df81a785b6807d0dce7dd197e4591" }, "downloads": -1, "filename": "happyly-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9bbdfafced7fa5d68c87ca437c407886", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 29813, "upload_time": "2019-03-18T12:45:36", "url": "https://files.pythonhosted.org/packages/2e/08/1b774c9c53edb0472c7c5f8a7416a481f3f6860e101d7122f7e063edb6ad/happyly-0.2.0-py3-none-any.whl" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "19ffcc0e349a55e9d358e5bbea8d3f47", "sha256": "492fb4404e5bdc13efc09647615bfed4e777a3e9386745657be82c780e6df24a" }, "downloads": -1, "filename": "happyly-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "19ffcc0e349a55e9d358e5bbea8d3f47", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 31293, "upload_time": "2019-03-18T16:43:18", "url": "https://files.pythonhosted.org/packages/34/8a/d9736017f17165f84690be8e7047cbaaeeb3e3062d6fc5f071956bdcfeee/happyly-0.3.0-py3-none-any.whl" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "fc6170552a3a758af8646c04df5b51ee", "sha256": "42ec584f12389a03152e7845ae90cce5e13f5cc8f4b531b9a7cf0696db755a53" }, "downloads": -1, "filename": "happyly-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fc6170552a3a758af8646c04df5b51ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 33006, "upload_time": "2019-03-18T19:31:31", "url": "https://files.pythonhosted.org/packages/1a/2b/754fd1010a57fa082318a6ae2f609174babb888579fe7a227609ed1f0950/happyly-0.3.1-py3-none-any.whl" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "47424349ed33fb544605126d0018b641", "sha256": "362bc72449b7d39cba035a7385d76a27b21b1c279cb7ba66f69951302b3c4589" }, "downloads": -1, "filename": "happyly-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "47424349ed33fb544605126d0018b641", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 46006, "upload_time": "2019-03-25T13:03:11", "url": "https://files.pythonhosted.org/packages/a7/ab/af29a48bb63a89dc7d6e4823f98609c204266257cfb3bc290496b28910dc/happyly-0.4.0-py3-none-any.whl" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "b008c94cd34e8bef4739941a79973eaf", "sha256": "a89343e1fb131cdab60337f48b05db6704e515451e6c02d6d3ec8ccbdd0dc18e" }, "downloads": -1, "filename": "happyly-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b008c94cd34e8bef4739941a79973eaf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 46973, "upload_time": "2019-03-25T15:50:55", "url": "https://files.pythonhosted.org/packages/68/af/97894033b7bd674b9bcb19ac6dc6e21de41155a14c42d0cb2587f98bed7e/happyly-0.4.1-py3-none-any.whl" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "865405ea4952c33c5e0c2a25bdd6868e", "sha256": "086026149f1fe881376aeb9593e083abad1d06cca645111431d7c3024793654b" }, "downloads": -1, "filename": "happyly-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "865405ea4952c33c5e0c2a25bdd6868e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 49848, "upload_time": "2019-03-27T14:06:44", "url": "https://files.pythonhosted.org/packages/1e/c9/e508d40e78283f4890c4756c1b913055fd0d999295aefe514f788dd431d0/happyly-0.5.0-py3-none-any.whl" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "2babb480b0413760fd0962096bc92a81", "sha256": "84ba4f5b9b1450421649d1dc6c6c6e9c8b3786b6b6b6d1de6b64068737c45edf" }, "downloads": -1, "filename": "happyly-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2babb480b0413760fd0962096bc92a81", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 49855, "upload_time": "2019-03-29T14:19:55", "url": "https://files.pythonhosted.org/packages/f1/7f/8e913b64c3a163755b73844dc14c389be271a265249523a756d5d31e7243/happyly-0.5.1-py3-none-any.whl" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "5e2ae6b5c1be71958c2167def61d7f24", "sha256": "6f1c6ff958f56e6c0e03c89698697dea2aeb872ff1a0727ebf005762acd63182" }, "downloads": -1, "filename": "happyly-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5e2ae6b5c1be71958c2167def61d7f24", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 58145, "upload_time": "2019-04-02T11:26:12", "url": "https://files.pythonhosted.org/packages/9b/62/1861f563cb1f1ae8c95adfe5df222895a6d079103ba46d7ca32d6d0bf1e0/happyly-0.6.0-py3-none-any.whl" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "e603d2f21fd3099ab04dc18cfc3c5900", "sha256": "77114a68d1d586b3a1dd084efa2cb678f9b66d1ba5b0bc8a174c62d8d82e8983" }, "downloads": -1, "filename": "happyly-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e603d2f21fd3099ab04dc18cfc3c5900", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 66395, "upload_time": "2019-04-29T21:10:24", "url": "https://files.pythonhosted.org/packages/5e/bb/1129c6147f189253d18e99a3efca6d0e90366b299a7380a6a0ee28c25c53/happyly-0.8.0-py3-none-any.whl" } ], "0.8.0rc4": [ { "comment_text": "", "digests": { "md5": "d569054b32fc20baef7744b5d41c2874", "sha256": "ffa239f6d190d87051ed9f0b002218677bf05c17f704de9cb132e84c2024b519" }, "downloads": -1, "filename": "happyly-0.8.0rc4-py3-none-any.whl", "has_sig": false, "md5_digest": "d569054b32fc20baef7744b5d41c2874", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 66314, "upload_time": "2019-04-10T16:16:43", "url": "https://files.pythonhosted.org/packages/e2/4b/c2f591435c9d520744d48e28d34ec37b86e5c0501765a74e79b3c87090c4/happyly-0.8.0rc4-py3-none-any.whl" } ], "0.8.0rc5": [ { "comment_text": "", "digests": { "md5": "ff0bfe837b8f011b599ece9d6075be8f", "sha256": "ac1ce187875e8fcf4f689479f94182ab8f0b934a8e09853d574a235ae9529c8b" }, "downloads": -1, "filename": "happyly-0.8.0rc5-py3-none-any.whl", "has_sig": false, "md5_digest": "ff0bfe837b8f011b599ece9d6075be8f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 66330, "upload_time": "2019-04-10T17:09:34", "url": "https://files.pythonhosted.org/packages/28/0c/91e7ad55766e51dd29903eebd795ceaa6ace72441a5067adaec4e7baa3f7/happyly-0.8.0rc5-py3-none-any.whl" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "9c477f5167971624a48d63d7c0dbdb9c", "sha256": "5cb9637f6002ae110daefda42e64c627baac0311025bbb9a45080b6f0c750b18" }, "downloads": -1, "filename": "happyly-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9c477f5167971624a48d63d7c0dbdb9c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 69921, "upload_time": "2019-05-14T22:04:57", "url": "https://files.pythonhosted.org/packages/32/e4/76eec97cc7daf20583bc3158b64be681f57292b41fc6ef4a2edcc44eb083/happyly-0.9.0-py3-none-any.whl" } ], "0.9.0rc1": [ { "comment_text": "", "digests": { "md5": "7ffc42c99a78c88c4a9d3f9a929b86cd", "sha256": "e6b4dd22d8fc6b25485b8f3920308d356f74f6824f8836e1a744565e28930e6c" }, "downloads": -1, "filename": "happyly-0.9.0rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "7ffc42c99a78c88c4a9d3f9a929b86cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 69120, "upload_time": "2019-05-14T18:31:09", "url": "https://files.pythonhosted.org/packages/a2/9f/46757eb16cbdde2184453c839a3209d97d894c6e5febea02eea065c0a9c6/happyly-0.9.0rc1-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9c477f5167971624a48d63d7c0dbdb9c", "sha256": "5cb9637f6002ae110daefda42e64c627baac0311025bbb9a45080b6f0c750b18" }, "downloads": -1, "filename": "happyly-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9c477f5167971624a48d63d7c0dbdb9c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 69921, "upload_time": "2019-05-14T22:04:57", "url": "https://files.pythonhosted.org/packages/32/e4/76eec97cc7daf20583bc3158b64be681f57292b41fc6ef4a2edcc44eb083/happyly-0.9.0-py3-none-any.whl" } ] }