From da76f756dbaee01435bab6084ebd503538f28353 Mon Sep 17 00:00:00 2001 From: Michael Johansen Date: Wed, 17 Jun 2026 16:43:30 -0500 Subject: [PATCH 1/4] Remove timestamp fallbacks for non-batched publishing Signed-off-by: Michael Johansen --- src/ni/datastore/data/_data_store_client.py | 6 ++-- src/ni/datastore/data/_grpc_conversion.py | 36 ++++----------------- tests/unit/data/test_publish_measurement.py | 11 ++++--- 3 files changed, 15 insertions(+), 38 deletions(-) diff --git a/src/ni/datastore/data/_data_store_client.py b/src/ni/datastore/data/_data_store_client.py index 6cde16b..e9e6364 100644 --- a/src/ni/datastore/data/_data_store_client.py +++ b/src/ni/datastore/data/_data_store_client.py @@ -37,9 +37,9 @@ from ni_grpc_extensions.channelpool import GrpcChannelPool from ni.datastore.data._grpc_conversion import ( + convert_measurement_timestamp_to_protobuf, convert_read_condition_response_from_protobuf, convert_read_measurement_response_from_protobuf, - get_publish_measurement_timestamp, populate_publish_condition_batch_request_values, populate_publish_condition_request_value, populate_publish_measurement_batch_request_values, @@ -275,11 +275,9 @@ def publish_measurement( test_adapter_ids=test_adapter_ids, software_item_ids=software_item_ids, notes=notes, + timestamp=convert_measurement_timestamp_to_protobuf(timestamp), ) populate_publish_measurement_request_value(publish_request, value) - publish_request.timestamp.CopyFrom( - get_publish_measurement_timestamp(publish_request, timestamp) - ) publish_response = self._get_data_store_client().publish_measurement(publish_request) return publish_response.measurement_id diff --git a/src/ni/datastore/data/_grpc_conversion.py b/src/ni/datastore/data/_grpc_conversion.py index 70bb863..1d36795 100644 --- a/src/ni/datastore/data/_grpc_conversion.py +++ b/src/ni/datastore/data/_grpc_conversion.py @@ -2,7 +2,6 @@ from __future__ import annotations -import datetime as std_datetime import logging from itertools import chain from typing import Any, Callable, cast, Iterable @@ -364,32 +363,11 @@ def convert_read_condition_response_from_protobuf(response: ReadConditionValueRe raise TypeError(f"Invalid read type: {read_data_type}") -def get_publish_measurement_timestamp( - publish_request: PublishMeasurementRequest, client_provided_timestamp: ht.datetime | None -) -> PrecisionTimestamp: - """Determine the correct timestamp to use for publishing a measurement.""" - no_client_timestamp_provided = client_provided_timestamp is None - if no_client_timestamp_provided: - publish_time = hightime_datetime_to_protobuf(ht.datetime.now(std_datetime.timezone.utc)) +def convert_measurement_timestamp_to_protobuf( + client_provided_timestamp: ht.datetime | None, +) -> PrecisionTimestamp | None: + """Convert the provided timestamp to PrecisionTimestamp if it's not None.""" + if client_provided_timestamp is not None: + return hightime_datetime_to_protobuf(client_provided_timestamp) else: - publish_time = hightime_datetime_to_protobuf(cast(ht.datetime, client_provided_timestamp)) - - waveform_t0: PrecisionTimestamp | None = None - value_case = publish_request.WhichOneof("value") - if value_case == "double_analog_waveform": - waveform_t0 = publish_request.double_analog_waveform.t0 - elif value_case == "i16_analog_waveform": - waveform_t0 = publish_request.i16_analog_waveform.t0 - elif value_case == "double_complex_waveform": - waveform_t0 = publish_request.double_complex_waveform.t0 - elif value_case == "i16_complex_waveform": - waveform_t0 = publish_request.i16_complex_waveform.t0 - elif value_case == "digital_waveform": - waveform_t0 = publish_request.digital_waveform.t0 - - # If an initialized waveform t0 value is present and no client timestamp was provided, - # use the waveform t0 as the measurement start time. - if waveform_t0 is not None and waveform_t0 != PrecisionTimestamp(): - if no_client_timestamp_provided: - publish_time = waveform_t0 - return publish_time + return None diff --git a/tests/unit/data/test_publish_measurement.py b/tests/unit/data/test_publish_measurement.py index b4c9f7f..f91671c 100644 --- a/tests/unit/data/test_publish_measurement.py +++ b/tests/unit/data/test_publish_measurement.py @@ -23,6 +23,7 @@ from ni.protobuf.types.precision_timestamp_conversion import ( hightime_datetime_to_protobuf, ) +from ni.protobuf.types.precision_timestamp_pb2 import PrecisionTimestamp from ni.protobuf.types.vector_conversion import vector_to_protobuf from ni.protobuf.types.vector_pb2 import Vector as VectorProto from ni.protobuf.types.waveform_conversion import float64_analog_waveform_to_protobuf @@ -65,7 +66,7 @@ def test___publish_boolean_data___calls_data_store_service_client( assert request.step_id == "step_id" assert request.name == "name" assert request.notes == "notes" - assert request.timestamp == unittest.mock.ANY + assert request.timestamp == hightime_datetime_to_protobuf(timestamp) assert request.scalar.bool_value == value assert request.outcome == OutcomeProto.OUTCOME_PASSED assert request.error_information == ErrorInformationProto() @@ -184,7 +185,7 @@ def test___unsupported_list___publish_measurement___raises_type_error( assert exc.value.args[0].startswith("Unsupported iterable:") -def test___publish_analog_waveform_data_without_timestamp_parameter___uses_waveform_t0( +def test___publish_analog_waveform_data_without_timestamp_parameter___timestamp_is_default( data_store_client: DataStoreClient, mocked_data_store_service_client: NonCallableMock, ) -> None: @@ -203,7 +204,7 @@ def test___publish_analog_waveform_data_without_timestamp_parameter___uses_wavef args, __ = mocked_data_store_service_client.publish_measurement.call_args request = cast(PublishMeasurementRequest, args[0]) # The PublishMeasurementRequest object assert measurement_id == "response_id" - assert request.timestamp == hightime_datetime_to_protobuf(timestamp) + assert request.timestamp == PrecisionTimestamp() def test___publish_analog_waveform_data_without_t0___uses_timestamp_parameter( @@ -251,7 +252,7 @@ def test___publish_analog_waveform_data_with_mismatched_timestamp_parameter___us assert request.timestamp == hightime_datetime_to_protobuf(mismatched_timestamp) -def test___publish_analog_waveform_data_without_t0_or_timestamp___uses_now( +def test___publish_analog_waveform_data_without_t0_or_timestamp___timestamp_is_default( data_store_client: DataStoreClient, mocked_data_store_service_client: NonCallableMock, ) -> None: @@ -267,7 +268,7 @@ def test___publish_analog_waveform_data_without_t0_or_timestamp___uses_now( args, __ = mocked_data_store_service_client.publish_measurement.call_args request = cast(PublishMeasurementRequest, args[0]) - assert request.timestamp == hightime_datetime_to_protobuf(now) + assert request.timestamp == PrecisionTimestamp() def test___none___publish_measurement___raises_type_error( From 56b8f25ab7be4c1485be4f49a54841e5e0a83a84 Mon Sep 17 00:00:00 2001 From: Michael Johansen Date: Thu, 18 Jun 2026 13:04:40 -0500 Subject: [PATCH 2/4] Address PR feedback. Add not HasField checks. Fix comment. Get rid of unneeded mock. Signed-off-by: Michael Johansen --- examples/overview/poetry.lock | 106 ++++++++++---------- examples/overview/pyproject.toml | 2 +- src/ni/datastore/data/_data_store_client.py | 4 +- tests/unit/data/test_publish_measurement.py | 12 +-- 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/examples/overview/poetry.lock b/examples/overview/poetry.lock index ed2d3d1..b115155 100644 --- a/examples/overview/poetry.lock +++ b/examples/overview/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.4.1 and should not be changed by hand. [[package]] name = "black" @@ -188,7 +188,7 @@ version = "1.76.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc"}, {file = "grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde"}, @@ -317,7 +317,7 @@ files = [ [package.dependencies] grpcio = ">=1.49.1" -protobuf = ">=4.21.3,<5.0dev" +protobuf = ">=4.21.3,<5.0.dev0" setuptools = "*" [[package]] @@ -387,7 +387,7 @@ files = [ [package.dependencies] grpcio = ">=1.59.0" -protobuf = ">=4.21.6,<5.0dev" +protobuf = ">=4.21.6,<5.0.dev0" setuptools = "*" [[package]] @@ -458,7 +458,7 @@ files = [ [package.dependencies] grpcio = ">=1.67.0" -protobuf = ">=5.26.1,<6.0dev" +protobuf = ">=5.26.1,<6.0.dev0" setuptools = "*" [[package]] @@ -544,7 +544,7 @@ version = "1.0.0" description = "Hightime Python API" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "hightime-1.0.0-py3-none-any.whl", hash = "sha256:ba86d42976c36451b14e11c736e61f296f9f00dbb79c8488e18d70c6b2dbb395"}, {file = "hightime-1.0.0.tar.gz", hash = "sha256:480d2a03e2c3ed44916d2406d40ab6d10a276ed7f101619fc3fcc1e00c46aacf"}, @@ -744,7 +744,7 @@ version = "1.0.0" description = "Protobuf data types and service stub for NI data moniker gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "ni_datamonikers_v1_proto-1.0.0-py3-none-any.whl", hash = "sha256:77d078d810656b3e90152a065047c6203140e0998e8cbdf9d2dbb6e9f477840e"}, {file = "ni_datamonikers_v1_proto-1.0.0.tar.gz", hash = "sha256:2e4cf30f9dee343af4a5f328fb785320d2eb30705abc15f0695057177afd5f00"}, @@ -755,30 +755,32 @@ protobuf = ">=4.21" [[package]] name = "ni-datastore" -version = "2.0.0.dev0" +version = "2.0.0.dev1" description = "APIs for publishing and retrieving data from NI Measurement Data Services" optional = false -python-versions = "<4.0,>=3.10" -groups = ["main"] -files = [ - {file = "ni_datastore-2.0.0.dev0-py3-none-any.whl", hash = "sha256:b9746d323d5532786fdbc1aa40ab5d22989ca2838117a1114607d04efaa4d391"}, - {file = "ni_datastore-2.0.0.dev0.tar.gz", hash = "sha256:9dd519897e406206b609477649e2ec01bd16d4ead70590e8c2de62289f6b49c8"}, -] +python-versions = "^3.10" +groups = ["main", "dev"] +files = [] +develop = true [package.dependencies] hightime = ">=1.0.0" -ni-measurements-data-v1-client = ">=1.1.0dev0" +ni-measurements-data-v1-client = ">=1.1.0dev1" ni-measurements-metadata-v1-client = ">=1.0.0" -ni-protobuf-types = ">=1.1.0" +ni-protobuf-types = ">=1.2.0dev1" protobuf = ">=4.21" +[package.source] +type = "directory" +url = "../.." + [[package]] name = "ni-grpc-extensions" version = "1.1.0" description = "gRPC Extensions" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "ni_grpc_extensions-1.1.0-py3-none-any.whl", hash = "sha256:db0357acd244854f4acccf202c89fe6462b4283d264ed639f4e248e6cc86bc9b"}, {file = "ni_grpc_extensions-1.1.0.tar.gz", hash = "sha256:028ea33e5c5234bc050bf5dc99f5b61611531de8f012293e9d4c6985b7b37afb"}, @@ -794,7 +796,7 @@ version = "1.1.0" description = "gRPC Client for NI Discovery Service" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "ni_measurementlink_discovery_v1_client-1.1.0-py3-none-any.whl", hash = "sha256:366dcc3b93627ed1ede488955637e0768b29cb7a375e59ac1020f4c53892d00c"}, {file = "ni_measurementlink_discovery_v1_client-1.1.0.tar.gz", hash = "sha256:831b6145cf8def0021cb00579b08a2ad1da5a19fdeedea4522a3cb4a30978c48"}, @@ -812,7 +814,7 @@ version = "1.1.0" description = "Protobuf data types for NI discovery gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "ni_measurementlink_discovery_v1_proto-1.1.0-py3-none-any.whl", hash = "sha256:6a3061ca858d3ee887987dc5130074fc439ce6c2b26fe6b3f9401da023461d43"}, {file = "ni_measurementlink_discovery_v1_proto-1.1.0.tar.gz", hash = "sha256:f9a9b4572ac5d169fad21ab56e2639abdb77979cf0dc3a88cdb71b2c783d009c"}, @@ -823,36 +825,36 @@ protobuf = ">=4.21" [[package]] name = "ni-measurements-data-v1-client" -version = "1.1.0.dev0" +version = "1.1.0" description = "gRPC Client for NI Data Store Service" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ - {file = "ni_measurements_data_v1_client-1.1.0.dev0-py3-none-any.whl", hash = "sha256:d41f93ff1584461ef45dd4ea25c3ceaf763da53c0a2cc5e48c64f675e4ba3c00"}, - {file = "ni_measurements_data_v1_client-1.1.0.dev0.tar.gz", hash = "sha256:3043ef784d6dec4f476f3065e781ce8a1f2db38900c3a0ef5d90d6c08a9fa466"}, + {file = "ni_measurements_data_v1_client-1.1.0-py3-none-any.whl", hash = "sha256:dfc38d56fdd710a930fbc05383d43ab96f64aee545937f9ef605a3bb6f88cc31"}, + {file = "ni_measurements_data_v1_client-1.1.0.tar.gz", hash = "sha256:16b1ac8b82277e41719aa8b1aeae3f1040dba47e63651f83e30fe115cd036278"}, ] [package.dependencies] ni-measurementlink-discovery-v1-client = ">=1.1.0" -ni-measurements-data-v1-proto = ">=1.1.0.dev0" +ni-measurements-data-v1-proto = ">=1.1.0" [[package]] name = "ni-measurements-data-v1-proto" -version = "1.1.0.dev0" +version = "1.1.0" description = "Protobuf data types and service stubs for NI data store gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ - {file = "ni_measurements_data_v1_proto-1.1.0.dev0-py3-none-any.whl", hash = "sha256:c1e5ad669ab978c7202f58fac7eda2e19be2a6fcc4b07bc13f1904a5aad43809"}, - {file = "ni_measurements_data_v1_proto-1.1.0.dev0.tar.gz", hash = "sha256:99102d9e785031ce0797efa435fce975e9a0de8547b76079aaa7e35c871e7da4"}, + {file = "ni_measurements_data_v1_proto-1.1.0-py3-none-any.whl", hash = "sha256:06096cea733717b60281c92d0a1b44eac97194781507ba4fd9b3aa080a4450df"}, + {file = "ni_measurements_data_v1_proto-1.1.0.tar.gz", hash = "sha256:df1ca7ce3603dd5a0adc8795f0844da9a78ddc026f219bf596957cf3ed08da3d"}, ] [package.dependencies] ni-datamonikers-v1-proto = ">=1.0.0" ni-measurements-metadata-v1-proto = ">=1.0.0" -ni-protobuf-types = ">=1.1.0" +ni-protobuf-types = ">=1.2.0" protobuf = ">=4.21" [[package]] @@ -861,7 +863,7 @@ version = "1.0.0" description = "gRPC Client for NI Metadata Store Service" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "ni_measurements_metadata_v1_client-1.0.0-py3-none-any.whl", hash = "sha256:c697ce4e98105b810f4da844a598e86e359ff6c90ca7a832e1e23a70327551a7"}, {file = "ni_measurements_metadata_v1_client-1.0.0.tar.gz", hash = "sha256:9f9a10810c4c6693239081abbc026414a18df3e3d04daa3cd59010b1eed07f51"}, @@ -877,7 +879,7 @@ version = "1.0.0" description = "Protobuf data types and service stub for NI metadata store gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "ni_measurements_metadata_v1_proto-1.0.0-py3-none-any.whl", hash = "sha256:8844806d6775ac65144100fcd03099aea0c17ed55de696683d0663166f45cee3"}, {file = "ni_measurements_metadata_v1_proto-1.0.0.tar.gz", hash = "sha256:3283cf7f0c452812a311b2b9274b5ba1e549f994f6a978a125f1746b85746e6f"}, @@ -888,18 +890,18 @@ protobuf = ">=4.21" [[package]] name = "ni-protobuf-types" -version = "1.1.0" +version = "1.2.0" description = "Protobuf data types for NI gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ - {file = "ni_protobuf_types-1.1.0-py3-none-any.whl", hash = "sha256:0c21c096cf8577483dade081c571305fe8d4cc759ce2c780e7437129a375942c"}, - {file = "ni_protobuf_types-1.1.0.tar.gz", hash = "sha256:98f0583405e219f6e128133c2f6c033f03cd83ebd3ce8098ad74ab99b8a253c1"}, + {file = "ni_protobuf_types-1.2.0-py3-none-any.whl", hash = "sha256:461c4825571d0054fd5427664403c3d69fcd180c9c00868ac1911693dd9bf901"}, + {file = "ni_protobuf_types-1.2.0.tar.gz", hash = "sha256:e8226f8ef44b104ffb1b1f6e416511c416be4d91bf5c2633db7ab58294e037bb"}, ] [package.dependencies] -nitypes = ">=1.1.0dev1" +nitypes = ">=1.1.0" protobuf = ">=4.21" [[package]] @@ -918,8 +920,8 @@ files = [ black = ">=23.1" click = ">=7.1.2" flake8 = [ - {version = ">=5.0,<6.0", markers = "python_version >= \"3.7\" and python_version < \"3.12\""}, {version = ">=6.1,<7.0", markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, + {version = ">=5.0,<6.0", markers = "python_version >= \"3.7\" and python_version < \"3.12\""}, ] flake8-black = ">=0.2.1" flake8-docstrings = ">=1.5.0" @@ -928,28 +930,28 @@ isort = ">=5.10" pathspec = ">=0.11.1" pep8-naming = ">=0.11.1" pycodestyle = [ - {version = ">=2.9,<3.0", markers = "python_version >= \"3.7\" and python_version < \"3.12\""}, {version = ">=2.11,<3.0", markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, + {version = ">=2.9,<3.0", markers = "python_version >= \"3.7\" and python_version < \"3.12\""}, ] toml = ">=0.10.1" [[package]] name = "nitypes" -version = "1.1.0.dev1" +version = "1.1.0" description = "Data types for NI Python APIs" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] +groups = ["main", "dev"] files = [ - {file = "nitypes-1.1.0.dev1-py3-none-any.whl", hash = "sha256:d98ad6e3f8b92db76b5c1c584431fa27d3e74cce6e20464e43ee0117b02fe089"}, - {file = "nitypes-1.1.0.dev1.tar.gz", hash = "sha256:50b23e00cc6960996656c4c9ef0ca71dd267fc5c9ca481077b682c29190aa2d3"}, + {file = "nitypes-1.1.0-py3-none-any.whl", hash = "sha256:b43ac7027e1cceeca7ceffa58f31ffadd03feeb1788ca5cb8f9d105e73893b14"}, + {file = "nitypes-1.1.0.tar.gz", hash = "sha256:f273b5131ef0d5b848c37a0a63452626caf5c2938f7744c324f7991b76fa0b60"}, ] [package.dependencies] hightime = ">=0.2.2" numpy = [ - {version = ">=1.22", markers = "python_version >= \"3.9\" and python_version < \"3.13\""}, {version = ">=2.1", markers = "python_version >= \"3.13\" and python_version < \"4.0\""}, + {version = ">=1.22", markers = "python_version >= \"3.9\" and python_version < \"3.13\""}, ] typing-extensions = ">=4.13.2" @@ -959,7 +961,7 @@ version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "dev"] markers = "python_version < \"3.12\"" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, @@ -1025,7 +1027,7 @@ version = "2.3.5" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" -groups = ["main"] +groups = ["main", "dev"] markers = "python_version >= \"3.12\"" files = [ {file = "numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10"}, @@ -1166,7 +1168,7 @@ version = "4.25.8" description = "" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "dev"] markers = "python_version <= \"3.12\"" files = [ {file = "protobuf-4.25.8-cp310-abi3-win32.whl", hash = "sha256:504435d831565f7cfac9f0714440028907f1975e4bed228e58e72ecfff58a1e0"}, @@ -1188,7 +1190,7 @@ version = "5.29.5" description = "" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "dev"] markers = "python_version == \"3.13\"" files = [ {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, @@ -1210,7 +1212,7 @@ version = "6.33.1" description = "" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "dev"] markers = "python_version >= \"3.14\"" files = [ {file = "protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b"}, @@ -1316,7 +1318,7 @@ version = "311" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["main"] +groups = ["main", "dev"] markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, @@ -1445,7 +1447,7 @@ version = "1.0.1" description = "Generates Event Tracing for Windows events using TraceLogging" optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["main", "dev"] markers = "sys_platform == \"win32\"" files = [ {file = "traceloggingdynamic-1.0.1-py3-none-any.whl", hash = "sha256:0e19da491a8960725b3622366487ae35f49d8f595bb2e4e5ce1795eb5928db7c"}, @@ -1482,7 +1484,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "lint"] +groups = ["main", "dev", "lint"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -1491,4 +1493,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "e83ffbce072edf9ce9fd71b57b75d0c073dafd002bd41de1cbef3a7d04b7efba" +content-hash = "1c9c1a4d1b906aed1b8c65ce4a1419ee8d6da769515fba4b83d02c7777b8f93c" diff --git a/examples/overview/pyproject.toml b/examples/overview/pyproject.toml index 8da7ce0..06e952c 100644 --- a/examples/overview/pyproject.toml +++ b/examples/overview/pyproject.toml @@ -55,7 +55,7 @@ grpcio-tools = [ types-grpcio = ">=1.0" types-protobuf = ">=4.21" # Uncomment to use local ni-datastore code -# ni-datastore = {path = "../..", develop = true} +ni-datastore = {path = "../..", develop = true} datastore-utilities = { path = "../../utilities", develop = true } [tool.poetry.group.lint.dependencies] diff --git a/src/ni/datastore/data/_data_store_client.py b/src/ni/datastore/data/_data_store_client.py index e9e6364..bd9b176 100644 --- a/src/ni/datastore/data/_data_store_client.py +++ b/src/ni/datastore/data/_data_store_client.py @@ -238,8 +238,8 @@ def publish_measurement( step_id: The ID of the step associated with this measurement. This value is expected to be a parsable GUID. - timestamp: The timestamp of the measurement. If None, the current - time will be used. + timestamp: The timestamp of the measurement. If None, no timestamp + will be specified. outcome: The outcome of the measurement (PASSED, FAILED, INDETERMINATE, or UNSPECIFIED). diff --git a/tests/unit/data/test_publish_measurement.py b/tests/unit/data/test_publish_measurement.py index f91671c..d437457 100644 --- a/tests/unit/data/test_publish_measurement.py +++ b/tests/unit/data/test_publish_measurement.py @@ -3,7 +3,6 @@ from __future__ import annotations import datetime as std_datetime -import unittest.mock from typing import Any, cast, Iterable from unittest.mock import NonCallableMock @@ -185,7 +184,7 @@ def test___unsupported_list___publish_measurement___raises_type_error( assert exc.value.args[0].startswith("Unsupported iterable:") -def test___publish_analog_waveform_data_without_timestamp_parameter___timestamp_is_default( +def test___publish_analog_waveform_data_without_timestamp_parameter___timestamp_is_unset( data_store_client: DataStoreClient, mocked_data_store_service_client: NonCallableMock, ) -> None: @@ -204,6 +203,7 @@ def test___publish_analog_waveform_data_without_timestamp_parameter___timestamp_ args, __ = mocked_data_store_service_client.publish_measurement.call_args request = cast(PublishMeasurementRequest, args[0]) # The PublishMeasurementRequest object assert measurement_id == "response_id" + assert not request.HasField("timestamp") assert request.timestamp == PrecisionTimestamp() @@ -252,22 +252,20 @@ def test___publish_analog_waveform_data_with_mismatched_timestamp_parameter___us assert request.timestamp == hightime_datetime_to_protobuf(mismatched_timestamp) -def test___publish_analog_waveform_data_without_t0_or_timestamp___timestamp_is_default( +def test___publish_analog_waveform_data_without_t0_or_timestamp___timestamp_is_unset( data_store_client: DataStoreClient, mocked_data_store_service_client: NonCallableMock, ) -> None: - now = datetime.now(tz=std_datetime.timezone.utc) analog_waveform = AnalogWaveform.from_array_1d([1.0, 2.0, 3.0], dtype=float) mocked_data_store_service_client.publish_measurement.return_value = PublishMeasurementResponse( measurement_id="response_id" ) - with unittest.mock.patch("ni.datastore.data._grpc_conversion.ht.datetime") as mock_ht_datetime: - mock_ht_datetime.now.return_value = now - data_store_client.publish_measurement("name", analog_waveform, "step_id") + data_store_client.publish_measurement("name", analog_waveform, "step_id") args, __ = mocked_data_store_service_client.publish_measurement.call_args request = cast(PublishMeasurementRequest, args[0]) + assert not request.HasField("timestamp") assert request.timestamp == PrecisionTimestamp() From 2fa7846e6a28a6f9cade74588a4dc080b591b2d2 Mon Sep 17 00:00:00 2001 From: Michael Johansen Date: Thu, 18 Jun 2026 14:37:05 -0500 Subject: [PATCH 3/4] revert example changes Signed-off-by: Michael Johansen --- examples/overview/poetry.lock | 106 +++++++++++++++---------------- examples/overview/pyproject.toml | 4 +- 2 files changed, 54 insertions(+), 56 deletions(-) diff --git a/examples/overview/poetry.lock b/examples/overview/poetry.lock index b115155..0a58d76 100644 --- a/examples/overview/poetry.lock +++ b/examples/overview/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. [[package]] name = "black" @@ -188,7 +188,7 @@ version = "1.76.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc"}, {file = "grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde"}, @@ -317,7 +317,7 @@ files = [ [package.dependencies] grpcio = ">=1.49.1" -protobuf = ">=4.21.3,<5.0.dev0" +protobuf = ">=4.21.3,<5.0dev" setuptools = "*" [[package]] @@ -387,7 +387,7 @@ files = [ [package.dependencies] grpcio = ">=1.59.0" -protobuf = ">=4.21.6,<5.0.dev0" +protobuf = ">=4.21.6,<5.0dev" setuptools = "*" [[package]] @@ -458,7 +458,7 @@ files = [ [package.dependencies] grpcio = ">=1.67.0" -protobuf = ">=5.26.1,<6.0.dev0" +protobuf = ">=5.26.1,<6.0dev" setuptools = "*" [[package]] @@ -544,7 +544,7 @@ version = "1.0.0" description = "Hightime Python API" optional = false python-versions = "<4.0,>=3.9" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "hightime-1.0.0-py3-none-any.whl", hash = "sha256:ba86d42976c36451b14e11c736e61f296f9f00dbb79c8488e18d70c6b2dbb395"}, {file = "hightime-1.0.0.tar.gz", hash = "sha256:480d2a03e2c3ed44916d2406d40ab6d10a276ed7f101619fc3fcc1e00c46aacf"}, @@ -744,7 +744,7 @@ version = "1.0.0" description = "Protobuf data types and service stub for NI data moniker gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "ni_datamonikers_v1_proto-1.0.0-py3-none-any.whl", hash = "sha256:77d078d810656b3e90152a065047c6203140e0998e8cbdf9d2dbb6e9f477840e"}, {file = "ni_datamonikers_v1_proto-1.0.0.tar.gz", hash = "sha256:2e4cf30f9dee343af4a5f328fb785320d2eb30705abc15f0695057177afd5f00"}, @@ -755,32 +755,30 @@ protobuf = ">=4.21" [[package]] name = "ni-datastore" -version = "2.0.0.dev1" +version = "2.0.0.dev0" description = "APIs for publishing and retrieving data from NI Measurement Data Services" optional = false -python-versions = "^3.10" -groups = ["main", "dev"] -files = [] -develop = true +python-versions = "<4.0,>=3.10" +groups = ["main"] +files = [ + {file = "ni_datastore-2.0.0.dev0-py3-none-any.whl", hash = "sha256:b9746d323d5532786fdbc1aa40ab5d22989ca2838117a1114607d04efaa4d391"}, + {file = "ni_datastore-2.0.0.dev0.tar.gz", hash = "sha256:9dd519897e406206b609477649e2ec01bd16d4ead70590e8c2de62289f6b49c8"}, +] [package.dependencies] hightime = ">=1.0.0" -ni-measurements-data-v1-client = ">=1.1.0dev1" +ni-measurements-data-v1-client = ">=1.1.0dev0" ni-measurements-metadata-v1-client = ">=1.0.0" -ni-protobuf-types = ">=1.2.0dev1" +ni-protobuf-types = ">=1.1.0" protobuf = ">=4.21" -[package.source] -type = "directory" -url = "../.." - [[package]] name = "ni-grpc-extensions" version = "1.1.0" description = "gRPC Extensions" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "ni_grpc_extensions-1.1.0-py3-none-any.whl", hash = "sha256:db0357acd244854f4acccf202c89fe6462b4283d264ed639f4e248e6cc86bc9b"}, {file = "ni_grpc_extensions-1.1.0.tar.gz", hash = "sha256:028ea33e5c5234bc050bf5dc99f5b61611531de8f012293e9d4c6985b7b37afb"}, @@ -796,7 +794,7 @@ version = "1.1.0" description = "gRPC Client for NI Discovery Service" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "ni_measurementlink_discovery_v1_client-1.1.0-py3-none-any.whl", hash = "sha256:366dcc3b93627ed1ede488955637e0768b29cb7a375e59ac1020f4c53892d00c"}, {file = "ni_measurementlink_discovery_v1_client-1.1.0.tar.gz", hash = "sha256:831b6145cf8def0021cb00579b08a2ad1da5a19fdeedea4522a3cb4a30978c48"}, @@ -814,7 +812,7 @@ version = "1.1.0" description = "Protobuf data types for NI discovery gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "ni_measurementlink_discovery_v1_proto-1.1.0-py3-none-any.whl", hash = "sha256:6a3061ca858d3ee887987dc5130074fc439ce6c2b26fe6b3f9401da023461d43"}, {file = "ni_measurementlink_discovery_v1_proto-1.1.0.tar.gz", hash = "sha256:f9a9b4572ac5d169fad21ab56e2639abdb77979cf0dc3a88cdb71b2c783d009c"}, @@ -825,36 +823,36 @@ protobuf = ">=4.21" [[package]] name = "ni-measurements-data-v1-client" -version = "1.1.0" +version = "1.1.0.dev0" description = "gRPC Client for NI Data Store Service" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ - {file = "ni_measurements_data_v1_client-1.1.0-py3-none-any.whl", hash = "sha256:dfc38d56fdd710a930fbc05383d43ab96f64aee545937f9ef605a3bb6f88cc31"}, - {file = "ni_measurements_data_v1_client-1.1.0.tar.gz", hash = "sha256:16b1ac8b82277e41719aa8b1aeae3f1040dba47e63651f83e30fe115cd036278"}, + {file = "ni_measurements_data_v1_client-1.1.0.dev0-py3-none-any.whl", hash = "sha256:d41f93ff1584461ef45dd4ea25c3ceaf763da53c0a2cc5e48c64f675e4ba3c00"}, + {file = "ni_measurements_data_v1_client-1.1.0.dev0.tar.gz", hash = "sha256:3043ef784d6dec4f476f3065e781ce8a1f2db38900c3a0ef5d90d6c08a9fa466"}, ] [package.dependencies] ni-measurementlink-discovery-v1-client = ">=1.1.0" -ni-measurements-data-v1-proto = ">=1.1.0" +ni-measurements-data-v1-proto = ">=1.1.0.dev0" [[package]] name = "ni-measurements-data-v1-proto" -version = "1.1.0" +version = "1.1.0.dev0" description = "Protobuf data types and service stubs for NI data store gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ - {file = "ni_measurements_data_v1_proto-1.1.0-py3-none-any.whl", hash = "sha256:06096cea733717b60281c92d0a1b44eac97194781507ba4fd9b3aa080a4450df"}, - {file = "ni_measurements_data_v1_proto-1.1.0.tar.gz", hash = "sha256:df1ca7ce3603dd5a0adc8795f0844da9a78ddc026f219bf596957cf3ed08da3d"}, + {file = "ni_measurements_data_v1_proto-1.1.0.dev0-py3-none-any.whl", hash = "sha256:c1e5ad669ab978c7202f58fac7eda2e19be2a6fcc4b07bc13f1904a5aad43809"}, + {file = "ni_measurements_data_v1_proto-1.1.0.dev0.tar.gz", hash = "sha256:99102d9e785031ce0797efa435fce975e9a0de8547b76079aaa7e35c871e7da4"}, ] [package.dependencies] ni-datamonikers-v1-proto = ">=1.0.0" ni-measurements-metadata-v1-proto = ">=1.0.0" -ni-protobuf-types = ">=1.2.0" +ni-protobuf-types = ">=1.1.0" protobuf = ">=4.21" [[package]] @@ -863,7 +861,7 @@ version = "1.0.0" description = "gRPC Client for NI Metadata Store Service" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "ni_measurements_metadata_v1_client-1.0.0-py3-none-any.whl", hash = "sha256:c697ce4e98105b810f4da844a598e86e359ff6c90ca7a832e1e23a70327551a7"}, {file = "ni_measurements_metadata_v1_client-1.0.0.tar.gz", hash = "sha256:9f9a10810c4c6693239081abbc026414a18df3e3d04daa3cd59010b1eed07f51"}, @@ -879,7 +877,7 @@ version = "1.0.0" description = "Protobuf data types and service stub for NI metadata store gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "ni_measurements_metadata_v1_proto-1.0.0-py3-none-any.whl", hash = "sha256:8844806d6775ac65144100fcd03099aea0c17ed55de696683d0663166f45cee3"}, {file = "ni_measurements_metadata_v1_proto-1.0.0.tar.gz", hash = "sha256:3283cf7f0c452812a311b2b9274b5ba1e549f994f6a978a125f1746b85746e6f"}, @@ -890,18 +888,18 @@ protobuf = ">=4.21" [[package]] name = "ni-protobuf-types" -version = "1.2.0" +version = "1.1.0" description = "Protobuf data types for NI gRPC APIs" optional = false python-versions = "<4.0,>=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ - {file = "ni_protobuf_types-1.2.0-py3-none-any.whl", hash = "sha256:461c4825571d0054fd5427664403c3d69fcd180c9c00868ac1911693dd9bf901"}, - {file = "ni_protobuf_types-1.2.0.tar.gz", hash = "sha256:e8226f8ef44b104ffb1b1f6e416511c416be4d91bf5c2633db7ab58294e037bb"}, + {file = "ni_protobuf_types-1.1.0-py3-none-any.whl", hash = "sha256:0c21c096cf8577483dade081c571305fe8d4cc759ce2c780e7437129a375942c"}, + {file = "ni_protobuf_types-1.1.0.tar.gz", hash = "sha256:98f0583405e219f6e128133c2f6c033f03cd83ebd3ce8098ad74ab99b8a253c1"}, ] [package.dependencies] -nitypes = ">=1.1.0" +nitypes = ">=1.1.0dev1" protobuf = ">=4.21" [[package]] @@ -920,8 +918,8 @@ files = [ black = ">=23.1" click = ">=7.1.2" flake8 = [ - {version = ">=6.1,<7.0", markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, {version = ">=5.0,<6.0", markers = "python_version >= \"3.7\" and python_version < \"3.12\""}, + {version = ">=6.1,<7.0", markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, ] flake8-black = ">=0.2.1" flake8-docstrings = ">=1.5.0" @@ -930,28 +928,28 @@ isort = ">=5.10" pathspec = ">=0.11.1" pep8-naming = ">=0.11.1" pycodestyle = [ - {version = ">=2.11,<3.0", markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, {version = ">=2.9,<3.0", markers = "python_version >= \"3.7\" and python_version < \"3.12\""}, + {version = ">=2.11,<3.0", markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, ] toml = ">=0.10.1" [[package]] name = "nitypes" -version = "1.1.0" +version = "1.1.0.dev1" description = "Data types for NI Python APIs" optional = false python-versions = "<4.0,>=3.9" -groups = ["main", "dev"] +groups = ["main"] files = [ - {file = "nitypes-1.1.0-py3-none-any.whl", hash = "sha256:b43ac7027e1cceeca7ceffa58f31ffadd03feeb1788ca5cb8f9d105e73893b14"}, - {file = "nitypes-1.1.0.tar.gz", hash = "sha256:f273b5131ef0d5b848c37a0a63452626caf5c2938f7744c324f7991b76fa0b60"}, + {file = "nitypes-1.1.0.dev1-py3-none-any.whl", hash = "sha256:d98ad6e3f8b92db76b5c1c584431fa27d3e74cce6e20464e43ee0117b02fe089"}, + {file = "nitypes-1.1.0.dev1.tar.gz", hash = "sha256:50b23e00cc6960996656c4c9ef0ca71dd267fc5c9ca481077b682c29190aa2d3"}, ] [package.dependencies] hightime = ">=0.2.2" numpy = [ - {version = ">=2.1", markers = "python_version >= \"3.13\" and python_version < \"4.0\""}, {version = ">=1.22", markers = "python_version >= \"3.9\" and python_version < \"3.13\""}, + {version = ">=2.1", markers = "python_version >= \"3.13\" and python_version < \"4.0\""}, ] typing-extensions = ">=4.13.2" @@ -961,7 +959,7 @@ version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] +groups = ["main"] markers = "python_version < \"3.12\"" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, @@ -1027,7 +1025,7 @@ version = "2.3.5" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" -groups = ["main", "dev"] +groups = ["main"] markers = "python_version >= \"3.12\"" files = [ {file = "numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10"}, @@ -1168,7 +1166,7 @@ version = "4.25.8" description = "" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main"] markers = "python_version <= \"3.12\"" files = [ {file = "protobuf-4.25.8-cp310-abi3-win32.whl", hash = "sha256:504435d831565f7cfac9f0714440028907f1975e4bed228e58e72ecfff58a1e0"}, @@ -1190,7 +1188,7 @@ version = "5.29.5" description = "" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main"] markers = "python_version == \"3.13\"" files = [ {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, @@ -1212,7 +1210,7 @@ version = "6.33.1" description = "" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main"] markers = "python_version >= \"3.14\"" files = [ {file = "protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b"}, @@ -1318,7 +1316,7 @@ version = "311" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["main", "dev"] +groups = ["main"] markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, @@ -1447,7 +1445,7 @@ version = "1.0.1" description = "Generates Event Tracing for Windows events using TraceLogging" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] +groups = ["main"] markers = "sys_platform == \"win32\"" files = [ {file = "traceloggingdynamic-1.0.1-py3-none-any.whl", hash = "sha256:0e19da491a8960725b3622366487ae35f49d8f595bb2e4e5ce1795eb5928db7c"}, @@ -1484,7 +1482,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "dev", "lint"] +groups = ["main", "lint"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -1493,4 +1491,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "1c9c1a4d1b906aed1b8c65ce4a1419ee8d6da769515fba4b83d02c7777b8f93c" +content-hash = "e83ffbce072edf9ce9fd71b57b75d0c073dafd002bd41de1cbef3a7d04b7efba" \ No newline at end of file diff --git a/examples/overview/pyproject.toml b/examples/overview/pyproject.toml index 06e952c..627f52b 100644 --- a/examples/overview/pyproject.toml +++ b/examples/overview/pyproject.toml @@ -55,7 +55,7 @@ grpcio-tools = [ types-grpcio = ">=1.0" types-protobuf = ">=4.21" # Uncomment to use local ni-datastore code -ni-datastore = {path = "../..", develop = true} +# ni-datastore = {path = "../..", develop = true} datastore-utilities = { path = "../../utilities", develop = true } [tool.poetry.group.lint.dependencies] @@ -75,4 +75,4 @@ files = "." namespace_packages = true strict = true explicit_package_bases = true -exclude = ["docs"] +exclude = ["docs"] \ No newline at end of file From fa366c708f71cfee5f44e61d436bd181fcb448e0 Mon Sep 17 00:00:00 2001 From: Michael Johansen Date: Thu, 18 Jun 2026 14:40:59 -0500 Subject: [PATCH 4/4] Perform an actual restore rather than manual revert. Signed-off-by: Michael Johansen --- examples/overview/poetry.lock | 2 +- examples/overview/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/overview/poetry.lock b/examples/overview/poetry.lock index 0a58d76..ed2d3d1 100644 --- a/examples/overview/poetry.lock +++ b/examples/overview/poetry.lock @@ -1491,4 +1491,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "e83ffbce072edf9ce9fd71b57b75d0c073dafd002bd41de1cbef3a7d04b7efba" \ No newline at end of file +content-hash = "e83ffbce072edf9ce9fd71b57b75d0c073dafd002bd41de1cbef3a7d04b7efba" diff --git a/examples/overview/pyproject.toml b/examples/overview/pyproject.toml index 627f52b..8da7ce0 100644 --- a/examples/overview/pyproject.toml +++ b/examples/overview/pyproject.toml @@ -75,4 +75,4 @@ files = "." namespace_packages = true strict = true explicit_package_bases = true -exclude = ["docs"] \ No newline at end of file +exclude = ["docs"]