geoservercloud 0.8.12.dev4__tar.gz → 0.8.12.dev6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/PKG-INFO +1 -1
  2. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_ogcapi_features.py +117 -0
  3. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/pyproject.toml +1 -1
  4. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/LICENSE +0 -0
  5. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/README.md +0 -0
  6. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/.gitignore +0 -0
  7. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/README.md +0 -0
  8. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/__init__.py +0 -0
  9. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/ci.config.yaml +0 -0
  10. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/cli.py +0 -0
  11. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/compose/ci.compose.yaml +0 -0
  12. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/compose/example.compose.yaml +0 -0
  13. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/compose/geodatabase/001_create_schemas.sql +0 -0
  14. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/config.py +0 -0
  15. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/data/sampledata.tgz +0 -0
  16. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/example.config.yaml +0 -0
  17. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/__init__.py +0 -0
  18. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/conftest.py +0 -0
  19. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/__init__.py +0 -0
  20. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/__init__.py +0 -0
  21. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_None_expected.png +0 -0
  22. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language__expected.png +0 -0
  23. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_de_expected.png +0 -0
  24. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_fr_expected.png +0 -0
  25. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_it_expected.png +0 -0
  26. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language_None_expected.png +0 -0
  27. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language__expected.png +0 -0
  28. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language_it_expected.png +0 -0
  29. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_None_expected.png +0 -0
  30. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language__expected.png +0 -0
  31. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_de_expected.png +0 -0
  32. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_fr_expected.png +0 -0
  33. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_it_expected.png +0 -0
  34. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language_None_expected.png +0 -0
  35. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language__expected.png +0 -0
  36. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language_it_expected.png +0 -0
  37. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/localized_labels.sld +0 -0
  38. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/localized_no_default.sld +0 -0
  39. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/i18n/localized_with_default.sld +0 -0
  40. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/wfs/__init__.py +0 -0
  41. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/wfs/wfs_delete_payload.xml +0 -0
  42. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/wfs/wfs_insert_payload.xml +0 -0
  43. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/wms/__init__.py +0 -0
  44. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/resources/wms/getmap_expected.png +0 -0
  45. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_cascaded_stores.py +0 -0
  46. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_cog.py +0 -0
  47. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_datastore.py +0 -0
  48. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_get_version.py +0 -0
  49. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_gwc.py +0 -0
  50. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_i18n.py +0 -0
  51. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_imagemosaic.py +0 -0
  52. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_imagemosaic_cog.py +0 -0
  53. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_installed_fonts.py +0 -0
  54. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_rest_resource.py +0 -0
  55. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_s3_credentials_chain.py +0 -0
  56. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_wfs.py +0 -0
  57. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_wms.py +0 -0
  58. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/test_workspace.py +0 -0
  59. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoserver_acceptance_tests/tests/utils.py +0 -0
  60. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/__init__.py +0 -0
  61. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/geoservercloud.py +0 -0
  62. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/geoservercloudsync.py +0 -0
  63. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/gridsets/2056.xml +0 -0
  64. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/gridsets/21781.xml +0 -0
  65. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/gridsets/3857.xml +0 -0
  66. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/__init__.py +0 -0
  67. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/abstractlayer.py +0 -0
  68. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/common.py +0 -0
  69. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/coverage.py +0 -0
  70. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/coverages.py +0 -0
  71. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/coveragestore.py +0 -0
  72. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/datastore.py +0 -0
  73. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/datastores.py +0 -0
  74. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/featuretype.py +0 -0
  75. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/featuretypes.py +0 -0
  76. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/gwclayer.py +0 -0
  77. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/layer.py +0 -0
  78. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/layergroup.py +0 -0
  79. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/layergroups.py +0 -0
  80. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/resourcedirectory.py +0 -0
  81. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/s3blobstore.py +0 -0
  82. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/style.py +0 -0
  83. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/styles.py +0 -0
  84. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/wmslayer.py +0 -0
  85. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/wmssettings.py +0 -0
  86. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/wmsstore.py +0 -0
  87. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/wmtsstore.py +0 -0
  88. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/workspace.py +0 -0
  89. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/models/workspaces.py +0 -0
  90. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/services/__init__.py +0 -0
  91. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/services/owsservice.py +0 -0
  92. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/services/restclient.py +0 -0
  93. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/services/restlogger.py +0 -0
  94. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/services/restservice.py +0 -0
  95. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/templates.py +0 -0
  96. {geoservercloud-0.8.12.dev4 → geoservercloud-0.8.12.dev6}/geoservercloud/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: geoservercloud
3
- Version: 0.8.12.dev4
3
+ Version: 0.8.12.dev6
4
4
  Summary: Lightweight Python client to interact with GeoServer Cloud REST API, GeoServer ACL and OGC services
5
5
  License: BSD-2-Clause
6
6
  Author: Camptocamp
@@ -14,6 +14,7 @@ Tests verify compliance with OGC API Features Core specification:
14
14
 
15
15
  import json
16
16
  from collections.abc import Generator
17
+ from xml.etree import ElementTree
17
18
 
18
19
  import pytest
19
20
  from sqlalchemy import Connection
@@ -21,6 +22,37 @@ from sqlalchemy.sql import text
21
22
 
22
23
  from geoservercloud import GeoServerCloud
23
24
 
