diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 288bf22b5..e2ba67b8d 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -42,6 +42,10 @@ jobs: run: poetry run ni-python-styleguide lint - name: MyPy Static Analysis run: poetry run mypy -p ni_measurement_service --show-error-codes -v + - name: MyPy Static Analysis on examples + run: poetry run mypy -p examples --show-error-codes -v + - name: MyPy Static Analysis ni_measurement_generator + run: poetry run mypy -p ni_measurement_generator --show-error-codes -v checks-nimg: runs-on: ubuntu-latest diff --git a/examples/daqmx_analog_input_measurement_measurementUI/measurement.py b/examples/daqmx_analog_input_measurement_measurementUI/measurement.py index 35eba4e70..907f78046 100644 --- a/examples/daqmx_analog_input_measurement_measurementUI/measurement.py +++ b/examples/daqmx_analog_input_measurement_measurementUI/measurement.py @@ -5,7 +5,7 @@ """ import logging -import os +import pathlib import sys import click @@ -13,16 +13,12 @@ import ni_measurement_service as nims - measurement_info = nims.MeasurementInfo( display_name="DAQmx Analog Input Measurement(Py)", version="0.1.0.0", measurement_type="DAQmx Analog Input", product_type="DAQ", - ui_file_path=os.path.join( - os.path.dirname(os.path.abspath(__file__)), "DAQmxAnalogInputMeasurement.measui" - ), - ui_file_type=nims.UIFileType.MeasurementUI, + ui_file_paths=[pathlib.Path(__file__).resolve().parent / "DAQmxAnalogInputMeasurement.measui"], ) service_info = nims.ServiceInfo( diff --git a/examples/dc_measurement_labviewUI/measurement.py b/examples/dc_measurement_labviewUI/measurement.py index 8c6ea18fc..d0d7a3f75 100644 --- a/examples/dc_measurement_labviewUI/measurement.py +++ b/examples/dc_measurement_labviewUI/measurement.py @@ -5,7 +5,7 @@ """ import logging -import os +import pathlib import sys import time @@ -16,7 +16,6 @@ import ni_measurement_service as nims - NIDCPOWER_WAIT_FOR_EVENT_TIMEOUT_ERROR_CODE = -1074116059 measurement_info = nims.MeasurementInfo( @@ -24,8 +23,7 @@ version="0.1.0.0", measurement_type="DC", product_type="ADC", - ui_file_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "DCMeasurementUI.vi"), - ui_file_type=nims.UIFileType.LabVIEW, + ui_file_paths=[pathlib.Path(__file__).resolve().parent / "DCMeasurementUI.vi"], ) service_info = nims.ServiceInfo( @@ -64,6 +62,8 @@ def measure( # User Logic : print("Executing DCMeasurement(Py)") + pending_cancellation = False + def cancel_callback(): print("Canceling DCMeasurement(Py)") session_to_abort = session @@ -72,7 +72,6 @@ def cancel_callback(): pending_cancellation = True session_to_abort.abort() - pending_cancellation = False dc_measurement_service.context.add_cancel_callback(cancel_callback) time_remaining = dc_measurement_service.context.time_remaining() diff --git a/examples/dc_measurement_measurementUI/measurement.py b/examples/dc_measurement_measurementUI/measurement.py index 8bcc726d9..4d9dd0a90 100644 --- a/examples/dc_measurement_measurementUI/measurement.py +++ b/examples/dc_measurement_measurementUI/measurement.py @@ -5,7 +5,7 @@ """ import logging -import os +import pathlib import sys import time @@ -16,7 +16,6 @@ import ni_measurement_service as nims - NIDCPOWER_WAIT_FOR_EVENT_TIMEOUT_ERROR_CODE = -1074116059 measurement_info = nims.MeasurementInfo( @@ -24,8 +23,7 @@ version="0.1.0.0", measurement_type="DC", product_type="ADC", - ui_file_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "DCMeasurement.measui"), - ui_file_type=nims.UIFileType.MeasurementUI, + ui_file_paths=[pathlib.Path(__file__).resolve().parent / "DCMeasurement.measui"], ) service_info = nims.ServiceInfo( @@ -64,6 +62,8 @@ def measure( # User Logic : print("Executing DCMeasurement(Py)") + pending_cancellation = False + def cancel_callback(): print("Canceling DCMeasurement(Py)") session_to_abort = session @@ -72,7 +72,6 @@ def cancel_callback(): pending_cancellation = True session_to_abort.abort() - pending_cancellation = False dc_measurement_service.context.add_cancel_callback(cancel_callback) time_remaining = dc_measurement_service.context.time_remaining() diff --git a/examples/sample_measurement/SampleAllParameters.measui b/examples/sample_measurement/SampleAllParameters.measui new file mode 100644 index 000000000..cd69a0fb9 --- /dev/null +++ b/examples/sample_measurement/SampleAllParameters.measui @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/sample_measurement/measurement.py b/examples/sample_measurement/measurement.py index 62a7938bd..329835f02 100644 --- a/examples/sample_measurement/measurement.py +++ b/examples/sample_measurement/measurement.py @@ -4,7 +4,7 @@ """ import logging -import os +import pathlib import sys import click @@ -16,9 +16,10 @@ version="0.1.0.0", measurement_type="Sample", product_type="Sample", - ui_file_path=os.path.join( - os.path.dirname(os.path.abspath(__file__)), "SampleMeasurement.measui" - ), + ui_file_paths=[ + pathlib.Path(__file__).resolve().parent / "SampleMeasurement.measui", + pathlib.Path(__file__).resolve().parent / "SampleAllParameters.measui", + ], ) service_info = nims.ServiceInfo( diff --git a/ni_measurement_generator/ni_measurement_generator/template.py b/ni_measurement_generator/ni_measurement_generator/template.py index 4648ee842..e971d05ee 100644 --- a/ni_measurement_generator/ni_measurement_generator/template.py +++ b/ni_measurement_generator/ni_measurement_generator/template.py @@ -19,6 +19,8 @@ def _render_template(template_name: str, **template_args) -> str: except: # noqa: E722 print(exceptions.text_error_template().render()) + return "" + def _create_file(template_name: str, file_name: str, directory_out, **template_args) -> str: output_file = pathlib.Path(directory_out) / file_name @@ -28,6 +30,8 @@ def _create_file(template_name: str, file_name: str, directory_out, **template_a with output_file.open("w") as fout: fout.write(output) + return "" + def _create_bat(directory_out): output_file = pathlib.Path(directory_out) / "start.bat" 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 5ffb403da..b9af82f63 100644 --- a/ni_measurement_generator/ni_measurement_generator/templates/measurement.py.mako +++ b/ni_measurement_generator/ni_measurement_generator/templates/measurement.py.mako @@ -2,7 +2,7 @@ \ """A default measurement with an array in and out.""" import logging -import os +import pathlib import sys import click @@ -13,7 +13,7 @@ measurement_info = nims.MeasurementInfo( version="${version}", 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_paths=[pathlib.Path(__file__).resolve().parent / "${ui_file}"], ) service_info = nims.ServiceInfo( 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 e3b50280a..bd85b46f5 100644 --- a/ni_measurement_generator/tests/test_assets/example_renders/example.py +++ b/ni_measurement_generator/tests/test_assets/example_renders/example.py @@ -1,6 +1,6 @@ """A default measurement with an array in and out.""" import logging -import os +import pathlib import sys import click @@ -11,7 +11,7 @@ version="1.0.0.0", measurement_type="Measurement", product_type="Product", - ui_file_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "MeasurementUI.measui"), + ui_file_paths=[pathlib.Path(__file__).resolve().parent / "MeasurementUI.measui"], ) service_info = nims.ServiceInfo( diff --git a/ni_measurement_service/_internal/grpc_servicer.py b/ni_measurement_service/_internal/grpc_servicer.py index a759b6c54..70422c565 100644 --- a/ni_measurement_service/_internal/grpc_servicer.py +++ b/ni_measurement_service/_internal/grpc_servicer.py @@ -3,7 +3,10 @@ import inspect import pathlib from contextvars import ContextVar -from typing import Any, Callable, Dict, List +from typing import Any +from typing import Callable +from typing import Dict +from typing import List import grpc from google.protobuf import any_pb2 @@ -152,18 +155,19 @@ def GetMetadata(self, request, context): # noqa N802:inherited method names-aut output_parameter.repeated = output_metadata.repeated measurement_parameters.outputs.append(output_parameter) - # User Interface details - Framed relative to the metadata python File - ui_details = Measurement_pb2.UserInterfaceDetails() - - ui_details.configuration_ui_url = pathlib.Path(self.measurement_info.ui_file_path).as_uri() - # Sending back Response metadata_response = Measurement_pb2.GetMetadataResponse( measurement_details=measurement_details, measurement_parameters=measurement_parameters, user_interface_details=None, ) - metadata_response.user_interface_details.append(ui_details) + + # User Interface details - Framed relative to the metadata python File + for ui_file_path in self.measurement_info.ui_file_paths: + ui_details = Measurement_pb2.UserInterfaceDetails() + ui_details.configuration_ui_url = pathlib.Path(ui_file_path).as_uri() + metadata_response.user_interface_details.append(ui_details) + return metadata_response def Measure(self, request, context): # noqa N802:inherited method names-autogen baseclass diff --git a/ni_measurement_service/measurement/info.py b/ni_measurement_service/measurement/info.py index f8cbd309d..be0684a61 100644 --- a/ni_measurement_service/measurement/info.py +++ b/ni_measurement_service/measurement/info.py @@ -1,6 +1,9 @@ """Contains classes and enums to represent measurement metadata.""" +from __future__ import annotations import enum +import typing +from pathlib import Path from typing import NamedTuple from google.protobuf import type_pb2 @@ -22,7 +25,7 @@ class MeasurementInfo(NamedTuple): product_type (str): Represents type of the DUT, e.g. ADC, LDO. - ui_file_path (str): Path of the UI file linked to the measurement. + ui_file_paths (list): Absolute paths of the UI file(s) linked to the measurement. """ @@ -30,7 +33,7 @@ class MeasurementInfo(NamedTuple): version: str measurement_type: str product_type: str - ui_file_path: str + ui_file_paths: typing.List[Path] class ServiceInfo(NamedTuple): diff --git a/tests/acceptance/test_measurement_service.py b/tests/acceptance/test_measurement_service.py index 30b94e021..be5c05cd6 100644 --- a/tests/acceptance/test_measurement_service.py +++ b/tests/acceptance/test_measurement_service.py @@ -133,9 +133,8 @@ def _validate_metadata_response(get_metadata_response): assert len(get_metadata_response.measurement_parameters.configuration_parameters) == 4 assert len(get_metadata_response.measurement_parameters.outputs) == 4 - assert len(get_metadata_response.user_interface_details) == 1 - url = urllib.parse.urlparse( - get_metadata_response.user_interface_details[0].configuration_ui_url - ) - localpath = urllib.request.url2pathname(url.path) - assert path.exists(localpath) + assert len(get_metadata_response.user_interface_details) == 2 + for details in get_metadata_response.user_interface_details: + url = urllib.parse.urlparse(details.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 c338d5142..de7898930 100644 --- a/tests/unit/test_discovery_client.py +++ b/tests/unit/test_discovery_client.py @@ -15,7 +15,7 @@ version="1.0.0.0", measurement_type="Test", product_type="Test", - ui_file_path="", + ui_file_paths=[], )