From 692c035ebde20ed99429a97faeb32c01eeed1d80 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Tue, 25 Feb 2020 10:06:56 -0600 Subject: [PATCH 01/16] Move repeated capabilities to _SessionBase() --- build/templates/session.py.mako | 10 +++++----- generated/nidcpower/nidcpower/session.py | 6 +++--- generated/nidigital/nidigital/session.py | 14 +++++++------- generated/nidmm/nidmm/session.py | 4 ++-- generated/nifake/nifake/session.py | 6 +++--- generated/nifgen/nifgen/session.py | 10 +++++----- generated/niscope/niscope/session.py | 6 +++--- generated/nise/nise/session.py | 4 ++-- generated/niswitch/niswitch/session.py | 6 +++--- 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/build/templates/session.py.mako b/build/templates/session.py.mako index 2c0433319..918a12192 100644 --- a/build/templates/session.py.mako +++ b/build/templates/session.py.mako @@ -196,6 +196,11 @@ constructor_params = helper.filter_parameters(init_function, helper.ParameterUsa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects +% for rep_cap in config['repeated_capabilities']: + self.${rep_cap['python_name']} = _RepeatedCapabilities(self, '${rep_cap["prefix"]}') +% endfor + self._is_frozen = freeze_it def __repr__(self): @@ -260,11 +265,6 @@ class Session(_SessionBase): self._${config['session_handle_parameter_name']} = 0 # This must be set before calling ${init_function['python_name']}(). self._${config['session_handle_parameter_name']} = self.${init_function['python_name']}(${init_call_params}) - # Instantiate any repeated capability objects -% for rep_cap in config['repeated_capabilities']: - self.${rep_cap['python_name']} = _RepeatedCapabilities(self, '${rep_cap["prefix"]}') -% endfor - % if config['supports_nitclk']: self.tclk = nitclk.SessionReference(self._${config['session_handle_parameter_name']}) diff --git a/generated/nidcpower/nidcpower/session.py b/generated/nidcpower/nidcpower/session.py index 0b5d4d17e..12f740482 100644 --- a/generated/nidcpower/nidcpower/session.py +++ b/generated/nidcpower/nidcpower/session.py @@ -2689,6 +2689,9 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self.channels = _RepeatedCapabilities(self, '') + self._is_frozen = freeze_it def __repr__(self): @@ -4164,9 +4167,6 @@ def __init__(self, resource_name, channels=None, reset=False, options={}): self._vi = 0 # This must be set before calling _initialize_with_channels(). self._vi = self._initialize_with_channels(resource_name, channels, reset, options) - # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - # Store the parameter list for later printing in __repr__ param_list = [] param_list.append("resource_name=" + pp.pformat(resource_name)) diff --git a/generated/nidigital/nidigital/session.py b/generated/nidigital/nidigital/session.py index b1db46e18..88c69f00f 100644 --- a/generated/nidigital/nidigital/session.py +++ b/generated/nidigital/nidigital/session.py @@ -606,6 +606,13 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self.channels = _RepeatedCapabilities(self, '') + self.pins = _RepeatedCapabilities(self, '') + self.devices = _RepeatedCapabilities(self, '') + self.pattern_opcode_events = _RepeatedCapabilities(self, 'patternOpcodeEvent') + self.conditional_jump_triggers = _RepeatedCapabilities(self, 'conditionalJumpTrigger') + self._is_frozen = freeze_it def __repr__(self): @@ -1632,13 +1639,6 @@ def __init__(self, resource_name, id_query=False, reset_device=False, options={} self._vi = 0 # This must be set before calling _init_with_options(). self._vi = self._init_with_options(resource_name, id_query, reset_device, options) - # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - self.pins = _RepeatedCapabilities(self, '') - self.devices = _RepeatedCapabilities(self, '') - self.pattern_opcode_events = _RepeatedCapabilities(self, 'patternOpcodeEvent') - self.conditional_jump_triggers = _RepeatedCapabilities(self, 'conditionalJumpTrigger') - self.tclk = nitclk.SessionReference(self._vi) # Store the parameter list for later printing in __repr__ diff --git a/generated/nidmm/nidmm/session.py b/generated/nidmm/nidmm/session.py index e406afd35..05419edc7 100644 --- a/generated/nidmm/nidmm/session.py +++ b/generated/nidmm/nidmm/session.py @@ -530,6 +530,8 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self._is_frozen = freeze_it def __repr__(self): @@ -1169,8 +1171,6 @@ def __init__(self, resource_name, id_query=False, reset_device=False, options={} self._vi = 0 # This must be set before calling _init_with_options(). self._vi = self._init_with_options(resource_name, id_query, reset_device, options) - # Instantiate any repeated capability objects - # Store the parameter list for later printing in __repr__ param_list = [] param_list.append("resource_name=" + pp.pformat(resource_name)) diff --git a/generated/nifake/nifake/session.py b/generated/nifake/nifake/session.py index 7cfde8305..51dec8203 100644 --- a/generated/nifake/nifake/session.py +++ b/generated/nifake/nifake/session.py @@ -195,6 +195,9 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self.channels = _RepeatedCapabilities(self, '') + self._is_frozen = freeze_it def __repr__(self): @@ -726,9 +729,6 @@ def __init__(self, resource_name, options={}, id_query=False, reset_device=False self._vi = 0 # This must be set before calling _init_with_options(). self._vi = self._init_with_options(resource_name, options, id_query, reset_device) - # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - self.tclk = nitclk.SessionReference(self._vi) # Store the parameter list for later printing in __repr__ diff --git a/generated/nifgen/nifgen/session.py b/generated/nifgen/nifgen/session.py index 7c99d6579..1e6898582 100644 --- a/generated/nifgen/nifgen/session.py +++ b/generated/nifgen/nifgen/session.py @@ -948,6 +948,11 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self.channels = _RepeatedCapabilities(self, '') + self.script_triggers = _RepeatedCapabilities(self, 'ScriptTrigger') + self.markers = _RepeatedCapabilities(self, 'Marker') + self._is_frozen = freeze_it def __repr__(self): @@ -3135,11 +3140,6 @@ def __init__(self, resource_name, channel_name=None, reset_device=False, options self._vi = 0 # This must be set before calling _initialize_with_channels(). self._vi = self._initialize_with_channels(resource_name, channel_name, reset_device, options) - # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - self.script_triggers = _RepeatedCapabilities(self, 'ScriptTrigger') - self.markers = _RepeatedCapabilities(self, 'Marker') - self.tclk = nitclk.SessionReference(self._vi) # Store the parameter list for later printing in __repr__ diff --git a/generated/niscope/niscope/session.py b/generated/niscope/niscope/session.py index c5d2f79d8..29c584bcc 100644 --- a/generated/niscope/niscope/session.py +++ b/generated/niscope/niscope/session.py @@ -1663,6 +1663,9 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self.channels = _RepeatedCapabilities(self, '') + self._is_frozen = freeze_it def __repr__(self): @@ -4109,9 +4112,6 @@ def __init__(self, resource_name, id_query=False, reset_device=False, options={} self._vi = 0 # This must be set before calling _init_with_options(). self._vi = self._init_with_options(resource_name, id_query, reset_device, options) - # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - self.tclk = nitclk.SessionReference(self._vi) # Store the parameter list for later printing in __repr__ diff --git a/generated/nise/nise/session.py b/generated/nise/nise/session.py index d6963a458..ed6e97670 100644 --- a/generated/nise/nise/session.py +++ b/generated/nise/nise/session.py @@ -70,6 +70,8 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self._is_frozen = freeze_it def __repr__(self): @@ -237,8 +239,6 @@ def __init__(self, virtual_device_name, options={}): self._vi = 0 # This must be set before calling _open_session(). self._vi = self._open_session(virtual_device_name, options) - # Instantiate any repeated capability objects - # Store the parameter list for later printing in __repr__ param_list = [] param_list.append("virtual_device_name=" + pp.pformat(virtual_device_name)) diff --git a/generated/niswitch/niswitch/session.py b/generated/niswitch/niswitch/session.py index 771fc65df..b0baa1bdc 100644 --- a/generated/niswitch/niswitch/session.py +++ b/generated/niswitch/niswitch/session.py @@ -555,6 +555,9 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) + # Instantiate any repeated capability objects + self.channels = _RepeatedCapabilities(self, '') + self._is_frozen = freeze_it def __repr__(self): @@ -1487,9 +1490,6 @@ def __init__(self, resource_name, topology="Configured Topology", simulate=False self._vi = 0 # This must be set before calling _init_with_topology(). self._vi = self._init_with_topology(resource_name, topology, simulate, reset_device) - # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - # Store the parameter list for later printing in __repr__ param_list = [] param_list.append("resource_name=" + pp.pformat(resource_name)) From db9a6440502bd7a1eaedd6f9758b235469c943ce Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Tue, 25 Feb 2020 10:44:15 -0600 Subject: [PATCH 02/16] Add second rep cap --- src/nifake/metadata/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/nifake/metadata/config.py b/src/nifake/metadata/config.py index f9f200a73..4b58ee4d8 100644 --- a/src/nifake/metadata/config.py +++ b/src/nifake/metadata/config.py @@ -49,7 +49,11 @@ { 'prefix': '', 'python_name': 'channels' - } + }, + { + 'prefix': 'site', + 'python_name': 'sites', + }, ], 'session_class_description': 'An NI-FAKE session to a fake MI driver whose sole purpose is to test nimi-python code generation', 'session_handle_parameter_name': 'vi', From 8223379f7b402b7b96e2044b3ffbae9e9ff0f907 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Tue, 25 Feb 2020 10:44:25 -0600 Subject: [PATCH 03/16] Test nested rep caps --- src/nifake/unit_tests/test_session.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/nifake/unit_tests/test_session.py b/src/nifake/unit_tests/test_session.py index cd44aaa0d..cb769f183 100644 --- a/src/nifake/unit_tests/test_session.py +++ b/src/nifake/unit_tests/test_session.py @@ -859,6 +859,22 @@ def test_repeated_capabilities_list(self): with nifake.Session('dev1') as session: assert session.channels['r0']._repeated_capability_list == ['r0'] + def test_nested_repeated_capabilities_list(self): + with nifake.Session('dev1') as session: + assert session.sites[0, 1].channels[2, 3]._repeated_capability_list == ['site0/2', 'site0/3', 'site1/2', 'site1/3'] + + def test_nested_repeated_capability_method_on_specific_channel(self): + test_maximum_time_ms = 10 # milliseconds + test_maximum_time_us = 10000 # microseconds + test_maximum_time = datetime.timedelta(milliseconds=test_maximum_time_ms) + test_reading = 5 + self.patched_library.niFake_ReadFromChannel.side_effect = self.side_effects_helper.niFake_ReadFromChannel + self.side_effects_helper['ReadFromChannel']['reading'] = test_reading + with nifake.Session('dev1') as session: + value = session.sites[0, 1].channels[2, 3].read_from_channel(test_maximum_time) + self.patched_library.niFake_ReadFromChannel.assert_called_once_with(_matchers.ViSessionMatcher(SESSION_NUM_FOR_TEST), _matchers.ViStringMatcher('site0/2,site0/3,site1/2,site1/3'), _matchers.ViInt32Matcher(test_maximum_time_us), _matchers.ViReal64PointerMatcher()) + assert value == test_reading + # Attributes def test_get_attribute_int32(self): From e421443352ba1bf72ab12ae722ff5882503e63de Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Tue, 25 Feb 2020 10:48:20 -0600 Subject: [PATCH 04/16] Pass in the current rep cap list so we can expand over the current list along with the new list --- build/templates/session.py.mako | 11 ++++++++--- generated/nidcpower/nidcpower/session.py | 11 ++++++++--- generated/nidigital/nidigital/session.py | 19 ++++++++++++------- generated/nifake/nifake/session.py | 12 +++++++++--- .../nifake/nifake/unit_tests/test_session.py | 16 ++++++++++++++++ generated/nifgen/nifgen/session.py | 15 ++++++++++----- generated/niscope/niscope/session.py | 11 ++++++++--- generated/niswitch/niswitch/session.py | 11 ++++++++--- 8 files changed, 79 insertions(+), 27 deletions(-) diff --git a/build/templates/session.py.mako b/build/templates/session.py.mako index 918a12192..aa8e597a6 100644 --- a/build/templates/session.py.mako +++ b/build/templates/session.py.mako @@ -123,15 +123,20 @@ class _Lock(object): % endif % if len(config['repeated_capabilities']) > 0: class _RepeatedCapabilities(object): - def __init__(self, session, prefix): + def __init__(self, session, prefix, current_repeated_capability_list): self._session = session self._prefix = prefix + # We need at least one element. If we get an empty list, make the one element an empty string + self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] + # Now we know there is at lease one entry, so we look if it is an empty string or not + self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) + complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] - return _SessionBase(${config['session_handle_parameter_name']}=self._session._${config['session_handle_parameter_name']}, repeated_capability_list=rep_caps_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) + return _SessionBase(${config['session_handle_parameter_name']}=self._session._${config['session_handle_parameter_name']}, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) # This is a very simple context manager we can use when we need to set/get attributes @@ -198,7 +203,7 @@ constructor_params = helper.filter_parameters(init_function, helper.ParameterUsa # Instantiate any repeated capability objects % for rep_cap in config['repeated_capabilities']: - self.${rep_cap['python_name']} = _RepeatedCapabilities(self, '${rep_cap["prefix"]}') + self.${rep_cap['python_name']} = _RepeatedCapabilities(self, '${rep_cap["prefix"]}', repeated_capability_list) % endfor self._is_frozen = freeze_it diff --git a/generated/nidcpower/nidcpower/session.py b/generated/nidcpower/nidcpower/session.py index 12f740482..e3e251301 100644 --- a/generated/nidcpower/nidcpower/session.py +++ b/generated/nidcpower/nidcpower/session.py @@ -87,15 +87,20 @@ def __exit__(self, exc_type, exc_value, traceback): class _RepeatedCapabilities(object): - def __init__(self, session, prefix): + def __init__(self, session, prefix, current_repeated_capability_list): self._session = session self._prefix = prefix + # We need at least one element. If we get an empty list, make the one element an empty string + self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] + # Now we know there is at lease one entry, so we look if it is an empty string or not + self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) + complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] - return _SessionBase(vi=self._session._vi, repeated_capability_list=rep_caps_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) + return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) # This is a very simple context manager we can use when we need to set/get attributes @@ -2690,7 +2695,7 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa self._param_list = ', '.join(param_list) # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') + self.channels = _RepeatedCapabilities(self, '', repeated_capability_list) self._is_frozen = freeze_it diff --git a/generated/nidigital/nidigital/session.py b/generated/nidigital/nidigital/session.py index 88c69f00f..967322767 100644 --- a/generated/nidigital/nidigital/session.py +++ b/generated/nidigital/nidigital/session.py @@ -88,15 +88,20 @@ def __exit__(self, exc_type, exc_value, traceback): class _RepeatedCapabilities(object): - def __init__(self, session, prefix): + def __init__(self, session, prefix, current_repeated_capability_list): self._session = session self._prefix = prefix + # We need at least one element. If we get an empty list, make the one element an empty string + self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] + # Now we know there is at lease one entry, so we look if it is an empty string or not + self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) + complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] - return _SessionBase(vi=self._session._vi, repeated_capability_list=rep_caps_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) + return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) # This is a very simple context manager we can use when we need to set/get attributes @@ -607,11 +612,11 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa self._param_list = ', '.join(param_list) # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - self.pins = _RepeatedCapabilities(self, '') - self.devices = _RepeatedCapabilities(self, '') - self.pattern_opcode_events = _RepeatedCapabilities(self, 'patternOpcodeEvent') - self.conditional_jump_triggers = _RepeatedCapabilities(self, 'conditionalJumpTrigger') + self.channels = _RepeatedCapabilities(self, '', repeated_capability_list) + self.pins = _RepeatedCapabilities(self, '', repeated_capability_list) + self.devices = _RepeatedCapabilities(self, '', repeated_capability_list) + self.pattern_opcode_events = _RepeatedCapabilities(self, 'patternOpcodeEvent', repeated_capability_list) + self.conditional_jump_triggers = _RepeatedCapabilities(self, 'conditionalJumpTrigger', repeated_capability_list) self._is_frozen = freeze_it diff --git a/generated/nifake/nifake/session.py b/generated/nifake/nifake/session.py index 51dec8203..a36f83904 100644 --- a/generated/nifake/nifake/session.py +++ b/generated/nifake/nifake/session.py @@ -90,15 +90,20 @@ def __exit__(self, exc_type, exc_value, traceback): class _RepeatedCapabilities(object): - def __init__(self, session, prefix): + def __init__(self, session, prefix, current_repeated_capability_list): self._session = session self._prefix = prefix + # We need at least one element. If we get an empty list, make the one element an empty string + self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] + # Now we know there is at lease one entry, so we look if it is an empty string or not + self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) + complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] - return _SessionBase(vi=self._session._vi, repeated_capability_list=rep_caps_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) + return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) # This is a very simple context manager we can use when we need to set/get attributes @@ -196,7 +201,8 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa self._param_list = ', '.join(param_list) # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') + self.channels = _RepeatedCapabilities(self, '', repeated_capability_list) + self.sites = _RepeatedCapabilities(self, 'site', repeated_capability_list) self._is_frozen = freeze_it diff --git a/generated/nifake/nifake/unit_tests/test_session.py b/generated/nifake/nifake/unit_tests/test_session.py index cd44aaa0d..cb769f183 100644 --- a/generated/nifake/nifake/unit_tests/test_session.py +++ b/generated/nifake/nifake/unit_tests/test_session.py @@ -859,6 +859,22 @@ def test_repeated_capabilities_list(self): with nifake.Session('dev1') as session: assert session.channels['r0']._repeated_capability_list == ['r0'] + def test_nested_repeated_capabilities_list(self): + with nifake.Session('dev1') as session: + assert session.sites[0, 1].channels[2, 3]._repeated_capability_list == ['site0/2', 'site0/3', 'site1/2', 'site1/3'] + + def test_nested_repeated_capability_method_on_specific_channel(self): + test_maximum_time_ms = 10 # milliseconds + test_maximum_time_us = 10000 # microseconds + test_maximum_time = datetime.timedelta(milliseconds=test_maximum_time_ms) + test_reading = 5 + self.patched_library.niFake_ReadFromChannel.side_effect = self.side_effects_helper.niFake_ReadFromChannel + self.side_effects_helper['ReadFromChannel']['reading'] = test_reading + with nifake.Session('dev1') as session: + value = session.sites[0, 1].channels[2, 3].read_from_channel(test_maximum_time) + self.patched_library.niFake_ReadFromChannel.assert_called_once_with(_matchers.ViSessionMatcher(SESSION_NUM_FOR_TEST), _matchers.ViStringMatcher('site0/2,site0/3,site1/2,site1/3'), _matchers.ViInt32Matcher(test_maximum_time_us), _matchers.ViReal64PointerMatcher()) + assert value == test_reading + # Attributes def test_get_attribute_int32(self): diff --git a/generated/nifgen/nifgen/session.py b/generated/nifgen/nifgen/session.py index 1e6898582..3376f5a4d 100644 --- a/generated/nifgen/nifgen/session.py +++ b/generated/nifgen/nifgen/session.py @@ -88,15 +88,20 @@ def __exit__(self, exc_type, exc_value, traceback): class _RepeatedCapabilities(object): - def __init__(self, session, prefix): + def __init__(self, session, prefix, current_repeated_capability_list): self._session = session self._prefix = prefix + # We need at least one element. If we get an empty list, make the one element an empty string + self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] + # Now we know there is at lease one entry, so we look if it is an empty string or not + self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) + complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] - return _SessionBase(vi=self._session._vi, repeated_capability_list=rep_caps_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) + return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) # This is a very simple context manager we can use when we need to set/get attributes @@ -949,9 +954,9 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa self._param_list = ', '.join(param_list) # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') - self.script_triggers = _RepeatedCapabilities(self, 'ScriptTrigger') - self.markers = _RepeatedCapabilities(self, 'Marker') + self.channels = _RepeatedCapabilities(self, '', repeated_capability_list) + self.script_triggers = _RepeatedCapabilities(self, 'ScriptTrigger', repeated_capability_list) + self.markers = _RepeatedCapabilities(self, 'Marker', repeated_capability_list) self._is_frozen = freeze_it diff --git a/generated/niscope/niscope/session.py b/generated/niscope/niscope/session.py index 29c584bcc..1ce8a38ab 100644 --- a/generated/niscope/niscope/session.py +++ b/generated/niscope/niscope/session.py @@ -90,15 +90,20 @@ def __exit__(self, exc_type, exc_value, traceback): class _RepeatedCapabilities(object): - def __init__(self, session, prefix): + def __init__(self, session, prefix, current_repeated_capability_list): self._session = session self._prefix = prefix + # We need at least one element. If we get an empty list, make the one element an empty string + self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] + # Now we know there is at lease one entry, so we look if it is an empty string or not + self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) + complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] - return _SessionBase(vi=self._session._vi, repeated_capability_list=rep_caps_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) + return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) # This is a very simple context manager we can use when we need to set/get attributes @@ -1664,7 +1669,7 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa self._param_list = ', '.join(param_list) # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') + self.channels = _RepeatedCapabilities(self, '', repeated_capability_list) self._is_frozen = freeze_it diff --git a/generated/niswitch/niswitch/session.py b/generated/niswitch/niswitch/session.py index b0baa1bdc..d1bda47c8 100644 --- a/generated/niswitch/niswitch/session.py +++ b/generated/niswitch/niswitch/session.py @@ -87,15 +87,20 @@ def __exit__(self, exc_type, exc_value, traceback): class _RepeatedCapabilities(object): - def __init__(self, session, prefix): + def __init__(self, session, prefix, current_repeated_capability_list): self._session = session self._prefix = prefix + # We need at least one element. If we get an empty list, make the one element an empty string + self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] + # Now we know there is at lease one entry, so we look if it is an empty string or not + self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) + complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] - return _SessionBase(vi=self._session._vi, repeated_capability_list=rep_caps_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) + return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) # This is a very simple context manager we can use when we need to set/get attributes @@ -556,7 +561,7 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa self._param_list = ', '.join(param_list) # Instantiate any repeated capability objects - self.channels = _RepeatedCapabilities(self, '') + self.channels = _RepeatedCapabilities(self, '', repeated_capability_list) self._is_frozen = freeze_it From e037f67599e34616a3e71427fb6f7809d7886010 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Tue, 25 Feb 2020 10:51:21 -0600 Subject: [PATCH 05/16] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1580ef8c..4f47546ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,12 @@ All notable changes to this project will be documented in this file. * Zip file per driver for all examples and any helper files * Link to zip file on examples documentation * Support for Python 3.8 + * Support for nested repeated capabilities. This allows things like + ``` python + session.sites[0, 1].pins['A', 'B'].ppmu_voltage_level = 4 + ``` + + The repeated capabilities will be expanded to `'site0/A,site0/B,site1/A,site1/B'` * #### Changed * `import_attribute_configuration_buffer()` now accepts `list` of numbers that are integers less than 255, `array.array('b')`, `bytes`, `bytearray` for configuration buffer - [#1013](https://github.com/ni/nimi-python/issues/1013) * `export_attribute_configuration_buffer()` now returns `bytes` as the buffer type - [#1013](https://github.com/ni/nimi-python/issues/1013) From 2e4904ce087af53c881ad9350d5421077f81ead6 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Wed, 4 Mar 2020 17:28:30 -0600 Subject: [PATCH 06/16] Update nidigital_usage.inc --- docs/_static/nidigital_usage.inc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/_static/nidigital_usage.inc b/docs/_static/nidigital_usage.inc index 58dc22c67..da44d600d 100644 --- a/docs/_static/nidigital_usage.inc +++ b/docs/_static/nidigital_usage.inc @@ -3,13 +3,29 @@ Usage The following is a basic example of using the **nidigital** module to open a session to a .... +.. code-block:: python + + import nidigital + with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: + pass + + +Some repeated capabilities can be nested. This is useful for some methods that can be used with the `pins` +repeated capability. They can be nested with the `sites` repeated capability. + .. code-block:: python import nidigital # Configure the session. with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: - pass + session.sites[0, 1].pins[2, 3].burst_pattern( + start_label='new_pattern', + select_digital_function=False, + wait_until_done=True, + timeout=5) + +This will expand the repeated capabilities string given to the driver as `'site0/2,site0/3,site1/2,site1/3'` Additional examples for NI-Digital Pattern Driver are located in src/nidigital/examples/ directory. From 1d06939d520c2ba455af344b1c4a5dc26204c5a3 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Wed, 4 Mar 2020 17:45:08 -0600 Subject: [PATCH 07/16] Update test --- src/nifake/unit_tests/test_session.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/nifake/unit_tests/test_session.py b/src/nifake/unit_tests/test_session.py index 3e4a0a822..2a967bd2f 100644 --- a/src/nifake/unit_tests/test_session.py +++ b/src/nifake/unit_tests/test_session.py @@ -863,14 +863,13 @@ def test_nested_repeated_capabilities_list(self): def test_nested_repeated_capability_method_on_specific_channel(self): test_maximum_time_ms = 10 # milliseconds - test_maximum_time_us = 10000 # microseconds test_maximum_time = datetime.timedelta(milliseconds=test_maximum_time_ms) test_reading = 5 self.patched_library.niFake_ReadFromChannel.side_effect = self.side_effects_helper.niFake_ReadFromChannel self.side_effects_helper['ReadFromChannel']['reading'] = test_reading with nifake.Session('dev1') as session: value = session.sites[0, 1].channels[2, 3].read_from_channel(test_maximum_time) - self.patched_library.niFake_ReadFromChannel.assert_called_once_with(_matchers.ViSessionMatcher(SESSION_NUM_FOR_TEST), _matchers.ViStringMatcher('site0/2,site0/3,site1/2,site1/3'), _matchers.ViInt32Matcher(test_maximum_time_us), _matchers.ViReal64PointerMatcher()) + self.patched_library.niFake_ReadFromChannel.assert_called_once_with(_matchers.ViSessionMatcher(SESSION_NUM_FOR_TEST), _matchers.ViStringMatcher('site0/2,site0/3,site1/2,site1/3'), _matchers.ViInt32Matcher(test_maximum_time_ms), _matchers.ViReal64PointerMatcher()) assert value == test_reading # Attributes From 8da761de6a08d0aeaef967ab51357013d1bcb616 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Wed, 4 Mar 2020 17:45:18 -0600 Subject: [PATCH 08/16] Update generated files --- generated/nidigital/README.rst | 18 +++++++++++++++++- .../nifake/nifake/unit_tests/test_session.py | 3 +-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/generated/nidigital/README.rst b/generated/nidigital/README.rst index c3bf41933..e22160627 100644 --- a/generated/nidigital/README.rst +++ b/generated/nidigital/README.rst @@ -130,13 +130,29 @@ Usage The following is a basic example of using the **nidigital** module to open a session to a .... +.. code-block:: python + + import nidigital + with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: + pass + + +Some repeated capabilities can be nested. This is useful for some methods that can be used with the `pins` +repeated capability. They can be nested with the `sites` repeated capability. + .. code-block:: python import nidigital # Configure the session. with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: - pass + session.sites[0, 1].pins[2, 3].burst_pattern( + start_label='new_pattern', + select_digital_function=False, + wait_until_done=True, + timeout=5) + +This will expand the repeated capabilities string given to the driver as `'site0/2,site0/3,site1/2,site1/3'` Additional examples for NI-Digital Pattern Driver are located in src/nidigital/examples/ directory. diff --git a/generated/nifake/nifake/unit_tests/test_session.py b/generated/nifake/nifake/unit_tests/test_session.py index 3e4a0a822..2a967bd2f 100644 --- a/generated/nifake/nifake/unit_tests/test_session.py +++ b/generated/nifake/nifake/unit_tests/test_session.py @@ -863,14 +863,13 @@ def test_nested_repeated_capabilities_list(self): def test_nested_repeated_capability_method_on_specific_channel(self): test_maximum_time_ms = 10 # milliseconds - test_maximum_time_us = 10000 # microseconds test_maximum_time = datetime.timedelta(milliseconds=test_maximum_time_ms) test_reading = 5 self.patched_library.niFake_ReadFromChannel.side_effect = self.side_effects_helper.niFake_ReadFromChannel self.side_effects_helper['ReadFromChannel']['reading'] = test_reading with nifake.Session('dev1') as session: value = session.sites[0, 1].channels[2, 3].read_from_channel(test_maximum_time) - self.patched_library.niFake_ReadFromChannel.assert_called_once_with(_matchers.ViSessionMatcher(SESSION_NUM_FOR_TEST), _matchers.ViStringMatcher('site0/2,site0/3,site1/2,site1/3'), _matchers.ViInt32Matcher(test_maximum_time_us), _matchers.ViReal64PointerMatcher()) + self.patched_library.niFake_ReadFromChannel.assert_called_once_with(_matchers.ViSessionMatcher(SESSION_NUM_FOR_TEST), _matchers.ViStringMatcher('site0/2,site0/3,site1/2,site1/3'), _matchers.ViInt32Matcher(test_maximum_time_ms), _matchers.ViReal64PointerMatcher()) assert value == test_reading # Attributes From 8fb2f2cab36ef5f184657ce2f5dbf3dce7fbb73e Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Thu, 19 Mar 2020 11:22:42 -0500 Subject: [PATCH 09/16] Review comments --- docs/_static/nidigital_usage.inc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/_static/nidigital_usage.inc b/docs/_static/nidigital_usage.inc index da44d600d..5d2f4580c 100644 --- a/docs/_static/nidigital_usage.inc +++ b/docs/_static/nidigital_usage.inc @@ -19,11 +19,7 @@ repeated capability. They can be nested with the `sites` repeated capability. # Configure the session. with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: - session.sites[0, 1].pins[2, 3].burst_pattern( - start_label='new_pattern', - select_digital_function=False, - wait_until_done=True, - timeout=5) + session.sites[0, 1].pins['PinA', 'PinB'].ppmu_source() This will expand the repeated capabilities string given to the driver as `'site0/2,site0/3,site1/2,site1/3'` From 32015d4ab0c718ae9aca68e933fcc3b0e6b2ea59 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Thu, 19 Mar 2020 11:22:52 -0500 Subject: [PATCH 10/16] Update generated files --- generated/nidigital/README.rst | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/generated/nidigital/README.rst b/generated/nidigital/README.rst index e22160627..62f4e1e2e 100644 --- a/generated/nidigital/README.rst +++ b/generated/nidigital/README.rst @@ -146,11 +146,7 @@ repeated capability. They can be nested with the `sites` repeated capability. # Configure the session. with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: - session.sites[0, 1].pins[2, 3].burst_pattern( - start_label='new_pattern', - select_digital_function=False, - wait_until_done=True, - timeout=5) + session.sites[0, 1].pins['PinA', 'PinB'].ppmu_source() This will expand the repeated capabilities string given to the driver as `'site0/2,site0/3,site1/2,site1/3'` From 01b552e89c3a064a98c501d2693681dda3fc5a9f Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Wed, 25 Mar 2020 13:18:47 -0500 Subject: [PATCH 11/16] Typo --- build/templates/session.py.mako | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/templates/session.py.mako b/build/templates/session.py.mako index 38bf944f5..4ed1199c8 100644 --- a/build/templates/session.py.mako +++ b/build/templates/session.py.mako @@ -129,12 +129,12 @@ class _RepeatedCapabilities(object): # We need at least one element. If we get an empty list, make the one element an empty string self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] # Now we know there is at lease one entry, so we look if it is an empty string or not - self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' + self._separator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) - complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] + complete_rep_cap_list = [current_rep_cap + self._separator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] return _SessionBase(${config['session_handle_parameter_name']}=self._session._${config['session_handle_parameter_name']}, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) From 8a8909d863212828474ad5397d6fa9a0ee1c7073 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Wed, 25 Mar 2020 13:19:16 -0500 Subject: [PATCH 12/16] Only add comment if there are repeated capabilities --- build/templates/session.py.mako | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build/templates/session.py.mako b/build/templates/session.py.mako index 4ed1199c8..2e492f072 100644 --- a/build/templates/session.py.mako +++ b/build/templates/session.py.mako @@ -201,11 +201,13 @@ constructor_params = helper.filter_parameters(init_function, helper.ParameterUsa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) +% if len(config['repeated_capabilities']) > 0: # Instantiate any repeated capability objects -% for rep_cap in config['repeated_capabilities']: +% for rep_cap in config['repeated_capabilities']: self.${rep_cap['python_name']} = _RepeatedCapabilities(self, '${rep_cap["prefix"]}', repeated_capability_list) -% endfor +% endfor +% endif self._is_frozen = freeze_it def __repr__(self): From 26dcf162def71f1c5bea051c27f86939d77f951e Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Wed, 25 Mar 2020 13:19:43 -0500 Subject: [PATCH 13/16] Reword usage per review --- docs/_static/nidigital_usage.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_static/nidigital_usage.inc b/docs/_static/nidigital_usage.inc index 5d2f4580c..b4c599db5 100644 --- a/docs/_static/nidigital_usage.inc +++ b/docs/_static/nidigital_usage.inc @@ -10,8 +10,8 @@ The following is a basic example of using the **nidigital** module to open a ses pass -Some repeated capabilities can be nested. This is useful for some methods that can be used with the `pins` -repeated capability. They can be nested with the `sites` repeated capability. +Some repeated capabilities can be chained. This is useful for some methods that can be used with the `pins` +repeated capability. They can be chained with the `sites` repeated capability. .. code-block:: python @@ -21,7 +21,7 @@ repeated capability. They can be nested with the `sites` repeated capability. with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: session.sites[0, 1].pins['PinA', 'PinB'].ppmu_source() -This will expand the repeated capabilities string given to the driver as `'site0/2,site0/3,site1/2,site1/3'` +This will apply the method/property to `'site0/PinA`, `site0/PinB`, `site1/PinA`, `site1/PinB'` Additional examples for NI-Digital Pattern Driver are located in src/nidigital/examples/ directory. From fb744301dbd0d31f6d9d9a962f2a5a5a3b613662 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Wed, 25 Mar 2020 13:20:11 -0500 Subject: [PATCH 14/16] Update generated files --- generated/nidcpower/nidcpower/session.py | 4 ++-- generated/nidigital/README.rst | 6 +++--- generated/nidigital/nidigital/session.py | 4 ++-- generated/nidmm/nidmm/session.py | 2 -- generated/nifake/nifake/session.py | 4 ++-- generated/nifgen/nifgen/session.py | 4 ++-- generated/niscope/niscope/session.py | 4 ++-- generated/nise/nise/session.py | 2 -- generated/niswitch/niswitch/session.py | 4 ++-- 9 files changed, 15 insertions(+), 19 deletions(-) diff --git a/generated/nidcpower/nidcpower/session.py b/generated/nidcpower/nidcpower/session.py index 5f212b02c..83bfd62d3 100644 --- a/generated/nidcpower/nidcpower/session.py +++ b/generated/nidcpower/nidcpower/session.py @@ -93,12 +93,12 @@ def __init__(self, session, prefix, current_repeated_capability_list): # We need at least one element. If we get an empty list, make the one element an empty string self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] # Now we know there is at lease one entry, so we look if it is an empty string or not - self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' + self._separator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) - complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] + complete_rep_cap_list = [current_rep_cap + self._separator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) diff --git a/generated/nidigital/README.rst b/generated/nidigital/README.rst index 62f4e1e2e..387643512 100644 --- a/generated/nidigital/README.rst +++ b/generated/nidigital/README.rst @@ -137,8 +137,8 @@ The following is a basic example of using the **nidigital** module to open a ses pass -Some repeated capabilities can be nested. This is useful for some methods that can be used with the `pins` -repeated capability. They can be nested with the `sites` repeated capability. +Some repeated capabilities can be chained. This is useful for some methods that can be used with the `pins` +repeated capability. They can be chained with the `sites` repeated capability. .. code-block:: python @@ -148,7 +148,7 @@ repeated capability. They can be nested with the `sites` repeated capability. with nidigital.Session(resource_name='PXI1Slot2', channels='0') as session: session.sites[0, 1].pins['PinA', 'PinB'].ppmu_source() -This will expand the repeated capabilities string given to the driver as `'site0/2,site0/3,site1/2,site1/3'` +This will apply the method/property to `'site0/PinA`, `site0/PinB`, `site1/PinA`, `site1/PinB'` Additional examples for NI-Digital Pattern Driver are located in src/nidigital/examples/ directory. diff --git a/generated/nidigital/nidigital/session.py b/generated/nidigital/nidigital/session.py index 23f928610..04fb992a9 100644 --- a/generated/nidigital/nidigital/session.py +++ b/generated/nidigital/nidigital/session.py @@ -96,12 +96,12 @@ def __init__(self, session, prefix, current_repeated_capability_list): # We need at least one element. If we get an empty list, make the one element an empty string self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] # Now we know there is at lease one entry, so we look if it is an empty string or not - self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' + self._separator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) - complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] + complete_rep_cap_list = [current_rep_cap + self._separator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) diff --git a/generated/nidmm/nidmm/session.py b/generated/nidmm/nidmm/session.py index 3eb1cb95d..09e800905 100644 --- a/generated/nidmm/nidmm/session.py +++ b/generated/nidmm/nidmm/session.py @@ -530,8 +530,6 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) - # Instantiate any repeated capability objects - self._is_frozen = freeze_it def __repr__(self): diff --git a/generated/nifake/nifake/session.py b/generated/nifake/nifake/session.py index cacb98b73..4d3578be4 100644 --- a/generated/nifake/nifake/session.py +++ b/generated/nifake/nifake/session.py @@ -96,12 +96,12 @@ def __init__(self, session, prefix, current_repeated_capability_list): # We need at least one element. If we get an empty list, make the one element an empty string self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] # Now we know there is at lease one entry, so we look if it is an empty string or not - self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' + self._separator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) - complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] + complete_rep_cap_list = [current_rep_cap + self._separator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) diff --git a/generated/nifgen/nifgen/session.py b/generated/nifgen/nifgen/session.py index 913ea3553..07b6c0687 100644 --- a/generated/nifgen/nifgen/session.py +++ b/generated/nifgen/nifgen/session.py @@ -94,12 +94,12 @@ def __init__(self, session, prefix, current_repeated_capability_list): # We need at least one element. If we get an empty list, make the one element an empty string self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] # Now we know there is at lease one entry, so we look if it is an empty string or not - self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' + self._separator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) - complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] + complete_rep_cap_list = [current_rep_cap + self._separator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) diff --git a/generated/niscope/niscope/session.py b/generated/niscope/niscope/session.py index 9827effca..3c008496b 100644 --- a/generated/niscope/niscope/session.py +++ b/generated/niscope/niscope/session.py @@ -96,12 +96,12 @@ def __init__(self, session, prefix, current_repeated_capability_list): # We need at least one element. If we get an empty list, make the one element an empty string self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] # Now we know there is at lease one entry, so we look if it is an empty string or not - self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' + self._separator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) - complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] + complete_rep_cap_list = [current_rep_cap + self._separator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) diff --git a/generated/nise/nise/session.py b/generated/nise/nise/session.py index cbcc0b337..3435b41e5 100644 --- a/generated/nise/nise/session.py +++ b/generated/nise/nise/session.py @@ -70,8 +70,6 @@ def __init__(self, repeated_capability_list, vi, library, encoding, freeze_it=Fa param_list.append("encoding=" + pp.pformat(encoding)) self._param_list = ', '.join(param_list) - # Instantiate any repeated capability objects - self._is_frozen = freeze_it def __repr__(self): diff --git a/generated/niswitch/niswitch/session.py b/generated/niswitch/niswitch/session.py index 8764d0f69..e98a477cd 100644 --- a/generated/niswitch/niswitch/session.py +++ b/generated/niswitch/niswitch/session.py @@ -93,12 +93,12 @@ def __init__(self, session, prefix, current_repeated_capability_list): # We need at least one element. If we get an empty list, make the one element an empty string self._current_repeated_capability_list = current_repeated_capability_list if len(current_repeated_capability_list) > 0 else [''] # Now we know there is at lease one entry, so we look if it is an empty string or not - self._seperator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' + self._separator = '/' if len(self._current_repeated_capability_list[0]) > 0 else '' def __getitem__(self, repeated_capability): '''Set/get properties or call methods with a repeated capability (i.e. channels)''' rep_caps_list = _converters.convert_repeated_capabilities(repeated_capability, self._prefix) - complete_rep_cap_list = [current_rep_cap + self._seperator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] + complete_rep_cap_list = [current_rep_cap + self._separator + rep_cap for current_rep_cap in self._current_repeated_capability_list for rep_cap in rep_caps_list] return _SessionBase(vi=self._session._vi, repeated_capability_list=complete_rep_cap_list, library=self._session._library, encoding=self._session._encoding, freeze_it=True) From d8c2c4f1e2cc300410418264794761397aaf5587 Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Thu, 26 Mar 2020 10:49:17 -0500 Subject: [PATCH 15/16] nest -> chain --- CHANGELOG.md | 6 +++--- src/nifake/unit_tests/test_session.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cfec37a5..643f5e6e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,12 +24,12 @@ All notable changes to this project will be documented in this file. ## Unreleased * ### ALL * #### Added - * Support for nested repeated capabilities. This allows things like + * Support for chained repeated capabilities. This allows things like ``` python - session.sites[0, 1].pins['A', 'B'].ppmu_voltage_level = 4 + session.sites[0, 1].pins['PinA', 'PinB'].ppmu_voltage_level = 4 ``` - The repeated capabilities will be expanded to `'site0/A,site0/B,site1/A,site1/B'` + The repeated capabilities will be expanded to `'site0/PinA,site0/PinB,site1/PinA,site1/PinB'` * #### Changed * #### Removed * ### NI-DCPower diff --git a/src/nifake/unit_tests/test_session.py b/src/nifake/unit_tests/test_session.py index 28047bc37..252907969 100644 --- a/src/nifake/unit_tests/test_session.py +++ b/src/nifake/unit_tests/test_session.py @@ -857,11 +857,11 @@ def test_repeated_capabilities_list(self): with nifake.Session('dev1') as session: assert session.channels['r0']._repeated_capability_list == ['r0'] - def test_nested_repeated_capabilities_list(self): + def test_chained_repeated_capabilities_list(self): with nifake.Session('dev1') as session: assert session.sites[0, 1].channels[2, 3]._repeated_capability_list == ['site0/2', 'site0/3', 'site1/2', 'site1/3'] - def test_nested_repeated_capability_method_on_specific_channel(self): + def test_chained_repeated_capability_method_on_specific_channel(self): test_maximum_time_ms = 10 # milliseconds test_maximum_time = datetime.timedelta(milliseconds=test_maximum_time_ms) test_reading = 5 From 9b4b8956d302e9bfb4d669e0db9e0c0b39fde52c Mon Sep 17 00:00:00 2001 From: Mark Silva Date: Thu, 26 Mar 2020 10:51:07 -0500 Subject: [PATCH 16/16] Update generated files --- generated/nifake/nifake/unit_tests/test_session.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generated/nifake/nifake/unit_tests/test_session.py b/generated/nifake/nifake/unit_tests/test_session.py index 28047bc37..252907969 100644 --- a/generated/nifake/nifake/unit_tests/test_session.py +++ b/generated/nifake/nifake/unit_tests/test_session.py @@ -857,11 +857,11 @@ def test_repeated_capabilities_list(self): with nifake.Session('dev1') as session: assert session.channels['r0']._repeated_capability_list == ['r0'] - def test_nested_repeated_capabilities_list(self): + def test_chained_repeated_capabilities_list(self): with nifake.Session('dev1') as session: assert session.sites[0, 1].channels[2, 3]._repeated_capability_list == ['site0/2', 'site0/3', 'site1/2', 'site1/3'] - def test_nested_repeated_capability_method_on_specific_channel(self): + def test_chained_repeated_capability_method_on_specific_channel(self): test_maximum_time_ms = 10 # milliseconds test_maximum_time = datetime.timedelta(milliseconds=test_maximum_time_ms) test_reading = 5