From 6a98396b9da56bf5eb1c94e037b844eb9bdd1a45 Mon Sep 17 00:00:00 2001 From: Caio Ariede Date: Sun, 23 Aug 2015 21:07:00 -0300 Subject: [PATCH] Fixed #25246 -- Guarded against duplicate paths in AppConfig. --- django/apps/config.py | 4 ++++ tests/apps/tests.py | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/django/apps/config.py b/django/apps/config.py index 98070e62c8..6a0c8d8e57 100644 --- a/django/apps/config.py +++ b/django/apps/config.py @@ -62,6 +62,10 @@ class AppConfig(object): filename = getattr(module, '__file__', None) if filename is not None: paths = [os.path.dirname(filename)] + else: + # For unknown reasons, sometimes the list returned by __path__ + # contains duplicates that must be removed (#25246). + paths = list(set(paths)) if len(paths) > 1: raise ImproperlyConfigured( "The app module %r has multiple filesystem locations (%r); " diff --git a/tests/apps/tests.py b/tests/apps/tests.py index ae8f0c6c92..9e34773a77 100644 --- a/tests/apps/tests.py +++ b/tests/apps/tests.py @@ -365,6 +365,14 @@ class AppConfigTests(SimpleTestCase): with self.assertRaises(ImproperlyConfigured): AppConfig('label', Stub(__path__=['a', 'b'])) + def test_duplicate_dunder_path_no_dunder_file(self): + """ + If the __path__ attr contains duplicate paths and there is no + __file__, they duplicates should be deduplicated (#25246). + """ + ac = AppConfig('label', Stub(__path__=['a', 'a'])) + self.assertEqual(ac.path, 'a') + @skipUnless(six.PY3, "Namespace packages sans __init__.py were added in Python 3.3") class NamespacePackageAppTests(SimpleTestCase):