Skip to content

Commit b10f4e1

Browse files
authored
Merge pull request #88 from 3liz/qgis4-support
QGIS4 Support
2 parents 4c5f207 + 09487df commit b10f4e1

6 files changed

Lines changed: 61 additions & 41 deletions

File tree

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
"3.34",
3939
"3.40",
4040
"3.44",
41-
"nightly-release",
41+
"4.0",
4242
]
4343
steps:
4444

.gitlab-ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ qgis-tests:
4141
"3.34",
4242
"3.40",
4343
"3.44",
44+
"4.0",
4445
]
4546

4647

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ authors = [
44
{ name = "3liz", email = "info@3liz.com" }
55
]
66
version = "1.8.4"
7-
requires-python = ">=3.10"
7+
requires-python = ">=3.9"
88
license = "GPL-2.0-only"
99
license-files = ["LICENSE"]
1010
readme = "README.md"

tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import pytest
1313

1414

15-
from qgis.PyQt import Qt
15+
from qgis.PyQt.QtCore import QT_VERSION_STR
1616

1717
from qgis.core import Qgis, QgsFontUtils, QgsProject
1818
from qgis.server import (
@@ -38,7 +38,7 @@ def pytest_report_header(config):
3838
f"QGIS : {Qgis.versionInt()}\n"
3939
f"Python GDAL : {gdal.VersionInfo('VERSION_NUM')}\n"
4040
f"Python : {sys.version}\n"
41-
f"QT : {Qt.QT_VERSION_STR}"
41+
f"QT : {QT_VERSION_STR}"
4242
)
4343

4444

tests/core/qgis.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
from qgis.gui import QgisInterface
1717
from qgis.server import QgsServerInterface
1818

19+
20+
QGIS_VERSION_INT = Qgis.versionInt()
21+
1922
#
2023
# Logger hook
2124
#
@@ -27,7 +30,7 @@ def install_logger_hook() -> None:
2730
from qgis.core import Qgis
2831

2932
# Add a hook to qgis message log
30-
def writelogmessage(message, tag, level):
33+
def writelogmessage(message, tag, level, *args):
3134
arg = f"{tag}: {message}"
3235
if level == Qgis.Warning:
3336
logging.warning(arg)
@@ -37,8 +40,10 @@ def writelogmessage(message, tag, level):
3740
logging.debug(arg)
3841

3942
messageLog = QgsApplication.messageLog()
40-
messageLog.messageReceived.connect(writelogmessage)
41-
43+
if QGIS_VERSION_INT < 40000:
44+
messageLog.messageReceived.connect(writelogmessage)
45+
else:
46+
messageLog.messageReceivedWithFormat.connect(writelogmessage)
4247

