Esempio n. 1
0
    def load_scripts_from_folder(self, folder):
        """
        Loads all scripts found under the specified sub-folder
        """
        if not os.path.exists(folder):
            return []

        algs = []
        for path, _, files in os.walk(folder):
            for description_file in files:
                if description_file.lower().endswith('rsx'):
                    try:
                        fullpath = os.path.join(path, description_file)
                        alg = RAlgorithm(fullpath)
                        if alg.name().strip():
                            algs.append(alg)
                    except InvalidScriptException as e:
                        QgsMessageLog.logMessage(e.msg, self.tr('Processing'),
                                                 Qgis.Critical)
                    except Exception as e:  # pylint: disable=broad-except
                        QgsMessageLog.logMessage(
                            self.tr(
                                'Could not load R script: {0}\n{1}').format(
                                    description_file, str(e)),
                            self.tr('Processing'), Qgis.Critical)
        return algs
 def testBadAlgorithm(self):
     """
     Test a bad script
     """
     alg = RAlgorithm(
         description_file=os.path.join(test_data_path, 'bad_algorithm.rsx'))
     alg.initAlgorithm()
     self.assertEqual(alg.name(), 'bad_algorithm')
     self.assertEqual(alg.displayName(), 'bad algorithm')
     self.assertEqual(
         alg.error,
         'This script has a syntax error.\nProblem with line: polyg=xvector'
     )
    def testScriptParsing(self):  # pylint: disable=too-many-locals,too-many-statements
        """
        Test script file parsing
        """
        alg = RAlgorithm(description_file=os.path.join(test_data_path,
                                                       'test_algorithm_1.rsx'))
        alg.initAlgorithm()
        self.assertFalse(alg.error)
        self.assertEqual(alg.name(), 'test_algorithm_1')
        self.assertEqual(alg.displayName(), 'test algorithm 1')
        self.assertIn('test_algorithm_1.rsx', 'test_algorithm_1.rsx')
        self.assertTrue(alg.show_plots)
        self.assertFalse(alg.r_templates.use_raster)
        self.assertTrue(alg.pass_file_names)

        alg = RAlgorithm(description_file=os.path.join(test_data_path,
                                                       'test_algorithm_2.rsx'))
        alg.initAlgorithm()
        self.assertFalse(alg.error)
        self.assertEqual(alg.name(), 'mytest')
        self.assertEqual(alg.displayName(), 'my test')
        self.assertEqual(alg.group(), 'my group')
        self.assertEqual(alg.groupId(), 'my group')
        self.assertFalse(alg.show_plots)
        self.assertTrue(alg.r_templates.use_raster)
        self.assertFalse(alg.pass_file_names)

        # test that inputs were created correctly
        raster_param = alg.parameterDefinition('in_raster')
        self.assertEqual(raster_param.type(), 'raster')
        vector_param = alg.parameterDefinition('in_vector')
        self.assertEqual(vector_param.type(), 'source')
        field_param = alg.parameterDefinition('in_field')
        self.assertEqual(field_param.type(), 'field')
        self.assertEqual(field_param.parentLayerParameterName(), 'in_vector')
        extent_param = alg.parameterDefinition('in_extent')
        self.assertEqual(extent_param.type(), 'extent')
        string_param = alg.parameterDefinition('in_string')
        self.assertEqual(string_param.type(), 'string')
        file_param = alg.parameterDefinition('in_file')
        self.assertEqual(file_param.type(), 'file')
        number_param = alg.parameterDefinition('in_number')
        self.assertEqual(number_param.type(), 'number')
        self.assertEqual(number_param.dataType(),
                         QgsProcessingParameterNumber.Double)
        enum_param = alg.parameterDefinition('in_enum')
        self.assertEqual(enum_param.type(), 'enum')
        enum_param = alg.parameterDefinition('in_enum2')
        self.assertEqual(enum_param.type(), 'enum')
        self.assertEqual(enum_param.options(),
                         ['normal', 'log10', 'ln', 'sqrt', 'exp'])
        bool_param = alg.parameterDefinition('in_bool')
        self.assertEqual(bool_param.type(), 'boolean')

        # outputs
        vector_output = alg.outputDefinition('out_vector')
        self.assertEqual(vector_output.type(), 'outputVector')
        self.assertEqual(vector_output.dataType(),
                         QgsProcessing.TypeVectorAnyGeometry)
        vector_dest_param = alg.parameterDefinition('param_vector_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorAnyGeometry)

        table_output = alg.outputDefinition('out_table')
        self.assertEqual(table_output.type(), 'outputVector')
        self.assertEqual(table_output.dataType(), QgsProcessing.TypeVector)
        table_dest_param = alg.parameterDefinition('param_table_dest')
        self.assertEqual(table_dest_param.type(), 'vectorDestination')
        self.assertEqual(table_dest_param.dataType(), QgsProcessing.TypeVector)

        vector_dest_param = alg.parameterDefinition('param_vector_dest2')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorAnyGeometry)

        vector_dest_param = alg.parameterDefinition('param_vector_point_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorPoint)

        vector_dest_param = alg.parameterDefinition('param_vector_line_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorLine)

        vector_dest_param = alg.parameterDefinition(
            'param_vector_polygon_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorPolygon)

        raster_output = alg.outputDefinition('out_raster')
        self.assertEqual(raster_output.type(), 'outputRaster')
        raster_dest_param = alg.parameterDefinition('param_raster_dest')
        self.assertEqual(raster_dest_param.type(), 'rasterDestination')
        number_output = alg.outputDefinition('out_number')
        self.assertEqual(number_output.type(), 'outputNumber')
        string_output = alg.outputDefinition('out_string')
        self.assertEqual(string_output.type(), 'outputString')
        layer_output = alg.outputDefinition('out_layer')
        self.assertEqual(layer_output.type(), 'outputLayer')
        folder_output = alg.outputDefinition('out_folder')
        self.assertEqual(folder_output.type(), 'outputFolder')
        folder_dest_param = alg.parameterDefinition('param_folder_dest')
        self.assertEqual(folder_dest_param.type(), 'folderDestination')
        html_output = alg.outputDefinition('out_html')
        self.assertEqual(html_output.type(), 'outputHtml')
        html_dest_param = alg.parameterDefinition('param_html_dest')
        self.assertEqual(html_dest_param.type(), 'fileDestination')
        file_output = alg.outputDefinition('out_file')
        self.assertEqual(file_output.type(), 'outputFile')
        file_dest_param = alg.parameterDefinition('param_file_dest')
        self.assertEqual(file_dest_param.type(), 'fileDestination')
        csv_output = alg.outputDefinition('out_csv')
        self.assertEqual(csv_output.type(), 'outputFile')
        csv_dest_param = alg.parameterDefinition('param_csv_dest')
        self.assertEqual(csv_dest_param.type(), 'fileDestination')
        self.assertEqual(csv_dest_param.defaultFileExtension(), 'csv')

        # test display_name
        alg = RAlgorithm(description_file=os.path.join(test_data_path,
                                                       'test_algorithm_3.rsx'))
        alg.initAlgorithm()
        self.assertFalse(alg.error)
        self.assertEqual(alg.name(), 'thealgid')
        self.assertEqual(alg.displayName(), 'the algo title')
        self.assertEqual(alg.group(), 'my group')
        self.assertEqual(alg.groupId(), 'my group')

        # test that inputs are defined as parameter description
        alg = RAlgorithm(description_file=os.path.join(test_data_path,
                                                       'test_algorithm_4.rsx'))
        alg.initAlgorithm()
        self.assertFalse(alg.error)
        self.assertEqual(alg.name(), 'mytest')
        self.assertEqual(alg.displayName(), 'my test')
        self.assertEqual(alg.group(), 'my group')
        self.assertEqual(alg.groupId(), 'my group')

        raster_param = alg.parameterDefinition('in_raster')
        self.assertEqual(raster_param.type(), 'raster')
        vector_param = alg.parameterDefinition('in_vector')
        self.assertEqual(vector_param.type(), 'source')
        field_param = alg.parameterDefinition('in_field')
        self.assertEqual(field_param.type(), 'field')
        self.assertEqual(field_param.parentLayerParameterName(), 'in_vector')
        extent_param = alg.parameterDefinition('in_extent')
        self.assertEqual(extent_param.type(), 'extent')
        crs_param = alg.parameterDefinition('in_crs')
        self.assertEqual(crs_param.type(), 'crs')
        string_param = alg.parameterDefinition('in_string')
        self.assertEqual(string_param.type(), 'string')
        number_param = alg.parameterDefinition('in_number')
        self.assertEqual(number_param.type(), 'number')
        self.assertEqual(number_param.dataType(),
                         QgsProcessingParameterNumber.Integer)
        enum_param = alg.parameterDefinition('in_enum')
        self.assertEqual(enum_param.type(), 'enum')
        bool_param = alg.parameterDefinition('in_bool')
        self.assertEqual(bool_param.type(), 'boolean')

        file_param = alg.parameterDefinition('in_file')
        self.assertEqual(file_param.type(), 'file')
        self.assertEqual(file_param.behavior(),
                         QgsProcessingParameterFile.File)
        folder_param = alg.parameterDefinition('in_folder')
        self.assertEqual(folder_param.type(), 'file')
        self.assertEqual(folder_param.behavior(),
                         QgsProcessingParameterFile.Folder)
        gpkg_param = alg.parameterDefinition('in_gpkg')
        self.assertEqual(gpkg_param.type(), 'file')
        self.assertEqual(gpkg_param.behavior(),
                         QgsProcessingParameterFile.File)
        self.assertEqual(gpkg_param.extension(), 'gpkg')
        img_param = alg.parameterDefinition('in_img')
        self.assertEqual(img_param.type(), 'file')
        self.assertEqual(img_param.behavior(), QgsProcessingParameterFile.File)
        self.assertEqual(img_param.extension(), '')
        self.assertEqual(img_param.fileFilter(),
                         'PNG Files (*.png);; JPG Files (*.jpg *.jpeg)')

        vector_dest_param = alg.parameterDefinition('param_vector_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorAnyGeometry)
        vector_dest_param = alg.parameterDefinition('param_vector_point_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorPoint)
        vector_dest_param = alg.parameterDefinition('param_vector_line_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorLine)
        vector_dest_param = alg.parameterDefinition(
            'param_vector_polygon_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorPolygon)
        table_dest_param = alg.parameterDefinition('param_table_dest')
        self.assertEqual(table_dest_param.type(), 'vectorDestination')
        self.assertEqual(table_dest_param.dataType(), QgsProcessing.TypeVector)
        raster_dest_param = alg.parameterDefinition('param_raster_dest')
        self.assertEqual(raster_dest_param.type(), 'rasterDestination')

        folder_dest_param = alg.parameterDefinition('param_folder_dest')
        self.assertEqual(folder_dest_param.type(), 'folderDestination')
        file_dest_param = alg.parameterDefinition('param_file_dest')
        self.assertEqual(file_dest_param.type(), 'fileDestination')
        html_dest_param = alg.parameterDefinition('param_html_dest')
        self.assertEqual(html_dest_param.type(), 'fileDestination')
        self.assertEqual(html_dest_param.fileFilter(), 'HTML Files (*.html)')
        self.assertEqual(html_dest_param.defaultFileExtension(), 'html')
        csv_dest_param = alg.parameterDefinition('param_csv_dest')
        self.assertEqual(csv_dest_param.type(), 'fileDestination')
        self.assertEqual(csv_dest_param.fileFilter(), 'CSV Files (*.csv)')
        self.assertEqual(csv_dest_param.defaultFileExtension(), 'csv')
        img_dest_param = alg.parameterDefinition('param_img_dest')
        self.assertEqual(img_dest_param.type(), 'fileDestination')
        self.assertEqual(img_dest_param.fileFilter(),
                         'PNG Files (*.png);; JPG Files (*.jpg *.jpeg)')
        self.assertEqual(img_dest_param.defaultFileExtension(), 'png')
Esempio n. 4
0
    def testScriptParsing(self):  # pylint: disable=too-many-locals,too-many-statements
        """
        Test script file parsing
        """
        alg = RAlgorithm(description_file=os.path.join(test_data_path,
                                                       'test_algorithm_1.rsx'))
        alg.initAlgorithm()
        self.assertFalse(alg.error)
        self.assertEqual(alg.name(), 'test_algorithm_1')
        self.assertEqual(alg.displayName(), 'test algorithm 1')
        self.assertIn('test_algorithm_1.rsx', 'test_algorithm_1.rsx')
        self.assertTrue(alg.show_plots)
        self.assertFalse(alg.use_raster_package)
        self.assertTrue(alg.pass_file_names)

        alg = RAlgorithm(description_file=os.path.join(test_data_path,
                                                       'test_algorithm_2.rsx'))
        alg.initAlgorithm()
        self.assertFalse(alg.error)
        self.assertEqual(alg.name(), 'mytest')
        self.assertEqual(alg.displayName(), 'my test')
        self.assertEqual(alg.group(), 'my group')
        self.assertEqual(alg.groupId(), 'my group')
        self.assertFalse(alg.show_plots)
        self.assertTrue(alg.use_raster_package)
        self.assertFalse(alg.pass_file_names)

        # test that inputs were created correctly
        raster_param = alg.parameterDefinition('in_raster')
        self.assertEqual(raster_param.type(), 'raster')
        vector_param = alg.parameterDefinition('in_vector')
        self.assertEqual(vector_param.type(), 'source')
        field_param = alg.parameterDefinition('in_field')
        self.assertEqual(field_param.type(), 'field')
        self.assertEqual(field_param.parentLayerParameterName(), 'in_vector')
        extent_param = alg.parameterDefinition('in_extent')
        self.assertEqual(extent_param.type(), 'extent')
        string_param = alg.parameterDefinition('in_string')
        self.assertEqual(string_param.type(), 'string')
        file_param = alg.parameterDefinition('in_file')
        self.assertEqual(file_param.type(), 'file')
        number_param = alg.parameterDefinition('in_number')
        self.assertEqual(number_param.type(), 'number')
        self.assertEqual(number_param.dataType(),
                         QgsProcessingParameterNumber.Double)
        enum_param = alg.parameterDefinition('in_enum')
        self.assertEqual(enum_param.type(), 'enum')
        enum_param = alg.parameterDefinition('in_enum2')
        self.assertEqual(enum_param.type(), 'enum')
        self.assertEqual(enum_param.options(),
                         ['normal', 'log10', 'ln', 'sqrt', 'exp'])
        bool_param = alg.parameterDefinition('in_bool')
        self.assertEqual(bool_param.type(), 'boolean')

        # outputs
        vector_output = alg.outputDefinition('out_vector')
        self.assertEqual(vector_output.type(), 'outputVector')
        self.assertEqual(vector_output.dataType(),
                         QgsProcessing.TypeVectorAnyGeometry)
        vector_dest_param = alg.parameterDefinition('param_vector_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorAnyGeometry)

        table_output = alg.outputDefinition('out_table')
        self.assertEqual(table_output.type(), 'outputVector')
        self.assertEqual(table_output.dataType(), QgsProcessing.TypeVector)
        table_dest_param = alg.parameterDefinition('param_table_dest')
        self.assertEqual(table_dest_param.type(), 'vectorDestination')
        self.assertEqual(table_dest_param.dataType(), QgsProcessing.TypeVector)

        vector_dest_param = alg.parameterDefinition('param_vector_dest2')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorAnyGeometry)

        vector_dest_param = alg.parameterDefinition('param_vector_point_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorPoint)

        vector_dest_param = alg.parameterDefinition('param_vector_line_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorLine)

        vector_dest_param = alg.parameterDefinition(
            'param_vector_polygon_dest')
        self.assertEqual(vector_dest_param.type(), 'vectorDestination')
        self.assertEqual(vector_dest_param.dataType(),
                         QgsProcessing.TypeVectorPolygon)

        raster_output = alg.outputDefinition('out_raster')
        self.assertEqual(raster_output.type(), 'outputRaster')
        raster_dest_param = alg.parameterDefinition('param_raster_dest')
        self.assertEqual(raster_dest_param.type(), 'rasterDestination')
        number_output = alg.outputDefinition('out_number')
        self.assertEqual(number_output.type(), 'outputNumber')
        string_output = alg.outputDefinition('out_string')
        self.assertEqual(string_output.type(), 'outputString')
        layer_output = alg.outputDefinition('out_layer')
        self.assertEqual(layer_output.type(), 'outputLayer')
        folder_output = alg.outputDefinition('out_folder')
        self.assertEqual(folder_output.type(), 'outputFolder')
        folder_dest_param = alg.parameterDefinition('param_folder_dest')
        self.assertEqual(folder_dest_param.type(), 'folderDestination')
        html_output = alg.outputDefinition('out_html')
        self.assertEqual(html_output.type(), 'outputHtml')
        html_dest_param = alg.parameterDefinition('param_html_dest')
        self.assertEqual(html_dest_param.type(), 'fileDestination')