Prechádzať zdrojové kódy

Removed BaseAppCache.app_store.

It was only storing redundant information. This is part of the effort to
allow applications without a models module.
Aymeric Augustin 11 rokov pred
rodič
commit
9217b89da3

+ 13 - 19
django/apps/cache.py

@@ -39,11 +39,8 @@ def _initialize():
     [shared] state of the app cache.
     """
     return dict(
-        # Keys of app_store are the model modules for each application.
-        app_store=ModelDict(),
-
         # Mapping of installed app_labels to model modules for that app.
-        app_labels={},
+        app_labels=OrderedDict(),
 
         # Mapping of app_labels to a dictionary of model names to model code.
         # May contain apps that are not installed.
@@ -154,9 +151,9 @@ class BaseAppCache(object):
                     raise
 
         self.nesting_level -= 1
-        if models not in self.app_store:
-            self.app_store[models] = len(self.app_store)
-            self.app_labels[self._label_for(models)] = models
+        label = self._label_for(models)
+        if label not in self.app_labels:
+            self.app_labels[label] = models
         return models
 
     def app_cache_ready(self):
@@ -174,17 +171,13 @@ class BaseAppCache(object):
         """
         self._populate()
 
-        apps = self.app_store.items()
+        # app_labels is an OrderedDict, which ensures that the returned list
+        # is always in the same order (with new apps added at the end). This
+        # avoids unstable ordering on the admin app list page, for example.
+        apps = self.app_labels.items()
         if self.available_apps is not None:
-            apps = [elt for elt in apps
-                    if self._label_for(elt[0]) in self.available_apps]
-
-        # Ensure the returned list is always in the same order (with new apps
-        # added at the end). This avoids unstable ordering on the admin app
-        # list page, for example.
-        apps = sorted(apps, key=lambda elt: elt[1])
-
-        return [elt[0] for elt in apps]
+            apps = [app for app in apps if app[0] in self.available_apps]
+        return [app[1] for app in apps]
 
     def _get_app_package(self, app):
         return '.'.join(app.__name__.split('.')[:-1])
@@ -282,8 +275,9 @@ class BaseAppCache(object):
             pass
         self._populate()
         if app_mod:
-            if app_mod in self.app_store:
-                app_list = [self.app_models.get(self._label_for(app_mod), ModelDict())]
+            app_label = self._label_for(app_mod)
+            if app_label in self.app_labels:
+                app_list = [self.app_models.get(app_label, ModelDict())]
             else:
                 app_list = []
         else:

+ 0 - 2
tests/app_loading/tests.py

@@ -20,12 +20,10 @@ class EggLoadingTest(TestCase):
         # need to be removed in order to prevent bad interactions
         # with the flush operation in other tests.
         self.old_app_models = copy.deepcopy(cache.app_models)
-        self.old_app_store = copy.deepcopy(cache.app_store)
 
     def tearDown(self):
         sys.path = self.old_path
         cache.app_models = self.old_app_models
-        cache.app_store = self.old_app_store
 
     def test_egg1(self):
         """Models module can be loaded from an app in an egg"""

+ 0 - 2
tests/invalid_models/tests.py

@@ -23,11 +23,9 @@ class InvalidModelTestCase(unittest.TestCase):
         # need to be removed in order to prevent bad interactions
         # with the flush operation in other tests.
         self.old_app_models = copy.deepcopy(cache.app_models)
-        self.old_app_store = copy.deepcopy(cache.app_store)
 
     def tearDown(self):
         cache.app_models = self.old_app_models
-        cache.app_store = self.old_app_store
         cache._get_models_cache = {}
         sys.stdout = self.old_stdout
 

+ 0 - 6
tests/managers_regress/tests.py

@@ -115,7 +115,6 @@ class ManagersRegressionTests(TestCase):
             # need to be removed in order to prevent bad interactions
             # with the flush operation in other tests.
             old_app_models = copy.deepcopy(cache.app_models)
-            old_app_store = copy.deepcopy(cache.app_store)
 
             class SwappableModel(models.Model):
                 class Meta:
@@ -131,7 +130,6 @@ class ManagersRegressionTests(TestCase):
 
         finally:
             cache.app_models = old_app_models
-            cache.app_store = old_app_store
 
     @override_settings(TEST_SWAPPABLE_MODEL='managers_regress.Parent')
     def test_custom_swappable_manager(self):
@@ -140,7 +138,6 @@ class ManagersRegressionTests(TestCase):
             # need to be removed in order to prevent bad interactions
             # with the flush operation in other tests.
             old_app_models = copy.deepcopy(cache.app_models)
-            old_app_store = copy.deepcopy(cache.app_store)
 
             class SwappableModel(models.Model):
 
@@ -160,7 +157,6 @@ class ManagersRegressionTests(TestCase):
 
         finally:
             cache.app_models = old_app_models
