Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add python as a default annotation under programming language. #599

Merged
merged 10 commits into from
Jan 30, 2024
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ni_measurementlink_service/_annotations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Constants for annotations

ENUM_VALUES_KEY = "ni/enum.values"
TYPE_SPECIALIZATION_KEY = "ni/type_specialization"
SERVICE_PROGRAMMINGLANGUAGE_KEY = "ni/service.programminglanguage"
11 changes: 6 additions & 5 deletions ni_measurementlink_service/_internal/parameter/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

from google.protobuf import type_pb2

from ni_measurementlink_service._annotations import (
ENUM_VALUES_KEY,
TYPE_SPECIALIZATION_KEY,
)
from ni_measurementlink_service._internal.parameter import serialization_strategy
from ni_measurementlink_service.measurement.info import TypeSpecialization

Expand Down Expand Up @@ -146,11 +150,8 @@ def get_enum_values_annotation(parameter_metadata: ParameterMetadata) -> str:
Returns:
str: The value of "ni/enum.values" annotation
"""
if (
parameter_metadata.annotations.get("ni/type_specialization")
== TypeSpecialization.Enum.value
):
return parameter_metadata.annotations.get("ni/enum.values", "")
if parameter_metadata.annotations.get(TYPE_SPECIALIZATION_KEY) == TypeSpecialization.Enum.value:
return parameter_metadata.annotations.get(ENUM_VALUES_KEY, "")
else:
return ""

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
)
from google.protobuf.message import Message

from ni_measurementlink_service._annotations import (
TYPE_SPECIALIZATION_KEY,
)
from ni_measurementlink_service._internal.parameter import serialization_strategy
from ni_measurementlink_service._internal.parameter.metadata import (
ParameterMetadata,
Expand Down Expand Up @@ -76,7 +79,7 @@ def serialize_parameters(
)
# Convert enum parameters to their underlying value if necessary.
if (
parameter_metadata.annotations.get("ni/type_specialization")
parameter_metadata.annotations.get(TYPE_SPECIALIZATION_KEY)
== TypeSpecialization.Enum.value
):
parameter = _get_enum_value(parameter, parameter_metadata.repeated)
Expand Down
7 changes: 6 additions & 1 deletion ni_measurementlink_service/discovery/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import grpc
from deprecation import deprecated

from ni_measurementlink_service._annotations import (
SERVICE_PROGRAMMINGLANGUAGE_KEY,
)
from ni_measurementlink_service._internal.stubs.ni.measurementlink.discovery.v1 import (
discovery_service_pb2,
discovery_service_pb2_grpc,
Expand Down Expand Up @@ -111,13 +114,15 @@ def register_service(self, service_info: ServiceInfo, service_location: ServiceL
Returns:
ID that can be used to unregister the service.
"""
annotations = service_info.annotations.copy()
annotations[SERVICE_PROGRAMMINGLANGUAGE_KEY] = "Python"
try:
grpc_service_description = discovery_service_pb2.ServiceDescriptor(
display_name=service_info.display_name,
description_url=service_info.description_url,
provided_interfaces=service_info.provided_interfaces,
service_class=service_info.service_class,
annotations=service_info.annotations,
annotations=annotations,
)

