diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a9cd8bb8..fc6cb151 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,6 +13,6 @@ checkbox. - [ ] Config lockfile updated (`inv config.export > qgreenland/config/cfg-lock.json`) - [ ] Environment lockfile updated if needed (`conda-lock`) - [ ] Version bumped if needed (`bumpversion (major|minor|patch|prerelease|build)`) -- [ ] CHANGELOG.md updated +- [ ] CHANGELOG.md updated (for user-facing changes) - [ ] Documentation updated if needed - [ ] New unit tests if needed diff --git a/CHANGELOG.md b/CHANGELOG.md index 95f2295e..0253fe6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ places" layer. Scale point markers for this layer by population. * Add new "Internet-required data/Geological Map (1:500 000)" layer from GEUS. * Add new "Geology/Mineral occurrences" layer from GEUS. +* Update `layer_list.csv` to include new column indicating if each layer is + stored on disk. Internet-required layers take the value `False`. # v3.0.0alpha4 (2023-07-21) diff --git a/qgreenland/_typing.py b/qgreenland/_typing.py index 0d0683fd..f26810d5 100644 --- a/qgreenland/_typing.py +++ b/qgreenland/_typing.py @@ -5,7 +5,7 @@ """ from typing import Literal, Union -QgsLayerType = Literal["Vector", "Raster", "Online"] +VectorOrRaster = Literal["Vector", "Raster"] QgsLayerProviderType = Literal["gdal", "ogr", "wms", "wfs", "wcs"] ResamplingMethod = Literal["bilinear", "nearest"] diff --git a/qgreenland/constants/misc.py b/qgreenland/constants/misc.py index cf4635c4..a27e907e 100644 --- a/qgreenland/constants/misc.py +++ b/qgreenland/constants/misc.py @@ -1,6 +1,6 @@ -from qgreenland._typing import QgsLayerProviderType, QgsLayerType +from qgreenland._typing import QgsLayerProviderType, VectorOrRaster -PROVIDER_LAYERTYPE_MAPPING: dict[QgsLayerProviderType, QgsLayerType] = { +PROVIDER_VECTOR_OR_RASTER_MAPPING: dict[QgsLayerProviderType, VectorOrRaster] = { "gdal": "Raster", "wms": "Raster", "wfs": "Vector", diff --git a/qgreenland/models/config/asset.py b/qgreenland/models/config/asset.py index d0f1d90d..fb3490d0 100644 --- a/qgreenland/models/config/asset.py +++ b/qgreenland/models/config/asset.py @@ -44,9 +44,7 @@ def provenance(self) -> str: return f"# Data fetched via HTTP from {[str(u) for u in self.urls]}" -# TODO: OnlineRaster/OnlineVector asset types? The thing that makes this a -# "gdal_remote" layer is the `/vsicurl/` prefix. Otherwise, this is created as a -# regular layer with a URL as its path. +# TODO: OnlineRaster/OnlineVector asset types? class OnlineAsset(DatasetAsset): """A QGIS online layer that is not fetched, but is accessed by QGIS.""" diff --git a/qgreenland/test/util/config/test_config_export.py b/qgreenland/test/util/config/test_config_export.py index c2a7b845..a9b5f6f4 100644 --- a/qgreenland/test/util/config/test_config_export.py +++ b/qgreenland/test/util/config/test_config_export.py @@ -117,7 +117,8 @@ def test_export_config_csv(full_cfg): { **common, "Layer Title": "Example online", - "Vector or Raster": "Online", + "Vector or Raster": "Raster", + "Internet Required?": "False", }, { **common, @@ -125,6 +126,7 @@ def test_export_config_csv(full_cfg): "Vector or Raster": "Raster", "Layer Size": "619 Bytes", "Layer Size Bytes": "619", + "Internet Required?": "True", }, ] diff --git a/qgreenland/test/util/test_misc.py b/qgreenland/test/util/test_misc.py index 53f11188..ab6e6d78 100644 --- a/qgreenland/test/util/test_misc.py +++ b/qgreenland/test/util/test_misc.py @@ -9,5 +9,5 @@ def test_layer_compile_dir(raster_layer_node): assert expected == actual -def test_vector_or_raster_gdal_remote(online_layer_node): +def test_vector_or_raster(online_layer_node): assert layer_util.vector_or_raster(online_layer_node) == "Raster" diff --git a/qgreenland/util/config/export.py b/qgreenland/util/config/export.py index cd1f4fd6..6912fcf1 100644 --- a/qgreenland/util/config/export.py +++ b/qgreenland/util/config/export.py @@ -12,7 +12,7 @@ from humanize import naturalsize -from qgreenland._typing import QgsLayerType +from qgreenland._typing import VectorOrRaster from qgreenland.models.config import Config from qgreenland.models.config.asset import OnlineAsset from qgreenland.util.fs import directory_contents, directory_size_bytes @@ -82,16 +82,20 @@ def export_config_csv( if not layer_cfg.in_package: continue - layer_type: QgsLayerType + vector_or_raster_data: VectorOrRaster + internet_required: bool + + vector_or_raster_data = vector_or_raster(layer_node) + if isinstance(layer_cfg.input.asset, OnlineAsset): - layer_type = "Online" # Online layers have no size on disk. layer_size_bytes = 0 + internet_required = False else: layer_fp = get_layer_compile_filepath(layer_node) layer_dir = layer_fp.parent layer_size_bytes = directory_size_bytes(layer_dir) - layer_type = vector_or_raster(layer_node) + internet_required = True dataset_cfg = layer_cfg.input.dataset @@ -101,13 +105,14 @@ def export_config_csv( "Subgroup": "/".join(layer_node.group_name_path[1:]), "Layer Title": layer_cfg.title, "Layer Description": layer_cfg.description, - "Vector or Raster": layer_type, + "Vector or Raster": vector_or_raster_data, "Data Source Title": dataset_cfg.metadata.title, "Data Source Abstract": dataset_cfg.metadata.abstract, "Data Source Citation": dataset_cfg.metadata.citation.text, "Data Source Citation URL": dataset_cfg.metadata.citation.url, "Layer Size": naturalsize(layer_size_bytes), "Layer Size Bytes": layer_size_bytes, + "Internet Required?": internet_required, } ) diff --git a/qgreenland/util/layer.py b/qgreenland/util/layer.py index 2e309efd..d7677b71 100644 --- a/qgreenland/util/layer.py +++ b/qgreenland/util/layer.py @@ -1,8 +1,8 @@ from pathlib import Path import qgreenland.exceptions as exc -from qgreenland._typing import QgsLayerType -from qgreenland.constants.misc import PROVIDER_LAYERTYPE_MAPPING +from qgreenland._typing import VectorOrRaster +from qgreenland.constants.misc import PROVIDER_VECTOR_OR_RASTER_MAPPING from qgreenland.constants.paths import COMPILE_PACKAGE_DIR, RELEASE_LAYERS_DIR from qgreenland.models.config.asset import OnlineAsset from qgreenland.models.config.layer import Layer @@ -10,10 +10,10 @@ from qgreenland.util.tree import LayerNode -def vector_or_raster(layer_node: LayerNode) -> QgsLayerType: +def vector_or_raster(layer_node: LayerNode) -> VectorOrRaster: layer_cfg = layer_node.layer_cfg if type(layer_cfg.input.asset) is OnlineAsset: - return PROVIDER_LAYERTYPE_MAPPING[layer_cfg.input.asset.provider] + return PROVIDER_VECTOR_OR_RASTER_MAPPING[layer_cfg.input.asset.provider] else: layer_path = get_layer_compile_filepath(layer_node) return _vector_or_raster_from_fp(layer_path) @@ -57,7 +57,7 @@ def _layer_dirname_from_cfg(layer_cfg: Layer) -> str: return layer_cfg.title -def _vector_or_raster_from_fp(fp: Path) -> QgsLayerType: +def _vector_or_raster_from_fp(fp: Path) -> VectorOrRaster: if fp.suffix == ".tif": return "Raster" elif fp.suffix == ".gpkg":