Skip to main content

Easy access to `~/.config`

Project description

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.

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

xdgconfig-1.3.0.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

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

xdgconfig-1.3.0-py3-none-any.whl (15.5 kB view details)

Uploaded Python 3

File details

Details for the file xdgconfig-1.3.0.tar.gz.

File metadata

  • Download URL: xdgconfig-1.3.0.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.1 Darwin/21.3.0

File hashes

Hashes for xdgconfig-1.3.0.tar.gz
Algorithm Hash digest
SHA256 60cca0a3374691a12ad204b63d190968f97b43d644cb33863fa2e96b18580337
MD5 3f74eec3a68320854a603dc651cbbe27
BLAKE2b-256 7512d9cea35f4016379703af0189d861c05a906d4e13c92cea64d8a68bcd8ab8

See more details on using hashes here.

File details

Details for the file xdgconfig-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: xdgconfig-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 15.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.1 Darwin/21.3.0

File hashes

Hashes for xdgconfig-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 affd7a7690de13dccbe2303380794756d9b2a2c1a7d33750f2a2cdf675660422
MD5 fd7832539b8f145ea1e383913570192a
BLAKE2b-256 b3371641afd820f2547f87d001b28ec2e79db0a7b3d304c6f99aeb286f5ef40c

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