Skip to main content

coveo-settings

Whenever you want the user to be able to configure something through an environment variable, this module has your back:

from coveo_settings import StringSetting, BoolSetting

DATABASE_URL = StringSetting('project.database.url')
DATABASE_USE_SSL = BoolSetting('project.database.ssl')

The user can then configure the environment variables project.database.url and project.database.ssl to configure the application.

When accessed, the values are automatically converted to the desired type:

  • StringSetting will always be a string
  • BoolSetting is either True or False, but accepts "yes|no|true|false|1|0" as input (case-insensitive, of course)
  • IntSetting and FloatSetting are self-explanatory
  • DictSetting allows you to use JSON maps
  • PathSetting gives a Path instance, and also implements PathLike and the / operator

If the input cannot be converted to the value type, an TypeConversionConfigurationError exception is raised.

A default (fallback) value may be specified. The fallback may be a callable.

A validation callback may be specified for custom logic and error messages.

Not limited to environment variables; supports redirection to custom implementations.

A setting can be set as sensitive for logging purposes. When logging, use repr(setting) to get the correct representation.

Accessing the value

There are various ways to obtain the value:

from coveo_settings import BoolSetting

DATABASE_USE_SSL = BoolSetting('project.database.ssl')

# this method will raise an exception if the setting has no value and no fallback
use_ssl = bool(DATABASE_USE_SSL)
use_ssl = DATABASE_USE_SSL.get_or_raise()
assert use_ssl in [True, False]

# this method will not raise an exception
use_ssl = DATABASE_USE_SSL.value
assert use_ssl in [True, False, None]

# use "is_set" to check if there is a value set for this setting; skips validation check
if DATABASE_USE_SSL.is_set:
    use_ssl = bool(DATABASE_USE_SSL)

# use "is_valid" to verify if the value passes the validation callback. implies is_set.
if not DATABASE_USE_SSL.is_valid:
    ...

Loose environment key matching

Matching the key of the environment variable project.database.ssl is done very loosely:

  • case-insensitive
  • dots and underscores are ignored completely (foo_bar and f__ooba.r are equal)
    • useful for some runners that don't support dots in environment variable keys

Use ready validation

You can quickly validate that a string is in a specific list like this:

from coveo_settings.settings import StringSetting
from coveo_settings.validation import InSequence

ENV = StringSetting("environment", fallback="dev", validation=InSequence("prod", "staging", "dev"))

Redirection

You can register custom redirection schemes in order to support any data source.

Much like https:// is a clear scheme, you may register callback functions to trigger when the value of a setting starts with the scheme(s) you define. For instance, let's support a custom API and a file storage:

from coveo_settings import settings_adapter, StringSetting, ConfigValue


@settings_adapter("internal-api::")
def internal_api_adapter(key: str) -> ConfigValue:
    # the scheme was automatically removed for convenience; only the resource remains
    assert "internal-api::" not in key
    return "internal api"  # implement logic to obtain value from internal api


@settings_adapter("file::", strip_scheme=False)
def file_adapter(key: str) -> ConfigValue:
    # you can keep the scheme by specifying `strip_scheme=False`
    assert key.startswith("file::")
    return "file adapter"  # implement logic to parse the key and retrieve the setting value


assert StringSetting('...', fallback="internal-api::settings/user-name").value == "internal api"
assert StringSetting('...', fallback="file::settings.yaml/user-name").value == "file adapter"


# even though we used `fallback` above, the redirection is driven by the user:
import os

REDIRECT_ME = StringSetting('test')
os.environ['test'] = "file::user.json::name"
assert REDIRECT_ME.value == "file adapter"
os.environ['test'] = "internal-api::url"
assert REDIRECT_ME.value == "internal api"

Keep in mind that there's no restriction on the prefix scheme; it's your responsibility to pick something unique that can be set as the value of an environment variable.

Redirection is recursive

The value of a redirection may be another redirection and may juggle between adapters. A limit of 50 redirections is supported:

import os

from coveo_settings import StringSetting


os.environ["expected"] = "final value"
os.environ["redirected"] = "env->expected"
os.environ["my-setting"] = "env->redirected"

assert StringSetting("my-setting").value == "final value"

Builtin environment redirection

The builtin redirection scheme env-> can be used to redirect to a different environment variable. The example below demonstrates the deprecation/migration of my-setting into new-setting:

import os

from coveo_settings import StringSetting

os.environ["new-setting"] = "correct-value"
os.environ["my-setting"] = "env->new-setting"

assert StringSetting("my-setting").value == "correct-value"

Cached

You can set a setting to cache the first valid value with cached=True. This is particularly useful in redirection scenarios to avoid repeating requests too often.

Setting the value

You can override the value using setting.value = "some value" and clear the override with setting.value = None. Clearing the override resumes the normal behavior of the environment variables and the fallback value, if set.

This is typically used as a way to propagate CLI switches globally. For mocking scenarios, refer to the Mocking section below.

Mocking

When you need a setting value for a test, use the mock_config_value context manager:

from coveo_settings import StringSetting
from coveo_settings.mock import mock_config_value

SETTING = StringSetting(...)

assert not SETTING.is_set
with mock_config_value(SETTING, 'new-value'):
    assert SETTING.is_set

You can also clear the value:

from coveo_settings import StringSetting
from coveo_settings.mock import mock_config_value

SETTING = StringSetting(..., fallback='test')

assert SETTING.is_set
with mock_config_value(SETTING, None):
    assert not SETTING.is_set

Download files

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

Source Distribution

coveo_settings-4.0.tar.gz (11.7 kB view details)

Uploaded Source

Built Distribution

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

coveo_settings-4.0-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file coveo_settings-4.0.tar.gz.

File metadata

  • Download URL: coveo_settings-4.0.tar.gz
  • Upload date:
  • Size: 11.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for coveo_settings-4.0.tar.gz
Algorithm Hash digest
SHA256 69fbe4065402a98fdadf7aac2363e74b227cbd744b4dea27284d0fc8603d8700
MD5 ccbf8e4bf0ec1fc024ecfa144116a957
BLAKE2b-256 95e32439bb8ede6bba2dd450423869ba3a078e70e2aabd7e667cd3d9c259b3e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for coveo_settings-4.0.tar.gz:

Publisher: coveo-settings.yml on coveooss/coveo-python-oss

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file coveo_settings-4.0-py3-none-any.whl.

File metadata

  • Download URL: coveo_settings-4.0-py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for coveo_settings-4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1f924416af46729b626d0756498d484838675db9e50d81eb9de2eb3f8d5d5d34
MD5 b5258afdeb9c211449ad5e56df05216e
BLAKE2b-256 2d0b24da672a2ad9eb533d5b6c87cbd806f1ef16ccac92edab2f1a9482ca1cb3

See more details on using hashes here.

Provenance

The following attestation bundles were made for coveo_settings-4.0-py3-none-any.whl:

Publisher: coveo-settings.yml on coveooss/coveo-python-oss

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

4.0 This release

2 files

3.0

2 files

2.1.8

2 files

2.1.7

2 files

2.1.6

2 files

2.1.5

2 files

2.1.4

2 files

2.1.3

2 files

2.1.2

2 files

2.1.1

2 files

2.1

2 files

2.0.13

2 files

2.0.12

2 files

2.0.11

2 files

2.0.10

2 files

2.0.9

2 files

2.0.8

2 files

2.0.5

2 files

2.0.4

2 files

2.0.3

2 files

2.0.2

2 files

2.0.1

2 files

2.0

2 files

1.1.5

2 files

1.1.4

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

1.1

2 files

1.0.7

2 files

1.0.6

2 files

1.0.5

2 files

1.0.4

2 files

1.0.3

2 files

1.0.2

2 files

1.0.1

2 files

1.0

2 files

0.2.1

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page