Standardised settings loader
a port of nodejs standard-settings
No more cp config.sample.json config.json.
Your app presents a settings/settings.default.json which is always included. User, or other developer needing custom settings, loads his custom settings, overriding default settings. If a key is missing in user settings, it won't trigger any error, as a default value is in settings.default.json. standard-settings offers multiple ways to change settings: settings.json file, command line arguments, environment variables. Check below examples for usage and priority order.
pip install pyStandardSettings
This module loads settings from a file, from commandline arguments, and environment variables. It should be required at the very beginning of your project:
from pyStandardSettings import settings
Then your settings are accessible using:
print settings.server.port
- Environment variables
Example:
SERVER_PORT=2500 python main.py
service_spacebro_inputMessage=new-media python main.py
- Command line parameters (argv)
Example:
python main.py --server.port 2000 # to specify a field
python main.py --settings settings/settings.prod.json # to specify a settings file
NB: To use a key with argv, it needs to be present in settings.default.json
- Files
These files are always loaded if present:
settings/settings.json first
settings/settings.default.json
On your project, you may have other developers working with different settings. Pushing them in the repo is annoying. We know you've seen that before. Using standard-settings, developers can share common default settings, AND load custom settings.
Best practice is to add settings/settings.default.json in your repo, this file covers default settings, common for each developer. And .gitignore settings/settings.json, this file has custom settings inside.
The following schema is an example of settings used in Soixante circuits apps:
{
"server": {
"host" : "myip",
"port" : 3333
},
"timeout": {
"lookbook": 5,
"popup": 4
},
"folder": {
"kcDownloader": "path-to/data",
"lookbook": "path-to/lookbook"
},
"flag": {
"stabalize": true,
"devMode": true
},
"customKey": {
"maxImageNumber": 64
},
"meta": {
"title": "",
"description": "",
"message": "...",
"source": ""
},
"service": {
"altruist": {
"host" : "192.168.1.6",
"port" : 6666
},
"spacebro": {
"host" : "192.168.1.6",
"port" : 8888,
"channelName": "my-channel",
"client" : {
"name" : "my-app"
}
}
}
}
To list all settings keys available in your project, use
python main.py -h
and it will display
usage: main.py [-h] [-s SETTINGS] [--recipe RECIPE]
[--server.host SERVER.HOST] [--server.port SERVER.PORT]
optional arguments:
-h, --help show this help message and exit
-s SETTINGS, --settings SETTINGS
settings file in json format
--recipe RECIPE
--server.host SERVER.HOST
--server.port SERVER.PORT
python -m tests.test