diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..9a11c12 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Python: pytest", + "type": "python", + "request": "launch", + "module": "pytest", + "args": [ + "tests" + ], + "justMyCode": true, + "console": "integratedTerminal" + } + ] +} diff --git a/nodes/manager.py b/nodes/manager.py index b3c1178..fbbbb30 100644 --- a/nodes/manager.py +++ b/nodes/manager.py @@ -1,5 +1,73 @@ # Create here the NodeManager Class +# class NodeManager: +# pass + + +from typing import List +from nodes.node import Node class NodeManager: - pass + nodes: List[Node] + + def __init__(self, nodes: List[Node]): + if not isinstance(nodes, list) or any(not isinstance(node, Node) for node in nodes): + #Garante que o node é uma lista. + #OBS: Foi feito a validação de cada um dos elementos da lista sejam uma instancia de Node + raise ValueError("Nodes must be a list of 'Node instances'.") + #Copia a lista fornecida + self.nodes = nodes.copy() + + def __len__(self): + # retorna o número de elementos do Node + return len(self.nodes) + + def __getitem__(self, index): + #obtem um objeto Node na posição index da lista + return self.nodes[index] + + def remove(self, node: Node): + if node not in self.nodes: + #valida se o node a ser removido existe na lista + raise ValueError("Node does not exist in the list.") + #retorna a remoção do node (None) + return self.nodes.remove(node) + + + #OBS: Foram feitas duas logicas para o remove cascade: + #1: onde a lógica de remover os filhos e netos seja integrada a função (requerido pelo exercício) + #2: onde a lógica do cascade foi separada em uma função a parte + #para motivos de avaliação foi mantido os dois métodos + + + #1: + + def remove_cascade(self, node: Node): + if node not in self.nodes: + #valida se o node existe na lista + raise ValueError("Node does not exist in the list.") + children = [n for n in self.nodes if n.parent == node.id] + for child in children: + self.remove_cascade(child) + self.nodes.remove(node) + #Chama a logica de remoção dos parentes + + + #2: + + # def remove_cascade(self, node: Node): + # if node not in self.nodes: + # #valida se o node existe na lista + # raise ValueError("Node does not exist in the list.") + # #Chama a logica de remoção dos parentes + # self._remove_cascade_recursive(node) + + # def _remove_cascade_recursive(self, node: Node): + # #lista de Nodes que possuem o id como parent. + # children = [n for n in self.nodes if n.parent == node.id] + # #Para cada children, + # # é chamada a _remove_cascade_recursive recursivamente + # # para remover os netos. + # for child in children: + # self._remove_cascade_recursive(child) + # self.nodes.remove(node) \ No newline at end of file diff --git a/nodes/node.py b/nodes/node.py index 644ab4e..b85d8d9 100644 --- a/nodes/node.py +++ b/nodes/node.py @@ -1,5 +1,32 @@ # Create here the Node Class +# class Node: +# pass + + class Node: - pass + id: int + parent: int + + def __init__(self, id: int, parent: int): + + if not isinstance(id, int) or not isinstance(parent, int): + #validação dupla de instancia para id e parent. + raise ValueError("Node class init raises given non integer.") + + if parent > id: + # validação se o parent é maior que o id. + # OBS poderia ser usado o >= para validar se é maior ou iqual, + # mas foi optado separar as validações por motivos didaticos + raise ValueError("Node does not accept PARENT greater than children.") + + if parent == id: + # validação se o parent é iqual ao id. + raise ValueError("Node does not accept ID as PARENT of itself.") + + self.id = id + self.parent = parent + + def __repr__(self): + return f"Node({self.id}, {self.parent})"