Name | toomanyconfigs JSON |
Version |
0.2.86
JSON |
| download |
home_page | None |
Summary | None |
upload_time | 2025-08-13 00:30:28 |
maintainer | None |
docs_url | None |
author | Miles Copeland Luce |
requires_python | <4.0,>=3.13 |
license | None |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# TooManyConfigs
A simple Python library for TOML-based configuration with interactive setup and clipboard integration.
## Installation
```bash
pip install toomanyconfigs
```
## Basic Usage
```python
from toomanyconfigs import TOMLConfig
class Test(TOMLConfig):
foo: str = None # Each field that should prompt user input should be 'None'
if __name__ == "__main__":
Test.create() # Without specifying a path, TOMLConfig will automatically make a .toml in your cwd with the name of your inheriting class.
```
Output:
```
WARNING | toomanyconfigs.core:create:164 - [TooManyConfigs]: Config file not found, creating new one
INFO | toomanyconfigs.core:create:182 - [Test]: Missing fields detected: ['foo']
[Test]: Enter value for 'foo' (or press Enter to paste from clipboard): bar
SUCCESS | toomanyconfigs.core:_prompt_field:226 - [Test]: Set foo
```
## Advanced Usage
```python
from toomanyconfigs import TOMLConfig
from loguru import logger as log
class Test2(TOMLConfig):
foo: str = None
bar: int = 33 # We'll set bar at 33 to demonstrate the translation ease between dynamic python objects and .toml
if __name__ == "__main__":
t = Test2.create() # initialize a dataclass from a .toml
log.debug(t.bar) # view t.bar
t.bar = 34 # override python memory
log.debug(t.bar) # view updated t.bar
t.write() # write to the specified .toml file
data = t.read() # ensure overwriting
log.debug(data)
```
Output:
```
#Example STDOUT
# WARNING | toomanyconfigs.core:create:191 - [TooManyConfigs]: Config file not found at C:\Users\foobar\PycharmProjects\TooManyConfigs\src\test2.toml, creating new one
# INFO | toomanyconfigs.core:create:209 - Test2: Missing fields detected: ['foo']
# [Test2]: Enter value for 'foo' (or press Enter to paste from clipboard): bar
# SUCCESS | toomanyconfigs.core:_prompt_field:258 - [Test2]: Set foo
# DEBUG | __main__:<module>:31 - 33
# DEBUG | __main__:<module>:33 - 34
# DEBUG | toomanyconfigs.core:write:273 - [TooManyConfigs]: Writing config to C:\Users\foobar\PycharmProjects\TooManyConfigs\src\test2.toml
# DEBUG | toomanyconfigs.core:read:280 - [TooManyConfigs]: Reading config from C:\Users\foobar\PycharmProjects\TooManyConfigs\src\test2.toml
# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'foo' from file!
# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'bar' from file!
# DEBUG | __main__:<module>:36 - {'foo': 'bar', 'bar': 34}
# WARNING | toomanyconfigs.core:create:191 - [TooManyConfigs]: Config file not found at C:\Users\foobar\PycharmProjects\TooManyConfigs\src\test2.toml, creating new one
# DEBUG | __main__:<module>:47 - 99
# DEBUG | toomanyconfigs.core:read:280 - [TooManyConfigs]: Reading config from C:\Users\foobar\PycharmProjects\TooManyConfigs\src\test2.toml
# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'foo' from file!
# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'bar' from file!
# DEBUG | __main__:<module>:49 - {'foo': 'resurrected_bar', 'bar': 99}
```
## Subconfigs
```python
from toomanyconfigs import TOMLConfig, TOMLSubConfig
from loguru import logger as log
class Test4(TOMLSubConfig):
foo: str = None
class Test3(TOMLConfig):
key: str = "val"
sub_config: Test4
if __name__ == "__main__":
t = Test3.create()
log.debug(t.__dict__)
```
Output:
```
WARNING | toomanyconfigs.core:create:164 - [TooManyConfigs]: Config file not found, creating new one
INFO | toomanyconfigs.core:create:182 - [Test3]: Missing fields detected: ['sub_config']
DEBUG | toomanyconfigs.core:create:39 - [TooManyConfigs]: Building subconfig named 'test4'
INFO | toomanyconfigs.core:create:57 - [Test4]: Missing fields detected: ['foo']
[Test4]: Enter value for 'foo' (or press Enter to paste from clipboard): bar
SUCCESS | toomanyconfigs.core:_prompt_field:73 - [Test4]: Set foo
SUCCESS | toomanyconfigs.core:create:190 - [Test3]: Created Test4 for sub_config
```
## API Configurations
### Basic API Usage
```python
import asyncio
from toomanyconfigs import API
from loguru import logger as log
if __name__ == "__main__":
obj = API()
response = asyncio.run(obj.api_request("get"))
log.debug(response)
```
Output:
```
WARNING | toomanyconfigs.core:create:179 - [TooManyConfigs]: Config file not found, creating new one
INFO | toomanyconfigs.core:create:197 - APIConfig: Missing fields detected: ['headers', 'routes', 'vars']
DEBUG | toomanyconfigs.core:create:41 - [TooManyConfigs]: Building subconfig named 'headersconfig'
SUCCESS | toomanyconfigs.core:create:205 - APIConfig: Created HeadersConfig for headers
INFO | toomanyconfigs.core:create:59 - RoutesConfig: Missing fields detected: ['base', 'shortcuts']
[RoutesConfig]: Enter value for 'base' (or press Enter to paste from clipboard): http://example.com
SUCCESS | toomanyconfigs.core:_prompt_field:84 - [RoutesConfig]: Set base
SUCCESS | toomanyconfigs.core:create:68 - RoutesConfig: Created Shortcuts for shortcuts
DEBUG | toomanyconfigs.api:api_request:146 - Attempting request to API: method=get, path=http://example.com
```
Generated TOML:
```toml
[headers]
authorization = "Bearer ${API_KEY}"
accept = "application/json"
[routes]
base = "http://example.com"
[vars]
[routes.shortcuts]
```
### Advanced API Usage
```python
import asyncio
from dataclasses import field
from pathlib import Path
from toomanyconfigs import API, APIConfig, HeadersConfig, RoutesConfig, VarsConfig, Shortcuts
from loguru import logger as log
if __name__ == "__main__":
src = (Path.cwd() / "json_api.toml")
src.touch(exist_ok=True)
base_url = 'https://jsonplaceholder.typicode.com/'
quick_routes = {
"c": "/comments?postId=1"
}
routes = RoutesConfig(
base=base_url,
shortcuts=Shortcuts.create(_source=src, **quick_routes)
)
class JSONVars(VarsConfig):
api_key: str = None
json_vars = JSONVars.create(
source=src,
name="vars"
)
cfg = APIConfig.create(_source=src, routes=routes, vars=json_vars)
json_placeholder = API(cfg)
log.debug(json_placeholder.config.__dict__)
response = asyncio.run(json_placeholder.api_get("c"))
log.debug(response)
```
Output:
```
DEBUG | toomanyconfigs.core:create:41 - [TooManyConfigs]: Building subconfig named 'shortcuts'
DEBUG | toomanyconfigs.core:create:41 - [TooManyConfigs]: Building subconfig named 'vars'
INFO | toomanyconfigs.core:create:59 - JSONVars: Missing fields detected: ['api_key']
[JSONVars]: Enter value for 'api_key' (or press Enter to paste from clipboard): ****
SUCCESS | toomanyconfigs.core:_prompt_field:84 - [JSONVars]: Set api_key
DEBUG | toomanyconfigs.core:create:153 - [TooManyConfigs]: Building config from json_api.toml
INFO | toomanyconfigs.core:create:197 - APIConfig: Missing fields detected: ['headers']
SUCCESS | toomanyconfigs.core:create:205 - APIConfig: Created HeadersConfig for headers
DEBUG | toomanyconfigs.api:api_request:146 - Attempting request to API: method=get, path=https://jsonplaceholder.typicode.com//comments?postId=1
DEBUG | __main__:<module>:151 - Response(status=200, method='get', body=[...])
```
Generated TOML:
```toml
[routes]
base = "https://jsonplaceholder.typicode.com/"
[vars]
api_key = "****"
[headers]
authorization = "Bearer ${API_KEY}"
accept = "application/json"
[routes.shortcuts]
c = "/comments?postId=1"
```
Raw data
{
"_id": null,
"home_page": null,
"name": "toomanyconfigs",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.13",
"maintainer_email": null,
"keywords": null,
"author": "Miles Copeland Luce",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/08/fc/2b827f040c8f498152ec81e024ffe5011fd59194d2a9cb165d83cc1a3d15/toomanyconfigs-0.2.86.tar.gz",
"platform": null,
"description": "# TooManyConfigs\n\nA simple Python library for TOML-based configuration with interactive setup and clipboard integration.\n\n## Installation\n\n```bash\npip install toomanyconfigs\n```\n\n## Basic Usage\n\n```python\nfrom toomanyconfigs import TOMLConfig\n\nclass Test(TOMLConfig):\n foo: str = None # Each field that should prompt user input should be 'None'\n\nif __name__ == \"__main__\":\n Test.create() # Without specifying a path, TOMLConfig will automatically make a .toml in your cwd with the name of your inheriting class.\n```\n\nOutput:\n```\nWARNING | toomanyconfigs.core:create:164 - [TooManyConfigs]: Config file not found, creating new one\nINFO | toomanyconfigs.core:create:182 - [Test]: Missing fields detected: ['foo']\n[Test]: Enter value for 'foo' (or press Enter to paste from clipboard): bar\nSUCCESS | toomanyconfigs.core:_prompt_field:226 - [Test]: Set foo\n```\n\n## Advanced Usage\n\n```python\nfrom toomanyconfigs import TOMLConfig\nfrom loguru import logger as log\n\nclass Test2(TOMLConfig):\n foo: str = None\n bar: int = 33 # We'll set bar at 33 to demonstrate the translation ease between dynamic python objects and .toml\n\nif __name__ == \"__main__\":\n t = Test2.create() # initialize a dataclass from a .toml\n log.debug(t.bar) # view t.bar\n t.bar = 34 # override python memory\n log.debug(t.bar) # view updated t.bar\n t.write() # write to the specified .toml file\n data = t.read() # ensure overwriting\n log.debug(data)\n```\n\nOutput:\n```\n#Example STDOUT\n# WARNING | toomanyconfigs.core:create:191 - [TooManyConfigs]: Config file not found at C:\\Users\\foobar\\PycharmProjects\\TooManyConfigs\\src\\test2.toml, creating new one\n# INFO | toomanyconfigs.core:create:209 - Test2: Missing fields detected: ['foo']\n# [Test2]: Enter value for 'foo' (or press Enter to paste from clipboard): bar\n# SUCCESS | toomanyconfigs.core:_prompt_field:258 - [Test2]: Set foo\n# DEBUG | __main__:<module>:31 - 33\n# DEBUG | __main__:<module>:33 - 34\n# DEBUG | toomanyconfigs.core:write:273 - [TooManyConfigs]: Writing config to C:\\Users\\foobar\\PycharmProjects\\TooManyConfigs\\src\\test2.toml\n# DEBUG | toomanyconfigs.core:read:280 - [TooManyConfigs]: Reading config from C:\\Users\\foobar\\PycharmProjects\\TooManyConfigs\\src\\test2.toml\n# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'foo' from file!\n# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'bar' from file!\n# DEBUG | __main__:<module>:36 - {'foo': 'bar', 'bar': 34}\n# WARNING | toomanyconfigs.core:create:191 - [TooManyConfigs]: Config file not found at C:\\Users\\foobar\\PycharmProjects\\TooManyConfigs\\src\\test2.toml, creating new one\n# DEBUG | __main__:<module>:47 - 99\n# DEBUG | toomanyconfigs.core:read:280 - [TooManyConfigs]: Reading config from C:\\Users\\foobar\\PycharmProjects\\TooManyConfigs\\src\\test2.toml\n# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'foo' from file!\n# DEBUG | toomanyconfigs.core:read:295 - [Test2]: Overrode 'bar' from file!\n# DEBUG | __main__:<module>:49 - {'foo': 'resurrected_bar', 'bar': 99}\n```\n\n## Subconfigs\n\n```python\nfrom toomanyconfigs import TOMLConfig, TOMLSubConfig\nfrom loguru import logger as log\n\nclass Test4(TOMLSubConfig):\n foo: str = None\n\nclass Test3(TOMLConfig):\n key: str = \"val\"\n sub_config: Test4\n\nif __name__ == \"__main__\":\n t = Test3.create()\n log.debug(t.__dict__)\n```\n\nOutput:\n```\nWARNING | toomanyconfigs.core:create:164 - [TooManyConfigs]: Config file not found, creating new one\nINFO | toomanyconfigs.core:create:182 - [Test3]: Missing fields detected: ['sub_config']\nDEBUG | toomanyconfigs.core:create:39 - [TooManyConfigs]: Building subconfig named 'test4'\nINFO | toomanyconfigs.core:create:57 - [Test4]: Missing fields detected: ['foo']\n[Test4]: Enter value for 'foo' (or press Enter to paste from clipboard): bar\nSUCCESS | toomanyconfigs.core:_prompt_field:73 - [Test4]: Set foo\nSUCCESS | toomanyconfigs.core:create:190 - [Test3]: Created Test4 for sub_config\n```\n\n## API Configurations\n\n### Basic API Usage\n\n```python\nimport asyncio\nfrom toomanyconfigs import API\nfrom loguru import logger as log\n\nif __name__ == \"__main__\":\n obj = API()\n response = asyncio.run(obj.api_request(\"get\"))\n log.debug(response)\n```\n\nOutput:\n```\nWARNING | toomanyconfigs.core:create:179 - [TooManyConfigs]: Config file not found, creating new one\nINFO | toomanyconfigs.core:create:197 - APIConfig: Missing fields detected: ['headers', 'routes', 'vars']\nDEBUG | toomanyconfigs.core:create:41 - [TooManyConfigs]: Building subconfig named 'headersconfig'\nSUCCESS | toomanyconfigs.core:create:205 - APIConfig: Created HeadersConfig for headers\nINFO | toomanyconfigs.core:create:59 - RoutesConfig: Missing fields detected: ['base', 'shortcuts']\n[RoutesConfig]: Enter value for 'base' (or press Enter to paste from clipboard): http://example.com\nSUCCESS | toomanyconfigs.core:_prompt_field:84 - [RoutesConfig]: Set base\nSUCCESS | toomanyconfigs.core:create:68 - RoutesConfig: Created Shortcuts for shortcuts\nDEBUG | toomanyconfigs.api:api_request:146 - Attempting request to API: method=get, path=http://example.com\n```\n\nGenerated TOML:\n```toml\n[headers]\nauthorization = \"Bearer ${API_KEY}\"\naccept = \"application/json\"\n\n[routes]\nbase = \"http://example.com\"\n\n[vars]\n\n[routes.shortcuts]\n```\n\n### Advanced API Usage\n\n```python\nimport asyncio\nfrom dataclasses import field\nfrom pathlib import Path\nfrom toomanyconfigs import API, APIConfig, HeadersConfig, RoutesConfig, VarsConfig, Shortcuts\nfrom loguru import logger as log\n\nif __name__ == \"__main__\":\n src = (Path.cwd() / \"json_api.toml\")\n src.touch(exist_ok=True)\n\n base_url = 'https://jsonplaceholder.typicode.com/'\n quick_routes = {\n \"c\": \"/comments?postId=1\"\n }\n routes = RoutesConfig(\n base=base_url,\n shortcuts=Shortcuts.create(_source=src, **quick_routes)\n )\n\n\n class JSONVars(VarsConfig):\n api_key: str = None\n\n\n json_vars = JSONVars.create(\n source=src,\n name=\"vars\"\n )\n\n cfg = APIConfig.create(_source=src, routes=routes, vars=json_vars)\n json_placeholder = API(cfg)\n log.debug(json_placeholder.config.__dict__)\n response = asyncio.run(json_placeholder.api_get(\"c\"))\n log.debug(response)\n```\n\nOutput:\n```\nDEBUG | toomanyconfigs.core:create:41 - [TooManyConfigs]: Building subconfig named 'shortcuts'\nDEBUG | toomanyconfigs.core:create:41 - [TooManyConfigs]: Building subconfig named 'vars'\nINFO | toomanyconfigs.core:create:59 - JSONVars: Missing fields detected: ['api_key']\n[JSONVars]: Enter value for 'api_key' (or press Enter to paste from clipboard): ****\nSUCCESS | toomanyconfigs.core:_prompt_field:84 - [JSONVars]: Set api_key\nDEBUG | toomanyconfigs.core:create:153 - [TooManyConfigs]: Building config from json_api.toml\nINFO | toomanyconfigs.core:create:197 - APIConfig: Missing fields detected: ['headers']\nSUCCESS | toomanyconfigs.core:create:205 - APIConfig: Created HeadersConfig for headers\nDEBUG | toomanyconfigs.api:api_request:146 - Attempting request to API: method=get, path=https://jsonplaceholder.typicode.com//comments?postId=1\nDEBUG | __main__:<module>:151 - Response(status=200, method='get', body=[...])\n```\n\nGenerated TOML:\n```toml\n[routes]\nbase = \"https://jsonplaceholder.typicode.com/\"\n\n[vars]\napi_key = \"****\"\n\n[headers]\nauthorization = \"Bearer ${API_KEY}\"\naccept = \"application/json\"\n\n[routes.shortcuts]\nc = \"/comments?postId=1\"\n```",
"bugtrack_url": null,
"license": null,
"summary": null,
"version": "0.2.86",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "d974d763a8f9afb344677319618147467990e1ae20374416e4921c40b176ad4a",
"md5": "a2fa93153fe8f8aab329eb2e3aff1928",
"sha256": "b228ead9b3c7a7cc933cfc04fb2b622bc5e0f36f207a8e9cd350a99aea49dce6"
},
"downloads": -1,
"filename": "toomanyconfigs-0.2.86-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a2fa93153fe8f8aab329eb2e3aff1928",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.13",
"size": 11637,
"upload_time": "2025-08-13T00:30:27",
"upload_time_iso_8601": "2025-08-13T00:30:27.147698Z",
"url": "https://files.pythonhosted.org/packages/d9/74/d763a8f9afb344677319618147467990e1ae20374416e4921c40b176ad4a/toomanyconfigs-0.2.86-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "08fc2b827f040c8f498152ec81e024ffe5011fd59194d2a9cb165d83cc1a3d15",
"md5": "8ac639649630020124cc323ef50f2578",
"sha256": "820999f58daf2d145c7465c69360533a7fdbf675f9eafc37fb050608357f9d82"
},
"downloads": -1,
"filename": "toomanyconfigs-0.2.86.tar.gz",
"has_sig": false,
"md5_digest": "8ac639649630020124cc323ef50f2578",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.13",
"size": 11378,
"upload_time": "2025-08-13T00:30:28",
"upload_time_iso_8601": "2025-08-13T00:30:28.697330Z",
"url": "https://files.pythonhosted.org/packages/08/fc/2b827f040c8f498152ec81e024ffe5011fd59194d2a9cb165d83cc1a3d15/toomanyconfigs-0.2.86.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-13 00:30:28",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "toomanyconfigs"
}