4348
#
4449
# Plugin loader
@@ -103,7 +108,7 @@ def _load_plugin(
103108

104109

105110
def _check_qgis_version(minver: Optional[str], maxver: Optional[str]) -> bool:
106-
version = semver.Version.parse(Qgis.QGIS_VERSION.split("-", maxsplit=1)[0])
111+
version = semver.Version.parse(Qgis.version().split("-", maxsplit=1)[0])
107112

108113
def _version(ver: Optional[str]) -> semver.Version:
109114
if not ver:

tests/test_feature.py

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from pathlib import Path
22

3-
from qgis.core import Qgis, QgsVectorLayer
3+
from qgis.core import QgsVectorLayer
44
from qgis.PyQt.QtCore import NULL, QDate, QDateTime, QVariant
55

66
from .core.client import Client
@@ -36,24 +36,32 @@ def test_getfeature_gml(client: Client):
3636
assert "text/xml" in rv.headers.get("Content-Type", ""), rv.headers
3737
layer = get_test_vector_layer(rv.file("gml"), "GML")
3838
expected_fields = ["gml_id"]
39-
if Qgis.versionInt() >= 33400:
40-
expected_fields.extend(["lowerCorner", "upperCorner"])
39+
expected_fields.extend(["lowerCorner", "upperCorner"])
4140
expected_fields.extend(["id", "trailing_zero", "name", "comment", "date_time", "date"])
4241
assert layer.fields().names() == expected_fields
4342

4443
index = layer.fields().indexFromName("gml_id")
4544
assert layer.uniqueValues(index) == {"lines.1", "lines.2", "lines.3", "lines.4"}
4645

4746
index = layer.fields().indexFromName("id")
47+
assert layer.fields().at(index).type() == QVariant.Int
4848
assert layer.uniqueValues(index) == {1, 2, 3, 4}
4949

5050
index = layer.fields().indexFromName("name")
51-
# QGIS 3.24.1 and 3.22.6
5251
assert layer.uniqueValues(index) == {"éù%@ > 1", "(]~€ > 2", "Line < 3", "Line name"}
5352

53+
5454
index = layer.fields().indexFromName("trailing_zero")
55-
# field detected as integer, so losing the trailing zero
56-
assert layer.uniqueValues(index) == {5200}
55+
match layer.fields().at(index).type():
56+
case QVariant.Int:
57+
# field detected as integer, so losing the trailing zero
58+
assert layer.uniqueValues(index) == {5200}
59+
case QVariant.String:
60+
# In QGIS 4/Gdal 3.10 this is no more interpreted
61+
# as integer
62+
assert layer.uniqueValues(index) == {"05200"}
63+
case unexpected:
64+
assert False, f"Unexpected field type: {unexpected}"
5765

5866
# Date time
5967
index = layer.fields().indexFromName("date_time")
@@ -102,13 +110,19 @@ def test_getfeature_kml(client: Client):
102110

103111
# ID
104112
index = layer.fields().indexFromName("id")
105-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
106-
assert layer.fields().at(index).type() == QVariant.Int
113+
match layer.fields().at(index).type():
114+
case QVariant.Int:
115+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
116+
case QVariant.String:
117+
# In QGIS 4/Gdal 3.10 the OGR (LIB)KML driver interpret this as string
118+
assert layer.uniqueValues(index) == {"1", "2", "3", "4"}
119+
case unexpected:
120+
assert False, f"Unexpected field type: {unexpected}"
107121

108122
# Trailing 0
109123
index = layer.fields().indexFromName("trailing_zero")
110-
assert "05200" in layer.uniqueValues(index)
111124
assert layer.fields().at(index).type() == QVariant.String
125+
assert "05200" in layer.uniqueValues(index)
112126

113127

114128
def test_getfeature_gpkg(client: Client):
@@ -127,13 +141,13 @@ def test_getfeature_gpkg(client: Client):
127141

128142
# ID
129143
index = layer.fields().indexFromName("id")
130-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
131144
assert layer.fields().at(index).type() == QVariant.Int
145+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
132146

133147
# Trailing 0
134148
index = layer.fields().indexFromName("trailing_zero")
135-
assert "05200" in layer.uniqueValues(index)
136149
assert layer.fields().at(index).type() == QVariant.String
150+
assert "05200" in layer.uniqueValues(index)
137151

138152

139153
def test_getfeature_gpx(client: Client):
@@ -208,18 +222,18 @@ def test_getfeature_ods(client: Client):
208222

209223
# ID
210224
index = layer.fields().indexFromName("id")
211-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
212225
assert layer.fields().at(index).type() == QVariant.Int
226+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
213227

214228
# Trailing 0
215229
index = layer.fields().indexFromName("trailing_zero")
216-
assert "05200" in layer.uniqueValues(index)
217230
assert layer.fields().at(index).type() == QVariant.String
231+
assert "05200" in layer.uniqueValues(index)
218232

219233
# Date time
220234
index = layer.fields().indexFromName("date_time")
221-
assert QDateTime(2023, 8, 1, 12, 0) in layer.uniqueValues(index)
222235
assert layer.fields().at(index).type() == QVariant.DateTime
236+
assert QDateTime(2023, 8, 1, 12, 0) in layer.uniqueValues(index)
223237

224238
# Date
225239
index = layer.fields().indexFromName("date")
@@ -243,13 +257,13 @@ def test_getfeature_geojson(client: Client):
243257

244258
# ID
245259
index = layer.fields().indexFromName("id")
246-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
247260
assert layer.fields().at(index).type() == QVariant.Int
261+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
248262

249263
# Trailing 0
250264
index = layer.fields().indexFromName("trailing_zero")
251-
assert "05200" in layer.uniqueValues(index)
252265
assert layer.fields().at(index).type() == QVariant.String
266+
assert "05200" in layer.uniqueValues(index)
253267

254268

255269
def test_getfeature_excel(client: Client):
@@ -269,13 +283,13 @@ def test_getfeature_excel(client: Client):
269283

270284
# ID
271285
index = layer.fields().indexFromName("id")
272-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
273286
assert layer.fields().at(index).type() == QVariant.Int
287+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
274288

275289
# Trailing 0
276290
index = layer.fields().indexFromName("trailing_zero")
277-
assert "05200" in layer.uniqueValues(index)
278291
assert layer.fields().at(index).type() == QVariant.String
292+
assert "05200" in layer.uniqueValues(index)
279293

280294
# Date time
281295
index = layer.fields().indexFromName("date_time")
@@ -305,18 +319,18 @@ def test_getfeature_csv(client: Client):
305319
# ID
306320
# All fields are loaded as string
307321
index = layer.fields().indexFromName("id")
308-
assert layer.uniqueValues(index) == {"1", "2", "3", "4"}
309322
assert layer.fields().at(index).type() == QVariant.String
323+
assert layer.uniqueValues(index) == {"1", "2", "3", "4"}
310324

311325
# Trailing 0
312326
index = layer.fields().indexFromName("trailing_zero")
313-
assert "05200" in layer.uniqueValues(index)
314327
assert layer.fields().at(index).type() == QVariant.String
328+
assert "05200" in layer.uniqueValues(index)
315329

316330
# Date time
317331
index = layer.fields().indexFromName("date_time")
318-
assert "2023/08/01 12:00:00" in layer.uniqueValues(index)
319332
assert layer.fields().at(index).type() == QVariant.String
333+
assert "2023/08/01 12:00:00" in layer.uniqueValues(index)
320334

321335
# Date
322336
index = layer.fields().indexFromName("date")
@@ -340,13 +354,13 @@ def test_getfeature_shapefile(client: Client):
340354
)
341355
# ID
342356
index = layer.fields().indexFromName("id")
343-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
344357
assert layer.fields().at(index).type() == QVariant.LongLong # Int to LongLong compare to others
358+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
345359

