{ "info": { "author": "Scott Crespo", "author_email": "sccrespo@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# CloeePy\nMini Python framework for backend jobs and such. Avoids the HTTP riffraff when you're\nnot building a web system.\n\nCloeePy uses YAML configuration files, which integrates better with Kubernetes'\nConfigMaps.\n\n**This project is currently in alpha.**\n\n## System Requirements\n- Unix-based operating system\n- Python 3.3+\n\n## Installation\n`pip install CloeePy`\n\n## Configuration\nPlease see the [example configuration](./example-config.yml) for details of how to configure\n\nA minimal configuration would be:\n\n```\n# config.yml\n\n# CloeePy Framework and plugins configuration listed under CloeePy key\nCloeePy:\n Logging:\n formatter: text\n level: debug\n Plugins: {}\n\n# Your application specific configurations can go here\nCustomVar: custom_value\n```\n\n## Usage\nUsing CloeePy is simple. Just import the framework, tell CloeePy where your config file\nis located, and use the plugins that are attached to the application object.\n\nWith programs consisting of multiple modules, you can access the CloeePy instance\nby re-instantiating it via `app = CloeePy()`. The CloeePy instance is a singleton,\nso it will only ever be instantiated once per process.\n\nThe only plugin that comes packaged with CloeePy (at this point) is the logger.\n\n```\n# main.py\n\nfrom cloeepy import CloeePy\n\nif __name__ == \"__main__\":\n # Required: set config path as environment variable\n os.environ[\"CLOEEPY_CONFIG_PATH\"] = /path/to/config.yml\n\n # instantiate application instance\n app = CloeePy()\n\n # write a log entry to stdout\n app.log.info(\"Hello World!\")\n```\n\n\n## Background\nThis package is brought to you by the engineering team at Cloee. We build\nArtificial Intelligence for DevOps and Infrastructure as a Service. Many of our\nsystems run as background jobs, and we weren't quite happy with existing Python\nframeworks - as most are designed for building web systems (Django, Flask, Tornado, etc).\n\nOur requirements were:\n\n**Simple, easy-to-use framework for developing non-HTTP backend systems**\n\nWe write a lot of cron jobs and message-driven systems, so we don't need request\nhandling functionality, which is the focus of most existing frameworks.\n\n**Singleton application context that can be accessed from anywhere**\n\nWe needed an application context containing configuration, database connections, other\nuseful stuff, that can be easily accessed from anywhere in our application.\nApplication context for a CloeePy app is a singleton that can be instantiated\nanywhere in the application without running the risk of re-reading configuration\nfiles or overwriting existing database connections.\n\n**YAML driven configuration files**\n\nMost popular python frameworks use python modules as configuration files. Although it's\nconvenient to do so in many situations, most of our systems run as containers on\nKubernetes. YAML has become the de-facto configuration format for many modern\napplications, and Kuberenetes supports YAML-based ConfigMaps that can be added to\na container at startup time.\n\n**Configuration object, NOT configuration dictionary**\n\nOkay, this is a nit-picky one. But when you have deeply nested configurations,\nisn't it annoying when all of your configuration data is stored as a Python dictionary?\nWouldn't dot accessors to your configuration data be a lot prettier and easy to\nread/write? We think so. Therefore, any dictionaries in your configuration files\nare turned into generic Python objets, so you can use the dot accessors like this:\n\n`config.key1.key2.key3`\n\ninstead of this:\n\n`config[key1][key2][key3]`.\n\nNonetheless, if you REALLY like dictionary access, you still have access to\nyour configuration as a dictionary.\n\n**Extensible via plugins**\n\nYou can extend CloeePy by creating plugins. Plugins allow you to create\nanything you want and attach it to the application context. This is particularly\nuseful for managing database connections or sharing common data/objects\nthroughout your application.\n\n## Maintainers\nScott Crespo (@scottcrespo)\n\n## Contributing\nIf you would like to contribute, please read the [Contributor's Guide](./CONTRIBUTING.md)\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/cloeeai/CloeePy", "keywords": "mini framework yaml cloee", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "CloeePy", "package_url": "https://pypi.org/project/CloeePy/", "platform": "", "project_url": "https://pypi.org/project/CloeePy/", "project_urls": { "Homepage": "https://github.com/cloeeai/CloeePy" }, "release_url": "https://pypi.org/project/CloeePy/0.0.2/", "requires_dist": null, "requires_python": "", "summary": "Light weight framework for non-HTTP systems.", "version": "0.0.2" }, "last_serial": 3708311, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "ec5b7c9adfe0386c4cecad4f9a60c5d6", "sha256": "906f8cd300da2024d887860d391a515bf6b9d7815be805571bd529e52b5b3d35" }, "downloads": -1, "filename": "CloeePy-0.0.0.tar.gz", "has_sig": false, "md5_digest": "ec5b7c9adfe0386c4cecad4f9a60c5d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7251, "upload_time": "2018-02-27T03:24:06", "url": "https://files.pythonhosted.org/packages/0d/41/f98565bad046892a3a22d7cc06da4d2436a7b719160df327f7d33becb5d4/CloeePy-0.0.0.tar.gz" } ], "0.0.0-rc1": [ { "comment_text": "", "digests": { "md5": "f1fa6c2ac3921977c0dbffb38548cfa4", "sha256": "9167bc323dfc4c52633ff5b34529e4b55e5d5200589f00a62994fe81981e3d6b" }, "downloads": -1, "filename": "CloeePy-0.0.0-rc1.tar.gz", "has_sig": false, "md5_digest": "f1fa6c2ac3921977c0dbffb38548cfa4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4052, "upload_time": "2018-02-26T22:04:31", "url": "https://files.pythonhosted.org/packages/f4/84/359e9e834cc3bdb9a3b24dd0951d0c769d8c7b869ccce210d6e161b97020/CloeePy-0.0.0-rc1.tar.gz" } ], "0.0.0-rc2": [ { "comment_text": "", "digests": { "md5": "61ab951b6b89970b2dae99dcc1a18d05", "sha256": "208dbddeac4fa80a13bf38f61dc84af3c767d630deec4199f1f394a30bace5b5" }, "downloads": -1, "filename": "CloeePy-0.0.0-rc2.tar.gz", "has_sig": false, "md5_digest": "61ab951b6b89970b2dae99dcc1a18d05", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5998, "upload_time": "2018-02-26T22:20:05", "url": "https://files.pythonhosted.org/packages/ff/a7/8ed04798f34c4e16a3297a5e15cf449c0bf62d9fc81134e068812177334e/CloeePy-0.0.0-rc2.tar.gz" } ], "0.0.0-rc3": [ { "comment_text": "", "digests": { "md5": "1f47a61aaa6ec20b5b6dc8a2d9a20485", "sha256": "fb7abacd974b8be23ca7247bcc71260d67c454b6db1720cb8cca29eb225cb137" }, "downloads": -1, "filename": "CloeePy-0.0.0-rc3.tar.gz", "has_sig": false, "md5_digest": "1f47a61aaa6ec20b5b6dc8a2d9a20485", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5996, "upload_time": "2018-02-26T22:33:11", "url": "https://files.pythonhosted.org/packages/64/da/75017199622fe828b4b0db6f82fa9f2ec3868e7566e5eeb6c25a2379e7d2/CloeePy-0.0.0-rc3.tar.gz" } ], "0.0.0-rc4": [ { "comment_text": "", "digests": { "md5": "20e143a7dcb12912c284394e023dffa4", "sha256": "9d1f66f5826d4870a2d28f5b5219bf2a2f5509c4c1abe8e0902ef9219979be61" }, "downloads": -1, "filename": "CloeePy-0.0.0-rc4.tar.gz", "has_sig": false, "md5_digest": "20e143a7dcb12912c284394e023dffa4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7232, "upload_time": "2018-02-27T02:27:39", "url": "https://files.pythonhosted.org/packages/88/1d/b285b39c4d3bff21bfa2b6fa2582546cc4f0cd6603e7317749ac26333aa8/CloeePy-0.0.0-rc4.tar.gz" } ], "0.0.0-rc5": [ { "comment_text": "", "digests": { "md5": "256812a793f9eb33f059cb7429ce40fd", "sha256": "aced3a90a60a73b6a42f62646938ffbf932d65a22a6cf3ff5af8cdac38fac0e7" }, "downloads": -1, "filename": "CloeePy-0.0.0-rc5.tar.gz", "has_sig": false, "md5_digest": "256812a793f9eb33f059cb7429ce40fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7263, "upload_time": "2018-02-27T02:52:54", "url": "https://files.pythonhosted.org/packages/90/b9/c8204f29d88c3006654cf8824cae4ed2071baeeb37966e3e787c21571440/CloeePy-0.0.0-rc5.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "5f571ed6af4f56e8f231af8add399f3d", "sha256": "413bf9e2448b867878b9f11f9979abe0feb5b46cb25223c1da75a9594362cd7f" }, "downloads": -1, "filename": "CloeePy-0.0.1.tar.gz", "has_sig": false, "md5_digest": "5f571ed6af4f56e8f231af8add399f3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7205, "upload_time": "2018-03-26T20:15:39", "url": "https://files.pythonhosted.org/packages/76/fb/c63c07dd86fa2d6c4b8de110e8faa3cf3290e4a38953d204d6c653512cd4/CloeePy-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "9c8855f76f0b01fc5ed0696c556d4bc9", "sha256": "2f3ab255a70ac673bd91242169572aa481e15a2fcf5ed24bb6a29221d39244c2" }, "downloads": -1, "filename": "CloeePy-0.0.2.tar.gz", "has_sig": false, "md5_digest": "9c8855f76f0b01fc5ed0696c556d4bc9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7211, "upload_time": "2018-03-26T22:31:02", "url": "https://files.pythonhosted.org/packages/f5/e6/02a15364d101071093444df51fd02b61059ca8c4ed189992f80b90f8aa0a/CloeePy-0.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9c8855f76f0b01fc5ed0696c556d4bc9", "sha256": "2f3ab255a70ac673bd91242169572aa481e15a2fcf5ed24bb6a29221d39244c2" }, "downloads": -1, "filename": "CloeePy-0.0.2.tar.gz", "has_sig": false, "md5_digest": "9c8855f76f0b01fc5ed0696c556d4bc9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7211, "upload_time": "2018-03-26T22:31:02", "url": "https://files.pythonhosted.org/packages/f5/e6/02a15364d101071093444df51fd02b61059ca8c4ed189992f80b90f8aa0a/CloeePy-0.0.2.tar.gz" } ] }