Source code for evennia.contrib.base_systems.components.tests

-from evennia.contrib.base_systems.components import Component, DBField, TagField, signals
-from evennia.contrib.base_systems.components.holder import ComponentHolderMixin, ComponentProperty
+from evennia.contrib.base_systems.components import (
+    Component,
+    DBField,
+    TagField,
+    signals,
+)
+from evennia.contrib.base_systems.components.holder import (
+    ComponentHolderMixin,
+    ComponentProperty,
+)
 from evennia.contrib.base_systems.components.signals import as_listener
 from evennia.objects.objects import DefaultCharacter
 from evennia.utils import create
diff --git a/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/scripts.html b/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/scripts.html
index 9e2f69d323..398cf14640 100644
--- a/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/scripts.html
+++ b/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/scripts.html
@@ -90,7 +90,11 @@
 
 from evennia import ChannelDB, DefaultObject, DefaultScript, ScriptDB, logger
 from evennia.contrib.base_systems.ingame_python.callbackhandler import CallbackHandler
-from evennia.contrib.base_systems.ingame_python.utils import EVENTS, InterruptEvent, get_next_wait
+from evennia.contrib.base_systems.ingame_python.utils import (
+    EVENTS,
+    InterruptEvent,
+    get_next_wait,
+)
 from evennia.utils.ansi import raw
 from evennia.utils.create import create_channel
 from evennia.utils.dbserialize import dbserialize
diff --git a/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/utils.html b/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/utils.html
index 3a24294726..76816b9bb3 100644
--- a/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/utils.html
+++ b/docs/1.0-dev/_modules/evennia/contrib/base_systems/ingame_python/utils.html
@@ -87,7 +87,9 @@
 
 from evennia import ScriptDB, logger
 from evennia.contrib.base_systems.custom_gametime import UNITS, gametime_to_realtime
-from evennia.contrib.base_systems.custom_gametime import real_seconds_until as custom_rsu
+from evennia.contrib.base_systems.custom_gametime import (
+    real_seconds_until as custom_rsu,
+)
 from evennia.utils.create import create_script
 from evennia.utils.gametime import real_seconds_until as standard_rsu
 from evennia.utils.utils import class_from_module
diff --git a/docs/1.0-dev/_modules/evennia/contrib/full_systems/evscaperoom/commands.html b/docs/1.0-dev/_modules/evennia/contrib/full_systems/evscaperoom/commands.html
index 330efca5ea..049115ded6 100644
--- a/docs/1.0-dev/_modules/evennia/contrib/full_systems/evscaperoom/commands.html
+++ b/docs/1.0-dev/_modules/evennia/contrib/full_systems/evscaperoom/commands.html
@@ -109,7 +109,14 @@
 
 from django.conf import settings
 
-from evennia import SESSION_HANDLER, CmdSet, Command, InterruptCommand, default_cmds, syscmdkeys
+from evennia import (
+    SESSION_HANDLER,
+    CmdSet,
+    Command,
+    InterruptCommand,
+    default_cmds,
+    syscmdkeys,
+)
 from evennia.utils import variable_from_module
 
 from .utils import create_evscaperoom_object
diff --git a/docs/1.0-dev/_modules/evennia/contrib/game_systems/crafting/crafting.html b/docs/1.0-dev/_modules/evennia/contrib/game_systems/crafting/crafting.html
index 262c2d868e..7f66d4b74c 100644
--- a/docs/1.0-dev/_modules/evennia/contrib/game_systems/crafting/crafting.html
+++ b/docs/1.0-dev/_modules/evennia/contrib/game_systems/crafting/crafting.html
@@ -204,7 +204,12 @@
 from evennia.commands.command import Command
 from evennia.prototypes.spawner import spawn
 from evennia.utils.create import create_object
-from evennia.utils.utils import callables_from_module, inherits_from, iter_to_str, make_iter
+from evennia.utils.utils import (
+    callables_from_module,
+    inherits_from,
+    iter_to_str,
+    make_iter,
+)
 
 _RECIPE_CLASSES = {}
 
diff --git a/docs/1.0-dev/_modules/evennia/contrib/game_systems/puzzles/puzzles.html b/docs/1.0-dev/_modules/evennia/contrib/game_systems/puzzles/puzzles.html
index 3039647930..1ff21586e4 100644
--- a/docs/1.0-dev/_modules/evennia/contrib/game_systems/puzzles/puzzles.html
+++ b/docs/1.0-dev/_modules/evennia/contrib/game_systems/puzzles/puzzles.html
@@ -152,7 +152,14 @@
 import itertools
 from random import choice
 
