Skip to content

Commit 242d274

Browse files
committed
Merge pull request #3003 from m-kuhn/py3next
Enable more tests for PyQt5/Python3
2 parents 78725fe + 816c322 commit 242d274

21 files changed

+887
-918
lines changed

ci/travis/linux/qt5/blacklist.txt

+1-6
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@ PyQgsPalLabelingComposer
2525
PyQgsPalLabelingPlacement
2626
PyQgsPalLabelingServer
2727
PyQgsPostgresProvider
28-
PyQgsProject
2928
PyQgsRangeWidgets
3029
PyQgsRasterLayer
31-
PyQgsRelation
30+
PyQgsRelationEditWidget
3231
PyQgsRulebasedRenderer
3332
PyQgsServer
3433
PyQgsServerAccessControl
@@ -38,14 +37,10 @@ PyQgsSipCoverage
3837
PyQgsSpatialiteProvider
3938
PyQgsSymbolExpressionVariables
4039
PyQgsSymbolV2
41-
PyQgsSyntacticSugar
42-
PyQgsTabfileProvider
4340
PyQgsVectorFileWriter
44-
PyQgsVectorLayer
4541
PyQgsVirtualLayerDefinition
4642
PyQgsVirtualLayerProvider
4743
PyQgsWFSProvider
48-
PyQgsZonalStatistics
4944
qgis_composereffectstest
5045
qgis_composerlabeltest
5146
qgis_composermapgridtest

ci/travis/linux/qt5/install.sh

-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ CLANG_WARNINGS="-Wimplicit-fallthrough"
2020
# Include this line for debug reasons
2121
# -DCMAKE_BUILD_TYPE=RelWithDebInfo \
2222
#
23-
# Server fails at the moment on Qt5 because QFtp has been removed
24-
# -DWITH_SERVER=ON \
2523
cmake \
2624
-DCMAKE_PREFIX_PATH=/home/travis/osgeo4travis \
2725
-DWITH_STAGED_PLUGINS=ON \

python/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ MACRO(PY_2TO3 TARGET_NAME RESOURCE_PATHS)
5959
POST_BUILD
6060
COMMAND "${PYTHON_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/scripts/2to3" --no-diffs -w ${RESOURCE_PATHS}
6161
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
62-
COMMENT "Porting to Python 3 and Qt5"
62+
COMMENT "Porting ${RESOURCE_PATHS} to Python 3 and Qt5"
6363
)
6464
ENDMACRO(PY_2TO3)
6565

python/plugins/CMakeLists.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ FILE(WRITE ${CMAKE_BINARY_DIR}/stagecount 0)
1111
# The target port-plugins acts as a container for all port-plugin-XXX targets
1212
# Each port-plugin-XXX target will run scripts/2to3 on a plugin and migrate
1313
# Python 3 and Qt 5 code.
14-
ADD_CUSTOM_TARGET(port-plugins)
1514
SET (PORT_PLUGINS FALSE CACHE BOOL "Determines whether python plugins in staged or installed locations should be migrated to Python 3 and Qt 5")
1615
IF(PORT_PLUGINS)
17-
ADD_CUSTOM_TARGET(port-plugins-on-build ALL DEPENDS port-plugins)
16+
ADD_CUSTOM_TARGET(port-plugins ALL)
17+
ELSE(PORT_PLUGINS)
18+
ADD_CUSTOM_TARGET(port-plugins)
1819
ENDIF(PORT_PLUGINS)
1920

2021
MACRO (PLUGIN_INSTALL plugin subdir )

python/testing/__init__.py

+12-7
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def wrapper(*args, **kwargs):
223223
unittest.expectedFailure = expectedFailure
224224

225225

