geoservercloud 0.7.4.dev1__tar.gz → 0.7.4.dev4__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 (87) hide show
  1. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/PKG-INFO +1 -1
  2. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/geoservercloud.py +140 -17
  3. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/layergroup.py +4 -0
  4. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/services/restservice.py +3 -1
  5. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/pyproject.toml +1 -1
  6. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/LICENSE +0 -0
  7. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/README.md +0 -0
  8. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/.gitignore +0 -0
  9. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/README.md +0 -0
  10. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/__init__.py +0 -0
  11. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/cli.py +0 -0
  12. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/compose/example.compose.yaml +0 -0
  13. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/compose/geodatabase/001_create_schemas.sql +0 -0
  14. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/config.py +0 -0
  15. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/data/sampledata.tgz +0 -0
  16. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/example.config.yaml +0 -0
  17. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/__init__.py +0 -0
  18. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/conftest.py +0 -0
  19. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/__init__.py +0 -0
  20. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/__init__.py +0 -0
  21. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_None_expected.png +0 -0
  22. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language__expected.png +0 -0
  23. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_de_expected.png +0 -0
  24. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_fr_expected.png +0 -0
  25. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_it_expected.png +0 -0
  26. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language_None_expected.png +0 -0
  27. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language__expected.png +0 -0
  28. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language_it_expected.png +0 -0
  29. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_None_expected.png +0 -0
  30. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language__expected.png +0 -0
  31. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_de_expected.png +0 -0
  32. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_fr_expected.png +0 -0
  33. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_it_expected.png +0 -0
  34. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language_None_expected.png +0 -0
  35. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language__expected.png +0 -0
  36. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language_it_expected.png +0 -0
  37. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/localized_labels.sld +0 -0
  38. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/localized_no_default.sld +0 -0
  39. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/i18n/localized_with_default.sld +0 -0
  40. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/wfs/__init__.py +0 -0
  41. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/wfs/wfs_delete_payload.xml +0 -0
  42. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/wfs/wfs_insert_payload.xml +0 -0
  43. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/wms/__init__.py +0 -0
  44. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/resources/wms/getmap_expected.png +0 -0
  45. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_cascaded_stores.py +0 -0
  46. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_cog.py +0 -0
  47. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_datastore.py +0 -0
  48. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_get_version.py +0 -0
  49. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_gwc.py +0 -0
  50. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_i18n.py +0 -0
  51. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_imagemosaic.py +0 -0
  52. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_imagemosaic_cog.py +0 -0
  53. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_wfs.py +0 -0
  54. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_wms.py +0 -0
  55. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/test_workspace.py +0 -0
  56. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoserver_acceptance_tests/tests/utils.py +0 -0
  57. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/__init__.py +0 -0
  58. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/geoservercloudsync.py +0 -0
  59. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/gridsets/2056.xml +0 -0
  60. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/gridsets/21781.xml +0 -0
  61. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/gridsets/3857.xml +0 -0
  62. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/__init__.py +0 -0
  63. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/abstractlayer.py +0 -0
  64. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/common.py +0 -0
  65. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/coverage.py +0 -0
  66. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/coverages.py +0 -0
  67. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/coveragestore.py +0 -0
  68. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/datastore.py +0 -0
  69. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/datastores.py +0 -0
  70. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/featuretype.py +0 -0
  71. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/featuretypes.py +0 -0
  72. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/layer.py +0 -0
  73. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/layergroups.py +0 -0
  74. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/resourcedirectory.py +0 -0
  75. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/style.py +0 -0
  76. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/styles.py +0 -0
  77. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/wmslayer.py +0 -0
  78. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/wmssettings.py +0 -0
  79. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/wmsstore.py +0 -0
  80. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/workspace.py +0 -0
  81. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/models/workspaces.py +0 -0
  82. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/services/__init__.py +0 -0
  83. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/services/owsservice.py +0 -0
  84. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/services/restclient.py +0 -0
  85. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/services/restlogger.py +0 -0
  86. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/templates.py +0 -0
  87. {geoservercloud-0.7.4.dev1 → geoservercloud-0.7.4.dev4}/geoservercloud/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: geoservercloud
