Skip to content

Commit f106e0d

Browse files
Mike ProsserMike Prosser
authored andcommitted
Merge remote-tracking branch 'origin/main' into users/mprosser/bug-234-on-key-change-pickling
2 parents 11c8183 + 3991b93 commit f106e0d

File tree

11 files changed

+233
-2
lines changed

11 files changed

+233
-2
lines changed

tests/unit/bintime/test_datetime.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,27 @@ def test___time_value___pickle___references_public_modules() -> None:
447447
assert b"nitypes.bintime._time_value" not in value_bytes
448448

449449

450+
@pytest.mark.parametrize(
451+
"pickled_value, expected",
452+
[
453+
# nitypes 1.0.0
454+
(
455+
b"\x80\x04\x95W\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\x08DateTime\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\tN\xca\xb9\xf4\xe9\xd3\x9a\x1f\xff\x85\x94R\x94.",
456+
DateTime(1903, 12, 31, 23, 59, 59, 123_456, 234_567_789, 345_567_890, dt.timezone.utc),
457+
),
458+
(
459+
b"\x80\x04\x95[\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\x08DateTime\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x92\xb4\x00\x85\x94R\x94.",
460+
DateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, dt.timezone.utc),
461+
),
462+
],
463+
)
464+
def test___pickled_value___unpickle___is_compatible(
465+
pickled_value: bytes, expected: DateTime
466+
) -> None:
467+
new_value = pickle.loads(pickled_value)
468+
assert new_value == expected
469+
470+
450471
@pytest.mark.parametrize(
451472
"value, expected",
452473
[

tests/unit/bintime/test_datetime_array.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,29 @@ def test___datetime_array___pickle___references_public_modules() -> None:
13221322
assert b"nitypes.bintime._datetime_array" not in pickled
13231323

13241324

1325+
@pytest.mark.parametrize(
1326+
"pickled_value, expected",
1327+
[
1328+
# nitypes 1.0.0
1329+
(
1330+
b"\x80\x04\x95\xb1\x00\x00\x00\x00\x00\x00\x00\x8c\x0fnitypes.bintime\x94\x8c\rDateTimeArray\x94\x93\x94]\x94(\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94h\x00\x8c\x08DateTime\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x92\xb4\x00\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x00N\xc4\xa1\x00\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x006\x9a\xe3\x00\x85\x94R\x94e\x85\x94R\x94.",
1331+
DateTimeArray(
1332+
[
1333+
DateTime(2000, 1, 1, tzinfo=dt.timezone.utc),
1334+
DateTime(1990, 1, 1, tzinfo=dt.timezone.utc),
1335+
DateTime(2025, 1, 1, tzinfo=dt.timezone.utc),
1336+
]
1337+
),
1338+
),
1339+
],
1340+
)
1341+
def test___pickled_value___unpickle___is_compatible(
1342+
pickled_value: bytes, expected: DateTimeArray
1343+
) -> None:
1344+
new_value = pickle.loads(pickled_value)
1345+
assert new_value == expected
1346+
1347+
13251348
@pytest.mark.parametrize(
13261349
"value",
13271350
(

tests/unit/bintime/test_timedelta.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,6 +1200,27 @@ def test___timedelta___pickle___references_public_modules() -> None:
12001200
assert b"nitypes.bintime._timedelta" not in value_bytes
12011201

12021202

1203+
@pytest.mark.parametrize(
1204+
"pickled_value, expected",
1205+
[
1206+
# nitypes 1.0.0
1207+
(
1208+
b"\x80\x04\x95_\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\tTimeDelta\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\x10\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x10\x85\x94R\x94.",
1209+
TimeDelta.from_ticks((1 << 124) + (2 << 64) + 3),
1210+
),
1211+
(
1212+
b"\x80\x04\x95_\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\tTimeDelta\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\x10\xfd\xff\xff\xff\xff\xff\xff\xff\xfd\xff\xff\xff\xff\xff\xff\xef\x85\x94R\x94.",
1213+
TimeDelta.from_ticks((-1 << 124) + (-2 << 64) + -3),
1214+
),
1215+
],
1216+
)
1217+
def test___pickled_value___unpickle___is_compatible(
1218+
pickled_value: bytes, expected: TimeDelta
1219+
) -> None:
1220+
new_value = pickle.loads(pickled_value)
1221+
assert new_value == expected
1222+
1223+
12031224
@pytest.mark.parametrize(
12041225
"value, expected",
12051226
[

tests/unit/bintime/test_timedelta_array.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
import pytest
99
from typing_extensions import assert_type
1010

11-
from nitypes.bintime import TimeDelta
12-
from nitypes.bintime import TimeDeltaArray
11+
from nitypes.bintime import TimeDelta, TimeDeltaArray
1312

1413

1514
###############################################################################
@@ -920,6 +919,23 @@ def test___timedelta_array___pickle___references_public_modules() -> None:
920919
assert b"nitypes.bintime._timedelta_array" not in pickled
921920

922921

922+
@pytest.mark.parametrize(
923+
"pickled_value, expected",
924+
[
925+
# nitypes 1.0.0
926+
(
927+
b"\x80\x04\x95\xa8\x00\x00\x00\x00\x00\x00\x00\x8c\x0fnitypes.bintime\x94\x8c\x0eTimeDeltaArray\x94\x93\x94]\x94(\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94h\x00\x8c\tTimeDelta\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\t\x00\x00\xc3\xf5(\\\x8fB\x14\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\t\x00\x00\x00\x00\x00\x00\x00\x00\xff\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\n\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x85\x94R\x94e\x85\x94R\x94.",
928+
TimeDeltaArray([TimeDelta(20.26), TimeDelta(-1), TimeDelta(500)]),
929+
),
930+
],
931+
)
932+
def test___pickled_value___unpickle___is_compatible(
933+
pickled_value: bytes, expected: TimeDeltaArray
934+
) -> None:
935+
new_value = pickle.loads(pickled_value)
936+
assert new_value == expected
937+
938+
923939
@pytest.mark.parametrize(
924940
"value",
925941
(

tests/unit/scalar/test_scalar.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,20 @@ def test___scalar___pickle___references_public_modules() -> None:
302302

303303
assert b"nitypes.scalar" in value_bytes
304304
assert b"nitypes.scalar._scalar" not in value_bytes
305+
306+
307+
@pytest.mark.parametrize(
308+
"pickled_value, expected",
309+
[
310+
# nitypes 1.0.0
311+
(
312+
b"\x80\x04\x952\x00\x00\x00\x00\x00\x00\x00\x8c\x0enitypes.scalar\x94\x8c\x06Scalar\x94\x93\x94G@4\x00\x00\x00\x00\x00\x00\x8c\x05watts\x94\x86\x94R\x94.",
313+
Scalar(20.0, "watts"),
314+
),
315+
],
316+
)
317+
def test___pickled_value___unpickle___is_compatible(
318+
pickled_value: bytes, expected: Scalar[Any]
319+
) -> None:
320+
new_value = pickle.loads(pickled_value)
321+
assert new_value == expected

tests/unit/vector/test_vector.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,20 @@ def test___vector___pickle___references_public_modules() -> None:
417417

418418
assert b"nitypes.vector" in value_bytes
419419
assert b"nitypes.vector._vector" not in value_bytes
420+
421+
422+
@pytest.mark.parametrize(
423+
"pickled_value, expected",
424+
[
425+
# nitypes 1.0.0
426+
(
427+
b"\x80\x04\x95?\x00\x00\x00\x00\x00\x00\x00\x8c\x0enitypes.vector\x94\x8c\x06Vector\x94\x93\x94]\x94(G@4\x00\x00\x00\x00\x00\x00G@4\x19\x99\x99\x99\x99\x9ae\x8c\x05watts\x94\x86\x94R\x94.",
428+
Vector([20.0, 20.1], "watts"),
429+
),
430+
],
431+
)
432+
def test___pickled_value___unpickle___is_compatible(
433+
pickled_value: bytes, expected: Vector[Any]
434+
) -> None:
435+
new_value = pickle.loads(pickled_value)
436+
assert new_value == expected

tests/unit/waveform/test_analog_waveform.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,3 +2003,25 @@ def test___waveform___pickle___references_public_modules() -> None:
20032003
assert b"nitypes.waveform._numeric" not in value_bytes
20042004
assert b"nitypes.waveform._timing" not in value_bytes
20052005
assert b"nitypes.waveform._scaling" not in value_bytes
2006+
2007+
2008+
@pytest.mark.parametrize(
2009+
"pickled_value, expected",
2010+
[
2011+
# nitypes 1.0.0
2012+
(
2013+
b"\x80\x04\x95n\x02\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x10nitypes.waveform\x94\x8c\x0eAnalogWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02f8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x86\x94}\x94(\x8c\x08raw_data\x94\x8c\x16numpy._core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94h\t\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03\x85\x94h\x0e\x89C\x18\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@\x94t\x94b\x8c\x13extended_properties\x94h\x03\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94us\x86\x94b\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x02h\x03\x8c\x06Timing\x94\x93\x94h\x06\x86\x94R\x94(h\x03\x8c\x12SampleIntervalMode\x94\x93\x94K\x01\x85\x94R\x94NN\x8c\x08datetime\x94\x8c\ttimedelta\x94\x93\x94K\x00K\x00M\xe8\x03\x87\x94R\x94Nt\x94}\x94\x86\x94R\x94\x8c\nscale_mode\x94h\x03\x8c\x0fLinearScaleMode\x94\x93\x94)\x81\x94N}\x94(\x8c\x05_gain\x94G@\x00\x00\x00\x00\x00\x00\x00\x8c\x07_offset\x94G?\xf0\x00\x00\x00\x00\x00\x00u\x86\x94bu\x86\x94R\x94.",
2014+
AnalogWaveform(
2015+
raw_data=np.array([1, 2, 3], np.float64),
2016+
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
2017+
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
2018+
scale_mode=LinearScaleMode(2.0, 1.0),
2019+
),
2020+
),
2021+
],
2022+
)
2023+
def test___pickled_value___unpickle___is_compatible(
2024+
pickled_value: bytes, expected: AnalogWaveform[Any]
2025+
) -> None:
2026+
new_value = pickle.loads(pickled_value)
2027+
assert new_value == expected

tests/unit/waveform/test_complex_waveform.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,3 +649,25 @@ def test___waveform___pickle___references_public_modules() -> None:
649649
assert b"nitypes.waveform._numeric" not in value_bytes
650650
assert b"nitypes.waveform._timing" not in value_bytes
651651
assert b"nitypes.waveform._scaling" not in value_bytes
652+
653+
654+
@pytest.mark.parametrize(
655+
"pickled_value, expected",
656+
[
657+
# nitypes 1.0.0
658+
(
659+
b"\x80\x04\x95\x88\x02\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x10nitypes.waveform\x94\x8c\x0fComplexWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x03c16\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x86\x94}\x94(\x8c\x08raw_data\x94\x8c\x16numpy._core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94h\t\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03\x85\x94h\x0e\x89C0\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x00\x00\x94t\x94b\x8c\x13extended_properties\x94h\x03\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94us\x86\x94b\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x02h\x03\x8c\x06Timing\x94\x93\x94h\x06\x86\x94R\x94(h\x03\x8c\x12SampleIntervalMode\x94\x93\x94K\x01\x85\x94R\x94NN\x8c\x08datetime\x94\x8c\ttimedelta\x94\x93\x94K\x00K\x00M\xe8\x03\x87\x94R\x94Nt\x94}\x94\x86\x94R\x94\x8c\nscale_mode\x94h\x03\x8c\x0fLinearScaleMode\x94\x93\x94)\x81\x94N}\x94(\x8c\x05_gain\x94G@\x00\x00\x00\x00\x00\x00\x00\x8c\x07_offset\x94G?\xf0\x00\x00\x00\x00\x00\x00u\x86\x94bu\x86\x94R\x94.",
660+
ComplexWaveform(
661+
raw_data=np.array([1, 2, 3], np.complex128),
662+
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
663+
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
664+
scale_mode=LinearScaleMode(2.0, 1.0),
665+
),
666+
),
667+
],
668+
)
669+
def test___pickled_value___unpickle___is_compatible(
670+
pickled_value: bytes, expected: ComplexWaveform[Any]
671+
) -> None:
672+
new_value = pickle.loads(pickled_value)
673+
assert new_value == expected
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from __future__ import annotations
2+
3+
import pickle
4+
5+
import pytest
6+
7+
from nitypes.waveform import ExtendedPropertyDictionary
8+
9+
10+
@pytest.mark.parametrize(
11+
"pickled_value, expected",
12+
[
13+
# nitypes 1.0.0
14+
(
15+
b"\x80\x04\x95\x88\x00\x00\x00\x00\x00\x00\x00\x8c\x10nitypes.waveform\x94\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94us\x86\x94b.",
16+
ExtendedPropertyDictionary(
17+
{"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"}
18+
),
19+
),
20+
# nitypes 1.0.1
21+
(
22+
b"\x80\x04\x95t\x00\x00\x00\x00\x00\x00\x00\x8c\x10nitypes.waveform\x94\x8c\x1aExtendedPropertyDictionary\x94\x93\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94u\x85\x94R\x94.",
23+
ExtendedPropertyDictionary(
24+
{"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"}
25+
),
26+
),
27+
],
28+
)
29+
def test___pickled_value___unpickle___is_compatible(
30+
pickled_value: bytes, expected: ExtendedPropertyDictionary
31+
) -> None:
32+
new_value = pickle.loads(pickled_value)
33+
assert new_value == expected

tests/unit/waveform/test_spectrum.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,3 +1343,25 @@ def test___spectrum___pickle___references_public_modules() -> None:
13431343
assert b"nitypes.waveform" in value_bytes
13441344
assert b"nitypes.waveform._extended_properties" not in value_bytes
13451345
assert b"nitypes.waveform._spectrum" not in value_bytes
1346+
1347+
1348+
@pytest.mark.parametrize(
1349+
"pickled_value, expected",
1350+
[
1351+
# nitypes 1.0.0
1352+
(
1353+
b"\x80\x04\x95\xdf\x01\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x10nitypes.waveform\x94\x8c\x08Spectrum\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02f8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x86\x94}\x94(\x8c\x04data\x94\x8c\x16numpy._core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94h\t\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03\x85\x94h\x0e\x89C\x18\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@\x94t\x94b\x8c\x0fstart_frequency\x94G@^\xdd/\x1a\x9f\xbew\x8c\x13frequency_increment\x94G?\xb9\x99\x99\x99\x99\x99\x9a\x8c\x13extended_properties\x94h\x03\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94us\x86\x94b\x8c\x18copy_extended_properties\x94\x89u\x86\x94R\x94.",
1354+
Spectrum(
1355+
data=np.array([1, 2, 3], np.float64),
1356+
start_frequency=123.456,
1357+
frequency_increment=0.1,
1358+
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
1359+
),
1360+
),
1361+
],
1362+
)
1363+
def test___pickled_value___unpickle___is_compatible(
1364+
pickled_value: bytes, expected: Spectrum[Any]
1365+
) -> None:
1366+
new_value = pickle.loads(pickled_value)
1367+
assert new_value == expected

0 commit comments

Comments
 (0)