{"id":13667299,"url":"https://github.com/tr11/python-configuration","last_synced_at":"2025-10-21T19:41:17.790Z","repository":{"id":45112441,"uuid":"166009168","full_name":"tr11/python-configuration","owner":"tr11","description":"A Python library to load configuration parameters","archived":false,"fork":false,"pushed_at":"2024-07-23T13:16:19.000Z","size":904,"stargazers_count":90,"open_issues_count":12,"forks_count":25,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-29T08:12:45.002Z","etag":null,"topics":["configuration","python","settings"],"latest_commit_sha":null,"homepage":"https://tr11.github.io/python-configuration/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tr11.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-01-16T09:09:11.000Z","updated_at":"2025-07-26T14:22:04.000Z","dependencies_parsed_at":"2024-01-09T00:24:20.885Z","dependency_job_id":"9291ecfe-65e9-45bb-9cc5-5b3f40c93338","html_url":"https://github.com/tr11/python-configuration","commit_stats":{"total_commits":100,"total_committers":14,"mean_commits":7.142857142857143,"dds":0.36,"last_synced_commit":"bacd41fa10ffcf6458a06022986226de10e43267"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/tr11/python-configuration","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tr11%2Fpython-configuration","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tr11%2Fpython-configuration/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tr11%2Fpython-configuration/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tr11%2Fpython-configuration/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tr11","download_url":"https://codeload.github.com/tr11/python-configuration/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tr11%2Fpython-configuration/sbom","scorecard":{"id":896304,"data":{"date":"2025-08-11","repo":{"name":"github.com/tr11/python-configuration","commit":"f9da97f5e6a387753052d9f3850d7d41f4a75e10"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":1,"reason":"Found 3/28 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/docs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/docs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run_tests.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/run_tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run_tests.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/run_tests.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run_tests.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/run_tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run_tests.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/run_tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run_tests.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/tr11/python-configuration/run_tests.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/docs.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/publish.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/run_tests.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/run_tests.yml:57","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/docs.yml:9","Info: topLevel 'contents' permission set to 'read': .github/workflows/publish.yml:9","Warn: no topLevel permission defined: .github/workflows/run_tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 14 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-24T13:50:11.881Z","repository_id":45112441,"created_at":"2025-08-24T13:50:11.881Z","updated_at":"2025-08-24T13:50:11.881Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280325248,"owners_count":26311414,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-21T02:00:06.614Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["configuration","python","settings"],"created_at":"2024-08-02T07:00:34.750Z","updated_at":"2025-10-21T19:41:17.742Z","avatar_url":"https://github.com/tr11.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# python-configuration\n\u003e A library to load configuration parameters hierarchically from multiple sources and formats\n\n[![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg)](https://github.com/pypa/hatch)\n[![version](https://img.shields.io/pypi/v/python-configuration)](https://pypi.org/project/python-configuration/)\n![python](https://img.shields.io/pypi/pyversions/python-configuration)\n![wheel](https://img.shields.io/pypi/wheel/python-configuration)\n![license](https://img.shields.io/pypi/l/python-configuration)\n[![tests](https://github.com/tr11/python-configuration/actions/workflows/run_tests.yml/badge.svg)](https://github.com/tr11/python-configuration/actions/workflows/run_tests.yml)\n[![codecov](https://codecov.io/gh/tr11/python-configuration/branch/main/graph/badge.svg?token=5zRYlGnDs7)](https://codecov.io/gh/tr11/python-configuration)\n[![Documentation](https://github.com/tr11/python-configuration/actions/workflows/docs.yml/badge.svg)](https://github.com/tr11/python-configuration/actions/workflows/docs.yml)\n\nThis library is intended as a helper mechanism to load configuration files hierarchically.\n\n## Supported Formats\n\nThe `python-configuration` library supports the following configuration formats and sources:\n\n- Python files\n- Dictionaries\n- Environment variables\n- Filesystem paths\n- JSON files\n- INI files \n- dotenv type files\n- Optional support for:\n  - YAML files: requires `yaml`\n  - TOML files: requires `tomli` for Python \u003c 3.11\n  - Azure Key Vault credentials: requires `azure-keyvault`\n  - AWS Secrets Manager credentials: requires `boto3`\n  - GCP Secret Manager credentials: requires `google-cloud-secret-manager`\n  - Hashicorp Vault credentials: requires `hvac`\n\n\n## Installing\n\nTo install the library:\n\n```shell\npip install python-configuration\n```\n\nTo include the optional TOML and/or YAML loaders, install the optional dependencies `toml` and ` yaml`. For example,\n\n```shell\npip install python-configuration[toml,yaml]\n```\n\nWithout the optional dependencies, the TOML (Python \u003c 3.11) and YAML loaders will not be available, \nand attempting to use them will raise an exception.\n\n## Getting started\n\n`python-configuration` converts the various config types into dictionaries with dotted-based keys. For example, given this JSON configuration\n\n```json\n{\n    \"a\": {\n        \"b\": \"value\"\n    }\n}\n```\n\nWe can use the `config_from_json` method to parse it:\n\n```python\nfrom config import config_from_json\n\ncfg = config_from_json(\"my_config_file.json\", read_from_file=True)\n```\n\n(Similar methods exist for all the other supported configuration formats (eg. `config_from_toml`, etc.).)\n\nWe are then able to refer to the parameters in the config above using any of:\n\n```python\ncfg['a.b']\ncfg['a']['b']\ncfg['a'].b\ncfg.a.b\n```\n\nand extract specific data types such as dictionaries:\n\n```python\ncfg['a'].as_dict == {'b': 'value'}\n```\n\nThis is particularly useful in order to isolate group parameters.\nFor example, with the JSON configuration\n\n```json\n{\n  \"database.host\": \"something\",\n  \"database.port\": 12345,\n  \"database.driver\": \"name\",\n  \"app.debug\": true,\n  \"app.environment\": \"development\",\n  \"app.secrets\": \"super secret\",\n  \"logging\": {\n    \"service\": \"service\",\n    \"token\": \"token\",\n    \"tags\": \"tags\"\n  }\n}\n```\n\none can retrieve the dictionaries as\n\n```python\ncfg.database.as_dict()\ncfg.app.as_dict()\ncfg.logging.as_dict()\n```\n\nor simply as\n\n```python\ndict(cfg.database)\ndict(cfg.app)\ndict(cfg.logging)\n```\n\n## Configuration\n\nThere are two general types of objects in this library. The first one is the `Configuration`, which represents a single config source.  The second is a `ConfigurationSet` that allows for multiple `Configuration` objects to be specified.\n\n### Single Config\n\n#### Python Files\n\nTo load a configuration from a Python module, the `config_from_python` can be used.\nThe first parameter must be a Python module and can be specified as an absolute path to the Python file or as an importable module.\n\nOptional parameters are the `prefix` and `separator`.  The following call\n\n```python\nconfig_from_python('foo.bar', prefix='CONFIG', separator='__')\n```\n\nwill read every variable in the `foo.bar` module that starts with `CONFIG__` and replace every occurrence of `__` with a `.`. For example,\n\n```python\n# foo.bar\nCONFIG__AA__BB_C = 1\nCONFIG__AA__BB__D = 2\nCONF__AA__BB__D = 3\n```\n\nwould result in the configuration\n\n```python\n{\n    'aa.bb_c': 1,\n    'aa.bb.d': 2,\n}\n```\n\nNote that the single underscore in `BB_C` is not replaced and the last line is not prefixed by `CONFIG`.\n\n#### Dictionaries\n\nDictionaries are loaded with `config_from_dict` and are converted internally to a flattened `dict`.\n\n```python\n{\n    'a': {\n        'b': 'value'\n    }\n}\n```\n\nbecomes\n\n```python\n{\n    'a.b': 'value'\n}\n```\n\n#### Environment Variables\n\nEnvironment variables starting with `prefix` can be read with `config_from_env`:\n\n```python\nconfig_from_env(prefix, separator='_')\n```\n\n#### Filesystem Paths\n\nFolders with files named as `xxx.yyy.zzz` can be loaded with the `config_from_path` function.  This format is useful to load mounted Kubernetes [ConfigMaps](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#populate-a-volume-with-data-stored-in-a-configmap) or [Secrets](https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#create-a-pod-that-has-access-to-the-secret-data-through-a-volume).\n\n#### JSON, INI, .env, YAML, TOML\n\nJSON, INI, YAML, TOML files are loaded respectively with\n`config_from_json`,\n`config_from_ini`,\n`config_from_dotenv`,\n`config_from_yaml`, and\n`config_from_toml`.\nThe parameter `read_from_file` controls whether a string should be interpreted as a filename.\n\n###### Caveats\n\nIn order for `Configuration` objects to act as `dict` and allow the syntax `dict(cfg)`, the `keys()` method is implemented as the typical `dict` keys. If `keys` is an element in the configuration `cfg` then the `dict(cfg)` call will fail. In that case, it's necessary to use the `cfg.as_dict()` method to retrieve the `dict` representation for the `Configuration` object.\n\nThe same applies to the methods `values()` and `items()`.\n\n\n### Configuration Sets\n\nConfiguration sets are used to hierarchically load configurations and merge settings. Sets can be loaded by constructing a `ConfigurationSet` object directly or using the simplified `config` function.\n\nTo construct a `ConfigurationSet`, pass in as many of the simple `Configuration` objects as needed:\n\n```python\ncfg = ConfigurationSet(\n    config_from_env(prefix=PREFIX),\n    config_from_json(path, read_from_file=True),\n    config_from_dict(DICT),\n)\n```\nThe example above will read first from Environment variables prefixed with `PREFIX`, and fallback first to the JSON file at `path`, and finally use the dictionary `DICT`.\n\nThe `config` function simplifies loading sets by assuming some defaults.\nThe example above can also be obtained by\n\n```python\ncfg = config(\n    ('env', PREFIX),\n    ('json', path, True),\n    ('dict', DICT),\n)\n```\n\nor, even simpler if `path` points to a file with a `.json` suffix:\n\n```python\ncfg = config('env', path, DICT, prefix=PREFIX)\n```\n\nThe `config` function automatically detects the following:\n\n* extension `.py` for python modules\n* dot-separated python identifiers as a python module (e.g. `foo.bar`)\n* extension `.json` for JSON files\n* extension `.yaml` for YAML files\n* extension `.toml` for TOML files\n* extension `.ini` for INI files\n* extension `.env` for dotenv type files\n* filesystem folders as Filesystem Paths\n* the strings `env` or `environment` for Environment Variables\n\n#### Merging Values\n\n`ConfigurationSet` instances are constructed by inspecting each configuration source, taking into account nested dictionaries, and merging at the most granular level.\nFor example, the instance obtained from `cfg = config(d1, d2)` for the dictionaries below\n\n```python\nd1 = {'sub': {'a': 1, 'b': 4}}\nd2 = {'sub': {'b': 2, 'c': 3}}\n```\n\nis such that `cfg['sub']` equals\n\n```python\n{'a': 1, 'b': 4, 'c': 3}\n```\n\nNote that the nested dictionaries of `'sub'` in each of `d1` and `d2` do not overwrite each other, but are merged into a single dictionary with keys from both `d1` and `d2`, giving priority to the values of `d1` over those from `d2`.\n\n\n###### Caveats\n\nAs long as the data types are consistent across all the configurations that are part of a `ConfigurationSet`, the behavior should be straightforward.  When different configuration objects are specified with competing data types, the first configuration to define the elements sets its datatype. For example, if in the example above `element` is interpreted as a `dict` from environment variables, but the JSON file specifies it as anything else besides a mapping, then the JSON value will be dropped automatically.\n\n## Other Features\n\n###### String Interpolation\n\nWhen setting the `interpolate` parameter in any `Configuration` instance, the library will perform a string interpolation step using the [str.format](https://docs.python.org/3/library/string.html#formatstrings) syntax.  In particular, this allows to format configuration values automatically:\n\n```python\ncfg = config_from_dict({\n    \"percentage\": \"{val:.3%}\",\n    \"with_sign\": \"{val:+f}\",\n    \"val\": 1.23456,\n    }, interpolate=True)\n\nassert cfg.val == 1.23456\nassert cfg.with_sign == \"+1.234560\"\nassert cfg.percentage == \"123.456%\"\n```\n\n###### Validation\n\nValidation relies on the [jsonchema](https://github.com/python-jsonschema/jsonschema) library, which is automatically installed using the extra `validation`. To use it, call the `validate` method on any `Configuration` instance in a manner similar to what is described on the `jsonschema` library:\n\n```python\nschema = {\n    \"type\" : \"object\",\n    \"properties\" : {\n        \"price\" : {\"type\" : \"number\"},\n        \"name\" : {\"type\" : \"string\"},\n    },\n}\n\ncfg = config_from_dict({\"name\" : \"Eggs\", \"price\" : 34.99})\nassert cfg.validate(schema)\n\ncfg = config_from_dict({\"name\" : \"Eggs\", \"price\" : \"Invalid\"})\nassert not cfg.validate(schema)\n\n# pass the `raise_on_error` parameter to get the traceback of validation failures\ncfg.validate(schema, raise_on_error=True)\n# ValidationError: 'Invalid' is not of type 'number'\n```\n\nTo use the [format](https://python-jsonschema.readthedocs.io/en/latest/validate/#validating-formats) feature of the `jsonschema` library, the extra dependencies must be installed separately as explained in the documentation of `jsonschema`.   \n\n```python\nfrom jsonschema import Draft202012Validator\n\nschema = {\n    \"type\" : \"object\",\n    \"properties\" : {\n        \"ip\" : {\"format\" : \"ipv4\"},\n    },\n}\n\ncfg = config_from_dict({\"ip\": \"10.0.0.1\"})\nassert cfg.validate(schema, format_checker=Draft202012Validator.FORMAT_CHECKER)\n\ncfg = config_from_dict({\"ip\": \"10\"})\nassert not cfg.validate(schema, format_checker=Draft202012Validator.FORMAT_CHECKER)\n\n# with the `raise_on_error` parameter:\nc.validate(schema, raise_on_error=True, format_checker=Draft202012Validator.FORMAT_CHECKER)\n# ValidationError: '10' is not a 'ipv4'\n```\n\n\n## Extras\n\nThe `config.contrib` package contains extra implementations of the `Configuration` class used for special cases. Currently the following are implemented:\n\n* `AzureKeyVaultConfiguration` in `config.contrib.azure`, which takes Azure Key Vault\n  credentials into a `Configuration`-compatible instance. To install the needed dependencies\n  execute\n\n  ```shell\n  pip install python-configuration[azure]\n  ```\n\n* `AWSSecretsManagerConfiguration` in `config.contrib.aws`, which takes AWS Secrets Manager\n  credentials into a `Configuration`-compatible instance. To install the needed dependencies\n  execute\n\n  ```shell\n  pip install python-configuration[aws]\n  ```\n\n* `GCPSecretManagerConfiguration` in `config.contrib.gcp`, which takes GCP Secret Manager\n  credentials into a `Configuration`-compatible instance. To install the needed dependencies\n  execute\n\n  ```shell\n  pip install python-configuration[gcp]\n  ```\n\n* `HashicorpVaultConfiguration` in `config.contrib.vault`, which takes Hashicorp Vault\n  credentials into a `Configuration`-compatible instance. To install the needed dependencies\n  execute\n\n  ```shell\n  pip install python-configuration[vault]\n  ```\n\n## Features\n\n* Load multiple configuration types\n* Hierarchical configuration\n* Ability to override with environment variables\n* Merge parameters from different configuration types\n\n## Contributing\n\nIf you'd like to contribute, please fork the repository and use a feature branch. Pull requests are welcome.\n\nSee [`CONTRIBUTING.md`](CONTRIBUTING.md) for the details.\n\n## Links\n\n- Repository: https://github.com/tr11/python-configuration\n- Issue tracker: https://github.com/tr11/python-configuration/issues\n- Documentation: https://python-configuration.readthedocs.io\n\n## Licensing\n\nThe code in this project is licensed under MIT license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftr11%2Fpython-configuration","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftr11%2Fpython-configuration","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftr11%2Fpython-configuration/lists"}