QGIS/python/plugins/grassprovider/parsed_description.py

138 lines
4.8 KiB
Python

"""
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""
import re
from dataclasses import (
dataclass,
field
)
from pathlib import Path
from typing import (
Optional,
List,
Dict
)
@dataclass
class ParsedDescription:
"""
Results of parsing a description file
"""
GROUP_ID_REGEX = re.compile(r'^[^\s(]+')
grass_command: Optional[str] = None
short_description: Optional[str] = None
name: Optional[str] = None
display_name: Optional[str] = None
group: Optional[str] = None
group_id: Optional[str] = None
ext_path: Optional[str] = None
hardcoded_strings: List[str] = field(default_factory=list)
param_strings: List[str] = field(default_factory=list)
def as_dict(self) -> Dict:
"""
Returns a JSON serializable dictionary representing the parsed
description
"""
return {
'name': self.name,
'display_name': self.display_name,
'command': self.grass_command,
'short_description': self.short_description,
'group': self.group,
'group_id': self.group_id,
'ext_path': self.ext_path,
'hardcoded_strings': self.hardcoded_strings,
'parameters': self.param_strings
}
@staticmethod
def from_dict(description: Dict) -> 'ParsedDescription':
"""
Parses a dictionary as a description and returns the result
"""
from qgis.PyQt.QtCore import QCoreApplication
result = ParsedDescription()
result.name = description.get('name')
result.display_name = description.get('display_name')
result.grass_command = description.get('command')
result.short_description = QCoreApplication.translate(
"GrassAlgorithm",
description.get('short_description')
)
result.group = QCoreApplication.translate("GrassAlgorithm",
description.get('group'))
result.group_id = description.get('group_id')
result.ext_path = description.get('ext_path')
result.hardcoded_strings = description.get('hardcoded_strings', [])
result.param_strings = description.get('parameters', [])
return result
@staticmethod
def parse_description_file(
description_file: Path,
translate: bool = True) -> 'ParsedDescription':
"""
Parses a description file and returns the result
"""
result = ParsedDescription()
with description_file.open() as lines:
# First line of the file is the Grass algorithm name
line = lines.readline().strip('\n').strip()
result.grass_command = line
# Second line if the algorithm name in Processing
line = lines.readline().strip('\n').strip()
result.short_description = line
if " - " not in line:
result.name = result.grass_command
else:
result.name = line[:line.find(' ')].lower()
if translate:
from qgis.PyQt.QtCore import QCoreApplication
result.short_description = QCoreApplication.translate(
"GrassAlgorithm", line)
else:
result.short_description = line
result.display_name = result.name
# Read the grass group
line = lines.readline().strip('\n').strip()
if translate:
from qgis.PyQt.QtCore import QCoreApplication
result.group = QCoreApplication.translate("GrassAlgorithm",
line)
else:
result.group = line
result.group_id = ParsedDescription.GROUP_ID_REGEX.search(
line).group(0).lower()
# Then you have parameters/output definition
line = lines.readline().strip('\n').strip()
while line != '':
line = line.strip('\n').strip()
if line.startswith('Hardcoded'):
result.hardcoded_strings.append(
line[len('Hardcoded|'):])
result.param_strings.append(line)
line = lines.readline().strip('\n').strip()
return result