Skip to content

Commit 68cac54

Browse files
authored
Remove name-based node indexing (names may not be unique) (#445)
1 parent d7ddd18 commit 68cac54

3 files changed

Lines changed: 26 additions & 31 deletions

File tree

pyisy/networking.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ def __init__(self, isy: ISY, xml: str | None = None) -> None:
5959
self.addresses: list[int] = []
6060
self._address_index: dict[int, int] = {}
6161
self.nnames: list[str] = []
62-
self._nnames_index: dict[str, int] = {}
6362
self.nobjs: list[NetworkCommand] = []
6463

6564
if xml is not None:
@@ -87,7 +86,6 @@ def parse(self, xml: str) -> None:
8786
self.addresses.append(address)
8887
self._address_index[address] = len(self.addresses) - 1
8988
self.nnames.append(nname)
90-
self._nnames_index[nname] = len(self.nnames) - 1
9189
self.nobjs.append(nobj)
9290

9391
_LOGGER.info("ISY Loaded Network Resources Commands")
@@ -138,8 +136,11 @@ def get_by_name(self, val: str) -> NetworkCommand | None:
138136
139137
val: String representing command name
140138
"""
141-
ind = self._nnames_index.get(val)
142-
return None if ind is None else self.get_by_index(ind)
139+
try:
140+
ind = self.nnames.index(val)
141+
return self.get_by_index(ind)
142+
except (ValueError, KeyError):
143+
return None
143144

144145
def get_by_index(self, val: int) -> NetworkCommand | None:
145146
"""

pyisy/nodes/__init__.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ def __init__(
120120
ntypes: list[str] | None = None,
121121
xml: str | None = None,
122122
_address_index: dict[str, int] | None = None, # Internal use only
123-
_nnames_index: dict[str, int] | None = None, # Internal use only
124123
) -> None:
125124
"""Initialize the Nodes ISY Node Manager class."""
126125
self.isy = isy
@@ -129,7 +128,6 @@ def __init__(
129128
self.addresses: list[str] = []
130129
self._address_index: dict[str, int] = {}
131130
self.nnames: list[str] = []
132-
self._nnames_index: dict[str, int] = {}
133131
self.nparents: list[str] = []
134132
self.nobjs: list[Node] = []
135133
self.ntypes: list[str] = []
@@ -145,7 +143,6 @@ def __init__(
145143
self._address_index = _address_index or {address: i for i, address in enumerate(addresses)}
146144
if nnames is not None:
147145
self.nnames = nnames
148-
self._nnames_index = _nnames_index or {name: i for i, name in enumerate(nnames)}
149146
if nparents is not None:
150147
self.nparents = nparents
151148
if nobjs is not None:
@@ -544,7 +541,6 @@ def insert(self, address: str, nname: str, nparent: str, nobj: Node, ntype: str)
544541
self.addresses.append(address)
545542
self._address_index[address] = len(self.addresses) - 1
546543
self.nnames.append(nname)
547-
self._nnames_index[nname] = len(self.nnames) - 1
548544
self.nparents.append(nparent)
549545
self.ntypes.append(ntype)
550546
self.nobjs.append(nobj)
@@ -553,14 +549,16 @@ def __getitem__(self, val: str) -> Node | Nodes:
553549
"""Navigate through the node tree. Can take names or IDs."""
554550
if val in self._address_index:
555551
fun = self.get_by_id
556-
elif val in self._nnames_index:
557-
fun = self.get_by_name
558552
else:
559553
try:
560-
val = int(val)
561-
fun = self.get_by_index
554+
self.nnames.index(val)
555+
fun = self.get_by_name
562556
except ValueError:
563-
fun = None
557+
try:
558+
val = int(val)
559+
fun = self.get_by_index
560+
except ValueError:
561+
fun = None
564562

565563
if fun:
566564
output = None
@@ -583,9 +581,9 @@ def get_by_name(self, val: str) -> Node | Nodes | None:
583581
584582
| val: String representing name to look for.
585583
"""
586-
i = self._nnames_index.get(val)
587-
if i is not None and (self.root is None or self.nparents[i] == self.root):
588-
return self.get_by_index(i)
584+
for i in range(len(self.addresses)):
585+
if (self.root is None or self.nparents[i] == self.root) and self.nnames[i] == val:
586+
return self.get_by_index(i)
589587
return None
590588

591589
def get_by_id(self, address: str) -> Node | Nodes | None:
@@ -615,7 +613,6 @@ def get_by_index(self, i: int) -> Node | Nodes:
615613
nobjs=self.nobjs,
616614
ntypes=self.ntypes,
617615
_address_index=self._address_index,
618-
_nnames_index=self._nnames_index,
619616
)
620617

621618
def get_folder(self, address: str) -> str | None:

pyisy/programs/__init__.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ def __init__(
7676
ptypes: list[str] | None = None,
7777
xml: str | None = None,
7878
_address_index: dict[str, int] | None = None,
79-
_pnames_index: dict[str, int] | None = None,
8079
) -> None:
8180
"""Initialize the Programs ISY programs manager class."""
8281
self.isy = isy
@@ -85,7 +84,6 @@ def __init__(
8584
self.addresses: list[str] = []
8685
self._address_index: dict[str, int] = {}
8786
self.pnames: list[str] = []
88-
self._pnames_index: dict[str, int] = {}
8987
self.pparents: list[str] = []
9088
self.pobjs: list[Program | Folder] = []
9189
self.ptypes: list[str] = []
@@ -99,7 +97,6 @@ def __init__(
9997
self._address_index = _address_index or {address: i for i, address in enumerate(addresses)}
10098
if pnames is not None:
10199
self.pnames = pnames
102-
self._pnames_index = _pnames_index or {name: i for i, name in enumerate(pnames)}
103100
if pparents is not None:
104101
self.pparents = pparents
105102
if pobjs is not None:
@@ -308,7 +305,6 @@ def insert(self, address: str, pname: str, pparent: str, pobj: Program | Program
308305
self.addresses.append(address)
309306
self._address_index[address] = len(self.addresses) - 1
310307
self.pnames.append(pname)
311-
self._pnames_index[pname] = len(self.pnames) - 1
312308
self.pparents.append(pparent)
313309
self.ptypes.append(ptype)
314310
self.pobjs.append(pobj)
@@ -321,14 +317,16 @@ def __getitem__(self, val: str) -> Program | Folder | None:
321317
"""
322318
if val in self._address_index:
323319
fun = self.get_by_id
324-
elif val in self._pnames_index:
325-
fun = self.get_by_name
326320
else:
327321
try:
328-
val = int(val)
329-
fun = self.get_by_index
330-
except (TypeError, ValueError) as err:
331-
raise KeyError("Unrecognized Key: " + str(val)) from err
322+
self.pnames.index(val)
323+
fun = self.get_by_name
324+
except ValueError:
325+
try:
326+
val = int(val)
327+
fun = self.get_by_index
328+
except (TypeError, ValueError) as err:
329+
raise KeyError("Unrecognized Key: " + str(val)) from err
332330
try:
333331
return fun(val)
334332
except (ValueError, KeyError, IndexError):
@@ -344,9 +342,9 @@ def get_by_name(self, val: str) -> Program | Folder | Programs | None:
344342
345343
| val: The name of the child program/folder to look for.
346344
"""
347-
i = self._pnames_index.get(val)
348-
if i is not None and (self.root is None or self.pparents[i] == self.root):
349-
return self.get_by_index(i)
345+
for i in range(len(self.addresses)):
346+
if (self.root is None or self.pparents[i] == self.root) and self.pnames[i] == val:
347+
return self.get_by_index(i)
350348
return None
351349

352350
def get_by_id(self, address: str) -> Program | Folder | Programs:
@@ -373,7 +371,6 @@ def get_by_index(self, i: int) -> Program | Folder | Programs:
373371
pobjs=self.pobjs,
374372
ptypes=self.ptypes,
375373
_address_index=self._address_index,
376-
_pnames_index=self._pnames_index,
377374
)
378375
return self.pobjs[i]
379376

0 commit comments

Comments
 (0)