| #!/usr/bin/env python |
| |
| import os |
| import sys |
| |
| from django.core.management import ManagementUtility |
| |
| from pycharm_run_utils import import_system_module |
| |
| inspect = import_system_module("inspect") |
| |
| #import settings to prevent circular dependencies later on import django.db |
| try: |
| from django.conf import settings |
| apps = settings.INSTALLED_APPS |
| except: |
| pass |
| |
| project_directory = sys.argv.pop() |
| |
| from django.core import management |
| from django.core.management.commands.test import Command |
| |
| try: |
| # setup environment |
| # this stuff was done earlier by setup_environ() which was removed in 1.4 |
| sys.path.append(os.path.join(project_directory, os.pardir)) |
| project_name = os.path.basename(project_directory) |
| __import__(project_name) |
| except ImportError: |
| # project has custom structure (project directory is not importable) |
| pass |
| finally: |
| sys.path.pop() |
| |
| manage_file = os.getenv('PYCHARM_DJANGO_MANAGE_MODULE') |
| if not manage_file: |
| manage_file = 'manage' |
| |
| try: |
| __import__(manage_file) |
| except ImportError: |
| print ("There is no such manage file " + str(manage_file) + "\n") |
| |
| settings_file = os.getenv('DJANGO_SETTINGS_MODULE') |
| if not settings_file: |
| settings_file = 'settings' |
| |
| import django |
| if django.VERSION[0:2] >= (1, 7): |
| django.setup() |
| |
| class PycharmTestCommand(Command): |
| def get_runner(self): |
| TEST_RUNNER = 'django_test_runner.run_tests' |
| test_path = TEST_RUNNER.split('.') |
| # Allow for Python 2.5 relative paths |
| if len(test_path) > 1: |
| test_module_name = '.'.join(test_path[:-1]) |
| else: |
| test_module_name = '.' |
| test_module = __import__(test_module_name, {}, {}, test_path[-1]) |
| test_runner = getattr(test_module, test_path[-1]) |
| return test_runner |
| |
| def handle(self, *test_labels, **options): |
| # handle south migration in tests |
| management.get_commands() |
| if hasattr(settings, "SOUTH_TESTS_MIGRATE") and not settings.SOUTH_TESTS_MIGRATE: |
| # point at the core syncdb command when creating tests |
| # tests should always be up to date with the most recent model structure |
| management._commands['syncdb'] = 'django.core' |
| elif 'south' in settings.INSTALLED_APPS: |
| try: |
| from south.management.commands import MigrateAndSyncCommand |
| management._commands['syncdb'] = MigrateAndSyncCommand() |
| from south.hacks import hacks |
| if hasattr(hacks, "patch_flush_during_test_db_creation"): |
| hacks.patch_flush_during_test_db_creation() |
| except ImportError: |
| management._commands['syncdb'] = 'django.core' |
| |
| verbosity = int(options.get('verbosity', 1)) |
| interactive = options.get('interactive', True) |
| failfast = options.get('failfast', False) |
| TestRunner = self.get_runner() |
| |
| if not inspect.ismethod(TestRunner): |
| failures = TestRunner(test_labels, verbosity=verbosity, interactive=interactive, failfast=failfast) |
| else: |
| test_runner = TestRunner(verbosity=verbosity, interactive=interactive, failfast=failfast) |
| failures = test_runner.run_tests(test_labels) |
| |
| if failures: |
| sys.exit(bool(failures)) |
| |
| class PycharmTestManagementUtility(ManagementUtility): |
| def __init__(self, argv=None): |
| ManagementUtility.__init__(self, argv) |
| |
| def execute(self): |
| PycharmTestCommand().run_from_argv(self.argv) |
| |
| if __name__ == "__main__": |
| |
| try: |
| custom_settings = __import__(settings_file) |
| splitted_settings = settings_file.split('.') |
| if len(splitted_settings) != 1: |
| settings_name = '.'.join(splitted_settings[:-1]) |
| settings_module = __import__(settings_name, globals(), locals(), [splitted_settings[-1]]) |
| custom_settings = getattr(settings_module, splitted_settings[-1]) |
| |
| except ImportError: |
| print ("There is no such settings file " + str(settings_file) + "\n") |
| |
| try: |
| subcommand = sys.argv[1] |
| except IndexError: |
| subcommand = 'help' # Display help if no arguments were given. |
| |
| if subcommand == 'test': |
| utility = PycharmTestManagementUtility(sys.argv) |
| else: |
| utility = ManagementUtility() |
| |
| utility.execute() |