Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[processing] Reorganise python script generated from model, to
move "guts" of script to top (initAlgorithm/processAlgorithm)
and boilerplate methods (createInstance, etc) to end
  • Loading branch information
nyalldawson committed Feb 4, 2019
1 parent 6aea483 commit 0250cab
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 61 deletions.
91 changes: 47 additions & 44 deletions src/core/processing/models/qgsprocessingmodelalgorithm.cpp
Expand Up @@ -359,6 +359,17 @@ QStringList QgsProcessingModelAlgorithm::asPythonCode( const QgsProcessing::Pyth
QStringList lines;
QString indent = QString( ' ' ).repeated( indentSize );
QString currentIndent;

auto safeName = []( const QString & name )->QString
{
QString n = name.toLower().trimmed();
QRegularExpression rx( QStringLiteral( "[^\\sa-z_A-Z0-9]" ) );
n.replace( rx, QString() );
return QgsStringUtils::capitalize( n, QgsStringUtils::UpperCamelCase );
};

const QString algorithmClassName = safeName( name() );

switch ( outputType )
{
case QgsProcessing::PythonQgsProcessingAlgorithmSubclass:
Expand All @@ -368,6 +379,7 @@ QStringList QgsProcessingModelAlgorithm::asPythonCode( const QgsProcessing::Pyth
// add specific parameter type imports
const auto params = parameterDefinitions();
QStringList importLines; // not a set - we need regular ordering
importLines.reserve( params.count() );
for ( const QgsProcessingParameterDefinition *def : params )
{
const QString importString = QgsApplication::processingRegistry()->parameterType( def->type() )->pythonImportString();
Expand All @@ -378,53 +390,9 @@ QStringList QgsProcessingModelAlgorithm::asPythonCode( const QgsProcessing::Pyth
lines << QStringLiteral( "import processing" );
lines << QString() << QString();

auto safeName = []( const QString & name )->QString
{
QString n = name.toLower().trimmed();
QRegularExpression rx( QStringLiteral( "[^\\sa-z_A-Z0-9]" ) );
n.replace( rx, QString() );
return QgsStringUtils::capitalize( n, QgsStringUtils::UpperCamelCase );
};

const QString algorithmClassName = safeName( name() );
lines << QStringLiteral( "class %1(QgsProcessingAlgorithm):" ).arg( algorithmClassName );
lines << QString();

// createInstance
lines << indent + QStringLiteral( "def createInstance(self):" );
lines << indent + indent + QStringLiteral( "return %1()" ).arg( algorithmClassName );
lines << QString();

// name, displayName
lines << indent + QStringLiteral( "def name(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelName );
lines << QString();
lines << indent + QStringLiteral( "def displayName(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelName );
lines << QString();

// group, groupId
lines << indent + QStringLiteral( "def group(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelGroup );
lines << QString();
lines << indent + QStringLiteral( "def groupId(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelGroupId );
lines << QString();

// help
if ( !shortHelpString().isEmpty() )
{
lines << indent + QStringLiteral( "def shortHelpString(self):" );
lines << indent + indent + QStringLiteral( "return \"\"\"%1\"\"\"" ).arg( shortHelpString() );
lines << QString();
}
if ( !helpUrl().isEmpty() )
{
lines << indent + QStringLiteral( "def helpUrl(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( helpUrl() );
lines << QString();
}

// initAlgorithm, parameter definitions
lines << indent + QStringLiteral( "def initAlgorithm(self, config=None):" );
lines.reserve( lines.size() + params.size() );
Expand Down Expand Up @@ -568,6 +536,41 @@ QStringList QgsProcessingModelAlgorithm::asPythonCode( const QgsProcessing::Pyth
{
case QgsProcessing::PythonQgsProcessingAlgorithmSubclass:
lines << currentIndent + QStringLiteral( "return results" );
lines << QString();

// name, displayName
lines << indent + QStringLiteral( "def name(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelName );
lines << QString();
lines << indent + QStringLiteral( "def displayName(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelName );
lines << QString();

// group, groupId
lines << indent + QStringLiteral( "def group(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelGroup );
lines << QString();
lines << indent + QStringLiteral( "def groupId(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( mModelGroupId );
lines << QString();

// help
if ( !shortHelpString().isEmpty() )
{
lines << indent + QStringLiteral( "def shortHelpString(self):" );
lines << indent + indent + QStringLiteral( "return \"\"\"%1\"\"\"" ).arg( shortHelpString() );
lines << QString();
}
if ( !helpUrl().isEmpty() )
{
lines << indent + QStringLiteral( "def helpUrl(self):" );
lines << indent + indent + QStringLiteral( "return '%1'" ).arg( helpUrl() );
lines << QString();
}

// createInstance
lines << indent + QStringLiteral( "def createInstance(self):" );
lines << indent + indent + QStringLiteral( "return %1()" ).arg( algorithmClassName );
break;
}

Expand Down
33 changes: 16 additions & 17 deletions tests/src/analysis/testqgsprocessing.cpp
Expand Up @@ -6958,21 +6958,6 @@ void TestQgsProcessing::modelExecution()
"\n"
"class Model(QgsProcessingAlgorithm):\n"
"\n"
" def createInstance(self):\n"
" return Model()\n"
"\n"
" def name(self):\n"
" return 'model'\n"
"\n"
" def displayName(self):\n"
" return 'model'\n"
"\n"
" def group(self):\n"
" return ''\n"
"\n"
" def groupId(self):\n"
" return ''\n"
"\n"
" def initAlgorithm(self, config=None):\n"
" self.addParameter(QgsProcessingParameterFeatureSource('SOURCE_LAYER', '', defaultValue=None))\n"
" self.addParameter(QgsProcessingParameterNumber('DIST', '', type=QgsProcessingParameterNumber.Double, defaultValue=None))\n"
Expand Down Expand Up @@ -7006,8 +6991,22 @@ void TestQgsProcessing::modelExecution()
" }\n"
" outputs['cx3'] = processing.run('native:extractbyexpression', alg_params, context=context, feedback=feedback, is_child_algorithm=True)\n"
" results['cx3:MY_OUT'] = outputs['cx3']['OUTPUT']\n"
" return results"
"\n" ).split( '\n' );
" return results\n"
"\n"
" def name(self):\n"
" return 'model'\n"
"\n"
" def displayName(self):\n"
" return 'model'\n"
"\n"
" def group(self):\n"
" return ''\n"
"\n"
" def groupId(self):\n"
" return ''\n"
"\n"
" def createInstance(self):\n"
" return Model()\n" ).split( '\n' );
QCOMPARE( actualParts, expectedParts );
}

Expand Down

0 comments on commit 0250cab

Please sign in to comment.