{ "info": { "author": "Andrew Boswell", "author_email": "drewboswell@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 1 - Planning", "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: System Administrators", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Office/Business" ], "description": "|GitHub tag| |GitHub release| |PyPI| |Py Versions|\n\n|Build Status| |Coverage Status| |Quality Gate| |Code Smells| |File\nComplexity| |Vulnerabilities| |Technical Dept| |Lines of code|\n\nconverge\n========\n\n*Resolve Data from Abstract Hierarchies and Templates*\n\nManaging configuration is hard. More often than not you have high\nkey/values duplication and storage.\n`DRY `__ your\ntears, it's time for some hierarchical magic, so you can get back to the\nimportant stuff.\n\nThis is where **converge** comes in. There are a few basic concepts when\nusing or extend converge: \\* Readers: get data from your backends \\*\nFilters: filter data before or after resolution (*example: search &\nreplace values, inject data post resolution*) \\* Resolvers: convert\nabstract data to resolved data \\* Writers: output your data to the\nformat and backend you need\n\nAbstract hierarchies of data chewed up and spit out to your liking.\n\nGetting started\n===============\n\ninstall pyconverge, this will add the ``converge`` command to your\nclasspath using setup.py/PyPi\n\n.. code:: bash\n\n pip install pyconverge\n converge version\n converge --help\n\nCreate a converge.yaml.template file in your project working directory,\nmodify and move it to converge.yaml\n\n.. code:: bash\n\n # create the converge.yaml.template file\n converge init conf\n # modify your converge parameters\n vim converge.yaml.template\n # activate converge\n mv converge.yaml.template converge.yaml\n # verify the integrity of your configuration file\n converge check\n\nTry it out! You chould have a bunch more options!\n\n.. code:: bash\n\n converge --help\n\nExample: Simple testing\n=======================\n\ncreate a converge.yaml as described above\n\n.. code:: bash\n\n converge init conf\n mv converge.yaml.template converge.yaml\n converge check\n\nCreate a sample repository structure\n\n.. code:: bash\n\n converge init repository target_directory\n\n # you should now have the following structure\n find target_directory/ -type d\n # this is where the application centric data goes\n ./data\n ./data/default\n ./data/default/shared\n ./data/default/app\n # the hierarchy file is situated here\n ./hierarchy\n # target (or host for most) centric data resides here\n ./targets\n ./targets/hosts\n ./targets/mapping\n\nConfiguration\n=============\n\nconverge.yaml\n-------------\n\nThis file is a bit peculiar, it allows you to add programs, options,\nconfigurations on the fly. Let's try it out before adding the\nconverge.yaml:\n\n.. code:: bash\n\n converge --help\n # positional arguments:\n # {init,check,version}\n # init initialize configuration or repository\n # check run sanity check on configuration\n # version get converge version and build information\n\nPut the following in a converge.yaml:\n\n.. code:: yaml\n\n conf:\n default:\n logging_level: \"INFO\"\n programs:\n # user command\n amazingcommand:\n # arguments expected by the command\n args:\n - \"argument_one\"\n - \"argument_two\"\n # description for the python help\n description: \"application description\"\n modes:\n amazing_mode_one:\n - \"com.insane.class.path.Class1\"\n - \"com.insane.class.path.Class2\"\n amazing_mode_two:\n - \"com.insane.class.path.Class1\"\n - \"com.insane.class.path.Class3\"\n\nNow you should see a new option:\n\n.. code:: bash\n\n converge --help\n # positional arguments:\n # {init,check,version,amazingcommand}\n # init initialize configuration or repository\n # check run sanity check on configuration\n # version get converge version and build information\n # amazingcommand application description <-- MAGIC STUFF with description!!\n\nAnd even more so there are sub-options available too:\n\n.. code:: bash\n\n converge amazingcommand --help\n # usage: converge-runner.py amazingcommand [-h]\n # argument_one argument_two\n # {amazing_mode_two,amazing_mode_one}\n #\n # positional arguments:\n # argument_one\n # argument_two\n # {amazing_mode_two,amazing_mode_one}\n\nClasspath Execution Explained\n-----------------------------\n\nThose classpaths you listed under the modes, will be executed expecting\na method matching the following:\n\n.. code:: python\n\n def run(self, data, conf, **kwargs):\n \"\"\"\n Args:\n data (dict): The data object that is passes and returned from all class runs\n conf (dict): Dictionary of all configurations found in converge.yaml (directories, logging etc)\n kwargs (object): magical python variable variable variables.\n\n Returns:\n dict: the data object that will be passed to all following class-runs.\n \"\"\"\n return data\n\nExample: Configuration for Java property files\n==============================================\n\nA rough overview\n================\n\nA general example in diagram form:\n\n.. figure:: docs/converge-diagram.png\n :alt: Converge Overview\n\n Alt text\n\nA Brief History of Pain\n=======================\n\nYou may have hit some (or all) of these stages in the pursuit of\nconfigurability:\n\n*In short: from the file, to the GUI, back to the file you idiot.*\n#wevecomefullcircle \\* Externalize configuration from your applications,\nto avoid re-releases due to simple conf tuning \\* Realizing that you're\nnow managing a million de-centralized files with no similar structure \\*\nCreate or use a centralized, GUI/DB based configuration management\nsystem (woohoo! configuration liberation!) \\* Realizing that you are\nmissing flexibility, automation is complex, added abstraction layers are\npainful.\n\nThe better model is to accept any data format, process it and output it\nas you wish.\n\nFiles are better because: \\* you can use time tested versioning systems\nlike git or mercurial to branch, release, rollback, check history \\* you\ncan automate the modification of files with any tool you want \\* doing\nmigrations/deployment/modifications on DB values/REST endpoints sucks\n(unnecessarily complex)\n\n.. |GitHub tag| image:: https://img.shields.io/github/tag/drewboswell/converge.svg\n :target: \n.. |GitHub release| image:: https://img.shields.io/github/release/drewboswell/converge.svg\n :target: \n.. |PyPI| image:: https://img.shields.io/pypi/v/pyconverge.svg\n :target: https://pypi.python.org/pypi/pyconverge/\n.. |Py Versions| image:: https://img.shields.io/pypi/pyversions/pyconverge.svg\n :target: https://pypi.python.org/pypi/pyconverge/\n.. |Build Status| image:: https://travis-ci.org/drewboswell/converge.svg?branch=master\n :target: https://travis-ci.org/drewboswell/converge\n.. |Coverage Status| image:: https://coveralls.io/repos/github/drewboswell/converge/badge.svg?branch=master\n :target: https://coveralls.io/github/drewboswell/converge?branch=master\n.. |Quality Gate| image:: https://sonarqube.com/api/badges/gate?key=drewboswell_converge\n :target: https://sonarqube.com/dashboard/index/drewboswell_converge\n.. |Code Smells| image:: https://sonarqube.com/api/badges/measure?key=drewboswell_converge&metric=code_smells\n :target: https://sonarqube.com/dashboard/index/drewboswell_converge\n.. |File Complexity| image:: https://sonarqube.com/api/badges/measure?key=drewboswell_converge&metric=file_complexity\n :target: https://sonarqube.com/dashboard/index/drewboswell_converge\n.. |Vulnerabilities| image:: https://sonarqube.com/api/badges/measure?key=drewboswell_converge&metric=vulnerabilities\n :target: https://sonarqube.com/dashboard/index/drewboswell_converge\n.. |Technical Dept| image:: https://sonarqube.com/api/badges/measure?key=drewboswell_converge&metric=sqale_debt_ratio\n :target: https://sonarqube.com/dashboard/index/drewboswell_converge\n.. |Lines of code| image:: https://sonarqube.com/api/badges/measure?key=drewboswell_converge&metric=ncloc\n :target: https://sonarqube.com/dashboard/index/drewboswell_converge\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/drewboswell/converge", "keywords": "configuration management development operations system sysadmin config converge", "license": "Apache License 2.0", "maintainer": "", "maintainer_email": "", "name": "pyconverge", "package_url": "https://pypi.org/project/pyconverge/", "platform": "any", "project_url": "https://pypi.org/project/pyconverge/", "project_urls": { "Homepage": "https://github.com/drewboswell/converge" }, "release_url": "https://pypi.org/project/pyconverge/0.0.18/", "requires_dist": null, "requires_python": "", "summary": "Resolve configurations from abstract hierarchies and templates", "version": "0.0.18" }, "last_serial": 2676896, "releases": { "0.0.10": [ { "comment_text": "", "digests": { "md5": "9f7155f7e3a8194897ae56df051c60ee", "sha256": "7ed8831aeae0f4346e327b3f107ce608306d7ed8d459e5556ca075c8b9fab25d" }, "downloads": -1, "filename": "pyconverge-0.0.10.tar.gz", "has_sig": false, "md5_digest": "9f7155f7e3a8194897ae56df051c60ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19650, "upload_time": "2017-01-09T22:29:41", "url": "https://files.pythonhosted.org/packages/30/3c/a8d795e0ba8176dc070fa5ed168ce7048e87c6dd5c57ffce045a26bba7f1/pyconverge-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "778e9704fba52919c0b7d85d5981c320", "sha256": "a9e9faa169400da04a653fb3ca2278781d3f930123aee68f22e56a9976d64159" }, "downloads": -1, "filename": "pyconverge-0.0.11.tar.gz", "has_sig": false, "md5_digest": "778e9704fba52919c0b7d85d5981c320", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21281, "upload_time": "2017-02-08T22:05:26", "url": "https://files.pythonhosted.org/packages/a7/33/ef40858c0baa75d8fa13065d5b1878a6ac2501f2c25534614f920710f50c/pyconverge-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "cc78b6dff2b69b822fc5732715cab81d", "sha256": "806d666ba335f11374346b878ebebb5bfde0c45447996c65e9b9abc1fb2f5138" }, "downloads": -1, "filename": "pyconverge-0.0.12.tar.gz", "has_sig": false, "md5_digest": "cc78b6dff2b69b822fc5732715cab81d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20552, "upload_time": "2017-02-20T19:36:06", "url": "https://files.pythonhosted.org/packages/09/7f/d0ca0188dd48cc119d45ce74d6b6da7edc845032fc06d571bb83bc39d0f3/pyconverge-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "ee6d3fdeb728d8f017623fad16499ed7", "sha256": "2696219897238bcc57e9dbcbbe8ab82e0f4363844d9d397f0a4bfe1af4cabfe8" }, "downloads": -1, "filename": "pyconverge-0.0.13.tar.gz", "has_sig": false, "md5_digest": "ee6d3fdeb728d8f017623fad16499ed7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20553, "upload_time": "2017-02-20T21:24:09", "url": "https://files.pythonhosted.org/packages/da/dd/6256a44abf01739abb5fc370d5995029cbbe743bea7cd37cb73f4cd900a7/pyconverge-0.0.13.tar.gz" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "dd3f0f177f06b53ac256e0098282ce07", "sha256": "f604b25de48550b641d89945cc933f3cac60a6e0852bb3a5f7cd3cc44171ae59" }, "downloads": -1, "filename": "pyconverge-0.0.14.tar.gz", "has_sig": false, "md5_digest": "dd3f0f177f06b53ac256e0098282ce07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22122, "upload_time": "2017-02-27T08:20:44", "url": "https://files.pythonhosted.org/packages/0d/00/80efebfbb14d77abe5c31f6c2c081aad07ba475d6cf026ff45ba2a4ae7c1/pyconverge-0.0.14.tar.gz" } ], "0.0.15": [ { "comment_text": "", "digests": { "md5": "b0f7c726ff818dba0b9704a3a5d08dd0", "sha256": "e1921aa341ddefb6ea22e602c4f50c04ecb4259081cc0deb110c90dacf6133fc" }, "downloads": -1, "filename": "pyconverge-0.0.15.tar.gz", "has_sig": false, "md5_digest": "b0f7c726ff818dba0b9704a3a5d08dd0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21463, "upload_time": "2017-02-28T09:11:26", "url": "https://files.pythonhosted.org/packages/08/01/f2a8bc0b18f4d57f3ba6d3854bfe97a78c90d35b8f90ec3737049be4bdad/pyconverge-0.0.15.tar.gz" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "7f18c153c82ab67d02704c9601d802a2", "sha256": "c64b620e658257c2bb2a3830b0a2f28fd8facb00279e900c72138c3d85f5c0ec" }, "downloads": -1, "filename": "pyconverge-0.0.16.tar.gz", "has_sig": false, "md5_digest": "7f18c153c82ab67d02704c9601d802a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21406, "upload_time": "2017-03-01T20:55:42", "url": "https://files.pythonhosted.org/packages/e3/de/8a56d61cef0cb866d41a6ecad581d97035b2c0844327888c1256f75d3338/pyconverge-0.0.16.tar.gz" } ], "0.0.17": [ { "comment_text": "", "digests": { "md5": "945353e8448a22f8ba6c4dd5cc687ea0", "sha256": "88237b595556089c9358ec5b6b54f94e494adc99cbdc3f0ff62f21901642c4e1" }, "downloads": -1, "filename": "pyconverge-0.0.17.tar.gz", "has_sig": false, "md5_digest": "945353e8448a22f8ba6c4dd5cc687ea0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21337, "upload_time": "2017-03-01T20:57:22", "url": "https://files.pythonhosted.org/packages/40/55/cd96a9dcbbc3a96869562da70d79841f207eeb35b5a64a96b97f12586a53/pyconverge-0.0.17.tar.gz" } ], "0.0.18": [ { "comment_text": "", "digests": { "md5": "4c8c7a77fd566c8eacb0117bd731ac79", "sha256": "cc608323200faab5a950481a2abc6e40c91f66e7e260e99a012e65d557c75a9f" }, "downloads": -1, "filename": "pyconverge-0.0.18.tar.gz", "has_sig": false, "md5_digest": "4c8c7a77fd566c8eacb0117bd731ac79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22755, "upload_time": "2017-03-01T22:30:55", "url": "https://files.pythonhosted.org/packages/3e/b4/d8acf58c8f7c68bb907fa8097f1ecbcb13fecd53e57cf1559edabda12c6c/pyconverge-0.0.18.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4c8c7a77fd566c8eacb0117bd731ac79", "sha256": "cc608323200faab5a950481a2abc6e40c91f66e7e260e99a012e65d557c75a9f" }, "downloads": -1, "filename": "pyconverge-0.0.18.tar.gz", "has_sig": false, "md5_digest": "4c8c7a77fd566c8eacb0117bd731ac79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22755, "upload_time": "2017-03-01T22:30:55", "url": "https://files.pythonhosted.org/packages/3e/b4/d8acf58c8f7c68bb907fa8097f1ecbcb13fecd53e57cf1559edabda12c6c/pyconverge-0.0.18.tar.gz" } ] }