Skip to content

Commit

Permalink
Support for Path and String datatypes with escape sequences (#872)
Browse files Browse the repository at this point in the history
* fix: update path and string handling
  • Loading branch information
Jotheeswaran-Nandagopal authored Sep 17, 2024
1 parent 4772133 commit 0462410
Show file tree
Hide file tree
Showing 6 changed files with 176 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -177,17 +177,17 @@ def get_configuration_parameters_with_type_and_default_values(
default_value = metadata.default_value
parameter_type = _get_python_type_as_str(metadata.type, metadata.repeated)
if isinstance(default_value, str):
default_value = f'"{default_value}"'
default_value = repr(default_value)

# If it's path type, make the value as raw string literal to ignore escape characters.
if metadata.annotations and metadata.annotations.get("ni/type_specialization") == "path":
default_value = f"r{default_value}"
parameter_type = "Path"
built_in_import_modules.append(_PATH_IMPORT)

if metadata.repeated:
formatted_value = ", ".join(f"Path({repr(value)})" for value in default_value)
default_value = f"[{formatted_value}]"
parameter_type = f"List[{parameter_type}]"
default_value = metadata.default_value
else:
default_value = f"Path({default_value})"

configuration_parameters.append(f"{parameter_name}: {parameter_type} = {default_value}")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import threading
% for module in built_in_import_modules:
${module}
% endfor
from typing import Any, Generator, List, NamedTuple, Optional
from typing import Any, Generator, Iterable, List, NamedTuple, Optional

import grpc
from google.protobuf import any_pb2
Expand Down Expand Up @@ -214,8 +214,8 @@ class ${class_name}:
for k, v in output_values.items():
result[k - 1] = v
return Outputs._make(result)

% endif

def measure(
self,
${configuration_parameters_with_type_and_default_values}
Expand Down Expand Up @@ -245,7 +245,11 @@ class ${class_name}:
Returns:
Stream of measurement outputs.
"""
% if "from pathlib import Path" in built_in_import_modules:
parameter_values = _convert_paths_to_strings([${measure_api_parameters}])
% else:
parameter_values = [${measure_api_parameters}]
% endif
with self._initialization_lock:
if self._measure_response is not None:
raise RuntimeError(
Expand Down Expand Up @@ -287,4 +291,26 @@ class ${class_name}:
if self._pin_map_context is None:
self._pin_map_context = PinMapContext(pin_map_id=pin_map_id, sites=[0])
else:
self._pin_map_context = self._pin_map_context._replace(pin_map_id=pin_map_id)
self._pin_map_context = self._pin_map_context._replace(pin_map_id=pin_map_id)

% if "from pathlib import Path" in built_in_import_modules:

def _convert_paths_to_strings(parameter_values: Iterable[Any]) -> List[Any]:
result: List[Any] = []

for parameter_value in parameter_values:
if isinstance(parameter_value, list):
converted_list = []
for value in parameter_value:
if isinstance(value, Path):
converted_list.append(str(value))
else:
converted_list.append(value)
result.append(converted_list)
elif isinstance(parameter_value, Path):
result.append(str(parameter_value))
else:
result.append(parameter_value)
return result

% endif
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,23 @@ def test___measurement_plugin_client___measure___returns_output(
double_array_out=[0.1, 0.2, 0.3],
bool_out=False,
string_out="sample string",
string_array_out=["String1", "String2"],
path_out="path/test",
path_array_out=["path/test1", "path/ntest2"],
string_array_out=[
"string with /forwardslash",
"string with \\backslash",
"string with 'single quotes'",
'string with "double quotes"',
"string with \ttabspace",
"string with \nnewline",
],
path_out="sample\\path\\for\\test",
path_array_out=[
"path\\with\\forward\\slash",
"path\\with\\backslash",
"path with 'single quotes'",
'path with "double quotes"',
"path\twith\ttabs",
"path\nwith\nnewlines",
],
io_out="resource",
io_array_out=["resource1", "resource2"],
integer_out=10,
Expand All @@ -46,9 +60,23 @@ def test___measurement_plugin_client___stream_measure___returns_output(
double_array_out=[0.1, 0.2, 0.3],
bool_out=False,
string_out="sample string",
string_array_out=["String1", "String2"],
path_out="path/test",
path_array_out=["path/test1", "path/ntest2"],
string_array_out=[
"string with /forwardslash",
"string with \\backslash",
"string with 'single quotes'",
'string with "double quotes"',
"string with \ttabspace",
"string with \nnewline",
],
path_out="sample\\path\\for\\test",
path_array_out=[
"path\\with\\forward\\slash",
"path\\with\\backslash",
"path with 'single quotes'",
'path with "double quotes"',
"path\twith\ttabs",
"path\nwith\nnewlines",
],
io_out="resource",
io_array_out=["resource1", "resource2"],
integer_out=10,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test___measurement_plugin_client___measure_with_pin_map_registration___retur
pin_map_directory: pathlib.Path,
) -> None:
pin_map_path = pin_map_directory / "1Smu1ChannelGroup1Pin1Site.pinmap"
output_type = getattr(measurement_plugin_client_module, "Output")
output_type = getattr(measurement_plugin_client_module, "Outputs")
expected_output = output_type(
pin_map_id=str(pin_map_path),
sites=[0],
Expand Down Expand Up @@ -128,7 +128,7 @@ def test___measurement_plugin_client___measure_with_pin_map_context___returns_ou
pin_map_directory: pathlib.Path,
) -> None:
pin_map_path = pin_map_directory / "1Smu1ChannelGroup2Pin2Site.pinmap"
output_type = getattr(measurement_plugin_client_module, "Output")
output_type = getattr(measurement_plugin_client_module, "Outputs")
expected_output = output_type(
pin_map_id=str(pin_map_path),
sites=[0, 1],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pathlib
import threading
from pathlib import Path
from typing import Any, Generator, List, NamedTuple, Optional
from typing import Any, Generator, Iterable, List, NamedTuple, Optional

import grpc
from google.protobuf import any_pb2
Expand Down Expand Up @@ -124,7 +124,14 @@ def __init__(
display_name="String Array In",
type=9,
repeated=True,
default_value=["String1", "String2"],
default_value=[
"string with /forwardslash",
"string with \\backslash",
"string with 'single quotes'",
'string with "double quotes"',
"string with \ttabspace",
"string with \nnewline",
],
annotations={},
message_type="",
field_name="String_Array_In",
Expand All @@ -134,7 +141,7 @@ def __init__(
display_name="Path In",
type=9,
repeated=False,
default_value="path/test",
default_value="sample\\path\\for\\test",
annotations={"ni/type_specialization": "path"},
message_type="",
field_name="Path_In",
Expand All @@ -144,7 +151,14 @@ def __init__(
display_name="Path Array In",
type=9,
repeated=True,
default_value=["path/test1", "path/ntest2"],
default_value=[
"path/with/forward/slash",
"path\\with\\backslash",
"path with 'single quotes'",
'path with "double quotes"',
"path\twith\ttabs",
"path\nwith\nnewlines",
],
annotations={"ni/type_specialization": "path"},
message_type="",
field_name="Path_Array_In",
Expand Down Expand Up @@ -446,9 +460,23 @@ def measure(
double_array_in: List[float] = [0.1, 0.2, 0.3],
bool_in: bool = False,
string_in: str = "sample string",
string_array_in: List[str] = ["String1", "String2"],
path_in: Path = r"path/test",
path_array_in: List[Path] = ["path/test1", "path/ntest2"],
string_array_in: List[str] = [
"string with /forwardslash",
"string with \\backslash",
"string with 'single quotes'",
'string with "double quotes"',
"string with \ttabspace",
"string with \nnewline",
],
path_in: Path = Path("sample\\path\\for\\test"),
path_array_in: List[Path] = [
Path("path/with/forward/slash"),
Path("path\\with\\backslash"),
Path("path with 'single quotes'"),
Path('path with "double quotes"'),
Path("path\twith\ttabs"),
Path("path\nwith\nnewlines"),
],
io_in: str = "resource",
io_array_in: List[str] = ["resource1", "resource2"],
integer_in: int = 10,
Expand Down Expand Up @@ -480,9 +508,23 @@ def stream_measure(
double_array_in: List[float] = [0.1, 0.2, 0.3],
bool_in: bool = False,
string_in: str = "sample string",
string_array_in: List[str] = ["String1", "String2"],
path_in: Path = r"path/test",
path_array_in: List[Path] = ["path/test1", "path/ntest2"],
string_array_in: List[str] = [
"string with /forwardslash",
"string with \\backslash",
"string with 'single quotes'",
'string with "double quotes"',
"string with \ttabspace",
"string with \nnewline",
],
path_in: Path = Path("sample\\path\\for\\test"),
path_array_in: List[Path] = [
Path("path/with/forward/slash"),
Path("path\\with\\backslash"),
Path("path with 'single quotes'"),
Path('path with "double quotes"'),
Path("path\twith\ttabs"),
Path("path\nwith\nnewlines"),
],
io_in: str = "resource",
io_array_in: List[str] = ["resource1", "resource2"],
integer_in: int = 10,
Expand All @@ -492,18 +534,20 @@ def stream_measure(
Returns:
Stream of measurement outputs.
"""
parameter_values = [
float_in,
double_array_in,
bool_in,
string_in,
string_array_in,
path_in,
path_array_in,
io_in,
io_array_in,
integer_in,
]
parameter_values = _convert_paths_to_strings(
[
float_in,
double_array_in,
bool_in,
string_in,
string_array_in,
path_in,
path_array_in,
io_in,
io_array_in,
integer_in,
]
)
with self._initialization_lock:
if self._measure_response is not None:
raise RuntimeError(
Expand Down Expand Up @@ -541,3 +585,22 @@ def register_pin_map(self, pin_map_path: pathlib.Path) -> None:
self._pin_map_context = PinMapContext(pin_map_id=pin_map_id, sites=[0])
else:
self._pin_map_context = self._pin_map_context._replace(pin_map_id=pin_map_id)


def _convert_paths_to_strings(parameter_values: Iterable[Any]) -> List[Any]:
result: List[Any] = []

for parameter_value in parameter_values:
if isinstance(parameter_value, list):
converted_list = []
for value in parameter_value:
if isinstance(value, Path):
converted_list.append(str(value))
else:
converted_list.append(value)
result.append(converted_list)
elif isinstance(parameter_value, Path):
result.append(str(parameter_value))
else:
result.append(parameter_value)
return result
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,29 @@
@measurement_service.configuration("Bool In", nims.DataType.Boolean, False)
@measurement_service.configuration("String In", nims.DataType.String, "sample string")
@measurement_service.configuration(
"String Array In", nims.DataType.StringArray1D, ["String1", "String2"]
"String Array In",
nims.DataType.StringArray1D,
[
"string with /forwardslash",
"string with \\backslash",
"string with 'single quotes'",
'string with "double quotes"',
"string with \ttabspace",
"string with \nnewline",
],
)
@measurement_service.configuration("Path In", nims.DataType.Path, "path/test")
@measurement_service.configuration("Path In", nims.DataType.Path, "sample\\path\\for\\test")
@measurement_service.configuration(
"Path Array In", nims.DataType.PathArray1D, ["path/test1", "path/ntest2"]
"Path Array In",
nims.DataType.PathArray1D,
[
"path/with/forward/slash",
"path\\with\\backslash",
"path with 'single quotes'",
'path with "double quotes"',
"path\twith\ttabs",
"path\nwith\nnewlines",
],
)
@measurement_service.configuration("IO In", nims.DataType.IOResource, "resource")
@measurement_service.configuration(
Expand Down

0 comments on commit 0462410

Please sign in to comment.