-from evennia import CmdSet, DefaultCharacter, DefaultExit, DefaultRoom, DefaultScript, create_script
+from evennia import (
+    CmdSet,
+    DefaultCharacter,
+    DefaultExit,
+    DefaultRoom,
+    DefaultScript,
+    create_script,
+)
 from evennia.commands.default.muxcommand import MuxCommand
 from evennia.prototypes.spawner import spawn
 from evennia.utils import logger, search, utils
diff --git a/docs/1.0-dev/_modules/evennia/contrib/grid/wilderness/wilderness.html b/docs/1.0-dev/_modules/evennia/contrib/grid/wilderness/wilderness.html
index 6e1c5ae856..500b6e65c4 100644
--- a/docs/1.0-dev/_modules/evennia/contrib/grid/wilderness/wilderness.html
+++ b/docs/1.0-dev/_modules/evennia/contrib/grid/wilderness/wilderness.html
@@ -191,7 +191,13 @@
 
 """
 
-from evennia import DefaultExit, DefaultRoom, DefaultScript, create_object, create_script
+from evennia import (
+    DefaultExit,
+    DefaultRoom,
+    DefaultScript,
+    create_object,
+    create_script,
+)
 from evennia.utils import inherits_from
 
 
diff --git a/docs/1.0-dev/_modules/evennia/contrib/rpg/traits/traits.html b/docs/1.0-dev/_modules/evennia/contrib/rpg/traits/traits.html
index ec0b037794..73dcea6a4c 100644
--- a/docs/1.0-dev/_modules/evennia/contrib/rpg/traits/traits.html
+++ b/docs/1.0-dev/_modules/evennia/contrib/rpg/traits/traits.html
@@ -538,7 +538,12 @@
 
 from evennia.utils import logger
 from evennia.utils.dbserialize import _SaverDict
-from evennia.utils.utils import class_from_module, inherits_from, list_to_string, percent
+from evennia.utils.utils import (
+    class_from_module,
+    inherits_from,
+    list_to_string,
+    percent,
+)
 
 # Available Trait classes.
 # This way the user can easily supply their own. Each
diff --git a/docs/1.0-dev/_modules/evennia/help/filehelp.html b/docs/1.0-dev/_modules/evennia/help/filehelp.html
index 1a4d2f8071..3643a7a0a5 100644
--- a/docs/1.0-dev/_modules/evennia/help/filehelp.html
+++ b/docs/1.0-dev/_modules/evennia/help/filehelp.html
@@ -151,7 +151,12 @@
 
 from evennia.locks.lockhandler import LockHandler
 from evennia.utils import logger
-from evennia.utils.utils import all_from_module, lazy_property, make_iter, variable_from_module
+from evennia.utils.utils import (
+    all_from_module,
+    lazy_property,
+    make_iter,
+    variable_from_module,
+)
 
 _DEFAULT_HELP_CATEGORY = settings.DEFAULT_HELP_CATEGORY
 
diff --git a/docs/1.0-dev/_modules/evennia/server/evennia_launcher.html b/docs/1.0-dev/_modules/evennia/server/evennia_launcher.html
index 8c0d0a6e32..fac0cbd029 100644
--- a/docs/1.0-dev/_modules/evennia/server/evennia_launcher.html
+++ b/docs/1.0-dev/_modules/evennia/server/evennia_launcher.html
@@ -449,18 +449,18 @@
     """
 
 ERROR_PYTHON_VERSION = """
-    ERROR: Python {pversion} used. Evennia requires version
+    ERROR: Python {python_version} used. Evennia requires version
     {python_min} or higher.
     """
 
 WARNING_PYTHON_MAX_TESTED_VERSION = """
-    WARNING: Python {pversion} used. Evennia is only tested with Python
+    WARNING: Python {python_version} used. Evennia is only tested with Python
     versions {python_min} to {python_max_tested}. If you see unexpected errors, try
     reinstalling with a tested Python version instead.
     """
 
 ERROR_TWISTED_VERSION = """
-    ERROR: Twisted {tversion} found. Evennia requires
+    ERROR: Twisted {twisted_version} found. Evennia requires
     version {twisted_min} or higher.
     """
 
@@ -469,8 +469,8 @@
     """
 
 ERROR_DJANGO_MIN = """
-    ERROR: Django {dversion} found. Evennia requires at least version {django_min} (but
-    below version {django_lt}).
+    ERROR: Django {django_version} found. Evennia supports Django
+    {django_min} - {django_max_tested}. Using an older version is not supported.
 
     If you are using a virtualenv, use the command `pip install --upgrade -e evennia` where
     `evennia` is the folder to where you cloned the Evennia library. If not
@@ -482,8 +482,8 @@
     """
 
 NOTE_DJANGO_NEW = """