-            cache.app_store = old_app_store
 
     @override_settings(TEST_SWAPPABLE_MODEL='managers_regress.Parent')
     def test_explicit_swappable_manager(self):
@@ -169,7 +165,6 @@ class ManagersRegressionTests(TestCase):
             # need to be removed in order to prevent bad interactions
             # with the flush operation in other tests.
             old_app_models = copy.deepcopy(cache.app_models)
-            old_app_store = copy.deepcopy(cache.app_store)
 
             class SwappableModel(models.Model):
 
@@ -189,7 +184,6 @@ class ManagersRegressionTests(TestCase):
 
         finally:
             cache.app_models = old_app_models
-            cache.app_store = old_app_store
 
     def test_regress_3871(self):
         related = RelatedModel.objects.create()

+ 0 - 2
tests/migrations/test_commands.py

@@ -133,11 +133,9 @@ class MakeMigrationsTests(MigrationTestBase):
         self.migration_dir = os.path.join(self.test_dir, 'migrations_%d' % self.creation_counter)
         self.migration_pkg = "migrations.migrations_%d" % self.creation_counter
         self._old_app_models = copy.deepcopy(cache.app_models)
-        self._old_app_store = copy.deepcopy(cache.app_store)
 
     def tearDown(self):
         cache.app_models = self._old_app_models
-        cache.app_store = self._old_app_store
         cache._get_models_cache = {}
 
         os.chdir(self.test_dir)

+ 7 - 13
tests/migrations/test_writer.py

@@ -2,7 +2,6 @@
 
 from __future__ import unicode_literals
 
-import copy
 import datetime
 import os
 
@@ -116,8 +115,6 @@ class WriterTests(TestCase):
         self.assertIn("Migration", result)
 
     def test_migration_path(self):
-        _old_app_store = copy.deepcopy(cache.app_store)
-
         test_apps = [
             'migrations.migrations_test_apps.normal',
             'migrations.migrations_test_apps.with_package_model',
@@ -125,13 +122,10 @@ class WriterTests(TestCase):
 
         base_dir = os.path.dirname(os.path.dirname(__file__))
 
-        try:
-            with override_settings(INSTALLED_APPS=test_apps):
-                for app in test_apps:
-                    cache.load_app(app)
-                    migration = migrations.Migration('0001_initial', app.split('.')[-1])
-                    expected_path = os.path.join(base_dir, *(app.split('.') + ['migrations', '0001_initial.py']))
-                    writer = MigrationWriter(migration)
-                    self.assertEqual(writer.path, expected_path)
-        finally:
-            cache.app_store = _old_app_store
+        with override_settings(INSTALLED_APPS=test_apps):
+            for app in test_apps:
+                cache.load_app(app)
+                migration = migrations.Migration('0001_initial', app.split('.')[-1])
+                expected_path = os.path.join(base_dir, *(app.split('.') + ['migrations', '0001_initial.py']))
+                writer = MigrationWriter(migration)
+                self.assertEqual(writer.path, expected_path)

+ 0 - 2
tests/proxy_model_inheritance/tests.py

@@ -32,8 +32,6 @@ class ProxyModelInheritanceTests(TransactionTestCase):
 
     def tearDown(self):
         sys.path = self.old_sys_path
-        del cache.app_store[cache.app_labels['app1']]
-        del cache.app_store[cache.app_labels['app2']]
         del cache.app_labels['app1']
         del cache.app_labels['app2']
         del cache.app_models['app1']

+ 0 - 2
tests/proxy_models/tests.py

@@ -160,7 +160,6 @@ class ProxyModelTests(TestCase):
             # need to be removed in order to prevent bad interactions
             # with the flush operation in other tests.
             old_app_models = copy.deepcopy(cache.app_models)
-            old_app_store = copy.deepcopy(cache.app_store)
 
             class SwappableModel(models.Model):
 
@@ -178,7 +177,6 @@ class ProxyModelTests(TestCase):
                         proxy = True
         finally:
             cache.app_models = old_app_models
-            cache.app_store = old_app_store
 
     def test_myperson_manager(self):
         Person.objects.create(name="fred")

+ 0 - 2
tests/tablespaces/tests.py

@@ -29,7 +29,6 @@ class TablespacesTests(TestCase):
         # The unmanaged models need to be removed after the test in order to
         # prevent bad interactions with the flush operation in other tests.
         self.old_app_models = copy.deepcopy(cache.app_models)
-        self.old_app_store = copy.deepcopy(cache.app_store)
 
         for model in Article, Authors, Reviewers, Scientist:
             model._meta.managed = True
@@ -39,7 +38,6 @@ class TablespacesTests(TestCase):
             model._meta.managed = False
 
         cache.app_models = self.old_app_models
-        cache.app_store = self.old_app_store
         cache._get_models_cache = {}
 
     def assertNumContains(self, haystack, needle, count):