def bootstrap_options(settings, config=None): """ Quickly bootstrap options that come in from a config file and convert options into Django settings that are required to even initialize the rest of the app. """ # Make sure our options have gotten registered from sentry.options import load_defaults load_defaults() options = {} if config is not None: # Attempt to load our config yaml file from sentry.utils.yaml import safe_load from yaml.parser import ParserError from yaml.scanner import ScannerError try: with open(config, 'rb') as fp: options = safe_load(fp) except IOError: # Gracefully fail if yaml file doesn't exist pass except (AttributeError, ParserError, ScannerError) as e: from .importer import ConfigurationError raise ConfigurationError('Malformed config.yml file: %s' % unicode(e)) # Empty options file, so fail gracefully if options is None: options = {} # Options needs to be a dict elif not isinstance(options, dict): from .importer import ConfigurationError raise ConfigurationError('Malformed config.yml file') from sentry.conf.server import DEAD # First move options from settings into options for k, v in options_mapper.iteritems(): if getattr(settings, v, DEAD) is not DEAD and k not in options: warnings.warn( DeprecatedSettingWarning( options_mapper[k], "SENTRY_OPTIONS['%s']" % k, ) ) options[k] = getattr(settings, v) # Stuff everything else into SENTRY_OPTIONS # these will be validated later after bootstrapping for k, v in options.iteritems(): settings.SENTRY_OPTIONS[k] = v # Now go back through all of SENTRY_OPTIONS and promote # back into settings. This catches the case when values are defined # only in SENTRY_OPTIONS and no config.yml file for o in (settings.SENTRY_DEFAULT_OPTIONS, settings.SENTRY_OPTIONS): for k, v in o.iteritems(): if k in options_mapper: # Escalate the few needed to actually get the app bootstrapped into settings setattr(settings, options_mapper[k], v)
def bootstrap_options(settings, config=None): """ Quickly bootstrap options that come in from a config file and convert options into Django settings that are required to even initialize the rest of the app. """ # Make sure our options have gotten registered from sentry.options import load_defaults load_defaults() options = {} if config is not None: # Attempt to load our config yaml file from sentry.utils.yaml import safe_load from yaml.parser import ParserError from yaml.scanner import ScannerError try: with open(config, "rb") as fp: options = safe_load(fp) except IOError: # Gracefully fail if yaml file doesn't exist pass except (AttributeError, ParserError, ScannerError) as e: from .importer import ConfigurationError raise ConfigurationError("Malformed config.yml file: %s" % six.text_type(e)) # Empty options file, so fail gracefully if options is None: options = {} # Options needs to be a dict elif not isinstance(options, dict): from .importer import ConfigurationError raise ConfigurationError("Malformed config.yml file") from sentry.conf.server import DEAD # First move options from settings into options for k, v in six.iteritems(options_mapper): if getattr(settings, v, DEAD) is not DEAD and k not in options: warnings.warn(DeprecatedSettingWarning(options_mapper[k], "SENTRY_OPTIONS['%s']" % k)) options[k] = getattr(settings, v) # Stuff everything else into SENTRY_OPTIONS # these will be validated later after bootstrapping for k, v in six.iteritems(options): settings.SENTRY_OPTIONS[k] = v # Now go back through all of SENTRY_OPTIONS and promote # back into settings. This catches the case when values are defined # only in SENTRY_OPTIONS and no config.yml file for o in (settings.SENTRY_DEFAULT_OPTIONS, settings.SENTRY_OPTIONS): for k, v in six.iteritems(o): if k in options_mapper: # Map the mail.backend aliases to something Django understands if k == "mail.backend": try: v = settings.SENTRY_EMAIL_BACKEND_ALIASES[v] except KeyError: pass # Escalate the few needed to actually get the app bootstrapped into settings setattr(settings, options_mapper[k], v)