226-
def start_app():
226+
def start_app(cleanup=True):
227227
"""
228228
Will start a QgsApplication and call all initialization code like
229229
registering the providers and other infrastructure. It will not load
@@ -233,6 +233,11 @@ def start_app():
233233
234234
The initialization will only happen once, so it is safe to call this method repeatedly.
235235
236+
Parameters
237+
----------
238+
239+
cleanup: Do cleanup on exit. Defaults to true.
240+
236241
Returns
237242
-------
238243
QgsApplication
@@ -258,14 +263,14 @@ def start_app():
258263
QGISAPP = QgsApplication(argvb, myGuiFlag)
259264

260265
QGISAPP.initQgis()
261-
s = QGISAPP.showSettings()
262-
print(s)
266+
print(QGISAPP.showSettings())
263267

264-
import atexit
268+
if cleanup:
269+
import atexit
265270

266-
@atexit.register
267-
def exitQgis():
268-
QGISAPP.exitQgis()
271+
@atexit.register
272+
def exitQgis():
273+
QGISAPP.exitQgis()
269274

270275
return QGISAPP
271276

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from libfuturize.fixes.fix_unicode_keep_u import FixUnicodeKeepU

tests/src/python/test_provider_mssql.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def testDateTimeTypes(self):
7070
self.assertEqual(fields.at(fields.indexFromName(
7171
'datetime_field')).type(), QVariant.DateTime)
7272

73-
f = vl.getFeatures(QgsFeatureRequest()).next()
73+
f = next(vl.getFeatures(QgsFeatureRequest()))
7474

7575
date_idx = vl.fieldNameIndex('date_field')
7676
assert isinstance(f.attributes()[date_idx], QDate)

tests/src/python/test_provider_postgres.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def testDateTimeTypes(self):
7979
self.assertEqual(fields.at(fields.indexFromName('time_field')).type(), QVariant.Time)
8080
self.assertEqual(fields.at(fields.indexFromName('datetime_field')).type(), QVariant.DateTime)
8181

82-
f = vl.getFeatures(QgsFeatureRequest()).next()
82+
f = next(vl.getFeatures(QgsFeatureRequest()))
8383

8484
date_idx = vl.fieldNameIndex('date_field')
8585
self.assertTrue(isinstance(f.attributes()[date_idx], QDate))

tests/src/python/test_provider_spatialite.py

+28-35
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import qgis # NOQA
1616

1717
import os
18+
import sys
1819
import shutil
1920
import tempfile
2021

@@ -31,15 +32,11 @@
3132
print("You should install pyspatialite to run the tests")
3233
raise ImportError
3334

34-
# Convenience instances in case you may need them
35-
start_app()
35+
# Pass no_exit=True: for some reason this crashes on exit on Travis MacOSX
36+
start_app(sys.platform != 'darwin')
3637
TEST_DATA_DIR = unitTestDataPath()
3738

3839

39-
def die(error_message):
40-
raise Exception(error_message)
41-
42-
4340
class TestQgsSpatialiteProvider(unittest.TestCase, ProviderTestCase):
4441

4542
@classmethod
@@ -144,73 +141,69 @@ def partiallyCompiledFilters(self):
144141
def test_SplitFeature(self):
145142
"""Create spatialite database"""
146143
layer = QgsVectorLayer("dbname=%s table=test_pg (geometry)" % self.dbname, "test_pg", "spatialite")
147-
assert(layer.isValid())
148-
assert(layer.hasGeometryType())
144+
self.assertTrue(layer.isValid())
145+
self.assertTrue(layer.hasGeometryType())
149146
layer.startEditing()
150-
layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0) == 0 or die("error in split")
151-
layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0) == 0 or die("error in split")
152-
if not layer.commitChanges():
153-
die("this commit should work")
154-
layer.featureCount() == 4 or die("we should have 4 features after 2 split")
147+
self.assertEqual(layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0), 0)
148+
self.assertEqual(layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0), 0)
149+
self.assertTrue(layer.commitChanges())
150+
self.assertEqual(layer.featureCount(), 4)
155151

156152
def xtest_SplitFeatureWithFailedCommit(self):
157153
"""Create spatialite database"""
158154
layer = QgsVectorLayer("dbname=%s table=test_pg_mk (geometry)" % self.dbname, "test_pg_mk", "spatialite")
159-
assert(layer.isValid())
160-
assert(layer.hasGeometryType())
155+
self.assertTrue(layer.isValid())
156+
self.assertTrue(layer.hasGeometryType())
161157
layer.startEditing()
162-
layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0) == 0 or die("error in split")
163-
layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0) == 0 or die("error in split")
164-
if layer.commitChanges():
165-
die("this commit should fail")
158+
self.asserEqual(layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0), 0)
159+
self.asserEqual(layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0), 0)
160+
self.assertFalse(layer.commitChanges())
166161
layer.rollBack()
167-
feat = QgsFeature()
168-
it = layer.getFeatures()
169-
it.nextFeature(feat)
162+
feat = next(layer.getFeatures())
170163
ref = [[(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]]
171164
res = feat.geometry().asPolygon()
172165
for ring1, ring2 in zip(ref, res):
173166
for p1, p2 in zip(ring1, ring2):
174167
for c1, c2 in zip(p1, p2):
175-
c1 == c2 or die("polygon has been altered by failed edition")
168+
self.asserEqual(c1, c2)
176169

177170
def test_queries(self):
178171
"""Test loading of query-based layers"""
179172

180173
# a query with a geometry, but no unique id
181174
# the id will be autoincremented
182175
l = QgsVectorLayer("dbname=%s table='(select * from test_q)' (geometry)" % self.dbname, "test_pg_query1", "spatialite")
183-
assert(l.isValid())
176+
self.assertTrue(l.isValid())
184177
# the id() is autoincremented
185178
sum_id1 = sum(f.id() for f in l.getFeatures())
186179
# the attribute 'id' works
187180
sum_id2 = sum(f.attributes()[0] for f in l.getFeatures())
188-
assert(sum_id1 == 3) # 1+2
189-
assert(sum_id2 == 32) # 11 + 21
181+
self.assertEqual(sum_id1, 3) # 1+2
182+
self.assertEqual(sum_id2, 32) # 11 + 21
190183

191184
# and now with an id declared
192185
l = QgsVectorLayer("dbname=%s table='(select * from test_q)' (geometry) key='id'" % self.dbname, "test_pg_query1", "spatialite")
193-
assert(l.isValid())
186+
self.assertTrue(l.isValid())
194187
sum_id1 = sum(f.id() for f in l.getFeatures())
195188
sum_id2 = sum(f.attributes()[0] for f in l.getFeatures())
196-
assert(sum_id1 == 32)
197-
assert(sum_id2 == 32)
189+
self.assertEqual(sum_id1, 32)
190+
self.assertEqual(sum_id2, 32)
198191

199192
# a query, but no geometry
200193
l = QgsVectorLayer("dbname=%s table='(select id,name from test_q)' key='id'" % self.dbname, "test_pg_query1", "spatialite")
201-
assert(l.isValid())
194+
self.assertTrue(l.isValid())
202195
sum_id1 = sum(f.id() for f in l.getFeatures())
203196
sum_id2 = sum(f.attributes()[0] for f in l.getFeatures())
204-
assert(sum_id1 == 32)
205-
assert(sum_id2 == 32)
197+
self.assertEqual(sum_id1, 32)
198+
self.assertEqual(sum_id2, 32)
206199

207200
def test_case(self):
208201
"""Test case sensitivity issues"""
209202
l = QgsVectorLayer("dbname=%s table='test_n' (geometry) key='id'" % self.dbname, "test_n1", "spatialite")
210-
assert(l.isValid())
211-
assert(l.dataProvider().fields().count() == 2)
203+
self.assertTrue(l.isValid())
204+
self.assertEqual(l.dataProvider().fields().count(), 2)
212205
fields = [f.name() for f in l.dataProvider().fields()]
213-
assert('Geometry' not in fields)
206+
self.assertTrue('Geometry' not in fields)
214207

215208
def test_invalid_iterator(self):
216209
""" Test invalid iterator """

tests/src/python/test_provider_tabfile.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def testDateTimeFormats(self):
4040
self.assertEqual(fields.at(fields.indexFromName('time')).type(), QVariant.Time)
4141
self.assertEqual(fields.at(fields.indexFromName('date_time')).type(), QVariant.DateTime)
4242

43-
f = vl.getFeatures(QgsFeatureRequest()).next()
43+
f = next(vl.getFeatures(QgsFeatureRequest()))
4444

4545
date_idx = vl.fieldNameIndex('date')
4646
assert isinstance(f.attributes()[date_idx], QDate)

tests/src/python/test_qgscomposerpicture.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import qgis # NOQA
1616

1717
import os
18-
import SocketServer
18+
import socketserver
1919
import threading
2020
import SimpleHTTPServer
2121
from PyQt.QtCore import QRectF
@@ -40,7 +40,7 @@ def setUpClass(cls):
4040
os.chdir(unitTestDataPath() + '')
4141
handler = SimpleHTTPServer.SimpleHTTPRequestHandler
4242

43-
cls.httpd = SocketServer.TCPServer(('localhost', 0), handler)
43+
cls.httpd = socketserver.TCPServer(('localhost', 0), handler)
4444
cls.port = cls.httpd.server_address[1]
4545

4646
cls.httpd_thread = threading.Thread(target=cls.httpd.serve_forever)

0 commit comments

Comments
 (0)