def test_create_from_entrypoint_with_custom_metadata(self): """Testing ExtensionInfo.create_from_entrypoint with custom Extension.metadata """ package_name = 'DummyExtension' module_name = 'test_extension.dummy.submodule' extension_id = '%s:DummyExtension' % module_name class TestExtension(Extension): __module__ = module_name id = extension_id metadata = { 'Name': 'OverrideName', 'Version': '3.14159', 'Summary': 'Lorem ipsum dolor sit amet.', 'Description': 'Tempus fugit.', 'License': 'None', 'Home-page': 'http://127.0.0.1/', } entrypoint = FakeEntryPoint(TestExtension, project_name=package_name) extension_info = ExtensionInfo.create_from_entrypoint(entrypoint, TestExtension) expected_metadata = entrypoint.dist.metadata.copy() expected_metadata.update(TestExtension.metadata) self._check_extension_info(extension_info=extension_info, app_name='test_extension.dummy', package_name=package_name, extension_id=extension_id, metadata=expected_metadata)
def test_create_from_entrypoint_with_custom_metadata(self): """Testing ExtensionInfo.create_from_entrypoint with custom Extension.metadata """ package_name = 'DummyExtension' module_name = 'test_extension.dummy.submodule' extension_id = '%s:DummyExtension' % module_name class TestExtension(Extension): __module__ = module_name id = extension_id metadata = { 'Name': 'OverrideName', 'Version': '3.14159', 'Summary': 'Lorem ipsum dolor sit amet.', 'Description': 'Tempus fugit.', 'License': 'None', 'Home-page': 'http://127.0.0.1/', } entrypoint = FakeEntryPoint(TestExtension, project_name=package_name) extension_info = ExtensionInfo.create_from_entrypoint(entrypoint, TestExtension) expected_metadata = entrypoint.dist.metadata.copy() expected_metadata.update(TestExtension.metadata) self._check_extension_info(extension_info=extension_info, app_name='test_extension.dummy', package_name=package_name, extension_id=extension_id, metadata=expected_metadata)
def test_create_from_entrypoint(self): """Testing ExtensionInfo.create_from_entrypoint""" module_name = 'test_extension.dummy.submodule' package_name = 'DummyExtension' extension_id = '%s:DummyExtension' % module_name class TestExtension(Extension): __module__ = module_name id = extension_id entrypoint = FakeEntryPoint(TestExtension, project_name=package_name) extension_info = ExtensionInfo.create_from_entrypoint(entrypoint, TestExtension) self._check_extension_info(extension_info=extension_info, app_name='test_extension.dummy', package_name=package_name, extension_id=extension_id, metadata=entrypoint.dist.metadata)
def test_create_from_entrypoint(self): """Testing ExtensionInfo.create_from_entrypoint""" module_name = 'test_extension.dummy.submodule' package_name = 'DummyExtension' extension_id = '%s:DummyExtension' % module_name class TestExtension(Extension): __module__ = module_name id = extension_id entrypoint = FakeEntryPoint(TestExtension, project_name=package_name) extension_info = ExtensionInfo.create_from_entrypoint(entrypoint, TestExtension) self._check_extension_info(extension_info=extension_info, app_name='test_extension.dummy', package_name=package_name, extension_id=extension_id, metadata=entrypoint.dist.metadata)
def _load_extensions(self, full_reload=False): if full_reload: # We're reloading everything, so nuke all the cached copies. self._clear_extensions() self._clear_template_cache() self._load_errors = {} # Preload all the RegisteredExtension objects registered_extensions = {} for registered_ext in RegisteredExtension.objects.all(): registered_extensions[registered_ext.class_name] = registered_ext found_extensions = {} found_registrations = {} registrations_to_fetch = [] find_registrations = False extensions_changed = False for entrypoint in self._entrypoint_iterator(): registered_ext = None try: ext_class = entrypoint.load() except Exception as e: logging.exception("Error loading extension %s: %s" % (entrypoint.name, e)) extension_id = '%s.%s' % (entrypoint.module_name, '.'.join( entrypoint.attrs)) self._store_load_error(extension_id, e) continue # A class's extension ID is its class name. We want to # make this easier for users to access by giving it an 'id' # variable, which will be accessible both on the class and on # instances. class_name = ext_class.id = "%s.%s" % (ext_class.__module__, ext_class.__name__) self._extension_classes[class_name] = ext_class found_extensions[class_name] = ext_class # Don't override the info if we've previously loaded this # class. if not getattr(ext_class, 'info', None): ext_class.info = ExtensionInfo.create_from_entrypoint( entrypoint, ext_class) registered_ext = registered_extensions.get(class_name) if registered_ext: found_registrations[class_name] = registered_ext if not hasattr(ext_class, 'registration'): find_registrations = True else: registrations_to_fetch.append( (class_name, entrypoint.dist.project_name)) find_registrations = True if find_registrations: if registrations_to_fetch: stored_registrations = list( RegisteredExtension.objects.filter( class_name__in=registrations_to_fetch)) # Go through the list of registrations found in the database # and mark them as found for later processing. for registered_ext in stored_registrations: class_name = registered_ext.class_name found_registrations[class_name] = registered_ext # Go through each registration we still need and couldn't find, # and create an entry in the database. These are going to be # newly discovered extensions. for class_name, ext_name in registrations_to_fetch: if class_name not in found_registrations: try: registered_ext = RegisteredExtension.objects.create( class_name=class_name, name=ext_name) except IntegrityError: # An entry was created since we last looked up # anything. Fetch it from the database. registered_ext = RegisteredExtension.objects.get( class_name=class_name) found_registrations[class_name] = registered_ext # Now we have all the RegisteredExtension instances. Go through # and initialize each of them. for class_name, registered_ext in six.iteritems(found_registrations): ext_class = found_extensions[class_name] ext_class.registration = registered_ext if (ext_class.registration.enabled and ext_class.id not in self._extension_instances): try: self._init_extension(ext_class) except EnablingExtensionError: # When in debug mode, we want this error to be noticed. # However, in production, it shouldn't break the whole # server, so continue on. if not settings.DEBUG: continue extensions_changed = True # At this point, if we're reloading, it's possible that the user # has removed some extensions. Go through and remove any that we # can no longer find. # # While we're at it, since we're at a point where we've seen all # extensions, we can set the ExtensionInfo.requirements for # each extension for class_name, ext_class in six.iteritems(self._extension_classes): if class_name not in found_extensions: if class_name in self._extension_instances: self.disable_extension(class_name) del self._extension_classes[class_name] extensions_changed = True else: ext_class.info.requirements = \ [self.get_installed_extension(requirement_id) for requirement_id in ext_class.requirements] # Add the sync generation if it doesn't already exist. self._gen_sync.refresh() settings.AJAX_SERIAL = self._gen_sync.sync_gen if extensions_changed: self._recalculate_middleware()
def _load_extensions(self, full_reload=False): if full_reload: # We're reloading everything, so nuke all the cached copies. self._clear_extensions() clear_template_caches() self._load_errors = {} # Preload all the RegisteredExtension objects registered_extensions = {} for registered_ext in RegisteredExtension.objects.all(): registered_extensions[registered_ext.class_name] = registered_ext found_extensions = {} found_registrations = {} registrations_to_fetch = [] find_registrations = False extensions_changed = False for entrypoint in self._entrypoint_iterator(): registered_ext = None try: ext_class = entrypoint.load() except Exception as e: logger.exception('Error loading extension %s: %s', entrypoint.name, e) extension_id = '%s.%s' % (entrypoint.module_name, '.'.join(entrypoint.attrs)) self._store_load_error(extension_id, e) continue # A class's extension ID is its class name. We want to # make this easier for users to access by giving it an 'id' # variable, which will be accessible both on the class and on # instances. class_name = ext_class.id = "%s.%s" % (ext_class.__module__, ext_class.__name__) self._extension_classes[class_name] = ext_class found_extensions[class_name] = ext_class # Don't override the info if we've previously loaded this # class. if not getattr(ext_class, 'info', None): ext_class.info = ExtensionInfo.create_from_entrypoint( entrypoint, ext_class) registered_ext = registered_extensions.get(class_name) if registered_ext: found_registrations[class_name] = registered_ext if not hasattr(ext_class, 'registration'): find_registrations = True else: registrations_to_fetch.append( (class_name, entrypoint.dist.project_name)) find_registrations = True if find_registrations: if registrations_to_fetch: stored_registrations = list( RegisteredExtension.objects.filter( class_name__in=registrations_to_fetch)) # Go through the list of registrations found in the database # and mark them as found for later processing. for registered_ext in stored_registrations: class_name = registered_ext.class_name found_registrations[class_name] = registered_ext # Go through each registration we still need and couldn't find, # and create an entry in the database. These are going to be # newly discovered extensions. for class_name, ext_name in registrations_to_fetch: if class_name not in found_registrations: try: registered_ext = RegisteredExtension.objects.create( class_name=class_name, name=ext_name) except IntegrityError: # An entry was created since we last looked up # anything. Fetch it from the database. registered_ext = RegisteredExtension.objects.get( class_name=class_name) found_registrations[class_name] = registered_ext # Now we have all the RegisteredExtension instances. Go through # and initialize each of them. for class_name, registered_ext in six.iteritems(found_registrations): ext_class = found_extensions[class_name] ext_class.registration = registered_ext if (ext_class.registration.enabled and ext_class.id not in self._extension_instances): try: self._init_extension(ext_class) except EnablingExtensionError: # When in debug mode, we want this error to be noticed. # However, in production, it shouldn't break the whole # server, so continue on. if not settings.DEBUG: continue extensions_changed = True # At this point, if we're reloading, it's possible that the user # has removed some extensions. Go through and remove any that we # can no longer find. # # While we're at it, since we're at a point where we've seen all # extensions, we can set the ExtensionInfo.requirements for # each extension for class_name, ext_class in six.iteritems(self._extension_classes): if class_name not in found_extensions: if class_name in self._extension_instances: self.disable_extension(class_name) del self._extension_classes[class_name] extensions_changed = True else: ext_class.info.requirements = \ [self.get_installed_extension(requirement_id) for requirement_id in ext_class.requirements] # Add the sync generation if it doesn't already exist. self._gen_sync.refresh() settings.AJAX_SERIAL = self._gen_sync.sync_gen if extensions_changed: self._recalculate_middleware()