toomanyconfigs


Nametoomanyconfigs JSON
Version 0.2.86 PyPI version JSON
download
home_pageNone
SummaryNone
upload_time2025-08-13 00:30:28
maintainerNone
docs_urlNone
authorMiles Copeland Luce
requires_python<4.0,>=3.13
licenseNone
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"
}
        
Elapsed time: 0.41381s