Configtype let's you define application configuration in both python and configuration languages like json, ini and yaml.
Haha that's a lie, only json is implemented.
Configtype will construct a python type that has all the top level values in the config file defined as attributes.
Which amounts to:
{ "sitename": "Bank of amurika", "production": true, "structure": { "width": [1,3,7], "flapdrol": false } }
will become something in python that looks like this:
class Config(object): sitename = "Great value" production = True structure = {"width": [1, 3, 7], "flapdrol": False}
That is nice to have! Because now you can load your configuration where you
need it using import
. You can create instances, where you can change some
configuration details without messing with the global settings.
So how does it work? somewhere in your project, you need to create a module that hold your configuration class definition, with default values. This can not be a top level module, but MUST be contained in a package, do not put it in the global namespace!:
config.py <--- toplevel don;t put it here myapp/__init__.py myapp/config.py <-- you can put it here.
The file should look like this:
from configtype.jsonconfig import configfile, setup_search_paths setup_search_paths() @configfile class MyPersonalConfigClass(object): # defaults sitename = "Default sitename" production = False settings = MyPersonalConfigClass()
So just create a type with some default values as attributes and slap a decorator on top. These defaults will be used if the values are not defined in your json config. That way you can be sure the values are defined and avoid adding checks in your code.
In the above example, note the use of setup_search_paths
if you never call
this function, you will get errors, because the json file will not be found.
If you call setup_search_paths
without arguments, configtype will look
for the file from the current folder. It will start in the folder where you
have put the configtype class definition and use the module names for the
config file filename.
Let say you project looks like this:
myapp/__init__.py myapp/settings/__init__.py myapp/settings/config.py <-- type declaration goes here
configtype will look for the following filenames:
myapp/settings.json myapp.json
It will do so in all folders you registered for the search paths:
setup_search_paths() <--- current directory is search path setup_search_paths('/etc/pythonapps', 'blub') <-- hmm
The second declaration will look for the following files:
/etc/pythonapps/myapp/settings.json /etc/pythonapps/myapp.json ./blub/myapp/settings.json ./blub/myapp.json
The reason the naming is weird is because python's import mechanism is used to do the searching and that means is the files are dropped in a folder, this folder should also be the name of a python package.
Try it! after you called setup_search_paths
, you can import the json
even without the configtype, suppose we stuck the json in
/etc/pythonapps/myapp/settings.json:
import myapp.settings.json
And also, if your json look like this:
{'SITE_ID': 100}
you can immport values from the json directly:
from myapp.settings.json import SITE_ID