diff --git a/src/sentry/runner/importer.py b/src/sentry/runner/importer.py index 35c9187592f17e..bb655252458d38 100644 --- a/src/sentry/runner/importer.py +++ b/src/sentry/runner/importer.py @@ -1,11 +1,13 @@ from __future__ import absolute_import, print_function -import imp +import io import six import sys import click +from sentry.utils.compat import new_module + def install(name, config_path, default_settings, callback=None): sys.meta_path.append(Importer(name, config_path, default_settings, callback)) @@ -17,7 +19,7 @@ def show(self, file=None): from click._compat import get_text_stderr file = get_text_stderr() - click.secho("!! Configuration error: %s" % self.format_message(), file=file, fg="red") + click.secho("!! Configuration error: %s" % six.text_type(self), file=file, fg="red") class Importer(object): @@ -66,7 +68,7 @@ def _load_module(self, fullname): else: default_settings_mod = None - settings_mod = imp.new_module(self.name) + settings_mod = new_module(self.name) # Django doesn't play too nice without the config file living as a real # file, so let's fake it. @@ -85,11 +87,11 @@ def _load_module(self, fullname): def load_settings(mod_or_filename, settings, silent=False): if isinstance(mod_or_filename, six.string_types): - conf = imp.new_module("temp_config") + conf = new_module("temp_config") conf.__file__ = mod_or_filename try: - with open(mod_or_filename) as source_file: + with io.open(mod_or_filename, mode="rb") as source_file: six.exec_(source_file.read(), conf.__dict__) except IOError as e: import errno diff --git a/src/sentry/utils/compat/__init__.py b/src/sentry/utils/compat/__init__.py index eae3ea688151e5..deb11826238df2 100644 --- a/src/sentry/utils/compat/__init__.py +++ b/src/sentry/utils/compat/__init__.py @@ -53,6 +53,12 @@ def implements_bool(cls): from binascii import crc32 + import imp + + def new_module(name): + return imp.new_module(name) + + else: implements_to_string = _identity implements_iterator = _identity @@ -78,3 +84,8 @@ def implements_bool(cls): def crc32(*args): rt = _crc32(*args) return rt - ((rt & 0x80000000) << 1) + + import types + + def new_module(name): + return types.ModuleType(name)