3
- Version: 0.7.4.dev1
3
+ Version: 0.7.4.dev4
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
@@ -434,6 +434,97 @@ class GeoServerCloud:
434
434
 
435
435
  return content, code
436
436
 
437
+ def create_pmtiles_datastore(
438
+ self,
439
+ workspace_name: str,
440
+ datastore_name: str,
441
+ pmtiles_url: str,
442
+ description: str | None = None,
443
+ range_reader_provider: str = "file",
444
+ caching_enabled: bool = True,
445
+ caching_block_aligned: bool = True,
446
+ http_timeout_millis: int = 5000,
447
+ http_trust_all_certificates: bool = False,
448
+ s3_use_default_credentials_provider: bool = False,
449
+ s3_force_path_style: bool = True,
450
+ gcs_default_credentials_chain: bool = False,
451
+ ) -> tuple[str, int]:
452
+ """
453
+ Create a PMTiles datastore, or update it if it already exists.
454
+
455
+ :param workspace_name: Name of the workspace
456
+ :type workspace_name: str
457
+ :param datastore_name: Name for the PMTiles datastore
458
+ :type datastore_name: str
459
+ :param pmtiles_url: URL or path to the PMTiles file
460
+ :type pmtiles_url: str
461
+ :param description: Optional description for the datastore
462
+ :type description: str, optional
463
+ :param range_reader_provider: Range reader provider type (default: "file")
464
+ :type range_reader_provider: str, optional
465
+ :param caching_enabled: Enable caching for range reader (default: True)
466
+ :type caching_enabled: bool, optional
467
+ :param caching_block_aligned: Enable block-aligned caching (default: True)
468
+ :type caching_block_aligned: bool, optional
469
+ :param http_timeout_millis: HTTP timeout in milliseconds (default: 5000)
470
+ :type http_timeout_millis: int, optional
471
+ :param http_trust_all_certificates: Trust all SSL certificates for HTTP (default: False)
472
+ :type http_trust_all_certificates: bool, optional
473
+ :param s3_use_default_credentials_provider: Use default AWS credentials provider for S3 (default: False)
474
+ :type s3_use_default_credentials_provider: bool, optional
475
+ :param s3_force_path_style: Force path-style access for S3 (default: True)
476
+ :type s3_force_path_style: bool, optional
477
+ :param gcs_default_credentials_chain: Use default credentials chain for Google Cloud Storage (default: False)
478
+ :type gcs_default_credentials_chain: bool, optional
479
+
480
+ :return: Tuple of (datastore_name, status_code)
481
+ :rtype: tuple
482
+
483
+ :Example:
484
+
485
+ >>> create_pmtiles_datastore(
486
+ ... workspace_name="pmtiles_workspace",
487
+ ... datastore_name="pmtiles_store",
488
+ ... pmtiles_url="file:///mnt/pmtiles/mypmtilesfile.pmtiles",
489
+ ... description="My PMTiles datastore",
490
+ ... range_reader_provider="file",
491
+ ... )
492
+ """
493
+
494
+ datastore = DataStore(
495
+ workspace_name,
496
+ datastore_name,
497
+ connection_parameters={
498
+ "pmtiles": pmtiles_url,
499
+ "namespace": f"http://{workspace_name}",
500
+ "io.tileverse.rangereader.provider": range_reader_provider,
501
+ "io.tileverse.rangereader.caching.enabled": str(
502
+ caching_enabled
503
+ ).lower(),
504
+ "io.tileverse.rangereader.caching.blockaligned": str(
505
+ caching_block_aligned
506
+ ).lower(),
507
+ "io.tileverse.rangereader.http.timeout-millis": str(
508
+ http_timeout_millis
509
+ ),
510
+ "io.tileverse.rangereader.http.trust-all-certificates": str(
511
+ http_trust_all_certificates
512
+ ).lower(),
513
+ "io.tileverse.rangereader.s3.use-default-credentials-provider": str(
514
+ s3_use_default_credentials_provider
515
+ ).lower(),
516
+ "io.tileverse.rangereader.s3.force-path-style": str(
517
+ s3_force_path_style
518
+ ).lower(),
519
+ "io.tileverse.rangereader.gcs.default-credentials-chain": str(
520
+ gcs_default_credentials_chain
521
+ ).lower(),
522
+ },
523
+ type="PMTiles",
524
+ description=description,
525
+ )
526
+ return self.rest_service.create_datastore(workspace_name, datastore)
527
+
437
528
  def get_wms_store(
438
529
  self, workspace_name: str, datastore_name: str
439
530
  ) -> tuple[dict[str, Any] | str, int]:
@@ -723,8 +814,8 @@ class GeoServerCloud:
723
814
  layer_name: str,
724
815
  workspace_name: str | None = None,
725
816
  datastore_name: str | None = None,
726
- title: str | dict = "Default title",
727
- abstract: str | dict = "Default abstract",
817
+ title: str | dict | None = None,
818
+ abstract: str | dict | None = None,
728
819
  attributes: dict | None = None,
729
820
  epsg: int = 4326,
730
821
  keywords: list[str] = [],
@@ -792,9 +883,10 @@ class GeoServerCloud:
792
883
  self,
793
884
  group: str,
794
885
  workspace_name: str | None,
795
- layers: list[str],
796
- title: str | dict,
797
- abstract: str | dict,
886
+ layers: list[str] | None = None,
887
+ styles: list[str] | None = None,
888
+ title: str | dict | None = None,
889
+ abstract: str | dict | None = None,
798
890
  epsg: int = 4326,
799
891
  mode: str = "SINGLE",
800
892
  enabled: bool = True,
@@ -806,10 +898,15 @@ class GeoServerCloud:
806
898
  workspace_name = workspace_name or self.default_workspace
807
899
  if not workspace_name:
808
900
  raise ValueError("Workspace not provided")
809
- if not mode in LayerGroup.modes:
901
+ if mode not in LayerGroup.modes:
810
902
  raise ValueError(
811
903
  f"Invalid mode: {mode}, possible values are: {LayerGroup.modes}"
812
904
  )
905
+ if not layers and not styles:
906
+ raise ValueError(
907
+ "Either layers or styles must be provided for a layer group"
908
+ )
909
+
813
910
  bounds = {
814
911
  "minx": utils.EPSG_BBOX[epsg]["nativeBoundingBox"]["minx"],
815
912
  "maxx": utils.EPSG_BBOX[epsg]["nativeBoundingBox"]["maxx"],
@@ -817,13 +914,23 @@ class GeoServerCloud:
817
914
  "maxy": utils.EPSG_BBOX[epsg]["nativeBoundingBox"]["maxy"],
818
915
  "crs": f"EPSG:{epsg}",
819
916
  }
917
+
918
+ publishables = None
919
+ if layers:
920
+ publishables = [f"{workspace_name}:{layer}" for layer in layers]
921
+
922
+ formatted_styles = None
923
+ if styles:
924
+ formatted_styles = [f"{workspace_name}:{style}" for style in styles]
925
+
820
926
  layer_group = LayerGroup(
821
927
  name=group,
822
928
  mode=mode,
823
929
  workspace_name=workspace_name,
824
930
  title=title,
825
931
  abstract=abstract,
826
- publishables=[f"{workspace_name}:{layer}" for layer in layers],
932
+ publishables=publishables,
933
+ styles=formatted_styles,
827
934
  bounds=bounds,
828
935
  enabled=enabled,
829
936
  advertised=advertised,
@@ -903,9 +1010,15 @@ class GeoServerCloud:
903
1010
  style_name: str,
904
1011
  filename: str,
905
1012
  workspace_name: str | None = None,
1013
+ format: str = "sld",
906
1014
  ) -> tuple[str, int]:
907
1015
  """Create a style definition"""
908
- style = Style(name=style_name, filename=filename, workspace_name=workspace_name)
1016
+ style = Style(
1017
+ name=style_name,
1018
+ filename=filename,
1019
+ workspace_name=workspace_name,
1020
+ format=format,
1021
+ )
909
1022
  return self.rest_service.create_style_definition(
910
1023
  style_name=style_name, style=style, workspace_name=workspace_name
911
1024
  )
@@ -932,21 +1045,31 @@ class GeoServerCloud:
932
1045
  file: str,
933
1046
  workspace_name: str | None = None,
934
1047
  ) -> tuple[str, int]:
935
- """Create a style (SLD) from a file, or update it if it already exists.
936
- Supported file extensions are .sld and .zip."""
937
- file_base_name = Path(file).name
938
- file_ext = Path(file).suffix
939
- content, code = self.create_style_definition(
940
- style_name, f"{file_base_name}.sld", workspace_name
941
- )
942
- if code >= 400:
943
- return content, code
1048
+ """Create a style from a file, or update it if it already exists.
1049
+ Supported file extensions are .sld, .zip and .mbstyle."""
1050
+ file_ext = Path(file).suffix.lower()
944
1051
  if file_ext == ".sld":
1052
+ style_format = "sld"
1053
+ style_definition_filename = f"{style_name}.sld"
945
1054
  file_format = "sld"
946
1055
  elif file_ext == ".zip":
1056
+ style_format = "sld"
1057
+ style_definition_filename = f"{style_name}.sld"
947
1058
  file_format = "zip"
1059
+ elif file_ext == ".mbstyle":
1060
+ style_format = "mbstyle"
1061
+ style_definition_filename = f"{style_name}.mbstyle"
1062
+ file_format = "mbstyle"
948
1063
  else:
949
1064
  raise ValueError(f"Unsupported file extension: {file_ext}")
1065
+ content, code = self.create_style_definition(
1066
+ style_name,
1067
+ style_definition_filename,
1068
+ workspace_name,
1069
+ format=style_format,
1070
+ )
1071
+ if code >= 400:
1072
+ return content, code
950
1073
  with open(f"{file}", "rb") as fs:
951
1074
  style: bytes = fs.read()
952
1075
  return self.rest_service.create_style(
@@ -93,6 +93,10 @@ class LayerGroup(EntityModel):
93
93
  {"@type": "layer", "name": p.name} for p in self.publishables
94
94
  ]
95
95
  }
96
+ elif self.styles:
97
+ # Style group: empty publishables with styles
98
+ content["publishables"] = {"published": ""}
99
+
96
100
  if self.styles:
97
101
  content["styles"] = {"style": [s.asdict() for s in self.styles]}
98
102
  elif self.publishables:
@@ -603,6 +603,8 @@ class RestService:
603
603
  headers = {"Content-Type": "application/vnd.ogc.sld+xml"}
604
604
  elif format == "zip":
605
605
  headers = {"Content-Type": "application/zip"}
606
+ elif format == "mbstyle":
607
+ headers = {"Content-Type": "application/vnd.geoserver.mbstyle+json"}
606
608
  # Do not check for existence because GeoServer throws a 500 if the style definition exists and not
607
609
  # the SLD. Besides PUT is also supported on creation
608
610
  response: Response = self.rest_client.put(
@@ -915,7 +917,7 @@ class RestService:
915
917
  url: str = f"{self.base_url}/styles/{style_name}"
916
918
  else:
917
919
  url = f"{self.base_url}/workspaces/{workspace_name}/styles/{style_name}"
918
- if format in ("json", "sld"):
920
+ if format in ("json", "sld", "mbstyle"):
919
921
  return f"{url}.{format}"
920
922
  return url
921
923
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "geoservercloud"
3
- version = "0.7.4.dev1"
3
+ version = "0.7.4.dev4"
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"