grpc_service_location = discovery_service_pb2.ServiceLocation(
Expand Down
8 changes: 6 additions & 2 deletions ni_measurementlink_service/measurement/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
from google.protobuf.descriptor import EnumDescriptor

from ni_measurementlink_service import _datatypeinfo
from ni_measurementlink_service._annotations import (
ENUM_VALUES_KEY,
TYPE_SPECIALIZATION_KEY,
)
from ni_measurementlink_service._featuretoggles import (
SESSION_MANAGEMENT_2024Q1,
requires_feature,
Expand Down Expand Up @@ -512,13 +516,13 @@ def _make_annotations_dict(
if type_specialization == TypeSpecialization.NoType:
return annotations

annotations["ni/type_specialization"] = type_specialization.value
annotations[TYPE_SPECIALIZATION_KEY] = type_specialization.value
if type_specialization == TypeSpecialization.Pin:
if instrument_type != "" or instrument_type is not None:
annotations["ni/pin.instrument_type"] = instrument_type
if type_specialization == TypeSpecialization.Enum:
if enum_type is not None:
annotations["ni/enum.values"] = self._enum_to_annotations_value(enum_type)
annotations[ENUM_VALUES_KEY] = self._enum_to_annotations_value(enum_type)
else:
raise ValueError("enum_type is required for enum parameters.")

Expand Down
4 changes: 4 additions & 0 deletions tests/unit/test_discovery_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
import pytest
from pytest_mock import MockerFixture

from ni_measurementlink_service._annotations import (
SERVICE_PROGRAMMINGLANGUAGE_KEY,
)
from ni_measurementlink_service._internal.stubs.ni.measurementlink.discovery.v1.discovery_service_pb2 import (
RegisterServiceRequest,
RegisterServiceResponse,
Expand Down Expand Up @@ -382,6 +385,7 @@ def _assert_service_location_equal(
def _assert_service_info_equal(
expected: ServiceInfo, actual: Union[ServiceInfo, GrpcServiceDescriptor]
) -> None:
expected.annotations[SERVICE_PROGRAMMINGLANGUAGE_KEY] = "Python"
assert expected.display_name == actual.display_name
assert expected.description_url == actual.description_url
assert set(expected.provided_interfaces) == set(actual.provided_interfaces)
Expand Down
32 changes: 18 additions & 14 deletions tests/unit/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
import pytest

from ni_measurementlink_service import _datatypeinfo
from ni_measurementlink_service._annotations import (
ENUM_VALUES_KEY,
TYPE_SPECIALIZATION_KEY,
)
from ni_measurementlink_service._internal.parameter import metadata
from ni_measurementlink_service.measurement.info import DataType, TypeSpecialization

Expand Down Expand Up @@ -49,25 +53,25 @@ class Countries(IntEnum):
DataType.Enum,
1.0,
{
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
},
),
(
DataType.Enum,
DifferentColor.TEAL,
{
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
},
),
(DataType.EnumArray1D, 1, {}),
(
DataType.EnumArray1D,
[1.0, 2.0],
{
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
},
),
],
Expand Down Expand Up @@ -100,32 +104,32 @@ def test___default_value_different_from_type___validate___raises_type_exception(
DataType.Enum,
Color.BLUE,
{
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
},
),
(
DataType.EnumArray1D,
[Color.BLUE, Color.GREEN],
{
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"NONE":0, "RED": 1, "GREEN": 2, "BLUE": 3}',
},
),
(
DataType.Enum,
Countries.AUSTRALIA,
{
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"AMERICA":0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"AMERICA":0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
},
),
(
DataType.EnumArray1D,
[Countries.AUSTRALIA, Countries.CANADA],
{
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"AMERICA":0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"AMERICA":0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
},
),
],
Expand Down
21 changes: 13 additions & 8 deletions tests/unit/test_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
import pytest
from google.protobuf import any_pb2, type_pb2


from ni_measurementlink_service._annotations import (
ENUM_VALUES_KEY,
TYPE_SPECIALIZATION_KEY,
)
from ni_measurementlink_service._internal.parameter import serializer
from ni_measurementlink_service._internal.parameter.metadata import (
ParameterMetadata,
Expand Down Expand Up @@ -401,8 +406,8 @@ def _get_test_parameter_by_id(default_values):
repeated=False,
default_value=default_values[16],
annotations={
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"PURPLE": 0, "ORANGE": 1, "TEAL": 2, "BROWN": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"PURPLE": 0, "ORANGE": 1, "TEAL": 2, "BROWN": 3}',
},
),
18: ParameterMetadata(
Expand All @@ -411,8 +416,8 @@ def _get_test_parameter_by_id(default_values):
repeated=True,
default_value=default_values[17],
annotations={
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"PURPLE": 0, "ORANGE": 1, "TEAL": 2, "BROWN": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"PURPLE": 0, "ORANGE": 1, "TEAL": 2, "BROWN": 3}',
},
),
19: ParameterMetadata(
Expand All @@ -421,8 +426,8 @@ def _get_test_parameter_by_id(default_values):
repeated=False,
default_value=default_values[18],
annotations={
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"AMERICA": 0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"AMERICA": 0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
},
),
20: ParameterMetadata(
Expand All @@ -431,8 +436,8 @@ def _get_test_parameter_by_id(default_values):
repeated=True,
default_value=default_values[19],
annotations={
"ni/type_specialization": TypeSpecialization.Enum.value,
"ni/enum.values": '{"AMERICA": 0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Enum.value,
ENUM_VALUES_KEY: '{"AMERICA": 0, "TAIWAN": 1, "AUSTRALIA": 2, "CANADA": 3}',
},
),
21: ParameterMetadata(
Expand Down
11 changes: 7 additions & 4 deletions tests/unit/test_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
from pytest_mock import MockerFixture

from ni_measurementlink_service import _datatypeinfo
from ni_measurementlink_service._annotations import (
TYPE_SPECIALIZATION_KEY,
)
from ni_measurementlink_service.measurement.info import DataType, TypeSpecialization
from ni_measurementlink_service.measurement.service import MeasurementService

Expand Down Expand Up @@ -99,7 +102,7 @@ def test___measurement_service___add_pin_configuration__pin_configuration_added(
and param.default_value == default_value
and param.annotations
== {
"ni/type_specialization": TypeSpecialization.Pin.value,
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Pin.value,
"ni/pin.instrument_type": instrument_type,
}
for param in measurement_service._configuration_parameter_list
Expand Down Expand Up @@ -130,7 +133,7 @@ def test___measurement_service___add_non_pin_configuration__pin_type_annotations
measurement_service.configuration(display_name, type, default_value)(_fake_measurement_function)

assert not all(
param.annotations.get("ni/type_specialization") == TypeSpecialization.Pin.value
param.annotations.get(TYPE_SPECIALIZATION_KEY) == TypeSpecialization.Pin.value
for param in measurement_service._configuration_parameter_list
)

Expand Down Expand Up @@ -158,7 +161,7 @@ def test___measurement_service___add_path_configuration__path_configuration_adde
and param.default_value == default_value
and param.annotations
== {
"ni/type_specialization": TypeSpecialization.Path.value,
TYPE_SPECIALIZATION_KEY: TypeSpecialization.Path.value,
}
for param in measurement_service._configuration_parameter_list
)
Expand Down Expand Up @@ -188,7 +191,7 @@ def test___measurement_service___add_non_path_configuration__path_type_annotatio
measurement_service.configuration(display_name, type, default_value)(_fake_measurement_function)

assert not all(
param.annotations.get("ni/type_specialization") == TypeSpecialization.Path.value
param.annotations.get(TYPE_SPECIALIZATION_KEY) == TypeSpecialization.Path.value
for param in measurement_service._configuration_parameter_list
)

Expand Down
Loading