346360
# Trailing 0
347361
index = layer.fields().indexFromName("trailing_z")
348-
assert "05200" in layer.uniqueValues(index)
349362
assert layer.fields().at(index).type() == QVariant.String
363+
assert "05200" in layer.uniqueValues(index)
350364

351365

352366
def test_getfeature_tab(client: Client):
@@ -365,13 +379,13 @@ def test_getfeature_tab(client: Client):
365379

366380
# ID
367381
index = layer.fields().indexFromName("id")
368-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
369382
assert layer.fields().at(index).type() == QVariant.Int
383+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
370384

371385
# Trailing 0
372386
index = layer.fields().indexFromName("trailing_zero")
373-
assert "05200" in layer.uniqueValues(index)
374387
assert layer.fields().at(index).type() == QVariant.String
388+
assert "05200" in layer.uniqueValues(index)
375389

376390

377391
def test_getfeature_mif(client: Client):
@@ -390,13 +404,13 @@ def test_getfeature_mif(client: Client):
390404

391405
# ID
392406
index = layer.fields().indexFromName("id")
393-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
394407
assert layer.fields().at(index).type() == QVariant.Int
408+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
395409

396410
# Trailing 0
397411
index = layer.fields().indexFromName("trailing_zero")
398-
assert "05200" in layer.uniqueValues(index)
399412
assert layer.fields().at(index).type() == QVariant.String
413+
assert "05200" in layer.uniqueValues(index)
400414

401415

402416
def test_getfeature_layer_name_with_accent(client: Client):
@@ -433,13 +447,13 @@ def test_getfeature_geojson_with_selection(client: Client):
433447

434448
# ID
435449
index = layer.fields().indexFromName("id")
436-
assert layer.uniqueValues(index) == {1, 2}
437450
assert layer.fields().at(index).type() == QVariant.Int
451+
assert layer.uniqueValues(index) == {1, 2}
438452

439453
# Trailing 0
440454
index = layer.fields().indexFromName("trailing_zero")
441-
assert "05200" in layer.uniqueValues(index)
442455
assert layer.fields().at(index).type() == QVariant.String
456+
assert "05200" in layer.uniqueValues(index)
443457

444458

445459
def test_getfeature_fgb(client: Client):
@@ -458,20 +472,20 @@ def test_getfeature_fgb(client: Client):
458472

459473
# ID
460474
index = layer.fields().indexFromName("id")
461-
assert layer.uniqueValues(index) == {1, 2, 3, 4}
462475
assert layer.fields().at(index).type() == QVariant.Int
476+
assert layer.uniqueValues(index) == {1, 2, 3, 4}
463477

464478
# Trailing 0
465479
index = layer.fields().indexFromName("trailing_zero")
466-
assert "05200" in layer.uniqueValues(index)
467480
assert layer.fields().at(index).type() == QVariant.String
481+
assert "05200" in layer.uniqueValues(index)
468482

469483
# Date time
470484
index = layer.fields().indexFromName("date_time")
471-
assert QDateTime(2023, 8, 1, 12, 0) in layer.uniqueValues(index)
472485
assert layer.fields().at(index).type() == QVariant.DateTime
486+
assert QDateTime(2023, 8, 1, 12, 0) in layer.uniqueValues(index)
473487

474488
# Date
475489
index = layer.fields().indexFromName("date")
476-
assert QDateTime(2023, 8, 1, 0, 0) in layer.uniqueValues(index)
477490
assert layer.fields().at(index).type() == QVariant.DateTime
491+
assert QDateTime(2023, 8, 1, 0, 0) in layer.uniqueValues(index)

0 commit comments

Comments
 (0)