25
+ WFS_SETTINGS_PATH = "/rest/services/wfs/settings"
26
+
27
+ PROPERTY_SELECTION_CONFORMANCE = (
28
+ "http://www.opengis.net/spec/ogcapi-features-6/1.0/conf/properties-features"
29
+ )
30
+
31
+ XML_HEADERS = {"Content-Type": "application/xml"}
32
+
33
+ CONFORMANCE_SETTINGS = """
34
+ <wfs>
35
+ <metadata>
36
+ <entry key="ogcapiFeatures">
37
+ <ogcapiFeatures>
38
+ <core>true</core>
39
+ <propertySelection>true</propertySelection>
40
+ </ogcapiFeatures>
41
+ </entry>
42
+ </metadata>
43
+ </wfs>
44
+ """
45
+
46
+ DEFAULT_CONFORMANCE_SETTINGS = """
47
+ <wfs>
48
+ <metadata>
49
+ <entry key="ogcapiFeatures">
50
+ <ogcapiFeatures/>
51
+ </entry>
52
+ </metadata>
53
+ </wfs>
54
+ """
55
+
24
56
 
25
57
  @pytest.fixture()
26
58
  def ogcapi_workspace() -> str:
@@ -399,3 +431,88 @@ def test_ogcapi_conformance(ogcapi_workspace: str, geoserver_ogcapi_workspace):
399
431
  assert any(
400
432
  "ogcapi-features" in cc or "features/core" in cc for cc in conformance_classes
401
433
  )
434
+
435
+
436
+ @pytest.fixture()
437
+ def wfs_ogcapi_conformance(geoserver: GeoServerCloud) -> Generator[None, None, None]:
438
+ """Leaves the OGC API Features conformance settings back at their defaults."""
439
+ yield
440
+ geoserver.rest_service.rest_client.put(
441
+ f"{WFS_SETTINGS_PATH}.xml",
442
+ headers=XML_HEADERS,
443
+ data=DEFAULT_CONFORMANCE_SETTINGS,
444
+ )
445
+
446
+
447
+ def read_conformance_settings(geoserver: GeoServerCloud) -> ElementTree.Element:
448
+ """
449
+ Returns the ogcapiFeatures conformance element of the WFS settings, failing if
450
+ the REST API answered with the object rendered as a string instead.
451
+ """
452
+ response = geoserver.rest_service.rest_client.get(f"{WFS_SETTINGS_PATH}.xml")
453
+ assert response.status_code == 200
454
+
455
+ settings = ElementTree.fromstring(response.content)
456
+ entry = settings.find("./metadata/entry[@key='ogcapiFeatures']")
457
+ assert entry is not None, "the ogcapiFeatures metadata entry is missing"
458
+ assert not (entry.text or "").strip(), (
459
+ "the conformance object was stored as a string instead of an object: "
460
+ f"{entry.text!r}"
461
+ )
462
+
463
+ conformance = entry.find("ogcapiFeatures")
464
+ assert conformance is not None, "the ogcapiFeatures metadata entry has no object"
465
+ return conformance
466
+
467
+
468
+ def test_wfs_settings_rest_roundtrip_preserves_ogcapi_conformance(
469
+ geoserver: GeoServerCloud, wfs_ogcapi_conformance: None
470
+ ):
471
+ """
472
+ Reading the WFS settings and writing the same document back must not replace the OGC API Features conformance
473
+ object with the string returned by its toString(), which later breaks the service with a ClassCastException.
474
+
475
+ See https://github.com/geoserver/geoserver-cloud/issues/872
476
+ """
477
+ geoserver.rest_service.rest_client.put(
478
+ f"{WFS_SETTINGS_PATH}.xml", headers=XML_HEADERS, data=CONFORMANCE_SETTINGS
479
+ )
480
+
481
+ conformance = read_conformance_settings(geoserver)
482
+ assert conformance.findtext("core") == "true"
483
+ assert conformance.findtext("propertySelection") == "true"
484
+
485
+ # the round trip from the issue: read the settings and write them back unchanged
486
+ settings = geoserver.rest_service.rest_client.get(f"{WFS_SETTINGS_PATH}.xml")
487
+ geoserver.rest_service.rest_client.put(
488
+ f"{WFS_SETTINGS_PATH}.xml", headers=XML_HEADERS, data=settings.content
489
+ )
490
+
491
+ conformance = read_conformance_settings(geoserver)
492
+ assert conformance.findtext("core") == "true"
493
+ assert conformance.findtext("propertySelection") == "true"
494
+
495
+
496
+ def test_ogcapi_conformance_after_wfs_settings_rest_roundtrip(
497
+ geoserver: GeoServerCloud, wfs_ogcapi_conformance: None
498
+ ):
499
+ """
500
+ The OGC API Features service must still answer after the WFS settings went through a REST round trip.
501
+
502
+ See https://github.com/geoserver/geoserver-cloud/issues/872
503
+ """
504
+ geoserver.rest_service.rest_client.put(
505
+ f"{WFS_SETTINGS_PATH}.xml", headers=XML_HEADERS, data=CONFORMANCE_SETTINGS
506
+ )
507
+ settings = geoserver.rest_service.rest_client.get(f"{WFS_SETTINGS_PATH}.xml")
508
+ geoserver.rest_service.rest_client.put(
509
+ f"{WFS_SETTINGS_PATH}.xml", headers=XML_HEADERS, data=settings.content
510
+ )
511
+
512
+ response = geoserver.rest_service.rest_client.get(
513
+ "/ogc/features/v1/conformance", params={"f": "application/json"}
514
+ )
515
+ assert response.status_code == 200
516
+
517
+ conformance_classes = json.loads(response.content.decode("utf-8"))["conformsTo"]
518
+ assert PROPERTY_SELECTION_CONFORMANCE in conformance_classes
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "geoservercloud"
3
- version = "0.8.12.dev4"
3
+ version = "0.8.12.dev6"
4
4
  description = "Lightweight Python client to interact with GeoServer Cloud REST API, GeoServer ACL and OGC services"
5
5
  authors = ["Camptocamp <info@camptocamp.com>"]
6
6
  license = "BSD-2-Clause"