From 51c7b01a38e0dfe3683f702eca93e5ee697f33ed Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 13:34:01 +0100 Subject: [PATCH 01/11] refactor: first pass --- .../_cdf_tk/resource_classes/infield_cdmv1.py | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py diff --git a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py new file mode 100644 index 0000000000..21831d1baf --- /dev/null +++ b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py @@ -0,0 +1,121 @@ +from typing import Any + +from cognite.client.data_classes.data_modeling import DirectRelationReference +from cognite.client.data_classes.data_modeling.ids import DataModelId + +from .base import BaseModelResource, ToolkitResource + + +class LocationFilterDTOProperties(BaseModelResource): + """Properties for LocationFilterDTO node. + + Currently migrated fields: + - name: The name of the location filter + - description: Description indicating this was migrated from old location + - instanceSpaces: List of instance spaces from sourceDataInstanceSpace and appDataInstanceSpace + - dataModels: List of DataModelId references to data models + """ + + externalId: str + name: str + description: str + instanceSpaces: list[str] + dataModels: list[DataModelId] + + +class ObservationFeatureToggles(BaseModelResource): + """Feature toggles for observations.""" + + isEnabled: bool + isWriteBackEnabled: bool + notificationsEndpointExternalId: str + attachmentsEndpointExternalId: str + + +class FeatureToggles(BaseModelResource): + """Feature toggles for InField location configuration.""" + + threeD: bool + trends: bool + documents: bool + workorders: bool + notifications: bool + media: bool + templateChecklistFlow: bool + workorderChecklistFlow: bool + observations: ObservationFeatureToggles + + +class AccessManagement(BaseModelResource): + """Access management configuration.""" + + templateAdmins: list[str] # list of CDF group external IDs + checklistAdmins: list[str] # list of CDF group external IDs + + +class Discipline(BaseModelResource): + """Discipline definition.""" + + externalId: str + name: str + + +class ResourceFilters(BaseModelResource): + """Resource filters.""" + + datasetIds: list[int] | None + assetSubtreeExternalIds: list[str] | None + rootAssetExternalIds: list[str] | None + externalIdPrefix: str | None + spaces: list[str] | None + + +class RootLocationDataFilters(BaseModelResource): + """Data filters for root location.""" + + general: ResourceFilters | None + assets: ResourceFilters | None + files: ResourceFilters | None + timeseries: ResourceFilters | None + + +class DataExplorationConfigProperties(BaseModelResource): + """Properties for DataExplorationConfig node. + + Contains configuration for data exploration features: + - observations: Observations feature configuration + - activities: Activities configuration + - documents: Document configuration + - notifications: Notifications configuration + - assets: Asset page configuration + """ + + observations: dict[str, Any] # ObservationsConfigFeature + activities: dict[str, Any] # ActivitiesConfiguration + documents: dict[str, Any] # DocumentConfiguration + notifications: dict[str, Any] # NotificationsConfiguration + assets: dict[str, Any] # AssetPageConfiguration + + +class InfieldCDMV1YAML(ToolkitResource): + """Properties for InFieldLocationConfig node. + + Currently migrated fields: + - rootLocationExternalId: Reference to the LocationFilterDTO external ID + - featureToggles: Feature toggles migrated from old configuration + - rootAsset: Direct relation to the root asset (space and externalId) + - appInstanceSpace: Application instance space from appDataInstanceSpace + - accessManagement: Template and checklist admin groups (from templateAdmins and checklistAdmins) + - disciplines: List of disciplines (from disciplines in FeatureConfiguration) + - dataFilters: Data filters for general, assets, files, and timeseries (from dataFilters in old configuration) + - dataExplorationConfig: Direct relation to the DataExplorationConfig node (shared across all locations) + """ + + rootLocationExternalId: str + featureToggles: FeatureToggles + rootAsset: DirectRelationReference + appInstanceSpace: str + accessManagement: AccessManagement + disciplines: list[Discipline] + dataFilters: RootLocationDataFilters + dataExplorationConfig: DirectRelationReference From 8d5915fbb55f48538f937f4ac1feabe84d68abc7 Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 13:36:59 +0100 Subject: [PATCH 02/11] fix --- cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py index 21831d1baf..7c27d4378e 100644 --- a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py +++ b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py @@ -97,7 +97,7 @@ class DataExplorationConfigProperties(BaseModelResource): assets: dict[str, Any] # AssetPageConfiguration -class InfieldCDMV1YAML(ToolkitResource): +class InfieldCDMv1YAML(ToolkitResource): """Properties for InFieldLocationConfig node. Currently migrated fields: From dcf3b3fd7cfdae85bf60fe841360bea7861d7331 Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 14:00:27 +0100 Subject: [PATCH 03/11] refactor: adjust to system space model --- .../_cdf_tk/resource_classes/infield_cdmv1.py | 48 +++++++------------ 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py index 7c27d4378e..a904439e3c 100644 --- a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py +++ b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py @@ -1,28 +1,8 @@ from typing import Any -from cognite.client.data_classes.data_modeling import DirectRelationReference -from cognite.client.data_classes.data_modeling.ids import DataModelId - from .base import BaseModelResource, ToolkitResource -class LocationFilterDTOProperties(BaseModelResource): - """Properties for LocationFilterDTO node. - - Currently migrated fields: - - name: The name of the location filter - - description: Description indicating this was migrated from old location - - instanceSpaces: List of instance spaces from sourceDataInstanceSpace and appDataInstanceSpace - - dataModels: List of DataModelId references to data models - """ - - externalId: str - name: str - description: str - instanceSpaces: list[str] - dataModels: list[DataModelId] - - class ObservationFeatureToggles(BaseModelResource): """Feature toggles for observations.""" @@ -53,13 +33,6 @@ class AccessManagement(BaseModelResource): checklistAdmins: list[str] # list of CDF group external IDs -class Discipline(BaseModelResource): - """Discipline definition.""" - - externalId: str - name: str - - class ResourceFilters(BaseModelResource): """Resource filters.""" @@ -79,7 +52,7 @@ class RootLocationDataFilters(BaseModelResource): timeseries: ResourceFilters | None -class DataExplorationConfigProperties(BaseModelResource): +class DataExplorationConfig(BaseModelResource): """Properties for DataExplorationConfig node. Contains configuration for data exploration features: @@ -90,6 +63,8 @@ class DataExplorationConfigProperties(BaseModelResource): - assets: Asset page configuration """ + externalId: str + observations: dict[str, Any] # ObservationsConfigFeature activities: dict[str, Any] # ActivitiesConfiguration documents: dict[str, Any] # DocumentConfiguration @@ -97,7 +72,13 @@ class DataExplorationConfigProperties(BaseModelResource): assets: dict[str, Any] # AssetPageConfiguration -class InfieldCDMv1YAML(ToolkitResource): +class ObservationConfig(BaseModelResource): + externalId: str + root_location_external_ids: list[str] + field_configurations: dict[str, Any] + + +class InfieldLocationConfigYAML(ToolkitResource): """Properties for InFieldLocationConfig node. Currently migrated fields: @@ -111,11 +92,14 @@ class InfieldCDMv1YAML(ToolkitResource): - dataExplorationConfig: Direct relation to the DataExplorationConfig node (shared across all locations) """ + externalId: str + rootLocationExternalId: str featureToggles: FeatureToggles - rootAsset: DirectRelationReference + classic_asset_external_id: str appInstanceSpace: str + app_data_set: str accessManagement: AccessManagement - disciplines: list[Discipline] dataFilters: RootLocationDataFilters - dataExplorationConfig: DirectRelationReference + observation_config: ObservationConfig + dataExplorationConfig: DataExplorationConfig From e378e5aa466bdb282ff33c85e839aaf592cf994f Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 14:53:47 +0100 Subject: [PATCH 04/11] fix: casing --- .../_cdf_tk/resource_classes/infield_cdmv1.py | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py index a904439e3c..02f732dd4c 100644 --- a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py +++ b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py @@ -6,40 +6,40 @@ class ObservationFeatureToggles(BaseModelResource): """Feature toggles for observations.""" - isEnabled: bool - isWriteBackEnabled: bool - notificationsEndpointExternalId: str - attachmentsEndpointExternalId: str + is_enabled: bool + is_write_back_enabled: bool + notifications_endpoint_external_id: str + attachments_endpoint_external_id: str class FeatureToggles(BaseModelResource): """Feature toggles for InField location configuration.""" - threeD: bool + three_d: bool trends: bool documents: bool workorders: bool notifications: bool media: bool - templateChecklistFlow: bool - workorderChecklistFlow: bool + template_checklist_flow: bool + workorder_checklist_flow: bool observations: ObservationFeatureToggles class AccessManagement(BaseModelResource): """Access management configuration.""" - templateAdmins: list[str] # list of CDF group external IDs - checklistAdmins: list[str] # list of CDF group external IDs + template_admins: list[str] # list of CDF group external IDs + checklist_admins: list[str] # list of CDF group external IDs class ResourceFilters(BaseModelResource): """Resource filters.""" - datasetIds: list[int] | None - assetSubtreeExternalIds: list[str] | None - rootAssetExternalIds: list[str] | None - externalIdPrefix: str | None + dataset_ids: list[int] | None + asset_subtree_external_ids: list[str] | None + root_asset_external_ids: list[str] | None + external_id_prefix: str | None spaces: list[str] | None @@ -63,7 +63,7 @@ class DataExplorationConfig(BaseModelResource): - assets: Asset page configuration """ - externalId: str + external_id: str observations: dict[str, Any] # ObservationsConfigFeature activities: dict[str, Any] # ActivitiesConfiguration @@ -73,7 +73,7 @@ class DataExplorationConfig(BaseModelResource): class ObservationConfig(BaseModelResource): - externalId: str + external_id: str root_location_external_ids: list[str] field_configurations: dict[str, Any] @@ -82,24 +82,24 @@ class InfieldLocationConfigYAML(ToolkitResource): """Properties for InFieldLocationConfig node. Currently migrated fields: - - rootLocationExternalId: Reference to the LocationFilterDTO external ID - - featureToggles: Feature toggles migrated from old configuration + - root_location_external_id: Reference to the LocationFilterDTO external ID + - feature_toggles: Feature toggles migrated from old configuration - rootAsset: Direct relation to the root asset (space and externalId) - - appInstanceSpace: Application instance space from appDataInstanceSpace - - accessManagement: Template and checklist admin groups (from templateAdmins and checklistAdmins) + - app_instance_space: Application instance space from appDataInstanceSpace + - access_management: Template and checklist admin groups (from templateAdmins and checklistAdmins) - disciplines: List of disciplines (from disciplines in FeatureConfiguration) - - dataFilters: Data filters for general, assets, files, and timeseries (from dataFilters in old configuration) - - dataExplorationConfig: Direct relation to the DataExplorationConfig node (shared across all locations) + - data_filters: Data filters for general, assets, files, and timeseries (from dataFilters in old configuration) + - data_exploration_config: Direct relation to the DataExplorationConfig node (shared across all locations) """ - externalId: str + external_id: str - rootLocationExternalId: str - featureToggles: FeatureToggles + root_location_external_id: str + feature_toggles: FeatureToggles classic_asset_external_id: str - appInstanceSpace: str + app_instance_space: str app_data_set: str - accessManagement: AccessManagement - dataFilters: RootLocationDataFilters + access_management: AccessManagement + data_filters: RootLocationDataFilters observation_config: ObservationConfig - dataExplorationConfig: DataExplorationConfig + data_exploration_config: DataExplorationConfig From 98ec3c5f51c83739a0135ae16bd6e1bd92ef5c56 Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 14:55:39 +0100 Subject: [PATCH 05/11] refactor: make optional --- .../_cdf_tk/resource_classes/infield_cdmv1.py | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py index 02f732dd4c..5ceb9ec82b 100644 --- a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py +++ b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py @@ -6,50 +6,50 @@ class ObservationFeatureToggles(BaseModelResource): """Feature toggles for observations.""" - is_enabled: bool - is_write_back_enabled: bool - notifications_endpoint_external_id: str - attachments_endpoint_external_id: str + is_enabled: bool | None = None + is_write_back_enabled: bool | None = None + notifications_endpoint_external_id: str | None = None + attachments_endpoint_external_id: str | None = None class FeatureToggles(BaseModelResource): """Feature toggles for InField location configuration.""" - three_d: bool - trends: bool - documents: bool - workorders: bool - notifications: bool - media: bool - template_checklist_flow: bool - workorder_checklist_flow: bool - observations: ObservationFeatureToggles + three_d: bool | None = None + trends: bool | None = None + documents: bool | None = None + workorders: bool | None = None + notifications: bool | None = None + media: bool | None = None + template_checklist_flow: bool | None = None + workorder_checklist_flow: bool | None = None + observations: ObservationFeatureToggles | None = None class AccessManagement(BaseModelResource): """Access management configuration.""" - template_admins: list[str] # list of CDF group external IDs - checklist_admins: list[str] # list of CDF group external IDs + template_admins: list[str] | None = None # list of CDF group external IDs + checklist_admins: list[str] | None = None # list of CDF group external IDs class ResourceFilters(BaseModelResource): """Resource filters.""" - dataset_ids: list[int] | None - asset_subtree_external_ids: list[str] | None - root_asset_external_ids: list[str] | None - external_id_prefix: str | None - spaces: list[str] | None + dataset_ids: list[int] | None = None + asset_subtree_external_ids: list[str] | None = None + root_asset_external_ids: list[str] | None = None + external_id_prefix: str | None = None + spaces: list[str] | None = None class RootLocationDataFilters(BaseModelResource): """Data filters for root location.""" - general: ResourceFilters | None - assets: ResourceFilters | None - files: ResourceFilters | None - timeseries: ResourceFilters | None + general: ResourceFilters | None = None + assets: ResourceFilters | None = None + files: ResourceFilters | None = None + timeseries: ResourceFilters | None = None class DataExplorationConfig(BaseModelResource): @@ -65,17 +65,17 @@ class DataExplorationConfig(BaseModelResource): external_id: str - observations: dict[str, Any] # ObservationsConfigFeature - activities: dict[str, Any] # ActivitiesConfiguration - documents: dict[str, Any] # DocumentConfiguration - notifications: dict[str, Any] # NotificationsConfiguration - assets: dict[str, Any] # AssetPageConfiguration + observations: dict[str, Any] | None = None # ObservationsConfigFeature + activities: dict[str, Any] | None = None # ActivitiesConfiguration + documents: dict[str, Any] | None = None # DocumentConfiguration + notifications: dict[str, Any] | None = None # NotificationsConfiguration + assets: dict[str, Any] | None = None # AssetPageConfiguration class ObservationConfig(BaseModelResource): external_id: str - root_location_external_ids: list[str] - field_configurations: dict[str, Any] + root_location_external_ids: list[str] | None = None + field_configurations: dict[str, Any] | None = None class InfieldLocationConfigYAML(ToolkitResource): @@ -94,12 +94,12 @@ class InfieldLocationConfigYAML(ToolkitResource): external_id: str - root_location_external_id: str - feature_toggles: FeatureToggles - classic_asset_external_id: str - app_instance_space: str - app_data_set: str - access_management: AccessManagement - data_filters: RootLocationDataFilters - observation_config: ObservationConfig - data_exploration_config: DataExplorationConfig + root_location_external_id: str | None = None + feature_toggles: FeatureToggles | None = None + classic_asset_external_id: str | None = None + app_instance_space: str | None = None + app_data_set: str | None = None + access_management: AccessManagement | None = None + data_filters: RootLocationDataFilters | None = None + observation_config: ObservationConfig | None = None + data_exploration_config: DataExplorationConfig | None = None From 54e9a15108517cafe9473b5c43ad6d5e9ab8fae9 Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 14:59:09 +0100 Subject: [PATCH 06/11] tests: added example data --- .../my_location.InfieldCDMv1.yaml | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml diff --git a/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml new file mode 100644 index 0000000000..c214ff14f5 --- /dev/null +++ b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml @@ -0,0 +1,97 @@ +external_id: my_location_config_001 + +root_location_external_id: location_filter_main_facility + +feature_toggles: + three_d: true + trends: true + documents: true + workorders: true + notifications: true + media: true + template_checklist_flow: true + workorder_checklist_flow: false + observations: + is_enabled: true + is_write_back_enabled: true + notifications_endpoint_external_id: notifications_endpoint_001 + attachments_endpoint_external_id: attachments_endpoint_001 + +classic_asset_external_id: root_asset_external_id_123 + +app_instance_space: my_app_instance_space + +app_data_set: my_infield_dataset + +access_management: + template_admins: + - cdf_group_template_admins + - cdf_group_superusers + checklist_admins: + - cdf_group_checklist_admins + - cdf_group_superusers + +data_filters: + general: + dataset_ids: + - 12345 + - 67890 + asset_subtree_external_ids: + - asset_subtree_001 + - asset_subtree_002 + root_asset_external_ids: + - root_asset_001 + external_id_prefix: FACILITY_A_ + spaces: + - my_space_001 + - my_space_002 + assets: + dataset_ids: + - 12345 + asset_subtree_external_ids: + - asset_subtree_001 + files: + dataset_ids: + - 12345 + - 67890 + external_id_prefix: DOC_ + timeseries: + dataset_ids: + - 12345 + root_asset_external_ids: + - root_asset_001 + +observation_config: + external_id: observation_config_001 + root_location_external_ids: + - location_001 + - location_002 + field_configurations: + field_1: + type: text + label: Description + required: true + field_2: + type: number + label: Temperature + unit: celsius + +data_exploration_config: + external_id: data_exploration_config_shared + observations: + enabled: true + default_view: list + activities: + enabled: true + show_completed: true + documents: + enabled: true + supported_formats: + - pdf + - docx + notifications: + enabled: true + push_enabled: false + assets: + enabled: true + show_hierarchy: true From c50f89e389cd2556fbbed54fffab167f0ca4447b Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 15:02:24 +0100 Subject: [PATCH 07/11] fix: test data --- .../my_location.InfieldCDMv1.yaml | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml index c214ff14f5..23673cfcb7 100644 --- a/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml +++ b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml @@ -1,72 +1,72 @@ -external_id: my_location_config_001 +externalId: my_location_config_001 -root_location_external_id: location_filter_main_facility +rootLocationExternalId: location_filter_main_facility -feature_toggles: - three_d: true +featureToggles: + threeD: true trends: true documents: true workorders: true notifications: true media: true - template_checklist_flow: true - workorder_checklist_flow: false + templateChecklistFlow: true + workorderChecklistFlow: false observations: - is_enabled: true - is_write_back_enabled: true - notifications_endpoint_external_id: notifications_endpoint_001 - attachments_endpoint_external_id: attachments_endpoint_001 + isEnabled: true + isWriteBackEnabled: true + notificationsEndpointExternalId: notifications_endpoint_001 + attachmentsEndpointExternalId: attachments_endpoint_001 -classic_asset_external_id: root_asset_external_id_123 +classicAssetExternalId: root_asset_external_id_123 -app_instance_space: my_app_instance_space +appInstanceSpace: my_app_instance_space -app_data_set: my_infield_dataset +appDataSet: my_infield_dataset -access_management: - template_admins: +accessManagement: + templateAdmins: - cdf_group_template_admins - cdf_group_superusers - checklist_admins: + checklistAdmins: - cdf_group_checklist_admins - cdf_group_superusers -data_filters: +dataFilters: general: - dataset_ids: + datasetIds: - 12345 - 67890 - asset_subtree_external_ids: + assetSubtreeExternalIds: - asset_subtree_001 - asset_subtree_002 - root_asset_external_ids: + rootAssetExternalIds: - root_asset_001 - external_id_prefix: FACILITY_A_ + externalIdPrefix: FACILITY_A_ spaces: - my_space_001 - my_space_002 assets: - dataset_ids: + datasetIds: - 12345 - asset_subtree_external_ids: + assetSubtreeExternalIds: - asset_subtree_001 files: - dataset_ids: + datasetIds: - 12345 - 67890 - external_id_prefix: DOC_ + externalIdPrefix: DOC_ timeseries: - dataset_ids: + datasetIds: - 12345 - root_asset_external_ids: + rootAssetExternalIds: - root_asset_001 -observation_config: - external_id: observation_config_001 - root_location_external_ids: +observationConfig: + externalId: observation_config_001 + rootLocationExternalIds: - location_001 - location_002 - field_configurations: + fieldConfigurations: field_1: type: text label: Description @@ -76,22 +76,22 @@ observation_config: label: Temperature unit: celsius -data_exploration_config: - external_id: data_exploration_config_shared +dataExplorationConfig: + externalId: data_exploration_config_shared observations: enabled: true - default_view: list + defaultView: list activities: enabled: true - show_completed: true + showCompleted: true documents: enabled: true - supported_formats: + supportedFormats: - pdf - docx notifications: enabled: true - push_enabled: false + pushEnabled: false assets: enabled: true - show_hierarchy: true + showHierarchy: true From c49f6e96d957760a5cb0f6ba037325470cb8ea6c Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 15:02:52 +0100 Subject: [PATCH 08/11] tests: added tset cases --- .../test_infield_cdmv1.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py diff --git a/tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py b/tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py new file mode 100644 index 0000000000..c9b417bb33 --- /dev/null +++ b/tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py @@ -0,0 +1,39 @@ +from collections.abc import Iterable +from pathlib import Path +from typing import Any + +import pytest + +from cognite_toolkit._cdf_tk.resource_classes.infield_cdmv1 import InfieldLocationConfigYAML +from cognite_toolkit._cdf_tk.tk_warnings.fileread import ResourceFormatWarning +from cognite_toolkit._cdf_tk.validation import validate_resource_yaml_pydantic +from tests.data import COMPLETE_ORG_ALPHA_FLAGS +from tests.test_unit.utils import find_resources + + +def invalid_test_cases() -> Iterable: + yield pytest.param( + {"rootLocationExternalId": "myLocation"}, + {"Missing required field: 'externalId'"}, + id="Missing required field: externalId", + ) + + +class TestInfieldCDMv1YAML: + @pytest.mark.parametrize( + "data", list(find_resources("InfieldCDMv1", resource_dir="cdf_applications", base=COMPLETE_ORG_ALPHA_FLAGS)) + ) + def test_load_valid(self, data: dict[str, Any]) -> None: + loaded = InfieldLocationConfigYAML.model_validate(data) + + dumped = loaded.model_dump(exclude_unset=True, by_alias=True) + assert dumped == data + + @pytest.mark.parametrize("data, expected_errors", list(invalid_test_cases())) + def test_invalid_error_messages(self, data: dict[str, Any], expected_errors: set[str]) -> None: + warning_list = validate_resource_yaml_pydantic(data, InfieldLocationConfigYAML, Path("some_file.yaml")) + assert len(warning_list) == 1 + format_warning = warning_list[0] + assert isinstance(format_warning, ResourceFormatWarning) + + assert set(format_warning.errors) == expected_errors From 57948b298c67c9fbd411a7c95ee85486f45ebe74 Mon Sep 17 00:00:00 2001 From: anders-albert Date: Wed, 5 Nov 2025 15:04:55 +0100 Subject: [PATCH 09/11] tests: added more test cases --- .../test_infield_cdmv1.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py b/tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py index c9b417bb33..36fb8a48a8 100644 --- a/tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py +++ b/tests/test_unit/test_cdf_tk/test_resource_classes/test_infield_cdmv1.py @@ -17,6 +17,51 @@ def invalid_test_cases() -> Iterable: {"Missing required field: 'externalId'"}, id="Missing required field: externalId", ) + yield pytest.param( + { + "externalId": "my_config", + "unknownField": "invalid_value", + "anotherUnknownField": 123, + "featureToggles": { + "threeD": True, + "invalidToggle": "bad_value", + }, + }, + { + "In featureToggles unused field: 'invalidToggle'", + "Unused field: 'anotherUnknownField'", + "Unused field: 'unknownField'", + }, + id="Multiple extra fields at different levels", + ) + yield pytest.param( + { + "externalId": "my_config", + "featureToggles": { + "threeD": "not_a_boolean", + "trends": 123, + "observations": { + "isEnabled": "not_a_boolean", + "isWriteBackEnabled": ["invalid_type"], + }, + }, + "accessManagement": { + "templateAdmins": "should_be_a_list", + "checklistAdmins": 456, + }, + }, + { + "In accessManagement.checklistAdmins input should be a valid list. Got 456.", + "In accessManagement.templateAdmins input should be a valid list. Got 'should_be_a_list'.", + "In featureToggles.observations.isEnabled input should be a valid boolean. " + "Got 'not_a_boolean' of type str.", + "In featureToggles.observations.isWriteBackEnabled input should be a valid " + "boolean. Got ['invalid_type'] of type list.", + "In featureToggles.threeD input should be a valid boolean. Got 'not_a_boolean' of type str.", + "In featureToggles.trends input should be a valid boolean. Got 123 of type int.", + }, + id="Multiple type mismatches across nested structures", + ) class TestInfieldCDMv1YAML: From 9b73231cf3c526de2c971ddf5f205b0fbc09adeb Mon Sep 17 00:00:00 2001 From: anders-albert Date: Thu, 6 Nov 2025 13:20:57 +0100 Subject: [PATCH 10/11] refactor; review feedback --- cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py | 2 -- .../cdf_applications/my_location.InfieldCDMv1.yaml | 4 ---- 2 files changed, 6 deletions(-) diff --git a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py index 5ceb9ec82b..92ce474bd0 100644 --- a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py +++ b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py @@ -96,9 +96,7 @@ class InfieldLocationConfigYAML(ToolkitResource): root_location_external_id: str | None = None feature_toggles: FeatureToggles | None = None - classic_asset_external_id: str | None = None app_instance_space: str | None = None - app_data_set: str | None = None access_management: AccessManagement | None = None data_filters: RootLocationDataFilters | None = None observation_config: ObservationConfig | None = None diff --git a/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml index 23673cfcb7..76af56acbe 100644 --- a/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml +++ b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml @@ -17,12 +17,8 @@ featureToggles: notificationsEndpointExternalId: notifications_endpoint_001 attachmentsEndpointExternalId: attachments_endpoint_001 -classicAssetExternalId: root_asset_external_id_123 - appInstanceSpace: my_app_instance_space -appDataSet: my_infield_dataset - accessManagement: templateAdmins: - cdf_group_template_admins From 8b26de42ef2e54979f8f151fb02cc5710936614c Mon Sep 17 00:00:00 2001 From: anders-albert Date: Thu, 6 Nov 2025 13:34:03 +0100 Subject: [PATCH 11/11] refactor: review feedback --- .../_cdf_tk/resource_classes/infield_cdmv1.py | 11 ----- .../my_location.InfieldCDMv1.yaml | 44 ------------------- 2 files changed, 55 deletions(-) diff --git a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py index 92ce474bd0..36f99b4152 100644 --- a/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py +++ b/cognite_toolkit/_cdf_tk/resource_classes/infield_cdmv1.py @@ -36,10 +36,6 @@ class AccessManagement(BaseModelResource): class ResourceFilters(BaseModelResource): """Resource filters.""" - dataset_ids: list[int] | None = None - asset_subtree_external_ids: list[str] | None = None - root_asset_external_ids: list[str] | None = None - external_id_prefix: str | None = None spaces: list[str] | None = None @@ -72,12 +68,6 @@ class DataExplorationConfig(BaseModelResource): assets: dict[str, Any] | None = None # AssetPageConfiguration -class ObservationConfig(BaseModelResource): - external_id: str - root_location_external_ids: list[str] | None = None - field_configurations: dict[str, Any] | None = None - - class InfieldLocationConfigYAML(ToolkitResource): """Properties for InFieldLocationConfig node. @@ -99,5 +89,4 @@ class InfieldLocationConfigYAML(ToolkitResource): app_instance_space: str | None = None access_management: AccessManagement | None = None data_filters: RootLocationDataFilters | None = None - observation_config: ObservationConfig | None = None data_exploration_config: DataExplorationConfig | None = None diff --git a/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml index 76af56acbe..05356a0532 100644 --- a/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml +++ b/tests/data/complete_org_alpha_flags/modules/my_example_module/cdf_applications/my_location.InfieldCDMv1.yaml @@ -11,11 +11,6 @@ featureToggles: media: true templateChecklistFlow: true workorderChecklistFlow: false - observations: - isEnabled: true - isWriteBackEnabled: true - notificationsEndpointExternalId: notifications_endpoint_001 - attachmentsEndpointExternalId: attachments_endpoint_001 appInstanceSpace: my_app_instance_space @@ -29,48 +24,9 @@ accessManagement: dataFilters: general: - datasetIds: - - 12345 - - 67890 - assetSubtreeExternalIds: - - asset_subtree_001 - - asset_subtree_002 - rootAssetExternalIds: - - root_asset_001 - externalIdPrefix: FACILITY_A_ spaces: - my_space_001 - my_space_002 - assets: - datasetIds: - - 12345 - assetSubtreeExternalIds: - - asset_subtree_001 - files: - datasetIds: - - 12345 - - 67890 - externalIdPrefix: DOC_ - timeseries: - datasetIds: - - 12345 - rootAssetExternalIds: - - root_asset_001 - -observationConfig: - externalId: observation_config_001 - rootLocationExternalIds: - - location_001 - - location_002 - fieldConfigurations: - field_1: - type: text - label: Description - required: true - field_2: - type: number - label: Temperature - unit: celsius dataExplorationConfig: externalId: data_exploration_config_shared