Skip to main content

A bafflingly simple, JSON-backed user configuration manager.

Project description

confjson

What is it?

A bafflingly simple, JSON-backed configuration manager for Python programs.

Why is it?

I kept implementing roughly the same thing from scratch in my various projects, so I figured it was time to do it properly.

User guide

The confjson.Config class is similar to a ChainMap, and works by means of two JSON files in the same directory:

  • default.config.json
    • The default config file is read-only as far as confjson is concerned. To add default settings, manually edit the file.
    • If the file does not exist, there are no defaults.
    • This file will typically be version controlled along with the code.
  • user.config.json
    • Any changes made to the config (and saved) at runtime end up in this file.
    • If the file does not exist, it will be created when changes are saved.
    • User settings take priority over default settings.
    • This file should probably be added to .gitignore or such.

Initialization

config = confjson.Config(MY_DIR).load()

# If the supplied path refers to a file, confjson will look for config
# files in the containing directory.
# This is mainly to enable the following pattern, using __file__.
configer = confjson.Config(__file__).load()

Data access

# Items in the confjson config are accessed as in a dict.
if "username" in configest["user"]:
	do_something(configest["user"]["username"])
	configest["user"]["something_count"] += 1

Persistence

# The load() method (re-)loads the Config object with values from the
# backing JSON files.
config.load()

# The save() method saves any changed or added items **to user.config.json only**.
config.save()

collections.ChainMap comparison

import collections
import confjson

chain_map = collections.ChainMap({}, {"list_in_second_dict": [1, 2, 3]})
print(chain_map.maps[1])  # -> {'list_in_second_dict': [1, 2, 3]}
print(chain_map.maps[0])  # -> {}
chain_map["list_in_second_dict"].append(4)
print(chain_map.maps[1])  # -> {'list_in_second_dict': [1, 2, 3, 4]}
print(chain_map.maps[0])  # -> {}

conf = confjson.Config(__file__)  # Assuming that our default.config.json contains {"list_in_default_config": [1, 2, 3]}
print(conf._default_dict)  # -> {'list_in_default_config': [1, 2, 3]}
print(conf._user_dict)  # -> {}
conf["list_in_default_config"].append(4)
print(conf._default_dict)  # -> {'list_in_default_config': [1, 2, 3]}
print(conf._user_dict)  # -> {'list_in_default_config': [1, 2, 3, 4]}

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

confjson-1.0.0.tar.gz (3.1 kB view hashes)

Uploaded Source

Built Distribution

confjson-1.0.0-py3-none-any.whl (4.2 kB view hashes)

Uploaded Python 3

Supported by

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