Loading django/apps/registry.py +12 −6 Original line number Diff line number Diff line Loading @@ -19,11 +19,12 @@ class Apps(object): It also keeps track of models eg. to provide reverse-relations. """ def __init__(self, master=False): # Only one master registry may exist at a given time, and it shall be # the apps variable defined at the end of this module. if master and hasattr(sys.modules[__name__], 'apps'): raise RuntimeError("You may create only one master registry.") def __init__(self, installed_apps=()): # installed_apps is set to None when creating the master registry # because it cannot be populated at that point. Other registries must # provide a list of installed apps and are populated immediately. if installed_apps is None and hasattr(sys.modules[__name__], 'apps'): raise RuntimeError("You must supply an installed_apps argument.") # Mapping of app labels => model names => model classes. Every time a # model is imported, ModelBase.__new__ calls apps.register_model which Loading @@ -48,6 +49,11 @@ class Apps(object): # Pending lookups for lazy relations. self._pending_lookups = {} # Populate apps and models, unless it's the master registry. if installed_apps is not None: self.populate_apps(installed_apps) self.populate_models() def populate_apps(self, installed_apps=None): """ Populate app-related information. Loading Loading @@ -442,4 +448,4 @@ class Apps(object): self.register_model(app_label, model) apps = Apps(master=True) apps = Apps(installed_apps=None) django/db/migrations/state.py +1 −4 Original line number Diff line number Diff line Loading @@ -33,12 +33,9 @@ class ProjectState(object): def render(self): "Turns the project state into actual models in a new Apps" if self.apps is None: self.apps = Apps() # Populate the app registry with a stub for each application. app_labels = set(model_state.app_label for model_state in self.models.values()) app_configs = [AppConfigStub(label) for label in sorted(app_labels)] self.apps.populate_apps(app_configs) self.apps.populate_models() self.apps = Apps([AppConfigStub(label) for label in sorted(app_labels)]) # We keep trying to render the models in a loop, ignoring invalid # base errors, until the size of the unrendered models doesn't # decrease by at least one, meaning there's a base dependency loop/ Loading tests/apps/models.py +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ from django.db import models # We're testing app registry presence on load, so this is handy. new_apps = Apps() new_apps = Apps(['apps']) class TotallyNormal(models.Model): Loading tests/apps/tests.py +4 −13 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ class AppsTests(TestCase): Ensures that only one master registry can exist. """ with self.assertRaises(RuntimeError): Apps(master=True) Apps(installed_apps=None) def test_ready(self): """ Loading @@ -44,17 +44,8 @@ class AppsTests(TestCase): """ # The master app registry is always ready when the tests run. self.assertTrue(apps.ready) def test_non_master_ready(self): """ Tests the ready property of a registry other than the master. """ apps = Apps() self.assertFalse(apps.ready) apps.populate_apps([]) self.assertFalse(apps.ready) apps.populate_models() self.assertTrue(apps.ready) # Non-master app registries are populated in __init__. self.assertTrue(Apps().ready) def test_bad_app_config(self): """ Loading Loading @@ -162,7 +153,7 @@ class AppsTests(TestCase): old_models = list(apps.get_app_config("apps").get_models()) # Construct a new model in a new app registry body = {} new_apps = Apps() new_apps = Apps(["apps"]) meta_contents = { 'app_label': "apps", 'apps': new_apps, Loading tests/migrations/test_state.py +3 −3 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ class StateTests(TestCase): Tests making a ProjectState from an Apps """ new_apps = Apps() new_apps = Apps(["migrations"]) class Author(models.Model): name = models.CharField(max_length=255) Loading Loading @@ -108,7 +108,7 @@ class StateTests(TestCase): apps = Apps() # First, test rendering individually apps = Apps() apps = Apps(["migrations"]) # We shouldn't be able to render yet ms = ModelState.from_model(Novel) Loading @@ -135,7 +135,7 @@ class StateTests(TestCase): app_label = "migrations" apps = Apps() apps = Apps() apps = Apps(["migrations"]) # We shouldn't be able to render yet ms = ModelState.from_model(FooBar) Loading Loading
django/apps/registry.py +12 −6 Original line number Diff line number Diff line Loading @@ -19,11 +19,12 @@ class Apps(object): It also keeps track of models eg. to provide reverse-relations. """ def __init__(self, master=False): # Only one master registry may exist at a given time, and it shall be # the apps variable defined at the end of this module. if master and hasattr(sys.modules[__name__], 'apps'): raise RuntimeError("You may create only one master registry.") def __init__(self, installed_apps=()): # installed_apps is set to None when creating the master registry # because it cannot be populated at that point. Other registries must # provide a list of installed apps and are populated immediately. if installed_apps is None and hasattr(sys.modules[__name__], 'apps'): raise RuntimeError("You must supply an installed_apps argument.") # Mapping of app labels => model names => model classes. Every time a # model is imported, ModelBase.__new__ calls apps.register_model which Loading @@ -48,6 +49,11 @@ class Apps(object): # Pending lookups for lazy relations. self._pending_lookups = {} # Populate apps and models, unless it's the master registry. if installed_apps is not None: self.populate_apps(installed_apps) self.populate_models() def populate_apps(self, installed_apps=None): """ Populate app-related information. Loading Loading @@ -442,4 +448,4 @@ class Apps(object): self.register_model(app_label, model) apps = Apps(master=True) apps = Apps(installed_apps=None)
django/db/migrations/state.py +1 −4 Original line number Diff line number Diff line Loading @@ -33,12 +33,9 @@ class ProjectState(object): def render(self): "Turns the project state into actual models in a new Apps" if self.apps is None: self.apps = Apps() # Populate the app registry with a stub for each application. app_labels = set(model_state.app_label for model_state in self.models.values()) app_configs = [AppConfigStub(label) for label in sorted(app_labels)] self.apps.populate_apps(app_configs) self.apps.populate_models() self.apps = Apps([AppConfigStub(label) for label in sorted(app_labels)]) # We keep trying to render the models in a loop, ignoring invalid # base errors, until the size of the unrendered models doesn't # decrease by at least one, meaning there's a base dependency loop/ Loading
tests/apps/models.py +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ from django.db import models # We're testing app registry presence on load, so this is handy. new_apps = Apps() new_apps = Apps(['apps']) class TotallyNormal(models.Model): Loading
tests/apps/tests.py +4 −13 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ class AppsTests(TestCase): Ensures that only one master registry can exist. """ with self.assertRaises(RuntimeError): Apps(master=True) Apps(installed_apps=None) def test_ready(self): """ Loading @@ -44,17 +44,8 @@ class AppsTests(TestCase): """ # The master app registry is always ready when the tests run. self.assertTrue(apps.ready) def test_non_master_ready(self): """ Tests the ready property of a registry other than the master. """ apps = Apps() self.assertFalse(apps.ready) apps.populate_apps([]) self.assertFalse(apps.ready) apps.populate_models() self.assertTrue(apps.ready) # Non-master app registries are populated in __init__. self.assertTrue(Apps().ready) def test_bad_app_config(self): """ Loading Loading @@ -162,7 +153,7 @@ class AppsTests(TestCase): old_models = list(apps.get_app_config("apps").get_models()) # Construct a new model in a new app registry body = {} new_apps = Apps() new_apps = Apps(["apps"]) meta_contents = { 'app_label': "apps", 'apps': new_apps, Loading
tests/migrations/test_state.py +3 −3 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ class StateTests(TestCase): Tests making a ProjectState from an Apps """ new_apps = Apps() new_apps = Apps(["migrations"]) class Author(models.Model): name = models.CharField(max_length=255) Loading Loading @@ -108,7 +108,7 @@ class StateTests(TestCase): apps = Apps() # First, test rendering individually apps = Apps() apps = Apps(["migrations"]) # We shouldn't be able to render yet ms = ModelState.from_model(Novel) Loading @@ -135,7 +135,7 @@ class StateTests(TestCase): app_label = "migrations" apps = Apps() apps = Apps() apps = Apps(["migrations"]) # We shouldn't be able to render yet ms = ModelState.from_model(FooBar) Loading