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')
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')