Skip to main content

Load config values from 1Password with this module.

Project description

Configator logo depicting a cool gator

A convenient way to load your app configuration from 1Password.

Ruff CI status Quality Gate Status Test Coverage Lines of Code

This project is licensed under the terms of the MIT license.

Quick Start

import asyncio
import os
from configator import load_config
from pydantic import BaseModel

class DatabaseConfig(BaseModel):
    host: str
    port: int
    username: str
    password: str

class AppConfig(BaseModel):
    api_key: str
    debug: bool
    timeout: int

class Config(BaseModel):
    db: DatabaseConfig
    app: AppConfig
    debug: bool = False

async def main():
    token = os.getenv("OP_SERVICE_ACCOUNT_TOKEN")
    cfg: Config = await load_config(
        schema=Config,
        token=token,
        vault="REPO whatever",
        item="whatever-develop",
    )
    assert cfg.db.port == 5432

asyncio.run(main())

Developer Mode

For local development, you can override configuration values using a .env file by setting the CONFIGATOR_DEV_MODE environment variable:

export CONFIGATOR_DEV_MODE=1

When developer mode is enabled, values are loaded with the following priority (highest to lowest):

  1. .env file
  2. Environment variables
  3. 1Password values (via initialization parameters)

Without developer mode, the standard priority applies (1Password values take precedence over environment variables and .env files).

This feature works with the provided common configuration models (PostgresConfig, SentryConfig). For your own config schemas, you can simply extend ConfigatorSettings to get this behavior.

Installation

uv add "git+https://github.com/Utiligize/configator@v3000.0.0"

or, if you like the bleeding edge:

uv add "git+https://github.com/Utiligize/configator"

For information on how to authenticate uv with GitHub, see https://docs.astral.sh/uv/concepts/authentication/git/.

For information on how to use private repos in GitHub Actions, see https://docs.astral.sh/uv/guides/integration/github/#private-repos. If you create a fine-grained access token, it simply needs the "Content" read permission.

Writing Config Classes

Define your app's config as a class deriving from Pydantic's BaseModel. The field names will be matched against the 1Password item field titles, and the values loaded from them. The field names are treated as lower snake case, and item field names in 1Password are converted accordingly when matching. For example, a Python model with a field called sentry_key will match a 1Password item with a field title of SENTRY_KEY or sentry-key. It is therefore important to ensure that field names are unique, at least within sections.

Nested models are loaded from separate sections in the 1Password item. Fields in these nested models can have the same name as fields in other sections. Fields in the base config class are found by name, no matter their section (but the intention is for them to be added without one), so the names of these must be unique in the full model.

Supported Features

  • Basic types (str, int, float, even complex) are simply parsed from the string in 1Password.
  • decimal.Decimal is also supported and should usually be preferred over float.
  • Booleans are special: since any string is truthy in Python, a bool must have one of 8 (case-insensitive) values:
    • "true", "1", "yes", and "on" are interpreted as True.
    • "false", "0", "no", and "off" are interpreted as False.
    • any other value for a field defined as bool will raise a ValueError.
  • Collections (dict, list, set) are loaded by interpreting the string value in 1Password as JSON and passing that object to the constructor. This means that a set can be constructed from what looks like a list, for example.
  • Any string starting with op:// will be resolved recursively (up to a depth of 10 links).

Planned Features

Unsupported Features

  • Typed collections are sadly not supported, because it confuses the issubclass matching of fields. This means that fields in your config model must be defined as e.g. plain dict, not dict[str, str].

  • Optional and Union fields are not supported, i.e. you cannot do either of

    foo: str | None = None
    bar: Optional[str]
    baz: int | float
    

    because it confuses the hydrator, who won't know which constructor to call or will try to initialize None.

  • While default values are supported, default_factory is not.

  • Basic Python types bytes and bytearray may work but are not officially supported.

Development

Setup

uv sync

Lint and Format

just lint

Run Tests

just test

Run Failed Tests

just test-failed

◼️◼️◼️

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

configator_op-3000.5.0.tar.gz (21.5 kB view details)

Uploaded Source

Built Distribution

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

configator_op-3000.5.0-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file configator_op-3000.5.0.tar.gz.

File metadata

  • Download URL: configator_op-3000.5.0.tar.gz
  • Upload date:
  • Size: 21.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for configator_op-3000.5.0.tar.gz
Algorithm Hash digest
SHA256 83f301c7c596ce3e0f3f2861f6d588016d1183f2c422b9483e6aae16d07d6414
MD5 92deb544bcd952ff7bd1f5e1b279f5c9
BLAKE2b-256 fefe59f92183f4e9437345fe768a1c8e39fcfafbd99c046c033cc33e9e1d5108

See more details on using hashes here.

File details

Details for the file configator_op-3000.5.0-py3-none-any.whl.

File metadata

File hashes

Hashes for configator_op-3000.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 194bfed38eee02a07a13d95ba8dab5a4e4ec38243b5cb749b7da7c494aa76ec5
MD5 a82ed5c156dd0359f2cbb78ca2dd1ade
BLAKE2b-256 9a98a2c20b3fc0d249d6c5ee722f633cad64b7e44df8385b792d968351f802c4

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