{ "info": { "author": "alexandre menezes", "author_email": "alexandre.fmenezes@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: AsyncIO", "Framework :: Flask", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Java Libraries" ], "description": "[![Build Status](https://travis-ci.org/amenezes/config-client.svg?branch=master)](https://travis-ci.org/amenezes/config-client)\n[![Maintainability](https://api.codeclimate.com/v1/badges/7b8b70e0c20c6809df54/maintainability)](https://codeclimate.com/github/amenezes/config-client/maintainability)\n[![codecov](https://codecov.io/gh/amenezes/config-client/branch/master/graph/badge.svg)](https://codecov.io/gh/amenezes/config-client)\n[![PyPI version](https://badge.fury.io/py/config-client.svg)](https://badge.fury.io/py/config-client)\n\n# config-client\n\nconfig-client package for [spring cloud config](https://spring.io/projects/spring-cloud-config).\n\n## Installing\n\nInstall and update using pip:\n\n````bash\npip install -U config-client\n````\n\n## Dependencies\n\n- [attrs](http://attrs.org)\n- [glom](https://glom.readthedocs.io/en/latest/index.html)\n- [requests](https://2.python-requests.org/en/master/)\n\n## Setup\n\nThe default URL pattern is:\n - *`CONFIGSERVER_ADDRESS`*/*`BRANCH`*/*`APP_NAME`*-*`PROFILE`*.json\n\n````ini\n# expected environment variables:\n#\nCONFIGSERVER_ADDRESS=http://localhost:8888\nBRANCH=master\nPROFILE=development\nAPP_NAME=myapp\n````\n\nwill result in:\n\n````txt\nhttp://localhost:8888/master/myapp-development.json\n````\n\nThe url pattern can be customize on constructor with parameter `url`.\n\n```python\nfrom config import spring\n\nc = spring.ConfigClient(\n app_name='myapp',\n url=\"{address}/{branch}/{profile}-{app_name}.json\"\n )\nc.url\n# output: 'http://localhost:8888/master/development-myapp.json'\n```\n\n### Default values\n\nif no value was adjusted for the environment variables below, the default value will be assumed, as:\n\n````ini\nCONFIGSERVER_ADDRESS=http://localhost:8888\nBRANCH=master\nPROFILE=development\nAPP_NAME=\n````\n\n### Supported response format\n\n- JSON\n\nJust add the `.json` extension to the end of the URL parameter. For example:\n\n````python\nc = ConfigClient(\n app_name='foo',\n profile='development',\n address='http://localhost:8000',\n branch='master',\n url='{address}/{branch}/{app_name}-{profile}.json' # <\n)\n````\n\nIt will result in URL: `http://localhost:8000/master/foo-development.json` .\n\n**Notice**\n`.yaml` it's not supported, all extensions will be converted to `.json` internally.\n\n## Usage Example\n\n### using standard client\n\n````python\nfrom config.spring import ConfigClient\n\nconfig_client = ConfigClient(app_name='my_app')\nconfig_client.get_config()\n\n# option 1: dict like with direct access\nconfig_client.config['spring']['cloud']['consul']['host']\n\n# option 2: dict like using get\nconfig_client.config.get('spring').get('cloud').get('consul').get('port')\n\n# option 3: using get_attribute method\nconfig_client.get_attribute('spring.cloud.consul.port')\n````\n\n### standard client with @decorator\n\nFor use cases where environment variables are set.\n\n````python\nfrom config import spring\n\n@spring.config_client()\ndef my_test(config_client=None):\n config_client.config['spring']['cloud']['consul']['host']\n config_client.config.get('spring').get('cloud').get('consul').get('port')\n config_client.get_attribute('spring.cloud.consul.port')\n````\n\nFor use cases where environment variables are not set can you use decorator parameters, as example below:\n\n````python\nfrom config import spring\n\n@spring.config_client(app_name='myapp', branch=\"dev\")\ndef my_test(config_client=None):\n config_client.config['spring']['cloud']['consul']['host']\n config_client.config.get('spring').get('cloud').get('consul').get('port')\n config_client.get_attribute('spring.cloud.consul.port')\n````\n\nIntegration with Flask.\n\n````python\nfrom config.spring import ConfigClient\nfrom flask import Flask\n\n\nconfig_client = ConfigClient(app_name=\"myapp\")\nconfig_client.get_config()\napp = Flask(__name__)\napp.run(host='0.0.0.0',\n port=config_client.config.get('app').get('port')\n````\n\n### using asyncio\n\nclient using asyncio\n\n````python\nimport asyncio\nfrom config.spring import ConfigClient\n\n\nloop = asyncio.get_event_loop()\nconfig_client = ConfigClient(app_name='myapp')\nconfig_client.get_config()\n\nasync def service_discovery():\n await discovery_client.register(\n config_client.config['app']['name'],\n config_client.config.get('app').get('port')\n )\n\ndiscovery_client = Consul(\n config_client.config.get('spring').get('cloud').get('consul').get('host'),\n config_client.get_attribute('spring.cloud.consul.port'],\n loop\n)\nloop.run_until_complete(service_discovery)\n````\n\n### create singleton instance\n\nAssuming default values.\n\n```python\nfrom config.spring import create_config_client\n\n\nc = create_config_client()\nd = create_config_client()\n\nprint(id(c))\nprint(id(d))\n\n```\n\nWith custom values.\n\n```python\nfrom config.spring import create_config_client\n\n\nc = create_config_client(address='http://localhost:8888/configuration', app_name='autosprocessuais-pecas-txtos', branch=\"ft-sdintegracoes-591\")\nd = create_config_client(address='http://localhost:8888/configuration', app_name='autosprocessuais-pecas-txtos', branch=\"ft-sdintegracoes-591\")\n\nprint(id(c))\nprint(id(d))\n\n```\n\n### [cloudfoundry](https://docs.pivotal.io/spring-cloud-services/1-5/common/config-server/index.html) integration\n\n````python\nfrom config.cf import CF\n\ncf = CF()\ncf.get_config()\n````\n\nIt's necessary bind Config Server with the application first.\n\nA example application it's available on:\n- https://github.com/amenezes/simpleweb\n\n## Development\n\n### Running Tests\n\nInstall development dependencies.\n```bash\npip install -r requirements-dev.txt\n```\n\nTo execute tests just run:\n```bash\npython -m pytest -v --cov-report term --cov=config tests\n```\n\n## Links\n\n- License: [Apache License](https://choosealicense.com/licenses/apache-2.0/)\n- Code: https://github.com/amenezes/config-client\n- Issue tracker: https://github.com/amenezes/config-client/issues", "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/amenezes/config-client", "keywords": "", "license": "Apache-2.0", "maintainer": "", "maintainer_email": "", "name": "config-client", "package_url": "https://pypi.org/project/config-client/", "platform": "", "project_url": "https://pypi.org/project/config-client/", "project_urls": { "Code": "https://github.com/amenezes/config-client", "Documentation": "https://github.com/amenezes/config-client", "Homepage": "https://github.com/amenezes/config-client", "Issue tracker": "https://github.com/amenezes/config-client/issues" }, "release_url": "https://pypi.org/project/config-client/0.4.0/", "requires_dist": null, "requires_python": ">=3.6.0", "summary": "config service client", "version": "0.4.0" }, "last_serial": 5915873, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "e795254ae776771e786e970dd7318af8", "sha256": "2a6b8e2cbf4ad2776e529b7618e856ebfeb62bb092828d92d17d3f29e76f9efb" }, "downloads": -1, "filename": "config_client-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e795254ae776771e786e970dd7318af8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7331, "upload_time": "2019-02-14T15:59:51", "url": "https://files.pythonhosted.org/packages/91/bd/b098c41c04fa4a4e639d8f79f91a0a7305e0581cd885d2af8eb1f520f33e/config_client-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e35b456f423e05056992083cc9341a06", "sha256": "30f54d69cfbbee673c12d3b875550ab1242ec4a3fe2a1ef1f1e02dd0823ab195" }, "downloads": -1, "filename": "config-client-0.1.0.tar.gz", "has_sig": false, "md5_digest": "e35b456f423e05056992083cc9341a06", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3048, "upload_time": "2019-02-14T15:59:53", "url": "https://files.pythonhosted.org/packages/e4/b7/fd4040d2e99b7b15e856f13494947d8c915558a7ebd36426d2f89cef8f04/config-client-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "58796e0f7317ec89dfeb5196d90fc9db", "sha256": "2dc32047936aec58a546428e31a538c451029b4f5f1df204a8da0b33ebe39bb1" }, "downloads": -1, "filename": "config_client-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "58796e0f7317ec89dfeb5196d90fc9db", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7608, "upload_time": "2019-04-02T21:58:58", "url": "https://files.pythonhosted.org/packages/4e/fb/f1c68fb443c578eb99442225d9d56cdd59fa1dc50bdb1061047b64660006/config_client-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9d9708b0d6d130001ccfa06d332a7b9b", "sha256": "8fa52c3bf5e37074241b355d9fa641eb686ff9cbbb122797d428eabb37aefb32" }, "downloads": -1, "filename": "config-client-0.1.1.tar.gz", "has_sig": false, "md5_digest": "9d9708b0d6d130001ccfa06d332a7b9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3313, "upload_time": "2019-04-02T21:58:59", "url": "https://files.pythonhosted.org/packages/b1/82/7f6324496b35882c1ce659760358b899a6bf1ddeab836c8120082fb49619/config-client-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "3e2602b7f67a19c4e83d729e305e9b27", "sha256": "168deca09887f0391926f8a42e4ec42dd26ed26b12f16d50a90c14d6c9383739" }, "downloads": -1, "filename": "config_client-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3e2602b7f67a19c4e83d729e305e9b27", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7990, "upload_time": "2019-06-05T21:42:32", "url": "https://files.pythonhosted.org/packages/e7/f1/4c2bca147bb953608ae5c8269f85b281d3772fb384a3b09cdf365ed9d377/config_client-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c0b8d4a33b7fd0846f2c286c143aefc", "sha256": "86c08e4382a4a904bb78154a8e2dd323f3926ceb21277efafe1672142158bf14" }, "downloads": -1, "filename": "config-client-0.2.0.tar.gz", "has_sig": false, "md5_digest": "5c0b8d4a33b7fd0846f2c286c143aefc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3546, "upload_time": "2019-06-05T21:42:33", "url": "https://files.pythonhosted.org/packages/ab/88/a13b648418972cdd744bde3ed4ac39731c6415d7b5db79fec0a94a1590c9/config-client-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "9ca49571adc4ecc9e3a44fffda9e0faa", "sha256": "c5fa35bbd3587e47a4bce87c00486dc51c73a4808257792b0c03b9f15bb84450" }, "downloads": -1, "filename": "config_client-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9ca49571adc4ecc9e3a44fffda9e0faa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 8110, "upload_time": "2019-07-08T23:52:21", "url": "https://files.pythonhosted.org/packages/2a/e1/147f30506a57c9e9db292c3211e0bf309bd22339d0c14143b86922c343d4/config_client-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "75089a7a0cf454704e1e0f4ed8caceea", "sha256": "2aeed4dad8e3033e06bf1ff06c9e21511aa65c57f5703d2e61d09523390dcb9c" }, "downloads": -1, "filename": "config-client-0.2.1.tar.gz", "has_sig": false, "md5_digest": "75089a7a0cf454704e1e0f4ed8caceea", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 3684, "upload_time": "2019-07-08T23:52:23", "url": "https://files.pythonhosted.org/packages/cf/ab/536e28bf5498161dce2da4ef0a1d72b0f74f465c6b3aa3e5100ca4da4ec0/config-client-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "366b4de7794d7e733736f53e4723e703", "sha256": "1daef2ccc3a380901f8ccc5aff850f99d5b324337167f8db6e52c6a2105a3a75" }, "downloads": -1, "filename": "config_client-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "366b4de7794d7e733736f53e4723e703", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 8487, "upload_time": "2019-07-16T18:42:23", "url": "https://files.pythonhosted.org/packages/ff/91/bd0a4baf5a7a15b02b4316075603985c7912a7b4260eb3d6eb88a727511a/config_client-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e0af8a5f71abd2ae177c463f005fab53", "sha256": "9ebcdb91d715f0c7b2e77abe403a37512b01573975b36f07c3ae3916fa5cb3c2" }, "downloads": -1, "filename": "config-client-0.3.0.tar.gz", "has_sig": false, "md5_digest": "e0af8a5f71abd2ae177c463f005fab53", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 4220, "upload_time": "2019-07-16T18:42:25", "url": "https://files.pythonhosted.org/packages/94/1d/86ac4b60705138d1b5408c822a64920f0f05f6444be181124ddf6f1a1ae4/config-client-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "22fb2afbf4fc8698f67ceb6160ef9281", "sha256": "84a29fb6edfe13d27583c0e2da367590dff2f89ee9838284d593ef932b1e5553" }, "downloads": -1, "filename": "config_client-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "22fb2afbf4fc8698f67ceb6160ef9281", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 8521, "upload_time": "2019-07-16T20:26:57", "url": "https://files.pythonhosted.org/packages/35/89/6197a07b5e1a7e3cd9cd654a5214571c158ef6ff5877a29102a31516ed9a/config_client-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87c8bf3153ac3dd945632210af05626b", "sha256": "862a5d253891868b6f1585b2ccf21baddfa2b1efeaff81df94b05f152919cf3d" }, "downloads": -1, "filename": "config-client-0.3.1.tar.gz", "has_sig": false, "md5_digest": "87c8bf3153ac3dd945632210af05626b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 4303, "upload_time": "2019-07-16T20:26:59", "url": "https://files.pythonhosted.org/packages/1d/f2/6cc3135d45225c4bb6039ac0d08b3794b14aaa10bc4e778dd3d07149b7e6/config-client-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "73a1ea36d4893925e3c5fde5e57b4b7e", "sha256": "3c8097407ed30adcd710e563d311ffeaadaeb37c890596011152936ccb514e9b" }, "downloads": -1, "filename": "config_client-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "73a1ea36d4893925e3c5fde5e57b4b7e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 8975, "upload_time": "2019-08-07T01:09:15", "url": "https://files.pythonhosted.org/packages/36/5a/26b482e23ec6316825d368cc38d01339d97e066e2f4d92e0a2638f48db8b/config_client-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4e7f53a05814a5544db239d2c1c04d59", "sha256": "df37dc8573c8c09f3f0dc6e583c05ae59bef80c1c291344bbc8ac791501d8660" }, "downloads": -1, "filename": "config-client-0.3.2.tar.gz", "has_sig": false, "md5_digest": "4e7f53a05814a5544db239d2c1c04d59", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 4778, "upload_time": "2019-08-07T01:09:17", "url": "https://files.pythonhosted.org/packages/98/8b/220c7bcfb202861c562d0664b71d9973da15d09062b19d313d0ef3d86484/config-client-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "8c0b880179c05feaf930d419a7be3be3", "sha256": "3c752c19f79d2a22c12002f63fdbad97dad7923125a7ff392785387d8287f04f" }, "downloads": -1, "filename": "config-client-0.4.0.tar.gz", "has_sig": false, "md5_digest": "8c0b880179c05feaf930d419a7be3be3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6102, "upload_time": "2019-10-02T03:40:27", "url": "https://files.pythonhosted.org/packages/37/01/1271ea79d00a8d0b8071e2d8c09b791bde5f8532ce05dca1e51b72fabfaf/config-client-0.4.0.tar.gz" } ], "0.4.0a0": [ { "comment_text": "", "digests": { "md5": "30dc8e8e326c97d4ba2a2288b851e09c", "sha256": "a55984c52deb87ea590d80d6e4f36dcac0bb9c6bace749d955a85b8720c36da1" }, "downloads": -1, "filename": "config_client-0.4.0a0-py3-none-any.whl", "has_sig": false, "md5_digest": "30dc8e8e326c97d4ba2a2288b851e09c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 11270, "upload_time": "2019-09-06T20:18:52", "url": "https://files.pythonhosted.org/packages/3c/da/a9dd7043d7813d8dee93992ac35b97a66e3844bf9c137ee6b9ff8038e525/config_client-0.4.0a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce0328527d0b32df26e74a5a98db60c7", "sha256": "47b426694692c2d8b02c891050b1e089bd58b55672a87c6ef9b2cc96ffda96a9" }, "downloads": -1, "filename": "config-client-0.4.0a0.tar.gz", "has_sig": false, "md5_digest": "ce0328527d0b32df26e74a5a98db60c7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 5959, "upload_time": "2019-09-06T20:18:54", "url": "https://files.pythonhosted.org/packages/30/f6/968b2cce750a2ff1b9ed4b2501cc4e284fdd7c1d6cc294afa6775c3c935a/config-client-0.4.0a0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8c0b880179c05feaf930d419a7be3be3", "sha256": "3c752c19f79d2a22c12002f63fdbad97dad7923125a7ff392785387d8287f04f" }, "downloads": -1, "filename": "config-client-0.4.0.tar.gz", "has_sig": false, "md5_digest": "8c0b880179c05feaf930d419a7be3be3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6102, "upload_time": "2019-10-02T03:40:27", "url": "https://files.pythonhosted.org/packages/37/01/1271ea79d00a8d0b8071e2d8c09b791bde5f8532ce05dca1e51b72fabfaf/config-client-0.4.0.tar.gz" } ] }