{"id":20466024,"url":"https://github.com/withprecedent/bobbie","last_synced_at":"2026-02-22T18:36:25.465Z","repository":{"id":60722975,"uuid":"415715000","full_name":"WithPrecedent/bobbie","owner":"WithPrecedent","description":"Flexible, easy configuration for Python projects","archived":false,"fork":false,"pushed_at":"2025-02-07T18:57:14.000Z","size":1011,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-08T06:46:12.458Z","etag":null,"topics":["configuration","settings"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WithPrecedent.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2021-10-10T22:31:27.000Z","updated_at":"2025-02-07T18:56:19.000Z","dependencies_parsed_at":"2025-01-25T23:35:21.304Z","dependency_job_id":"1e6cd8ba-5f10-426d-ac80-4db5ce2c3d16","html_url":"https://github.com/WithPrecedent/bobbie","commit_stats":{"total_commits":18,"total_committers":2,"mean_commits":9.0,"dds":0.05555555555555558,"last_synced_commit":"277f35ed03f00f63d17750b5aedfd299f4dbe27f"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fbobbie","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fbobbie/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fbobbie/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fbobbie/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WithPrecedent","download_url":"https://codeload.github.com/WithPrecedent/bobbie/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244728200,"owners_count":20500023,"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","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","settings"],"created_at":"2024-11-15T13:21:07.568Z","updated_at":"2026-02-22T18:36:24.798Z","avatar_url":"https://github.com/WithPrecedent.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bobbie\n\n| | |\n| --- | --- |\n| Version | [![PyPI Latest Release](https://img.shields.io/pypi/v/bobbie.svg?style=for-the-badge\u0026color=steelblue\u0026label=PyPI\u0026logo=PyPI\u0026logoColor=yellow)](https://pypi.org/project/bobbie/) [![GitHub Latest Release](https://img.shields.io/github/v/tag/WithPrecedent/bobbie?style=for-the-badge\u0026color=navy\u0026label=GitHub\u0026logo=github)](https://github.com/WithPrecedent/bobbie/releases)\n| Status | [![Build Status](https://img.shields.io/github/actions/workflow/status/WithPrecedent/bobbie/ci.yml?branch=main\u0026style=for-the-badge\u0026color=cadetblue\u0026label=Tests\u0026logo=pytest)](https://github.com/WithPrecedent/bobbie/actions/workflows/ci.yml?query=branch%3Amain) [![Development Status](https://img.shields.io/badge/Development-Active-seagreen?style=for-the-badge\u0026logo=git)](https://www.repostatus.org/#active) [![Project Stability](https://img.shields.io/pypi/status/bobbie?style=for-the-badge\u0026logo=pypi\u0026label=Stability\u0026logoColor=yellow)](https://pypi.org/project/bobbie/)\n| Documentation | [![Hosted By](https://img.shields.io/badge/Hosted_by-Github_Pages-blue?style=for-the-badge\u0026color=navy\u0026logo=github)](https://WithPrecedent.github.io/bobbie)\n| Tools | [![Documentation](https://img.shields.io/badge/MkDocs-magenta?style=for-the-badge\u0026color=deepskyblue\u0026logo=markdown\u0026labelColor=gray)](https://squidfunk.github.io/mkdocs-material/) [![Linter](https://img.shields.io/endpoint?style=for-the-badge\u0026url=https://raw.githubusercontent.com/charliermarsh/Ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/Ruff) [![Dependency Manager](https://img.shields.io/badge/PDM-mediumpurple?style=for-the-badge\u0026logo=affinity\u0026labelColor=gray)](https://PDM.fming.dev) [![Pre-commit](https://img.shields.io/badge/pre--commit-darkolivegreen?style=for-the-badge\u0026logo=pre-commit\u0026logoColor=white\u0026labelColor=gray)](https://github.com/TezRomacH/python-package-template/blob/master/.pre-commit-config.yaml) [![CI](https://img.shields.io/badge/GitHub_Actions-navy?style=for-the-badge\u0026logo=githubactions\u0026labelColor=gray\u0026logoColor=white)](https://github.com/features/actions) [![Editor Settings](https://img.shields.io/badge/Editor_Config-paleturquoise?style=for-the-badge\u0026logo=editorconfig\u0026labelColor=gray)](https://editorconfig.org/) [![Repository Template](https://img.shields.io/badge/snickerdoodle-bisque?style=for-the-badge\u0026logo=cookiecutter\u0026labelColor=gray)](https://www.github.com/WithPrecedent/bobbie) [![Dependency Maintainer](https://img.shields.io/badge/dependabot-navy?style=for-the-badge\u0026logo=dependabot\u0026logoColor=white\u0026labelColor=gray)](https://github.com/dependabot)\n| Compatibility | [![Compatible Python Versions](https://img.shields.io/pypi/pyversions/bobbie?style=for-the-badge\u0026color=steelblue\u0026label=Python\u0026logo=python\u0026logoColor=yellow)](https://pypi.python.org/pypi/bobbie/) [![Linux](https://img.shields.io/badge/Linux-lightseagreen?style=for-the-badge\u0026logo=linux\u0026labelColor=gray\u0026logoColor=white)](https://www.linux.org/) [![MacOS](https://img.shields.io/badge/MacOS-snow?style=for-the-badge\u0026logo=apple\u0026labelColor=gray)](https://www.apple.com/macos/) [![Windows](https://img.shields.io/badge/windows-blue?style=for-the-badge\u0026logo=Windows\u0026labelColor=gray\u0026color=orangered)](https://www.microsoft.com/en-us/windows?r=1)\n| Stats | [![PyPI Download Rate (per month)](https://img.shields.io/pypi/dm/bobbie?style=for-the-badge\u0026color=steelblue\u0026label=Downloads%20💾\u0026logo=pypi\u0026logoColor=yellow)](https://pypi.org/project/bobbie) [![GitHub Stars](https://img.shields.io/github/stars/WithPrecedent/bobbie?style=for-the-badge\u0026color=navy\u0026label=Stars%20⭐\u0026logo=github)](https://github.com/WithPrecedent/bobbie/stargazers) [![GitHub Contributors](https://img.shields.io/github/contributors/WithPrecedent/bobbie?style=for-the-badge\u0026color=navy\u0026label=Contributors%20🙋\u0026logo=github)](https://github.com/WithPrecedent/bobbie/graphs/contributors) [![GitHub Issues](https://img.shields.io/github/issues/WithPrecedent/bobbie?style=for-the-badge\u0026color=navy\u0026label=Issues%20📘\u0026logo=github)](https://github.com/WithPrecedent/bobbie/graphs/contributors) [![GitHub Forks](https://img.shields.io/github/forks/WithPrecedent/bobbie?style=for-the-badge\u0026color=navy\u0026label=Forks%20🍴\u0026logo=github)](https://github.com/WithPrecedent/bobbie/forks)\n| | |\n\n-----\n\n## What is bobbie?\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://media.giphy.com/media/53wQ8r97DCk2gAalDq/giphy.gif\" alt=\"It's better to know what you want and who you are\" style=\"width:400px;\"/\u003e\n\u003c/p\u003e\n\n`bobbie` provides\na lightweight, easy-to-use, flexible, and extensible `Settings` class for loading and\nstoring configuration settings for a Python project.\n\n## Why use bobbie?\n\nThere are [numerous options](#similar-projects) for storing project configuration settings in Python.\nSo, what makes `bobbie` different?\n\n* **Flexible**: a `Settings` instance is easily built from a `dict`, Python module, or file.\n* **Lightweight**: an efficient codebase ensures a very small memory footprint.\n* **Intuitive**: a `create` class method constructs `Settings` (from any data source).\n* **Convenient**: unlike `configparser`, automatic data and type validation is performed when\n  `Settings` is created.\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://media.giphy.com/media/ErQfoFJN1YNQroZUcL/giphy.gif\" alt=\"This could be a really big deal\" style=\"width:300px;\"/\u003e\n\u003c/p\u003e\n\nThe [comparison table](#feature-comparison-of-python-configuration-libraries)\nbelow shows how `bobbie` compares to the other major options that store\nconfiguration options for Python projects.\n\n## Getting started\n\n### Installation\n\nTo install `bobbie`, use `pip`:\n\n```sh\npip install bobbie\n```\n\n### Create a Settings instance\n\n`bobbie` supports several ways to create a `Settings` instance. However, you can\nopt to always use the `create` class method for any data source.\n\n#### From `dict`\n\n```python\nimport bobbie\n\nconfiguration = {\n  'general': {\n    'verbose': False,\n    'seed': 43,\n    'parallelize': False},\n  'files': {\n    'source_format': 'csv',\n    'file_encoding': 'windows-1252',\n    'float_format': '%.4f',\n    'export_results': True}}\n# You may use the general `create` method.\nsettings = bobbie.Settings.create(configuration)\n# Or, just send a `dict` to `Settings` itself.\nsettings = bobbie.Settings(configuration)\n```\n\n#### From file\n\n```python\nimport bobbie\n\n# You may use the general `create` method.\nsettings = bobbie.Settings.create('settings_file.yaml')\n# Or, the `from_file` method.\nsettings = bobbie.Settings.from_file('settings_file.yaml')\n# Or, the `from_yaml` method. They all do the same thing.\nsettings = bobbie.Settings.from_yaml('settings_file.yaml')\n```\n\nIf the file is a Python module, it must contain a variable named `settings`\n(unless you change the global setting for the variable name).\n\n## Contributing\n\nContributors are always welcome. Feel free to grab an [issue](https://www.github.com/WithPrecedent/bobbie/issues) to work on or make a suggested improvement. If you wish to contribute, please read the [Contribution Guide](https://www.github.com/WithPrecedent/bobbie/contributing.md) and [Code of Conduct](https://www.github.com/WithPrecedent/bobbie/code_of_conduct.md).\n\n## Similar projects\n\nThere are a lot of great packages for storing project settings. The table below\nshows the features of the leading libraries.\n\n### Feature Comparison of Python Configuration Libraries\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://media.giphy.com/media/l0ExlIJRtK1yr345y/giphy.gif\" alt=\"Bobbie Draper destroys a robotic arm in an arm-wrestling match\" style=\"width:300px;\"/\u003e\n\u003c/p\u003e\n\n\n| Library | Typing | Secrets | dict | env | ini | json | py | toml | yaml |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| `bobbie`| ✅ | | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |\n| [`configParser`](https://docs.python.org/3/library/configParser.html) | | | | | ✅ | | | | |\n| [`dynaconf`](https://github.com/dynaconf/dynaconf) | ✅ | ✅ | | ✅ | ✅ | ✅ | | ✅ | ✅ |\n| [`Parser-it`](https://github.com/naorlivne/Parser_it) | ✅ | | | ✅ | ✅ | ✅ | | ✅ | ✅ |\n| [`python-decouple`](https://github.com/HBNetwork/python-decouple) | ✅ | ✅ | | ✅ | ✅ | | | | |\n| [`pyconfig`](https://github.com/shakefu/pyconfig) | | ✅ | | | |  | | |  || |\n| [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) | ✅ | ✅ | | | | | | | | |\n\nAs you can see, `bobbie` lacks a method for storing passwords, encryption keys,\nand other secrets. That is largely because it is focused on internal Python\nprojects and the goal of keeping its resource usage as low as possible. So, if\nyou need secrets stored in your project settings, there are several good options\nlisted above that you should explore.\n\n## Acknowledgments\n\nI would like to thank the University of Kansas School of Law for tolerating and\nsupporting this law professor's coding efforts, an endeavor which is well\noutside the typical scholarly activities in the discipline.\n\n## License\n\nUse of this repository is authorized under the [Apache Software License 2.0](https://www.github.com/WithPrecedent/bobbie/blog/main/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithprecedent%2Fbobbie","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwithprecedent%2Fbobbie","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithprecedent%2Fbobbie/lists"}