def to_python(self, content): data = None if self.format == 'ini': output = StringIO(content) config = ConfigParser() config.readfp(output) data = config._defaults.copy() for section in config.sections(): if not section in data: data[section] = {} for key, value in config.items(section): data[section].update({key: value}) elif self.format == 'json': if content: kwargs = self._prepare_json_kwargs(loads=True) data = json.loads(content, **kwargs) else: data = {} elif self.format == 'pickle': data = pickle.loads(content) if data is None: raise ImproperlyConfigured('File format %r is not supported.' % \ self.format) return self._batch_method('to_python', data)
def parse_config(path, additional_types=None, default_values=None, app_name=None, all_settings=None): """ Parse Configuration Definition File. In most cases this file needs to be placed in same folder where project settings module exist and named as ``settings.cfg``. But you can customize things with using ``SETMAN_SETTINGS_FILE`` option. Provide there path where settings file actually placed. Also current function can called with ``path`` string. """ config = ConfigParser(dict_type=OrderedDict) empty_settings = SettingsContainer(path, app_name) try: config.read(path) except ConfigParserError: logger.exception('Cannot parse configuration definition file from ' \ '%r', path) return empty_settings settings = copy.deepcopy(empty_settings) for setting in config.sections(): if '.' in setting: full_setting = setting app_name, setting = setting.split('.', 1) try: app_settings = getattr(all_settings, app_name) except AttributeError: logger.exception('Cannot find settings for %r app', app_name) continue try: app_setting = getattr(app_settings, setting) except AttributeError: logger.exception('Cannot find %r app setting %r', app_name, setting) continue data = dict(config.items(full_setting)) if default_values and full_setting in default_values: data.update({'default': default_values[setting]}) try: app_setting = update_app_setting(app_setting, data) except ValueError: logger.exception('Cannot redefine ``type`` attr for %r ' \ 'setting', full_setting) continue else: data = dict(config.items(setting)) data.update({'app_name': app_name, 'name': setting}) if default_values and setting in default_values: data.update({'default': default_values[setting]}) try: setting = data_to_setting(data, additional_types) except SettingTypeDoesNotExist: logger.exception('Cannot find proper setting class for %r ' \ 'type', data.get('type')) return empty_settings settings.add(setting.name, setting) return settings