From 5bdda19f58779ba556faadbbd16f71d901d06230 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 9 Feb 2021 11:41:11 +1000 Subject: [PATCH] [processing] Automatically load the native and 3d providers when a script calls Processing.initialize() if they are not already loaded This means the following ugly code can be avoided: Processing.initialize() QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms(QgsApplication.processingRegistry())) QgsApplication.processingRegistry().addProvider(Qgs3DAlgorithms(QgsApplication.processingRegistry())) and instead the call to Processing.initialize() is sufficient to load ALL providers Fixes #41310 (cherry picked from commit b4025442e8faede81766806c1c5ff4c5a4a95c0d) --- python/plugins/processing/core/Processing.py | 15 +++++++++++++++ .../processing/tests/AlgorithmsTestBase.py | 1 - .../processing/tests/CheckValidityAlgorithm.py | 1 - .../processing/tests/ProcessingGeneralTest.py | 1 - .../processing/tests/QgisAlgorithmsTest1.py | 4 ---- .../processing/tests/QgisAlgorithmsTest2.py | 4 ---- .../processing/tests/QgisAlgorithmsTest3.py | 4 ---- .../processing/tests/QgisAlgorithmsTest4.py | 7 ++++++- 8 files changed, 21 insertions(+), 16 deletions(-) diff --git a/python/plugins/processing/core/Processing.py b/python/plugins/processing/core/Processing.py index 6b6e6d5a72df..ffb74ab01a91 100644 --- a/python/plugins/processing/core/Processing.py +++ b/python/plugins/processing/core/Processing.py @@ -42,6 +42,7 @@ QgsProcessingOutputMultipleLayers, QgsProcessingFeedback, QgsRuntimeProfiler) +from qgis.analysis import QgsNativeAlgorithms import processing from processing.core.ProcessingConfig import ProcessingConfig @@ -99,6 +100,20 @@ def initialize(): return with QgsRuntimeProfiler.profile('Initialize'): + + # add native provider if not already added + if "native" not in [p.id() for p in QgsApplication.processingRegistry().providers()]: + QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms(QgsApplication.processingRegistry())) + + # add 3d provider if available and not already added + if "3d" not in [p.id() for p in QgsApplication.processingRegistry().providers()]: + try: + from qgis._3d import Qgs3DAlgorithms + QgsApplication.processingRegistry().addProvider(Qgs3DAlgorithms(QgsApplication.processingRegistry())) + except ImportError: + # no 3d library available + pass + # Add the basic providers for c in [ QgisAlgorithmProvider, diff --git a/python/plugins/processing/tests/AlgorithmsTestBase.py b/python/plugins/processing/tests/AlgorithmsTestBase.py index 2f9becd8d810..e862e3e31901 100644 --- a/python/plugins/processing/tests/AlgorithmsTestBase.py +++ b/python/plugins/processing/tests/AlgorithmsTestBase.py @@ -404,7 +404,6 @@ def setUpClass(cls): start_app() from processing.core.Processing import Processing Processing.initialize() - QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) cls.cleanup_paths = [] @classmethod diff --git a/python/plugins/processing/tests/CheckValidityAlgorithm.py b/python/plugins/processing/tests/CheckValidityAlgorithm.py index f0083a73a6ce..927981ff5079 100644 --- a/python/plugins/processing/tests/CheckValidityAlgorithm.py +++ b/python/plugins/processing/tests/CheckValidityAlgorithm.py @@ -54,7 +54,6 @@ def setUpClass(cls): "QGIS_TestPyQgsProcessingCheckValidity") QgsSettings().clear() Processing.initialize() - QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) cls.registry = QgsApplication.instance().processingRegistry() def _make_layer(self, layer_wkb_name): diff --git a/python/plugins/processing/tests/ProcessingGeneralTest.py b/python/plugins/processing/tests/ProcessingGeneralTest.py index 18cc83a41213..f48737588d79 100644 --- a/python/plugins/processing/tests/ProcessingGeneralTest.py +++ b/python/plugins/processing/tests/ProcessingGeneralTest.py @@ -44,7 +44,6 @@ def setUpClass(cls): start_app() from processing.core.Processing import Processing Processing.initialize() - QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) cls.cleanup_paths = [] cls.in_place_layers = {} cls.vector_layer_params = {} diff --git a/python/plugins/processing/tests/QgisAlgorithmsTest1.py b/python/plugins/processing/tests/QgisAlgorithmsTest1.py index 17934262dbcb..88da9c044f47 100644 --- a/python/plugins/processing/tests/QgisAlgorithmsTest1.py +++ b/python/plugins/processing/tests/QgisAlgorithmsTest1.py @@ -67,12 +67,9 @@ def setUpClass(cls): start_app() from processing.core.Processing import Processing Processing.initialize() - ProcessingConfig.setSettingValue(ModelerUtils.MODELS_FOLDER, os.path.join(os.path.dirname(__file__), 'models')) - QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) cls.cleanup_paths = [] cls.in_place_layers = {} cls.vector_layer_params = {} - cls._original_models_folder = ProcessingConfig.getSetting(ModelerUtils.MODELS_FOLDER) @classmethod def tearDownClass(cls): @@ -80,7 +77,6 @@ def tearDownClass(cls): Processing.deinitialize() for path in cls.cleanup_paths: shutil.rmtree(path) - ProcessingConfig.setSettingValue(ModelerUtils.MODELS_FOLDER, cls._original_models_folder) def test_definition_file(self): return 'qgis_algorithm_tests1.yaml' diff --git a/python/plugins/processing/tests/QgisAlgorithmsTest2.py b/python/plugins/processing/tests/QgisAlgorithmsTest2.py index b41a8bfdf42b..6af29aa18c88 100644 --- a/python/plugins/processing/tests/QgisAlgorithmsTest2.py +++ b/python/plugins/processing/tests/QgisAlgorithmsTest2.py @@ -42,12 +42,9 @@ def setUpClass(cls): start_app() from processing.core.Processing import Processing Processing.initialize() - ProcessingConfig.setSettingValue(ModelerUtils.MODELS_FOLDER, os.path.join(os.path.dirname(__file__), 'models')) - QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) cls.cleanup_paths = [] cls.in_place_layers = {} cls.vector_layer_params = {} - cls._original_models_folder = ProcessingConfig.getSetting(ModelerUtils.MODELS_FOLDER) @classmethod def tearDownClass(cls): @@ -55,7 +52,6 @@ def tearDownClass(cls): Processing.deinitialize() for path in cls.cleanup_paths: shutil.rmtree(path) - ProcessingConfig.setSettingValue(ModelerUtils.MODELS_FOLDER, cls._original_models_folder) def test_definition_file(self): return 'qgis_algorithm_tests2.yaml' diff --git a/python/plugins/processing/tests/QgisAlgorithmsTest3.py b/python/plugins/processing/tests/QgisAlgorithmsTest3.py index 3e78741152ce..09943416c1e7 100644 --- a/python/plugins/processing/tests/QgisAlgorithmsTest3.py +++ b/python/plugins/processing/tests/QgisAlgorithmsTest3.py @@ -42,12 +42,9 @@ def setUpClass(cls): start_app() from processing.core.Processing import Processing Processing.initialize() - ProcessingConfig.setSettingValue(ModelerUtils.MODELS_FOLDER, os.path.join(os.path.dirname(__file__), 'models')) - QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) cls.cleanup_paths = [] cls.in_place_layers = {} cls.vector_layer_params = {} - cls._original_models_folder = ProcessingConfig.getSetting(ModelerUtils.MODELS_FOLDER) @classmethod def tearDownClass(cls): @@ -55,7 +52,6 @@ def tearDownClass(cls): Processing.deinitialize() for path in cls.cleanup_paths: shutil.rmtree(path) - ProcessingConfig.setSettingValue(ModelerUtils.MODELS_FOLDER, cls._original_models_folder) def test_definition_file(self): return 'qgis_algorithm_tests3.yaml' diff --git a/python/plugins/processing/tests/QgisAlgorithmsTest4.py b/python/plugins/processing/tests/QgisAlgorithmsTest4.py index 438a0e4114d7..f909cbfd7dd0 100644 --- a/python/plugins/processing/tests/QgisAlgorithmsTest4.py +++ b/python/plugins/processing/tests/QgisAlgorithmsTest4.py @@ -42,8 +42,13 @@ def setUpClass(cls): start_app() from processing.core.Processing import Processing Processing.initialize() + + # change the model provider folder so that it looks in the test directory for models ProcessingConfig.setSettingValue(ModelerUtils.MODELS_FOLDER, os.path.join(os.path.dirname(__file__), 'models')) - QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) + for p in QgsApplication.processingRegistry().providers(): + if p.id() == "model": + p.refreshAlgorithms() + cls.cleanup_paths = [] cls.in_place_layers = {} cls.vector_layer_params = {}