diff --git a/README.md b/README.md index 323d0ba1f..7dffe0466 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,7 @@ Measurement and its related files can be maintained as a python package. The bas - UI file for the Measurement. Types of supported UI files are: - Measurement UI(.measui): created using the **Measurement UI Editor application**. - LabVIEW UI(.vi) - - The path and type of this file are configured by `ui_file_path` and `ui_file_type` respectively in `measurement_info` variable definition in Measurement Python Module(.py file). + - The path of this file is configured by `ui_file_path` in `measurement_info` variable definition in Measurement Python Module(.py file). Python communities have different ways of managing a python package and its dependencies. It is up to the measurement developer, on how they wanted to maintain the package and dependencies. Measurement developers can choose from a few common approaches discussed below based on their requirements. diff --git a/examples/sample_measurement/measurement.py b/examples/sample_measurement/measurement.py index 7eaebb73f..62a7938bd 100644 --- a/examples/sample_measurement/measurement.py +++ b/examples/sample_measurement/measurement.py @@ -11,7 +11,6 @@ import ni_measurement_service as nims - measurement_info = nims.MeasurementInfo( display_name="SampleMeasurement", version="0.1.0.0", @@ -20,7 +19,6 @@ ui_file_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "SampleMeasurement.measui" ), - ui_file_type=nims.UIFileType.MeasurementUI, ) service_info = nims.ServiceInfo( diff --git a/ni_measurement_generator/ni_measurement_generator/templates/measurement.py.mako b/ni_measurement_generator/ni_measurement_generator/templates/measurement.py.mako index 4c9f9e43f..5ffb403da 100644 --- a/ni_measurement_generator/ni_measurement_generator/templates/measurement.py.mako +++ b/ni_measurement_generator/ni_measurement_generator/templates/measurement.py.mako @@ -14,7 +14,6 @@ measurement_info = nims.MeasurementInfo( measurement_type="${measurement_type}", product_type="${product_type}", ui_file_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "${ui_file}"), - ui_file_type=nims.UIFileType.${ui_file_type}, ) service_info = nims.ServiceInfo( diff --git a/ni_measurement_generator/ni_measurement_generator/templates/measurement.serviceconfig.mako b/ni_measurement_generator/ni_measurement_generator/templates/measurement.serviceconfig.mako index 1e41353df..902bd5519 100644 --- a/ni_measurement_generator/ni_measurement_generator/templates/measurement.serviceconfig.mako +++ b/ni_measurement_generator/ni_measurement_generator/templates/measurement.serviceconfig.mako @@ -1,4 +1,4 @@ -<%page args="display_name, service_class, service_id, description, ui_file_type"/>\ +<%page args="display_name, service_class, service_id, description"/>\ \ { "services": [ @@ -8,7 +8,6 @@ "serviceClass": "${service_class}", "descriptionUrl": "${description}", "providedServices": [ "ni.measurements.v1.MeasurementService" ], - "attributes": [ "UserInterfaceType=${ui_file_type}" ], "path": "start.bat" } ] diff --git a/ni_measurement_generator/tests/test_assets/example_renders/example.py b/ni_measurement_generator/tests/test_assets/example_renders/example.py index 07df8715e..e3b50280a 100644 --- a/ni_measurement_generator/tests/test_assets/example_renders/example.py +++ b/ni_measurement_generator/tests/test_assets/example_renders/example.py @@ -12,7 +12,6 @@ measurement_type="Measurement", product_type="Product", ui_file_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "MeasurementUI.measui"), - ui_file_type=nims.UIFileType.MeasurementUI, ) service_info = nims.ServiceInfo( diff --git a/ni_measurement_generator/tests/test_assets/example_renders/example.serviceconfig b/ni_measurement_generator/tests/test_assets/example_renders/example.serviceconfig index c0b2d7b76..dcbe9c919 100644 --- a/ni_measurement_generator/tests/test_assets/example_renders/example.serviceconfig +++ b/ni_measurement_generator/tests/test_assets/example_renders/example.serviceconfig @@ -6,7 +6,6 @@ "serviceClass": "SampleMeasurement_Python", "descriptionUrl": "description", "providedServices": [ "ni.measurements.v1.MeasurementService" ], - "attributes": [ "UserInterfaceType=MeasurementUI" ], "path": "start.bat" } ] diff --git a/ni_measurement_service/__init__.py b/ni_measurement_service/__init__.py index 0bd149562..1d73bb06b 100644 --- a/ni_measurement_service/__init__.py +++ b/ni_measurement_service/__init__.py @@ -4,7 +4,6 @@ from .measurement.info import DataType # noqa F401, declaring API from .measurement.info import MeasurementInfo # noqa F401, declaring API from .measurement.info import ServiceInfo # noqa F401, declaring API -from .measurement.info import UIFileType # noqa F401, declaring API from .measurement.service import MeasurementService # noqa F401, declaring API diff --git a/ni_measurement_service/_internal/discovery_client.py b/ni_measurement_service/_internal/discovery_client.py index da5e7f823..281699f7c 100644 --- a/ni_measurement_service/_internal/discovery_client.py +++ b/ni_measurement_service/_internal/discovery_client.py @@ -9,12 +9,9 @@ from ni_measurement_service._internal.stubs import ServiceLocation_pb2 from ni_measurement_service.measurement.info import MeasurementInfo from ni_measurement_service.measurement.info import ServiceInfo -from ni_measurement_service.measurement.info import UIFileType _DISCOVERY_SERVICE_ADDRESS = "localhost:42000" _PROVIDED_MEASUREMENT_SERVICE = "ni.measurements.v1.MeasurementService" -_MEASUREMENT_UI_ATTRIBUTE = "UserInterfaceType=MeasurementUI" -_LABVIEW_ATTRIBUTE = "UserInterfaceType=LabVIEW" _logger = logging.getLogger(__name__) @@ -75,10 +72,6 @@ def register_measurement_service( service_descriptor.name = measurement_info.display_name service_descriptor.service_class = service_info.service_class service_descriptor.description_url = service_info.description_url - if measurement_info.ui_file_type is UIFileType.LabVIEW: - service_descriptor.attributes.append(_LABVIEW_ATTRIBUTE) - elif measurement_info.ui_file_type is UIFileType.MeasurementUI: - service_descriptor.attributes.append(_MEASUREMENT_UI_ATTRIBUTE) # Registration Request Creation request = DiscoveryServices_pb2.RegisterServiceRequest( diff --git a/ni_measurement_service/_internal/grpc_servicer.py b/ni_measurement_service/_internal/grpc_servicer.py index 6ab0dfe7d..a759b6c54 100644 --- a/ni_measurement_service/_internal/grpc_servicer.py +++ b/ni_measurement_service/_internal/grpc_servicer.py @@ -1,6 +1,7 @@ """Contains Measurement Service Implementation class and method to host the service. """ import inspect +import pathlib from contextvars import ContextVar from typing import Any, Callable, Dict, List @@ -154,7 +155,7 @@ def GetMetadata(self, request, context): # noqa N802:inherited method names-aut # User Interface details - Framed relative to the metadata python File ui_details = Measurement_pb2.UserInterfaceDetails() - ui_details.configuration_ui_url = self.measurement_info.ui_file_path + ui_details.configuration_ui_url = pathlib.Path(self.measurement_info.ui_file_path).as_uri() # Sending back Response metadata_response = Measurement_pb2.GetMetadataResponse( diff --git a/ni_measurement_service/measurement/info.py b/ni_measurement_service/measurement/info.py index 1b98c93db..f8cbd309d 100644 --- a/ni_measurement_service/measurement/info.py +++ b/ni_measurement_service/measurement/info.py @@ -6,13 +6,6 @@ from google.protobuf import type_pb2 -class UIFileType(enum.Enum): - """Enum that represents the supported UI Types.""" - - MeasurementUI = "ni_measui://" - LabVIEW = "ni_vi://" - - class MeasurementInfo(NamedTuple): """Class that represents the measurement information. @@ -31,8 +24,6 @@ class MeasurementInfo(NamedTuple): ui_file_path (str): Path of the UI file linked to the measurement. - ui_file_type (UIFileType): Type of the linked UI file. - """ display_name: str @@ -40,7 +31,6 @@ class MeasurementInfo(NamedTuple): measurement_type: str product_type: str ui_file_path: str - ui_file_type: UIFileType class ServiceInfo(NamedTuple): diff --git a/poetry.lock b/poetry.lock index 63017fece..16b20e975 100644 --- a/poetry.lock +++ b/poetry.lock @@ -300,6 +300,22 @@ python-versions = "*" docutils = "*" mistune = "0.8.4" +[[package]] +name = "mako" +version = "1.2.3" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["babel"] +lingua = ["lingua"] +testing = ["pytest"] + [[package]] name = "markupsafe" version = "2.1.1" @@ -855,7 +871,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "af567b2d6537da060198d3ecd59e090ca830b39a5958929f0eec6b341b85a1c3" +content-hash = "fff4a919723288acbbf844ab44eb8f9f278ed146c5250570fda57e95b8561be7" [metadata.files] alabaster = [] @@ -884,6 +900,7 @@ isort = [] jinja2 = [] lazy-object-proxy = [] m2r2 = [] +mako = [] markupsafe = [] mccabe = [] mistune = [] diff --git a/pyproject.toml b/pyproject.toml index fe8c0adb0..6ffdc26c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,7 @@ pytest-cov = "^3.0.0" mypy = "^0.961" types-protobuf = "^3.19.21" typed-ast = "*" +mako = "*" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/acceptance/test_measurement_service.py b/tests/acceptance/test_measurement_service.py index 498c3caa3..30b94e021 100644 --- a/tests/acceptance/test_measurement_service.py +++ b/tests/acceptance/test_measurement_service.py @@ -1,5 +1,7 @@ """Tests to validate measurement service. Uses the Sample Measurement Example.""" import random +import urllib.parse +import urllib.request from os import path import grpc @@ -132,5 +134,8 @@ def _validate_metadata_response(get_metadata_response): assert len(get_metadata_response.measurement_parameters.outputs) == 4 assert len(get_metadata_response.user_interface_details) == 1 - url = get_metadata_response.user_interface_details[0].configuration_ui_url - assert path.exists(url) + url = urllib.parse.urlparse( + get_metadata_response.user_interface_details[0].configuration_ui_url + ) + localpath = urllib.request.url2pathname(url.path) + assert path.exists(localpath) diff --git a/tests/unit/test_discovery_client.py b/tests/unit/test_discovery_client.py index b1c62bbea..c338d5142 100644 --- a/tests/unit/test_discovery_client.py +++ b/tests/unit/test_discovery_client.py @@ -1,7 +1,7 @@ """Contains tests to validate the discovery_client.py. """ from ni_measurement_service._internal import discovery_client -from ni_measurement_service.measurement.info import ServiceInfo, MeasurementInfo, UIFileType +from ni_measurement_service.measurement.info import ServiceInfo, MeasurementInfo from tests.utilities.fake_registry_service import ( FakeRegistryServiceStub, FakeRegistryServiceStubError, @@ -12,7 +12,6 @@ _TEST_SERVICE_INFO = ServiceInfo("TestServiceClass", "TestServiceID", "TestUrl") _TEST_MEASUREMENT_INFO = MeasurementInfo( display_name="TestMeasurement", - ui_file_type=UIFileType.LabVIEW, version="1.0.0.0", measurement_type="Test", product_type="Test", @@ -76,5 +75,4 @@ def _validate_grpc_request(request): assert request.service_description.service_class == _TEST_SERVICE_INFO.service_class assert request.service_description.description_url == _TEST_SERVICE_INFO.description_url assert request.service_description.name == _TEST_MEASUREMENT_INFO.display_name - assert discovery_client._LABVIEW_ATTRIBUTE in request.service_description.attributes assert discovery_client._PROVIDED_MEASUREMENT_SERVICE in request.provided_services