-    NOTE: Django {dversion} found. This is newer than Evennia's
-    recommended version ({django_rec}). It might work, but is new
+    NOTE: Django {django_version} found. This is newer than Evennia's
+    recommended version ({django_max_tested}). It might work, but is new
     enough to not be fully tested yet. Report any issues.
     """
 
@@ -1352,53 +1352,83 @@
         not_error (bool): True if no dependency error was found.
 
     """
-    error = False
 
-    # Python
-    pversion = ".".join(str(num) for num in sys.version_info if isinstance(num, int))
-    if LooseVersion(pversion) < LooseVersion(PYTHON_MIN):
-        print(ERROR_PYTHON_VERSION.format(pversion=pversion, python_min=PYTHON_MIN))
-        error = True
-    if LooseVersion(pversion) > LooseVersion(PYTHON_MAX_TESTED):
-        print(
-            WARNING_PYTHON_MAX_TESTED_VERSION.format(
-                pversion=pversion, python_min=PYTHON_MIN, python_max_tested=PYTHON_MAX_TESTED
-            )
-        )
+    def _test_python_version():
+        """Test Python version"""
+        python_version = ".".join(str(num) for num in sys.version_info if isinstance(num, int))
+        python_curr = LooseVersion(python_version)
+        python_min = LooseVersion(PYTHON_MIN)
+        python_max = LooseVersion(PYTHON_MAX_TESTED)
 
-    # Twisted
-    try:
-        import twisted
-
-        tversion = twisted.version.short()
-        if LooseVersion(tversion) < LooseVersion(TWISTED_MIN):
-            print(ERROR_TWISTED_VERSION.format(tversion=tversion, twisted_min=TWISTED_MIN))
-            error = True
-    except ImportError:
-        print(ERROR_NOTWISTED)
-        error = True
-    # Django
-    try:
-        dversion = ".".join(str(num) for num in django.VERSION if isinstance(num, int))
-        # only the main version (1.5, not 1.5.4.0)
-        dversion_main = ".".join(dversion.split(".")[:2])
-        if LooseVersion(dversion) < LooseVersion(DJANGO_MIN):
+        if python_curr < python_min:
+            print(ERROR_PYTHON_VERSION.format(python_version=python_version, python_min=PYTHON_MIN))
+            return False
+        elif python_curr > python_max:
             print(
-                ERROR_DJANGO_MIN.format(
-                    dversion=dversion_main, django_min=DJANGO_MIN, django_lt=DJANGO_MAX_TESTED
+                WARNING_PYTHON_MAX_TESTED_VERSION.format(
+                    python_version=python_version,
+                    python_min=PYTHON_MIN,
+                    python_max_tested=PYTHON_MAX_TESTED,
                 )
             )
-            error = True
-        elif LooseVersion(DJANGO_MAX_TESTED) <= LooseVersion(dversion_main):
-            print(NOTE_DJANGO_NEW.format(dversion=dversion_main, django_rec=DJANGO_MAX_TESTED))
-    except ImportError:
-        print(ERROR_NODJANGO)
-        error = True
-    if error:
-        sys.exit()
+        return True
+
+    def _test_twisted_version():
+        """Test Twisted version"""
+        try:
+            import twisted
+        except ImportError:
+            print(ERROR_NOTWISTED)
+            return False
+        else:
+            twisted_version = twisted.version.short()
+            twisted_curr = LooseVersion(twisted_version)
+            twisted_min = LooseVersion(TWISTED_MIN)
+
+            if twisted_curr < twisted_min:
+                print(
+                    ERROR_TWISTED_VERSION.format(
+                        twisted_version=twisted_version, twisted_min=TWISTED_MIN
+                    )
+                )
+                return False
+            else:
+                return True
+
+    def _test_django_version():
+        """Test Django version"""
+        try:
+            import django
+        except ImportError:
+            print(ERROR_NODJANGO)
+            return False
+        else:
+            django_version = ".".join(str(num) for num in django.VERSION if isinstance(num, int))
+            # only the main version (1.5, not 1.5.4.0)
+            django_version = ".".join(django_version.split(".")[:2])
+            django_curr = LooseVersion(django_version)
+            django_min = LooseVersion(DJANGO_MIN)
+            django_max = LooseVersion(DJANGO_MAX_TESTED)
+
+            if django_curr < django_min:
+                print(
+                    ERROR_DJANGO_MIN.format(
+                        django_version=django_version,
+                        django_min=DJANGO_MIN,
+                        django_max_tested=DJANGO_MAX_TESTED,
+                    )
+                )
+                return False
+            elif django_curr > django_max:
+                print(
+                    NOTE_DJANGO_NEW.format(
+                        django_version=django_version, django_max_tested=DJANGO_MAX_TESTED
+                    )
+                )
+            return True
 
     # return True/False if error was reported or not
-    return not error
+ return all((_test_python_version(), _test_twisted_version(), _test_django_version()))