Source code for bcdamenu.config_file_parser


# Copyright (c) 2009-2019, UChicago Argonne, LLC.
# See LICENSE.txt file for details.

"""
parse the configuration file

.. autosummary::

    ~readConfigFile
    ~ConfigFileError
    ~ConfigFileKeyError
    ~clearKnownMenuNames
    ~MenuBase
    ~Menu
    ~MenuItem
    ~MenuSeparator

"""

from collections import OrderedDict
try:
    import configparser as iniParser
except:
    import ConfigParser as iniParser

TEST_FILE = "bcdamenu.ini"
MAIN_SECTION_LABEL = 'BcdaMenu'
KNOWN_VERSIONS = ("2017.3.0", )

[docs]class ConfigFileError(Exception): """general exception from `config_file_parser`"""
[docs]class ConfigFileKeyError(ConfigFileError, KeyError): """exception with a key in the configuration file"""
known_menu_names = []
[docs]def clearKnownMenuNames(): """keep a list of all known menus so a recursive configuration will be found""" global known_menu_names known_menu_names = []
def readConfigFile(file_name, ): title = MAIN_SECTION_LABEL version = 'unknown' clearKnownMenuNames() config = iniParser.ConfigParser(allow_no_value=True) config.optionxform = str # do not make labels lower case config.read(file_name) menu_list = [] for k, v in config.items(MAIN_SECTION_LABEL): if k == "title": title = v elif k == "version": if v not in KNOWN_VERSIONS: msg = "Unknown version: " + str(v) msg += " expected one of: " + str(KNOWN_VERSIONS) raise ConfigFileError(msg) version = v elif k == "menus": for menu_name in v.split(): if menu_name in known_menu_names: msg = "submenu %s used more than once" % menu_name raise ConfigFileKeyError(msg) menu = Menu(None, menu_name) known_menu_names.append(menu_name) menu_list.append(menu) menu.readConfiguration(config) # print(str(menu)) return dict(menus=menu_list, title=title, version=version) if __name__ == "__main__": cfg = readConfigFile(TEST_FILE) print(cfg['title']) print(cfg['version']) for m in cfg['menus']: print(m)