diff --git a/cognite/client/_api/simulators/integrations.py b/cognite/client/_api/simulators/integrations.py index 7479060f33..0c606b2939 100644 --- a/cognite/client/_api/simulators/integrations.py +++ b/cognite/client/_api/simulators/integrations.py @@ -77,14 +77,16 @@ def __call__( def list( self, limit: int | None = DEFAULT_LIMIT_READ, - filter: SimulatorIntegrationFilter | None = None, + simulator_external_ids: str | SequenceNotStr[str] | None = None, + active: bool | None = None, ) -> SimulatorIntegrationList: """`Filter simulator integrations `_ Retrieves a list of simulator integrations that match the given criteria Args: limit (int | None): The maximum number of simulator integrations to return, pass None to return all. - filter (SimulatorIntegrationFilter | None): Filter to apply. + simulator_external_ids (str | SequenceNotStr[str] | None): Filter on simulator external ids. + active (bool | None): Filter on active status of the simulator integration. Returns: SimulatorIntegrationList: List of simulator integrations @@ -99,15 +101,18 @@ def list( Filter integrations by active status: >>> from cognite.client.data_classes.simulators import SimulatorIntegrationFilter >>> res = client.simulators.integrations.list( - ... filter=SimulatorIntegrationFilter(active=True)) + ... simulator_external_ids=["sim1", "sim2"], + ... active=True, + ... ) """ + integrations_filter = SimulatorIntegrationFilter(simulator_external_ids=simulator_external_ids, active=active) self._warning.warn() return self._list( method="POST", limit=limit, resource_cls=SimulatorIntegration, list_cls=SimulatorIntegrationList, - filter=filter.dump() if isinstance(filter, CogniteFilter) else filter, + filter=integrations_filter.dump(), ) def delete( diff --git a/cognite/client/_api/simulators/models.py b/cognite/client/_api/simulators/models.py index 1f6ba4a86e..157afcf6be 100644 --- a/cognite/client/_api/simulators/models.py +++ b/cognite/client/_api/simulators/models.py @@ -1,7 +1,7 @@ from __future__ import annotations from collections.abc import Iterator, Sequence -from typing import TYPE_CHECKING, Any, NoReturn, overload +from typing import TYPE_CHECKING, NoReturn, overload from cognite.client._api.simulators.models_revisions import SimulatorModelRevisionsAPI from cognite.client._api_client import APIClient @@ -39,14 +39,14 @@ def __init__(self, config: ClientConfig, api_version: str | None, cognite_client def list( self, limit: int = DEFAULT_LIMIT_READ, - filter: SimulatorModelsFilter | dict[str, Any] | None = None, + simulator_external_ids: str | SequenceNotStr[str] | None = None, sort: PropertySort | None = None, ) -> SimulatorModelList: """`Filter simulator models `_ Retrieves a list of simulator models that match the given criteria Args: limit (int): Maximum number of results to return. Defaults to 25. Set to -1, float(“inf”) or None to return all items. - filter (SimulatorModelsFilter | dict[str, Any] | None): Filter to apply. + simulator_external_ids (str | SequenceNotStr[str] | None): Filter by simulator external id(s). sort (PropertySort | None): The criteria to sort by. Returns: SimulatorModelList: List of simulator models @@ -61,11 +61,12 @@ def list( >>> from cognite.client.data_classes.simulators import SimulatorModelsFilter >>> from cognite.client.data_classes.simulators.filters import PropertySort >>> res = client.simulators.models.list( - ... filter=SimulatorModelsFilter(simulator_external_ids=["simulator_external_id"]), + ... simulator_external_ids=["simulator_external_id"], ... sort=PropertySort(order="asc") ... ) """ + model_filter = SimulatorModelsFilter(simulator_external_ids=simulator_external_ids) self._warning.warn() return self._list( method="POST", @@ -73,7 +74,7 @@ def list( resource_cls=SimulatorModel, list_cls=SimulatorModelList, sort=[PropertySort.load(sort).dump()] if sort else None, - filter=filter.dump(camel_case=True) if isinstance(filter, CogniteFilter) else filter, + filter=model_filter.dump(), ) @overload diff --git a/cognite/client/_api/simulators/models_revisions.py b/cognite/client/_api/simulators/models_revisions.py index 8c6d0233cd..b29d3ee557 100644 --- a/cognite/client/_api/simulators/models_revisions.py +++ b/cognite/client/_api/simulators/models_revisions.py @@ -1,11 +1,12 @@ from __future__ import annotations from collections.abc import Iterator, Sequence -from typing import TYPE_CHECKING, Any, NoReturn, overload +from typing import TYPE_CHECKING, NoReturn, overload from cognite.client._api_client import APIClient from cognite.client._constants import DEFAULT_LIMIT_READ from cognite.client.data_classes._base import CogniteFilter +from cognite.client.data_classes.shared import TimestampRange from cognite.client.data_classes.simulators.filters import PropertySort, SimulatorModelRevisionsFilter from cognite.client.data_classes.simulators.models import ( SimulatorModelRevision, @@ -36,14 +37,20 @@ def list( self, limit: int = DEFAULT_LIMIT_READ, sort: PropertySort | None = None, - filter: SimulatorModelRevisionsFilter | dict[str, Any] | None = None, + model_external_ids: str | SequenceNotStr[str] | None = None, + all_versions: bool | None = None, + created_time: TimestampRange | None = None, + last_updated_time: TimestampRange | None = None, ) -> SimulatorModelRevisionList: """`Filter simulator model revisions `_ Retrieves a list of simulator model revisions that match the given criteria Args: limit (int): Maximum number of results to return. Defaults to 25. Set to -1, float(“inf”) or None to return all items. sort (PropertySort | None): The criteria to sort by. - filter (SimulatorModelRevisionsFilter | dict[str, Any] | None): Filter to apply. + model_external_ids (str | SequenceNotStr[str] | None): The external ids of the simulator models to filter by. + all_versions (bool | None): If True, all versions of the simulator model revisions are returned. If False, only the latest version is returned. + created_time (TimestampRange | None): Filter by created time. + last_updated_time (TimestampRange | None): Filter by last updated time. Returns: SimulatorModelRevisionList: List of simulator model revisions Examples: @@ -55,11 +62,22 @@ def list( Specify filter and sort order: >>> from cognite.client.data_classes.simulators import SimulatorModelRevisionsFilter >>> from cognite.client.data_classes.simulators.filters import PropertySort + >>> from cognite.client.data_classes.shared import TimestampRange >>> res = client.simulators.models.revisions.list( - ... filter=SimulatorModelRevisionsFilter(model_external_ids=["model_external_id"]), - ... sort=PropertySort(order="asc") + ... model_external_ids=["model1", "model2"], + ... all_versions=True, + ... created_time=TimestampRange(min=0, max=1000000), + ... last_updated_time=TimestampRange(min=0, max=1000000), + ... sort=PropertySort(order="asc", property="createdTime"), + ... limit=10 ... ) """ + model_revisions_filter = SimulatorModelRevisionsFilter( + model_external_ids=model_external_ids, + all_versions=all_versions, + created_time=created_time, + last_updated_time=last_updated_time, + ) self._warning.warn() return self._list( method="POST", @@ -67,7 +85,7 @@ def list( resource_cls=SimulatorModelRevision, list_cls=SimulatorModelRevisionList, sort=[PropertySort.load(sort).dump()] if sort else None, - filter=filter.dump(camel_case=True) if isinstance(filter, CogniteFilter) else filter, + filter=model_revisions_filter.dump(), ) @overload diff --git a/cognite/client/data_classes/simulators/filters.py b/cognite/client/data_classes/simulators/filters.py index 4c44006e6b..ea38a3cab0 100644 --- a/cognite/client/data_classes/simulators/filters.py +++ b/cognite/client/data_classes/simulators/filters.py @@ -19,7 +19,7 @@ def _parse_str_or_sequence(value: str | SequenceNotStr[str] | None) -> list[str] class SimulatorIntegrationFilter(CogniteFilter): def __init__( self, - simulator_external_ids: str | Sequence[str] | None = None, + simulator_external_ids: str | SequenceNotStr[str] | None = None, active: bool | None = None, ) -> None: self.simulator_external_ids = ( @@ -31,7 +31,7 @@ def __init__( class SimulatorModelsFilter(CogniteFilter): def __init__( self, - simulator_external_ids: str | Sequence[str] | None = None, + simulator_external_ids: str | SequenceNotStr[str] | None = None, ) -> None: self.simulator_external_ids = ( [simulator_external_ids] if isinstance(simulator_external_ids, str) else simulator_external_ids @@ -41,10 +41,15 @@ def __init__( class SimulatorModelRevisionsFilter(CogniteFilter): def __init__( self, - model_external_ids: str | Sequence[str] | None = None, + model_external_ids: str | SequenceNotStr[str] | None = None, all_versions: bool | None = None, + created_time: TimestampRange | None = None, + last_updated_time: TimestampRange | None = None, ) -> None: self.model_external_ids = [model_external_ids] if isinstance(model_external_ids, str) else model_external_ids + self.all_versions = all_versions + self.created_time = created_time + self.last_updated_time = last_updated_time class SimulatorRunsFilter(CogniteFilter): diff --git a/tests/tests_integration/test_api/test_simulators/conftest.py b/tests/tests_integration/test_api/test_simulators/conftest.py index 05d0ab3c74..40402ca9a7 100644 --- a/tests/tests_integration/test_api/test_simulators/conftest.py +++ b/tests/tests_integration/test_api/test_simulators/conftest.py @@ -10,9 +10,6 @@ from cognite.client._cognite_client import CogniteClient from cognite.client.data_classes.data_sets import DataSetWrite from cognite.client.data_classes.files import FileMetadata -from cognite.client.data_classes.simulators.filters import ( - SimulatorModelRevisionsFilter, -) from cognite.client.data_classes.simulators.models import SimulatorModelWrite from cognite.client.data_classes.simulators.routine_revisions import SimulatorRoutineRevisionWrite from cognite.client.data_classes.simulators.routines import SimulatorRoutineWrite @@ -130,24 +127,26 @@ def seed_simulator_model_revisions(cognite_client: CogniteClient, seed_simulator model_unique_external_id = resource_names["simulator_model_external_id"] model_revision_unique_external_id = resource_names["simulator_model_revision_external_id"] model_revisions = cognite_client.simulators.models.revisions.list( - filter=SimulatorModelRevisionsFilter(model_external_ids=[model_unique_external_id]) + model_external_ids=[model_unique_external_id], ) - model_revision_not_exists = not model_revisions.get(external_id=model_revision_unique_external_id) - - if model_revision_not_exists: - cognite_client.simulators._post( - "/simulators/models/revisions", - json={ - "items": [ - { - "description": "test sim model revision description", - "fileId": seed_file.id, - "modelExternalId": model_unique_external_id, - "externalId": model_revision_unique_external_id, - } - ] - }, - ) + + revisions = [f"{model_revision_unique_external_id}_1", model_revision_unique_external_id] + + for revision in revisions: + if not model_revisions.get(external_id=revision): + cognite_client.simulators._post( + "/simulators/models/revisions", + json={ + "items": [ + { + "description": "test sim model revision description", + "fileId": seed_file.id, + "modelExternalId": model_unique_external_id, + "externalId": revision, + } + ] + }, + ) @pytest.fixture(scope="session") diff --git a/tests/tests_integration/test_api/test_simulators/test_integrations.py b/tests/tests_integration/test_api/test_simulators/test_integrations.py index 404b1ae3ae..e18fcabf7e 100644 --- a/tests/tests_integration/test_api/test_simulators/test_integrations.py +++ b/tests/tests_integration/test_api/test_simulators/test_integrations.py @@ -20,11 +20,9 @@ def test_filter_integrations(self, cognite_client: CogniteClient, seed_resource_ assert integration.active is True all_integrations = cognite_client.simulators.integrations.list() - active_integrations = cognite_client.simulators.integrations.list( - filter=SimulatorIntegrationFilter(active=True) - ) + active_integrations = cognite_client.simulators.integrations.list(active=True) filtered_integrations = cognite_client.simulators.integrations.list( - filter=SimulatorIntegrationFilter(simulator_external_ids=[seed_resource_names["simulator_external_id"]]) + simulator_external_ids=[seed_resource_names["simulator_external_id"]], ) assert len(all_integrations) > 0 assert len(active_integrations) > 0 diff --git a/tests/tests_integration/test_api/test_simulators/test_models.py b/tests/tests_integration/test_api/test_simulators/test_models.py index efa9566aa6..c67ce6c983 100644 --- a/tests/tests_integration/test_api/test_simulators/test_models.py +++ b/tests/tests_integration/test_api/test_simulators/test_models.py @@ -1,8 +1,11 @@ +import time + import pytest from cognite.client._cognite_client import CogniteClient +from cognite.client.data_classes import TimestampRange from cognite.client.data_classes.files import FileMetadata -from cognite.client.data_classes.simulators.filters import SimulatorModelRevisionsFilter, SimulatorModelsFilter +from cognite.client.data_classes.simulators.filters import PropertySort from cognite.client.data_classes.simulators.models import ( SimulatorModelRevisionWrite, SimulatorModelWrite, @@ -18,7 +21,8 @@ class TestSimulatorModels: def test_list_models(self, cognite_client: CogniteClient, seed_resource_names) -> None: models = cognite_client.simulators.models.list( - limit=5, filter=SimulatorModelsFilter(simulator_external_ids=[seed_resource_names["simulator_external_id"]]) + limit=5, + simulator_external_ids=[seed_resource_names["simulator_external_id"]], ) model_ids = [] @@ -48,7 +52,7 @@ def test_list_model_revisions(self, cognite_client: CogniteClient, seed_resource revisions = cognite_client.simulators.models.revisions.list( limit=5, - filter=SimulatorModelRevisionsFilter(model_external_ids=[model_external_id]), + model_external_ids=[model_external_id], ) model_revision_ids = [] @@ -61,6 +65,42 @@ def test_list_model_revisions(self, cognite_client: CogniteClient, seed_resource assert len(revisions) > 0 + def test_list_model_revisions_filtering_all_versions( + self, cognite_client: CogniteClient, seed_resource_names + ) -> None: + model_external_id = seed_resource_names["simulator_model_external_id"] + revisions_all_versions = cognite_client.simulators.models.revisions.list( + all_versions=True, + model_external_ids=[model_external_id], + created_time=TimestampRange(start=0, end=int(time.time() * 1000)), + last_updated_time=TimestampRange(start=0, end=int(time.time() * 1000)), + ) + revisions_all_versions_external_ids = [revision.external_id for revision in revisions_all_versions] + revisions_default = cognite_client.simulators.models.revisions.list( + model_external_ids=seed_resource_names["simulator_model_external_id"] + ) + + assert len(revisions_default) == 1 + assert revisions_default[0].external_id in revisions_all_versions_external_ids + assert len(revisions_all_versions) != len(revisions_default) + + def test_list_model_revisions_filtering_sort(self, cognite_client: CogniteClient, seed_resource_names) -> None: + revisions_asc = cognite_client.simulators.models.revisions.list( + sort=PropertySort(order="asc", property="createdTime"), + model_external_ids=[seed_resource_names["simulator_model_external_id"]], + all_versions=True, + ) + + revisions_desc = cognite_client.simulators.models.revisions.list( + sort=PropertySort(order="desc", property="createdTime"), + model_external_ids=[seed_resource_names["simulator_model_external_id"]], + all_versions=True, + ) + assert len(revisions_asc) > 0 + assert len(revisions_desc) > 0 + assert revisions_asc[0].created_time == revisions_desc[-1].created_time + assert revisions_desc[0].created_time == revisions_asc[-1].created_time + def test_retrieve_model_revision(self, cognite_client: CogniteClient, seed_resource_names) -> None: model_revision_external_id = seed_resource_names["simulator_model_revision_external_id"] model_revision = cognite_client.simulators.models.revisions.retrieve(external_id=model_revision_external_id)