Skip to content

Commit 72be86d

Browse files
committed
Only accept QgsPropertys in QgsProcessingFeatureSourceDefinition/
QgsProcessingFeatureSink, not all QVariant types Only strings/QgsPropertys are valid anyway, so instead of strings use static properties. This makes it clearer what possible values are permitted for the underlying source/sink definition.
1 parent d7aa3f5 commit 72be86d

3 files changed

Lines changed: 104 additions & 24 deletions

File tree

‎python/core/processing/qgsprocessingparameters.sip‎

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,19 @@ class QgsProcessingFeatureSourceDefinition
2626
%End
2727
public:
2828

29-
QgsProcessingFeatureSourceDefinition( const QVariant &source = QVariant(), bool selectedFeaturesOnly = false );
29+
QgsProcessingFeatureSourceDefinition( const QString &source = QString(), bool selectedFeaturesOnly = false );
3030
%Docstring
31-
Constructor for QgsProcessingFeatureSourceDefinition.
31+
Constructor for QgsProcessingFeatureSourceDefinition, accepting a static string source.
3232
%End
3333

34-
QVariant source;
34+
QgsProcessingFeatureSourceDefinition( const QgsProperty &source, bool selectedFeaturesOnly = false );
3535
%Docstring
36-
Source definition. Usually set to a source layer's ID or file name.
36+
Constructor for QgsProcessingFeatureSourceDefinition, accepting a QgsProperty source.
37+
%End
38+
39+
QgsProperty source;
40+
%Docstring
41+
Source definition. Usually a static property set to a source layer's ID or file name.
3742
%End
3843
3944
bool selectedFeaturesOnly;
@@ -65,14 +70,19 @@ class QgsProcessingFeatureSink
6570
%End
6671
public:
6772
68-
QgsProcessingFeatureSink( const QVariant &sink = QVariant(), bool loadIntoProject = false );
73+
QgsProcessingFeatureSink( const QString &sink = QString(), bool loadIntoProject = false );
74+
%Docstring
75+
Constructor for QgsProcessingFeatureSink, accepting a static string sink.
76+
%End
77+
78+
QgsProcessingFeatureSink( const QgsProperty &sink, bool loadIntoProject = false );
6979
%Docstring
70-
Constructor for QgsProcessingFeatureSink.
80+
Constructor for QgsProcessingFeatureSink, accepting a QgsProperty sink.
7181
%End
7282
73-
QVariant sink;
83+
QgsProperty sink;
7484
%Docstring
75-
Sink definition. Usually set to the destination file name for the sink's layer.
85+
Sink definition. Usually a static property set to the destination file name for the sink's layer.
7686
%End
7787

7888
bool loadIntoProject;

‎src/core/processing/qgsprocessingparameters.h‎

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,25 @@ class CORE_EXPORT QgsProcessingFeatureSourceDefinition
4646
public:
4747

4848
/**
49-
* Constructor for QgsProcessingFeatureSourceDefinition.
49+
* Constructor for QgsProcessingFeatureSourceDefinition, accepting a static string source.
5050
*/
51-
QgsProcessingFeatureSourceDefinition( const QVariant &source = QVariant(), bool selectedFeaturesOnly = false )
51+
QgsProcessingFeatureSourceDefinition( const QString &source = QString(), bool selectedFeaturesOnly = false )
52+
: source( QgsProperty::fromValue( source ) )
53+
, selectedFeaturesOnly( selectedFeaturesOnly )
54+
{}
55+
56+
/**
57+
* Constructor for QgsProcessingFeatureSourceDefinition, accepting a QgsProperty source.
58+
*/
59+
QgsProcessingFeatureSourceDefinition( const QgsProperty &source, bool selectedFeaturesOnly = false )
5260
: source( source )
5361
, selectedFeaturesOnly( selectedFeaturesOnly )
5462
{}
5563

5664
/**
57-
* Source definition. Usually set to a source layer's ID or file name.
65+
* Source definition. Usually a static property set to a source layer's ID or file name.
5866
*/
59-
QVariant source;
67+
QgsProperty source;
6068

