Insultingly simple configuration for Python 2.7 applications.

pip install lazyconf==0.5.5


Build Status Coverage Status PyPi version PyPi downloads


Join the chat at lazyconf is an insultingly simple tool for configuring python applications. Use lazyconf to keep all of your app's configuration out of version control. See the django-base example for an example of how to use lazyconf.


  • Python 2.7


pip install lazyconf


The basic idea is that you run lazyconf config in your base directory:

lazyconf config

Follow the onscreen instructions to do the initial configuration. This does the following:

  • Creates a .lazy/ directory inside the current directory.
  • Generates a schema file (.lazy/lazy.schema.json), and a data file (.lazy/lazy.json).
  • Creates a .gitignore file inside .lazy/ so that your configured settings (which may contain sensitive information) are never committed to git.

You are then safe to commit the .lazy folder to git, which will not contain any sensitive information. The next thing to do is update your schema file with all of the settings that you want to include in your configuration.

Using the data

To use the configuration generated by lazyconf, you can either use the command line tool lazyconf, i.e.

lazyconf get -k db.user
> fareed

Or, you can include it in a Python file, and use the 'load' function to load any existing configuration:

>>> import lazyconf
>>> l = lazyconf.Lazyconf().load()
>>> l.get('db.engine')

If the python file loading lazyconf is not in the same folder as .lazy/, you can point it at .lazy/ manually:

>>> import lazyconf
>>> l = lazyconf.Lazyconf().load('/home/fareed/.lazy/')
>>> l.get('db.engine')

To set an option from the command line, use lazyconf set. This will set the option for the key and save the new data file. It uses the same validation rules as using lazyconf config.

lazyconf set -k env.debug -v y
lazyconf get -k env.debug
> True

Schema Files

The schema file located in .lazy/lazy.schema.json is the way lazyconf knows which questions to ask you, and what kind of answers to expect. The schema file follows the following format:

    "example_section" : {
        "example_option" : "",
        "string_with_default" : "default",
        "example_int" : 5,
        "example_bool" : false,
        "example_select" : ""

    "example_optional_section" : {
        "optional_option" : "foobar"

    "_internal": {
        "labels": {
            "example_section" : "Example Section Label",
            "example_section.example_int" : "Example suboption label"

        "selects": {
            "example_section.exmple_select" : {
                "option1" : "value1",
                "option2" : "value2",
                "option3" : "value3"


All options to configure are held within sections. A section is a JSON object where the key is the name of the section. In the above example, there are two sections: example_section and example_optional_section.

Optional Sections

To make a section optional, include a key/value pair inside the section with the key "_enabled", and a default boolean value. This will let the user skip over that section if it is not necessary to be configured.


"_internal" is a JSON object that contains the following two JSON objects:

  • "labels": This object consists of key/value pairs which define labels to show the user running the configuration. For example, if you had a section called db, and a string in that section called user, you would use "db.user" : "Database User" to assign the label 'Database User' to that string.

  • "selects": This object consists of several objects which define 'selects', i.e. a way for the user to only be able to choose from a list of predetermined values. For example, if you had a section called db, and a string in that section called engine, you could use the following object to allow the user to select from a list of values relating to the database engine you might happen to be using:

    "db.engine": {
        "postgres": "django.db.backends.postgresql_psycopg2", 
        "mysql": "django.db.backends.mysql"


"_internal" and "_enabled" are keywords and should not be used as option names.


Lazyconf is very much in its infancy at the moment, so I'd appreciate any bugs/issues, questions, comments, feedback or pull requests. Simply clone the repository and install the requirements:

pip install -r requirements.txt

To run the (albeit currently rather weak) test suite, run

coverage run --source=lazyconf,lib lazyconf/

Bitdeli badge