Skip to main content

gConfigs - Configuration helper for Python applications.

Project description

gConfigs

Configuration helper for Python applications.

gConfigs provides a unified API to read configuration values from different sources:

  • Environment variables
  • Dotenv files
  • Local mounted files in a directory
  • Individual local files

Why another config library?

I made it for myself. That's it.

Installation

Python 3.10+

pip install gconfigs

or with uv:

uv add gconfigs

Or even better. It's small enough, avoid the dependency entirely, and copy gconfigs/ into your project.

Extra effort to convince you to avoid dependencies: maybe all you need is just os.environ.

Quick Start

import gconfigs

# 1) Environment variables
envs = gconfigs.envs()
debug = envs.as_bool("DEBUG", default=False)
home = envs("HOME", default="/")

# 2) Mounted directory (for configs or secrets)
configs = gconfigs.local_files("/run/configs")
language_code = configs("LANGUAGE_CODE", default="en-us")

# 3) Single local file
secrets = gconfigs.local_file()
db_password = secrets("/run/secrets/DB_PASSWORD")

# 4) Dotenv file
dotenvs = gconfigs.dotenvs(".env")
project_name = dotenvs("PROJECT_NAME", default="my-app")

API Overview

The package exposes four factory functions:

  • gconfigs.envs() -> reads from process environment variables
  • gconfigs.dotenvs(filepath=".env") -> reads from dotenv files
  • gconfigs.local_files(path="/run/configs", pattern="*") -> reads from files in a directory
  • gconfigs.local_file() -> reads from a single file path provided at call time

Each factory returns a GConfigs instance.

Usage

Environment Variables

import gconfigs

envs = gconfigs.envs()

home = envs("HOME")
workers = int(envs("WORKERS", default="2"))
debug = envs.as_bool("DEBUG", default=False)

Dotenv Files

import gconfigs

dotenvs = gconfigs.dotenvs("./config/.env")
dsn = dotenvs("DATABASE_DSN")

# load another dotenv file with a different GConfigs instance
other = gconfigs.dotenvs("./config/another.env")

Dotenv parser behavior:

  • Ignores lines starting with #, ;, and [section]
  • Ignores lines without =
  • Splits at the first = so values can contain =
  • Strips key whitespace
  • Preserves value whitespace (except trailing newline characters)
  • Last duplicated key wins

Local Mounted Files (Directory)

import gconfigs

configs = gconfigs.local_files("/run/configs")
secrets = gconfigs.local_files("/run/secrets")

api_url = configs("API_URL")
api_key = secrets("API_KEY")

How it works:

  • File name is the config key
  • File content is the config value
  • Optional pattern argument filters which files are considered
only_app = gconfigs.local_files("/run/configs", pattern="APP_*")

Single Local File

import gconfigs

secrets = gconfigs.local_file()
token = secrets("/run/secrets/SERVICE_TOKEN")

Common Patterns

Default Value

port = envs("PORT", default="8000")

Fallback Key with use_instead

host = envs("SERVICE_HOST", use_instead="HOST", default="127.0.0.1")

Strip Control

By default, returned string values are stripped.

value = envs("MY_KEY")  # strip=True by default
raw_value = envs("MY_KEY", strip=False)

Type Casting

GConfigs provides strict casting helpers.

as_bool

  • Accepts native bool values
  • Accepts strings "true" and "false" (case-insensitive)
  • Raises ValueError for other values
debug = envs.as_bool("DEBUG", default=False)

as_list

  • Accepts native list and tuple values
  • Accepts JSON-style list strings like "[1, 2, 3]"
  • Raises ValueError otherwise
hosts = envs.as_list("ALLOWED_HOSTS")

as_dict

  • Accepts native dict values
  • Accepts JSON-style object strings like "{"workers": 2}"
  • Raises ValueError otherwise
options = envs.as_dict("APP_OPTIONS")

Iteration and Utilities

GConfigs implements container and iterator protocols.

import gconfigs

envs = gconfigs.envs()

if "HOME" in envs:
    print("HOME exists")

print(len(envs))

for item in envs:
    print(item.key, item.value)

print(envs.json())

Notes:

  • Iteration yields namedtuples with key and value fields
  • Use .iterator() when you need a fresh independent iterator

Error Behavior

Typical exceptions you may see:

  • KeyError for missing environment variable or missing dotenv key
  • FileNotFoundError for missing paths/files in file backends
  • PermissionError for unreadable files in local_file backend
  • ValueError for invalid cast values

Use default=... to avoid exceptions for missing keys when appropriate.

Custom Backend

You can plug your own backend into GConfigs.

Required backend methods:

  • get(key: str)
  • keys()

Example:

from gconfigs.gconfigs import GConfigs


class DictBackend:
    def __init__(self):
        self.data = {"NAME": "my-app", "DEBUG": "false"}

    def additional_method(self):
        return "This is an additional method in the backend class."

    def keys(self):
        return self.data.keys()

    def get(self, key):
        if key not in self.data:
            raise KeyError(f"{key} not set")
        return self.data[key]


configs = GConfigs(backend=DictBackend)
name = configs("NAME")
debug = configs.as_bool("DEBUG")

# You can access the backend instance directly from GConfigs instance
assert configs.backend.additional_method

License

MIT. See LICENSE-MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gconfigs-1.1.0.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gconfigs-1.1.0-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file gconfigs-1.1.0.tar.gz.

File metadata

  • Download URL: gconfigs-1.1.0.tar.gz
  • Upload date:
  • Size: 7.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for gconfigs-1.1.0.tar.gz
Algorithm Hash digest
SHA256 3cd87d452b9ce155d7cb4dabd1d7858b16fe7f44c15de9696faa4001bf16570f
MD5 56d65d5ed4319d6c10e8feed4480a728
BLAKE2b-256 e97259b0909ccdd0b9cf6bb1c880bd3866c7bfd7942cdc9bc68b88d9f3235d3f

See more details on using hashes here.

File details

Details for the file gconfigs-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: gconfigs-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for gconfigs-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8313f97fc2487e9578da135c93b92166c0fdf8b21c54a1f0564cb860869f5abc
MD5 842d526a01fb7ad32440443f0133b534
BLAKE2b-256 856958db3acb2c54d0fe043e48c087dfdd68d7d7f46ff68abd2f15382633d256

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page