6169
/**
6270
* True if only selected features in the source should be used by algorithms.
@@ -88,17 +96,25 @@ class CORE_EXPORT QgsProcessingFeatureSink
8896
public:
8997

9098
/**
91-
* Constructor for QgsProcessingFeatureSink.
99+
* Constructor for QgsProcessingFeatureSink, accepting a static string sink.
100+
*/
101+
QgsProcessingFeatureSink( const QString &sink = QString(), bool loadIntoProject = false )
102+
: sink( QgsProperty::fromValue( sink ) )
103+
, loadIntoProject( loadIntoProject )
104+
{}
105+
106+
/**
107+
* Constructor for QgsProcessingFeatureSink, accepting a QgsProperty sink.
92108
*/
93-
QgsProcessingFeatureSink( const QVariant &sink = QVariant(), bool loadIntoProject = false )
109+
QgsProcessingFeatureSink( const QgsProperty &sink, bool loadIntoProject = false )
94110
: sink( sink )
95111
, loadIntoProject( loadIntoProject )
96112
{}
97113

98114
/**
99-
* Sink definition. Usually set to the destination file name for the sink's layer.
115+
* Sink definition. Usually a static property set to the destination file name for the sink's layer.
100116
*/
101-
QVariant sink;
117+
QgsProperty sink;
102118

