def test_is_error_line(self): """ Test is_error_line """ self.assertFalse(JsUtils.is_error_line('xxx yyy')) self.assertTrue(JsUtils.is_error_line('Error something went wrong')) self.assertTrue(JsUtils.is_error_line('Execution halted'))
def testDefaultScriptsFolder(self): """ Tests default user scripts folder """ self.assertTrue(JsUtils.default_scripts_folder()) self.assertIn('rscripts', JsUtils.default_scripts_folder()) self.assertTrue(os.path.exists(JsUtils.default_scripts_folder()))
def testBuiltInPath(self): """ Tests built in scripts path """ self.assertTrue(JsUtils.builtin_scripts_folder()) self.assertIn('builtin_scripts', JsUtils.builtin_scripts_folder()) self.assertTrue(os.path.exists(JsUtils.builtin_scripts_folder()))
def testScriptsFolders(self): """ Test script folders """ self.assertTrue(JsUtils.script_folders()) self.assertIn(JsUtils.default_scripts_folder(), JsUtils.script_folders()) self.assertIn(JsUtils.builtin_scripts_folder(), JsUtils.script_folders())
def saveScript(self, saveAs): newPath = None if self.filePath is None or saveAs: scriptDir = JsUtils.default_scripts_folder() newPath, _ = QFileDialog.getSaveFileName( self, self.tr("Save script"), scriptDir, self.tr("Javascript files (*.js *.JS)")) if newPath: if not newPath.lower().endswith(".js"): newPath += ".js" self.filePath = newPath if self.filePath: text = self.editor.text() try: with codecs.open(self.filePath, "w", encoding="utf-8") as f: f.write(text) except IOError as e: QMessageBox.warning( self, self.tr("I/O error"), self.tr("Unable to save edits:\n{}").format(str(e))) return self.setHasChanged(False) QgsApplication.processingRegistry().providerById( "r").refreshAlgorithms()
def loadAlgorithms(self): """ Called when provider must populate its available algorithms """ algs = [] for f in JsUtils.script_folders(): algs.extend(self.load_scripts_from_folder(f)) for a in algs: self.addAlgorithm(a)
def process_parameter_line(self, line): """ Processes a single script line representing a parameter """ value, _ = self.split_tokens(line) description = JsUtils.create_descriptive_name(value) output = create_output_from_string(line) if output is not None: output.setName(value) output.setDescription(description) if issubclass(output.__class__, QgsProcessingOutputDefinition): self.addOutput(output) else: # destination type parameter self.addParameter(output) else: line = JsUtils.upgrade_parameter_line(line) param = getParameterFromString(line) if param is not None: self.addParameter(param) else: self.error = self.tr('This script has a syntax error.\n' 'Problem with line: {0}').format(line)
def load(self): """ Called when first loading provider """ ProcessingConfig.settingIcons[self.name()] = self.icon() ProcessingConfig.addSetting( Setting(self.name(), JsUtils.SCRIPTS_FOLDER, self.tr('Javascript scripts folder'), JsUtils.default_scripts_folder(), valuetype=Setting.MULTIPLE_FOLDERS)) ProviderActions.registerProviderActions(self, self.actions) ProviderContextMenuActions.registerProviderContextMenuActions( self.contextMenuActions) ProcessingConfig.readSettings() self.refreshAlgorithms() return True
def openScript(self): if self.hasChanged: ret = QMessageBox.warning( self, self.tr("Unsaved changes"), self.tr("There are unsaved changes in the script. Continue?"), QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if ret == QMessageBox.No: return scriptDir = JsUtils.default_scripts_folder() fileName, _ = QFileDialog.getOpenFileName( self, self.tr("Open script"), scriptDir, self.tr("Javascript files (*.js *.JS)")) if fileName == "": return with OverrideCursor(Qt.WaitCursor): self._loadFile(fileName)
def process_metadata_line(self, line): """ Processes a "metadata" (##) line """ line = line.replace('//#', '') # special commands #if line.lower().strip().startswith('dontuserasterpackage'): # self.use_raster_package = False # return value, type_ = self.split_tokens(line) if type_.lower().strip() == 'group': self._group = value return if type_.lower().strip() == 'name': self._name = self._display_name = value self._name = JsUtils.strip_special_characters(self._name.lower()) return self.process_parameter_line(line)
def __init__(self, description_file, script=None): super().__init__() self.script = script self.js_script = '' self.codec = None self.engine = None self.process_js_function = None self.json_exporter = None self.fields = None self._name = '' self._display_name = '' self._group = '' self.description_file = os.path.realpath(description_file) if description_file else None self.error = None self.commands = list() self.is_user_script = False if description_file: self.is_user_script = not description_file.startswith(JsUtils.builtin_scripts_folder()) if self.script is not None: self.load_from_string() if self.description_file is not None: self.load_from_file()
def testStripSpecialCharacters(self): """ Tests stripping special characters from a name """ self.assertEqual(JsUtils.strip_special_characters('aB 43 24a:sd'), 'aB4324asd')
def testDescriptiveName(self): """ Tests creating descriptive name """ self.assertEqual(JsUtils.create_descriptive_name('a B_4324_asd'), 'a B 4324 asd')