Skip to main content

XDGConfig

Discord GitHub license PyPI version shields.io PyPI pyversions

Easy access to ~/.config.

Installation

Using pip

Simply run pip3 install --upgrade xdgconfig.

By default, xdgconfig only supports JSON as its serializer, but you can install support for other serializers by specifiying the format in square brackets, i.e. pip3 install xdgconfig[xml]. The following are available:

  • jsonc: JSON, with comments
  • ini: INI files
  • xml: eXtensible Markup Language files
  • toml: Tom's Markup language files
  • yaml: YAML Ain't Markup Language files

Furthermore there is an all recipe to install support for every markup supported, and you can combine them by using a + between 2 targets, i.e. pip3 install xdgconfig[xml+toml]

From source

Simply clone this repo and run python3 setup.py install.

Features

  • Config objects use a shared single reference.
  • Serializing to many common formats, including JSON, XML, TOML, YAML, and INI
  • dict-like interface
  • Autosaving on mutation of the Config object.
  • Smart config loading, especially on Unix-based platforms
    • looks in /etc/prog/config, then in ~/.config/prog/config
    • Supports setting a config file path in an environment variable named PROG_CONFIG_PATH
  • Accessing the config using dot notation (config.key for instance). See limitations for guidance.

Usage

from xdgconfig import JsonConfig

# Instanciate the JsonConfig object
# If you'd rather use a different format, there also are config classes
# for TOML, YAML, INI (configparser), and XML.
# This will save your configuration under `~/.config/PROG/config
config = JsonConfig('PROG', autosave=True)

config['foo'] = 'bar'  # Save a value to the config

# Access the value later on
print(config['foo'])

# It behaves like a collections.defaultdict as well
config['oof']['bar'] = 'baz'

# Prints {'oof': {'bar': 'baz'}, 'foo': 'bar'}
print(config)

Adding onto the library

Custom serializers

You can add custom serializers support by using a Mixin class, as well as a serializer class which must have a dumps and a loads method, which will be used to store and load data from the config file. The data is always represented as a python dict object, but you can serialize any data you want inside of it.

Look at the following example for an implementation guide.

from typing import Any, Dict

from xdgconfig import Config


class MySerializer:
    def dumps(data: Dict[str, Any]) -> str:
        return '\n'.join(f'{k}:{v}' for k, v in data.items())

    def loads(contents: str) -> Dict[str, Any]:
        return dict(s.split(':') for s in contents.split('\n'))


class MySerializerMixin:
    _SERIALIZER = MySerializer


class MyConfig(MySerializerMixin, Config):
    ...

Setting default values

You can set default values by creating a Mixin class with a _DEFAULTS class attribute, such as :

from pathlib import Path
from pprint import pprint

from xdgconfig import JsonConfig


class DefaultConfig:
    _DEFAULTS = {
        'logger.level': 'info',
        'logger.verbosity': 3,
        'app.path': str(Path.cwd()),
        'app.credentials.username': 'user',
        'app.credentials.password': 'password',
    }


class Config(DefaultConfig, JsonConfig):
    ...


config = Config('PROG', 'config.json')
pprint(config)
# Prints the following dict :
# {
#     'logger': {
#         'level': 'info',
#         'verbosity': 3
#     },
#     'app': {
#         'path': '$CWD',
#         'credentials': {
#             'username': 'user',
#             'password': 'password'
#         }
#     }
# }

Known limitations

  • Using an IniConfig object prevents you from using periods (.) in key names, as they are separators for subdicts.
  • Methods and attributes of the Config object all start with a leading underscore (_), hence, using key names with the same convention is discouraged, as it could break the object due to the way dot (.) accessing works. The only exception is the save method, which doesn't start with a leading underscore.
  • There can only be one document per config file, and a config file is a dictionary.
  • Depending on the serializer used, some data types may or may not be available. You can circumvent that by using custom serializers.
  • Configuration files with comments will have their comments dropped when the configuration is saved.

Metadata

Release files for xdgconfig 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xdgconfig 1.3.0
File Size Uploaded
xdgconfig-1.3.0.tar.gz 13.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for xdgconfig 1.3.0
File Interpreter ABI Platform
xdgconfig-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 29.0 kB

Release files / xdgconfig-1.3.0.tar.gz

Download URL xdgconfig-1.3.0.tar.gz
Size 13.4 kB
Tags Source
SHA-256 checksum
How to use checksums
60cca0a3374691a12ad204b63d190968f97b43d644cb33863fa2e96b18580337
BLAKE2b-256 checksum
How to use checksums
7512d9cea35f4016379703af0189d861c05a906d4e13c92cea64d8a68bcd8ab8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.12 CPython/3.10.1 Darwin/21.3.0

Release files / xdgconfig-1.3.0-py3-none-any.whl

Download URL xdgconfig-1.3.0-py3-none-any.whl
Size 15.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
affd7a7690de13dccbe2303380794756d9b2a2c1a7d33750f2a2cdf675660422
BLAKE2b-256 checksum
How to use checksums
b3371641afd820f2547f87d001b28ec2e79db0a7b3d304c6f99aeb286f5ef40c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.12 CPython/3.10.1 Darwin/21.3.0

Release history Release notifications | RSS feed

This release

1.3.0 This release

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

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