103119
/**
104120
* True if sink should be loaded into the current project when the algorithm completes.

‎tests/src/core/testqgsprocessing.cpp‎

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2329,34 +2329,88 @@ void TestQgsProcessing::combineLayerExtent()
23292329

23302330
void TestQgsProcessing::processingFeatureSource()
23312331
{
2332-
QVariant source( QStringLiteral( "test.shp" ) );
2333-
QgsProcessingFeatureSourceDefinition fs( source, true );
2334-
QCOMPARE( fs.source, source );
2332+
QString sourceString = QStringLiteral( "test.shp" );
2333+
QgsProcessingFeatureSourceDefinition fs( sourceString, true );
2334+
QCOMPARE( fs.source.staticValue().toString(), sourceString );
23352335
QVERIFY( fs.selectedFeaturesOnly );
23362336

23372337
// test storing QgsProcessingFeatureSource in variant and retrieving
23382338
QVariant fsInVariant = QVariant::fromValue( fs );
23392339
QVERIFY( fsInVariant.isValid() );
23402340

23412341
QgsProcessingFeatureSourceDefinition fromVar = qvariant_cast<QgsProcessingFeatureSourceDefinition>( fsInVariant );
2342-
QCOMPARE( fromVar.source, source );
2342+
QCOMPARE( fromVar.source.staticValue().toString(), sourceString );
23432343
QVERIFY( fromVar.selectedFeaturesOnly );
2344+
2345+
// test evaluating parameter as source
2346+
QgsVectorLayer *layer = new QgsVectorLayer( "Point", "v1", "memory" );
2347+
QgsFeature f( 10001 );
2348+
f.setGeometry( QgsGeometry( new QgsPoint( 1, 2 ) ) );
2349+
layer->dataProvider()->addFeatures( QgsFeatureList() << f );
2350+
2351+
QgsProject p;
2352+
p.addMapLayer( layer );
2353+
QgsProcessingContext context;
2354+
context.setProject( &p );
2355+
2356+
// first using static string definition
2357+
QgsProcessingParameterDefinition *def = new QgsProcessingParameterString( QStringLiteral( "layer" ) );
2358+
QVariantMap params;
2359+
params.insert( QStringLiteral( "layer" ), QgsProcessingFeatureSourceDefinition( layer->id(), false ) );
2360+
std::unique_ptr< QgsFeatureSource > source( QgsProcessingParameters::parameterAsSource( def, params, context ) );
2361+
// can't directly match it to layer, so instead just get the feature and test that it matches what we expect
2362+
QgsFeature f2;
2363+
QVERIFY( source.get() );
2364+
QVERIFY( source->getFeatures().nextFeature( f2 ) );
2365+
QCOMPARE( f2.geometry(), f.geometry() );
2366+
2367+
// next using property based definition
2368+
params.insert( QStringLiteral( "layer" ), QgsProcessingFeatureSourceDefinition( QgsProperty::fromExpression( QStringLiteral( "trim('%1' + ' ')" ).arg( layer->id() ) ), false ) );
2369+
source.reset( QgsProcessingParameters::parameterAsSource( def, params, context ) );
2370+
// can't directly match it to layer, so instead just get the feature and test that it matches what we expect
2371+
QVERIFY( source.get() );
2372+
QVERIFY( source->getFeatures().nextFeature( f2 ) );
2373+
QCOMPARE( f2.geometry(), f.geometry() );
23442374
}
23452375

23462376
void TestQgsProcessing::processingFeatureSink()
23472377
{
2348-
QVariant sink( QStringLiteral( "test.shp" ) );
2349-
QgsProcessingFeatureSink fs( sink, true );
2350-
QCOMPARE( fs.sink, sink );
2378+
QString sinkString( QStringLiteral( "test.shp" ) );
2379+
QgsProcessingFeatureSink fs( sinkString, true );
2380+
QCOMPARE( fs.sink.staticValue().toString(), sinkString );
23512381
QVERIFY( fs.loadIntoProject );
23522382

23532383
// test storing QgsProcessingFeatureSink in variant and retrieving
23542384
QVariant fsInVariant = QVariant::fromValue( fs );
23552385
QVERIFY( fsInVariant.isValid() );
23562386

23572387
QgsProcessingFeatureSink fromVar = qvariant_cast<QgsProcessingFeatureSink>( fsInVariant );
2358-
QCOMPARE( fromVar.sink, sink );
2388+
QCOMPARE( fromVar.sink.staticValue().toString(), sinkString );
23592389
QVERIFY( fromVar.loadIntoProject );
2390+
2391+
// test evaluating parameter as sink
2392+
QgsProject p;
2393+
QgsProcessingContext context;
2394+
context.setProject( &p );
2395+
2396+
// first using static string definition
2397+
QgsProcessingParameterDefinition *def = new QgsProcessingParameterString( QStringLiteral( "layer" ) );
2398+
QVariantMap params;
2399+
params.insert( QStringLiteral( "layer" ), QgsProcessingFeatureSink( "memory:test", false ) );
2400+
QString dest;
2401+
std::unique_ptr< QgsFeatureSink > sink( QgsProcessingParameters::parameterAsSink( def, params, QgsFields(), QgsWkbTypes::Point, QgsCoordinateReferenceSystem( "EPSG:3111" ), context, dest ) );
2402+
QVERIFY( sink.get() );
2403+
QgsVectorLayer *layer = qobject_cast< QgsVectorLayer *>( QgsProcessingUtils::mapLayerFromString( dest, context, false ) );
2404+
QVERIFY( layer );
2405+
QCOMPARE( layer->crs().authid(), QStringLiteral( "EPSG:3111" ) );
2406+
2407+
// next using property based definition
2408+
params.insert( QStringLiteral( "layer" ), QgsProcessingFeatureSink( QgsProperty::fromExpression( QStringLiteral( "trim('memory' + ':test2')" ) ), false ) );
2409+
sink.reset( QgsProcessingParameters::parameterAsSink( def, params, QgsFields(), QgsWkbTypes::Point, QgsCoordinateReferenceSystem( "EPSG:3113" ), context, dest ) );
2410+
QVERIFY( sink.get() );
2411+
QgsVectorLayer *layer2 = qobject_cast< QgsVectorLayer *>( QgsProcessingUtils::mapLayerFromString( dest, context, false ) );
2412+
QVERIFY( layer2 );
2413+
QCOMPARE( layer2->crs().authid(), QStringLiteral( "EPSG:3113" ) );
23602414
}
23612415

23622416
QGSTEST_MAIN( TestQgsProcessing )

0 commit comments

Comments
 (0)