Opened 2 years ago

Last modified 2 years ago

#24559 new Bug

MigrationLoader.load_disk ImportError handling differs under py3/pypy vs py2

Reported by: Keryn Knight Owned by: nobody
Component: Migrations Version: master
Severity: Normal Keywords:
Cc: django@… Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Currently, within load_disk, the following happens:

            try:
                module = import_module(module_name)
            except ImportError as e:
                # I hate doing this, but I don't want to squash other import errors.
                # Might be better to try a directory check directly.
                if "No module named" in str(e) and MIGRATIONS_MODULE_NAME in str(e):
                    self.unmigrated_apps.add(app_config.label)
                    continue
                raise

However, the if statement behaves differently under pypy & python3, because the exception string is different.

Under python2, the following yields

>>> from importlib import import_module
>>> importlib('test_auth.migrations')
ImportError: No module named test_auth.migrations

which would hit both parts of the conditional, and end up in self.unmigrated_apps

However, under python3.3.3 the exception is:

ImportError: No module named 'test_auth'

and under pypy 2.2.1 (for python 2.7.3) the exception is:

ImportError: No module named test_auth

(same as py3k, sans quotes)

Neither of these would end up self.unmigrated_apps because MIGRATIONS_MODULE_NAME doesn't appear in the string representation, though I suspect import_module('testauthmigrations') would work.

I originally noticed this because of a travis build for a toy project, so it may not be a problem in practice, but it is at least inconsistent.

Change History (1)

comment:1 Changed 2 years ago by Tim Graham

Triage Stage: UnreviewedAccepted
Note: See TracTickets for help on using tickets.
Back to Top